New perldelta for 5.29.7
[perl.git] / ext / re / re.xs
1 #if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
2 #  define DEBUGGING
3 #  define DEBUGGING_RE_ONLY
4 #endif
5
6 #define PERL_NO_GET_CONTEXT
7 #include "EXTERN.h"
8 #include "perl.h"
9 #include "XSUB.h"
10 #include "re_comp.h"
11
12 #undef dXSBOOTARGSXSAPIVERCHK
13 /* skip API version checking due to different interp struct size but,
14    this hack is until #123007 is resolved */
15 #define dXSBOOTARGSXSAPIVERCHK dXSBOOTARGSNOVERCHK
16
17 START_EXTERN_C
18
19 extern REGEXP*  my_re_compile (pTHX_ SV * const pattern, const U32 pm_flags);
20 extern REGEXP*  my_re_op_compile (pTHX_ SV ** const patternp, int pat_count,
21                     OP *expr, const regexp_engine* eng, REGEXP *volatile old_re,
22                      bool *is_bare_re, U32 rx_flags, U32 pm_flags);
23
24 extern I32      my_regexec (pTHX_ REGEXP * const prog, char* stringarg, char* strend,
25                             char* strbeg, SSize_t minend, SV* screamer,
26                             void* data, U32 flags);
27
28 extern char*    my_re_intuit_start(pTHX_
29                     REGEXP * const rx,
30                     SV *sv,
31                     const char * const strbeg,
32                     char *strpos,
33                     char *strend,
34                     const U32 flags,
35                     re_scream_pos_data *data);
36
37 extern SV*      my_re_intuit_string (pTHX_ REGEXP * const prog);
38
39 extern void     my_regfree (pTHX_ REGEXP * const r);
40
41 extern void     my_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren,
42                                            SV * const usesv);
43 extern void     my_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
44                                            SV const * const value);
45 extern I32      my_reg_numbered_buff_length(pTHX_ REGEXP * const rx,
46                                             const SV * const sv, const I32 paren);
47
48 extern SV*      my_reg_named_buff(pTHX_ REGEXP * const, SV * const, SV * const,
49                               const U32);
50 extern SV*      my_reg_named_buff_iter(pTHX_ REGEXP * const rx,
51                                    const SV * const lastkey, const U32 flags);
52
53 extern SV*      my_reg_qr_package(pTHX_ REGEXP * const rx);
54 #if defined(USE_ITHREADS)
55 extern void*    my_regdupe (pTHX_ REGEXP * const r, CLONE_PARAMS *param);
56 #endif
57
58 EXTERN_C const struct regexp_engine my_reg_engine;
59
60 END_EXTERN_C
61
62 const struct regexp_engine my_reg_engine = { 
63         my_re_compile, 
64         my_regexec, 
65         my_re_intuit_start, 
66         my_re_intuit_string, 
67         my_regfree, 
68         my_reg_numbered_buff_fetch,
69         my_reg_numbered_buff_store,
70         my_reg_numbered_buff_length,
71         my_reg_named_buff,
72         my_reg_named_buff_iter,
73         my_reg_qr_package,
74 #if defined(USE_ITHREADS)
75         my_regdupe,
76 #endif
77         my_re_op_compile,
78 };
79
80 MODULE = re     PACKAGE = re
81
82 void
83 install()
84     PPCODE:
85         PL_colorset = 0;        /* Allow reinspection of ENV. */
86         /* PL_debug |= DEBUG_r_FLAG; */
87         XPUSHs(sv_2mortal(newSViv(PTR2IV(&my_reg_engine))));
88
89 void
90 regmust(sv)
91     SV * sv
92 PROTOTYPE: $
93 PREINIT:
94     REGEXP *re;
95 PPCODE:
96 {
97     if ((re = SvRX(sv)) /* assign deliberate */
98        /* only for re engines we know about */
99        && (RX_ENGINE(re) == &my_reg_engine
100            || RX_ENGINE(re) == &PL_core_reg_engine))
101     {
102         SV *an = &PL_sv_no;
103         SV *fl = &PL_sv_no;
104         if (RX_ANCHORED_SUBSTR(re)) {
105             an = sv_2mortal(newSVsv(RX_ANCHORED_SUBSTR(re)));
106         } else if (RX_ANCHORED_UTF8(re)) {
107             an = sv_2mortal(newSVsv(RX_ANCHORED_UTF8(re)));
108         }
109         if (RX_FLOAT_SUBSTR(re)) {
110             fl = sv_2mortal(newSVsv(RX_FLOAT_SUBSTR(re)));
111         } else if (RX_FLOAT_UTF8(re)) {
112             fl = sv_2mortal(newSVsv(RX_FLOAT_UTF8(re)));
113         }
114         EXTEND(SP, 2);
115         PUSHs(an);
116         PUSHs(fl);
117         XSRETURN(2);
118     }
119     XSRETURN_UNDEF;
120 }
121