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
84 foo_cfg.comp = reht_foo_comp;
85 foo_cfg.exec = reht_foo_exec;
86 reh_register(__PACKAGE__ "::foo", &foo_cfg);
92 bar_cfg.comp = reht_bar_comp;
93 bar_cfg.exec = reht_bar_exec;
94 reh_register(__PACKAGE__ "::bar", &bar_cfg);
99 reh_config custom_cfg;
100 custom_cfg.comp = reht_custom_comp;
101 custom_cfg.exec = reht_custom_exec;
102 reh_register(__PACKAGE__ "::custom", &custom_cfg);
103 reht_custom_var = NULL;
108 set_variable(SV *key, SV *var)
115 if (len == 3 && strcmp(s, "foo") == 0) {
116 if (!SvROK(var) || SvTYPE(SvRV(var)) != SVt_PVAV)
117 croak("Invalid variable type");
118 SvREFCNT_dec(reht_foo_var);
119 reht_foo_var = SvREFCNT_inc(var);
120 } else if (len == 3 && strcmp(s, "bar") == 0) {
121 if (!SvROK(var) || SvTYPE(SvRV(var)) != SVt_PVAV)
122 croak("Invalid variable type");
123 SvREFCNT_dec(reht_bar_var);
124 reht_bar_var = SvREFCNT_inc(var);
125 } else if (len == 6 && strcmp(s, "custom") == 0) {
126 SvREFCNT_dec(reht_custom_var);
127 reht_custom_var = SvREFCNT_inc(var);