/* --- Custom regexp engine ------------------------------------------------ */
-#define GET_SELF_FROM_PPRIVATE(pprivate) \
- re__engine__Plugin self; \
- SELF_FROM_PPRIVATE(self,pprivate);
-
/* re__engine__Plugin self; SELF_FROM_PPRIVATE(self,rx->pprivate) */
#define SELF_FROM_PPRIVATE(self, pprivate) \
if (sv_isobject(pprivate)) { \
typedef struct replug {
/* Pointer back to the containing regexp struct so that accessors
- * can modify nparens, gofs etc. */
+ * can modify nparens, gofs, etc... */
struct regexp *rx;
/* A copy of the pattern given to comp, for ->pattern */
obj = newSV(0);
SvREFCNT_inc_simple_void_NN(obj);
Newxz(re, 1, struct replug);
- sv_setref_pv(obj, "re::engine::Plugin", (void *) re);
+ sv_setref_pv(obj, XSH_PACKAGE, (void *) re);
newREGEXP(RX);
rx = rxREGEXP(RX);
rx->precomp = savepvn(pbuf, rx->prelen);
/* Set up qr// stringification to be equivalent to the supplied
- * pattern, this should be done via overload eventually.
- */
+ * pattern, this should be done via overload eventually */
rx->wraplen = rx->prelen;
Newx(rx->wrapped, rx->wraplen, char);
Copy(rx->precomp, rx->wrapped, rx->wraplen, char);
re->pattern = (SV *) pattern;
SvREFCNT_inc_simple_void(re->pattern);
- /* If there's an exec callback, store it into the private object so
- * that it will be the one to be called, even if the engine changes
- * in between */
+ /* If there's an exec callback, store it into the private object so that it
+ * will be the one to be called, even if the engine changes in between */
if (h->exec) {
re->cb_exec = h->exec;
SvREFCNT_inc_simple_void_NN(h->exec);
re->cb_num_capture_buff_STORE = NULL;
re->cb_num_capture_buff_LENGTH = NULL;
- /* Call our callback function if one was defined, if not we've
- * already set up all the stuff we're going to to need for
- * subsequent exec and other calls */
+ /* Call our callback function if one was defined, if not we've already set up
+ * all the stuff we're going to to need for subsequent exec and other calls */
if (h->comp) {
ENTER;
SAVETMPS;
}
/* If any of the comp-time accessors were called we'll have to
- * update the regexp struct with the new info.
- */
+ * update the regexp struct with the new info */
Newxz(rx->offs, rx->nparens + 1, regexp_paren_pair);
return RX;
char *strbeg, REP_ENG_EXEC_MINEND_TYPE minend,
SV *sv, void *data, U32 flags)
{
- dSP;
+ struct regexp *rx;
+ re__engine__Plugin self;
I32 matched;
- struct regexp *rx = rxREGEXP(RX);
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
if (self->cb_exec) {
SV *ret;
+ dSP;
/* Store the current str for ->str */
SvREFCNT_dec(self->str);
Plugin_numbered_buff_FETCH(pTHX_ REGEXP * const RX, const I32 paren,
SV * const sv)
{
- dSP;
- I32 items;
+ struct regexp *rx;
+ re__engine__Plugin self;
SV *callback;
- struct regexp *rx = rxREGEXP(RX);
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
callback = self->cb_num_capture_buff_FETCH;
if (callback) {
+ I32 items;
+ dSP;
+
ENTER;
SAVETMPS;
Plugin_numbered_buff_STORE(pTHX_ REGEXP * const RX, const I32 paren,
SV const * const value)
{
- dSP;
+ struct regexp *rx;
+ re__engine__Plugin self;
SV *callback;
- struct regexp *rx = rxREGEXP(RX);
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
callback = self->cb_num_capture_buff_STORE;
if (callback) {
+ dSP;
+
ENTER;
SAVETMPS;
Plugin_numbered_buff_LENGTH(pTHX_ REGEXP * const RX, const SV * const sv,
const I32 paren)
{
- dSP;
+ struct regexp *rx;
+ re__engine__Plugin self;
SV *callback;
- struct regexp *rx = rxREGEXP(RX);
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
callback = self->cb_num_capture_buff_LENGTH;
if (callback) {
IV ret;
+ dSP;
ENTER;
SAVETMPS;
{
PERL_UNUSED_ARG(RX);
- return newSVpvs("re::engine::Plugin");
+ return newSVpvs(XSH_PACKAGE);
}
static void xsh_user_global_setup(pTHX) {
pattern(re::engine::Plugin self, ...)
PPCODE:
XPUSHs(self->pattern);
+ XSRETURN(1);
void
str(re::engine::Plugin self, ...)
PPCODE:
XPUSHs(self->str);
+ XSRETURN(1);
void
mod(re::engine::Plugin self)
XSRETURN_EMPTY;
} else {
XPUSHs(self->stash);
+ XSRETURN(1);
}
void
} else {
XPUSHs(sv_2mortal(&PL_sv_undef));
}
+ XSRETURN(1);
}
void
} else {
XPUSHs(sv_2mortal(&PL_sv_undef));
}
+ XSRETURN(1);
}
void
} else {
XPUSHs(sv_2mortal(&PL_sv_undef));
}
+ XSRETURN(1);
}
void
self->cb_exec = ST(1);
SvREFCNT_inc_simple_void(self->cb_exec);
}
+ XSRETURN(0);
void
_num_capture_buff_FETCH(re::engine::Plugin self, ...)
self->cb_num_capture_buff_FETCH = ST(1);
SvREFCNT_inc_simple_void(self->cb_num_capture_buff_FETCH);
}
+ XSRETURN(0);
void
_num_capture_buff_STORE(re::engine::Plugin self, ...)
self->cb_num_capture_buff_STORE = ST(1);
SvREFCNT_inc_simple_void(self->cb_num_capture_buff_STORE);
}
+ XSRETURN(0);
void
_num_capture_buff_LENGTH(re::engine::Plugin self, ...)
self->cb_num_capture_buff_LENGTH = ST(1);
SvREFCNT_inc_simple_void(self->cb_num_capture_buff_LENGTH);
}
+ XSRETURN(0);
SV *
_tag(SV *comp, SV *exec)
ENGINE()
PPCODE:
XPUSHs(sv_2mortal(newSViv(PTR2IV(&engine_plugin))));
+ XSRETURN(1);