START_EXTERN_C
-extern regexp* my_re_compile (pTHX_ char* exp, char* xend, PMOP* pm);
-extern I32 my_regexec (pTHX_ regexp* prog, char* stringarg, char* strend,
+extern REGEXP* my_re_compile (pTHX_ const SV * const pattern, const U32 pm_flags);
+extern I32 my_regexec (pTHX_ REGEXP * const prog, char* stringarg, char* strend,
char* strbeg, I32 minend, SV* screamer,
void* data, U32 flags);
-extern char* my_re_intuit_start (pTHX_ regexp *prog, SV *sv, char *strpos,
- char *strend, U32 flags,
+extern char* my_re_intuit_start (pTHX_ REGEXP * const prog, SV *sv, char *strpos,
+ char *strend, const U32 flags,
struct re_scream_pos_data_s *data);
-extern SV* my_re_intuit_string (pTHX_ regexp *prog);
+extern SV* my_re_intuit_string (pTHX_ REGEXP * const prog);
-extern void my_regfree (pTHX_ struct regexp* r);
+extern void my_regfree (pTHX_ REGEXP * const r);
+
+extern void my_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren,
+ SV * const usesv);
+extern void my_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
+ SV const * const value);
+extern I32 my_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const I32 paren);
+
+extern SV* my_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const key,
+ const U32 flags);
+
+extern SV* my_reg_qr_package(pTHX_ REGEXP * const rx);
#if defined(USE_ITHREADS)
-extern void* my_regdupe (pTHX_ const regexp *r, CLONE_PARAMS *param);
+extern void* my_regdupe (pTHX_ REGEXP * const r, CLONE_PARAMS *param);
#endif
EXTERN_C const struct regexp_engine my_reg_engine;
my_re_intuit_start,
my_re_intuit_string,
my_regfree,
+ my_reg_numbered_buff_fetch,
+ my_reg_numbered_buff_store,
+ my_reg_numbered_buff_length,
+ my_reg_named_buff_fetch,
+ my_reg_qr_package,
#if defined(USE_ITHREADS)
my_regdupe
#endif
};
-regexp *
+REGEXP *
get_re_arg( pTHX_ SV *sv, U32 flags, MAGIC **mgp) {
MAGIC *mg;
if (sv) {
(mg = mg_find(sv, PERL_MAGIC_qr))) /* assign deliberate */
{
if (mgp) *mgp = mg;
- return (regexp *)mg->mg_obj;
+ return (REGEXP *)mg->mg_obj;
}
}
if (mgp) *mgp = NULL;
void
-is_regexp(sv)
- SV * sv
-PROTOTYPE: $
-PPCODE:
-{
- if ( get_re_arg( aTHX_ sv, 0, NULL ) )
- {
- XSRETURN_YES;
- } else {
- XSRETURN_NO;
- }
- /* NOTREACHED */
-}
-
-void
regexp_pattern(sv)
SV * sv
PROTOTYPE: $
PREINIT:
MAGIC *mg;
- regexp *re;
+ REGEXP *re;
PPCODE:
{
/*
modifiers" in this scenario.
*/
- char *fptr = "msix";
+ char *fptr = INT_PAT_MODS;
char ch;
U16 match_flags = (U16)((re->extflags & PMf_COMPILETIME) >> 12);
XSRETURN(2);
} else {
/* Scalar, so use the string that Perl would return */
- if (!mg->mg_ptr)
- CALLREG_STRINGIFY(mg,0,0);
-
/* return the pattern in (?msix:..) format */
- pattern = sv_2mortal(newSVpvn(mg->mg_ptr,mg->mg_len));
+ pattern = sv_2mortal(newSVpvn(re->wrapped,re->wraplen));
if (re->extflags & RXf_UTF8)
SvUTF8_on(pattern);
XPUSHs(pattern);
SV * sv
PROTOTYPE: $
PREINIT:
- regexp *re;
+ REGEXP *re;
PPCODE:
{
if ( re = get_re_arg( aTHX_ sv, 0, 0) ) /* assign deliberate */
XSRETURN_UNDEF;
}
-void
-regname(sv, qr = NULL, all = NULL)
- SV * sv
- SV * qr
- SV * all
-PROTOTYPE: ;$$$
-PREINIT:
- regexp *re = NULL;
- SV *bufs = NULL;
-PPCODE:
-{
- re = get_re_arg( aTHX_ qr, 1, NULL);
- if (SvPOK(sv) && re && re->paren_names) {
- bufs = Perl_reg_named_buff_get(aTHX_ sv, re ,all && SvTRUE(all));
- if (bufs) {
- if (all && SvTRUE(all))
- XPUSHs(newRV(bufs));
- else
- XPUSHs(SvREFCNT_inc(bufs));
- XSRETURN(1);
- }
- }
- XSRETURN_UNDEF;
-}
-
-void
-regnames(sv = NULL, all = NULL)
- SV *sv
- SV *all
-PROTOTYPE: ;$$
-PREINIT:
- regexp *re = NULL;
- IV count = 0;
-PPCODE:
-{
- re = get_re_arg( aTHX_ sv, 1, NULL );
- if (re && re->paren_names) {
- HV *hv= re->paren_names;
- (void)hv_iterinit(hv);
- while (1) {
- HE *temphe = hv_iternext_flags(hv,0);
- if (temphe) {
- IV i;
- IV parno = 0;
- SV* sv_dat = HeVAL(temphe);
- I32 *nums = (I32*)SvPVX(sv_dat);
- for ( i = 0; i < SvIVX(sv_dat); i++ ) {
- if ((I32)(re->lastcloseparen) >= nums[i] &&
- re->startp[nums[i]] != -1 &&
- re->endp[nums[i]] != -1)
- {
- parno = nums[i];
- break;
- }
- }
- if (parno || (all && SvTRUE(all))) {
- STRLEN len;
- char *pv = HePV(temphe, len);
- if ( GIMME_V == G_ARRAY )
- XPUSHs(newSVpvn(pv,len));
- count++;
- }
- } else {
- break;
- }
- }
- }
- if ( GIMME_V == G_ARRAY )
- XSRETURN(count);
- else
- XSRETURN_UNDEF;
-}
-
-void
-regnames_iterinit(sv = NULL)
- SV * sv
-PROTOTYPE: ;$
-PREINIT:
- regexp *re = NULL;
-PPCODE:
-{
- re = get_re_arg( aTHX_ sv, 1, NULL );
- if (re && re->paren_names) {
- (void)hv_iterinit(re->paren_names);
- XPUSHs(newSViv(HvTOTALKEYS(re->paren_names)));
- } else {
- XSRETURN_UNDEF;
- }
-}
-
-void
-regnames_iternext(sv = NULL, all = NULL)
- SV *sv
- SV *all
-PROTOTYPE: ;$$
-PREINIT:
- regexp *re;
-PPCODE:
-{
- re = get_re_arg( aTHX_ sv, 1, NULL );
- if (re && re->paren_names) {
- HV *hv= re->paren_names;
- while (1) {
- HE *temphe = hv_iternext_flags(hv,0);
- if (temphe) {
- IV i;
- IV parno = 0;
- SV* sv_dat = HeVAL(temphe);
- I32 *nums = (I32*)SvPVX(sv_dat);
- for ( i = 0; i < SvIVX(sv_dat); i++ ) {
- if ((I32)(re->lastcloseparen) >= nums[i] &&
- re->startp[nums[i]] != -1 &&
- re->endp[nums[i]] != -1)
- {
- parno = nums[i];
- break;
- }
- }
- if (parno || (all && SvTRUE(all))) {
- STRLEN len;
- char *pv = HePV(temphe, len);
- XPUSHs(newSVpvn(pv,len));
- XSRETURN(1);
- }
- } else {
- break;
- }
- }
- }
- XSRETURN_UNDEF;
-}
-
-void
-regnames_count(sv = NULL)
- SV * sv
-PROTOTYPE: ;$
-PREINIT:
- regexp *re = NULL;
-PPCODE:
-{
- re = get_re_arg( aTHX_ sv, 1, NULL );
- if (re && re->paren_names) {
- XPUSHs(newSViv(HvTOTALKEYS(re->paren_names)));
- } else {
- XSRETURN_UNDEF;
- }
-}