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;
#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;
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;
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);
}
}
}
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);
}
}
}
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 :
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.
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 */
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