/[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 432 by ph10, Wed Sep 2 16:02:56 2009 UTC revision 537 by ph10, Tue Jun 8 15:28:26 2010 UTC
# Line 118  external symbols to prevent clashes. */ Line 118  external symbols to prevent clashes. */
118    
119  /* We also need the pcre_printint() function for printing out compiled  /* We also need the pcre_printint() function for printing out compiled
120  patterns. This function is in a separate file so that it can be included in  patterns. This function is in a separate file so that it can be included in
121  pcre_compile.c when that module is compiled with debugging enabled.  pcre_compile.c when that module is compiled with debugging enabled. It needs to
122    know which case is being compiled. */
 The definition of the macro PRINTABLE, which determines whether to print an  
 output character as-is or as a hex value when showing compiled patterns, is  
 contained in this file. We uses it here also, in cases when the locale has not  
 been explicitly changed, so as to get consistent output from systems that  
 differ in their output from isprint() even in the "C" locale. */  
123    
124    #define COMPILING_PCRETEST
125  #include "pcre_printint.src"  #include "pcre_printint.src"
126    
127  #define PRINTHEX(c) (locale_set? isprint(c) : PRINTABLE(c))  /* The definition of the macro PRINTABLE, which determines whether to print an
128    output character as-is or as a hex value when showing compiled patterns, is
129    contained in the printint.src file. We uses it here also, in cases when the
130    locale has not been explicitly changed, so as to get consistent output from
131    systems that differ in their output from isprint() even in the "C" locale. */
132    
133    #define PRINTHEX(c) (locale_set? isprint(c) : PRINTABLE(c))
134    
135  /* It is possible to compile this test program without including support for  /* It is possible to compile this test program without including support for
136  testing the POSIX interface, though this is not available via the standard  testing the POSIX interface, though this is not available via the standard
# Line 220  uschar *here = start; Line 221  uschar *here = start;
221    
222  for (;;)  for (;;)
223    {    {
224    int rlen = buffer_size - (here - buffer);    int rlen = (int)(buffer_size - (here - buffer));
225    
226    if (rlen > 1000)    if (rlen > 1000)
227      {      {
# Line 250  for (;;) Line 251  for (;;)
251      /* Read the next line by normal means, prompting if the file is stdin. */      /* Read the next line by normal means, prompting if the file is stdin. */
252    
253        {        {
254        if (f == stdin) printf(prompt);        if (f == stdin) printf("%s", prompt);
255        if (fgets((char *)here, rlen,  f) == NULL)        if (fgets((char *)here, rlen,  f) == NULL)
256          return (here == start)? NULL : start;          return (here == start)? NULL : start;
257        }        }
# Line 740  return 0; Line 741  return 0;
741  *         Check newline indicator                *  *         Check newline indicator                *
742  *************************************************/  *************************************************/
743    
744  /* This is used both at compile and run-time to check for <xxx> escapes, where  /* This is used both at compile and run-time to check for <xxx> escapes. Print
745  xxx is LF, CR, CRLF, ANYCRLF, or ANY. Print a message and return 0 if there is  a message and return 0 if there is no match.
 no match.  
746    
747  Arguments:  Arguments:
748    p           points after the leading '<'    p           points after the leading '<'
# Line 1039  while (!done) Line 1039  while (!done)
1039  #endif  #endif
1040    
1041    const char *error;    const char *error;
1042      unsigned char *markptr;
1043    unsigned char *p, *pp, *ppp;    unsigned char *p, *pp, *ppp;
1044    unsigned char *to_file = NULL;    unsigned char *to_file = NULL;
1045    const unsigned char *tables = NULL;    const unsigned char *tables = NULL;
1046    unsigned long int true_size, true_study_size = 0;    unsigned long int true_size, true_study_size = 0;
1047    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
1048      int do_mark = 0;
1049    int do_study = 0;    int do_study = 0;
1050    int do_debug = debug;    int do_debug = debug;
1051    int do_G = 0;    int do_G = 0;
# Line 1161  while (!done) Line 1163  while (!done)
1163      }      }
1164    
1165    pp = p;    pp = p;
1166    poffset = p - buffer;    poffset = (int)(p - buffer);
1167    
1168    for(;;)    for(;;)
1169      {      {
# Line 1225  while (!done) Line 1227  while (!done)
1227        case 'G': do_G = 1; break;        case 'G': do_G = 1; break;
1228        case 'I': do_showinfo = 1; break;        case 'I': do_showinfo = 1; break;
1229        case 'J': options |= PCRE_DUPNAMES; break;        case 'J': options |= PCRE_DUPNAMES; break;
1230          case 'K': do_mark = 1; break;
1231        case 'M': log_store = 1; break;        case 'M': log_store = 1; break;
1232        case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;        case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;
1233    
# Line 1234  while (!done) Line 1237  while (!done)
1237    
1238        case 'S': do_study = 1; break;        case 'S': do_study = 1; break;
1239        case 'U': options |= PCRE_UNGREEDY; break;        case 'U': options |= PCRE_UNGREEDY; break;
1240          case 'W': options |= PCRE_UCP; break;
1241        case 'X': options |= PCRE_EXTRA; break;        case 'X': options |= PCRE_EXTRA; break;
1242        case 'Z': debug_lengths = 0; break;        case 'Z': debug_lengths = 0; break;
1243        case '8': options |= PCRE_UTF8; use_utf8 = 1; break;        case '8': options |= PCRE_UTF8; use_utf8 = 1; break;
# Line 1264  while (!done) Line 1268  while (!done)
1268    
1269        case '<':        case '<':
1270          {          {
1271          if (strncmp((char *)pp, "JS>", 3) == 0)          if (strncmpic(pp, (uschar *)"JS>", 3) == 0)
1272            {            {
1273            options |= PCRE_JAVASCRIPT_COMPAT;            options |= PCRE_JAVASCRIPT_COMPAT;
1274            pp += 3;            pp += 3;
# Line 1305  while (!done) Line 1309  while (!done)
1309      if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL;      if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL;
1310      if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;      if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;
1311      if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8;      if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8;
1312      if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY;      if ((options & PCRE_UCP) != 0) cflags |= REG_UCP;
1313        if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY;
1314    
1315      rc = regcomp(&preg, (char *)p, cflags);      rc = regcomp(&preg, (char *)p, cflags);
1316    
# Line 1419  while (!done) Line 1424  while (!done)
1424          true_study_size = ((pcre_study_data *)(extra->study_data))->size;          true_study_size = ((pcre_study_data *)(extra->study_data))->size;
1425        }        }
1426    
1427        /* If /K was present, we set up for handling MARK data. */
1428    
1429        if (do_mark)
1430          {
1431          if (extra == NULL)
1432            {
1433            extra = (pcre_extra *)malloc(sizeof(pcre_extra));
1434            extra->flags = 0;
1435            }
1436          extra->mark = &markptr;
1437          extra->flags |= PCRE_EXTRA_MARK;
1438          }
1439    
1440      /* If the 'F' option was present, we flip the bytes of all the integer      /* If the 'F' option was present, we flip the bytes of all the integer
1441      fields in the regex data block and the study block. This is to make it      fields in the regex data block and the study block. This is to make it
1442      possible to test PCRE's handling of byte-flipped patterns, e.g. those      possible to test PCRE's handling of byte-flipped patterns, e.g. those
# Line 1451  while (!done) Line 1469  while (!done)
1469          {          {
1470          pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);          pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
1471          rsd->size = byteflip(rsd->size, sizeof(rsd->size));          rsd->size = byteflip(rsd->size, sizeof(rsd->size));
1472          rsd->options = byteflip(rsd->options, sizeof(rsd->options));          rsd->flags = byteflip(rsd->flags, sizeof(rsd->flags));
1473            rsd->minlength = byteflip(rsd->minlength, sizeof(rsd->minlength));
1474          }          }
1475        }        }
1476    
# Line 1537  while (!done) Line 1556  while (!done)
1556        if (do_flip) all_options = byteflip(all_options, sizeof(all_options));        if (do_flip) all_options = byteflip(all_options, sizeof(all_options));
1557    
1558        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1559          else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",          else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
1560            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
1561            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
1562            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
# Line 1551  while (!done) Line 1570  while (!done)
1570            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
1571            ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "",            ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "",
1572            ((get_options & PCRE_UTF8) != 0)? " utf8" : "",            ((get_options & PCRE_UTF8) != 0)? " utf8" : "",
1573              ((get_options & PCRE_UCP) != 0)? " ucp" : "",
1574            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1575            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1576    
# Line 1628  while (!done) Line 1648  while (!done)
1648          else          else
1649            {            {
1650            uschar *start_bits = NULL;            uschar *start_bits = NULL;
1651            new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);            int minlength;
1652    
1653              new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength);
1654              fprintf(outfile, "Subject length lower bound = %d\n", minlength);
1655    
1656              new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
1657            if (start_bits == NULL)            if (start_bits == NULL)
1658              fprintf(outfile, "No starting byte set\n");              fprintf(outfile, "No set of starting bytes\n");
1659            else            else
1660              {              {
1661              int i;              int i;
# Line 1762  while (!done) Line 1786  while (!done)
1786        {        {
1787        if (extend_inputline(infile, buffer + len, "data> ") == NULL)        if (extend_inputline(infile, buffer + len, "data> ") == NULL)
1788          {          {
1789          if (len > 0) break;          if (len > 0)    /* Reached EOF without hitting a newline */
1790              {
1791              fprintf(outfile, "\n");
1792              break;
1793              }
1794          done = 1;          done = 1;
1795          goto CONTINUE;          goto CONTINUE;
1796          }          }
# Line 1970  while (!done) Line 1998  while (!done)
1998          continue;          continue;
1999    
2000          case 'N':          case 'N':
2001          options |= PCRE_NOTEMPTY;          if ((options & PCRE_NOTEMPTY) != 0)
2002              options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART;
2003            else
2004              options |= PCRE_NOTEMPTY;
2005          continue;          continue;
2006    
2007          case 'O':          case 'O':
# Line 1993  while (!done) Line 2024  while (!done)
2024          continue;          continue;
2025    
2026          case 'P':          case 'P':
2027          options |= ((options & PCRE_PARTIAL_SOFT) == 0)?          options |= ((options & PCRE_PARTIAL_SOFT) == 0)?
2028            PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD;            PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD;
2029          continue;          continue;
2030    
# Line 2053  while (!done) Line 2084  while (!done)
2084        *q++ = c;        *q++ = c;
2085        }        }
2086      *q = 0;      *q = 0;
2087      len = q - dbuffer;      len = (int)(q - dbuffer);
2088    
2089      /* Move the data to the end of the buffer so that a read over the end of      /* Move the data to the end of the buffer so that a read over the end of
2090      the buffer will be seen by valgrind, even if it doesn't cause a crash. If      the buffer will be seen by valgrind, even if it doesn't cause a crash. If
2091      we are using the POSIX interface, we must include the terminating zero. */      we are using the POSIX interface, we must include the terminating zero. */
# Line 2136  while (!done) Line 2167  while (!done)
2167    
2168      for (;; gmatched++)    /* Loop for /g or /G */      for (;; gmatched++)    /* Loop for /g or /G */
2169        {        {
2170          markptr = NULL;
2171    
2172        if (timeitm > 0)        if (timeitm > 0)
2173          {          {
2174          register int i;          register int i;
# Line 2147  while (!done) Line 2180  while (!done)
2180            {            {
2181            int workspace[1000];            int workspace[1000];
2182            for (i = 0; i < timeitm; i++)            for (i = 0; i < timeitm; i++)
2183              count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset,              count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset,
2184                options | g_notempty, use_offsets, use_size_offsets, workspace,                options | g_notempty, use_offsets, use_size_offsets, workspace,
2185                sizeof(workspace)/sizeof(int));                sizeof(workspace)/sizeof(int));
2186            }            }
# Line 2210  while (!done) Line 2243  while (!done)
2243        else if (all_use_dfa || use_dfa)        else if (all_use_dfa || use_dfa)
2244          {          {
2245          int workspace[1000];          int workspace[1000];
2246          count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset,          count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset,
2247            options | g_notempty, use_offsets, use_size_offsets, workspace,            options | g_notempty, use_offsets, use_size_offsets, workspace,
2248            sizeof(workspace)/sizeof(int));            sizeof(workspace)/sizeof(int));
2249          if (count == 0)          if (count == 0)
# Line 2281  while (!done) Line 2314  while (!done)
2314              }              }
2315            }            }
2316    
2317            if (markptr != NULL) fprintf(outfile, "MK: %s\n", markptr);
2318    
2319          for (i = 0; i < 32; i++)          for (i = 0; i < 32; i++)
2320            {            {
2321            if ((copystrings & (1 << i)) != 0)            if ((copystrings & (1 << i)) != 0)
# Line 2364  while (!done) Line 2399  while (!done)
2399    
2400        else if (count == PCRE_ERROR_PARTIAL)        else if (count == PCRE_ERROR_PARTIAL)
2401          {          {
2402          fprintf(outfile, "Partial match");          if (markptr == NULL) fprintf(outfile, "Partial match");
2403              else fprintf(outfile, "Partial match, mark=%s", markptr);
2404          if (use_size_offsets > 1)          if (use_size_offsets > 1)
2405            {            {
2406            fprintf(outfile, ": ");            fprintf(outfile, ": ");
2407            pchars(bptr + use_offsets[0], use_offsets[1] - use_offsets[0],            pchars(bptr + use_offsets[0], use_offsets[1] - use_offsets[0],
2408              outfile);              outfile);
2409            }            }
2410          fprintf(outfile, "\n");          fprintf(outfile, "\n");
2411          break;  /* Out of the /g loop */          break;  /* Out of the /g loop */
2412          }          }
# Line 2431  while (!done) Line 2467  while (!done)
2467            {            {
2468            if (count == PCRE_ERROR_NOMATCH)            if (count == PCRE_ERROR_NOMATCH)
2469              {              {
2470              if (gmatched == 0) fprintf(outfile, "No match\n");              if (gmatched == 0)
2471                  {
2472                  if (markptr == NULL) fprintf(outfile, "No match\n");
2473                    else fprintf(outfile, "No match, mark = %s\n", markptr);
2474                  }
2475              }              }
2476            else fprintf(outfile, "Error %d\n", count);            else fprintf(outfile, "Error %d\n", count);
2477            break;  /* Out of the /g loop */            break;  /* Out of the /g loop */
# Line 2443  while (!done) Line 2483  while (!done)
2483        if (!do_g && !do_G) break;        if (!do_g && !do_G) break;
2484    
2485        /* If we have matched an empty string, first check to see if we are at        /* If we have matched an empty string, first check to see if we are at
2486        the end of the subject. If so, the /g loop is over. Otherwise, mimic        the end of the subject. If so, the /g loop is over. Otherwise, mimic what
2487        what Perl's /g options does. This turns out to be rather cunning. First        Perl's /g options does. This turns out to be rather cunning. First we set
2488        we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the        PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED and try the match again at the
2489        same point. If this fails (picked up above) we advance to the next        same point. If this fails (picked up above) we advance to the next
2490        character. */        character. */
2491    
# Line 2454  while (!done) Line 2494  while (!done)
2494        if (use_offsets[0] == use_offsets[1])        if (use_offsets[0] == use_offsets[1])
2495          {          {
2496          if (use_offsets[0] == len) break;          if (use_offsets[0] == len) break;
2497          g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;          g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
2498          }          }
2499    
2500        /* For /g, update the start offset, leaving the rest alone */        /* For /g, update the start offset, leaving the rest alone */

Legend:
Removed from v.432  
changed lines
  Added in v.537

  ViewVC Help
Powered by ViewVC 1.1.5