1 #if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
5 #define PERL_NO_GET_CONTEXT
12 extern regexp* my_regcomp (pTHX_ char* exp, char* xend, PMOP* pm);
13 extern I32 my_regexec (pTHX_ regexp* prog, char* stringarg, char* strend,
14 char* strbeg, I32 minend, SV* screamer,
15 void* data, U32 flags);
16 extern void my_regfree (pTHX_ struct regexp* r);
17 extern char* my_re_intuit_start (pTHX_ regexp *prog, SV *sv, char *strpos,
18 char *strend, U32 flags,
19 struct re_scream_pos_data_s *data);
20 extern SV* my_re_intuit_string (pTHX_ regexp *prog);
22 extern regexp* my_regdupe (pTHX_ regexp *r, CLONE_PARAMS *param);
27 /* engine details need to be paired - non debugging, debuggin */
28 #define NEEDS_DEBUGGING 0x01
29 struct regexp_engine {
30 regexp* (*regcomp) (pTHX_ char* exp, char* xend, PMOP* pm);
31 I32 (*regexec) (pTHX_ regexp* prog, char* stringarg, char* strend,
32 char* strbeg, I32 minend, SV* screamer,
33 void* data, U32 flags);
34 char* (*re_intuit_start) (pTHX_ regexp *prog, SV *sv, char *strpos,
35 char *strend, U32 flags,
36 struct re_scream_pos_data_s *data);
37 SV* (*re_intuit_string) (pTHX_ regexp *prog);
38 void (*regfree) (pTHX_ struct regexp* r);
39 #if defined(USE_ITHREADS)
40 regexp* (*regdupe) (pTHX_ regexp *r, CLONE_PARAMS *param);
44 struct regexp_engine engines[] = {
45 { Perl_pregcomp, Perl_regexec_flags, Perl_re_intuit_start,
46 Perl_re_intuit_string, Perl_pregfree
47 #if defined(USE_ITHREADS)
51 { my_regcomp, my_regexec, my_re_intuit_start, my_re_intuit_string,
53 #if defined(USE_ITHREADS)
59 #define MY_CXT_KEY "re::_guts" XS_VERSION
62 int x_oldflag; /* debug flag */
68 #define oldflag (MY_CXT.x_oldflag)
71 install(pTHX_ unsigned int new_state)
74 const unsigned int states
75 = sizeof(engines) / sizeof(struct regexp_engine) -1;
76 if(new_state == MY_CXT.x_state)
79 if (new_state > states) {
80 Perl_croak(aTHX_ "panic: re::install state %u is illegal - max is %u",
84 PL_regexecp = engines[new_state].regexec;
85 PL_regcompp = engines[new_state].regcomp;
86 PL_regint_start = engines[new_state].re_intuit_start;
87 PL_regint_string = engines[new_state].re_intuit_string;
88 PL_regfree = engines[new_state].regfree;
89 #if defined(USE_ITHREADS)
90 PL_regdupe = engines[new_state].regdupe;
93 if (new_state & NEEDS_DEBUGGING) {
94 PL_colorset = 0; /* Allow reinspection of ENV. */
95 if (!(MY_CXT.x_state & NEEDS_DEBUGGING)) {
96 /* Debugging is turned on for the first time. */
97 oldflag = PL_debug & DEBUG_r_FLAG;
98 PL_debug |= DEBUG_r_FLAG;
101 if (!(MY_CXT.x_state & NEEDS_DEBUGGING)) {
103 PL_debug &= ~DEBUG_r_FLAG;
107 MY_CXT.x_state = new_state;
110 MODULE = re PACKAGE = re
120 unsigned int new_state;
122 install(aTHX_ new_state);