This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #109570] Fix off-by-1 error in arybase’s lslice
[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);
49d7dfbc 15extern I32 my_regexec (pTHX_ REGEXP * const prog, char* stringarg, char* strend,
20ce7b12
GS
16 char* strbeg, I32 minend, SV* screamer,
17 void* data, U32 flags);
f8149455 18
49d7dfbc 19extern char* my_re_intuit_start (pTHX_ REGEXP * const prog, SV *sv, char *strpos,
973f7e2e 20 char *strend, const U32 flags,
f722798b 21 struct re_scream_pos_data_s *data);
49d7dfbc
AB
22extern SV* my_re_intuit_string (pTHX_ REGEXP * const prog);
23
24extern void my_regfree (pTHX_ REGEXP * const r);
2fdbfb4d 25
d932daed
SH
26extern void my_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren,
27 SV * const usesv);
28extern void my_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
29 SV const * const value);
30extern I32 my_reg_numbered_buff_length(pTHX_ REGEXP * const rx,
31 const SV * const sv, const I32 paren);
32
192b9cd1
AB
33extern SV* my_reg_named_buff(pTHX_ REGEXP * const, SV * const, SV * const,
34 const U32);
35extern SV* my_reg_named_buff_iter(pTHX_ REGEXP * const rx,
36 const SV * const lastkey, const U32 flags);
2fdbfb4d 37
49d7dfbc 38extern SV* my_reg_qr_package(pTHX_ REGEXP * const rx);
a3c0e9ca 39#if defined(USE_ITHREADS)
49d7dfbc 40extern void* my_regdupe (pTHX_ REGEXP * const r, CLONE_PARAMS *param);
a3c0e9ca 41#endif
0a28d81c 42
70685ca0
JH
43EXTERN_C const struct regexp_engine my_reg_engine;
44
45END_EXTERN_C
46
47const struct regexp_engine my_reg_engine = {
6d5c990f 48 my_re_compile,
f9f4320a
YO
49 my_regexec,
50 my_re_intuit_start,
51 my_re_intuit_string,
52 my_regfree,
2fdbfb4d
AB
53 my_reg_numbered_buff_fetch,
54 my_reg_numbered_buff_store,
55 my_reg_numbered_buff_length,
192b9cd1
AB
56 my_reg_named_buff,
57 my_reg_named_buff_iter,
49d7dfbc 58 my_reg_qr_package,
a3c0e9ca 59#if defined(USE_ITHREADS)
f9f4320a 60 my_regdupe
a3c0e9ca 61#endif
0a28d81c
NC
62};
63
56953603
IZ
64MODULE = re PACKAGE = re
65
66void
f9f4320a
YO
67install()
68 PPCODE:
69 PL_colorset = 0; /* Allow reinspection of ENV. */
70 /* PL_debug |= DEBUG_r_FLAG; */
71 XPUSHs(sv_2mortal(newSViv(PTR2IV(&my_reg_engine))));
256ddcd0
YO
72
73void
74regmust(sv)
75 SV * sv
76PROTOTYPE: $
77PREINIT:
49d7dfbc 78 REGEXP *re;
256ddcd0
YO
79PPCODE:
80{
f1f02a6b
DL
81 if ((re = SvRX(sv)) /* assign deliberate */
82 /* only for re engines we know about */
83 && (RX_ENGINE(re) == &my_reg_engine
84 || RX_ENGINE(re) == &PL_core_reg_engine))
256ddcd0
YO
85 {
86 SV *an = &PL_sv_no;
87 SV *fl = &PL_sv_no;
07bc277f 88 if (RX_ANCHORED_SUBSTR(re)) {
f1f02a6b 89 an = sv_2mortal(newSVsv(RX_ANCHORED_SUBSTR(re)));
07bc277f 90 } else if (RX_ANCHORED_UTF8(re)) {
f1f02a6b 91 an = sv_2mortal(newSVsv(RX_ANCHORED_UTF8(re)));
256ddcd0 92 }
07bc277f 93 if (RX_FLOAT_SUBSTR(re)) {
f1f02a6b 94 fl = sv_2mortal(newSVsv(RX_FLOAT_SUBSTR(re)));
07bc277f 95 } else if (RX_FLOAT_UTF8(re)) {
f1f02a6b 96 fl = sv_2mortal(newSVsv(RX_FLOAT_UTF8(re)));
256ddcd0
YO
97 }
98 XPUSHs(an);
99 XPUSHs(fl);
100 XSRETURN(2);
101 }
102 XSRETURN_UNDEF;
103}
44a2ac75 104