File: any.xs

package info (click to toggle)
libxs-parse-sublike-perl 0.37-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 516 kB
  • sloc: ansic: 944; perl: 930; sh: 6; makefile: 3
file content (102 lines) | stat: -rw-r--r-- 2,700 bytes parent folder | download
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);