X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2Fre%2Fre.xs;h=b4d3e34c4a11c1ae7a7efd687a87c7ba7edd1cc8;hb=e9d185f8391f09209c11be82e97358d853f1ba30;hp=1bc20fc2bc53325c128b2e105e517f42ddbbc816;hpb=bcdf74043c1fd4b60b7764f5cd7d87525cf77e74;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/re/re.xs b/ext/re/re.xs index 1bc20fc..b4d3e34 100644 --- a/ext/re/re.xs +++ b/ext/re/re.xs @@ -11,19 +11,33 @@ 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 SV * const sv, const I32 paren); + +extern SV* my_reg_named_buff(pTHX_ REGEXP * const, SV * const, SV * const, + const U32); +extern SV* my_reg_named_buff_iter(pTHX_ REGEXP * const rx, + const SV * const lastkey, 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; @@ -36,30 +50,17 @@ 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, + my_reg_named_buff_iter, + my_reg_qr_package, #if defined(USE_ITHREADS) my_regdupe #endif }; -regexp * -get_re_arg( pTHX_ SV *sv, U32 flags, MAGIC **mgp) { - MAGIC *mg; - if (sv) { - if (SvMAGICAL(sv)) - mg_get(sv); - if (SvROK(sv) && - (sv = (SV*)SvRV(sv)) && /* assign deliberate */ - SvTYPE(sv) == SVt_PVMG && - (mg = mg_find(sv, PERL_MAGIC_qr))) /* assign deliberate */ - { - if (mgp) *mgp = mg; - return (regexp *)mg->mg_obj; - } - } - if (mgp) *mgp = NULL; - return ((flags && PL_curpm) ? PM_GETRE(PL_curpm) : NULL); -} - MODULE = re PACKAGE = re void @@ -71,27 +72,11 @@ install() 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: { /* @@ -105,7 +90,7 @@ PPCODE: on the object. */ - if ( re = get_re_arg( aTHX_ sv, 0, &mg) ) /* assign deliberate */ + if ((re = SvRX(sv))) /* assign deliberate */ { /* Housten, we have a regex! */ SV *pattern; @@ -176,10 +161,10 @@ regmust(sv) SV * sv PROTOTYPE: $ PREINIT: - regexp *re; + REGEXP *re; PPCODE: { - if ( re = get_re_arg( aTHX_ sv, 0, 0) ) /* assign deliberate */ + if ((re = SvRX(sv))) /* assign deliberate */ { SV *an = &PL_sv_no; SV *fl = &PL_sv_no; @@ -200,150 +185,3 @@ PPCODE: 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; - } -}