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