debug.c revision 92986
1155192Srwatson#include <sys/cdefs.h>
2155192Srwatson__FBSDID("$FreeBSD: head/lib/libc/regex/grot/debug.c 92986 2002-03-22 21:53:29Z obrien $");
3155192Srwatson
4155192Srwatson#include <stdio.h>
5155192Srwatson#include <string.h>
6155192Srwatson#include <ctype.h>
7155192Srwatson#include <limits.h>
8155192Srwatson#include <stdlib.h>
9155192Srwatson#include <sys/types.h>
10155192Srwatson#include <regex.h>
11155192Srwatson
12155192Srwatson#include "utils.h"
13155192Srwatson#include "regex2.h"
14155192Srwatson#include "debug.ih"
15155192Srwatson
16155192Srwatson/*
17155192Srwatson - regprint - print a regexp for debugging
18155192Srwatson == void regprint(regex_t *r, FILE *d);
19155192Srwatson */
20155192Srwatsonvoid
21155192Srwatsonregprint(r, d)
22155192Srwatsonregex_t *r;
23155192SrwatsonFILE *d;
24155192Srwatson{
25155192Srwatson	struct re_guts *g = r->re_g;
26155192Srwatson	int i;
27155192Srwatson	int c;
28155192Srwatson	int last;
29155192Srwatson	int nincat[NC];
30155192Srwatson
31155192Srwatson	fprintf(d, "%ld states, %d categories", (long)g->nstates,
32168933Srwatson							g->ncategories);
33168933Srwatson	fprintf(d, ", first %ld last %ld", (long)g->firststate,
34155192Srwatson						(long)g->laststate);
35159318Srwatson	if (g->iflags&USEBOL)
36155192Srwatson		fprintf(d, ", USEBOL");
37164033Srwatson	if (g->iflags&USEEOL)
38155192Srwatson		fprintf(d, ", USEEOL");
39155192Srwatson	if (g->iflags&BAD)
40155192Srwatson		fprintf(d, ", BAD");
41155192Srwatson	if (g->nsub > 0)
42163207Scsjp		fprintf(d, ", nsub=%ld", (long)g->nsub);
43155192Srwatson	if (g->must != NULL)
44155192Srwatson		fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen,
45155192Srwatson								g->must);
46168933Srwatson	if (g->backrefs)
47155192Srwatson		fprintf(d, ", backrefs");
48155192Srwatson	if (g->nplus > 0)
49168933Srwatson		fprintf(d, ", nplus %ld", (long)g->nplus);
50155192Srwatson	fprintf(d, "\n");
51155192Srwatson	s_print(g, d);
52155192Srwatson	for (i = 0; i < g->ncategories; i++) {
53155192Srwatson		nincat[i] = 0;
54156889Srwatson		for (c = CHAR_MIN; c <= CHAR_MAX; c++)
55170127Srwatson			if (g->categories[c] == i)
56156889Srwatson				nincat[i]++;
57155192Srwatson	}
58156889Srwatson	fprintf(d, "cc0#%d", nincat[0]);
59156889Srwatson	for (i = 1; i < g->ncategories; i++)
60156889Srwatson		if (nincat[i] == 1) {
61155192Srwatson			for (c = CHAR_MIN; c <= CHAR_MAX; c++)
62155192Srwatson				if (g->categories[c] == i)
63155192Srwatson					break;
64155192Srwatson			fprintf(d, ", %d=%s", i, regchar(c));
65155192Srwatson		}
66155192Srwatson	fprintf(d, "\n");
67155192Srwatson	for (i = 1; i < g->ncategories; i++)
68155192Srwatson		if (nincat[i] != 1) {
69155192Srwatson			fprintf(d, "cc%d\t", i);
70163207Scsjp			last = -1;
71163207Scsjp			for (c = CHAR_MIN; c <= CHAR_MAX+1; c++)	/* +1 does flush */
72164033Srwatson				if (c <= CHAR_MAX && g->categories[c] == i) {
73155192Srwatson					if (last < 0) {
74155192Srwatson						fprintf(d, "%s", regchar(c));
75155192Srwatson						last = c;
76155192Srwatson					}
77155192Srwatson				} else {
78155192Srwatson					if (last >= 0) {
79155192Srwatson						if (last != c-1)
80155192Srwatson							fprintf(d, "-%s",
81156889Srwatson								regchar(c-1));
82156889Srwatson						last = -1;
83155192Srwatson					}
84155192Srwatson				}
85155192Srwatson			fprintf(d, "\n");
86155192Srwatson		}
87156889Srwatson}
88156889Srwatson
89156889Srwatson/*
90156889Srwatson - s_print - print the strip for debugging
91155192Srwatson == static void s_print(struct re_guts *g, FILE *d);
92155192Srwatson */
93155192Srwatsonstatic void
94155192Srwatsons_print(g, d)
95155192Srwatsonstruct re_guts *g;
96155192SrwatsonFILE *d;
97155192Srwatson{
98155192Srwatson	sop *s;
99155192Srwatson	cset *cs;
100155192Srwatson	int i;
101156889Srwatson	int done = 0;
102155192Srwatson	sop opnd;
103155192Srwatson	int col = 0;
104155192Srwatson	int last;
105155192Srwatson	sopno offset = 2;
106155192Srwatson#	define	GAP()	{	if (offset % 5 == 0) { \
107155192Srwatson					if (col > 40) { \
108155192Srwatson						fprintf(d, "\n\t"); \
109155192Srwatson						col = 0; \
110156889Srwatson					} else { \
111155192Srwatson						fprintf(d, " "); \
112155192Srwatson						col++; \
113155192Srwatson					} \
114155192Srwatson				} else \
115155192Srwatson					col++; \
116168933Srwatson				offset++; \
117172930Srwatson			}
118168933Srwatson
119168933Srwatson	if (OP(g->strip[0]) != OEND)
120168933Srwatson		fprintf(d, "missing initial OEND!\n");
121168933Srwatson	for (s = &g->strip[1]; !done; s++) {
122156889Srwatson		opnd = OPND(*s);
123170127Srwatson		switch (OP(*s)) {
124155192Srwatson		case OEND:
125155192Srwatson			fprintf(d, "\n");
126155192Srwatson			done = 1;
127155192Srwatson			break;
128155192Srwatson		case OCHAR:
129155192Srwatson			if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
130155192Srwatson				fprintf(d, "\\%c", (char)opnd);
131155192Srwatson			else
132155192Srwatson				fprintf(d, "%s", regchar((char)opnd));
133162380Scsjp			break;
134162380Scsjp		case OBOL:
135162380Scsjp			fprintf(d, "^");
136170127Srwatson			break;
137162380Scsjp		case OEOL:
138162380Scsjp			fprintf(d, "$");
139162380Scsjp			break;
140162380Scsjp		case OBOW:
141155192Srwatson			fprintf(d, "\\{");
142155192Srwatson			break;
143155192Srwatson		case OEOW:
144156889Srwatson			fprintf(d, "\\}");
145156889Srwatson			break;
146156889Srwatson		case OANY:
147155192Srwatson			fprintf(d, ".");
148155192Srwatson			break;
149155192Srwatson		case OANYOF:
150155192Srwatson			fprintf(d, "[(%ld)", (long)opnd);
151155192Srwatson			cs = &g->sets[opnd];
152155192Srwatson			last = -1;
153155192Srwatson			for (i = 0; i < g->csetsize+1; i++)	/* +1 flushes */
154155192Srwatson				if (CHIN(cs, i) && i < g->csetsize) {
155155192Srwatson					if (last < 0) {
156155192Srwatson						fprintf(d, "%s", regchar(i));
157155192Srwatson						last = i;
158155192Srwatson					}
159170407Srwatson				} else {
160155192Srwatson					if (last >= 0) {
161155192Srwatson						if (last != i-1)
162155192Srwatson							fprintf(d, "-%s",
163155192Srwatson								regchar(i-1));
164163207Scsjp						last = -1;
165163207Scsjp					}
166155192Srwatson				}
167168933Srwatson			fprintf(d, "]");
168168933Srwatson			break;
169172930Srwatson		case OBACK_:
170168933Srwatson			fprintf(d, "(\\<%ld>", (long)opnd);
171168933Srwatson			break;
172168933Srwatson		case O_BACK:
173168933Srwatson			fprintf(d, "<%ld>\\)", (long)opnd);
174164033Srwatson			break;
175155192Srwatson		case OPLUS_:
176155192Srwatson			fprintf(d, "(+");
177155192Srwatson			if (OP(*(s+opnd)) != O_PLUS)
178155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
179155192Srwatson			break;
180155192Srwatson		case O_PLUS:
181155192Srwatson			if (OP(*(s-opnd)) != OPLUS_)
182155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
183156889Srwatson			fprintf(d, "+)");
184156889Srwatson			break;
185156889Srwatson		case OQUEST_:
186155192Srwatson			fprintf(d, "(?");
187155192Srwatson			if (OP(*(s+opnd)) != O_QUEST)
188155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
189155192Srwatson			break;
190155192Srwatson		case O_QUEST:
191155192Srwatson			if (OP(*(s-opnd)) != OQUEST_)
192155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
193155192Srwatson			fprintf(d, "?)");
194155192Srwatson			break;
195155192Srwatson		case OLPAREN:
196155192Srwatson			fprintf(d, "((<%ld>", (long)opnd);
197155192Srwatson			break;
198155192Srwatson		case ORPAREN:
199155192Srwatson			fprintf(d, "<%ld>))", (long)opnd);
200155192Srwatson			break;
201155192Srwatson		case OCH_:
202155192Srwatson			fprintf(d, "<");
203155192Srwatson			if (OP(*(s+opnd)) != OOR2)
204155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
205155192Srwatson			break;
206155192Srwatson		case OOR1:
207155192Srwatson			if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
208155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
209156889Srwatson			fprintf(d, "|");
210155192Srwatson			break;
211155192Srwatson		case OOR2:
212155192Srwatson			fprintf(d, "|");
213155192Srwatson			if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
214155192Srwatson				fprintf(d, "<%ld>", (long)opnd);
215155192Srwatson			break;
216155192Srwatson		case O_CH:
217155192Srwatson			if (OP(*(s-opnd)) != OOR1)
218161813Swsalamon				fprintf(d, "<%ld>", (long)opnd);
219161813Swsalamon			fprintf(d, ">");
220161813Swsalamon			break;
221161813Swsalamon		default:
222155192Srwatson			fprintf(d, "!%d(%d)!", OP(*s), opnd);
223155192Srwatson			break;
224155192Srwatson		}
225161813Swsalamon		if (!done)
226161813Swsalamon			GAP();
227155192Srwatson	}
228155192Srwatson}
229155192Srwatson
230155192Srwatson/*
231155192Srwatson - regchar - make a character printable
232155192Srwatson == static char *regchar(int ch);
233161813Swsalamon */
234161813Swsalamonstatic char *			/* -> representation */
235155192Srwatsonregchar(ch)
236155192Srwatsonint ch;
237155192Srwatson{
238155192Srwatson	static char buf[10];
239155192Srwatson
240155192Srwatson	if (isprint(ch) || ch == ' ')
241155192Srwatson		sprintf(buf, "%c", ch);
242155192Srwatson	else
243155192Srwatson		sprintf(buf, "\\%o", ch);
244155192Srwatson	return(buf);
245155192Srwatson}
246155192Srwatson