/[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 147 by ph10, Mon Apr 16 13:24:37 2007 UTC revision 226 by ph10, Tue Aug 21 11:46:08 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 663  return count; Line 668  return count;
668  *************************************************/  *************************************************/
669    
670  /* 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
671  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
672    no match.
673    
674  Arguments:  Arguments:
675    p           points after the leading '<'    p           points after the leading '<'
# Line 678  check_newline(uschar *p, FILE *f) Line 684  check_newline(uschar *p, FILE *f)
684  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;
685  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;
686  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;
687    if (strncmp((char *)p, "anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
688  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;
689  fprintf(f, "Unknown newline type at: <%s\n", p);  fprintf(f, "Unknown newline type at: <%s\n", p);
690  return 0;  return 0;
# Line 850  while (argc > 1 && argv[op][0] == '-') Line 857  while (argc > 1 && argv[op][0] == '-')
857      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
858      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :
859        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :
860          (rc == -2)? "ANYCRLF" :
861        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
862      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
863      printf("  Internal link size = %d\n", rc);      printf("  Internal link size = %d\n", rc);
# Line 887  offsets = (int *)malloc(size_offsets_max Line 895  offsets = (int *)malloc(size_offsets_max
895  if (offsets == NULL)  if (offsets == NULL)
896    {    {
897    printf("** Failed to get %d bytes of memory for offsets vector\n",    printf("** Failed to get %d bytes of memory for offsets vector\n",
898      size_offsets_max * sizeof(int));      (int)(size_offsets_max * sizeof(int)));
899    yield = 1;    yield = 1;
900    goto EXIT;    goto EXIT;
901    }    }
# Line 947  while (!done) Line 955  while (!done)
955    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
956    int do_study = 0;    int do_study = 0;
957    int do_debug = debug;    int do_debug = debug;
   int debug_lengths = 1;  
958    int do_G = 0;    int do_G = 0;
959    int do_g = 0;    int do_g = 0;
960    int do_showinfo = showinfo;    int do_showinfo = showinfo;
# Line 956  while (!done) Line 963  while (!done)
963    int erroroffset, len, delimiter, poffset;    int erroroffset, len, delimiter, poffset;
964    
965    use_utf8 = 0;    use_utf8 = 0;
966      debug_lengths = 1;
967    
968    if (infile == stdin) printf("  re> ");    if (infile == stdin) printf("  re> ");
969    if (extend_inputline(infile, buffer) == NULL) break;    if (extend_inputline(infile, buffer) == NULL) break;
# Line 1349  while (!done) Line 1357  while (!done)
1357  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1358        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1359  #endif  #endif
1360        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char, okpartial, jchanged,
1361            hascrorlf;
1362        int nameentrysize, namecount;        int nameentrysize, namecount;
1363        const uschar *nametable;        const uschar *nametable;
1364    
# Line 1362  while (!done) Line 1371  while (!done)
1371        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
1372        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
1373        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
1374          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial);
1375          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged);
1376          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf);
1377    
1378  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1379        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 1415  while (!done)
1415            }            }
1416          }          }
1417    
1418        /* The NOPARTIAL bit is a private bit in the options, so we have        if (!okpartial) fprintf(outfile, "Partial matching not supported\n");
1419        to fish it out via out back door */        if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n");
1420    
1421        all_options = ((real_pcre *)re)->options;        all_options = ((real_pcre *)re)->options;
1422        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");  
1423    
1424        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1425          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 1437  while (!done)
1437            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1438            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1439    
1440          if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
1441    
1442        switch (get_options & PCRE_NEWLINE_BITS)        switch (get_options & PCRE_NEWLINE_BITS)
1443          {          {
1444          case PCRE_NEWLINE_CR:          case PCRE_NEWLINE_CR:
# Line 1445  while (!done) Line 1453  while (!done)
1453          fprintf(outfile, "Forced newline sequence: CRLF\n");          fprintf(outfile, "Forced newline sequence: CRLF\n");
1454          break;          break;
1455    
1456            case PCRE_NEWLINE_ANYCRLF:
1457            fprintf(outfile, "Forced newline sequence: ANYCRLF\n");
1458            break;
1459    
1460          case PCRE_NEWLINE_ANY:          case PCRE_NEWLINE_ANY:
1461          fprintf(outfile, "Forced newline sequence: ANY\n");          fprintf(outfile, "Forced newline sequence: ANY\n");
1462          break;          break;
# Line 1845  while (!done) Line 1857  while (!done)
1857            if (offsets == NULL)            if (offsets == NULL)
1858              {              {
1859              printf("** Failed to get %d bytes of memory for offsets vector\n",              printf("** Failed to get %d bytes of memory for offsets vector\n",
1860                size_offsets_max * sizeof(int));                (int)(size_offsets_max * sizeof(int)));
1861              yield = 1;              yield = 1;
1862              goto EXIT;              goto EXIT;
1863              }              }
# Line 2218  while (!done) Line 2230  while (!done)
2230        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
2231        string - that was checked before setting g_notempty.        string - that was checked before setting g_notempty.
2232    
2233        Complication arises in the case when the newline option is "any".        Complication arises in the case when the newline option is "any" or
2234        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
2235        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
2236        longer newline sequence, as does the code in pcre_exec(). Fudge the        prefer the longer newline sequence, as does the code in pcre_exec().
2237        offset value to achieve this.        Fudge the offset value to achieve this.
2238    
2239        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
2240        character, not one byte. */        character, not one byte. */
# Line 2241  while (!done) Line 2253  while (!done)
2253              obits = (d == '\r')? PCRE_NEWLINE_CR :              obits = (d == '\r')? PCRE_NEWLINE_CR :
2254                      (d == '\n')? PCRE_NEWLINE_LF :                      (d == '\n')? PCRE_NEWLINE_LF :
2255                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :
2256                        (d == -2)? PCRE_NEWLINE_ANYCRLF :
2257                      (d == -1)? PCRE_NEWLINE_ANY : 0;                      (d == -1)? PCRE_NEWLINE_ANY : 0;
2258              }              }
2259            if ((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY &&            if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||
2260                   (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)
2261                  &&
2262                start_offset < len - 1 &&                start_offset < len - 1 &&
2263                bptr[start_offset] == '\r' &&                bptr[start_offset] == '\r' &&
2264                bptr[start_offset+1] == '\n')                bptr[start_offset+1] == '\n')

Legend:
Removed from v.147  
changed lines
  Added in v.226

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12