/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */ /* * match -- returns 1 if `string' satisfised `regex' and 0 otherwise * stolen from Spencer Sun: only recognizes * and \ as special characters */ int match(regex, string) char *regex; char *string; { char c, *rp = regex, *sp = string, *p; char spn[256]; int found; if (!rp || !sp) return 0; while (*rp != '\0') { switch (c = *rp++) { case '*': if (*sp == 0 || *rp == 0) // match empty string at end of `string' return (*rp == 0); // but only if we're done with the pattern p = sp + strlen(sp); do { if (match(rp, sp)) return 1; } while (++sp < p); /* * Reached end of string (i.e. `*' matches empty string) and * we _still_ can't match here. Give up. */ return 0; case '[': // given [abc...] next char must match any of abc... p = spn; while (*rp != ']') { if (!*rp) // Missing ']' return 0; *p++ = *rp++; } rp++; *p = 0; if (!strchr(spn, *sp++)) return 0; break; case '\\': c = *rp++; /* Fall through to match literal character */ default: // normal character if (c != *sp++) return 0; break; } } /* * OK, we successfully matched the pattern if we got here. Now return * a match if we also reached end of string, otherwise failure */ return (*sp == 0); }