plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }