Пример #1
0
int pmatch_char(char **P_PtrPtr, char **S_PtrPtr, int *Flags)
{
    char P_Char, S_Char;

    if (*Flags & PMATCH_NOCASE)
    {
        P_Char=tolower(**P_PtrPtr);
        S_Char=tolower(**S_PtrPtr);
    }
    else
    {
        P_Char=**P_PtrPtr;
        S_Char=**S_PtrPtr;
    }

//we must still honor switches even if 'nowildcards' is set, as we may want to turn
//'nowildcards' off, or turn case or extraction features on or off
    if (*Flags & PMATCH_NOWILDCARDS)
    {
        if (
            (P_Char=='\\') &&
            ((*(*P_PtrPtr+1)=='+') || (*(*P_PtrPtr+1)=='-'))
        ) /*This is a switch, fall through and process it */ ;
        else if (P_Char==S_Char) return(MATCH_ONE);
        else return(MATCH_FAIL);
    }

    switch (P_Char)
    {
    case '\0':
        return(MATCH_FOUND);
        break;
    case '|':
        return(MATCH_FOUND);
        break;
    case '*':
        return(MATCH_MANY);
        break;
    case '?':
        (*P_PtrPtr)++;
        return(MATCH_ONE);
        break;
    case '^':
        (*P_PtrPtr)++;
        return(MATCH_START);
        break;
    case '$':
        if (S_Char=='\0') return(MATCH_FOUND);
        if ((*Flags & PMATCH_NEWLINEEND) && (S_Char=='\n')) return(MATCH_FOUND);
        break;
    case '[':
        (*P_PtrPtr)++;
        return(pmatch_charlist(P_PtrPtr,S_Char,*Flags));
        break;

    case '\\':
        //results here can either be MATCH_FAIL, MATCH_CONT, MATCH_ONE
        (*P_PtrPtr)++;
        return (pmatch_quot(P_PtrPtr, S_PtrPtr, Flags));
        break;

    default:
        (*P_PtrPtr)++;
        if (P_Char==S_Char) return(MATCH_ONE);
        if (*Flags & PMATCH_SUBSTR) return(MATCH_CONT);
        return(MATCH_FAIL);
        break;
    }


    return(MATCH_FAIL);
}
Пример #2
0
int pmatch_char(const char **P_PtrPtr, const char **S_PtrPtr, int *Flags)
{
    char P_Char, S_Char;
    const char *P_Start;
    int result=MATCH_FAIL;

    P_Start=*P_PtrPtr;
    if (*Flags & PMATCH_NOCASE)
    {
        P_Char=tolower(**P_PtrPtr);
        S_Char=tolower(**S_PtrPtr);
    }
    else
    {
        P_Char=**P_PtrPtr;
        S_Char=**S_PtrPtr;
    }


//we must still honor switches even if 'nowildcards' is set, as we may want to turn
//'nowildcards' off, or turn case or extraction features on or off
    if (*Flags & PMATCH_NOWILDCARDS)
    {
        if (
            (P_Char=='\\') &&
            ((*(*P_PtrPtr+1)=='+') || (*(*P_PtrPtr+1)=='-'))
        ) /*This is a switch, fall through and process it */ ;
        else if (P_Char==S_Char) return(MATCH_ONE);
        else return(MATCH_FAIL);
    }

    switch (P_Char)
    {
    case '\0':
        result=MATCH_FOUND;
        break;
    case '|':
        result=MATCH_FOUND;
        break;
    case '*':
        result=MATCH_MANY;
        break;
    case '?':
        (*P_PtrPtr)++;
        result=MATCH_ONE;
        break;
    case '^':
        (*P_PtrPtr)++;
        result=MATCH_START;
        break;
    case '$':
        if (S_Char=='\0') result=MATCH_FOUND;
        else if ((*Flags & PMATCH_NEWLINEEND) && (S_Char=='\n')) result=MATCH_FOUND;
        break;

    //This is akin to $ (match end) but matches any 'breaking' character
    case '%':
        switch (S_Char)
        {
        case '\0':
        case '\r':
        case '\n':
        case ' ':
        case '	':
        case '-':
        case '_':
        case '.':
        case ',':
        case ':':
        case ';':
            result=MATCH_FOUND;
            break;
        }
        break;

    case '[':
        (*P_PtrPtr)++;
        result=pmatch_charlist(P_PtrPtr,S_Char,*Flags);
        break;

    case '{':
        (*P_PtrPtr)++;
        result=MATCH_REPEAT;
        break;

    case '\\':
        (*P_PtrPtr)++;
        result=pmatch_quot(P_PtrPtr, S_PtrPtr, Flags);
        break;

    default:
        (*P_PtrPtr)++;
        if (P_Char==S_Char) result=MATCH_ONE;
        else result=MATCH_FAIL;
        break;
    }

    if (result==MATCH_FAIL) *(P_PtrPtr)=P_Start;

    return(result);
}