sdbr_match.c (931B)
1 #include "std.h" 2 3 char 4 sdbr_match(char *k, char *v) 5 { 6 size_t l, n; 7 char *t; 8 9 if (!k) 10 sysfatal("sdbr_match: nil key"); 11 if (!v) 12 sysfatal("sdbr_match: nil value"); 13 if (k[0] == '*' && k[1] == '\0') 14 return *v ? 1 : 0; 15 if (*k == '>') { 16 if (*++k == '=') 17 return strcmp(v, k + 1) >= 0 ? 1 : 0; 18 return strcmp(v, k) > 0 ? 1 : 0; 19 } else if (*k == '<') { 20 if (*++k == '=') 21 return strcmp(v, k + 1) <= 0 ? 1 : 0; 22 return strcmp(v, k) < 0 ? 1 : 0; 23 } 24 for (;*k;) { 25 if (*k == '*') { 26 for (;*++k == '*';); 27 if (!*k) 28 return 1; 29 n = strcspn(k, "*\\"); 30 if (k[n]) { 31 t = strdup(k); 32 t[n] = '\0'; 33 v = strstr(v, t); 34 if (v) { 35 v += n; 36 k += n; 37 } 38 free(t); 39 return !v ? 0 : sdbr_match(k, v); 40 } 41 l = strlen(k); 42 n = strlen(v); 43 if (l > n) 44 return 0; 45 v += n - l; 46 } 47 if (*k == '\\' && *(k + 1) == '*') 48 ++k; 49 if (*k++ != *v++) 50 return 0; 51 } 52 return !*v ? 1 : 0; 53 }