/[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 49 by nigel, Sat Feb 24 21:39:33 2007 UTC revision 55 by nigel, Sat Feb 24 21:39:46 2007 UTC
# Line 159  static const char *OP_names[] = { Line 159  static const char *OP_names[] = {
159    "class", "Ref", "Recurse",    "class", "Ref", "Recurse",
160    "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",    "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",
161    "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",    "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",
162    "Brazero", "Braminzero", "Bra"    "Brazero", "Braminzero", "Branumber", "Bra"
163  };  };
164    
165    
# Line 178  for(;;) Line 178  for(;;)
178    
179    if (*code >= OP_BRA)    if (*code >= OP_BRA)
180      {      {
181      fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);      if (*code - OP_BRA > EXTRACT_BASIC_MAX)
182          fprintf(outfile, "%3d Bra extra", (code[1] << 8) + code[2]);
183        else
184          fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
185      code += 2;      code += 2;
186      }      }
187    
# Line 194  for(;;) Line 197  for(;;)
197      code++;      code++;
198      break;      break;
199    
     case OP_COND:  
     fprintf(outfile, "%3d Cond", (code[1] << 8) + code[2]);  
     code += 2;  
     break;  
   
     case OP_CREF:  
     fprintf(outfile, " %.2d %s", code[1], OP_names[*code]);  
     code++;  
     break;  
   
200      case OP_CHARS:      case OP_CHARS:
201      charlength = *(++code);      charlength = *(++code);
202      fprintf(outfile, "%3d ", charlength);      fprintf(outfile, "%3d ", charlength);
# Line 221  for(;;) Line 214  for(;;)
214      case OP_ASSERTBACK:      case OP_ASSERTBACK:
215      case OP_ASSERTBACK_NOT:      case OP_ASSERTBACK_NOT:
216      case OP_ONCE:      case OP_ONCE:
217      fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);      case OP_COND:
218      code += 2;      case OP_BRANUMBER:
     break;  
   
219      case OP_REVERSE:      case OP_REVERSE:
220        case OP_CREF:
221      fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);      fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
222      code += 2;      code += 2;
223      break;      break;
# Line 298  for(;;) Line 290  for(;;)
290      break;      break;
291    
292      case OP_REF:      case OP_REF:
293      fprintf(outfile, "    \\%d", *(++code));      fprintf(outfile, "    \\%d", (code[1] << 8) | code[2]);
294      code++;      code += 3;
295      goto CLASS_REF_REPEAT;      goto CLASS_REF_REPEAT;
296    
297      case OP_CLASS:      case OP_CLASS:
# Line 441  int op = 1; Line 433  int op = 1;
433  int timeit = 0;  int timeit = 0;
434  int showinfo = 0;  int showinfo = 0;
435  int showstore = 0;  int showstore = 0;
436    int size_offsets = 45;
437    int size_offsets_max;
438    int *offsets;
439    #if !defined NOPOSIX
440  int posix = 0;  int posix = 0;
441    #endif
442  int debug = 0;  int debug = 0;
443  int done = 0;  int done = 0;
444  unsigned char buffer[30000];  unsigned char buffer[30000];
# Line 455  outfile = stdout; Line 452  outfile = stdout;
452    
453  while (argc > 1 && argv[op][0] == '-')  while (argc > 1 && argv[op][0] == '-')
454    {    {
455      char *endptr;
456    
457    if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0)    if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0)
458      showstore = 1;      showstore = 1;
459    else if (strcmp(argv[op], "-t") == 0) timeit = 1;    else if (strcmp(argv[op], "-t") == 0) timeit = 1;
460    else if (strcmp(argv[op], "-i") == 0) showinfo = 1;    else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
461    else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;    else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
462      else if (strcmp(argv[op], "-o") == 0 && argc > 2 &&
463          ((size_offsets = strtoul(argv[op+1], &endptr, 10)), *endptr == 0))
464        {
465        op++;
466        argc--;
467        }
468    #if !defined NOPOSIX
469    else if (strcmp(argv[op], "-p") == 0) posix = 1;    else if (strcmp(argv[op], "-p") == 0) posix = 1;
470    #endif
471    else    else
472      {      {
473      printf("*** Unknown option %s\n", argv[op]);      printf("** Unknown or malformed option %s\n", argv[op]);
474      printf("Usage: pcretest [-d] [-i] [-p] [-s] [-t] [<input> [<output>]]\n");      printf("Usage:   pcretest [-d] [-i] [-o <n>] [-p] [-s] [-t] [<input> [<output>]]\n");
475      printf("  -d   debug: show compiled code; implies -i\n"      printf("  -d     debug: show compiled code; implies -i\n"
476             "  -i   show information about compiled pattern\n"             "  -i     show information about compiled pattern\n"
477             "  -p   use POSIX interface\n"             "  -o <n> set size of offsets vector to <n>\n");
478             "  -s   output store information\n"  #if !defined NOPOSIX
479             "  -t   time compilation and execution\n");      printf("  -p     use POSIX interface\n");
480    #endif
481        printf("  -s     output store information\n"
482               "  -t     time compilation and execution\n");
483      return 1;      return 1;
484      }      }
485    op++;    op++;
486    argc--;    argc--;
487    }    }
488    
489    /* Get the store for the offsets vector, and remember what it was */
490    
491    size_offsets_max = size_offsets;
492    offsets = malloc(size_offsets_max * sizeof(int));
493    if (offsets == NULL)
494      {
495      printf("** Failed to get %d bytes of memory for offsets vector\n",
496        size_offsets_max * sizeof(int));
497      return 1;
498      }
499    
500  /* Sort out the input and output files */  /* Sort out the input and output files */
501    
502  if (argc > 1)  if (argc > 1)
# Line 520  while (!done) Line 541  while (!done)
541    
542    const char *error;    const char *error;
543    unsigned char *p, *pp, *ppp;    unsigned char *p, *pp, *ppp;
544    unsigned const char *tables = NULL;    const unsigned char *tables = NULL;
545    int do_study = 0;    int do_study = 0;
546    int do_debug = debug;    int do_debug = debug;
547    int do_G = 0;    int do_G = 0;
# Line 720  while (!done) Line 741  while (!done)
741    
742      if (do_showinfo)      if (do_showinfo)
743        {        {
744          unsigned long int get_options;
745        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
746        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char;
747        size_t size;        size_t size;
748    
749        if (do_debug) print_internals(re);        if (do_debug) print_internals(re);
750    
751        new_info(re, NULL, PCRE_INFO_OPTIONS, &options);        new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options);
752        new_info(re, NULL, PCRE_INFO_SIZE, &size);        new_info(re, NULL, PCRE_INFO_SIZE, &size);
753        new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);        new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);
754        new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);        new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);
# Line 746  while (!done) Line 768  while (!done)
768            "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n",            "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n",
769              first_char, old_first_char);              first_char, old_first_char);
770    
771          if (old_options != options) fprintf(outfile,          if (old_options != (int)get_options) fprintf(outfile,
772            "Options disagreement: pcre_fullinfo=%d pcre_info=%d\n", options,            "Options disagreement: pcre_fullinfo=%ld pcre_info=%d\n",
773              old_options);              get_options, old_options);
774          }          }
775    
776        if (size != gotten_store) fprintf(outfile,        if (size != gotten_store) fprintf(outfile,
# Line 758  while (!done) Line 780  while (!done)
780        fprintf(outfile, "Capturing subpattern count = %d\n", count);        fprintf(outfile, "Capturing subpattern count = %d\n", count);
781        if (backrefmax > 0)        if (backrefmax > 0)
782          fprintf(outfile, "Max back reference = %d\n", backrefmax);          fprintf(outfile, "Max back reference = %d\n", backrefmax);
783        if (options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
784          else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n",          else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n",
785            ((options & PCRE_ANCHORED) != 0)? " anchored" : "",            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
786            ((options & PCRE_CASELESS) != 0)? " caseless" : "",            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
787            ((options & PCRE_EXTENDED) != 0)? " extended" : "",            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
788            ((options & PCRE_MULTILINE) != 0)? " multiline" : "",            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",
789            ((options & PCRE_DOTALL) != 0)? " dotall" : "",            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",
790            ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
791            ((options & PCRE_EXTRA) != 0)? " extra" : "",            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
792            ((options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
793            ((options & PCRE_UTF8) != 0)? " utf8" : "");            ((get_options & PCRE_UTF8) != 0)? " utf8" : "");
794    
795        if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)        if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)
796          fprintf(outfile, "Case state changes\n");          fprintf(outfile, "Case state changes\n");
# Line 871  while (!done) Line 893  while (!done)
893      {      {
894      unsigned char *q;      unsigned char *q;
895      unsigned char *bptr = dbuffer;      unsigned char *bptr = dbuffer;
896        int use_size_offsets = size_offsets;
897      int count, c;      int count, c;
898      int copystrings = 0;      int copystrings = 0;
899      int getstrings = 0;      int getstrings = 0;
# Line 878  while (!done) Line 901  while (!done)
901      int gmatched = 0;      int gmatched = 0;
902      int start_offset = 0;      int start_offset = 0;
903      int g_notempty = 0;      int g_notempty = 0;
     int offsets[45];  
     int size_offsets = sizeof(offsets)/sizeof(int);  
904    
905      options = 0;      options = 0;
906    
# Line 987  while (!done) Line 1008  while (!done)
1008    
1009          case 'O':          case 'O':
1010          while(isdigit(*p)) n = n * 10 + *p++ - '0';          while(isdigit(*p)) n = n * 10 + *p++ - '0';
1011          if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n;          if (n > size_offsets_max)
1012              {
1013    
1014    if (offsets != NULL)
1015    
1016              free(offsets);
1017              size_offsets_max = n;
1018              offsets = malloc(size_offsets_max * sizeof(int));
1019              if (offsets == NULL)
1020                {
1021                printf("** Failed to get %d bytes of memory for offsets vector\n",
1022                  size_offsets_max * sizeof(int));
1023                return 1;
1024                }
1025              }
1026            use_size_offsets = n;
1027    
1028    if (n == 0)
1029      {
1030      free(offsets);
1031      offsets = NULL;
1032      size_offsets_max = 0;
1033      }
1034    
1035          continue;          continue;
1036    
1037          case 'Z':          case 'Z':
# Line 1007  while (!done) Line 1051  while (!done)
1051        {        {
1052        int rc;        int rc;
1053        int eflags = 0;        int eflags = 0;
1054        regmatch_t pmatch[sizeof(offsets)/sizeof(int)];        regmatch_t *pmatch = malloc(sizeof(regmatch_t) * use_size_offsets);
1055        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
1056        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
1057    
1058        rc = regexec(&preg, (const char *)bptr, size_offsets, pmatch, eflags);        rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);
1059    
1060        if (rc != 0)        if (rc != 0)
1061          {          {
# Line 1021  while (!done) Line 1065  while (!done)
1065        else        else
1066          {          {
1067          size_t i;          size_t i;
1068          for (i = 0; i < size_offsets; i++)          for (i = 0; i < use_size_offsets; i++)
1069            {            {
1070            if (pmatch[i].rm_so >= 0)            if (pmatch[i].rm_so >= 0)
1071              {              {
# Line 1038  while (!done) Line 1082  while (!done)
1082              }              }
1083            }            }
1084          }          }
1085          free(pmatch);
1086        }        }
1087    
1088      /* Handle matching via the native interface - repeats for /g and /G */      /* Handle matching via the native interface - repeats for /g and /G */
# Line 1054  while (!done) Line 1099  while (!done)
1099          clock_t start_time = clock();          clock_t start_time = clock();
1100          for (i = 0; i < LOOPREPEAT; i++)          for (i = 0; i < LOOPREPEAT; i++)
1101            count = pcre_exec(re, extra, (char *)bptr, len,            count = pcre_exec(re, extra, (char *)bptr, len,
1102              start_offset, options | g_notempty, offsets, size_offsets);              start_offset, options | g_notempty, offsets, use_size_offsets);
1103          time_taken = clock() - start_time;          time_taken = clock() - start_time;
1104          fprintf(outfile, "Execute time %.3f milliseconds\n",          fprintf(outfile, "Execute time %.3f milliseconds\n",
1105            ((double)time_taken * 1000.0)/            ((double)time_taken * 1000.0)/
# Line 1062  while (!done) Line 1107  while (!done)
1107          }          }
1108    
1109        count = pcre_exec(re, extra, (char *)bptr, len,        count = pcre_exec(re, extra, (char *)bptr, len,
1110          start_offset, options | g_notempty, offsets, size_offsets);          start_offset, options | g_notempty, offsets, use_size_offsets);
1111    
1112        if (count == 0)        if (count == 0)
1113          {          {
1114          fprintf(outfile, "Matched, but too many substrings\n");          fprintf(outfile, "Matched, but too many substrings\n");
1115          count = size_offsets/3;          count = use_size_offsets/3;
1116          }          }
1117    
1118        /* Matched */        /* Matched */

Legend:
Removed from v.49  
changed lines
  Added in v.55

  ViewVC Help
Powered by ViewVC 1.1.5