/[pcre]/code/trunk/pcretest.c
ViewVC logotype

Diff of /code/trunk/pcretest.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3 by nigel, Sat Feb 24 21:38:01 2007 UTC revision 25 by nigel, Sat Feb 24 21:38:45 2007 UTC
# Line 7  Line 7 
7  #include <string.h>  #include <string.h>
8  #include <stdlib.h>  #include <stdlib.h>
9  #include <time.h>  #include <time.h>
10    #include <locale.h>
11    
12  /* Use the internal info for displaying the results of pcre_study(). */  /* Use the internal info for displaying the results of pcre_study(). */
13    
# Line 21  Line 22 
22  #endif  #endif
23  #endif  #endif
24    
25    #define LOOPREPEAT 10000
26    
27    
28  static FILE *outfile;  static FILE *outfile;
29  static int log_store = 0;  static int log_store = 0;
# Line 30  static int log_store = 0; Line 33  static int log_store = 0;
33  /* Debugging function to print the internal form of the regex. This is the same  /* Debugging function to print the internal form of the regex. This is the same
34  code as contained in pcre.c under the DEBUG macro. */  code as contained in pcre.c under the DEBUG macro. */
35    
36  static char *OP_names[] = { "End", "\\A", "\\B", "\\b", "\\D", "\\d",  static const char *OP_names[] = {
37    "\\S", "\\s", "\\W", "\\w", "Cut", "\\Z", "^", "$", "Any", "chars",    "End", "\\A", "\\B", "\\b", "\\D", "\\d",
38    "not",    "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z",
39      "Opt", "^", "$", "Any", "chars", "not",
40    "*", "*?", "+", "+?", "?", "??", "{", "{", "{",    "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
41    "*", "*?", "+", "+?", "?", "??", "{", "{", "{",    "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
42    "*", "*?", "+", "+?", "?", "??", "{", "{", "{",    "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
43    "*", "*?", "+", "+?", "?", "??", "{", "{",    "*", "*?", "+", "+?", "?", "??", "{", "{",
44    "class", "Ref",    "class", "Ref",
45    "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", "Once",    "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",
46      "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",
47    "Brazero", "Braminzero", "Bra"    "Brazero", "Braminzero", "Bra"
48  };  };
49    
50    
51  static void print_internals(pcre *re)  static void print_internals(pcre *re, FILE *outfile)
52  {  {
53  unsigned char *code = ((real_pcre *)re)->code;  unsigned char *code = ((real_pcre *)re)->code;
54    
55  printf("------------------------------------------------------------------\n");  fprintf(outfile, "------------------------------------------------------------------\n");
56    
57  for(;;)  for(;;)
58    {    {
59    int c;    int c;
60    int charlength;    int charlength;
61    
62    printf("%3d ", code - ((real_pcre *)re)->code);    fprintf(outfile, "%3d ", (int)(code - ((real_pcre *)re)->code));
63    
64    if (*code >= OP_BRA)    if (*code >= OP_BRA)
65      {      {
66      printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);      fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
67      code += 2;      code += 2;
68      }      }
69    
70    else switch(*code)    else switch(*code)
71      {      {
72      case OP_END:      case OP_END:
73      printf("    %s\n", OP_names[*code]);      fprintf(outfile, "    %s\n", OP_names[*code]);
74      printf("------------------------------------------------------------------\n");      fprintf(outfile, "------------------------------------------------------------------\n");
75      return;      return;
76    
77        case OP_OPT:
78        fprintf(outfile, " %.2x %s", code[1], OP_names[*code]);
79        code++;
80        break;
81    
82        case OP_COND:
83        fprintf(outfile, "%3d Cond", (code[1] << 8) + code[2]);
84        code += 2;
85        break;
86    
87        case OP_CREF:
88        fprintf(outfile, " %.2d %s", code[1], OP_names[*code]);
89        code++;
90        break;
91    
92      case OP_CHARS:      case OP_CHARS:
93      charlength = *(++code);      charlength = *(++code);
94      printf("%3d ", charlength);      fprintf(outfile, "%3d ", charlength);
95      while (charlength-- > 0)      while (charlength-- > 0)
96        if (isprint(c = *(++code))) printf("%c", c); else printf("\\x%02x", c);        if (isprint(c = *(++code))) fprintf(outfile, "%c", c);
97            else fprintf(outfile, "\\x%02x", c);
98      break;      break;
99    
100      case OP_KETRMAX:      case OP_KETRMAX:
# Line 82  for(;;) Line 103  for(;;)
103      case OP_KET:      case OP_KET:
104      case OP_ASSERT:      case OP_ASSERT:
105      case OP_ASSERT_NOT:      case OP_ASSERT_NOT:
106        case OP_ASSERTBACK:
107        case OP_ASSERTBACK_NOT:
108      case OP_ONCE:      case OP_ONCE:
109      printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);      fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
110        code += 2;
111        break;
112    
113        case OP_REVERSE:
114        fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
115      code += 2;      code += 2;
116      break;      break;
117    
# Line 100  for(;;) Line 128  for(;;)
128      case OP_TYPEQUERY:      case OP_TYPEQUERY:
129      case OP_TYPEMINQUERY:      case OP_TYPEMINQUERY:
130      if (*code >= OP_TYPESTAR)      if (*code >= OP_TYPESTAR)
131        printf("    %s", OP_names[code[1]]);        fprintf(outfile, "    %s", OP_names[code[1]]);
132      else if (isprint(c = code[1])) printf("    %c", c);      else if (isprint(c = code[1])) fprintf(outfile, "    %c", c);
133        else printf("    \\x%02x", c);        else fprintf(outfile, "    \\x%02x", c);
134      printf("%s", OP_names[*code++]);      fprintf(outfile, "%s", OP_names[*code++]);
135      break;      break;
136    
137      case OP_EXACT:      case OP_EXACT:
138      case OP_UPTO:      case OP_UPTO:
139      case OP_MINUPTO:      case OP_MINUPTO:
140      if (isprint(c = code[3])) printf("    %c{", c);      if (isprint(c = code[3])) fprintf(outfile, "    %c{", c);
141        else printf("    \\x%02x{", c);        else fprintf(outfile, "    \\x%02x{", c);
142      if (*code != OP_EXACT) printf(",");      if (*code != OP_EXACT) fprintf(outfile, ",");
143      printf("%d}", (code[1] << 8) + code[2]);      fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
144      if (*code == OP_MINUPTO) printf("?");      if (*code == OP_MINUPTO) fprintf(outfile, "?");
145      code += 3;      code += 3;
146      break;      break;
147    
148      case OP_TYPEEXACT:      case OP_TYPEEXACT:
149      case OP_TYPEUPTO:      case OP_TYPEUPTO:
150      case OP_TYPEMINUPTO:      case OP_TYPEMINUPTO:
151      printf("    %s{", OP_names[code[3]]);      fprintf(outfile, "    %s{", OP_names[code[3]]);
152      if (*code != OP_TYPEEXACT) printf(",");      if (*code != OP_TYPEEXACT) fprintf(outfile, "0,");
153      printf("%d}", (code[1] << 8) + code[2]);      fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
154      if (*code == OP_TYPEMINUPTO) printf("?");      if (*code == OP_TYPEMINUPTO) fprintf(outfile, "?");
155      code += 3;      code += 3;
156      break;      break;
157    
158      case OP_NOT:      case OP_NOT:
159      if (isprint(c = *(++code))) printf("    [^%c]", c);      if (isprint(c = *(++code))) fprintf(outfile, "    [^%c]", c);
160        else printf("    [^\\x%02x]", c);        else fprintf(outfile, "    [^\\x%02x]", c);
161      break;      break;
162    
163      case OP_NOTSTAR:      case OP_NOTSTAR:
# Line 138  for(;;) Line 166  for(;;)
166      case OP_NOTMINPLUS:      case OP_NOTMINPLUS:
167      case OP_NOTQUERY:      case OP_NOTQUERY:
168      case OP_NOTMINQUERY:      case OP_NOTMINQUERY:
169      if (isprint(c = code[1])) printf("    [^%c]", c);      if (isprint(c = code[1])) fprintf(outfile, "    [^%c]", c);
170        else printf("    [^\\x%02x]", c);        else fprintf(outfile, "    [^\\x%02x]", c);
171      printf("%s", OP_names[*code++]);      fprintf(outfile, "%s", OP_names[*code++]);
172      break;      break;
173    
174      case OP_NOTEXACT:      case OP_NOTEXACT:
175      case OP_NOTUPTO:      case OP_NOTUPTO:
176      case OP_NOTMINUPTO:      case OP_NOTMINUPTO:
177      if (isprint(c = code[3])) printf("    [^%c]{", c);      if (isprint(c = code[3])) fprintf(outfile, "    [^%c]{", c);
178        else printf("    [^\\x%02x]{", c);        else fprintf(outfile, "    [^\\x%02x]{", c);
179      if (*code != OP_NOTEXACT) printf(",");      if (*code != OP_NOTEXACT) fprintf(outfile, ",");
180      printf("%d}", (code[1] << 8) + code[2]);      fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
181      if (*code == OP_NOTMINUPTO) printf("?");      if (*code == OP_NOTMINUPTO) fprintf(outfile, "?");
182      code += 3;      code += 3;
183      break;      break;
184    
185      case OP_REF:      case OP_REF:
186      printf("    \\%d", *(++code));      fprintf(outfile, "    \\%d", *(++code));
187      break;      code++;
188        goto CLASS_REF_REPEAT;
189    
190      case OP_CLASS:      case OP_CLASS:
191        {        {
192        int i, min, max;        int i, min, max;
   
193        code++;        code++;
194        printf("    [");        fprintf(outfile, "    [");
195    
196        for (i = 0; i < 256; i++)        for (i = 0; i < 256; i++)
197          {          {
# Line 172  for(;;) Line 200  for(;;)
200            int j;            int j;
201            for (j = i+1; j < 256; j++)            for (j = i+1; j < 256; j++)
202              if ((code[j/8] & (1 << (j&7))) == 0) break;              if ((code[j/8] & (1 << (j&7))) == 0) break;
203            if (i == '-' || i == ']') printf("\\");            if (i == '-' || i == ']') fprintf(outfile, "\\");
204            if (isprint(i)) printf("%c", i); else printf("\\x%02x", i);            if (isprint(i)) fprintf(outfile, "%c", i); else fprintf(outfile, "\\x%02x", i);
205            if (--j > i)            if (--j > i)
206              {              {
207              printf("-");              fprintf(outfile, "-");
208              if (j == '-' || j == ']') printf("\\");              if (j == '-' || j == ']') fprintf(outfile, "\\");
209              if (isprint(j)) printf("%c", j); else printf("\\x%02x", j);              if (isprint(j)) fprintf(outfile, "%c", j); else fprintf(outfile, "\\x%02x", j);
210              }              }
211            i = j;            i = j;
212            }            }
213          }          }
214        printf("]");        fprintf(outfile, "]");
215        code += 32;        code += 32;
216    
217          CLASS_REF_REPEAT:
218    
219        switch(*code)        switch(*code)
220          {          {
221          case OP_CRSTAR:          case OP_CRSTAR:
# Line 194  for(;;) Line 224  for(;;)
224          case OP_CRMINPLUS:          case OP_CRMINPLUS:
225          case OP_CRQUERY:          case OP_CRQUERY:
226          case OP_CRMINQUERY:          case OP_CRMINQUERY:
227          printf("%s", OP_names[*code]);          fprintf(outfile, "%s", OP_names[*code]);
228          break;          break;
229    
230          case OP_CRRANGE:          case OP_CRRANGE:
231          case OP_CRMINRANGE:          case OP_CRMINRANGE:
232          min = (code[1] << 8) + code[2];          min = (code[1] << 8) + code[2];
233          max = (code[3] << 8) + code[4];          max = (code[3] << 8) + code[4];
234          if (max == 0) printf("{%d,}", min);          if (max == 0) fprintf(outfile, "{%d,}", min);
235          else printf("{%d,%d}", min, max);          else fprintf(outfile, "{%d,%d}", min, max);
236          if (*code == OP_CRMINRANGE) printf("?");          if (*code == OP_CRMINRANGE) fprintf(outfile, "?");
237          code += 4;          code += 4;
238          break;          break;
239    
# Line 216  for(;;) Line 246  for(;;)
246      /* Anything else is just a one-node item */      /* Anything else is just a one-node item */
247    
248      default:      default:
249      printf("    %s", OP_names[*code]);      fprintf(outfile, "    %s", OP_names[*code]);
250      break;      break;
251      }      }
252    
253    code++;    code++;
254    printf("\n");    fprintf(outfile, "\n");
255    }    }
256  }  }
257    
# Line 264  int timeit = 0; Line 294  int timeit = 0;
294  int showinfo = 0;  int showinfo = 0;
295  int posix = 0;  int posix = 0;
296  int debug = 0;  int debug = 0;
297    int done = 0;
298  unsigned char buffer[30000];  unsigned char buffer[30000];
299  unsigned char dbuffer[1024];  unsigned char dbuffer[1024];
300    
# Line 283  while (argc > 1 && argv[op][0] == '-') Line 314  while (argc > 1 && argv[op][0] == '-')
314    else    else
315      {      {
316      printf("*** Unknown option %s\n", argv[op]);      printf("*** Unknown option %s\n", argv[op]);
317        printf("Usage: pcretest [-d] [-i] [-p] [-s] [-t] [<input> [<output>]]\n");
318        printf("  -d   debug: show compiled code; implies -i\n"
319               "  -i   show information about compiled pattern\n"
320               "  -p   use POSIX interface\n"
321               "  -s   output store information\n"
322               "  -t   time compilation and execution\n");
323      return 1;      return 1;
324      }      }
325    op++;    op++;
# Line 315  if (argc > 2) Line 352  if (argc > 2)
352    
353  pcre_malloc = new_malloc;  pcre_malloc = new_malloc;
354    
355  /* Heading line, then prompt for first re if stdin */  /* Heading line, then prompt for first regex if stdin */
356    
 fprintf(outfile, "Testing Perl-Compatible Regular Expressions\n");  
357  fprintf(outfile, "PCRE version %s\n\n", pcre_version());  fprintf(outfile, "PCRE version %s\n\n", pcre_version());
358    
359  /* Main loop */  /* Main loop */
360    
361  for (;;)  while (!done)
362    {    {
363    pcre *re = NULL;    pcre *re = NULL;
364    pcre_extra *extra = NULL;    pcre_extra *extra = NULL;
365    regex_t preg;    regex_t preg;
366    char *error;    const char *error;
367    unsigned char *p, *pp;    unsigned char *p, *pp, *ppp;
368      unsigned const char *tables = NULL;
369    int do_study = 0;    int do_study = 0;
370    int do_debug = 0;    int do_debug = debug;
371      int do_showinfo = showinfo;
372    int do_posix = 0;    int do_posix = 0;
373    int erroroffset, len, delimiter;    int erroroffset, len, delimiter;
374    
375    if (infile == stdin) printf("  re> ");    if (infile == stdin) printf("  re> ");
376    if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) break;    if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) break;
377    if (infile != stdin) fprintf(outfile, (char *)buffer);    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
378    
379    p = buffer;    p = buffer;
380    while (isspace(*p)) p++;    while (isspace(*p)) p++;
# Line 371  for (;;) Line 409  for (;;)
409      if (fgets((char *)pp, len, infile) == NULL)      if (fgets((char *)pp, len, infile) == NULL)
410        {        {
411        fprintf(outfile, "** Unexpected EOF\n");        fprintf(outfile, "** Unexpected EOF\n");
412        goto END_OFF;        done = 1;
413          goto CONTINUE;
414        }        }
415      if (infile != stdin) fprintf(outfile, (char *)pp);      if (infile != stdin) fprintf(outfile, "%s", (char *)pp);
416      }      }
417    
418    /* Terminate the pattern at the delimiter */    /* Terminate the pattern at the delimiter */
# Line 392  for (;;) Line 431  for (;;)
431        case 'm': options |= PCRE_MULTILINE; break;        case 'm': options |= PCRE_MULTILINE; break;
432        case 's': options |= PCRE_DOTALL; break;        case 's': options |= PCRE_DOTALL; break;
433        case 'x': options |= PCRE_EXTENDED; break;        case 'x': options |= PCRE_EXTENDED; break;
434    
435        case 'A': options |= PCRE_ANCHORED; break;        case 'A': options |= PCRE_ANCHORED; break;
436        case 'D': do_debug = 1; break;        case 'D': do_debug = do_showinfo = 1; break;
437        case 'E': options |= PCRE_DOLLAR_ENDONLY; break;        case 'E': options |= PCRE_DOLLAR_ENDONLY; break;
438          case 'I': do_showinfo = 1; break;
439        case 'P': do_posix = 1; break;        case 'P': do_posix = 1; break;
440        case 'S': do_study = 1; break;        case 'S': do_study = 1; break;
441        case 'I': study_options |= PCRE_CASELESS; break;        case 'U': options |= PCRE_UNGREEDY; break;
442        case 'X': options |= PCRE_EXTRA; break;        case 'X': options |= PCRE_EXTRA; break;
443    
444          case 'L':
445          ppp = pp;
446          while (*ppp != '\n' && *ppp != ' ') ppp++;
447          *ppp = 0;
448          if (setlocale(LC_CTYPE, (const char *)pp) == NULL)
449            {
450            fprintf(outfile, "** Failed to set locale \"%s\"\n", pp);
451            goto SKIP_DATA;
452            }
453          tables = pcre_maketables();
454          pp = ppp;
455          break;
456    
457        case '\n': case ' ': break;        case '\n': case ' ': break;
458        default:        default:
459        fprintf(outfile, "** Unknown option '%c'\n", pp[-1]);        fprintf(outfile, "** Unknown option '%c'\n", pp[-1]);
# Line 406  for (;;) Line 461  for (;;)
461        }        }
462      }      }
463    
464    /* Handle compiing via the POSIX interface, which doesn't support the    /* Handle compiling via the POSIX interface, which doesn't support the
465    timing, showing, or debugging options. */    timing, showing, or debugging options, nor the ability to pass over
466      local character tables. */
467    
468    if (posix || do_posix)    if (posix || do_posix)
469      {      {
# Line 437  for (;;) Line 493  for (;;)
493        register int i;        register int i;
494        clock_t time_taken;        clock_t time_taken;
495        clock_t start_time = clock();        clock_t start_time = clock();
496        for (i = 0; i < 4000; i++)        for (i = 0; i < LOOPREPEAT; i++)
497          {          {
498          re = pcre_compile((char *)p, options, &error, &erroroffset);          re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
499          if (re != NULL) free(re);          if (re != NULL) free(re);
500          }          }
501        time_taken = clock() - start_time;        time_taken = clock() - start_time;
# Line 447  for (;;) Line 503  for (;;)
503          ((double)time_taken)/(4 * CLOCKS_PER_SEC));          ((double)time_taken)/(4 * CLOCKS_PER_SEC));
504        }        }
505    
506      re = pcre_compile((char *)p, options, &error, &erroroffset);      re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
507    
508      /* Compilation failed; go back for another re, skipping to blank line      /* Compilation failed; go back for another re, skipping to blank line
509      if non-interactive. */      if non-interactive. */
# Line 461  for (;;) Line 517  for (;;)
517          for (;;)          for (;;)
518            {            {
519            if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)            if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
520              goto END_OFF;              {
521                done = 1;
522                goto CONTINUE;
523                }
524            len = (int)strlen((char *)buffer);            len = (int)strlen((char *)buffer);
525            while (len > 0 && isspace(buffer[len-1])) len--;            while (len > 0 && isspace(buffer[len-1])) len--;
526            if (len == 0) break;            if (len == 0) break;
527            }            }
528          fprintf(outfile, "\n");          fprintf(outfile, "\n");
529          }          }
530        continue;        goto CONTINUE;
531        }        }
532    
533      /* Compilation succeeded; print data if required */      /* Compilation succeeded; print data if required */
534    
535      if (showinfo || do_debug)      if (do_showinfo)
536        {        {
537        int first_char, count;        int first_char, count;
538    
539        if (debug || do_debug) print_internals(re);        if (do_debug) print_internals(re, outfile);
540    
541        count = pcre_info(re, &options, &first_char);        count = pcre_info(re, &options, &first_char);
542        if (count < 0) fprintf(outfile,        if (count < 0) fprintf(outfile,
# Line 486  for (;;) Line 545  for (;;)
545          {          {
546          fprintf(outfile, "Identifying subpattern count = %d\n", count);          fprintf(outfile, "Identifying subpattern count = %d\n", count);
547          if (options == 0) fprintf(outfile, "No options\n");          if (options == 0) fprintf(outfile, "No options\n");
548            else fprintf(outfile, "Options:%s%s%s%s%s%s%s\n",            else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s\n",
549              ((options & PCRE_ANCHORED) != 0)? " anchored" : "",              ((options & PCRE_ANCHORED) != 0)? " anchored" : "",
550              ((options & PCRE_CASELESS) != 0)? " caseless" : "",              ((options & PCRE_CASELESS) != 0)? " caseless" : "",
551              ((options & PCRE_EXTENDED) != 0)? " extended" : "",              ((options & PCRE_EXTENDED) != 0)? " extended" : "",
552              ((options & PCRE_MULTILINE) != 0)? " multiline" : "",              ((options & PCRE_MULTILINE) != 0)? " multiline" : "",
553              ((options & PCRE_DOTALL) != 0)? " dotall" : "",              ((options & PCRE_DOTALL) != 0)? " dotall" : "",
554              ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",              ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
555              ((options & PCRE_EXTRA) != 0)? " extra" : "");              ((options & PCRE_EXTRA) != 0)? " extra" : "",
556                ((options & PCRE_UNGREEDY) != 0)? " ungreedy" : "");
557          if (first_char == -1)          if (first_char == -1)
558            {            {
559            fprintf(outfile, "First char at start or follows \\n\n");            fprintf(outfile, "First char at start or follows \\n\n");
# Line 522  for (;;) Line 582  for (;;)
582          register int i;          register int i;
583          clock_t time_taken;          clock_t time_taken;
584          clock_t start_time = clock();          clock_t start_time = clock();
585          for (i = 0; i < 4000; i++)          for (i = 0; i < LOOPREPEAT; i++)
586            extra = pcre_study(re, study_options, &error);            extra = pcre_study(re, study_options, &error);
587          time_taken = clock() - start_time;          time_taken = clock() - start_time;
588          if (extra != NULL) free(extra);          if (extra != NULL) free(extra);
# Line 539  for (;;) Line 599  for (;;)
599        /* This looks at internal information. A bit kludgy to do it this        /* This looks at internal information. A bit kludgy to do it this
600        way, but it is useful for testing. */        way, but it is useful for testing. */
601    
602        else if (showinfo || do_debug)        else if (do_showinfo)
603          {          {
604          real_pcre_extra *xx = (real_pcre_extra *)extra;          real_pcre_extra *xx = (real_pcre_extra *)extra;
605          if ((xx->options & PCRE_STUDY_MAPPED) == 0)          if ((xx->options & PCRE_STUDY_MAPPED) == 0)
# Line 580  for (;;) Line 640  for (;;)
640    
641    for (;;)    for (;;)
642      {      {
643      unsigned char *pp;      unsigned char *q;
644      int count, c;      int count, c;
645      int offsets[30];      int offsets[45];
646      int size_offsets = sizeof(offsets)/sizeof(int);      int size_offsets = sizeof(offsets)/sizeof(int);
647    
648      options = 0;      options = 0;
649    
650      if (infile == stdin) printf("  data> ");      if (infile == stdin) printf("  data> ");
651      if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) goto END_OFF;      if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
652      if (infile != stdin) fprintf(outfile, (char *)buffer);        {
653          done = 1;
654          goto CONTINUE;
655          }
656        if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
657    
658      len = (int)strlen((char *)buffer);      len = (int)strlen((char *)buffer);
659      while (len > 0 && isspace(buffer[len-1])) len--;      while (len > 0 && isspace(buffer[len-1])) len--;
# Line 599  for (;;) Line 663  for (;;)
663      p = buffer;      p = buffer;
664      while (isspace(*p)) p++;      while (isspace(*p)) p++;
665    
666      pp = dbuffer;      q = dbuffer;
667      while ((c = *p++) != 0)      while ((c = *p++) != 0)
668        {        {
669        int i = 0;        int i = 0;
# Line 643  for (;;) Line 707  for (;;)
707          options |= PCRE_NOTBOL;          options |= PCRE_NOTBOL;
708          continue;          continue;
709    
         case 'E':  
         options |= PCRE_DOLLAR_ENDONLY;  
         continue;  
   
         case 'I':  
         options |= PCRE_CASELESS;  
         continue;  
   
         case 'M':  
         options |= PCRE_MULTILINE;  
         continue;  
   
         case 'S':  
         options |= PCRE_DOTALL;  
         continue;  
   
710          case 'O':          case 'O':
711          while(isdigit(*p)) n = n * 10 + *p++ - '0';          while(isdigit(*p)) n = n * 10 + *p++ - '0';
712          if (n <= sizeof(offsets)/sizeof(int)) size_offsets = n;          if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n;
713          continue;          continue;
714    
715          case 'Z':          case 'Z':
716          options |= PCRE_NOTEOL;          options |= PCRE_NOTEOL;
717          continue;          continue;
718          }          }
719        *pp++ = c;        *q++ = c;
720        }        }
721      *pp = 0;      *q = 0;
722      len = pp - dbuffer;      len = q - dbuffer;
723    
724      /* Handle matching via the POSIX interface, which does not      /* Handle matching via the POSIX interface, which does not
725      support timing. */      support timing. */
# Line 694  for (;;) Line 742  for (;;)
742          }          }
743        else        else
744          {          {
745          int i;          size_t i;
746          for (i = 0; i < sizeof(pmatch)/sizeof(regmatch_t); i++)          for (i = 0; i < sizeof(pmatch)/sizeof(regmatch_t); i++)
747            {            {
748            if (pmatch[i].rm_so >= 0)            if (pmatch[i].rm_so >= 0)
749              {              {
750              fprintf(outfile, "%2d: ", i);              fprintf(outfile, "%2d: ", (int)i);
751              pchars(dbuffer + pmatch[i].rm_so,              pchars(dbuffer + pmatch[i].rm_so,
752                pmatch[i].rm_eo - pmatch[i].rm_so);                pmatch[i].rm_eo - pmatch[i].rm_so);
753              fprintf(outfile, "\n");              fprintf(outfile, "\n");
# Line 731  for (;;) Line 779  for (;;)
779        if (count == 0)        if (count == 0)
780          {          {
781          fprintf(outfile, "Matched, but too many substrings\n");          fprintf(outfile, "Matched, but too many substrings\n");
782          count = size_offsets/2;          count = size_offsets/3;
783          }          }
784    
785        if (count >= 0)        if (count >= 0)
# Line 758  for (;;) Line 806  for (;;)
806        }        }
807      }      }
808    
809      CONTINUE:
810    if (posix || do_posix) regfree(&preg);    if (posix || do_posix) regfree(&preg);
811    if (re != NULL) free(re);    if (re != NULL) free(re);
812    if (extra != NULL) free(extra);    if (extra != NULL) free(extra);
813      if (tables != NULL)
814        {
815        free((void *)tables);
816        setlocale(LC_CTYPE, "C");
817        }
818    }    }
819    
 END_OFF:  
820  fprintf(outfile, "\n");  fprintf(outfile, "\n");
821  return 0;  return 0;
822  }  }

Legend:
Removed from v.3  
changed lines
  Added in v.25

  ViewVC Help
Powered by ViewVC 1.1.5