7 get_H_callback(const char* key)
18 XPUSHs(sv_2mortal(newSVpv(key, 0)));
21 call_pv("re::engine::Plugin::_get_callback", G_SCALAR);
26 SvREFCNT_inc(callback); /* refcount++ or FREETMPS below will collect us */
28 /* If we don't get a valid CODE value return a NULL callback, in
29 * that case the hooks won't call back into Perl space */
30 if (!SvROK(callback) || SvTYPE(SvRV(callback)) != SVt_PVCV) {
42 Plugin_comp(pTHX_ const SV * const pattern, const U32 flags)
46 re__engine__Plugin re;
50 /* exp/xend version of the pattern & length */
52 char* exp = SvPV((SV*)pattern, plen);
53 char* xend = exp + plen;
55 /* The REGEXP structure to return to perl */
58 /* Our blessed object */
61 Newxz(re, 1, struct replug);
62 sv_setref_pv(obj, "re::engine::Plugin", (void*)re);
64 re->rx = rx; /* Make the rx accessible from self->rx */
65 rx->refcnt = 1; /* Refcount so we won' be destroyed */
66 rx->intflags = flags; /* Flags for internal use */
67 rx->extflags = flags; /* Flags for perl to use */
68 rx->engine = RE_ENGINE_PLUGIN; /* Compile to use this engine */
70 /* Precompiled regexp for pp_regcomp to use */
72 rx->precomp = savepvn(exp, rx->prelen);
74 /* Set up qr// stringification to be equivalent to the supplied
75 * pattern, this should be done via overload eventually.
77 rx->wraplen = rx->prelen;
78 Newx(rx->wrapped, rx->wraplen, char);
79 Copy(rx->precomp, rx->wrapped, rx->wraplen, char);
81 /* Store our private object */
84 /* Store the pattern for ->pattern */
85 re->pattern = (SV*)pattern;
86 SvREFCNT_inc(re->pattern);
89 * Call our callback function if one was defined, if not we've
90 * already set up all the stuff we're going to to need for
91 * subsequent exec and other calls
93 SV * callback = get_H_callback("comp");
103 call_sv(callback, G_DISCARD);
109 /* If any of the comp-time accessors were called we'll have to
110 * update the regexp struct with the new info.
113 buffers = rx->nparens;
115 Newxz(rx->offs, buffers, regexp_paren_pair);
121 Plugin_exec(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
122 char *strbeg, I32 minend, SV *sv, void *data, U32 flags)
126 SV * callback = get_H_callback("exec");
127 GET_SELF_FROM_PPRIVATE(rx->pprivate);
130 /* Store the current str for ->str */
132 SvREFCNT_inc(self->str);
138 XPUSHs(rx->pprivate);
142 call_sv(callback, G_SCALAR);
164 Plugin_intuit(pTHX_ REGEXP * const rx, SV *sv, char *strpos,
165 char *strend, U32 flags, re_scream_pos_data *data)
169 PERL_UNUSED_ARG(strpos);
170 PERL_UNUSED_ARG(strend);
171 PERL_UNUSED_ARG(flags);
172 PERL_UNUSED_ARG(data);
177 Plugin_checkstr(pTHX_ REGEXP * const rx)
184 Plugin_free(pTHX_ REGEXP * const rx)
190 GET_SELF_FROM_PPRIVATE(rx->pprivate);
192 callback = self->cb_free;
199 XPUSHs(rx->pprivate);
202 call_sv(callback, G_DISCARD);
213 Plugin_dupe(pTHX_ const REGEXP * rx, CLONE_PARAMS *param)
215 Perl_croak("dupe not supported yet");
220 Plugin_numbered_buff_FETCH(pTHX_ REGEXP * const rx, const I32 paren,
226 GET_SELF_FROM_PPRIVATE(rx->pprivate);
228 callback = self->cb_num_capture_buff_FETCH;
235 XPUSHs(rx->pprivate);
236 XPUSHs(sv_2mortal(newSViv(paren)));
239 items = call_sv(callback, G_SCALAR);
247 sv_setsv(sv, &PL_sv_undef);
254 sv_setsv(sv, &PL_sv_undef);
259 Plugin_numbered_buff_STORE(pTHX_ REGEXP * const rx, const I32 paren,
260 SV const * const value)
265 GET_SELF_FROM_PPRIVATE(rx->pprivate);
267 callback = self->cb_num_capture_buff_STORE;
274 XPUSHs(rx->pprivate);
275 XPUSHs(sv_2mortal(newSViv(paren)));
276 XPUSHs(SvREFCNT_inc(value));
279 call_sv(callback, G_DISCARD);
288 Plugin_numbered_buff_LENGTH(pTHX_ REGEXP * const rx, const SV * const sv,
294 GET_SELF_FROM_PPRIVATE(rx->pprivate);
296 callback = self->cb_num_capture_buff_LENGTH;
303 XPUSHs(rx->pprivate);
304 XPUSHs(sv_2mortal(newSViv(paren)));
307 call_sv(callback, G_SCALAR);
319 /* TODO: call FETCH and get the length on that value */
326 Plugin_named_buff_FETCH(pTHX_ REGEXP * const rx, SV * const key, U32 flags)
330 GET_SELF_FROM_PPRIVATE(rx->pprivate);
332 callback = self->cb_named_capture_buff_FETCH;
339 XPUSHs(rx->pprivate);
340 XPUSHs(SvREFCNT_inc(key));
341 XPUSHs(sv_2mortal(newSViv(flags & 1 ? 1 : 0)));
344 call_sv(callback, G_SCALAR);
362 Plugin_named_buff_STORE(pTHX_ REGEXP * const rx, SV * const key,
363 SV * const value, const U32 flags)
367 GET_SELF_FROM_PPRIVATE(rx->pprivate);
369 callback = self->cb_named_capture_buff_STORE;
376 XPUSHs(rx->pprivate);
377 XPUSHs(SvREFCNT_inc(key));
378 XPUSHs(SvREFCNT_inc(value));
379 XPUSHs(sv_2mortal(newSViv(flags)));
382 call_sv(callback, G_DISCARD);
391 Plugin_named_buff_DELETE(pTHX_ REGEXP * const rx, SV * const key, const U32 flags)
395 GET_SELF_FROM_PPRIVATE(rx->pprivate);
397 callback = self->cb_named_capture_buff_DELETE;
404 XPUSHs(rx->pprivate);
405 XPUSHs(SvREFCNT_inc(key));
406 XPUSHs(sv_2mortal(newSViv(flags)));
409 call_sv(callback, G_DISCARD);
418 Plugin_named_buff_CLEAR(pTHX_ REGEXP * const rx, const U32 flags)
422 GET_SELF_FROM_PPRIVATE(rx->pprivate);
424 callback = self->cb_named_capture_buff_CLEAR;
431 XPUSHs(rx->pprivate);
432 XPUSHs(sv_2mortal(newSViv(flags)));
435 call_sv(callback, G_DISCARD);
444 Plugin_named_buff_EXISTS(pTHX_ REGEXP * const rx, SV * const key,
449 bool truthiness = FALSE;
450 GET_SELF_FROM_PPRIVATE(rx->pprivate);
452 callback = self->cb_named_capture_buff_EXISTS;
459 XPUSHs(rx->pprivate);
460 XPUSHs(SvREFCNT_inc(key));
461 XPUSHs(sv_2mortal(newSViv(flags)));
464 call_sv(callback, G_SCALAR);
469 truthiness = SvTRUE(ret);
480 Plugin_named_buff_FIRSTKEY(pTHX_ REGEXP * const rx, const U32 flags)
484 GET_SELF_FROM_PPRIVATE(rx->pprivate);
486 callback = self->cb_named_capture_buff_FIRSTKEY;
493 XPUSHs(rx->pprivate);
494 XPUSHs(sv_2mortal(newSViv(flags)));
497 call_sv(callback, G_SCALAR);
515 Plugin_named_buff_NEXTKEY(pTHX_ REGEXP * const rx, SV * const lastkey,
520 GET_SELF_FROM_PPRIVATE(rx->pprivate);
522 callback = self->cb_named_capture_buff_NEXTKEY;
529 XPUSHs(rx->pprivate);
530 XPUSHs(SvREFCNT_inc(lastkey));
531 XPUSHs(sv_2mortal(newSViv(flags)));
534 call_sv(callback, G_SCALAR);
552 Plugin_named_buff_SCALAR(pTHX_ REGEXP * const rx, const U32 flags)
556 GET_SELF_FROM_PPRIVATE(rx->pprivate);
558 callback = self->cb_named_capture_buff_SCALAR;
565 XPUSHs(rx->pprivate);
566 XPUSHs(sv_2mortal(newSViv(flags)));
569 call_sv(callback, G_SCALAR);
587 Plugin_package(pTHX_ REGEXP * const rx)
590 return newSVpvs("re::engine::Plugin");
593 MODULE = re::engine::Plugin PACKAGE = re::engine::Plugin
597 pattern(re::engine::Plugin self, ...)
599 XPUSHs(self->pattern);
602 str(re::engine::Plugin self, ...)
607 mod(re::engine::Plugin self, ...)
610 if (self->rx->intflags & PMf_FOLD) {
611 XPUSHs(sv_2mortal(newSVpvs("i")));
616 if (self->rx->intflags & PMf_MULTILINE) {
617 XPUSHs(sv_2mortal(newSVpvs("m")));
622 if (self->rx->intflags & PMf_SINGLELINE) {
623 XPUSHs(sv_2mortal(newSVpvs("s")));
628 if (self->rx->intflags & PMf_EXTENDED) {
629 XPUSHs(sv_2mortal(newSVpvs("x")));
634 if (self->rx->intflags & RXf_PMf_KEEPCOPY) {
635 XPUSHs(sv_2mortal(newSVpvs("p")));
640 stash(re::engine::Plugin self, ...)
644 SvREFCNT_inc(self->stash);
651 minlen(re::engine::Plugin self, ...)
654 self->rx->minlen = (I32)SvIV(ST(1));
657 if (self->rx->minlen) {
658 XPUSHs(sv_2mortal(newSViv(self->rx->minlen)));
660 XPUSHs(sv_2mortal(&PL_sv_undef));
665 gofs(re::engine::Plugin self, ...)
668 self->rx->gofs = (U32)SvIV(ST(1));
671 if (self->rx->gofs) {
672 XPUSHs(sv_2mortal(newSVuv(self->rx->gofs)));
674 XPUSHs(sv_2mortal(&PL_sv_undef));
679 nparens(re::engine::Plugin self, ...)
682 self->rx->nparens = (U32)SvIV(ST(1));
685 if (self->rx->nparens) {
686 XPUSHs(sv_2mortal(newSVuv(self->rx->nparens)));
688 XPUSHs(sv_2mortal(&PL_sv_undef));
693 _num_capture_buff_FETCH(re::engine::Plugin self, ...)
696 self->cb_num_capture_buff_FETCH = ST(1);
697 SvREFCNT_inc(self->cb_num_capture_buff_FETCH);
701 _num_capture_buff_STORE(re::engine::Plugin self, ...)
704 self->cb_num_capture_buff_STORE = ST(1);
705 SvREFCNT_inc(self->cb_num_capture_buff_STORE);
709 _num_capture_buff_LENGTH(re::engine::Plugin self, ...)
712 self->cb_num_capture_buff_LENGTH = ST(1);
713 SvREFCNT_inc(self->cb_num_capture_buff_LENGTH);
717 _named_capture_buff_FETCH(re::engine::Plugin self, ...)
720 self->cb_named_capture_buff_FETCH = ST(1);
721 SvREFCNT_inc(self->cb_named_capture_buff_FETCH);
725 _named_capture_buff_STORE(re::engine::Plugin self, ...)
728 self->cb_named_capture_buff_STORE = ST(1);
729 SvREFCNT_inc(self->cb_named_capture_buff_STORE);
733 _named_capture_buff_DELETE(re::engine::Plugin self, ...)
736 self->cb_named_capture_buff_DELETE = ST(1);
737 SvREFCNT_inc(self->cb_named_capture_buff_DELETE);
741 _named_capture_buff_CLEAR(re::engine::Plugin self, ...)
744 self->cb_named_capture_buff_CLEAR = ST(1);
745 SvREFCNT_inc(self->cb_named_capture_buff_CLEAR);
749 _named_capture_buff_EXISTS(re::engine::Plugin self, ...)
752 self->cb_named_capture_buff_EXISTS = ST(1);
753 SvREFCNT_inc(self->cb_named_capture_buff_EXISTS);
757 _named_capture_buff_FIRSTKEY(re::engine::Plugin self, ...)
760 self->cb_named_capture_buff_FIRSTKEY = ST(1);
761 SvREFCNT_inc(self->cb_named_capture_buff_FIRSTKEY);
765 _named_capture_buff_NEXTKEY(re::engine::Plugin self, ...)
768 self->cb_named_capture_buff_NEXTKEY = ST(1);
769 SvREFCNT_inc(self->cb_named_capture_buff_NEXTKEY);
773 _named_capture_buff_SCALAR(re::engine::Plugin self, ...)
776 self->cb_named_capture_buff_SCALAR = ST(1);
777 SvREFCNT_inc(self->cb_named_capture_buff_SCALAR);
783 XPUSHs(sv_2mortal(newSViv(PTR2IV(&engine_plugin))));