Automate generation of the regmatch() state constants
[p5sagit/p5-mst-13.2.git] / ext / re / re.xs
CommitLineData
41b16711 1#if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
2# define DEBUGGING
3#endif
4
c5be433b 5#define PERL_NO_GET_CONTEXT
56953603 6#include "EXTERN.h"
7#include "perl.h"
8#include "XSUB.h"
9
97f88e98 10START_EXTERN_C
11
cea2e8a9 12extern regexp* my_regcomp (pTHX_ char* exp, char* xend, PMOP* pm);
13extern I32 my_regexec (pTHX_ regexp* prog, char* stringarg, char* strend,
20ce7b12 14 char* strbeg, I32 minend, SV* screamer,
15 void* data, U32 flags);
f722798b 16extern void my_regfree (pTHX_ struct regexp* r);
17extern 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);
20extern SV* my_re_intuit_string (pTHX_ regexp *prog);
56953603 21
84da74a7 22extern regexp* my_regdupe (pTHX_ regexp *r, CLONE_PARAMS *param);
23
24
97f88e98 25END_EXTERN_C
26
2980942b 27/* engine details need to be paired - non debugging, debuggin */
28#define NEEDS_DEBUGGING 0x01
0a28d81c 29struct 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);
84da74a7 39 regexp* (*regdupe) (pTHX_ regexp *r, CLONE_PARAMS *param);
0a28d81c 40};
41
42struct regexp_engine engines[] = {
43 { Perl_pregcomp, Perl_regexec_flags, Perl_re_intuit_start,
84da74a7 44 Perl_re_intuit_string, Perl_pregfree, Perl_regdupe },
0a28d81c 45 { my_regcomp, my_regexec, my_re_intuit_start, my_re_intuit_string,
84da74a7 46 my_regfree, my_regdupe }
0a28d81c 47};
48
df3728a2 49#define MY_CXT_KEY "re::_guts" XS_VERSION
89ca4ac7 50
51typedef struct {
52 int x_oldflag; /* debug flag */
1839d50f 53 unsigned int x_state;
89ca4ac7 54} my_cxt_t;
55
56START_MY_CXT
57
58#define oldflag (MY_CXT.x_oldflag)
56953603 59
56953603 60static void
1839d50f 61install(pTHX_ unsigned int new_state)
56953603 62{
89ca4ac7 63 dMY_CXT;
0a28d81c 64 const unsigned int states
65 = sizeof(engines) / sizeof(struct regexp_engine) -1;
1839d50f 66 if(new_state == MY_CXT.x_state)
67 return;
68
0a28d81c 69 if (new_state > states) {
70 Perl_croak(aTHX_ "panic: re::install state %u is illegal - max is %u",
71 new_state, states);
72 }
73
74 PL_regexecp = engines[new_state].regexec;
75 PL_regcompp = engines[new_state].regcomp;
76 PL_regint_start = engines[new_state].re_intuit_start;
77 PL_regint_string = engines[new_state].re_intuit_string;
78 PL_regfree = engines[new_state].regfree;
84da74a7 79 PL_regdupe = engines[new_state].regdupe;
0a28d81c 80
2980942b 81 if (new_state & NEEDS_DEBUGGING) {
1839d50f 82 PL_colorset = 0; /* Allow reinspection of ENV. */
2980942b 83 if (!(MY_CXT.x_state & NEEDS_DEBUGGING)) {
0a28d81c 84 /* Debugging is turned on for the first time. */
85 oldflag = PL_debug & DEBUG_r_FLAG;
86 PL_debug |= DEBUG_r_FLAG;
87 }
1839d50f 88 } else {
2980942b 89 if (!(MY_CXT.x_state & NEEDS_DEBUGGING)) {
0a28d81c 90 if (!oldflag)
91 PL_debug &= ~DEBUG_r_FLAG;
92 }
1839d50f 93 }
94
95 MY_CXT.x_state = new_state;
56953603 96}
97
98MODULE = re PACKAGE = re
99
89ca4ac7 100BOOT:
101{
102 MY_CXT_INIT;
103}
104
105
56953603 106void
1839d50f 107install(new_state)
108 unsigned int new_state;
cea2e8a9 109 CODE:
1839d50f 110 install(aTHX_ new_state);