| 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 |
| 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 |
} |
} |
| 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 '<' |
| 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; |
| 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 |
|
|
| 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; |
| 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; |
| 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_UNGREEDY) != 0) cflags |= REG_UNGREEDY; |
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 |
|
|
| 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 |
| 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" : "", |
| 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 |
|
|
| 1649 |
{ |
{ |
| 1650 |
uschar *start_bits = NULL; |
uschar *start_bits = NULL; |
| 1651 |
int minlength; |
int minlength; |
| 1652 |
|
|
| 1653 |
new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength); |
new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength); |
| 1654 |
fprintf(outfile, "Subject length lower bound = %d\n", minlength); |
fprintf(outfile, "Subject length lower bound = %d\n", minlength); |
| 1655 |
|
|
| 1656 |
new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); |
new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); |
| 1657 |
if (start_bits == NULL) |
if (start_bits == NULL) |
| 1658 |
fprintf(outfile, "No set of starting bytes\n"); |
fprintf(outfile, "No set of starting bytes\n"); |
| 1996 |
case 'N': |
case 'N': |
| 1997 |
if ((options & PCRE_NOTEMPTY) != 0) |
if ((options & PCRE_NOTEMPTY) != 0) |
| 1998 |
options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART; |
options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART; |
| 1999 |
else |
else |
| 2000 |
options |= PCRE_NOTEMPTY; |
options |= PCRE_NOTEMPTY; |
| 2001 |
continue; |
continue; |
| 2002 |
|
|
| 2020 |
continue; |
continue; |
| 2021 |
|
|
| 2022 |
case 'P': |
case 'P': |
| 2023 |
options |= ((options & PCRE_PARTIAL_SOFT) == 0)? |
options |= ((options & PCRE_PARTIAL_SOFT) == 0)? |
| 2024 |
PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD; |
PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD; |
| 2025 |
continue; |
continue; |
| 2026 |
|
|
| 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; |
| 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) |
| 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 |
|
else fprintf(outfile, "Partial match, mark=%s", markptr); |
| 2400 |
if (use_size_offsets > 1) |
if (use_size_offsets > 1) |
| 2401 |
{ |
{ |
| 2402 |
fprintf(outfile, ": "); |
fprintf(outfile, ": "); |
| 2403 |
pchars(bptr + use_offsets[0], use_offsets[1] - use_offsets[0], |
pchars(bptr + use_offsets[0], use_offsets[1] - use_offsets[0], |
| 2404 |
outfile); |
outfile); |
| 2405 |
} |
} |
| 2406 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 2407 |
break; /* Out of the /g loop */ |
break; /* Out of the /g loop */ |
| 2408 |
} |
} |
| 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 */ |