NSAPI_PUBLIC int shexp_match(const char *str, const char *exp) { register int x; char *expbase = NULL; for(x=strlen(exp)-1;x;--x) { if((exp[x] == '~') && (exp[x-1] != '\\')) { /* we're done if the negative subexp matches */ if(_shexp_match(str,&exp[x+1]) == MATCH) return 1; /* we're done if the only thing in front of the subexp is '*' */ if (x == 1 && exp[0] == '*') return 0; /* create a copy so we can strip off the subexp */ expbase = STRDUP(exp); expbase[x] = '\0'; exp = expbase; break; } } if(_shexp_match(str,exp) == MATCH) { if (expbase) FREE(expbase); return 0; } if (expbase) FREE(expbase); return 1; }
int NS_WildCardMatch(const PRUnichar *str, const PRUnichar *xp, PRBool case_insensitive) { register int x; PRUnichar *expr = nsCRT::strdup(xp); if(!expr) return 1; for(x=nsCRT::strlen(expr)-1;x;--x) { if((expr[x] == '~') && (expr[x-1] != '\\')) { expr[x] = '\0'; if(_shexp_match(str,&expr[++x], case_insensitive) == MATCH) goto punt; break; } } if(_shexp_match(str,expr, case_insensitive) == MATCH) { PR_Free(expr); return 0; } punt: PR_Free(expr); return 1; }
static int _handle_union(const PRUnichar *str, const PRUnichar *expr, PRBool case_insensitive) { PRUnichar *e2 = (PRUnichar *) PR_Malloc(sizeof(PRUnichar)*nsCRT::strlen(expr)); register int t,p2,p1 = 1; int cp; while(1) { for(cp=1;expr[cp] != ')';cp++) if(expr[cp] == '\\') ++cp; for(p2 = 0;(expr[p1] != '|') && (p1 != cp);p1++,p2++) { if(expr[p1] == '\\') e2[p2++] = expr[p1++]; e2[p2] = expr[p1]; } for (t=cp+1; ((e2[p2] = expr[t]) != 0); ++t,++p2) {} if(_shexp_match(str,e2, case_insensitive) == MATCH) { PR_Free(e2); return MATCH; } if(p1 == cp) { PR_Free(e2); return NOMATCH; } else ++p1; } }
int handle_union(char *str, char *exp) { char *e2 = (char *) MALLOC(sizeof(char)*strlen(exp)); register int t,p2,p1 = 1; int cp; while(1) { for(cp=1;exp[cp] != ')';cp++) if(exp[cp] == '\\') ++cp; for(p2 = 0;(exp[p1] != '|') && (p1 != cp);p1++,p2++) { if(exp[p1] == '\\') e2[p2++] = exp[p1++]; e2[p2] = exp[p1]; } for(t=cp+1;(e2[p2] = exp[t]);++t,++p2); if(_shexp_match(str,e2) == MATCH) { FREE(e2); return MATCH; } if(p1 == cp) { FREE(e2); return NOMATCH; } else ++p1; } }
NSAPI_PUBLIC int shexp_match(char *str, char *xp) { register int x; char *exp = STRDUP(xp); for(x=strlen(exp)-1;x;--x) { if((exp[x] == '~') && (exp[x-1] != '\\')) { exp[x] = '\0'; if(_shexp_match(str,&exp[++x]) == MATCH) goto punt; break; } } if(_shexp_match(str,exp) == MATCH) { FREE(exp); return 0; } punt: FREE(exp); return 1; }
static int _shexp_match(const PRUnichar *str, const PRUnichar *expr, PRBool case_insensitive) { register int x,y; int ret,neg; ret = 0; for(x=0,y=0;expr[y];++y,++x) { if((!str[x]) && (expr[y] != '(') && (expr[y] != '$') && (expr[y] != '*')) ret = ABORTED; else { switch(expr[y]) { case '$': if( (str[x]) ) ret = NOMATCH; else --x; /* we don't want loop to increment x */ break; case '*': while(expr[++y] == '*'){} if(!expr[y]) return MATCH; while(str[x]) { switch(_shexp_match(&str[x++],&expr[y], case_insensitive)) { case NOMATCH: continue; case ABORTED: ret = ABORTED; break; default: return MATCH; } break; } if((expr[y] == '$') && (expr[y+1] == '\0') && (!str[x])) return MATCH; else ret = ABORTED; break; case '[': neg = ((expr[++y] == '^') && (expr[y+1] != ']')); if (neg) ++y; if ((isalnum(expr[y])) && (expr[y+1] == '-') && (isalnum(expr[y+2])) && (expr[y+3] == ']')) { int start = expr[y], end = expr[y+2]; /* Droolproofing for pinheads not included */ if(neg ^ ((str[x] < start) || (str[x] > end))) { ret = NOMATCH; break; } y+=3; } else { int matched; for (matched=0;expr[y] != ']';y++) matched |= (str[x] == expr[y]); if (neg ^ (!matched)) ret = NOMATCH; } break; case '(': return _handle_union(&str[x],&expr[y], case_insensitive); break; case '?': break; case '\\': ++y; default: if(case_insensitive) { if(toupper(str[x]) != toupper(expr[y])) ret = NOMATCH; } else { if(str[x] != expr[y]) ret = NOMATCH; } break; } } if(ret) break; } return (ret ? ret : (str[x] ? NOMATCH : MATCH)); }
int _shexp_match(const char *str, const char *exp) { register int x,y; int ret,neg; ret = 0; for(x=0,y=0;exp[y];++y,++x) { if((!str[x]) && (exp[y] != '(') && (exp[y] != '$') && (exp[y] != '*')) ret = ABORTED; else { switch(exp[y]) { case '$': if( (str[x]) ) ret = NOMATCH; else --x; /* we don't want loop to increment x */ break; case '*': while(exp[++y] == '*'); if(!exp[y]) return MATCH; while(str[x]) { switch(_shexp_match(&str[x++],&exp[y])) { case NOMATCH: continue; case ABORTED: ret = ABORTED; break; default: return MATCH; } break; } if((exp[y] == '$') && (exp[y+1] == '\0') && (!str[x])) return MATCH; else ret = ABORTED; break; case '[': if((neg = ((exp[++y] == '^') && (exp[y+1] != ']')))) ++y; if((isalnum(exp[y])) && (exp[y+1] == '-') && (isalnum(exp[y+2])) && (exp[y+3] == ']')) { int start = exp[y], end = exp[y+2]; /* Droolproofing for pinheads not included */ if(neg ^ ((str[x] < start) || (str[x] > end))) { ret = NOMATCH; break; } y+=3; } else { int matched; for(matched=0;exp[y] != ']';y++) matched |= (str[x] == exp[y]); if(neg ^ (!matched)) ret = NOMATCH; } break; case '(': return handle_union(&str[x],&exp[y]); break; case '?': break; case '\\': ++y; default: #ifdef XP_UNIX if(str[x] != exp[y]) #else /* XP_WIN32 */ if(strnicmp(str + x, exp + y, 1)) #endif /* XP_WIN32 */ ret = NOMATCH; break; } } if(ret) break; } return (ret ? ret : (str[x] ? NOMATCH : MATCH)); }