]> git.vpit.fr Git - perl/modules/re-engine-Hooks.git/commitdiff
Switch to a config-object based interface
authorVincent Pit <vince@profvince.com>
Fri, 30 Mar 2012 20:25:35 +0000 (22:25 +0200)
committerVincent Pit <vince@profvince.com>
Fri, 30 Mar 2012 20:36:01 +0000 (22:36 +0200)
Hooks.xs
lib/re/engine/Hooks.pm
re_engine_hooks.h
t/re-engine-Hooks-TestDist/TestDist.xs

index af878f3ba502ba703e9dbdde1f90a38d1a7aa222..0c9510a4c05d3895a5bf7f04afde9e0c2cc3d9e0 100644 (file)
--- a/Hooks.xs
+++ b/Hooks.xs
@@ -58,8 +58,7 @@ STATIC SV *reh_hint(pTHX) {
 
 typedef struct reh_action {
  struct reh_action *next;
- reh_comp_hook      comp;
- reh_exec_hook      exec;
+ reh_config         cbs;
  const char        *key;
  STRLEN             klen;
 } reh_action;
@@ -73,7 +72,7 @@ STATIC perl_mutex reh_action_list_mutex;
 #endif /* USE_ITHREADS */
 
 #undef reh_register
-void reh_register(pTHX_ const char *key, reh_comp_hook comp, reh_exec_hook exec) {
+void reh_register(pTHX_ const char *key, reh_config *cfg) {
  reh_action *a;
  char       *key_dup;
  STRLEN      i, len;
@@ -87,8 +86,7 @@ void reh_register(pTHX_ const char *key, reh_comp_hook comp, reh_exec_hook exec)
  key_dup[len] = '\0';
 
  a       = PerlMemShared_malloc(sizeof *a);
- a->comp = comp;
- a->exec = exec;
+ a->cbs  = *cfg;
  a->key  = key_dup;
  a->klen = len;
 
@@ -115,11 +113,11 @@ void reh_call_comp_hook(pTHX_ regexp *rx, regnode *node) {
   REH_UNLOCK(&reh_action_list_mutex);
 
   for (; a; a = a->next) {
-   if (a->comp) {
+   if (a->cbs.comp) {
     char *p = strstr(keys, a->key);
 
     if (p && (p + a->klen <= keys + len) && p[a->klen] == ' ')
-     a->comp(aTHX_ rx, node);
+     a->cbs.comp(aTHX_ rx, node);
    }
   }
  }
@@ -138,11 +136,11 @@ void reh_call_exec_hook(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo,
   REH_UNLOCK(&reh_action_list_mutex);
 
   for (; a; a = a->next) {
-   if (a->exec) {
+   if (a->cbs.exec) {
     char *p = strstr(keys, a->key);
 
     if (p && (p + a->klen <= keys + len) && p[a->klen] == ' ')
-     a->exec(aTHX_ rx, node, reginfo, st);
+     a->cbs.exec(aTHX_ rx, node, reginfo, st);
    }
   }
  }
index 07b71e4e505707b5a43796563b86d9b5d4277b1d..50ba58e63d8f294e18204e001403bd0c971e5b5a 100644 (file)
@@ -45,7 +45,10 @@ In your XS file :
 
     BOOT:
     {
-     reh_register("Devel::Regexp::Instrument", dri_comp_hook, dri_exec_hook);
+     reh_config cfg;
+     cfg.comp = dri_comp_hook;
+     cfg.exec = dri_exec_hook;
+     reh_register("Devel::Regexp::Instrument", &cfg);
     }
 
 In your Perl module file :
@@ -107,12 +110,35 @@ Currently evaluates to :
 
     typedef void (*reh_exec_hook)(pTHX_ regexp *, regnode *, regmatch_info *, regmatch_state *);
 
+=head2 C<reh_config>
+
+A typedef'd struct that holds a set of all the different callbacks publicized by this module.
+It has the following members :
+
+=over 4
+
+=item *
+
+C<comp>
+
+A function pointer of type C<reh_comp_hook> that will be called each time a regnode is compiled.
+Allowed to be C<NULL> if you don't want to call anything for this phase.
+
+=item *
+
+C<exec>
+
+A function pointer of type C<reh_exec_hook> that will be called each time a regnode is executed.
+Allowed to be C<NULL> if you don't want to call anything for this phase.
+
+=back
+
 =head2 C<reh_register>
 
-    void reh_register(pTHX_ const char *key, reh_comp_hook comp, reh_exec_hook exec);
+    void reh_register(pTHX_ const char *key, reh_config *cfg);
 
-Registers under the given name C<key> a callback C<comp> that will run during the compilation phase and a callback C<exec> that will run during the execution phase.
-Null function pointers are allowed in case you don't want to hook one of the phases.
+Registers the callbacks specified by the C<reh_config *> object C<cfg> under the given name C<key>.
+C<cfg> can be a pointer to a static object of type C<reh_config>.
 C<key> should match with the argument passed to L</enable> and L</disable> in Perl land.
 An exception will be thrown if C<key> has already been used to register callbacks.
 
index 190e98d37e5319b3b53c9eb546c28725037dac84..3613490d7e155f0c2a355a089d09d987698d701a 100644 (file)
@@ -7,8 +7,13 @@
 typedef void (*reh_comp_hook)(pTHX_ regexp *, regnode *);
 typedef void (*reh_exec_hook)(pTHX_ regexp *, regnode *, regmatch_info *, regmatch_state *);
 
-void reh_register(pTHX_ const char *key, reh_comp_hook comp, reh_exec_hook exec);
-#define reh_register(K, C, E) reh_register(aTHX_ (K), (C), (E))
+typedef struct {
+ reh_comp_hook comp;
+ reh_exec_hook exec;
+} reh_config;
+
+void reh_register(pTHX_ const char *, reh_config *);
+#define reh_register(K, C) reh_register(aTHX_ (K), (C))
 
 #endif /* RE_ENGINE_HOOKS_H */
 
index 95e20ed3dc088bb07e7f58278ac00572522dcec8..4e1d5119daa6fab681e9e069f3c3b3423cc64ed7 100644 (file)
@@ -79,14 +79,29 @@ PROTOTYPES: ENABLE
 
 BOOT:
 {
- reh_register(__PACKAGE__ "::foo", reht_foo_comp, reht_foo_exec);
- reht_foo_var = NULL;
+ {
+  reh_config foo_cfg;
+  foo_cfg.comp = reht_foo_comp;
+  foo_cfg.exec = reht_foo_exec;
+  reh_register(__PACKAGE__ "::foo", &foo_cfg);
+  reht_foo_var = NULL;
+ }
 
- reh_register(__PACKAGE__ "::bar", reht_bar_comp, reht_bar_exec);
- reht_bar_var = NULL;
+ {
+  reh_config bar_cfg;
+  bar_cfg.comp = reht_bar_comp;
+  bar_cfg.exec = reht_bar_exec;
+  reh_register(__PACKAGE__ "::bar", &bar_cfg);
+  reht_bar_var = NULL;
+ }
 
- reh_register(__PACKAGE__ "::custom", reht_custom_comp, reht_custom_exec);
- reht_custom_var = NULL;
+ {
+  reh_config custom_cfg;
+  custom_cfg.comp = reht_custom_comp;
+  custom_cfg.exec = reht_custom_exec;
+  reh_register(__PACKAGE__ "::custom", &custom_cfg);
+  reht_custom_var = NULL;
+ }
 }
 
 void