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;
}
Exemple #2
0
NSAPI_PUBLIC int shexp_valid(char *exp) {
    int x;

    x = valid_subexp(exp, '\0');
    return (x < 0 ? x : VALID_SXP);
}
Exemple #3
0
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);
}