Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/regex/grot/debug.c
39530 views
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
#include <wchar.h>
9
#include <wctype.h>
10
11
#include "utils.h"
12
#include "regex2.h"
13
#include "debug.ih"
14
15
/*
16
- regprint - print a regexp for debugging
17
== void regprint(regex_t *r, FILE *d);
18
*/
19
void
20
regprint(r, d)
21
regex_t *r;
22
FILE *d;
23
{
24
struct re_guts *g = r->re_g;
25
int i;
26
int c;
27
int last;
28
29
fprintf(d, "%ld states", (long)g->nstates);
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
}
50
51
/*
52
- s_print - print the strip for debugging
53
== static void s_print(struct re_guts *g, FILE *d);
54
*/
55
static void
56
s_print(g, d)
57
struct re_guts *g;
58
FILE *d;
59
{
60
sop *s;
61
cset *cs;
62
int i;
63
int done = 0;
64
sop opnd;
65
int col = 0;
66
int last;
67
sopno offset = 2;
68
# define GAP() { if (offset % 5 == 0) { \
69
if (col > 40) { \
70
fprintf(d, "\n\t"); \
71
col = 0; \
72
} else { \
73
fprintf(d, " "); \
74
col++; \
75
} \
76
} else \
77
col++; \
78
offset++; \
79
}
80
81
if (OP(g->strip[0]) != OEND)
82
fprintf(d, "missing initial OEND!\n");
83
for (s = &g->strip[1]; !done; s++) {
84
opnd = OPND(*s);
85
switch (OP(*s)) {
86
case OEND:
87
fprintf(d, "\n");
88
done = 1;
89
break;
90
case OCHAR:
91
if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
92
fprintf(d, "\\%c", (char)opnd);
93
else
94
fprintf(d, "%s", regchar((char)opnd));
95
break;
96
case OBOL:
97
fprintf(d, "^");
98
break;
99
case OEOL:
100
fprintf(d, "$");
101
break;
102
case OBOW:
103
fprintf(d, "\\{");
104
break;
105
case OEOW:
106
fprintf(d, "\\}");
107
break;
108
case OANY:
109
fprintf(d, ".");
110
break;
111
case OANYOF:
112
fprintf(d, "[(%ld)", (long)opnd);
113
#if 0
114
cs = &g->sets[opnd];
115
last = -1;
116
for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */
117
if (CHIN(cs, i) && i < g->csetsize) {
118
if (last < 0) {
119
fprintf(d, "%s", regchar(i));
120
last = i;
121
}
122
} else {
123
if (last >= 0) {
124
if (last != i-1)
125
fprintf(d, "-%s",
126
regchar(i-1));
127
last = -1;
128
}
129
}
130
#endif
131
fprintf(d, "]");
132
break;
133
case OBACK_:
134
fprintf(d, "(\\<%ld>", (long)opnd);
135
break;
136
case O_BACK:
137
fprintf(d, "<%ld>\\)", (long)opnd);
138
break;
139
case OPLUS_:
140
fprintf(d, "(+");
141
if (OP(*(s+opnd)) != O_PLUS)
142
fprintf(d, "<%ld>", (long)opnd);
143
break;
144
case O_PLUS:
145
if (OP(*(s-opnd)) != OPLUS_)
146
fprintf(d, "<%ld>", (long)opnd);
147
fprintf(d, "+)");
148
break;
149
case OQUEST_:
150
fprintf(d, "(?");
151
if (OP(*(s+opnd)) != O_QUEST)
152
fprintf(d, "<%ld>", (long)opnd);
153
break;
154
case O_QUEST:
155
if (OP(*(s-opnd)) != OQUEST_)
156
fprintf(d, "<%ld>", (long)opnd);
157
fprintf(d, "?)");
158
break;
159
case OLPAREN:
160
fprintf(d, "((<%ld>", (long)opnd);
161
break;
162
case ORPAREN:
163
fprintf(d, "<%ld>))", (long)opnd);
164
break;
165
case OCH_:
166
fprintf(d, "<");
167
if (OP(*(s+opnd)) != OOR2)
168
fprintf(d, "<%ld>", (long)opnd);
169
break;
170
case OOR1:
171
if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
172
fprintf(d, "<%ld>", (long)opnd);
173
fprintf(d, "|");
174
break;
175
case OOR2:
176
fprintf(d, "|");
177
if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
178
fprintf(d, "<%ld>", (long)opnd);
179
break;
180
case O_CH:
181
if (OP(*(s-opnd)) != OOR1)
182
fprintf(d, "<%ld>", (long)opnd);
183
fprintf(d, ">");
184
break;
185
default:
186
fprintf(d, "!%ld(%ld)!", OP(*s), (long)opnd);
187
break;
188
}
189
if (!done)
190
GAP();
191
}
192
}
193
194
/*
195
- regchar - make a character printable
196
== static char *regchar(int ch);
197
*/
198
static char * /* -> representation */
199
regchar(ch)
200
int ch;
201
{
202
static char buf[10];
203
204
if (isprint(ch) || ch == ' ')
205
sprintf(buf, "%c", ch);
206
else
207
sprintf(buf, "\\%o", ch);
208
return(buf);
209
}
210
211