NSAPI_PUBLIC int shexp_valid(const char *exp) { int x; x = valid_subexp(exp, '\0'); if (x < 0) { if (x == INVALID_SXP) { NsprError::setError(PR_INVALID_ARGUMENT_ERROR, XP_GetAdminStr(DBT_invalidshexp)); } return x; } return VALID_SXP; }
NSAPI_PUBLIC int shexp_valid(char *exp) { int x; x = valid_subexp(exp, '\0'); return (x < 0 ? x : VALID_SXP); }
int valid_subexp(char *exp, char stop) { register int x,y,t; int nsc,tld; x=0;nsc=0;tld=0; while(exp[x] && (exp[x] != stop)) { switch(exp[x]) { case '~': if(tld) return INVALID_SXP; else ++tld; case '*': case '?': case '^': case '$': ++nsc; break; case '[': ++nsc; if((!exp[++x]) || (exp[x] == ']')) return INVALID_SXP; for(++x;exp[x] && (exp[x] != ']');++x) if(exp[x] == '\\') if(!exp[++x]) return INVALID_SXP; if(!exp[x]) return INVALID_SXP; break; case '(': ++nsc; while(1) { if(exp[++x] == ')') return INVALID_SXP; for(y=x;(exp[y]) && (exp[y] != '|') && (exp[y] != ')');++y) if(exp[y] == '\\') if(!exp[++y]) return INVALID_SXP; if(!exp[y]) return INVALID_SXP; t = valid_subexp(&exp[x],exp[y]); if(t == INVALID_SXP) return INVALID_SXP; x+=t; if(exp[x] == ')') { break; } } break; case ')': case ']': return INVALID_SXP; case '\\': if(!exp[++x]) return INVALID_SXP; default: break; } ++x; } if((!stop) && (!nsc)) return NON_SXP; return ((exp[x] == stop) ? x : INVALID_SXP); }