a44421a79fb36cc2036fe116b97ea3bc9590cd0c braney Fri Dec 2 09:34:39 2011 -0800 removed rcsid (#295) diff --git src/lib/wildcmp.c src/lib/wildcmp.c index e2aa21e..1fa1309 100644 --- src/lib/wildcmp.c +++ src/lib/wildcmp.c @@ -1,117 +1,116 @@ /* Wildcard matching. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" -static char const rcsid[] = "$Id: wildcmp.c,v 1.7 2009/11/20 19:11:16 angie Exp $"; static int subMatch(const char *str, const char *wild, char single, char multi) /* Returns number of characters that match between str and wild up * to the next wildcard in wild (or up to end of string.). */ { int len = 0; for(;;) { if(toupper(*str++) != toupper(*wild++) ) return(0); ++len; char c = *wild; if (c == 0 || c == single || c == multi) return len; } } boolean anyWild(const char *string) /* Return TRUE if any wild card characters in string. */ { char c; while ((c = *string++) != 0) { if (c == '?' || c == '*') return TRUE; } return FALSE; } static boolean globMatch(const char *wildCard, const char *string, char single, char multi) /* does a case sensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ { boolean matchStar = 0; int starMatchSize; char c; for(;;) { NEXT_WILD: c = *wildCard; if (c == 0) { if(matchStar) { while(*string++) ; return TRUE; } else if(*string) return FALSE; else return TRUE; } else if (c == multi) { matchStar = TRUE; } else if (c == single) { if(*string == 0) return FALSE; /* out of string, no match for ? */ ++string; } else { if(matchStar) { for(;;) { if(*string == 0) /* if out of string no match */ return FALSE; /* note matchStar is re-used here for substring * after star match length */ if((starMatchSize = subMatch(string,wildCard,single,multi)) != 0) { string += starMatchSize; wildCard += starMatchSize; matchStar = FALSE; goto NEXT_WILD; } ++string; } } /* default: they must be equal or no match */ if(toupper(*string) != toupper(*wildCard)) return FALSE; ++string; } ++wildCard; } } boolean wildMatch(const char *wildCard, const char *string) /* Match using * and ? wildcards. */ { return globMatch(wildCard, string, '?', '*'); } boolean sqlMatchLike(char *wildCard, char *string) /* Match using % and _ wildcards. */ { return globMatch(wildCard, string, '_', '%'); }