File Coverage

t/structures.xs
Criterion Covered Total %
statement 10 10 100.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 10 10 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             static const char hintkey[] = "t::structures/permit";
14              
15 6           static int build_op(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata)
16             {
17 6           *out = args[0]->op;
18 6           return KEYWORD_PLUGIN_EXPR;
19             }
20              
21 12           static int build_constiv(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata)
22             {
23             /* npieces should always be 1 because XPK_LITERAL() does not yield args */
24 12           *out = newSVOP(OP_CONST, 0, newSViv(args[0]->i));
25 12           return KEYWORD_PLUGIN_EXPR;
26             }
27              
28 1           static int build_constsv(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata)
29             {
30 1           *out = newSVOP(OP_CONST, 0, args[0]->sv);
31 1           return KEYWORD_PLUGIN_EXPR;
32             }
33              
34             static const struct XSParseKeywordHooks hooks_sequence = {
35             .permit_hintkey = hintkey,
36              
37             .pieces = (const struct XSParseKeywordPieceType []){
38             XPK_SEQUENCE(
39             XPK_LITERAL("part"),
40             XPK_TERMEXPR
41             ),
42             {0}
43             },
44             .build = &build_op,
45             };
46              
47             static const struct XSParseKeywordHooks hooks_optional = {
48             .permit_hintkey = hintkey,
49              
50             .pieces = (const struct XSParseKeywordPieceType []){
51             XPK_OPTIONAL(
52             XPK_LITERAL("part")
53             ),
54             {0}
55             },
56             .build = &build_constiv,
57             };
58              
59             static const struct XSParseKeywordHooks hooks_repeated = {
60             .permit_hintkey = hintkey,
61              
62             .pieces = (const struct XSParseKeywordPieceType []){
63             XPK_REPEATED(
64             XPK_LITERAL("part")
65             ),
66             {0}
67             },
68             .build = &build_constiv,
69             };
70              
71             static const struct XSParseKeywordHooks hooks_choice = {
72             .permit_hintkey = hintkey,
73              
74             .pieces = (const struct XSParseKeywordPieceType []) {
75             XPK_CHOICE(
76             XPK_LITERAL("zero"),
77             XPK_LITERAL("one"),
78             XPK_LITERAL("two"),
79             XPK_BLOCK
80             ),
81             {0}
82             },
83             .build = &build_constiv,
84             };
85              
86             static const struct XSParseKeywordHooks hooks_tagged = {
87             .permit_hintkey = hintkey,
88              
89             .pieces = (const struct XSParseKeywordPieceType []){
90             XPK_TAGGEDCHOICE(
91             XPK_LITERAL("one"), XPK_TAG(1),
92             XPK_LITERAL("two"), XPK_TAG(2),
93             XPK_LITERAL("three"), XPK_TAG(3)
94             ),
95             {0}
96             },
97             .build = &build_constiv,
98             };
99              
100             static const struct XSParseKeywordHooks hooks_commalist = {
101             .permit_hintkey = hintkey,
102              
103             .pieces = (const struct XSParseKeywordPieceType []){
104             XPK_COMMALIST( XPK_LITERAL("item") ),
105             {0}
106             },
107             .build = &build_constiv,
108             };
109              
110             static const struct XSParseKeywordHooks hooks_scope_paren = {
111             .permit_hintkey = hintkey,
112              
113             .pieces = (const struct XSParseKeywordPieceType []){
114             XPK_PARENSCOPE( XPK_TERMEXPR ),
115             {0}
116             },
117             .build = &build_op,
118             };
119              
120             static const struct XSParseKeywordHooks hooks_scope_args = {
121             .permit_hintkey = hintkey,
122              
123             .pieces = (const struct XSParseKeywordPieceType []){
124             XPK_ARGSCOPE( XPK_TERMEXPR ),
125             {0}
126             },
127             .build = &build_op,
128             };
129              
130             static const struct XSParseKeywordHooks hooks_scope_bracket = {
131             .permit_hintkey = hintkey,
132              
133             .pieces = (const struct XSParseKeywordPieceType []){
134             XPK_BRACKETSCOPE( XPK_TERMEXPR ),
135             {0}
136             },
137             .build = &build_op,
138             };
139              
140             static const struct XSParseKeywordHooks hooks_scope_brace = {
141             .permit_hintkey = hintkey,
142              
143             .pieces = (const struct XSParseKeywordPieceType []){
144             XPK_BRACESCOPE( XPK_TERMEXPR ),
145             {0}
146             },
147             .build = &build_op,
148             };
149              
150             static const struct XSParseKeywordHooks hooks_scope_chevron = {
151             .permit_hintkey = hintkey,
152              
153             .pieces = (const struct XSParseKeywordPieceType []){
154             /* A TERMEXPR inside chevrons is ambiguous, because of the < 2 > 1 > problem */
155             XPK_CHEVRONSCOPE( XPK_IDENT ),
156             {0}
157             },
158             .build = &build_constsv,
159             };
160              
161             MODULE = t::structures PACKAGE = t::structures
162              
163             BOOT:
164 2           boot_xs_parse_keyword(0);
165              
166             register_xs_parse_keyword("structsequence", &hooks_sequence, NULL);
167             register_xs_parse_keyword("structoptional", &hooks_optional, NULL);
168             register_xs_parse_keyword("structrepeat", &hooks_repeated, NULL);
169             register_xs_parse_keyword("structchoice", &hooks_choice, NULL);
170             register_xs_parse_keyword("structtagged", &hooks_tagged, NULL);
171             register_xs_parse_keyword("structcommalist", &hooks_commalist, NULL);
172              
173             register_xs_parse_keyword("scopeparen", &hooks_scope_paren, NULL);
174             register_xs_parse_keyword("scopeargs", &hooks_scope_args, NULL);
175             register_xs_parse_keyword("scopebracket", &hooks_scope_bracket, NULL);
176             register_xs_parse_keyword("scopebrace", &hooks_scope_brace, NULL);
177             register_xs_parse_keyword("scopechevron", &hooks_scope_chevron, NULL);