1 /* This file is part of the re::engine::Hooks Perl module.
2 * See http://search.cpan.org/dist/re-engine-Hooks/ */
4 #define PERL_NO_GET_CONTEXT
9 #include "re_engine_hooks.h"
11 #define __PACKAGE__ "re::engine::Hooks::TestDist"
12 #define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1)
16 STATIC SV *reht_foo_var;
18 #define REHT_PUSH_NODE_NAME(V, P) do { \
20 SV *sv = newSVpvn(P, sizeof(P) - 1); \
21 sv_catpv(sv, PL_reg_name[OP(node)]); \
22 av_push((AV *) SvRV(V), sv); \
25 STATIC void reht_foo_comp(pTHX_ regexp *rx, regnode *node) {
26 REHT_PUSH_NODE_NAME(reht_foo_var, "c:");
29 STATIC void reht_foo_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) {
30 REHT_PUSH_NODE_NAME(reht_foo_var, "e:");
33 STATIC SV *reht_bar_var;
35 STATIC void reht_bar_comp(pTHX_ regexp *rx, regnode *node) {
36 REHT_PUSH_NODE_NAME(reht_bar_var, "c:");
39 STATIC void reht_bar_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) {
40 REHT_PUSH_NODE_NAME(reht_bar_var, "e:");
43 STATIC SV *reht_custom_var;
45 STATIC void reht_custom_comp(pTHX_ regexp *rx, regnode *node) {
46 const char *node_name;
48 node_name = PL_reg_name[OP(node)];
51 STATIC void reht_custom_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) {
53 const char *node_name;
55 node_name = PL_reg_name[OP(node)];
56 node_namelen = strlen(node_name);
65 mPUSHp(node_name, node_namelen);
68 call_sv(reht_custom_var, G_VOID | G_EVAL);
74 /* --- XS ------------------------------------------------------------------ */
76 MODULE = re::engine::Hooks::TestDist PACKAGE = re::engine::Hooks::TestDist
82 reh_register(__PACKAGE__ "::foo", reht_foo_comp, reht_foo_exec);
85 reh_register(__PACKAGE__ "::bar", reht_bar_comp, reht_bar_exec);
88 reh_register(__PACKAGE__ "::custom", reht_custom_comp, reht_custom_exec);
89 reht_custom_var = NULL;
93 set_variable(SV *key, SV *var)
100 if (len == 3 && strcmp(s, "foo") == 0) {
101 if (!SvROK(var) || SvTYPE(SvRV(var)) != SVt_PVAV)
102 croak("Invalid variable type");
103 SvREFCNT_dec(reht_foo_var);
104 reht_foo_var = SvREFCNT_inc(var);
105 } else if (len == 3 && strcmp(s, "bar") == 0) {
106 if (!SvROK(var) || SvTYPE(SvRV(var)) != SVt_PVAV)
107 croak("Invalid variable type");
108 SvREFCNT_dec(reht_bar_var);
109 reht_bar_var = SvREFCNT_inc(var);
110 } else if (len == 6 && strcmp(s, "custom") == 0) {
111 SvREFCNT_dec(reht_custom_var);
112 reht_custom_var = SvREFCNT_inc(var);