Keyword-Pluggable
view release on metacpan or search on metacpan
Pluggable.xs view on Meta::CPAN
mode_statement,
mode_expression,
mode_dynamic
};
static int my_keyword_plugin(pTHX_ char *keyword_ptr, STRLEN keyword_len, OP **op_ptr) {
SV *cb;
int mode, cb_result;
if ((cb = kw_handler(aTHX_ keyword_ptr, keyword_len, &mode))) {
cb_result = total_recall(aTHX_ cb);
switch (mode) {
case mode_statement:
mode = KEYWORD_PLUGIN_STMT;
break;
case mode_expression:
mode = KEYWORD_PLUGIN_EXPR;
break;
case mode_dynamic:
mode = cb_result? KEYWORD_PLUGIN_EXPR: KEYWORD_PLUGIN_STMT;
break;
default:
croak("%s: internal error: unrecognized expression mode %d", MY_PKG, mode);
break;
}
if (mode == KEYWORD_PLUGIN_EXPR) {
*op_ptr = parse_fullexpr(0);
} else {
*op_ptr = newOP(OP_NULL, 0);
}
return mode;
}
return next_keyword_plugin(aTHX_ keyword_ptr, keyword_len, op_ptr);
}
static void my_boot(pTHX) {
HV *const stash = gv_stashpvs(MY_PKG, GV_ADD);
newCONSTSUB(stash, "HINTK_KEYWORDS", newSVpvs(HINTK_KEYWORDS));
newCONSTSUB(stash, "MODE_STATEMENT", newSViv(mode_statement));
newCONSTSUB(stash, "MODE_EXPRESSION", newSViv(mode_expression));
newCONSTSUB(stash, "MODE_DYNAMIC", newSViv(mode_dynamic));
next_keyword_plugin = PL_keyword_plugin;
PL_keyword_plugin = my_keyword_plugin;
global_kw = newHV();
}
WARNINGS_RESET
MODULE = Keyword::Pluggable PACKAGE = Keyword::Pluggable
PROTOTYPES: ENABLE
BOOT:
my_boot(aTHX);
void define_global (char *kw, SV *entry)
PPCODE:
{
if ( !global_kw ) return;
hv_store( global_kw, kw, strlen(kw), newSVsv(entry), 0);
}
void undefine_global (char *kw)
PPCODE:
{
if ( !global_kw ) return;
hv_delete( global_kw, kw, strlen(kw), G_DISCARD);
}
void cleanup()
PPCODE:
{
sv_free(( SV *) global_kw);
global_kw = NULL;
}
( run in 1.308 second using v1.01-cache-2.11-cpan-5511b514fd6 )