/[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 146 by ph10, Thu Apr 5 09:17:28 2007 UTC revision 230 by ph10, Mon Sep 10 13:23:56 2007 UTC
# Line 36  POSSIBILITY OF SUCH DAMAGE. Line 36  POSSIBILITY OF SUCH DAMAGE.
36  */  */
37    
38    
39    #ifdef HAVE_CONFIG_H
40    #include <config.h>
41    #endif
42    
43  #include <ctype.h>  #include <ctype.h>
44  #include <stdio.h>  #include <stdio.h>
45  #include <string.h>  #include <string.h>
# Line 152  static int callout_count; Line 156  static int callout_count;
156  static int callout_extra;  static int callout_extra;
157  static int callout_fail_count;  static int callout_fail_count;
158  static int callout_fail_id;  static int callout_fail_id;
159    static int debug_lengths;
160  static int first_callout;  static int first_callout;
161  static int locale_set = 0;  static int locale_set = 0;
162  static int show_malloc;  static int show_malloc;
# Line 659  return count; Line 664  return count;
664    
665    
666  /*************************************************  /*************************************************
667    *         Case-independent strncmp() function    *
668    *************************************************/
669    
670    /*
671    Arguments:
672      s         first string
673      t         second string
674      n         number of characters to compare
675    
676    Returns:    < 0, = 0, or > 0, according to the comparison
677    */
678    
679    static int
680    strncmpic(uschar *s, uschar *t, int n)
681    {
682    while (n--)
683      {
684      int c = tolower(*s++) - tolower(*t++);
685      if (c) return c;
686      }
687    return 0;
688    }
689    
690    
691    
692    /*************************************************
693  *         Check newline indicator                *  *         Check newline indicator                *
694  *************************************************/  *************************************************/
695    
696  /* 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, where
697  xxx is LF, CR, CRLF, or ANY. Print a message and return 0 if there is no match.  xxx is LF, CR, CRLF, ANYCRLF, or ANY. Print a message and return 0 if there is
698    no match.
699    
700  Arguments:  Arguments:
701    p           points after the leading '<'    p           points after the leading '<'
# Line 675  Returns:      appropriate PCRE_NEWLINE_x Line 707  Returns:      appropriate PCRE_NEWLINE_x
707  static int  static int
708  check_newline(uschar *p, FILE *f)  check_newline(uschar *p, FILE *f)
709  {  {
710  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;  if (strncmpic(p, (uschar *)"cr>", 3) == 0) return PCRE_NEWLINE_CR;
711  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;  if (strncmpic(p, (uschar *)"lf>", 3) == 0) return PCRE_NEWLINE_LF;
712  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;  if (strncmpic(p, (uschar *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;
713  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;  if (strncmpic(p, (uschar *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
714    if (strncmpic(p, (uschar *)"any>", 4) == 0) return PCRE_NEWLINE_ANY;
715  fprintf(f, "Unknown newline type at: <%s\n", p);  fprintf(f, "Unknown newline type at: <%s\n", p);
716  return 0;  return 0;
717  }  }
# Line 850  while (argc > 1 && argv[op][0] == '-') Line 883  while (argc > 1 && argv[op][0] == '-')
883      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
884      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :
885        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :
886          (rc == -2)? "ANYCRLF" :
887        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
888      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
889      printf("  Internal link size = %d\n", rc);      printf("  Internal link size = %d\n", rc);
# Line 887  offsets = (int *)malloc(size_offsets_max Line 921  offsets = (int *)malloc(size_offsets_max
921  if (offsets == NULL)  if (offsets == NULL)
922    {    {
923    printf("** Failed to get %d bytes of memory for offsets vector\n",    printf("** Failed to get %d bytes of memory for offsets vector\n",
924      size_offsets_max * sizeof(int));      (int)(size_offsets_max * sizeof(int)));
925    yield = 1;    yield = 1;
926    goto EXIT;    goto EXIT;
927    }    }
# Line 947  while (!done) Line 981  while (!done)
981    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
982    int do_study = 0;    int do_study = 0;
983    int do_debug = debug;    int do_debug = debug;
   int debug_lengths = 1;  
984    int do_G = 0;    int do_G = 0;
985    int do_g = 0;    int do_g = 0;
986    int do_showinfo = showinfo;    int do_showinfo = showinfo;
# Line 956  while (!done) Line 989  while (!done)
989    int erroroffset, len, delimiter, poffset;    int erroroffset, len, delimiter, poffset;
990    
991    use_utf8 = 0;    use_utf8 = 0;
992      debug_lengths = 1;
993    
994    if (infile == stdin) printf("  re> ");    if (infile == stdin) printf("  re> ");
995    if (extend_inputline(infile, buffer) == NULL) break;    if (extend_inputline(infile, buffer) == NULL) break;
# Line 1315  while (!done) Line 1349  while (!done)
1349        rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));        rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));
1350        rre->size = byteflip(rre->size, sizeof(rre->size));        rre->size = byteflip(rre->size, sizeof(rre->size));
1351        rre->options = byteflip(rre->options, sizeof(rre->options));        rre->options = byteflip(rre->options, sizeof(rre->options));
1352          rre->flags = byteflip(rre->flags, sizeof(rre->flags));
1353        rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));        rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));
1354        rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));        rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));
1355        rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));        rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));
# Line 1349  while (!done) Line 1384  while (!done)
1384  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1385        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1386  #endif  #endif
1387        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char, okpartial, jchanged,
1388            hascrorlf;
1389        int nameentrysize, namecount;        int nameentrysize, namecount;
1390        const uschar *nametable;        const uschar *nametable;
1391    
# Line 1362  while (!done) Line 1398  while (!done)
1398        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
1399        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
1400        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
1401          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial);
1402          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged);
1403          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf);
1404    
1405  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1406        old_count = pcre_info(re, &old_options, &old_first_char);        old_count = pcre_info(re, &old_options, &old_first_char);
# Line 1403  while (!done) Line 1442  while (!done)
1442            }            }
1443          }          }
1444    
1445        /* The NOPARTIAL bit is a private bit in the options, so we have        if (!okpartial) fprintf(outfile, "Partial matching not supported\n");
1446        to fish it out via out back door */        if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n");
1447    
1448        all_options = ((real_pcre *)re)->options;        all_options = ((real_pcre *)re)->options;
1449        if (do_flip)        if (do_flip) all_options = byteflip(all_options, sizeof(all_options));
         {  
         all_options = byteflip(all_options, sizeof(all_options));  
          }  
   
       if ((all_options & PCRE_NOPARTIAL) != 0)  
         fprintf(outfile, "Partial matching not supported\n");  
1450    
1451        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1452          else fprintf(outfile, "Options:%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\n",
# Line 1431  while (!done) Line 1464  while (!done)
1464            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1465            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1466    
1467          if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
1468    
1469        switch (get_options & PCRE_NEWLINE_BITS)        switch (get_options & PCRE_NEWLINE_BITS)
1470          {          {
1471          case PCRE_NEWLINE_CR:          case PCRE_NEWLINE_CR:
# Line 1445  while (!done) Line 1480  while (!done)
1480          fprintf(outfile, "Forced newline sequence: CRLF\n");          fprintf(outfile, "Forced newline sequence: CRLF\n");
1481          break;          break;
1482    
1483            case PCRE_NEWLINE_ANYCRLF:
1484            fprintf(outfile, "Forced newline sequence: ANYCRLF\n");
1485            break;
1486    
1487          case PCRE_NEWLINE_ANY:          case PCRE_NEWLINE_ANY:
1488          fprintf(outfile, "Forced newline sequence: ANY\n");          fprintf(outfile, "Forced newline sequence: ANY\n");
1489          break;          break;
# Line 1594  while (!done) Line 1633  while (!done)
1633    for (;;)    for (;;)
1634      {      {
1635      uschar *q;      uschar *q;
1636      uschar *bptr = dbuffer;      uschar *bptr;
1637      int *use_offsets = offsets;      int *use_offsets = offsets;
1638      int use_size_offsets = size_offsets;      int use_size_offsets = size_offsets;
1639      int callout_data = 0;      int callout_data = 0;
# Line 1650  while (!done) Line 1689  while (!done)
1689      p = buffer;      p = buffer;
1690      while (isspace(*p)) p++;      while (isspace(*p)) p++;
1691    
1692      q = dbuffer;      bptr = q = dbuffer;
1693      while ((c = *p++) != 0)      while ((c = *p++) != 0)
1694        {        {
1695        int i = 0;        int i = 0;
# Line 1845  while (!done) Line 1884  while (!done)
1884            if (offsets == NULL)            if (offsets == NULL)
1885              {              {
1886              printf("** Failed to get %d bytes of memory for offsets vector\n",              printf("** Failed to get %d bytes of memory for offsets vector\n",
1887                size_offsets_max * sizeof(int));                (int)(size_offsets_max * sizeof(int)));
1888              yield = 1;              yield = 1;
1889              goto EXIT;              goto EXIT;
1890              }              }
# Line 2218  while (!done) Line 2257  while (!done)
2257        to advance the start offset, and continue. We won't be at the end of the        to advance the start offset, and continue. We won't be at the end of the
2258        string - that was checked before setting g_notempty.        string - that was checked before setting g_notempty.
2259    
2260        Complication arises in the case when the newline option is "any".        Complication arises in the case when the newline option is "any" or
2261        If the previous match was at the end of a line terminated by CRLF, an        "anycrlf". If the previous match was at the end of a line terminated by
2262        advance of one character just passes the \r, whereas we should prefer the        CRLF, an advance of one character just passes the \r, whereas we should
2263        longer newline sequence, as does the code in pcre_exec(). Fudge the        prefer the longer newline sequence, as does the code in pcre_exec().
2264        offset value to achieve this.        Fudge the offset value to achieve this.
2265    
2266        Otherwise, in the case of UTF-8 matching, the advance must be one        Otherwise, in the case of UTF-8 matching, the advance must be one
2267        character, not one byte. */        character, not one byte. */
# Line 2241  while (!done) Line 2280  while (!done)
2280              obits = (d == '\r')? PCRE_NEWLINE_CR :              obits = (d == '\r')? PCRE_NEWLINE_CR :
2281                      (d == '\n')? PCRE_NEWLINE_LF :                      (d == '\n')? PCRE_NEWLINE_LF :
2282                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :
2283                        (d == -2)? PCRE_NEWLINE_ANYCRLF :
2284                      (d == -1)? PCRE_NEWLINE_ANY : 0;                      (d == -1)? PCRE_NEWLINE_ANY : 0;
2285              }              }
2286            if ((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY &&            if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||
2287                   (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)
2288                  &&
2289                start_offset < len - 1 &&                start_offset < len - 1 &&
2290                bptr[start_offset] == '\r' &&                bptr[start_offset] == '\r' &&
2291                bptr[start_offset+1] == '\n')                bptr[start_offset+1] == '\n')

Legend:
Removed from v.146  
changed lines
  Added in v.230

  ViewVC Help
Powered by ViewVC 1.1.5