X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Plugin.xs;h=544fab8aa070cfc79b1d00ae2f6d33a84116f2eb;hb=79278cdc9ce2627fb9de1f025a3e47011cd2c320;hp=6d003d9c53272b2a9358d8633d31e052dc38796d;hpb=dd88e700bfcc92fc03db9d994ec747ca1c14ade7;p=perl%2Fmodules%2Fre-engine-Plugin.git diff --git a/Plugin.xs b/Plugin.xs index 6d003d9..544fab8 100644 --- a/Plugin.xs +++ b/Plugin.xs @@ -39,21 +39,21 @@ get_H_callback(const char* key) } REGEXP * +#if PERL_VERSION <= 10 Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) +#else +Plugin_comp(pTHX_ SV * const pattern, U32 flags) +#endif { dSP; - REGEXP * rx; + struct regexp * rx; + REGEXP *RX; re__engine__Plugin re; - I32 count; I32 buffers; /* exp/xend version of the pattern & length */ STRLEN plen; char* exp = SvPV((SV*)pattern, plen); - char* xend = exp + plen; - - /* The REGEXP structure to return to perl */ - Newxz(rx, 1, REGEXP); /* Our blessed object */ SV *obj = newSV(0); @@ -61,13 +61,18 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) Newxz(re, 1, struct replug); sv_setref_pv(obj, "re::engine::Plugin", (void*)re); + newREGEXP(RX); + rx = rxREGEXP(RX); + re->rx = rx; /* Make the rx accessible from self->rx */ - rx->refcnt = 1; /* Refcount so we won' be destroyed */ rx->intflags = flags; /* Flags for internal use */ rx->extflags = flags; /* Flags for perl to use */ rx->engine = RE_ENGINE_PLUGIN; /* Compile to use this engine */ - /* Precompiled regexp for pp_regcomp to use */ +#if PERL_VERSION <= 10 + rx->refcnt = 1; /* Refcount so we won't be destroyed */ + + /* Precompiled pattern for pp_regcomp to use */ rx->prelen = plen; rx->precomp = savepvn(exp, rx->prelen); @@ -77,6 +82,7 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) rx->wraplen = rx->prelen; Newx(rx->wrapped, rx->wraplen, char); Copy(rx->precomp, rx->wrapped, rx->wraplen, char); +#endif /* Store our private object */ rx->pprivate = obj; @@ -112,18 +118,19 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) buffers = rx->nparens; - Newxz(rx->offs, buffers, regexp_paren_pair); + Newxz(rx->offs, buffers + 1, regexp_paren_pair); - return rx; + return RX; } I32 -Plugin_exec(pTHX_ REGEXP * const rx, char *stringarg, char *strend, +Plugin_exec(pTHX_ REGEXP * const RX, char *stringarg, char *strend, char *strbeg, I32 minend, SV *sv, void *data, U32 flags) { dSP; I32 matched; SV * callback = get_H_callback("exec"); + struct regexp *rx = rxREGEXP(RX); GET_SELF_FROM_PPRIVATE(rx->pprivate); if (callback) { @@ -161,10 +168,10 @@ Plugin_exec(pTHX_ REGEXP * const rx, char *stringarg, char *strend, } char * -Plugin_intuit(pTHX_ REGEXP * const rx, SV *sv, char *strpos, +Plugin_intuit(pTHX_ REGEXP * const RX, SV *sv, char *strpos, char *strend, U32 flags, re_scream_pos_data *data) { - PERL_UNUSED_ARG(rx); + PERL_UNUSED_ARG(RX); PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(strpos); PERL_UNUSED_ARG(strend); @@ -174,16 +181,16 @@ Plugin_intuit(pTHX_ REGEXP * const rx, SV *sv, char *strpos, } SV * -Plugin_checkstr(pTHX_ REGEXP * const rx) +Plugin_checkstr(pTHX_ REGEXP * const RX) { - PERL_UNUSED_ARG(rx); + PERL_UNUSED_ARG(RX); return NULL; } void -Plugin_free(pTHX_ REGEXP * const rx) +Plugin_free(pTHX_ REGEXP * const RX) { - PERL_UNUSED_ARG(rx); + PERL_UNUSED_ARG(RX); /* dSP; SV * callback; @@ -210,19 +217,22 @@ Plugin_free(pTHX_ REGEXP * const rx) } void * -Plugin_dupe(pTHX_ const REGEXP * rx, CLONE_PARAMS *param) +Plugin_dupe(pTHX_ REGEXP * const RX, CLONE_PARAMS *param) { - Perl_croak("dupe not supported yet"); + struct regexp *rx = rxREGEXP(RX); + Perl_croak(aTHX_ "dupe not supported yet"); return rx->pprivate; } + void -Plugin_numbered_buff_FETCH(pTHX_ REGEXP * const rx, const I32 paren, +Plugin_numbered_buff_FETCH(pTHX_ REGEXP * const RX, const I32 paren, SV * const sv) { dSP; I32 items; SV * callback; + struct regexp *rx = rxREGEXP(RX); GET_SELF_FROM_PPRIVATE(rx->pprivate); callback = self->cb_num_capture_buff_FETCH; @@ -256,12 +266,12 @@ Plugin_numbered_buff_FETCH(pTHX_ REGEXP * const rx, const I32 paren, } void -Plugin_numbered_buff_STORE(pTHX_ REGEXP * const rx, const I32 paren, +Plugin_numbered_buff_STORE(pTHX_ REGEXP * const RX, const I32 paren, SV const * const value) { dSP; - I32 items; SV * callback; + struct regexp *rx = rxREGEXP(RX); GET_SELF_FROM_PPRIVATE(rx->pprivate); callback = self->cb_num_capture_buff_STORE; @@ -273,7 +283,7 @@ Plugin_numbered_buff_STORE(pTHX_ REGEXP * const rx, const I32 paren, PUSHMARK(SP); XPUSHs(rx->pprivate); XPUSHs(sv_2mortal(newSViv(paren))); - XPUSHs(SvREFCNT_inc(value)); + XPUSHs(SvREFCNT_inc((SV *) value)); PUTBACK; call_sv(callback, G_DISCARD); @@ -285,12 +295,12 @@ Plugin_numbered_buff_STORE(pTHX_ REGEXP * const rx, const I32 paren, } I32 -Plugin_numbered_buff_LENGTH(pTHX_ REGEXP * const rx, const SV * const sv, +Plugin_numbered_buff_LENGTH(pTHX_ REGEXP * const RX, const SV * const sv, const I32 paren) { dSP; - I32 items; SV * callback; + struct regexp *rx = rxREGEXP(RX); GET_SELF_FROM_PPRIVATE(rx->pprivate); callback = self->cb_num_capture_buff_LENGTH; @@ -323,270 +333,23 @@ Plugin_numbered_buff_LENGTH(pTHX_ REGEXP * const rx, const SV * const sv, SV* -Plugin_named_buff_FETCH(pTHX_ REGEXP * const rx, SV * const key, U32 flags) -{ - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_FETCH; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(SvREFCNT_inc(key)); - XPUSHs(sv_2mortal(newSViv(flags & 1 ? 1 : 0))); - PUTBACK; - - call_sv(callback, G_SCALAR); - - SPAGAIN; - - SV* ret = POPs; - SvREFCNT_inc(ret); - - PUTBACK; - FREETMPS; - LEAVE; - - return ret; - } else { - return NULL; - } -} - -void -Plugin_named_buff_STORE(pTHX_ REGEXP * const rx, SV * const key, - SV * const value, const U32 flags) -{ - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_STORE; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(SvREFCNT_inc(key)); - XPUSHs(SvREFCNT_inc(value)); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_DISCARD); - - PUTBACK; - FREETMPS; - LEAVE; - } -} - -void -Plugin_named_buff_DELETE(pTHX_ REGEXP * const rx, SV * const key, const U32 flags) -{ - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_DELETE; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(SvREFCNT_inc(key)); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_DISCARD); - - PUTBACK; - FREETMPS; - LEAVE; - } -} - -void -Plugin_named_buff_CLEAR(pTHX_ REGEXP * const rx, const U32 flags) -{ - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_CLEAR; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_DISCARD); - - PUTBACK; - FREETMPS; - LEAVE; - } -} - -bool -Plugin_named_buff_EXISTS(pTHX_ REGEXP * const rx, SV * const key, - const U32 flags) -{ - dSP; - SV * callback; - bool truthiness = FALSE; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_EXISTS; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(SvREFCNT_inc(key)); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_SCALAR); - - SPAGAIN; - - SV * ret = POPs; - truthiness = SvTRUE(ret); - - PUTBACK; - FREETMPS; - LEAVE; - } - - return truthiness; -} - -SV* -Plugin_named_buff_FIRSTKEY(pTHX_ REGEXP * const rx, const U32 flags) -{ - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_FIRSTKEY; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_SCALAR); - - SPAGAIN; - - SV * ret = POPs; - SvREFCNT_inc(ret); - - PUTBACK; - FREETMPS; - LEAVE; - - return ret; - } else { - return NULL; - } -} - -SV* -Plugin_named_buff_NEXTKEY(pTHX_ REGEXP * const rx, SV * const lastkey, - const U32 flags) +Plugin_named_buff (pTHX_ REGEXP * const RX, SV * const key, SV * const value, + const U32 flags) { - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_NEXTKEY; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(SvREFCNT_inc(lastkey)); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_SCALAR); - - SPAGAIN; - - SV * ret = POPs; - SvREFCNT_inc(ret); - - PUTBACK; - FREETMPS; - LEAVE; - - return ret; - } else { - return NULL; - } + return NULL; } SV* -Plugin_named_buff_SCALAR(pTHX_ REGEXP * const rx, const U32 flags) +Plugin_named_buff_iter (pTHX_ REGEXP * const RX, const SV * const lastkey, + const U32 flags) { - dSP; - SV * callback; - GET_SELF_FROM_PPRIVATE(rx->pprivate); - - callback = self->cb_named_capture_buff_SCALAR; - - if (callback) { - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(rx->pprivate); - XPUSHs(sv_2mortal(newSViv(flags))); - PUTBACK; - - call_sv(callback, G_SCALAR); - - SPAGAIN; - - SV * ret = POPs; - SvREFCNT_inc(ret); - - PUTBACK; - FREETMPS; - LEAVE; - - return ret; - } else { - return NULL; - } + return NULL; } SV* -Plugin_package(pTHX_ REGEXP * const rx) +Plugin_package(pTHX_ REGEXP * const RX) { - PERL_UNUSED_ARG(rx); + PERL_UNUSED_ARG(RX); return newSVpvs("re::engine::Plugin"); } @@ -603,7 +366,7 @@ str(re::engine::Plugin self, ...) PPCODE: XPUSHs(self->str); -void +char* mod(re::engine::Plugin self, ...) PPCODE: /* /i */ @@ -713,70 +476,6 @@ PPCODE: SvREFCNT_inc(self->cb_num_capture_buff_LENGTH); } -void -_named_capture_buff_FETCH(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_FETCH = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_FETCH); - } - -void -_named_capture_buff_STORE(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_STORE = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_STORE); - } - -void -_named_capture_buff_DELETE(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_DELETE = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_DELETE); - } - -void -_named_capture_buff_CLEAR(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_CLEAR = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_CLEAR); - } - -void -_named_capture_buff_EXISTS(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_EXISTS = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_EXISTS); - } - -void -_named_capture_buff_FIRSTKEY(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_FIRSTKEY = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_FIRSTKEY); - } - -void -_named_capture_buff_NEXTKEY(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_NEXTKEY = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_NEXTKEY); - } - -void -_named_capture_buff_SCALAR(re::engine::Plugin self, ...) -PPCODE: - if (items > 1) { - self->cb_named_capture_buff_SCALAR = ST(1); - SvREFCNT_inc(self->cb_named_capture_buff_SCALAR); - } - void ENGINE() PPCODE: