/[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 376 by ph10, Sun Mar 1 12:00:59 2009 UTC revision 535 by ph10, Thu Jun 3 19:18:24 2010 UTC
# Line 71  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 */  #ifndef isatty
75    #define isatty _isatty         /* This is what Windows calls them, I'm told, */
76    #endif                         /* though in some environments they seem to   */
77                                   /* be already defined, hence the #ifndefs.    */
78    #ifndef fileno
79  #define fileno _fileno  #define fileno _fileno
80    #endif
81    
82  #else  #else
83  #include <sys/time.h>          /* These two includes are needed */  #include <sys/time.h>          /* These two includes are needed */
# Line 113  external symbols to prevent clashes. */ Line 118  external symbols to prevent clashes. */
118    
119  /* We also need the pcre_printint() function for printing out compiled  /* We also need the pcre_printint() function for printing out compiled
120  patterns. This function is in a separate file so that it can be included in  patterns. This function is in a separate file so that it can be included in
121  pcre_compile.c when that module is compiled with debugging enabled.  pcre_compile.c when that module is compiled with debugging enabled. It needs to
122    know which case is being compiled. */
 The definition of the macro PRINTABLE, which determines whether to print an  
 output character as-is or as a hex value when showing compiled patterns, is  
 contained in this file. We uses it here also, in cases when the locale has not  
 been explicitly changed, so as to get consistent output from systems that  
 differ in their output from isprint() even in the "C" locale. */  
123    
124    #define COMPILING_PCRETEST
125  #include "pcre_printint.src"  #include "pcre_printint.src"
126    
127  #define PRINTHEX(c) (locale_set? isprint(c) : PRINTABLE(c))  /* The definition of the macro PRINTABLE, which determines whether to print an
128    output character as-is or as a hex value when showing compiled patterns, is
129    contained in the printint.src file. We uses it here also, in cases when the
130    locale has not been explicitly changed, so as to get consistent output from
131    systems that differ in their output from isprint() even in the "C" locale. */
132    
133    #define PRINTHEX(c) (locale_set? isprint(c) : PRINTABLE(c))
134    
135  /* It is possible to compile this test program without including support for  /* It is possible to compile this test program without including support for
136  testing the POSIX interface, though this is not available via the standard  testing the POSIX interface, though this is not available via the standard
# Line 215  uschar *here = start; Line 221  uschar *here = start;
221    
222  for (;;)  for (;;)
223    {    {
224    int rlen = buffer_size - (here - buffer);    int rlen = (int)(buffer_size - (here - buffer));
225    
226    if (rlen > 1000)    if (rlen > 1000)
227      {      {
# Line 245  for (;;) Line 251  for (;;)
251      /* Read the next line by normal means, prompting if the file is stdin. */      /* Read the next line by normal means, prompting if the file is stdin. */
252    
253        {        {
254        if (f == stdin) printf(prompt);        if (f == stdin) printf("%s", prompt);
255        if (fgets((char *)here, rlen,  f) == NULL)        if (fgets((char *)here, rlen,  f) == NULL)
256          return (here == start)? NULL : start;          return (here == start)? NULL : start;
257        }        }
# Line 735  return 0; Line 741  return 0;
741  *         Check newline indicator                *  *         Check newline indicator                *
742  *************************************************/  *************************************************/
743    
744  /* 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. Print
745  xxx is LF, CR, CRLF, ANYCRLF, or ANY. Print a message and return 0 if there is  a message and return 0 if there is no match.
 no match.  
746    
747  Arguments:  Arguments:
748    p           points after the leading '<'    p           points after the leading '<'
# Line 785  printf("  -dfa     force DFA matching fo Line 790  printf("  -dfa     force DFA matching fo
790  #endif  #endif
791  printf("  -help    show usage information\n");  printf("  -help    show usage information\n");
792  printf("  -i       show information about compiled patterns\n"  printf("  -i       show information about compiled patterns\n"
793           "  -M       find MATCH_LIMIT minimum for each subject\n"
794         "  -m       output memory used information\n"         "  -m       output memory used information\n"
795         "  -o <n>   set size of offsets vector to <n>\n");         "  -o <n>   set size of offsets vector to <n>\n");
796  #if !defined NOPOSIX  #if !defined NOPOSIX
# Line 814  int main(int argc, char **argv) Line 820  int main(int argc, char **argv)
820  FILE *infile = stdin;  FILE *infile = stdin;
821  int options = 0;  int options = 0;
822  int study_options = 0;  int study_options = 0;
823    int default_find_match_limit = FALSE;
824  int op = 1;  int op = 1;
825  int timeit = 0;  int timeit = 0;
826  int timeitm = 0;  int timeitm = 0;
# Line 873  while (argc > 1 && argv[op][0] == '-') Line 880  while (argc > 1 && argv[op][0] == '-')
880    else if (strcmp(argv[op], "-b") == 0) debug = 1;    else if (strcmp(argv[op], "-b") == 0) debug = 1;
881    else if (strcmp(argv[op], "-i") == 0) showinfo = 1;    else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
882    else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;    else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
883      else if (strcmp(argv[op], "-M") == 0) default_find_match_limit = TRUE;
884  #if !defined NODFA  #if !defined NODFA
885    else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1;    else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1;
886  #endif  #endif
# Line 925  while (argc > 1 && argv[op][0] == '-') Line 933  while (argc > 1 && argv[op][0] == '-')
933    else if (strcmp(argv[op], "-C") == 0)    else if (strcmp(argv[op], "-C") == 0)
934      {      {
935      int rc;      int rc;
936      unsigned long int lrc;      unsigned long int lrc;
937      printf("PCRE version %s\n", pcre_version());      printf("PCRE version %s\n", pcre_version());
938      printf("Compiled with\n");      printf("Compiled with\n");
939      (void)pcre_config(PCRE_CONFIG_UTF8, &rc);      (void)pcre_config(PCRE_CONFIG_UTF8, &rc);
# Line 933  while (argc > 1 && argv[op][0] == '-') Line 941  while (argc > 1 && argv[op][0] == '-')
941      (void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);      (void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);
942      printf("  %sUnicode properties support\n", rc? "" : "No ");      printf("  %sUnicode properties support\n", rc? "" : "No ");
943      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);      (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
944      printf("  Newline sequence is %s\n", (rc == '\r')? "CR" :      /* Note that these values are always the ASCII values, even
945        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :      in EBCDIC environments. CR is 13 and NL is 10. */
946        printf("  Newline sequence is %s\n", (rc == 13)? "CR" :
947          (rc == 10)? "LF" : (rc == (13<<8 | 10))? "CRLF" :
948        (rc == -2)? "ANYCRLF" :        (rc == -2)? "ANYCRLF" :
949        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
950      (void)pcre_config(PCRE_CONFIG_BSR, &rc);      (void)pcre_config(PCRE_CONFIG_BSR, &rc);
# Line 1029  while (!done) Line 1039  while (!done)
1039  #endif  #endif
1040    
1041    const char *error;    const char *error;
1042      unsigned char *markptr;
1043    unsigned char *p, *pp, *ppp;    unsigned char *p, *pp, *ppp;
1044    unsigned char *to_file = NULL;    unsigned char *to_file = NULL;
1045    const unsigned char *tables = NULL;    const unsigned char *tables = NULL;
1046    unsigned long int true_size, true_study_size = 0;    unsigned long int true_size, true_study_size = 0;
1047    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
1048      int do_mark = 0;
1049    int do_study = 0;    int do_study = 0;
1050    int do_debug = debug;    int do_debug = debug;
1051    int do_G = 0;    int do_G = 0;
# Line 1151  while (!done) Line 1163  while (!done)
1163      }      }
1164    
1165    pp = p;    pp = p;
1166    poffset = p - buffer;    poffset = (int)(p - buffer);
1167    
1168    for(;;)    for(;;)
1169      {      {
# Line 1215  while (!done) Line 1227  while (!done)
1227        case 'G': do_G = 1; break;        case 'G': do_G = 1; break;
1228        case 'I': do_showinfo = 1; break;        case 'I': do_showinfo = 1; break;
1229        case 'J': options |= PCRE_DUPNAMES; break;        case 'J': options |= PCRE_DUPNAMES; break;
1230          case 'K': do_mark = 1; break;
1231        case 'M': log_store = 1; break;        case 'M': log_store = 1; break;
1232        case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;        case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;
1233    
# Line 1224  while (!done) Line 1237  while (!done)
1237    
1238        case 'S': do_study = 1; break;        case 'S': do_study = 1; break;
1239        case 'U': options |= PCRE_UNGREEDY; break;        case 'U': options |= PCRE_UNGREEDY; break;
1240          case 'W': options |= PCRE_UCP; break;
1241        case 'X': options |= PCRE_EXTRA; break;        case 'X': options |= PCRE_EXTRA; break;
1242        case 'Z': debug_lengths = 0; break;        case 'Z': debug_lengths = 0; break;
1243        case '8': options |= PCRE_UTF8; use_utf8 = 1; break;        case '8': options |= PCRE_UTF8; use_utf8 = 1; break;
# Line 1254  while (!done) Line 1268  while (!done)
1268    
1269        case '<':        case '<':
1270          {          {
1271          if (strncmp((char *)pp, "JS>", 3) == 0)          if (strncmpic(pp, (uschar *)"JS>", 3) == 0)
1272            {            {
1273            options |= PCRE_JAVASCRIPT_COMPAT;            options |= PCRE_JAVASCRIPT_COMPAT;
1274            pp += 3;            pp += 3;
# Line 1295  while (!done) Line 1309  while (!done)
1309      if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL;      if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL;
1310      if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;      if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;
1311      if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8;      if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8;
1312        if ((options & PCRE_UCP) != 0) cflags |= REG_UCP;
1313        if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY;
1314    
1315      rc = regcomp(&preg, (char *)p, cflags);      rc = regcomp(&preg, (char *)p, cflags);
1316    
# Line 1315  while (!done) Line 1331  while (!done)
1331  #endif  /* !defined NOPOSIX */  #endif  /* !defined NOPOSIX */
1332    
1333      {      {
1334        unsigned long int get_options;
1335    
1336      if (timeit > 0)      if (timeit > 0)
1337        {        {
1338        register int i;        register int i;
# Line 1358  while (!done) Line 1376  while (!done)
1376        goto CONTINUE;        goto CONTINUE;
1377        }        }
1378    
1379      /* Compilation succeeded; print data if required. There are now two      /* Compilation succeeded. It is now possible to set the UTF-8 option from
1380      info-returning functions. The old one has a limited interface and      within the regex; check for this so that we know how to process the data
1381      returns only limited data. Check that it agrees with the newer one. */      lines. */
1382    
1383        new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options);
1384        if ((get_options & PCRE_UTF8) != 0) use_utf8 = 1;
1385    
1386        /* Print information if required. There are now two info-returning
1387        functions. The old one has a limited interface and returns only limited
1388        data. Check that it agrees with the newer one. */
1389    
1390      if (log_store)      if (log_store)
1391        fprintf(outfile, "Memory allocation (code space): %d\n",        fprintf(outfile, "Memory allocation (code space): %d\n",
# Line 1399  while (!done) Line 1424  while (!done)
1424          true_study_size = ((pcre_study_data *)(extra->study_data))->size;          true_study_size = ((pcre_study_data *)(extra->study_data))->size;
1425        }        }
1426    
1427        /* If /K was present, we set up for handling MARK data. */
1428    
1429        if (do_mark)
1430          {
1431          if (extra == NULL)
1432            {
1433            extra = (pcre_extra *)malloc(sizeof(pcre_extra));
1434            extra->flags = 0;
1435            }
1436          extra->mark = &markptr;
1437          extra->flags |= PCRE_EXTRA_MARK;
1438          }
1439    
1440      /* If the 'F' option was present, we flip the bytes of all the integer      /* If the 'F' option was present, we flip the bytes of all the integer
1441      fields in the regex data block and the study block. This is to make it      fields in the regex data block and the study block. This is to make it
1442      possible to test PCRE's handling of byte-flipped patterns, e.g. those      possible to test PCRE's handling of byte-flipped patterns, e.g. those
# Line 1431  while (!done) Line 1469  while (!done)
1469          {          {
1470          pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);          pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
1471          rsd->size = byteflip(rsd->size, sizeof(rsd->size));          rsd->size = byteflip(rsd->size, sizeof(rsd->size));
1472          rsd->options = byteflip(rsd->options, sizeof(rsd->options));          rsd->flags = byteflip(rsd->flags, sizeof(rsd->flags));
1473            rsd->minlength = byteflip(rsd->minlength, sizeof(rsd->minlength));
1474          }          }
1475        }        }
1476    
# Line 1445  while (!done) Line 1484  while (!done)
1484        pcre_printint(re, outfile, debug_lengths);        pcre_printint(re, outfile, debug_lengths);
1485        }        }
1486    
1487        /* We already have the options in get_options (see above) */
1488    
1489      if (do_showinfo)      if (do_showinfo)
1490        {        {
1491        unsigned long int get_options, all_options;        unsigned long int all_options;
1492  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1493        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1494  #endif  #endif
# Line 1456  while (!done) Line 1497  while (!done)
1497        int nameentrysize, namecount;        int nameentrysize, namecount;
1498        const uschar *nametable;        const uschar *nametable;
1499    
       new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options);  
1500        new_info(re, NULL, PCRE_INFO_SIZE, &size);        new_info(re, NULL, PCRE_INFO_SIZE, &size);
1501        new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);        new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);
1502        new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);        new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);
# Line 1516  while (!done) Line 1556  while (!done)
1556        if (do_flip) all_options = byteflip(all_options, sizeof(all_options));        if (do_flip) all_options = byteflip(all_options, sizeof(all_options));
1557    
1558        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1559          else fprintf(outfile, "Options:%s%s%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%s\n",
1560            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
1561            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
1562            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
# Line 1530  while (!done) Line 1570  while (!done)
1570            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
1571            ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "",            ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "",
1572            ((get_options & PCRE_UTF8) != 0)? " utf8" : "",            ((get_options & PCRE_UTF8) != 0)? " utf8" : "",
1573              ((get_options & PCRE_UCP) != 0)? " ucp" : "",
1574            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1575            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1576    
# Line 1607  while (!done) Line 1648  while (!done)
1648          else          else
1649            {            {
1650            uschar *start_bits = NULL;            uschar *start_bits = NULL;
1651            new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);            int minlength;
1652    
1653              new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength);
1654              fprintf(outfile, "Subject length lower bound = %d\n", minlength);
1655    
1656              new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
1657            if (start_bits == NULL)            if (start_bits == NULL)
1658              fprintf(outfile, "No starting byte set\n");              fprintf(outfile, "No set of starting bytes\n");
1659            else            else
1660              {              {
1661              int i;              int i;
# Line 1709  while (!done) Line 1754  while (!done)
1754      int callout_data_set = 0;      int callout_data_set = 0;
1755      int count, c;      int count, c;
1756      int copystrings = 0;      int copystrings = 0;
1757      int find_match_limit = 0;      int find_match_limit = default_find_match_limit;
1758      int getstrings = 0;      int getstrings = 0;
1759      int getlist = 0;      int getlist = 0;
1760      int gmatched = 0;      int gmatched = 0;
# Line 1949  while (!done) Line 1994  while (!done)
1994          continue;          continue;
1995    
1996          case 'N':          case 'N':
1997          options |= PCRE_NOTEMPTY;          if ((options & PCRE_NOTEMPTY) != 0)
1998              options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART;
1999            else
2000              options |= PCRE_NOTEMPTY;
2001          continue;          continue;
2002    
2003          case 'O':          case 'O':
# Line 1972  while (!done) Line 2020  while (!done)
2020          continue;          continue;
2021    
2022          case 'P':          case 'P':
2023          options |= PCRE_PARTIAL;          options |= ((options & PCRE_PARTIAL_SOFT) == 0)?
2024              PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD;
2025          continue;          continue;
2026    
2027          case 'Q':          case 'Q':
# Line 2007  while (!done) Line 2056  while (!done)
2056          show_malloc = 1;          show_malloc = 1;
2057          continue;          continue;
2058    
2059            case 'Y':
2060            options |= PCRE_NO_START_OPTIMIZE;
2061            continue;
2062    
2063          case 'Z':          case 'Z':
2064          options |= PCRE_NOTEOL;          options |= PCRE_NOTEOL;
2065          continue;          continue;
# Line 2027  while (!done) Line 2080  while (!done)
2080        *q++ = c;        *q++ = c;
2081        }        }
2082      *q = 0;      *q = 0;
2083      len = q - dbuffer;      len = (int)(q - dbuffer);
2084    
2085      /* Move the data to the end of the buffer so that a read over the end of      /* Move the data to the end of the buffer so that a read over the end of
2086      the buffer will be seen by valgrind, even if it doesn't cause a crash. If      the buffer will be seen by valgrind, even if it doesn't cause a crash. If
# Line 2065  while (!done) Line 2118  while (!done)
2118          pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);          pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);
2119        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
2120        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
2121          if ((options & PCRE_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY;
2122    
2123        rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);        rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);
2124    
# Line 2109  while (!done) Line 2163  while (!done)
2163    
2164      for (;; gmatched++)    /* Loop for /g or /G */      for (;; gmatched++)    /* Loop for /g or /G */
2165        {        {
2166          markptr = NULL;
2167    
2168        if (timeitm > 0)        if (timeitm > 0)
2169          {          {
2170          register int i;          register int i;
# Line 2120  while (!done) Line 2176  while (!done)
2176            {            {
2177            int workspace[1000];            int workspace[1000];
2178            for (i = 0; i < timeitm; i++)            for (i = 0; i < timeitm; i++)
2179              count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset,              count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset,
2180                options | g_notempty, use_offsets, use_size_offsets, workspace,                options | g_notempty, use_offsets, use_size_offsets, workspace,
2181                sizeof(workspace)/sizeof(int));                sizeof(workspace)/sizeof(int));
2182            }            }
# Line 2183  while (!done) Line 2239  while (!done)
2239        else if (all_use_dfa || use_dfa)        else if (all_use_dfa || use_dfa)
2240          {          {
2241          int workspace[1000];          int workspace[1000];
2242          count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset,          count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset,
2243            options | g_notempty, use_offsets, use_size_offsets, workspace,            options | g_notempty, use_offsets, use_size_offsets, workspace,
2244            sizeof(workspace)/sizeof(int));            sizeof(workspace)/sizeof(int));
2245          if (count == 0)          if (count == 0)
# Line 2254  while (!done) Line 2310  while (!done)
2310              }              }
2311            }            }
2312    
2313            if (markptr != NULL) fprintf(outfile, "MK: %s\n", markptr);
2314    
2315          for (i = 0; i < 32; i++)          for (i = 0; i < 32; i++)
2316            {            {
2317            if ((copystrings & (1 << i)) != 0)            if ((copystrings & (1 << i)) != 0)
# Line 2337  while (!done) Line 2395  while (!done)
2395    
2396        else if (count == PCRE_ERROR_PARTIAL)        else if (count == PCRE_ERROR_PARTIAL)
2397          {          {
2398          fprintf(outfile, "Partial match");          if (markptr == NULL) fprintf(outfile, "Partial match");
2399  #if !defined NODFA            else fprintf(outfile, "Partial match, mark=%s", markptr);
2400          if ((all_use_dfa || use_dfa) && use_size_offsets > 2)          if (use_size_offsets > 1)
2401            fprintf(outfile, ": %.*s", use_offsets[1] - use_offsets[0],            {
2402              bptr + use_offsets[0]);            fprintf(outfile, ": ");
2403  #endif            pchars(bptr + use_offsets[0], use_offsets[1] - use_offsets[0],
2404                outfile);
2405              }
2406          fprintf(outfile, "\n");          fprintf(outfile, "\n");
2407          break;  /* Out of the /g loop */          break;  /* Out of the /g loop */
2408          }          }
# Line 2372  while (!done) Line 2432  while (!done)
2432              {              {
2433              int d;              int d;
2434              (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);              (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
2435              obits = (d == '\r')? PCRE_NEWLINE_CR :              /* Note that these values are always the ASCII ones, even in
2436                      (d == '\n')? PCRE_NEWLINE_LF :              EBCDIC environments. CR = 13, NL = 10. */
2437                      (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF :              obits = (d == 13)? PCRE_NEWLINE_CR :
2438                        (d == 10)? PCRE_NEWLINE_LF :
2439                        (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
2440                      (d == -2)? PCRE_NEWLINE_ANYCRLF :                      (d == -2)? PCRE_NEWLINE_ANYCRLF :
2441                      (d == -1)? PCRE_NEWLINE_ANY : 0;                      (d == -1)? PCRE_NEWLINE_ANY : 0;
2442              }              }
# Line 2401  while (!done) Line 2463  while (!done)
2463            {            {
2464            if (count == PCRE_ERROR_NOMATCH)            if (count == PCRE_ERROR_NOMATCH)
2465              {              {
2466              if (gmatched == 0) fprintf(outfile, "No match\n");              if (gmatched == 0)
2467                  {
2468                  if (markptr == NULL) fprintf(outfile, "No match\n");
2469                    else fprintf(outfile, "No match, mark = %s\n", markptr);
2470                  }
2471              }              }
2472            else fprintf(outfile, "Error %d\n", count);            else fprintf(outfile, "Error %d\n", count);
2473            break;  /* Out of the /g loop */            break;  /* Out of the /g loop */
# Line 2413  while (!done) Line 2479  while (!done)
2479        if (!do_g && !do_G) break;        if (!do_g && !do_G) break;
2480    
2481        /* If we have matched an empty string, first check to see if we are at        /* If we have matched an empty string, first check to see if we are at
2482        the end of the subject. If so, the /g loop is over. Otherwise, mimic        the end of the subject. If so, the /g loop is over. Otherwise, mimic what
2483        what Perl's /g options does. This turns out to be rather cunning. First        Perl's /g options does. This turns out to be rather cunning. First we set
2484        we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the        PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED and try the match again at the
2485        same point. If this fails (picked up above) we advance to the next        same point. If this fails (picked up above) we advance to the next
2486        character. */        character. */
2487    
# Line 2424  while (!done) Line 2490  while (!done)
2490        if (use_offsets[0] == use_offsets[1])        if (use_offsets[0] == use_offsets[1])
2491          {          {
2492          if (use_offsets[0] == len) break;          if (use_offsets[0] == len) break;
2493          g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;          g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
2494          }          }
2495    
2496        /* For /g, update the start offset, leaving the rest alone */        /* For /g, update the start offset, leaving the rest alone */

Legend:
Removed from v.376  
changed lines
  Added in v.535

  ViewVC Help
Powered by ViewVC 1.1.5