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 )