|
|
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.