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