Annotation of embedaddon/php/ext/ereg/regex/debug.c, revision 1.1.1.1
1.1 misho 1: #include <stdio.h>
2: #include <string.h>
3: #include <ctype.h>
4: #include <limits.h>
5: #include <stdlib.h>
6: #include <sys/types.h>
7: #include <regex.h>
8:
9: #include "utils.h"
10: #include "regex2.h"
11: #include "debug.ih"
12:
13: /*
14: - regprint - print a regexp for debugging
15: == void regprint(regex_t *r, FILE *d);
16: */
17: void
18: regprint(r, d)
19: regex_t *r;
20: FILE *d;
21: {
22: register struct re_guts *g = r->re_g;
23: register int i;
24: register int c;
25: register int last;
26: int nincat[NC];
27:
28: fprintf(d, "%ld states, %d categories", (long)g->nstates,
29: g->ncategories);
30: fprintf(d, ", first %ld last %ld", (long)g->firststate,
31: (long)g->laststate);
32: if (g->iflags&USEBOL)
33: fprintf(d, ", USEBOL");
34: if (g->iflags&USEEOL)
35: fprintf(d, ", USEEOL");
36: if (g->iflags&BAD)
37: fprintf(d, ", BAD");
38: if (g->nsub > 0)
39: fprintf(d, ", nsub=%ld", (long)g->nsub);
40: if (g->must != NULL)
41: fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen,
42: g->must);
43: if (g->backrefs)
44: fprintf(d, ", backrefs");
45: if (g->nplus > 0)
46: fprintf(d, ", nplus %ld", (long)g->nplus);
47: fprintf(d, "\n");
48: s_print(g, d);
49: for (i = 0; i < g->ncategories; i++) {
50: nincat[i] = 0;
51: for (c = CHAR_MIN; c <= CHAR_MAX; c++)
52: if (g->categories[c] == i)
53: nincat[i]++;
54: }
55: fprintf(d, "cc0#%d", nincat[0]);
56: for (i = 1; i < g->ncategories; i++)
57: if (nincat[i] == 1) {
58: for (c = CHAR_MIN; c <= CHAR_MAX; c++)
59: if (g->categories[c] == i)
60: break;
61: fprintf(d, ", %d=%s", i, regchar(c));
62: }
63: fprintf(d, "\n");
64: for (i = 1; i < g->ncategories; i++)
65: if (nincat[i] != 1) {
66: fprintf(d, "cc%d\t", i);
67: last = -1;
68: for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */
69: if (c <= CHAR_MAX && g->categories[c] == i) {
70: if (last < 0) {
71: fprintf(d, "%s", regchar(c));
72: last = c;
73: }
74: } else {
75: if (last >= 0) {
76: if (last != c-1)
77: fprintf(d, "-%s",
78: regchar(c-1));
79: last = -1;
80: }
81: }
82: fprintf(d, "\n");
83: }
84: }
85:
86: /*
87: - s_print - print the strip for debugging
88: == static void s_print(register struct re_guts *g, FILE *d);
89: */
90: static void
91: s_print(g, d)
92: register struct re_guts *g;
93: FILE *d;
94: {
95: register sop *s;
96: register cset *cs;
97: register int i;
98: register int done = 0;
99: register sop opnd;
100: register int col = 0;
101: register int last;
102: register sopno offset = 2;
103: # define GAP() { if (offset % 5 == 0) { \
104: if (col > 40) { \
105: fprintf(d, "\n\t"); \
106: col = 0; \
107: } else { \
108: fprintf(d, " "); \
109: col++; \
110: } \
111: } else \
112: col++; \
113: offset++; \
114: }
115:
116: if (OP(g->strip[0]) != OEND)
117: fprintf(d, "missing initial OEND!\n");
118: for (s = &g->strip[1]; !done; s++) {
119: opnd = OPND(*s);
120: switch (OP(*s)) {
121: case OEND:
122: fprintf(d, "\n");
123: done = 1;
124: break;
125: case OCHAR:
126: if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
127: fprintf(d, "\\%c", (unsigned char)opnd);
128: else
129: fprintf(d, "%s", regchar((unsigned char)opnd));
130: break;
131: case OBOL:
132: fprintf(d, "^");
133: break;
134: case OEOL:
135: fprintf(d, "$");
136: break;
137: case OBOW:
138: fprintf(d, "\\{");
139: break;
140: case OEOW:
141: fprintf(d, "\\}");
142: break;
143: case OANY:
144: fprintf(d, ".");
145: break;
146: case OANYOF:
147: fprintf(d, "[(%ld)", (long)opnd);
148: cs = &g->sets[opnd];
149: last = -1;
150: for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */
151: if (CHIN(cs, i) && i < g->csetsize) {
152: if (last < 0) {
153: fprintf(d, "%s", regchar(i));
154: last = i;
155: }
156: } else {
157: if (last >= 0) {
158: if (last != i-1)
159: fprintf(d, "-%s",
160: regchar(i-1));
161: last = -1;
162: }
163: }
164: fprintf(d, "]");
165: break;
166: case OBACK_:
167: fprintf(d, "(\\<%ld>", (long)opnd);
168: break;
169: case O_BACK:
170: fprintf(d, "<%ld>\\)", (long)opnd);
171: break;
172: case OPLUS_:
173: fprintf(d, "(+");
174: if (OP(*(s+opnd)) != O_PLUS)
175: fprintf(d, "<%ld>", (long)opnd);
176: break;
177: case O_PLUS:
178: if (OP(*(s-opnd)) != OPLUS_)
179: fprintf(d, "<%ld>", (long)opnd);
180: fprintf(d, "+)");
181: break;
182: case OQUEST_:
183: fprintf(d, "(?");
184: if (OP(*(s+opnd)) != O_QUEST)
185: fprintf(d, "<%ld>", (long)opnd);
186: break;
187: case O_QUEST:
188: if (OP(*(s-opnd)) != OQUEST_)
189: fprintf(d, "<%ld>", (long)opnd);
190: fprintf(d, "?)");
191: break;
192: case OLPAREN:
193: fprintf(d, "((<%ld>", (long)opnd);
194: break;
195: case ORPAREN:
196: fprintf(d, "<%ld>))", (long)opnd);
197: break;
198: case OCH_:
199: fprintf(d, "<");
200: if (OP(*(s+opnd)) != OOR2)
201: fprintf(d, "<%ld>", (long)opnd);
202: break;
203: case OOR1:
204: if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
205: fprintf(d, "<%ld>", (long)opnd);
206: fprintf(d, "|");
207: break;
208: case OOR2:
209: fprintf(d, "|");
210: if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
211: fprintf(d, "<%ld>", (long)opnd);
212: break;
213: case O_CH:
214: if (OP(*(s-opnd)) != OOR1)
215: fprintf(d, "<%ld>", (long)opnd);
216: fprintf(d, ">");
217: break;
218: default:
219: fprintf(d, "!%ld(%ld)!", OP(*s), opnd);
220: break;
221: }
222: if (!done)
223: GAP();
224: }
225: }
226:
227: /*
228: - regchar - make a character printable
229: == static char *regchar(int ch);
230: */
231: static unsigned char * /* -> representation */
232: regchar(ch)
233: int ch;
234: {
235: static unsigned char buf[10];
236:
237: if (isprint(ch) || ch == ' ')
238: sprintf(buf, "%c", ch);
239: else
240: sprintf(buf, "\\%o", ch);
241: return(buf);
242: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>