]> git.vpit.fr Git - perl/modules/re-engine-Hooks.git/blob - t/re-engine-Hooks-TestDist/TestDist.xs
95e20ed3dc088bb07e7f58278ac00572522dcec8
[perl/modules/re-engine-Hooks.git] / t / re-engine-Hooks-TestDist / TestDist.xs
1 /* This file is part of the re::engine::Hooks Perl module.
2  * See http://search.cpan.org/dist/re-engine-Hooks/ */
3
4 #define PERL_NO_GET_CONTEXT
5 #include "EXTERN.h"
6 #include "perl.h"
7 #include "XSUB.h"
8
9 #include "re_engine_hooks.h"
10
11 #define __PACKAGE__     "re::engine::Hooks::TestDist"
12 #define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1)
13
14 #include "regcomp.h"
15
16 STATIC SV *reht_foo_var;
17
18 #define REHT_PUSH_NODE_NAME(V, P) do { \
19  if (V) {                              \
20   SV *sv = newSVpvn(P, sizeof(P) - 1); \
21   sv_catpv(sv, PL_reg_name[OP(node)]); \
22   av_push((AV *) SvRV(V), sv);         \
23  } } while (0)
24
25 STATIC void reht_foo_comp(pTHX_ regexp *rx, regnode *node) {
26  REHT_PUSH_NODE_NAME(reht_foo_var, "c:");
27 }
28
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:");
31 }
32
33 STATIC SV *reht_bar_var;
34
35 STATIC void reht_bar_comp(pTHX_ regexp *rx, regnode *node) {
36  REHT_PUSH_NODE_NAME(reht_bar_var, "c:");
37 }
38
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:");
41 }
42
43 STATIC SV *reht_custom_var;
44
45 STATIC void reht_custom_comp(pTHX_ regexp *rx, regnode *node) {
46  const char *node_name;
47
48  node_name = PL_reg_name[OP(node)];
49 }
50
51 STATIC void reht_custom_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) {
52  STRLEN      node_namelen;
53  const char *node_name;
54
55  node_name    = PL_reg_name[OP(node)];
56  node_namelen = strlen(node_name);
57
58  dSP;
59
60  ENTER;
61  SAVETMPS;
62
63  PUSHMARK(SP);
64  EXTEND(SP, 1);
65  mPUSHp(node_name, node_namelen);
66  PUTBACK;
67
68  call_sv(reht_custom_var, G_VOID | G_EVAL);
69
70  FREETMPS;
71  LEAVE;
72 }
73
74 /* --- XS ------------------------------------------------------------------ */
75
76 MODULE = re::engine::Hooks::TestDist    PACKAGE = re::engine::Hooks::TestDist
77
78 PROTOTYPES: ENABLE
79
80 BOOT:
81 {
82  reh_register(__PACKAGE__ "::foo", reht_foo_comp, reht_foo_exec);
83  reht_foo_var = NULL;
84
85  reh_register(__PACKAGE__ "::bar", reht_bar_comp, reht_bar_exec);
86  reht_bar_var = NULL;
87
88  reh_register(__PACKAGE__ "::custom", reht_custom_comp, reht_custom_exec);
89  reht_custom_var = NULL;
90 }
91
92 void
93 set_variable(SV *key, SV *var)
94 PROTOTYPE: $$
95 PREINIT:
96  STRLEN      len;
97  const char *s;
98 PPCODE:
99  s = SvPV(key, len);
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);
113  }
114  XSRETURN(0);