1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
/* You may distribute under the terms of either the GNU General Public License
* or the Artistic License (the same terms as Perl itself)
*
* (C) Paul Evans, 2020-2023 -- leonerd@leonerd.org.uk
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "XSParseSublike.h"
#ifndef wrap_keyword_plugin
# include "wrap_keyword_plugin.c.inc"
#endif
static void func_pre_subparse(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Sf");
}
static void func_post_blockstart(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Ef");
}
static void func_pre_blockend(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Lf");
}
static void func_post_newcv(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Nf");
}
static const struct XSParseSublikeHooks parse_func_hooks = {
.ver = XSPARSESUBLIKE_ABI_VERSION,
.permit_hintkey = "t::any/func",
.pre_subparse = func_pre_subparse,
.post_blockstart = func_post_blockstart,
.pre_blockend = func_pre_blockend,
.post_newcv = func_post_newcv,
};
static void prefixed_pre_subparse(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Sp");
}
static void prefixed_post_blockstart(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Ep");
}
static void prefixed_pre_blockend(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Lp");
}
static void prefixed_post_newcv(pTHX_ struct XSParseSublikeContext *ctx, void *_logsv)
{
SV *logsv = _logsv;
sv_catpvs(logsv, "Np");
}
static const struct XSParseSublikeHooks parse_prefixed_hooks = {
.ver = XSPARSESUBLIKE_ABI_VERSION,
.pre_subparse = prefixed_pre_subparse,
.post_blockstart = prefixed_post_blockstart,
.pre_blockend = prefixed_pre_blockend,
.post_newcv = prefixed_post_newcv,
};
static int (*next_keyword_plugin)(pTHX_ char *, STRLEN, OP **);
static int my_keyword_plugin(pTHX_ char *kw, STRLEN kwlen, OP **op_ptr)
{
if(kwlen != 8 || !strEQ(kw, "prefixed"))
return (*next_keyword_plugin)(aTHX_ kw, kwlen, op_ptr);
lex_read_space(0);
return xs_parse_sublike_any(&parse_prefixed_hooks, SvREFCNT_inc(get_sv("main::LOG", 0)),
op_ptr);
}
MODULE = t::any PACKAGE = t::any
BOOT:
boot_xs_parse_sublike(0);
register_xs_parse_sublike("func", &parse_func_hooks, SvREFCNT_inc(get_sv("main::LOG", GV_ADD)));
wrap_keyword_plugin(&my_keyword_plugin, &next_keyword_plugin);
|