Annotation of embedaddon/php/ext/ereg/regex/debug.c, revision 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>