| 189 |
static int show_malloc; |
static int show_malloc; |
| 190 |
static int use_utf8; |
static int use_utf8; |
| 191 |
static size_t gotten_store; |
static size_t gotten_store; |
| 192 |
|
static const unsigned char *last_callout_mark = NULL; |
| 193 |
|
|
| 194 |
/* The buffers grow automatically if very long input lines are encountered. */ |
/* The buffers grow automatically if very long input lines are encountered. */ |
| 195 |
|
|
| 226 |
"not used - internal error", |
"not used - internal error", |
| 227 |
"invalid combination of newline options", |
"invalid combination of newline options", |
| 228 |
"bad offset value", |
"bad offset value", |
| 229 |
NULL /* SHORTUTF8 is handled specially */ |
NULL, /* SHORTUTF8 is handled specially */ |
| 230 |
|
"nested recursion at the same subject position" |
| 231 |
}; |
}; |
| 232 |
|
|
| 233 |
|
|
| 961 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 962 |
first_callout = 0; |
first_callout = 0; |
| 963 |
|
|
| 964 |
|
if (cb->mark != last_callout_mark) |
| 965 |
|
{ |
| 966 |
|
fprintf(outfile, "Latest Mark: %s\n", |
| 967 |
|
(cb->mark == NULL)? "<unset>" : (char *)(cb->mark)); |
| 968 |
|
last_callout_mark = cb->mark; |
| 969 |
|
} |
| 970 |
|
|
| 971 |
if (cb->callout_data != NULL) |
if (cb->callout_data != NULL) |
| 972 |
{ |
{ |
| 973 |
int callout_data = *((int *)(cb->callout_data)); |
int callout_data = *((int *)(cb->callout_data)); |
| 1307 |
((stack_size = get_value((unsigned char *)argv[op+1], &endptr)), |
((stack_size = get_value((unsigned char *)argv[op+1], &endptr)), |
| 1308 |
*endptr == 0)) |
*endptr == 0)) |
| 1309 |
{ |
{ |
| 1310 |
#if defined(_WIN32) || defined(WIN32) |
#if defined(_WIN32) || defined(WIN32) || defined(__minix) |
| 1311 |
printf("PCRE: -S not supported on this OS\n"); |
printf("PCRE: -S not supported on this OS\n"); |
| 1312 |
exit(1); |
exit(1); |
| 1313 |
#else |
#else |
| 1443 |
const unsigned char *tables = NULL; |
const unsigned char *tables = NULL; |
| 1444 |
unsigned long int true_size, true_study_size = 0; |
unsigned long int true_size, true_study_size = 0; |
| 1445 |
size_t size, regex_gotten_store; |
size_t size, regex_gotten_store; |
| 1446 |
|
int do_allcaps = 0; |
| 1447 |
int do_mark = 0; |
int do_mark = 0; |
| 1448 |
int do_study = 0; |
int do_study = 0; |
| 1449 |
|
int no_force_study = 0; |
| 1450 |
int do_debug = debug; |
int do_debug = debug; |
| 1451 |
int do_G = 0; |
int do_G = 0; |
| 1452 |
int do_g = 0; |
int do_g = 0; |
| 1453 |
int do_showinfo = showinfo; |
int do_showinfo = showinfo; |
| 1454 |
int do_showrest = 0; |
int do_showrest = 0; |
| 1455 |
|
int do_showcaprest = 0; |
| 1456 |
int do_flip = 0; |
int do_flip = 0; |
| 1457 |
int erroroffset, len, delimiter, poffset; |
int erroroffset, len, delimiter, poffset; |
| 1458 |
|
|
| 1514 |
} |
} |
| 1515 |
} |
} |
| 1516 |
|
|
| 1517 |
fprintf(outfile, "Compiled regex%s loaded from %s\n", |
fprintf(outfile, "Compiled pattern%s loaded from %s\n", |
| 1518 |
do_flip? " (byte-inverted)" : "", p); |
do_flip? " (byte-inverted)" : "", p); |
| 1519 |
|
|
| 1520 |
/* Need to know if UTF-8 for printing data strings */ |
/* Need to know if UTF-8 for printing data strings */ |
| 1522 |
new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options); |
new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options); |
| 1523 |
use_utf8 = (get_options & PCRE_UTF8) != 0; |
use_utf8 = (get_options & PCRE_UTF8) != 0; |
| 1524 |
|
|
| 1525 |
/* Now see if there is any following study data */ |
/* Now see if there is any following study data. */ |
| 1526 |
|
|
| 1527 |
if (true_study_size != 0) |
if (true_study_size != 0) |
| 1528 |
{ |
{ |
| 1618 |
case 's': options |= PCRE_DOTALL; break; |
case 's': options |= PCRE_DOTALL; break; |
| 1619 |
case 'x': options |= PCRE_EXTENDED; break; |
case 'x': options |= PCRE_EXTENDED; break; |
| 1620 |
|
|
| 1621 |
case '+': do_showrest = 1; break; |
case '+': |
| 1622 |
|
if (do_showrest) do_showcaprest = 1; else do_showrest = 1; |
| 1623 |
|
break; |
| 1624 |
|
|
| 1625 |
|
case '=': do_allcaps = 1; break; |
| 1626 |
case 'A': options |= PCRE_ANCHORED; break; |
case 'A': options |= PCRE_ANCHORED; break; |
| 1627 |
case 'B': do_debug = 1; break; |
case 'B': do_debug = 1; break; |
| 1628 |
case 'C': options |= PCRE_AUTO_CALLOUT; break; |
case 'C': options |= PCRE_AUTO_CALLOUT; break; |
| 1640 |
case 'P': do_posix = 1; break; |
case 'P': do_posix = 1; break; |
| 1641 |
#endif |
#endif |
| 1642 |
|
|
| 1643 |
case 'S': do_study = 1; break; |
case 'S': |
| 1644 |
|
if (do_study == 0) do_study = 1; else |
| 1645 |
|
{ |
| 1646 |
|
do_study = 0; |
| 1647 |
|
no_force_study = 1; |
| 1648 |
|
} |
| 1649 |
|
break; |
| 1650 |
|
|
| 1651 |
case 'U': options |= PCRE_UNGREEDY; break; |
case 'U': options |= PCRE_UNGREEDY; break; |
| 1652 |
case 'W': options |= PCRE_UCP; break; |
case 'W': options |= PCRE_UCP; break; |
| 1653 |
case 'X': options |= PCRE_EXTRA; break; |
case 'X': options |= PCRE_EXTRA; break; |
| 1831 |
true_size = ((real_pcre *)re)->size; |
true_size = ((real_pcre *)re)->size; |
| 1832 |
regex_gotten_store = gotten_store; |
regex_gotten_store = gotten_store; |
| 1833 |
|
|
| 1834 |
/* If -s or /S was present, study the regexp to generate additional info to |
/* If -s or /S was present, study the regex to generate additional info to |
| 1835 |
help with the matching. */ |
help with the matching, unless the pattern has the SS option, which |
| 1836 |
|
suppresses the effect of /S (used for a few test patterns where studying is |
| 1837 |
|
never sensible). */ |
| 1838 |
|
|
| 1839 |
if (do_study || force_study) |
if (do_study || (force_study && !no_force_study)) |
| 1840 |
{ |
{ |
| 1841 |
if (timeit > 0) |
if (timeit > 0) |
| 1842 |
{ |
{ |
| 2074 |
/* Don't output study size; at present it is in any case a fixed |
/* Don't output study size; at present it is in any case a fixed |
| 2075 |
value, but it varies, depending on the computer architecture, and |
value, but it varies, depending on the computer architecture, and |
| 2076 |
so messes up the test suite. (And with the /F option, it might be |
so messes up the test suite. (And with the /F option, it might be |
| 2077 |
flipped.) */ |
flipped.) If study was forced by an external -s, don't show this |
| 2078 |
|
information unless -i or -d was also present. This means that, except |
| 2079 |
|
when auto-callouts are involved, the output from runs with and without |
| 2080 |
|
-s should be identical. */ |
| 2081 |
|
|
| 2082 |
if (do_study || force_study) |
if (do_study || (force_study && showinfo && !no_force_study)) |
| 2083 |
{ |
{ |
| 2084 |
if (extra == NULL) |
if (extra == NULL) |
| 2085 |
fprintf(outfile, "Study returned NULL\n"); |
fprintf(outfile, "Study returned NULL\n"); |
| 2157 |
} |
} |
| 2158 |
else |
else |
| 2159 |
{ |
{ |
| 2160 |
fprintf(outfile, "Compiled regex written to %s\n", to_file); |
fprintf(outfile, "Compiled pattern written to %s\n", to_file); |
| 2161 |
|
|
| 2162 |
|
/* If there is study data, write it, but verify the writing only |
| 2163 |
|
if the studying was requested by /S, not just by -s. */ |
| 2164 |
|
|
| 2165 |
if (extra != NULL) |
if (extra != NULL) |
| 2166 |
{ |
{ |
| 2167 |
if (fwrite(extra->study_data, 1, true_study_size, f) < |
if (fwrite(extra->study_data, 1, true_study_size, f) < |
| 2171 |
strerror(errno)); |
strerror(errno)); |
| 2172 |
} |
} |
| 2173 |
else fprintf(outfile, "Study data written to %s\n", to_file); |
else fprintf(outfile, "Study data written to %s\n", to_file); |
|
|
|
| 2174 |
} |
} |
| 2175 |
} |
} |
| 2176 |
fclose(f); |
fclose(f); |
| 2219 |
|
|
| 2220 |
pcre_callout = callout; |
pcre_callout = callout; |
| 2221 |
first_callout = 1; |
first_callout = 1; |
| 2222 |
|
last_callout_mark = NULL; |
| 2223 |
callout_extra = 0; |
callout_extra = 0; |
| 2224 |
callout_count = 0; |
callout_count = 0; |
| 2225 |
callout_fail_count = 999999; |
callout_fail_count = 999999; |
| 2603 |
(void)pchars(dbuffer + pmatch[i].rm_so, |
(void)pchars(dbuffer + pmatch[i].rm_so, |
| 2604 |
pmatch[i].rm_eo - pmatch[i].rm_so, outfile); |
pmatch[i].rm_eo - pmatch[i].rm_so, outfile); |
| 2605 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 2606 |
if (i == 0 && do_showrest) |
if (do_showcaprest || (i == 0 && do_showrest)) |
| 2607 |
{ |
{ |
| 2608 |
fprintf(outfile, " 0+ "); |
fprintf(outfile, "%2d+ ", (int)i); |
| 2609 |
(void)pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, |
(void)pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, |
| 2610 |
outfile); |
outfile); |
| 2611 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 2746 |
do_g = do_G = FALSE; /* Break g/G loop */ |
do_g = do_G = FALSE; /* Break g/G loop */ |
| 2747 |
} |
} |
| 2748 |
} |
} |
| 2749 |
|
|
| 2750 |
|
/* do_allcaps requests showing of all captures in the pattern, to check |
| 2751 |
|
unset ones at the end. */ |
| 2752 |
|
|
| 2753 |
|
if (do_allcaps) |
| 2754 |
|
{ |
| 2755 |
|
new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count); |
| 2756 |
|
count++; /* Allow for full match */ |
| 2757 |
|
if (count * 2 > use_size_offsets) count = use_size_offsets/2; |
| 2758 |
|
} |
| 2759 |
|
|
| 2760 |
|
/* Output the captured substrings */ |
| 2761 |
|
|
| 2762 |
for (i = 0; i < count * 2; i += 2) |
for (i = 0; i < count * 2; i += 2) |
| 2763 |
{ |
{ |
| 2764 |
if (use_offsets[i] < 0) |
if (use_offsets[i] < 0) |
| 2765 |
|
{ |
| 2766 |
|
if (use_offsets[i] != -1) |
| 2767 |
|
fprintf(outfile, "ERROR: bad negative value %d for offset %d\n", |
| 2768 |
|
use_offsets[i], i); |
| 2769 |
|
if (use_offsets[i+1] != -1) |
| 2770 |
|
fprintf(outfile, "ERROR: bad negative value %d for offset %d\n", |
| 2771 |
|
use_offsets[i+1], i+1); |
| 2772 |
fprintf(outfile, "%2d: <unset>\n", i/2); |
fprintf(outfile, "%2d: <unset>\n", i/2); |
| 2773 |
|
} |
| 2774 |
else |
else |
| 2775 |
{ |
{ |
| 2776 |
fprintf(outfile, "%2d: ", i/2); |
fprintf(outfile, "%2d: ", i/2); |
| 2777 |
(void)pchars(bptr + use_offsets[i], |
(void)pchars(bptr + use_offsets[i], |
| 2778 |
use_offsets[i+1] - use_offsets[i], outfile); |
use_offsets[i+1] - use_offsets[i], outfile); |
| 2779 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 2780 |
if (i == 0) |
if (do_showcaprest || (i == 0 && do_showrest)) |
| 2781 |
{ |
{ |
| 2782 |
if (do_showrest) |
fprintf(outfile, "%2d+ ", i/2); |
| 2783 |
{ |
(void)pchars(bptr + use_offsets[i+1], len - use_offsets[i+1], |
| 2784 |
fprintf(outfile, " 0+ "); |
outfile); |
| 2785 |
(void)pchars(bptr + use_offsets[i+1], len - use_offsets[i+1], |
fprintf(outfile, "\n"); |
|
outfile); |
|
|
fprintf(outfile, "\n"); |
|
|
} |
|
| 2786 |
} |
} |
| 2787 |
} |
} |
| 2788 |
} |
} |