Keyword-API
view release on metacpan or search on metacpan
sv_catsv(hintkey_keyword_sv, keyword);
SV *val_sv = newSViv(1);
HE *he;
PL_hints |= HINT_LOCALIZE_HH;
gv_HVadd(PL_hintgv);
he = hv_store_ent(GvHV(PL_hintgv),
hintkey_keyword_sv, val_sv, SvSHARED_HASH(hintkey_keyword_sv));
if(he) {
SV *val = HeVAL(he);
SvSETMAGIC(val);
} else {
SvREFCNT_dec(val_sv);
}
}
#define keyword_enable(class_sv, keyword_sv) THX_keyword_enable(aTHX_ class_sv, keyword_sv)
static void THX_keyword_disable(pTHX)
{
if(GvHV(PL_hintgv)) {
PL_hints |= HINT_LOCALIZE_HH;
hv_delete_ent(GvHV(PL_hintgv),
hintkey_keyword_sv, G_DISCARD, SvSHARED_HASH(hintkey_keyword_sv));
}
}
#define keyword_disable() THX_keyword_disable(aTHX)
static int my_keyword_plugin(pTHX_
char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
{
if (keyword_name_sv == NULL) {
return next_keyword_plugin(aTHX_ keyword_ptr, keyword_len, op_ptr);
}
STRLEN len;
char * kw_str = SvPV(keyword_name_sv, len);
int kw_len = strlen(kw_str);
if(keyword_len == kw_len && strnEQ(keyword_ptr, kw_str, kw_len) &&
keyword_active(hintkey_keyword_sv)) {
call_sv(keyword_parser_sv, G_DISCARD|G_NOARGS);
*op_ptr = newOP(OP_NULL,0);
return KEYWORD_PLUGIN_STMT;
} else {
return next_keyword_plugin(aTHX_
keyword_ptr, keyword_len, op_ptr);
}
}
MODULE = Keyword::API PACKAGE = Keyword::API
BOOT:
next_keyword_plugin = PL_keyword_plugin;
PL_keyword_plugin = my_keyword_plugin;
void
install_keyword(SV *classname, SV *keyword)
PPCODE:
keyword_enable(classname,keyword);
void
uninstall_keyword();
PPCODE:
keyword_disable();
void
lex_read_space(int flag);
SV*
lex_read(int chars)
CODE:
char *start = PL_bufptr;
char *end = start + chars;
lex_read_to(end);
RETVAL = newSVpvn(start, end-start);
OUTPUT:
RETVAL
SV *lex_read_to_ws()
CODE:
char *start = PL_bufptr;
char *p = start;
while(1) {
char x = *++p;
if (isSPACE(x)) {
break;
}
}
RETVAL = newSVpvn(start, p-start);
OUTPUT:
RETVAL
SV *lex_unstuff_to_ws()
CODE:
char *start = PL_bufptr;
char *p = start;
while(1) {
char x = *++p;
if (isSPACE(x)) {
break;
}
}
RETVAL = newSVpvn(start, p-start);
lex_unstuff(p);
OUTPUT:
RETVAL
SV* lex_unstuff_to(char s)
CODE:
char *start = PL_bufptr;
char *p = start;
while(1) {
char x = *++p;
if (x == s) {
break;
}
}
( run in 2.021 seconds using v1.01-cache-2.11-cpan-5511b514fd6 )