Guard clause should happen first, otherwise its not a guard clause.
[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
97f88e98 22END_EXTERN_C
23
2980942b 24/* engine details need to be paired - non debugging, debuggin */
25#define NEEDS_DEBUGGING 0x01
0a28d81c 26struct regexp_engine {
27 regexp* (*regcomp) (pTHX_ char* exp, char* xend, PMOP* pm);
28 I32 (*regexec) (pTHX_ regexp* prog, char* stringarg, char* strend,
29 char* strbeg, I32 minend, SV* screamer,
30 void* data, U32 flags);
31 char* (*re_intuit_start) (pTHX_ regexp *prog, SV *sv, char *strpos,
32 char *strend, U32 flags,
33 struct re_scream_pos_data_s *data);
34 SV* (*re_intuit_string) (pTHX_ regexp *prog);
35 void (*regfree) (pTHX_ struct regexp* r);
0a28d81c 36};
37
38struct regexp_engine engines[] = {
39 { Perl_pregcomp, Perl_regexec_flags, Perl_re_intuit_start,
2980942b 40 Perl_re_intuit_string, Perl_pregfree },
0a28d81c 41 { my_regcomp, my_regexec, my_re_intuit_start, my_re_intuit_string,
2980942b 42 my_regfree }
0a28d81c 43};
44
df3728a2 45#define MY_CXT_KEY "re::_guts" XS_VERSION
89ca4ac7 46
47typedef struct {
48 int x_oldflag; /* debug flag */
1839d50f 49 unsigned int x_state;
89ca4ac7 50} my_cxt_t;
51
52START_MY_CXT
53
54#define oldflag (MY_CXT.x_oldflag)
56953603 55
56953603 56static void
1839d50f 57install(pTHX_ unsigned int new_state)
56953603 58{
89ca4ac7 59 dMY_CXT;
0a28d81c 60 const unsigned int states
61 = sizeof(engines) / sizeof(struct regexp_engine) -1;
1839d50f 62 if(new_state == MY_CXT.x_state)
63 return;
64
0a28d81c 65 if (new_state > states) {
66 Perl_croak(aTHX_ "panic: re::install state %u is illegal - max is %u",
67 new_state, states);
68 }
69
70 PL_regexecp = engines[new_state].regexec;
71 PL_regcompp = engines[new_state].regcomp;
72 PL_regint_start = engines[new_state].re_intuit_start;
73 PL_regint_string = engines[new_state].re_intuit_string;
74 PL_regfree = engines[new_state].regfree;
75
2980942b 76 if (new_state & NEEDS_DEBUGGING) {
1839d50f 77 PL_colorset = 0; /* Allow reinspection of ENV. */
2980942b 78 if (!(MY_CXT.x_state & NEEDS_DEBUGGING)) {
0a28d81c 79 /* Debugging is turned on for the first time. */
80 oldflag = PL_debug & DEBUG_r_FLAG;
81 PL_debug |= DEBUG_r_FLAG;
82 }
1839d50f 83 } else {
2980942b 84 if (!(MY_CXT.x_state & NEEDS_DEBUGGING)) {
0a28d81c 85 if (!oldflag)
86 PL_debug &= ~DEBUG_r_FLAG;
87 }
1839d50f 88 }
89
90 MY_CXT.x_state = new_state;
56953603 91}
92
93MODULE = re PACKAGE = re
94
89ca4ac7 95BOOT:
96{
97 MY_CXT_INIT;
98}
99
100
56953603 101void
1839d50f 102install(new_state)
103 unsigned int new_state;
cea2e8a9 104 CODE:
1839d50f 105 install(aTHX_ new_state);