/[pcre]/code/branches/pcre16/pcretest.c
ViewVC logotype

Diff of /code/branches/pcre16/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 343 by ph10, Mon Apr 21 16:30:37 2008 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 44  POSSIBILITY OF SUCH DAMAGE. Line 48  POSSIBILITY OF SUCH DAMAGE.
48  #include <locale.h>  #include <locale.h>
49  #include <errno.h>  #include <errno.h>
50    
51    #ifdef SUPPORT_LIBREADLINE
52    #ifdef HAVE_UNISTD_H
53    #include <unistd.h>
54    #endif
55    #include <readline/readline.h>
56    #include <readline/history.h>
57    #endif
58    
59    
60  /* A number of things vary for Windows builds. Originally, pcretest opened its  /* A number of things vary for Windows builds. Originally, pcretest opened its
61  input and output without "b"; then I was told that "b" was needed in some  input and output without "b"; then I was told that "b" was needed in some
# Line 59  input mode under Windows. */ Line 71  input mode under Windows. */
71  #define INPUT_MODE   "r"  #define INPUT_MODE   "r"
72  #define OUTPUT_MODE  "wb"  #define OUTPUT_MODE  "wb"
73    
74    #define isatty _isatty         /* This is what Windows calls them, I'm told */
75    #define fileno _fileno
76    
77  #else  #else
78  #include <sys/time.h>          /* These two includes are needed */  #include <sys/time.h>          /* These two includes are needed */
79  #include <sys/resource.h>      /* for setrlimit(). */  #include <sys/resource.h>      /* for setrlimit(). */
# Line 90  symbols to prevent clashes. */ Line 105  symbols to prevent clashes. */
105  #define _pcre_utf8_table4      utf8_table4  #define _pcre_utf8_table4      utf8_table4
106  #define _pcre_utt              utt  #define _pcre_utt              utt
107  #define _pcre_utt_size         utt_size  #define _pcre_utt_size         utt_size
108    #define _pcre_utt_names        utt_names
109  #define _pcre_OP_lengths       OP_lengths  #define _pcre_OP_lengths       OP_lengths
110    
111  #include "pcre_tables.c"  #include "pcre_tables.c"
# Line 152  static int callout_count; Line 168  static int callout_count;
168  static int callout_extra;  static int callout_extra;
169  static int callout_fail_count;  static int callout_fail_count;
170  static int callout_fail_id;  static int callout_fail_id;
171    static int debug_lengths;
172  static int first_callout;  static int first_callout;
173  static int locale_set = 0;  static int locale_set = 0;
174  static int show_malloc;  static int show_malloc;
# Line 183  optimal way of handling this, but hey, t Line 200  optimal way of handling this, but hey, t
200  Arguments:  Arguments:
201    f            the file to read    f            the file to read
202    start        where in buffer to start (this *must* be within buffer)    start        where in buffer to start (this *must* be within buffer)
203      prompt       for stdin or readline()
204    
205  Returns:       pointer to the start of new data  Returns:       pointer to the start of new data
206                 could be a copy of start, or could be moved                 could be a copy of start, or could be moved
# Line 190  Returns:       pointer to the start of n Line 208  Returns:       pointer to the start of n
208  */  */
209    
210  static uschar *  static uschar *
211  extend_inputline(FILE *f, uschar *start)  extend_inputline(FILE *f, uschar *start, const char *prompt)
212  {  {
213  uschar *here = start;  uschar *here = start;
214    
# Line 201  for (;;) Line 219  for (;;)
219    if (rlen > 1000)    if (rlen > 1000)
220      {      {
221      int dlen;      int dlen;
222      if (fgets((char *)here, rlen,  f) == NULL)  
223        return (here == start)? NULL : start;      /* If libreadline support is required, use readline() to read a line if the
224        input is a terminal. Note that readline() removes the trailing newline, so
225        we must put it back again, to be compatible with fgets(). */
226    
227    #ifdef SUPPORT_LIBREADLINE
228        if (isatty(fileno(f)))
229          {
230          size_t len;
231          char *s = readline(prompt);
232          if (s == NULL) return (here == start)? NULL : start;
233          len = strlen(s);
234          if (len > 0) add_history(s);
235          if (len > rlen - 1) len = rlen - 1;
236          memcpy(here, s, len);
237          here[len] = '\n';
238          here[len+1] = 0;
239          free(s);
240          }
241        else
242    #endif
243    
244        /* Read the next line by normal means, prompting if the file is stdin. */
245    
246          {
247          if (f == stdin) printf(prompt);
248          if (fgets((char *)here, rlen,  f) == NULL)
249            return (here == start)? NULL : start;
250          }
251    
252      dlen = (int)strlen((char *)here);      dlen = (int)strlen((char *)here);
253      if (dlen > 0 && here[dlen - 1] == '\n') return start;      if (dlen > 0 && here[dlen - 1] == '\n') return start;
254      here += dlen;      here += dlen;
# Line 659  return count; Line 705  return count;
705    
706    
707  /*************************************************  /*************************************************
708    *         Case-independent strncmp() function    *
709    *************************************************/
710    
711    /*
712    Arguments:
713      s         first string
714      t         second string
715      n         number of characters to compare
716    
717    Returns:    < 0, = 0, or > 0, according to the comparison
718    */
719    
720    static int
721    strncmpic(uschar *s, uschar *t, int n)
722    {
723    while (n--)
724      {
725      int c = tolower(*s++) - tolower(*t++);
726      if (c) return c;
727      }
728    return 0;
729    }
730    
731    
732    
733    /*************************************************
734  *         Check newline indicator                *  *         Check newline indicator                *
735  *************************************************/  *************************************************/
736    
737  /* 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
738  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
739    no match.
740    
741  Arguments:  Arguments:
742    p           points after the leading '<'    p           points after the leading '<'
# Line 675  Returns:      appropriate PCRE_NEWLINE_x Line 748  Returns:      appropriate PCRE_NEWLINE_x
748  static int  static int
749  check_newline(uschar *p, FILE *f)  check_newline(uschar *p, FILE *f)
750  {  {
751  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;  if (strncmpic(p, (uschar *)"cr>", 3) == 0) return PCRE_NEWLINE_CR;
752  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;  if (strncmpic(p, (uschar *)"lf>", 3) == 0) return PCRE_NEWLINE_LF;
753  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;  if (strncmpic(p, (uschar *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;
754  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;  if (strncmpic(p, (uschar *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
755    if (strncmpic(p, (uschar *)"any>", 4) == 0) return PCRE_NEWLINE_ANY;
756    if (strncmpic(p, (uschar *)"bsr_anycrlf>", 12) == 0) return PCRE_BSR_ANYCRLF;
757    if (strncmpic(p, (uschar *)"bsr_unicode>", 12) == 0) return PCRE_BSR_UNICODE;
758  fprintf(f, "Unknown newline type at: <%s\n", p);  fprintf(f, "Unknown newline type at: <%s\n", p);
759  return 0;  return 0;
760  }  }
# Line 692  return 0; Line 768  return 0;
768  static void  static void
769  usage(void)  usage(void)
770  {  {
771  printf("Usage:     pcretest [options] [<input> [<output>]]\n");  printf("Usage:     pcretest [options] [<input file> [<output file>]]\n\n");
772    printf("Input and output default to stdin and stdout.\n");
773    #ifdef SUPPORT_LIBREADLINE
774    printf("If input is a terminal, readline() is used to read from it.\n");
775    #else
776    printf("This version of pcretest is not linked with readline().\n");
777    #endif
778    printf("\nOptions:\n");
779  printf("  -b       show compiled code (bytecode)\n");  printf("  -b       show compiled code (bytecode)\n");
780  printf("  -C       show PCRE compile-time options and exit\n");  printf("  -C       show PCRE compile-time options and exit\n");
781  printf("  -d       debug: show compiled code and information (-b and -i)\n");  printf("  -d       debug: show compiled code and information (-b and -i)\n");
# Line 850  while (argc > 1 && argv[op][0] == '-') Line 933  while (argc > 1 && argv[op][0] == '-')
933      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
934      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :
935        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :
936          (rc == -2)? "ANYCRLF" :
937        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
938        (void)pcre_config(PCRE_CONFIG_BSR, &rc);
939        printf("  \\R matches %s\n", rc? "CR, LF, or CRLF only" :
940                                         "all Unicode newlines");
941      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
942      printf("  Internal link size = %d\n", rc);      printf("  Internal link size = %d\n", rc);
943      (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);      (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);
# Line 887  offsets = (int *)malloc(size_offsets_max Line 974  offsets = (int *)malloc(size_offsets_max
974  if (offsets == NULL)  if (offsets == NULL)
975    {    {
976    printf("** Failed to get %d bytes of memory for offsets vector\n",    printf("** Failed to get %d bytes of memory for offsets vector\n",
977      size_offsets_max * sizeof(int));      (int)(size_offsets_max * sizeof(int)));
978    yield = 1;    yield = 1;
979    goto EXIT;    goto EXIT;
980    }    }
# Line 947  while (!done) Line 1034  while (!done)
1034    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
1035    int do_study = 0;    int do_study = 0;
1036    int do_debug = debug;    int do_debug = debug;
   int debug_lengths = 1;  
1037    int do_G = 0;    int do_G = 0;
1038    int do_g = 0;    int do_g = 0;
1039    int do_showinfo = showinfo;    int do_showinfo = showinfo;
# Line 956  while (!done) Line 1042  while (!done)
1042    int erroroffset, len, delimiter, poffset;    int erroroffset, len, delimiter, poffset;
1043    
1044    use_utf8 = 0;    use_utf8 = 0;
1045      debug_lengths = 1;
1046    
1047    if (infile == stdin) printf("  re> ");    if (extend_inputline(infile, buffer, "  re> ") == NULL) break;
   if (extend_inputline(infile, buffer) == NULL) break;  
1048    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
1049    fflush(outfile);    fflush(outfile);
1050    
# Line 1058  while (!done) Line 1144  while (!done)
1144    
1145    if (isalnum(delimiter) || delimiter == '\\')    if (isalnum(delimiter) || delimiter == '\\')
1146      {      {
1147      fprintf(outfile, "** Delimiter must not be alphameric or \\\n");      fprintf(outfile, "** Delimiter must not be alphanumeric or \\\n");
1148      goto SKIP_DATA;      goto SKIP_DATA;
1149      }      }
1150    
# Line 1074  while (!done) Line 1160  while (!done)
1160        pp++;        pp++;
1161        }        }
1162      if (*pp != 0) break;      if (*pp != 0) break;
1163      if (infile == stdin) printf("    > ");      if ((pp = extend_inputline(infile, pp, "    > ")) == NULL)
     if ((pp = extend_inputline(infile, pp)) == NULL)  
1164        {        {
1165        fprintf(outfile, "** Unexpected EOF\n");        fprintf(outfile, "** Unexpected EOF\n");
1166        done = 1;        done = 1;
# Line 1167  while (!done) Line 1252  while (!done)
1252    
1253        case '<':        case '<':
1254          {          {
1255          int x = check_newline(pp, outfile);          if (strncmp((char *)pp, "JS>", 3) == 0)
1256          if (x == 0) goto SKIP_DATA;            {
1257          options |= x;            options |= PCRE_JAVASCRIPT_COMPAT;
1258          while (*pp++ != '>');            pp += 3;
1259              }
1260            else
1261              {
1262              int x = check_newline(pp, outfile);
1263              if (x == 0) goto SKIP_DATA;
1264              options |= x;
1265              while (*pp++ != '>');
1266              }
1267          }          }
1268        break;        break;
1269    
# Line 1249  while (!done) Line 1342  while (!done)
1342          {          {
1343          for (;;)          for (;;)
1344            {            {
1345            if (extend_inputline(infile, buffer) == NULL)            if (extend_inputline(infile, buffer, NULL) == NULL)
1346              {              {
1347              done = 1;              done = 1;
1348              goto CONTINUE;              goto CONTINUE;
# Line 1312  while (!done) Line 1405  while (!done)
1405      if (do_flip)      if (do_flip)
1406        {        {
1407        real_pcre *rre = (real_pcre *)re;        real_pcre *rre = (real_pcre *)re;
1408        rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));        rre->magic_number =
1409            byteflip(rre->magic_number, sizeof(rre->magic_number));
1410        rre->size = byteflip(rre->size, sizeof(rre->size));        rre->size = byteflip(rre->size, sizeof(rre->size));
1411        rre->options = byteflip(rre->options, sizeof(rre->options));        rre->options = byteflip(rre->options, sizeof(rre->options));
1412        rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));        rre->flags = (pcre_uint16)byteflip(rre->flags, sizeof(rre->flags));
1413        rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));        rre->top_bracket =
1414        rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));          (pcre_uint16)byteflip(rre->top_bracket, sizeof(rre->top_bracket));
1415        rre->req_byte = byteflip(rre->req_byte, sizeof(rre->req_byte));        rre->top_backref =
1416        rre->name_table_offset = byteflip(rre->name_table_offset,          (pcre_uint16)byteflip(rre->top_backref, sizeof(rre->top_backref));
1417          rre->first_byte =
1418            (pcre_uint16)byteflip(rre->first_byte, sizeof(rre->first_byte));
1419          rre->req_byte =
1420            (pcre_uint16)byteflip(rre->req_byte, sizeof(rre->req_byte));
1421          rre->name_table_offset = (pcre_uint16)byteflip(rre->name_table_offset,
1422          sizeof(rre->name_table_offset));          sizeof(rre->name_table_offset));
1423        rre->name_entry_size = byteflip(rre->name_entry_size,        rre->name_entry_size = (pcre_uint16)byteflip(rre->name_entry_size,
1424          sizeof(rre->name_entry_size));          sizeof(rre->name_entry_size));
1425        rre->name_count = byteflip(rre->name_count, sizeof(rre->name_count));        rre->name_count = (pcre_uint16)byteflip(rre->name_count,
1426            sizeof(rre->name_count));
1427    
1428        if (extra != NULL)        if (extra != NULL)
1429          {          {
# Line 1349  while (!done) Line 1449  while (!done)
1449  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1450        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1451  #endif  #endif
1452        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char, okpartial, jchanged,
1453            hascrorlf;
1454        int nameentrysize, namecount;        int nameentrysize, namecount;
1455        const uschar *nametable;        const uschar *nametable;
1456    
# Line 1362  while (!done) Line 1463  while (!done)
1463        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
1464        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
1465        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
1466          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial);
1467          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged);
1468          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf);
1469    
1470  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1471        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 1507  while (!done)
1507            }            }
1508          }          }
1509    
1510        /* The NOPARTIAL bit is a private bit in the options, so we have        if (!okpartial) fprintf(outfile, "Partial matching not supported\n");
1511        to fish it out via out back door */        if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n");
1512    
1513        all_options = ((real_pcre *)re)->options;        all_options = ((real_pcre *)re)->options;
1514        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");  
1515    
1516        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1517          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",
1518            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
1519            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
1520            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
1521            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",
1522            ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",            ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",
1523            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",
1524              ((get_options & PCRE_BSR_ANYCRLF) != 0)? " bsr_anycrlf" : "",
1525              ((get_options & PCRE_BSR_UNICODE) != 0)? " bsr_unicode" : "",
1526            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
1527            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
1528            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
# Line 1431  while (!done) Line 1531  while (!done)
1531            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1532            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1533    
1534          if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
1535    
1536        switch (get_options & PCRE_NEWLINE_BITS)        switch (get_options & PCRE_NEWLINE_BITS)
1537          {          {
1538          case PCRE_NEWLINE_CR:          case PCRE_NEWLINE_CR:
# Line 1445  while (!done) Line 1547  while (!done)
1547          fprintf(outfile, "Forced newline sequence: CRLF\n");          fprintf(outfile, "Forced newline sequence: CRLF\n");
1548          break;          break;
1549    
1550            case PCRE_NEWLINE_ANYCRLF:
1551            fprintf(outfile, "Forced newline sequence: ANYCRLF\n");
1552            break;
1553    
1554          case PCRE_NEWLINE_ANY:          case PCRE_NEWLINE_ANY:
1555          fprintf(outfile, "Forced newline sequence: ANY\n");          fprintf(outfile, "Forced newline sequence: ANY\n");
1556          break;          break;
# Line 1549  while (!done) Line 1655  while (!done)
1655        else        else
1656          {          {
1657          uschar sbuf[8];          uschar sbuf[8];
1658          sbuf[0] = (true_size >> 24)  & 255;          sbuf[0] = (uschar)((true_size >> 24) & 255);
1659          sbuf[1] = (true_size >> 16)  & 255;          sbuf[1] = (uschar)((true_size >> 16) & 255);
1660          sbuf[2] = (true_size >>  8)  & 255;          sbuf[2] = (uschar)((true_size >>  8) & 255);
1661          sbuf[3] = (true_size)  & 255;          sbuf[3] = (uschar)((true_size) & 255);
1662    
1663          sbuf[4] = (true_study_size >> 24)  & 255;          sbuf[4] = (uschar)((true_study_size >> 24) & 255);
1664          sbuf[5] = (true_study_size >> 16)  & 255;          sbuf[5] = (uschar)((true_study_size >> 16) & 255);
1665          sbuf[6] = (true_study_size >>  8)  & 255;          sbuf[6] = (uschar)((true_study_size >>  8) & 255);
1666          sbuf[7] = (true_study_size)  & 255;          sbuf[7] = (uschar)((true_study_size) & 255);
1667    
1668          if (fwrite(sbuf, 1, 8, f) < 8 ||          if (fwrite(sbuf, 1, 8, f) < 8 ||
1669              fwrite(re, 1, true_size, f) < true_size)              fwrite(re, 1, true_size, f) < true_size)
# Line 1631  while (!done) Line 1737  while (!done)
1737      len = 0;      len = 0;
1738      for (;;)      for (;;)
1739        {        {
1740        if (infile == stdin) printf("data> ");        if (extend_inputline(infile, buffer + len, "data> ") == NULL)
       if (extend_inputline(infile, buffer + len) == NULL)  
1741          {          {
1742          if (len > 0) break;          if (len > 0) break;
1743          done = 1;          done = 1;
# Line 1845  while (!done) Line 1950  while (!done)
1950            if (offsets == NULL)            if (offsets == NULL)
1951              {              {
1952              printf("** Failed to get %d bytes of memory for offsets vector\n",              printf("** Failed to get %d bytes of memory for offsets vector\n",
1953                size_offsets_max * sizeof(int));                (int)(size_offsets_max * sizeof(int)));
1954              yield = 1;              yield = 1;
1955              goto EXIT;              goto EXIT;
1956              }              }
# Line 2218  while (!done) Line 2323  while (!done)
2323        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
2324        string - that was checked before setting g_notempty.        string - that was checked before setting g_notempty.
2325    
2326        Complication arises in the case when the newline option is "any".        Complication arises in the case when the newline option is "any" or
2327        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
2328        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
2329        longer newline sequence, as does the code in pcre_exec(). Fudge the        prefer the longer newline sequence, as does the code in pcre_exec().
2330        offset value to achieve this.        Fudge the offset value to achieve this.
2331    
2332        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
2333        character, not one byte. */        character, not one byte. */
# Line 2241  while (!done) Line 2346  while (!done)
2346              obits = (d == '\r')? PCRE_NEWLINE_CR :              obits = (d == '\r')? PCRE_NEWLINE_CR :
2347                      (d == '\n')? PCRE_NEWLINE_LF :                      (d == '\n')? PCRE_NEWLINE_LF :
2348                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :
2349                        (d == -2)? PCRE_NEWLINE_ANYCRLF :
2350                      (d == -1)? PCRE_NEWLINE_ANY : 0;                      (d == -1)? PCRE_NEWLINE_ANY : 0;
2351              }              }
2352            if ((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY &&            if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||
2353                   (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)
2354                  &&
2355                start_offset < len - 1 &&                start_offset < len - 1 &&
2356                bptr[start_offset] == '\r' &&                bptr[start_offset] == '\r' &&
2357                bptr[start_offset+1] == '\n')                bptr[start_offset+1] == '\n')

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

  ViewVC Help
Powered by ViewVC 1.1.5