plan9port

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

sdbr_match.c (803B)


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