File Coverage

t/probing.xs
Criterion Covered Total %
statement 7 7 100.0
branch 4 4 100.0
condition n/a
subroutine n/a
pod n/a
total 11 11 100.0


line stmt bran cond sub pod time code
1             /* You may distribute under the terms of either the GNU General Public License
2             * or the Artistic License (the same terms as Perl itself)
3             *
4             * (C) Paul Evans, 2021 -- leonerd@leonerd.org.uk
5             */
6              
7             #include "EXTERN.h"
8             #include "perl.h"
9             #include "XSUB.h"
10              
11             #include "XSParseKeyword.h"
12              
13             #include "perl-backcompat.c.inc"
14              
15             static const char hintkey[] = "t::probing/permit";
16              
17 26           static int build_constbool(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata)
18             {
19 26 100         *out = newSVOP(OP_CONST, 0, boolSV(args[0]->i));
20 26           return KEYWORD_PLUGIN_EXPR;
21             }
22              
23 3           static int build_repeatcount(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata)
24             {
25 3 100         *out = newSVOP(OP_CONST, 0, newSViv(args[0]->i ? args[1]->i : 0));
26 3           return KEYWORD_PLUGIN_EXPR;
27             }
28              
29             static const struct XSParseKeywordHooks hooks_colon = {
30             .permit_hintkey = hintkey,
31              
32             .pieces = (const struct XSParseKeywordPieceType []){
33             XPK_OPTIONAL( XPK_COLON ),
34             {0}
35             },
36             .build = &build_constbool,
37             };
38              
39             static const struct XSParseKeywordHooks hooks_literal = {
40             .permit_hintkey = hintkey,
41              
42             .pieces = (const struct XSParseKeywordPieceType []){
43             XPK_OPTIONAL( XPK_LITERAL("literal") ),
44             {0}
45             },
46             .build = &build_constbool,
47             };
48              
49             static const struct XSParseKeywordHooks hooks_block = {
50             .permit_hintkey = hintkey,
51              
52             .pieces = (const struct XSParseKeywordPieceType []){
53             XPK_OPTIONAL( XPK_BLOCK ),
54             {0}
55             },
56             .build = &build_constbool,
57             };
58              
59             static const struct XSParseKeywordHooks hooks_ident = {
60             .permit_hintkey = hintkey,
61              
62             .pieces = (const struct XSParseKeywordPieceType []){
63             XPK_OPTIONAL( XPK_IDENT ),
64             {0}
65             },
66             .build = &build_constbool,
67             };
68              
69             static const struct XSParseKeywordHooks hooks_packagename = {
70             .permit_hintkey = hintkey,
71              
72             .pieces = (const struct XSParseKeywordPieceType []){
73             XPK_OPTIONAL( XPK_PACKAGENAME ),
74             {0}
75             },
76             .build = &build_constbool,
77             };
78              
79             static const struct XSParseKeywordHooks hooks_vstring = {
80             .permit_hintkey = hintkey,
81              
82             .pieces = (const struct XSParseKeywordPieceType []){
83             XPK_OPTIONAL( XPK_VSTRING ),
84             {0}
85             },
86             .build = &build_constbool,
87             };
88              
89             static const struct XSParseKeywordHooks hooks_choice = {
90             .permit_hintkey = hintkey,
91              
92             .pieces = (const struct XSParseKeywordPieceType []){
93             XPK_OPTIONAL( XPK_CHOICE(
94             XPK_LITERAL("x"),
95             XPK_LITERAL("z")
96             ) ),
97             {0}
98             },
99             .build = &build_constbool,
100             };
101              
102             static const struct XSParseKeywordHooks hooks_taggedchoice = {
103             .permit_hintkey = hintkey,
104              
105             .pieces = (const struct XSParseKeywordPieceType []){
106             XPK_OPTIONAL( XPK_TAGGEDCHOICE(
107             XPK_LITERAL("x"), XPK_TAG('x'),
108             XPK_LITERAL("z"), XPK_TAG('z')
109             ) ),
110             {0}
111             },
112             .build = &build_constbool,
113             };
114              
115             static const struct XSParseKeywordHooks hooks_commalist = {
116             .permit_hintkey = hintkey,
117              
118             .pieces = (const struct XSParseKeywordPieceType []) {
119             XPK_OPTIONAL( XPK_COMMALIST( XPK_IDENT ) ),
120             {0},
121             },
122             .build = &build_repeatcount,
123             };
124              
125             static const struct XSParseKeywordHooks hooks_parens = {
126             .permit_hintkey = hintkey,
127              
128             .pieces = (const struct XSParseKeywordPieceType []){
129             XPK_OPTIONAL( XPK_PARENSCOPE( XPK_TERMEXPR ) ),
130             {0}
131             },
132             .build = &build_constbool,
133             };
134              
135             static const struct XSParseKeywordHooks hooks_brackets = {
136             .permit_hintkey = hintkey,
137              
138             .pieces = (const struct XSParseKeywordPieceType []){
139             XPK_OPTIONAL( XPK_BRACKETSCOPE( XPK_TERMEXPR ) ),
140             {0}
141             },
142             .build = &build_constbool,
143             };
144              
145             static const struct XSParseKeywordHooks hooks_braces = {
146             .permit_hintkey = hintkey,
147              
148             .pieces = (const struct XSParseKeywordPieceType []){
149             XPK_OPTIONAL( XPK_BRACESCOPE( XPK_TERMEXPR ) ),
150             {0}
151             },
152             .build = &build_constbool,
153             };
154              
155             static const struct XSParseKeywordHooks hooks_chevrons = {
156             .permit_hintkey = hintkey,
157              
158             .pieces = (const struct XSParseKeywordPieceType []){
159             XPK_OPTIONAL( XPK_CHEVRONSCOPE( XPK_IDENT ) ),
160             {0}
161             },
162             .build = &build_constbool,
163             };
164              
165             MODULE = t::probing PACKAGE = t::probing
166              
167             BOOT:
168 1           boot_xs_parse_keyword(0);
169              
170             register_xs_parse_keyword("probecolon", &hooks_colon, NULL);
171             register_xs_parse_keyword("probeliteral", &hooks_literal, NULL);
172              
173             register_xs_parse_keyword("probeblock", &hooks_block, NULL);
174             register_xs_parse_keyword("probeident", &hooks_ident, NULL);
175             register_xs_parse_keyword("probepackagename", &hooks_packagename, NULL);
176             register_xs_parse_keyword("probevstring", &hooks_vstring, NULL);
177              
178             register_xs_parse_keyword("probechoice", &hooks_choice, NULL);
179             register_xs_parse_keyword("probetaggedchoice", &hooks_taggedchoice, NULL);
180              
181             register_xs_parse_keyword("probecommalist", &hooks_commalist, NULL);
182              
183             register_xs_parse_keyword("probeparens", &hooks_parens, NULL);
184             register_xs_parse_keyword("probebrackets", &hooks_brackets, NULL);
185             register_xs_parse_keyword("probebraces", &hooks_braces, NULL);
186             register_xs_parse_keyword("probechevrons", &hooks_chevrons, NULL);