int fpattern_matchn(const char *pat, const char *fname, int flength, int keepcase) { int rc; /* Check args */ if (fname == NULL) return (FALSE); if (pat == NULL) return (FALSE); /* Assume that pattern is well-formed * NOTA BENE: this function may crash on invalid patterns! */ assert(fpattern_isvalid(pat)); /* Attempt to match pattern against filename */ if (flength < 0) flength = (int)strlen(fname); if (keepcase) rc = fpattern_submatch(pat, fname, flength); else rc = fpattern_submatch_tolower(pat, fname, flength); return (rc); }
int fpattern_match(const char *pat, const char *fname, int flength, int keepcase) { int rc; /* Check args */ if (fname == NULL) return (FALSE); if (pat == NULL) return (FALSE); /* Verify that the pattern is valid, and get its length */ if (!fpattern_isvalid(pat)) return (FALSE); /* Attempt to match pattern against filename */ if (flength < 0) flength = (int)strlen(fname); if (flength == 0) return (pat[0] == '\0'); /* Special case */ if (keepcase) rc = fpattern_submatch(pat, fname, flength); else rc = fpattern_submatch_tolower(pat, fname, flength); return (rc); }
/* returns the largest packet that matches the pattern */ int fpattern_matchcount(const char *pat, const char *fname, int flength, int minlength, int keepcase) { int len; if (fname == NULL) return (FALSE); if (pat == NULL) return (FALSE); /* Assume that pattern is well-formed */ /* Attempt to match pattern against filename */ if (flength < 0) flength = (int)strlen(fname); if (keepcase) { for (len = flength; len > minlength; len--) if (fpattern_submatch(pat, fname, len)) break; } else { for (len = flength; len > minlength; len--) if (fpattern_submatch_tolower(pat, fname, len)) break; } /* if */ return (len > minlength) ? len : 0; }
int fpattern_matchn(const char *pat, const char *fname) { int rc; /* Check args */ if (fname == NULL) return (FALSE); if (pat == NULL) return (FALSE); /* Assume that pattern is well-formed */ /* Attempt to match pattern against filename */ rc = fpattern_submatch(pat, fname); return (rc); }
/* returns the largest packet that matches the pattern */ int fpattern_matchcount(const char *pat, const char *fname, int flength, int keepcase) { int len; if (fname == NULL) return (FALSE); if (pat == NULL) return (FALSE); /* Assume that pattern is well-formed */ /* Attempt to match pattern against filename */ if (flength < 0) flength = strlen(fname); for (len = flength; len >= 0; len--) if (fpattern_submatch(pat, fname, flength, keepcase)) break; return len; }
int fpattern_match(const char *pat, const char *fname) { int rc; /* Check args */ if (fname == NULL) return (FALSE); if (pat == NULL) return (FALSE); /* Verify that the pattern is valid, and get its length */ if (!fpattern_isvalid(pat)) return (FALSE); /* Attempt to match pattern against filename */ if (fname[0] == '\0') return (pat[0] == '\0'); /* Special case */ rc = fpattern_submatch(pat, fname); return (rc); }
static int fpattern_submatch(const char *pat, const char *fname, int flength, int keepcase) { int fch; int pch; int i; int yes, match; int lo, hi; /* Attempt to match subpattern against subfilename */ while (*pat != '\0') { fch = *fname; pch = *pat; pat++; switch (pch) { case FPAT_ANY: /* Match a single char */ #if DELIM if (fch == DEL || fch == DEL2 || fch == '\0') return (FALSE); #else if (flength == 0) return (FALSE); #endif fname++; flength--; break; case FPAT_CLOS: /* Match zero or more chars */ #if DELIM i = 0; while (fname[i] != '\0' && fname[i] != DEL && fname[i] != DEL2) i++; #else i = flength; #endif while (i >= 0) { if (fpattern_submatch(pat, fname+i, flength-i, keepcase)) return (TRUE); i--; } return (FALSE); #if SUBCLOS case SUB: /* Match zero or more chars */ i = 0; while (i < flength && #if DELIM fname[i] != DEL && fname[i] != DEL2 && #endif fname[i] != '.') i++; while (i >= 0) { if (fpattern_submatch(pat, fname+i, flength-i, keepcase)) return (TRUE); i--; } return (FALSE); #endif case QUOTE: /* Match a quoted char */ pch = *pat; if (lowercase(fch, keepcase) != lowercase(pch, keepcase) || pch == '\0') return (FALSE); fname++; flength--; pat++; break; case FPAT_SET_L: /* Match char set/range */ yes = TRUE; if (*pat == FPAT_SET_NOT) { pat++; yes = FALSE; /* Set negation */ } /* Look for [s], [-], [abc], [a-c] */ match = !yes; while (*pat != FPAT_SET_R && *pat != '\0') { if (*pat == QUOTE) pat++; /* Quoted char */ if (*pat == '\0') break; lo = *pat++; hi = lo; if (*pat == FPAT_SET_THRU) { /* Range */ pat++; if (*pat == QUOTE) pat++; /* Quoted char */ if (*pat == '\0') break; hi = *pat++; } if (*pat == '\0') break; /* Compare character to set range */ if (lowercase(fch, keepcase) >= lowercase(lo, keepcase) && lowercase(fch, keepcase) <= lowercase(hi, keepcase)) match = yes; } if (!match) return (FALSE); if (*pat == '\0') return (FALSE); /* Missing closing bracket */ fname++; flength--; pat++; break; case FPAT_MSET_L: /* Match zero or more characters in a char set/range */ yes = TRUE; if (*pat == FPAT_SET_NOT) { pat++; yes = FALSE; /* Set negation */ } do { const char *org_pat = pat; /* Look for [s], [-], [abc], [a-c] */ match = !yes; while (*pat != FPAT_MSET_R && *pat != '\0') { if (*pat == QUOTE) pat++; /* Quoted char */ if (*pat == '\0') break; lo = *pat++; hi = lo; if (*pat == FPAT_SET_THRU) { /* Range */ pat++; if (*pat == QUOTE) pat++; /* Quoted char */ if (*pat == '\0') break; hi = *pat++; } if (*pat == '\0') break; /* Compare character to set range */ if (lowercase(fch, keepcase) >= lowercase(lo, keepcase) && lowercase(fch, keepcase) <= lowercase(hi, keepcase)) { match = yes; while (*pat != FPAT_MSET_R && *pat != '\0') pat++; break; } /* if */ } if (*pat == '\0') return (FALSE); /* Missing closing bracket */ if (match) { fname++; flength--; fch = *fname; if (flength > 0) pat = org_pat; } } while (match && flength > 0); pat++; break; case FPAT_NOT: /* Match only if rest of pattern does not match */ if (*pat == '\0') return (FALSE); /* Missing subpattern */ i = fpattern_submatch(pat, fname, flength, keepcase); return !i; #if DELIM case DEL: #if DEL2 != DEL case DEL2: #endif /* Match path delimiter char */ if (fch != DEL && fch != DEL2) return (FALSE); fname++; flength--; break; #endif default: /* Match a (non-null) char exactly */ if (lowercase(fch, keepcase) != lowercase(pch, keepcase)) return (FALSE); fname++; flength--; break; } } /* Check for complete match */ if (flength != 0) return (FALSE); /* Successful match */ return (TRUE); }
static int fpattern_submatch(const char *pat, const char *fname) { int fch; int pch; int i; int yes, match; int lo, hi; /* Attempt to match subpattern against subfilename */ while (*pat != '\0') { fch = *fname; pch = *pat; pat++; switch (pch) { case FPAT_ANY: /* Match a single char */ #if DELIM if (fch == DEL || fch == DEL2CHR || fch == '\0') return (FALSE); #else if (fch == '\0') return (FALSE); #endif fname++; break; case FPAT_CLOS: /* Match zero or more chars */ i = 0; #if DELIM while (fname[i] != '\0' && fname[i] != DEL && fname[i] != DEL2CHR) i++; #else while (fname[i] != '\0') i++; #endif while (i >= 0) { if (fpattern_submatch(pat, fname+i)) return (TRUE); i--; } return (FALSE); case SUBCHR: /* Match zero or more chars */ i = 0; while (fname[i] != '\0' && #if DELIM fname[i] != DEL && fname[i] != DEL2CHR && #endif fname[i] != '.') i++; while (i >= 0) { if (fpattern_submatch(pat, fname+i)) return (TRUE); i--; } return (FALSE); case QUOTECHR: /* Match a quoted char */ pch = *pat; if (lowercase(fch) != lowercase(pch) || pch == '\0') return (FALSE); fname++; pat++; break; case FPAT_SET_L: /* Match char set/range */ yes = TRUE; if (*pat == FPAT_SET_NOT) { pat++; yes = FALSE; /* Set negation */ } /* Look for [s], [-], [abc], [a-c] */ match = !yes; while (*pat != FPAT_SET_R && *pat != '\0') { if (*pat == QUOTECHR) pat++; /* Quoted char */ if (*pat == '\0') break; lo = *pat++; hi = lo; if (*pat == FPAT_SET_THRU) { /* Range */ pat++; if (*pat == QUOTECHR) pat++; /* Quoted char */ if (*pat == '\0') break; hi = *pat++; } if (*pat == '\0') break; /* Compare character to set range */ if (lowercase(fch) >= lowercase(lo) && lowercase(fch) <= lowercase(hi)) match = yes; } if (!match) return (FALSE); if (*pat == '\0') return (FALSE); /* Missing closing bracket */ fname++; pat++; break; case FPAT_NOT: /* Match only if rest of pattern does not match */ if (*pat == '\0') return (FALSE); /* Missing subpattern */ i = fpattern_submatch(pat, fname); return !i; #if DELIM case DEL: #if DEL2CHR != DEL case DEL2CHR: #endif /* Match path delimiter char */ if (fch != DEL && fch != DEL2CHR) return (FALSE); fname++; break; #endif default: /* Match a (non-null) char exactly */ if (lowercase(fch) != lowercase(pch)) return (FALSE); fname++; break; } } /* Check for complete match */ if (*fname != '\0') return (FALSE); /* Successful match */ return (TRUE); }
static int fpattern_submatch(const char *pat, const char *fname, int flength) { int fch; int pch, pch2; int i; int yes, match; int lo, hi; /* Attempt to match subpattern against subfilename */ while (*pat != '\0') { fch = (unsigned char)*fname; pch = (unsigned char)*pat; pat++; switch (pch) { case FPAT_ANY: /* Match a single char */ #if defined FPAT_DELIM if (fch == FPAT_DEL || fch == FPAT_DEL2 || fch == '\0') return (FALSE); #else if (flength == 0) return (FALSE); #endif fname++; flength--; break; case FPAT_CLOS: /* Match zero or more chars */ #if defined FPAT_DELIM i = 0; while (fname[i] != '\0' && fname[i] != FPAT_DEL && fname[i] != FPAT_DEL2) i++; #else i = flength; #endif while (i >= 0) { if (fpattern_submatch(pat, fname+i, flength-i)) return (TRUE); i--; } return (FALSE); #ifdef FPAT_SUBCLOS case FPAT_CLOSP: /* Match zero or more chars */ i = 0; while (i < flength && #if defined FPAT_DELIM fname[i] != FPAT_DEL && fname[i] != FPAT_DEL2 && #endif fname[i] != '.') i++; while (i >= 0) { if (fpattern_submatch(pat, fname+i, flength-i)) return (TRUE); i--; } return (FALSE); #endif case FPAT_QUOTE: /* Match a quoted char */ assert(*pat != '\0'); pch = (unsigned char)*pat; if (ishexdigit(pch)) { pch2 = *++pat; pch = (hexdigit(pch) << 4) | hexdigit(pch2); } /* if */ if ((fch) != (pch)) return (FALSE); fname++; flength--; pat++; break; case FPAT_SET_L: /* Match char set/range */ yes = TRUE; if (*pat == FPAT_NOT) { pat++; yes = FALSE; /* Set negation */ } /* if */ /* Look for [s], [-], [abc], [a-c] */ match = !yes; while (*pat != FPAT_SET_R) { assert(*pat != '\0'); pch = (unsigned char)*pat++; if (pch == FPAT_QUOTE) { assert(*pat != '\0'); pch = (unsigned char)*pat++; if (ishexdigit(pch)) { pch2 = *pat++; lo = (hexdigit(pch) << 4) | hexdigit(pch2); } else { lo = pch; } /* if */ } else { lo = pch; } /* if */ if (*pat == FPAT_SET_THRU) { /* Range */ pat++; pch = (unsigned char)*pat++; if (pch == FPAT_QUOTE) { assert(*pat != '\0'); pch = (unsigned char)*pat++; if (ishexdigit(pch)) { pch2 = *pat++; hi = (hexdigit(pch) << 4) | hexdigit(pch2); } else { hi = pch; } /* if */ } else { hi = pch; } /* if */ /* Compare character to set range */ if ((fch) >= (lo) && (fch) <= (hi)) { match = yes; /* skip to the end of the set in the pattern (no need to * search further once a match is found) */ while (*pat != FPAT_SET_R) { assert(*pat != '\0'); pat++; } /* while */ break; } /* if */ } else { /* Compare character to single char from set */ if ((fch) == (lo)) { match = yes; /* skip to the end of the set in the pattern (no need to * search further once a match is found) */ while (*pat != FPAT_SET_R) { assert(*pat != '\0'); pat++; } /* while */ break; } /* if */ } /* if */ assert(*pat != '\0'); } /* while */ if (!match) return (FALSE); fname++; flength--; assert(*pat == FPAT_SET_R); pat++; break; #if defined FPAT_MSET_ENABLED case FPAT_MSET_L: /* Match zero or more characters in a char set/range */ yes = TRUE; if (*pat == FPAT_NOT) { pat++; yes = FALSE; /* Set negation */ } /* if */ do { const char *org_pat = pat; /* Look for [s], [-], [abc], [a-c] */ match = !yes; while (*pat != FPAT_MSET_R) { assert(*pat != '\0'); pch = (unsigned char)*pat++; if (pch == FPAT_QUOTE) { assert(*pat != '\0'); pch = (unsigned char)*pat++; if (ishexdigit(pch)) { pch2 = *pat++; lo = (hexdigit(pch) << 4) | hexdigit(pch2); } else { lo = pch; } /* if */ } else { lo = pch; } /* if */ if (*pat == FPAT_SET_THRU) { /* Range */ pat++; pch = (unsigned char)*pat++; if (pch == FPAT_QUOTE) { assert(*pat != '\0'); pch = (unsigned char)*pat++; if (ishexdigit(pch)) { pch2 = *pat++; hi = (hexdigit(pch) << 4) | hexdigit(pch2); } else { hi = pch; } /* if */ } else { hi = pch; } /* if */ /* Compare character to set range */ if ((fch) >= (lo) && (fch) <= (hi)) { match = yes; /* skip to the end of the set in the pattern (no * need to search further once a match is found) */ while (*pat != FPAT_MSET_R) { assert(*pat != '\0'); pat++; } /* while */ break; } /* if */ } else { /* Compare character to single char from the set */ if ((fch) == (lo)) { match = yes; /* skip to the end of the set in the pattern (no * need to search further once a match is found) */ while (*pat != FPAT_MSET_R) { assert(*pat != '\0'); pat++; } /* while */ break; } /* if */ } /* if */ assert(*pat != '\0'); } /* while */ assert(*pat == FPAT_MSET_R); if (match) { fname++; flength--; fch = *fname; if (flength > 0) pat = org_pat; } /* if */ } while (match && flength > 0); pat++; break; #endif /* FPAT_MSET_ENABLED */ #if defined FPAT_NOT_ENABLED case FPAT_NOT: /* Match only if rest of pattern does not match */ assert(*pat != '\0'); i = fpattern_submatch(pat, fname, flength); return !i; #endif #if defined FPAT_DELIM case FPAT_DEL: #if FPAT_DEL2 != FPAT_DEL case FPAT_DEL2: #endif /* Match path delimiter char */ if (fch != FPAT_DEL && fch != FPAT_DEL2) return (FALSE); fname++; flength--; break; #endif default: /* Match a (non-null) char exactly */ if ((fch) != (pch)) return (FALSE); fname++; flength--; break; } } /* Check for complete match */ if (flength != 0) return (FALSE); /* Successful match */ return (TRUE); }