This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Improve -Dr output of bracketed char classes
[perl5.git] / ext / re / re.xs
CommitLineData
41b16711
AD
1#if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
2# define DEBUGGING
3#endif
4
c5be433b 5#define PERL_NO_GET_CONTEXT
56953603
IZ
6#include "EXTERN.h"
7#include "perl.h"
8#include "XSUB.h"
256ddcd0 9#include "re_comp.h"
56953603 10
f9f4320a 11
97f88e98
JH
12START_EXTERN_C
13
88e52f1c 14extern REGEXP* my_re_compile (pTHX_ SV * const pattern, const U32 pm_flags);
3c13cae6
DM
15extern REGEXP* my_re_op_compile (pTHX_ SV ** const patternp, int pat_count,
16 OP *expr, const regexp_engine* eng, REGEXP *VOL old_re,
f8ff62a0 17 bool *is_bare_re, U32 rx_flags, U32 pm_flags);
3c13cae6 18
49d7dfbc 19extern I32 my_regexec (pTHX_ REGEXP * const prog, char* stringarg, char* strend,
dca33001 20 char* strbeg, SSize_t minend, SV* screamer,
20ce7b12 21 void* data, U32 flags);
f8149455 22
52a21eb3
DM
23extern char* my_re_intuit_start(pTHX_
24 REGEXP * const rx,
25 SV *sv,
26 const char * const strbeg,
27 char *strpos,
28 char *strend,
29 const U32 flags,
30 re_scream_pos_data *data);
31
49d7dfbc
AB
32extern SV* my_re_intuit_string (pTHX_ REGEXP * const prog);
33
34extern void my_regfree (pTHX_ REGEXP * const r);
2fdbfb4d 35
d932daed
SH
36extern void my_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren,
37 SV * const usesv);
38extern void my_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
39 SV const * const value);
40extern I32 my_reg_numbered_buff_length(pTHX_ REGEXP * const rx,
41 const SV * const sv, const I32 paren);
42
192b9cd1
AB
43extern SV* my_reg_named_buff(pTHX_ REGEXP * const, SV * const, SV * const,
44 const U32);
45extern SV* my_reg_named_buff_iter(pTHX_ REGEXP * const rx,
46 const SV * const lastkey, const U32 flags);
2fdbfb4d 47
49d7dfbc 48extern SV* my_reg_qr_package(pTHX_ REGEXP * const rx);
a3c0e9ca 49#if defined(USE_ITHREADS)
49d7dfbc 50extern void* my_regdupe (pTHX_ REGEXP * const r, CLONE_PARAMS *param);
a3c0e9ca 51#endif
0a28d81c 52
70685ca0
JH
53EXTERN_C const struct regexp_engine my_reg_engine;
54
55END_EXTERN_C
56
57const struct regexp_engine my_reg_engine = {
6d5c990f 58 my_re_compile,
f9f4320a
YO
59 my_regexec,
60 my_re_intuit_start,
61 my_re_intuit_string,
62 my_regfree,
2fdbfb4d
AB
63 my_reg_numbered_buff_fetch,
64 my_reg_numbered_buff_store,
65 my_reg_numbered_buff_length,
192b9cd1
AB
66 my_reg_named_buff,
67 my_reg_named_buff_iter,
49d7dfbc 68 my_reg_qr_package,
a3c0e9ca 69#if defined(USE_ITHREADS)
3c13cae6 70 my_regdupe,
a3c0e9ca 71#endif
3c13cae6 72 my_re_op_compile,
0a28d81c
NC
73};
74
56953603
IZ
75MODULE = re PACKAGE = re
76
77void
f9f4320a
YO
78install()
79 PPCODE:
80 PL_colorset = 0; /* Allow reinspection of ENV. */
81 /* PL_debug |= DEBUG_r_FLAG; */
82 XPUSHs(sv_2mortal(newSViv(PTR2IV(&my_reg_engine))));
256ddcd0
YO
83
84void
85regmust(sv)
86 SV * sv
87PROTOTYPE: $
88PREINIT:
49d7dfbc 89 REGEXP *re;
256ddcd0
YO
90PPCODE:
91{
f1f02a6b
DL
92 if ((re = SvRX(sv)) /* assign deliberate */
93 /* only for re engines we know about */
94 && (RX_ENGINE(re) == &my_reg_engine
95 || RX_ENGINE(re) == &PL_core_reg_engine))
256ddcd0
YO
96 {
97 SV *an = &PL_sv_no;
98 SV *fl = &PL_sv_no;
07bc277f 99 if (RX_ANCHORED_SUBSTR(re)) {
f1f02a6b 100 an = sv_2mortal(newSVsv(RX_ANCHORED_SUBSTR(re)));
07bc277f 101 } else if (RX_ANCHORED_UTF8(re)) {
f1f02a6b 102 an = sv_2mortal(newSVsv(RX_ANCHORED_UTF8(re)));
256ddcd0 103 }
07bc277f 104 if (RX_FLOAT_SUBSTR(re)) {
f1f02a6b 105 fl = sv_2mortal(newSVsv(RX_FLOAT_SUBSTR(re)));
07bc277f 106 } else if (RX_FLOAT_UTF8(re)) {
f1f02a6b 107 fl = sv_2mortal(newSVsv(RX_FLOAT_UTF8(re)));
256ddcd0 108 }
855ea7c7
S
109 EXTEND(SP, 2);
110 PUSHs(an);
111 PUSHs(fl);
256ddcd0
YO
112 XSRETURN(2);
113 }
114 XSRETURN_UNDEF;
115}
44a2ac75 116