|
|
1.1 ! root 1: /* ! 2: * match(string, pattern, fin) ! 3: * returns start of pattern in string or NULL if no match. ! 4: * pattern: ! 5: * [c1c2...cn-cm] class of characters. ! 6: * ? any character. ! 7: * * any # of any character. ! 8: * ^ beginning of string ! 9: * $ end of string ! 10: * if patttern is found fin is aimed past the end of the pattern. ! 11: */ ! 12: #include "local_misc.h" ! 13: ! 14: /* ! 15: * amatch is used internally by match. ! 16: */ ! 17: static char * ! 18: amatch(s, p, pfc, start, fin) ! 19: register char *s, *p; ! 20: int pfc; /* past first char */ ! 21: char **start, **fin; ! 22: { ! 23: char *save; ! 24: register c1; ! 25: int c2; ! 26: ! 27: if (NULL == *start) ! 28: *start = s; ! 29: for (;c2 = *p++; pfc = 1) { ! 30: c1 = *s++; ! 31: *fin = s; ! 32: ! 33: switch (c2) { ! 34: case '^': ! 35: if (pfc) ! 36: return (*start = NULL); ! 37: s--; ! 38: continue; ! 39: ! 40: case '$': ! 41: if (c1) ! 42: *start = NULL; ! 43: return (*start); ! 44: ! 45: case '[': ! 46: for (;;) { ! 47: c2 = *p++; ! 48: if (c2=='\0' || c2==']') ! 49: return (*start = NULL); ! 50: if (c2 == '\\' && *p == '-') ! 51: c2 = *p++; ! 52: if (c2 == c1) ! 53: break; ! 54: if (*p == '-') ! 55: if (c1<=*++p && c1>=c2) ! 56: break; ! 57: } ! 58: while (*p && *p++!=']') ! 59: ; ! 60: ! 61: case '?': ! 62: if (c1) ! 63: continue; ! 64: return (*start = NULL); ! 65: ! 66: case '*': ! 67: if (!*p) ! 68: return (*start); ! 69: s--; ! 70: save = *start; ! 71: do { ! 72: if (NULL != amatch(s, p, 1, start, fin)) ! 73: return (*start); ! 74: *start = save; ! 75: } while (*s++ != '\0'); ! 76: return (*start = NULL); ! 77: ! 78: case '\\': ! 79: if ((c2 = *p++) == '\0') ! 80: return (*start = NULL); ! 81: } ! 82: if (c1 != c2) ! 83: return (*start = NULL); ! 84: } ! 85: return (*start); ! 86: } ! 87: ! 88: char * ! 89: match(s, p, fin) ! 90: register char *s, *p; ! 91: char **fin; ! 92: { ! 93: char *start; ! 94: int pfc; ! 95: ! 96: start = *fin = NULL; ! 97: for (pfc = 0; *s; pfc = 1) ! 98: if (NULL != amatch(s++, p, pfc, &start, fin)) ! 99: return (start); ! 100: return (*fin = start); ! 101: } ! 102: ! 103: /* ! 104: * This pnmatch takes advantage of amatch. ! 105: */ ! 106: pnmatch(s1, pat, flag) ! 107: char *s1, *pat; ! 108: { ! 109: char *start, *fin; ! 110: ! 111: if (flag) ! 112: return (NULL != match(s1, pat, &fin)); ! 113: return ((NULL != amatch(s1, pat, 0, &start, &fin)) && !*fin); ! 114: } ! 115: ! 116: #ifdef TEST ! 117: main() ! 118: { ! 119: char s1[80], pat[80], *start, *fin; ! 120: ! 121: for (;;) { ! 122: ask(s1, "String "); ! 123: if (!strcmp(s1, "quit")) ! 124: exit(0); ! 125: ask(pat, "Pattern"); ! 126: if (NULL == (start = match(s1, pat, &fin))) ! 127: printf("Not Found\n"); ! 128: else { ! 129: *fin = '\0'; ! 130: printf("%s\n", start); ! 131: } ! 132: } ! 133: } ! 134: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.