root/ext/ereg/regex/debug.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. regprint
  2. s_print
  3. regchar

   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 }

/* [<][>][^][v][top][bottom][index][help] */