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); }
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); }