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