int tmh_cb_footnote_ref(hoedown_buffer *ob, unsigned int num, const hoedown_renderer_data *data) { dTHX; dSP; bool is_null = 0; SV** rcb = hv_fetchs((HV*)data->opaque, "footnote_ref", 0); if (!rcb) { return 0; } CB_HEADER("footnote_ref"); mXPUSHu(num); CB_FOOTER; return is_null ? 0 : 1; }
void tmh_cb_footnote_def(hoedown_buffer *ob, const hoedown_buffer *content, unsigned int num, const hoedown_renderer_data *data) { dTHX; dSP; bool is_null = 0; SV** rcb = hv_fetchs((HV*)data->opaque, "footnote_def", 0); if (!rcb) { return; } CB_HEADER("footnote_def"); PUSHBUF(content); mXPUSHu(num); CB_FOOTER; }
I32 regexp_exechook_hook (pTHX_ regexp* r, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, void* data, U32 flags) { if(!CONTAINS_RECOGNITION_FLAG(r)) { return previous_exec_hook(aTHX_ r,stringarg,strend,strbeg, minend,screamer,data,flags); } else { SV* perl_callback; I32 ret; IV matched; I32 delta; dSP; /* fprintf(stderr,"strarg=%lu\nstrbeg=%lu\nstrend=%lu\n",stringarg,strbeg,strend); fprintf(stderr,"minend=%ld pos=%ld\n",minend,PL_reg_ganch); fprintf(stderr,"flags=%lu\n",flags); */ perl_callback = r->substrs->data[0].substr; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(newSVpv(stringarg,strend-stringarg)); mXPUSHu(flags); mXPUSHu((unsigned long)r); PUTBACK; /* fprintf(stderr,"exec hook r=%lu callback SV*=%lu\n",(unsigned long)r,(unsigned long)perl_callback); */ ret = call_sv(perl_callback, G_ARRAY); /* fprintf(stderr,"exec hook survived.\n"); */ if(ret < 1) { fprintf(stderr,"regexp_hook_exec failed - didnt return anything\n"); exit(0); } SPAGAIN; matched = POPi; { /* fail captures */ int i; for(i=0;i<=r->nparens;i++) { r->startp[i] = -1; r->endp[i] = -1; } r->lastparen = r->lastcloseparen = 0; } if(matched) { SV* lp; SV* lcp; int i; if(ret < 3 || ret > 3 + 2 * (r->nparens+1)) { fprintf(stderr,"regexp_hook_exec failed - paren info broken\n"); exit(0); } lp = POPs; lcp = POPs; delta = stringarg-strbeg; for(i=0;i<=r->nparens && i+3<ret;i++) { I32 v = POPi; r->startp[i] = v >= 0 ? v+delta : v; v = POPi; r->endp[i] = v >= 0 ? v+delta : v; } r->lastparen = (lp == &PL_sv_undef) ? SvIV(lp) : r->nparens; r->lastcloseparen = (lcp == &PL_sv_undef) ? SvIV(lcp) : r->nparens; Safefree(r->subbeg); r->sublen = strend-strbeg; r->subbeg = savepvn(strbeg,r->sublen); } PUTBACK; FREETMPS; LEAVE; /* fprintf(stderr,"done.\n"); */ return matched ? 1 : 0; } }
regexp* hook_regcompp (pTHX_ char* exp, char* xend, PMOP* pm) { SV* handler = NULL; /* fprintf(stderr,"hook_regcompp in %lx\n",(unsigned long)exp); */ /* Check $^H for lexical selection of semantics and implementation */ if(handler == NULL) { const char hint_key[] = "regcompp"; SV** phandler; HV* hints; hints = get_hv("\b",0); if(hints != NULL) { phandler = hv_fetch(hints, hint_key, strlen(hint_key), 0); if(phandler != NULL) { handler = *phandler; /* fprintf(stderr,"hook_regcompp lexical...%lx\n",(unsigned long)handler); */ /* call_sv(handler,G_DISCARD|G_EVAL); fprintf(stderr,"can survive %lx %lx\n",(unsigned long)exp,(unsigned long)handler); */ } } } /* Check $re::override::regcompp for a dynamic selection of implementation */ if(handler == NULL) { SV* sv; sv = get_sv("$re::override::regcompp",0); if(sv != NULL && sv != &PL_sv_undef) { /* fprintf(stderr,"hook_regcompp dynamic...\n"); */ handler = sv; } } /* If no handlers, then hand off */ if(handler == NULL) { /* fprintf(stderr,"hook_regcompp punt.\n"); */ return previous_comp_hook(aTHX_ exp,xend,pm); } { dSP; char *nulpat; regexp* r; I32 ret; I32 api; nulpat = savepv(""); /*XXX - can be constant? */ r = Perl_pregcomp(aTHX_ nulpat,nulpat,pm); /*XXX - can free nulpat now? */ /* fprintf(stderr,"exp =%lu\nxend=%lu\n",(unsigned long)exp,(unsigned long)xend);*/ PUSHMARK(SP); XPUSHs(sv_2mortal(newSVpvn(exp,xend-exp))); mXPUSHu((unsigned long)r); PUTBACK; HANDLER_CALL: /* fprintf(stderr,"calling out...\n");*/ ret = call_sv(handler, G_ARRAY); /* fprintf(stderr,"...back.\n");*/ SPAGAIN; api = POPi; if(api == 13) { SV* pat; long nparens; SV* exec_callback_sub; /* fprintf(stderr,"api 13\n");*/ if(ret != 4) { fprintf(stderr,"api 13 violation\n"); exit(0); } pat = POPs; nparens = POPl; exec_callback_sub = POPs; PUTBACK; regexp_setup(aTHX_ r,pat,nparens,exec_callback_sub); } else if(api == 14) { SV* expr_code; SV* expr_result; /* fprintf(stderr,"api 14\n");*/ if(ret != 3) { fprintf(stderr,"api 14 violation\n"); exit(0); } handler = SvREFCNT_inc(POPs); /*XXX needed? */ expr_code = POPs; PUTBACK; expr_result = eval_pv(SvPV_nolen(expr_code),0); SPAGAIN; XPUSHs(expr_result); PUTBACK; goto HANDLER_CALL; } else { fprintf(stderr,"api UNKNOWN violation\n"); exit(0); } /* fprintf(stderr,"hook_regcompp done.\n"); */ return r; } }