/[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 149 by ph10, Mon Apr 16 15:28:08 2007 UTC revision 231 by ph10, Tue Sep 11 11:15:33 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    
# Line 676  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, "anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;  if (strncmpic(p, (uschar *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
714  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;  if (strncmpic(p, (uschar *)"any>", 4) == 0) return PCRE_NEWLINE_ANY;
715    if (strncmpic(p, (uschar *)"bsr_anycrlf>", 12) == 0) return PCRE_BSR_ANYCRLF;
716    if (strncmpic(p, (uschar *)"bsr_unicode>", 12) == 0) return PCRE_BSR_UNICODE;
717  fprintf(f, "Unknown newline type at: <%s\n", p);  fprintf(f, "Unknown newline type at: <%s\n", p);
718  return 0;  return 0;
719  }  }
# Line 852  while (argc > 1 && argv[op][0] == '-') Line 885  while (argc > 1 && argv[op][0] == '-')
885      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
886      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :
887        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :
888        (rc == -2)? "ANYCRLF" :        (rc == -2)? "ANYCRLF" :
889        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
890        (void)pcre_config(PCRE_CONFIG_BSR, &rc);
891        printf("  \\R matches %s\n", rc? "CR, LF, or CRLF only" :
892                                         "all Unicode newlines");
893      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
894      printf("  Internal link size = %d\n", rc);      printf("  Internal link size = %d\n", rc);
895      (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);      (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);
# Line 890  offsets = (int *)malloc(size_offsets_max Line 926  offsets = (int *)malloc(size_offsets_max
926  if (offsets == NULL)  if (offsets == NULL)
927    {    {
928    printf("** Failed to get %d bytes of memory for offsets vector\n",    printf("** Failed to get %d bytes of memory for offsets vector\n",
929      size_offsets_max * sizeof(int));      (int)(size_offsets_max * sizeof(int)));
930    yield = 1;    yield = 1;
931    goto EXIT;    goto EXIT;
932    }    }
# Line 950  while (!done) Line 986  while (!done)
986    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
987    int do_study = 0;    int do_study = 0;
988    int do_debug = debug;    int do_debug = debug;
   int debug_lengths = 1;  
989    int do_G = 0;    int do_G = 0;
990    int do_g = 0;    int do_g = 0;
991    int do_showinfo = showinfo;    int do_showinfo = showinfo;
# Line 959  while (!done) Line 994  while (!done)
994    int erroroffset, len, delimiter, poffset;    int erroroffset, len, delimiter, poffset;
995    
996    use_utf8 = 0;    use_utf8 = 0;
997      debug_lengths = 1;
998    
999    if (infile == stdin) printf("  re> ");    if (infile == stdin) printf("  re> ");
1000    if (extend_inputline(infile, buffer) == NULL) break;    if (extend_inputline(infile, buffer) == NULL) break;
# Line 1318  while (!done) Line 1354  while (!done)
1354        rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));        rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));
1355        rre->size = byteflip(rre->size, sizeof(rre->size));        rre->size = byteflip(rre->size, sizeof(rre->size));
1356        rre->options = byteflip(rre->options, sizeof(rre->options));        rre->options = byteflip(rre->options, sizeof(rre->options));
1357          rre->flags = byteflip(rre->flags, sizeof(rre->flags));
1358        rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));        rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));
1359        rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));        rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));
1360        rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));        rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));
# Line 1352  while (!done) Line 1389  while (!done)
1389  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1390        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1391  #endif  #endif
1392        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char, okpartial, jchanged,
1393            hascrorlf;
1394        int nameentrysize, namecount;        int nameentrysize, namecount;
1395        const uschar *nametable;        const uschar *nametable;
1396    
# Line 1365  while (!done) Line 1403  while (!done)
1403        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
1404        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
1405        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
1406          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial);
1407          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged);
1408          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf);
1409    
1410  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1411        old_count = pcre_info(re, &old_options, &old_first_char);        old_count = pcre_info(re, &old_options, &old_first_char);
# Line 1406  while (!done) Line 1447  while (!done)
1447            }            }
1448          }          }
1449    
1450        /* The NOPARTIAL bit is a private bit in the options, so we have        if (!okpartial) fprintf(outfile, "Partial matching not supported\n");
1451        to fish it out via out back door */        if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n");
1452    
1453        all_options = ((real_pcre *)re)->options;        all_options = ((real_pcre *)re)->options;
1454        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");  
1455    
1456        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1457          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%s%s\n",
1458            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
1459            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
1460            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
1461            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",
1462            ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",            ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",
1463            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",
1464              ((get_options & PCRE_BSR_ANYCRLF) != 0)? " bsr_anycrlf" : "",
1465              ((get_options & PCRE_BSR_UNICODE) != 0)? " bsr_unicode" : "",
1466            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
1467            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
1468            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
# Line 1434  while (!done) Line 1471  while (!done)
1471            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1472            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1473    
1474          if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
1475    
1476        switch (get_options & PCRE_NEWLINE_BITS)        switch (get_options & PCRE_NEWLINE_BITS)
1477          {          {
1478          case PCRE_NEWLINE_CR:          case PCRE_NEWLINE_CR:
# Line 1852  while (!done) Line 1891  while (!done)
1891            if (offsets == NULL)            if (offsets == NULL)
1892              {              {
1893              printf("** Failed to get %d bytes of memory for offsets vector\n",              printf("** Failed to get %d bytes of memory for offsets vector\n",
1894                size_offsets_max * sizeof(int));                (int)(size_offsets_max * sizeof(int)));
1895              yield = 1;              yield = 1;
1896              goto EXIT;              goto EXIT;
1897              }              }
# Line 2225  while (!done) Line 2264  while (!done)
2264        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
2265        string - that was checked before setting g_notempty.        string - that was checked before setting g_notempty.
2266    
2267        Complication arises in the case when the newline option is "any" or        Complication arises in the case when the newline option is "any" or
2268        "anycrlf". If the previous match was at the end of a line terminated by        "anycrlf". If the previous match was at the end of a line terminated by
2269        CRLF, an advance of one character just passes the \r, whereas we should        CRLF, an advance of one character just passes the \r, whereas we should
2270        prefer the longer newline sequence, as does the code in pcre_exec().        prefer the longer newline sequence, as does the code in pcre_exec().
# Line 2248  while (!done) Line 2287  while (!done)
2287              obits = (d == '\r')? PCRE_NEWLINE_CR :              obits = (d == '\r')? PCRE_NEWLINE_CR :
2288                      (d == '\n')? PCRE_NEWLINE_LF :                      (d == '\n')? PCRE_NEWLINE_LF :
2289                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :
2290                      (d == -2)? PCRE_NEWLINE_ANYCRLF :                      (d == -2)? PCRE_NEWLINE_ANYCRLF :
2291                      (d == -1)? PCRE_NEWLINE_ANY : 0;                      (d == -1)? PCRE_NEWLINE_ANY : 0;
2292              }              }
2293            if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||            if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||
2294                 (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)                 (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)
2295                &&                &&
2296                start_offset < len - 1 &&                start_offset < len - 1 &&
2297                bptr[start_offset] == '\r' &&                bptr[start_offset] == '\r' &&

Legend:
Removed from v.149  
changed lines
  Added in v.231

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12