int mdb_test_string(MdbSargNode *node, char *s) { int rc; if (node->op == MDB_LIKE) { return mdb_like_cmp(s,node->value.s); } rc = strncmp(node->value.s, s, 255); switch (node->op) { case MDB_EQUAL: if (rc==0) return 1; break; case MDB_GT: if (rc<0) return 1; break; case MDB_LT: if (rc>0) return 1; break; case MDB_GTEQ: if (rc<=0) return 1; break; case MDB_LTEQ: if (rc>=0) return 1; break; default: fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_string() for operator %d\n",node->op); break; } return 0; }
/** * mdb_like_cmp * @s: String to search within. * @r: Search pattern. * * Tests the string @s to see if it matches the search pattern @r. In the * search pattern, a percent sign indicates matching on any number of * characters, and an underscore indicates matching any single character. * * Returns: 1 if the string matches, 0 if the string does not match. */ int mdb_like_cmp(char *s, char *r) { unsigned int i; int ret; mdb_debug(MDB_DEBUG_LIKE, "comparing %s and %s", s, r); switch (r[0]) { case '\0': if (s[0]=='\0') { return 1; } else { return 0; } case '_': /* skip one character */ return mdb_like_cmp(&s[1],&r[1]); case '%': /* skip any number of characters */ /* the strlen(s)+1 is important so the next call can */ /* if there are trailing characters */ for(i=0;i<strlen(s)+1;i++) { if (mdb_like_cmp(&s[i],&r[1])) { return 1; } } return 0; default: for(i=0;i<strlen(r);i++) { if (r[i]=='_' || r[i]=='%') break; } if (strncmp(s,r,i)) { return 0; } else { mdb_debug(MDB_DEBUG_LIKE, "at pos %d comparing %s and %s", i, &s[i], &r[i]); ret = mdb_like_cmp(&s[i],&r[i]); mdb_debug(MDB_DEBUG_LIKE, "returning %d (%s and %s)", ret, &s[i], &r[i]); return ret; } } }