/[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 169 by ph10, Mon Jun 4 10:49:21 2007 UTC
# Line 663  return count; Line 663  return count;
663  *************************************************/  *************************************************/
664    
665  /* 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
666  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
667    no match.
668    
669  Arguments:  Arguments:
670    p           points after the leading '<'    p           points after the leading '<'
# Line 678  check_newline(uschar *p, FILE *f) Line 679  check_newline(uschar *p, FILE *f)
679  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;
680  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;
681  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;
682    if (strncmp((char *)p, "anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
683  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;
684  fprintf(f, "Unknown newline type at: <%s\n", p);  fprintf(f, "Unknown newline type at: <%s\n", p);
685  return 0;  return 0;
# Line 850  while (argc > 1 && argv[op][0] == '-') Line 852  while (argc > 1 && argv[op][0] == '-')
852      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
853      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :
854        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :
855          (rc == -2)? "ANYCRLF" :
856        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
857      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
858      printf("  Internal link size = %d\n", rc);      printf("  Internal link size = %d\n", rc);
# Line 887  offsets = (int *)malloc(size_offsets_max Line 890  offsets = (int *)malloc(size_offsets_max
890  if (offsets == NULL)  if (offsets == NULL)
891    {    {
892    printf("** Failed to get %d bytes of memory for offsets vector\n",    printf("** Failed to get %d bytes of memory for offsets vector\n",
893      size_offsets_max * sizeof(int));      (int)(size_offsets_max * sizeof(int)));
894    yield = 1;    yield = 1;
895    goto EXIT;    goto EXIT;
896    }    }
# Line 1349  while (!done) Line 1352  while (!done)
1352  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1353        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1354  #endif  #endif
1355        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char, okpartial, jchanged;
1356        int nameentrysize, namecount;        int nameentrysize, namecount;
1357        const uschar *nametable;        const uschar *nametable;
1358    
# Line 1362  while (!done) Line 1365  while (!done)
1365        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
1366        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
1367        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
1368          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial);
1369          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged);
1370    
1371  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1372        old_count = pcre_info(re, &old_options, &old_first_char);        old_count = pcre_info(re, &old_options, &old_first_char);
# Line 1402  while (!done) Line 1407  while (!done)
1407            nametable += nameentrysize;            nametable += nameentrysize;
1408            }            }
1409          }          }
1410    
1411        /* The NOPARTIAL bit is a private bit in the options, so we have        if (!okpartial) fprintf(outfile, "Partial matching not supported\n");
       to fish it out via out back door */  
1412    
1413        all_options = ((real_pcre *)re)->options;        all_options = ((real_pcre *)re)->options;
1414        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");  
1415    
1416        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1417          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 1430  while (!done) Line 1428  while (!done)
1428            ((get_options & PCRE_UTF8) != 0)? " utf8" : "",            ((get_options & PCRE_UTF8) != 0)? " utf8" : "",
1429            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1430            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1431    
1432          if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
1433    
1434        switch (get_options & PCRE_NEWLINE_BITS)        switch (get_options & PCRE_NEWLINE_BITS)
1435          {          {
# Line 1445  while (!done) Line 1445  while (!done)
1445          fprintf(outfile, "Forced newline sequence: CRLF\n");          fprintf(outfile, "Forced newline sequence: CRLF\n");
1446          break;          break;
1447    
1448            case PCRE_NEWLINE_ANYCRLF:
1449            fprintf(outfile, "Forced newline sequence: ANYCRLF\n");
1450            break;
1451    
1452          case PCRE_NEWLINE_ANY:          case PCRE_NEWLINE_ANY:
1453          fprintf(outfile, "Forced newline sequence: ANY\n");          fprintf(outfile, "Forced newline sequence: ANY\n");
1454          break;          break;
# Line 1845  while (!done) Line 1849  while (!done)
1849            if (offsets == NULL)            if (offsets == NULL)
1850              {              {
1851              printf("** Failed to get %d bytes of memory for offsets vector\n",              printf("** Failed to get %d bytes of memory for offsets vector\n",
1852                size_offsets_max * sizeof(int));                (int)(size_offsets_max * sizeof(int)));
1853              yield = 1;              yield = 1;
1854              goto EXIT;              goto EXIT;
1855              }              }
# Line 2218  while (!done) Line 2222  while (!done)
2222        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
2223        string - that was checked before setting g_notempty.        string - that was checked before setting g_notempty.
2224    
2225        Complication arises in the case when the newline option is "any".        Complication arises in the case when the newline option is "any" or
2226        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
2227        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
2228        longer newline sequence, as does the code in pcre_exec(). Fudge the        prefer the longer newline sequence, as does the code in pcre_exec().
2229        offset value to achieve this.        Fudge the offset value to achieve this.
2230    
2231        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
2232        character, not one byte. */        character, not one byte. */
# Line 2241  while (!done) Line 2245  while (!done)
2245              obits = (d == '\r')? PCRE_NEWLINE_CR :              obits = (d == '\r')? PCRE_NEWLINE_CR :
2246                      (d == '\n')? PCRE_NEWLINE_LF :                      (d == '\n')? PCRE_NEWLINE_LF :
2247                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :
2248                        (d == -2)? PCRE_NEWLINE_ANYCRLF :
2249                      (d == -1)? PCRE_NEWLINE_ANY : 0;                      (d == -1)? PCRE_NEWLINE_ANY : 0;
2250              }              }
2251            if ((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY &&            if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||
2252                   (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)
2253                  &&
2254                start_offset < len - 1 &&                start_offset < len - 1 &&
2255                bptr[start_offset] == '\r' &&                bptr[start_offset] == '\r' &&
2256                bptr[start_offset+1] == '\n')                bptr[start_offset+1] == '\n')

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

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12