| 112 |
external symbols to prevent clashes. */ |
external symbols to prevent clashes. */ |
| 113 |
|
|
| 114 |
#define _pcre_ucp_gentype ucp_gentype |
#define _pcre_ucp_gentype ucp_gentype |
| 115 |
|
#define _pcre_ucp_typerange ucp_typerange |
| 116 |
#define _pcre_utf8_table1 utf8_table1 |
#define _pcre_utf8_table1 utf8_table1 |
| 117 |
#define _pcre_utf8_table1_size utf8_table1_size |
#define _pcre_utf8_table1_size utf8_table1_size |
| 118 |
#define _pcre_utf8_table2 utf8_table2 |
#define _pcre_utf8_table2 utf8_table2 |
| 119 |
#define _pcre_utf8_table3 utf8_table3 |
#define _pcre_utf8_table3 utf8_table3 |
| 120 |
#define _pcre_utf8_table4 utf8_table4 |
#define _pcre_utf8_table4 utf8_table4 |
| 121 |
|
#define _pcre_utf8_char_sizes utf8_char_sizes |
| 122 |
#define _pcre_utt utt |
#define _pcre_utt utt |
| 123 |
#define _pcre_utt_size utt_size |
#define _pcre_utt_size utt_size |
| 124 |
#define _pcre_utt_names utt_names |
#define _pcre_utt_names utt_names |
| 581 |
#endif /* HAVE_STRERROR */ |
#endif /* HAVE_STRERROR */ |
| 582 |
|
|
| 583 |
|
|
| 584 |
|
/************************************************* |
| 585 |
|
* JIT memory callback * |
| 586 |
|
*************************************************/ |
| 587 |
|
|
| 588 |
|
static pcre_jit_stack* jit_callback(void *arg) |
| 589 |
|
{ |
| 590 |
|
return (pcre_jit_stack *)arg; |
| 591 |
|
} |
| 592 |
|
|
| 593 |
|
|
| 594 |
/************************************************* |
/************************************************* |
| 997 |
* Local malloc functions * |
* Local malloc functions * |
| 998 |
*************************************************/ |
*************************************************/ |
| 999 |
|
|
| 1000 |
/* Alternative malloc function, to test functionality and show the size of the |
/* Alternative malloc function, to test functionality and save the size of a |
| 1001 |
compiled re. */ |
compiled re. The show_malloc variable is set only during matching. */ |
| 1002 |
|
|
| 1003 |
static void *new_malloc(size_t size) |
static void *new_malloc(size_t size) |
| 1004 |
{ |
{ |
| 1016 |
free(block); |
free(block); |
| 1017 |
} |
} |
| 1018 |
|
|
|
|
|
| 1019 |
/* For recursion malloc/free, to test stacking calls */ |
/* For recursion malloc/free, to test stacking calls */ |
| 1020 |
|
|
| 1021 |
static void *stack_malloc(size_t size) |
static void *stack_malloc(size_t size) |
| 1204 |
#endif |
#endif |
| 1205 |
printf(" -q quiet: do not output PCRE version number at start\n"); |
printf(" -q quiet: do not output PCRE version number at start\n"); |
| 1206 |
printf(" -S <n> set stack size to <n> megabytes\n"); |
printf(" -S <n> set stack size to <n> megabytes\n"); |
| 1207 |
printf(" -s force each pattern to be studied\n" |
printf(" -s force each pattern to be studied at basic level\n" |
| 1208 |
|
" -s+ force each pattern to be studied, using JIT if available\n" |
| 1209 |
" -t time compilation and execution\n"); |
" -t time compilation and execution\n"); |
| 1210 |
printf(" -t <n> time compilation and execution, repeating <n> times\n"); |
printf(" -t <n> time compilation and execution, repeating <n> times\n"); |
| 1211 |
printf(" -tm time execution (matching) only\n"); |
printf(" -tm time execution (matching) only\n"); |
| 1233 |
int timeitm = 0; |
int timeitm = 0; |
| 1234 |
int showinfo = 0; |
int showinfo = 0; |
| 1235 |
int showstore = 0; |
int showstore = 0; |
| 1236 |
int force_study = 0; |
int force_study = -1; |
| 1237 |
|
int force_study_options = 0; |
| 1238 |
int quiet = 0; |
int quiet = 0; |
| 1239 |
int size_offsets = 45; |
int size_offsets = 45; |
| 1240 |
int size_offsets_max; |
int size_offsets_max; |
| 1248 |
int yield = 0; |
int yield = 0; |
| 1249 |
int stack_size; |
int stack_size; |
| 1250 |
|
|
| 1251 |
|
pcre_jit_stack *jit_stack = NULL; |
| 1252 |
|
|
| 1253 |
|
|
| 1254 |
/* These vectors store, end-to-end, a list of captured substring names. Assume |
/* These vectors store, end-to-end, a list of captured substring names. Assume |
| 1255 |
that 1024 is plenty long enough for the few names we'll be testing. */ |
that 1024 is plenty long enough for the few names we'll be testing. */ |
| 1256 |
|
|
| 1287 |
unsigned char *endptr; |
unsigned char *endptr; |
| 1288 |
|
|
| 1289 |
if (strcmp(argv[op], "-m") == 0) showstore = 1; |
if (strcmp(argv[op], "-m") == 0) showstore = 1; |
| 1290 |
else if (strcmp(argv[op], "-s") == 0) force_study = 1; |
else if (strcmp(argv[op], "-s") == 0) force_study = 0; |
| 1291 |
|
else if (strcmp(argv[op], "-s+") == 0) |
| 1292 |
|
{ |
| 1293 |
|
force_study = 1; |
| 1294 |
|
force_study_options = PCRE_STUDY_JIT_COMPILE; |
| 1295 |
|
} |
| 1296 |
else if (strcmp(argv[op], "-q") == 0) quiet = 1; |
else if (strcmp(argv[op], "-q") == 0) quiet = 1; |
| 1297 |
else if (strcmp(argv[op], "-b") == 0) debug = 1; |
else if (strcmp(argv[op], "-b") == 0) debug = 1; |
| 1298 |
else if (strcmp(argv[op], "-i") == 0) showinfo = 1; |
else if (strcmp(argv[op], "-i") == 0) showinfo = 1; |
| 1357 |
printf(" %sUTF-8 support\n", rc? "" : "No "); |
printf(" %sUTF-8 support\n", rc? "" : "No "); |
| 1358 |
(void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); |
(void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); |
| 1359 |
printf(" %sUnicode properties support\n", rc? "" : "No "); |
printf(" %sUnicode properties support\n", rc? "" : "No "); |
| 1360 |
|
(void)pcre_config(PCRE_CONFIG_JIT, &rc); |
| 1361 |
|
printf(" %sJust-in-time compiler support\n", rc? "" : "No "); |
| 1362 |
(void)pcre_config(PCRE_CONFIG_NEWLINE, &rc); |
(void)pcre_config(PCRE_CONFIG_NEWLINE, &rc); |
| 1363 |
/* Note that these values are always the ASCII values, even |
/* Note that these values are always the ASCII values, even |
| 1364 |
in EBCDIC environments. CR is 13 and NL is 10. */ |
in EBCDIC environments. CR is 13 and NL is 10. */ |
| 1559 |
{ |
{ |
| 1560 |
FAIL_READ: |
FAIL_READ: |
| 1561 |
fprintf(outfile, "Failed to read data from %s\n", p); |
fprintf(outfile, "Failed to read data from %s\n", p); |
| 1562 |
if (extra != NULL) new_free(extra); |
if (extra != NULL) pcre_free_study(extra); |
| 1563 |
if (re != NULL) new_free(re); |
if (re != NULL) new_free(re); |
| 1564 |
fclose(f); |
fclose(f); |
| 1565 |
continue; |
continue; |
| 1625 |
/* Look for options after final delimiter */ |
/* Look for options after final delimiter */ |
| 1626 |
|
|
| 1627 |
options = 0; |
options = 0; |
|
study_options = 0; |
|
| 1628 |
log_store = showstore; /* default from command line */ |
log_store = showstore; /* default from command line */ |
| 1629 |
|
|
| 1630 |
while (*pp != 0) |
while (*pp != 0) |
| 1661 |
#endif |
#endif |
| 1662 |
|
|
| 1663 |
case 'S': |
case 'S': |
| 1664 |
if (do_study == 0) do_study = 1; else |
if (do_study == 0) |
| 1665 |
|
{ |
| 1666 |
|
do_study = 1; |
| 1667 |
|
if (*pp == '+') |
| 1668 |
|
{ |
| 1669 |
|
study_options |= PCRE_STUDY_JIT_COMPILE; |
| 1670 |
|
pp++; |
| 1671 |
|
} |
| 1672 |
|
} |
| 1673 |
|
else |
| 1674 |
{ |
{ |
| 1675 |
do_study = 0; |
do_study = 0; |
| 1676 |
no_force_study = 1; |
no_force_study = 1; |
| 1865 |
suppresses the effect of /S (used for a few test patterns where studying is |
suppresses the effect of /S (used for a few test patterns where studying is |
| 1866 |
never sensible). */ |
never sensible). */ |
| 1867 |
|
|
| 1868 |
if (do_study || (force_study && !no_force_study)) |
if (do_study || (force_study >= 0 && !no_force_study)) |
| 1869 |
{ |
{ |
| 1870 |
if (timeit > 0) |
if (timeit > 0) |
| 1871 |
{ |
{ |
| 1873 |
clock_t time_taken; |
clock_t time_taken; |
| 1874 |
clock_t start_time = clock(); |
clock_t start_time = clock(); |
| 1875 |
for (i = 0; i < timeit; i++) |
for (i = 0; i < timeit; i++) |
| 1876 |
extra = pcre_study(re, study_options, &error); |
extra = pcre_study(re, study_options | force_study_options, &error); |
| 1877 |
time_taken = clock() - start_time; |
time_taken = clock() - start_time; |
| 1878 |
if (extra != NULL) free(extra); |
if (extra != NULL) pcre_free_study(extra); |
| 1879 |
fprintf(outfile, " Study time %.4f milliseconds\n", |
fprintf(outfile, " Study time %.4f milliseconds\n", |
| 1880 |
(((double)time_taken * 1000.0) / (double)timeit) / |
(((double)time_taken * 1000.0) / (double)timeit) / |
| 1881 |
(double)CLOCKS_PER_SEC); |
(double)CLOCKS_PER_SEC); |
| 1882 |
} |
} |
| 1883 |
extra = pcre_study(re, study_options, &error); |
extra = pcre_study(re, study_options | force_study_options, &error); |
| 1884 |
if (error != NULL) |
if (error != NULL) |
| 1885 |
fprintf(outfile, "Failed to study: %s\n", error); |
fprintf(outfile, "Failed to study: %s\n", error); |
| 1886 |
else if (extra != NULL) |
else if (extra != NULL) |
| 2108 |
when auto-callouts are involved, the output from runs with and without |
when auto-callouts are involved, the output from runs with and without |
| 2109 |
-s should be identical. */ |
-s should be identical. */ |
| 2110 |
|
|
| 2111 |
if (do_study || (force_study && showinfo && !no_force_study)) |
if (do_study || (force_study >= 0 && showinfo && !no_force_study)) |
| 2112 |
{ |
{ |
| 2113 |
if (extra == NULL) |
if (extra == NULL) |
| 2114 |
fprintf(outfile, "Study returned NULL\n"); |
fprintf(outfile, "Study returned NULL\n"); |
| 2152 |
fprintf(outfile, "\n"); |
fprintf(outfile, "\n"); |
| 2153 |
} |
} |
| 2154 |
} |
} |
| 2155 |
|
|
| 2156 |
|
/* Show this only if the JIT was set by /S, not by -s. */ |
| 2157 |
|
|
| 2158 |
|
if ((study_options & PCRE_STUDY_JIT_COMPILE) != 0) |
| 2159 |
|
{ |
| 2160 |
|
int jit; |
| 2161 |
|
new_info(re, extra, PCRE_INFO_JIT, &jit); |
| 2162 |
|
if (jit) |
| 2163 |
|
fprintf(outfile, "JIT study was successful\n"); |
| 2164 |
|
else |
| 2165 |
|
#ifdef SUPPORT_JIT |
| 2166 |
|
fprintf(outfile, "JIT study was not successful\n"); |
| 2167 |
|
#else |
| 2168 |
|
fprintf(outfile, "JIT support is not available in this version of PCRE\n"); |
| 2169 |
|
#endif |
| 2170 |
|
} |
| 2171 |
} |
} |
| 2172 |
} |
} |
| 2173 |
|
|
| 2221 |
} |
} |
| 2222 |
|
|
| 2223 |
new_free(re); |
new_free(re); |
| 2224 |
if (extra != NULL) new_free(extra); |
if (extra != NULL) pcre_free_study(extra); |
| 2225 |
if (locale_set) |
if (locale_set) |
| 2226 |
{ |
{ |
| 2227 |
new_free((void *)tables); |
new_free((void *)tables); |
| 2488 |
getnamesptr = npp; |
getnamesptr = npp; |
| 2489 |
} |
} |
| 2490 |
continue; |
continue; |
| 2491 |
|
|
| 2492 |
|
case 'J': |
| 2493 |
|
while(isdigit(*p)) n = n * 10 + *p++ - '0'; |
| 2494 |
|
if (extra != NULL |
| 2495 |
|
&& (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 |
| 2496 |
|
&& extra->executable_jit != NULL) |
| 2497 |
|
{ |
| 2498 |
|
if (jit_stack != NULL) pcre_jit_stack_free(jit_stack); |
| 2499 |
|
jit_stack = pcre_jit_stack_alloc(1, n * 1024); |
| 2500 |
|
pcre_assign_jit_callback(extra, jit_callback, jit_stack); |
| 2501 |
|
} |
| 2502 |
|
continue; |
| 2503 |
|
|
| 2504 |
case 'L': |
case 'L': |
| 2505 |
getlist = 1; |
getlist = 1; |
| 2711 |
|
|
| 2712 |
/* If find_match_limit is set, we want to do repeated matches with |
/* If find_match_limit is set, we want to do repeated matches with |
| 2713 |
varying limits in order to find the minimum value for the match limit and |
varying limits in order to find the minimum value for the match limit and |
| 2714 |
for the recursion limit. */ |
for the recursion limit. The match limits are relevant only to the normal |
| 2715 |
|
running of pcre_exec(), so disable the JIT optimization. This makes it |
| 2716 |
|
possible to run the same set of tests with and without JIT externally |
| 2717 |
|
requested. */ |
| 2718 |
|
|
| 2719 |
if (find_match_limit) |
if (find_match_limit) |
| 2720 |
{ |
{ |
| 2723 |
extra = (pcre_extra *)malloc(sizeof(pcre_extra)); |
extra = (pcre_extra *)malloc(sizeof(pcre_extra)); |
| 2724 |
extra->flags = 0; |
extra->flags = 0; |
| 2725 |
} |
} |
| 2726 |
|
else extra->flags &= ~PCRE_EXTRA_EXECUTABLE_JIT; |
| 2727 |
|
|
| 2728 |
(void)check_match_limit(re, extra, bptr, len, start_offset, |
(void)check_match_limit(re, extra, bptr, len, start_offset, |
| 2729 |
options|g_notempty, use_offsets, use_size_offsets, |
options|g_notempty, use_offsets, use_size_offsets, |
| 2730 |
PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit), |
PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit), |
| 2922 |
fprintf(outfile, "%2dL %s\n", i, stringlist[i]); |
fprintf(outfile, "%2dL %s\n", i, stringlist[i]); |
| 2923 |
if (stringlist[i] != NULL) |
if (stringlist[i] != NULL) |
| 2924 |
fprintf(outfile, "string list not terminated by NULL\n"); |
fprintf(outfile, "string list not terminated by NULL\n"); |
|
/* free((void *)stringlist); */ |
|
| 2925 |
pcre_free_substring_list(stringlist); |
pcre_free_substring_list(stringlist); |
| 2926 |
} |
} |
| 2927 |
} |
} |
| 3072 |
#endif |
#endif |
| 3073 |
|
|
| 3074 |
if (re != NULL) new_free(re); |
if (re != NULL) new_free(re); |
| 3075 |
if (extra != NULL) new_free(extra); |
if (extra != NULL) pcre_free_study(extra); |
| 3076 |
if (locale_set) |
if (locale_set) |
| 3077 |
{ |
{ |
| 3078 |
new_free((void *)tables); |
new_free((void *)tables); |
| 3079 |
setlocale(LC_CTYPE, "C"); |
setlocale(LC_CTYPE, "C"); |
| 3080 |
locale_set = 0; |
locale_set = 0; |
| 3081 |
} |
} |
| 3082 |
|
if (jit_stack != NULL) |
| 3083 |
|
{ |
| 3084 |
|
pcre_jit_stack_free(jit_stack); |
| 3085 |
|
jit_stack = NULL; |
| 3086 |
|
} |
| 3087 |
} |
} |
| 3088 |
|
|
| 3089 |
if (infile == stdin) fprintf(outfile, "\n"); |
if (infile == stdin) fprintf(outfile, "\n"); |