GCC Code Coverage Report


Directory: lib/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 98.6% 214 / 0 / 217
Functions: 100.0% 17 / 0 / 17
Branches: 92.0% 240 / 0 / 261

format_completion_zsh.c
Line Branch Exec Source
1 #include <ctype.h>
2 #include <stdlib.h>
3
4 #include "ap_internal.h"
5
6 18242 static bool action_takes_no_value(ap_action action) {
7
2/4
✓ Branch 0 taken 12166 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12166 times.
✗ Branch 3 not taken.
12166 return action == AP_ACTION_STORE_TRUE || action == AP_ACTION_STORE_FALSE ||
8
3/4
✓ Branch 0 taken 12166 times.
✓ Branch 1 taken 6076 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12166 times.
30408 action == AP_ACTION_COUNT || action == AP_ACTION_STORE_CONST;
9 }
10
11 18282 static bool option_takes_value(const ap_arg_def *def) {
12
5/6
✓ Branch 0 taken 18282 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18242 times.
✓ Branch 3 taken 40 times.
✓ Branch 5 taken 12166 times.
✓ Branch 6 taken 6076 times.
18282 return def && def->is_optional && !action_takes_no_value(def->opts.action);
13 }
14
15 2954 static ap_completion_kind option_completion_kind(const ap_arg_def *def) {
16
2/2
✓ Branch 1 taken 948 times.
✓ Branch 2 taken 2006 times.
2954 if (!option_takes_value(def)) {
17 948 return AP_COMPLETION_KIND_NONE;
18 }
19
2/2
✓ Branch 0 taken 572 times.
✓ Branch 1 taken 1434 times.
2006 if (def->opts.completion_kind != AP_COMPLETION_KIND_NONE) {
20 572 return def->opts.completion_kind;
21 }
22
3/4
✓ Branch 0 taken 964 times.
✓ Branch 1 taken 470 times.
✓ Branch 2 taken 964 times.
✗ Branch 3 not taken.
1434 if (def->opts.choices.items && def->opts.choices.count > 0) {
23 964 return AP_COMPLETION_KIND_CHOICES;
24 }
25 470 return AP_COMPLETION_KIND_NONE;
26 }
27
28 806 static bool option_has_dynamic_completion(const ap_arg_def *def) {
29
3/4
✓ Branch 1 taken 806 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 110 times.
✓ Branch 4 taken 696 times.
806 return option_takes_value(def) && def->opts.completion_callback != NULL;
30 }
31
32 806 static const char *completion_dispatch_kind_name(const ap_arg_def *def) {
33
2/2
✓ Branch 1 taken 110 times.
✓ Branch 2 taken 696 times.
806 if (option_has_dynamic_completion(def)) {
34 110 return "dynamic";
35 }
36
5/5
✓ Branch 1 taken 346 times.
✓ Branch 2 taken 114 times.
✓ Branch 3 taken 110 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 124 times.
696 switch (option_completion_kind(def)) {
37 346 case AP_COMPLETION_KIND_CHOICES:
38 346 return "choices";
39 114 case AP_COMPLETION_KIND_FILE:
40 114 return "file";
41 110 case AP_COMPLETION_KIND_DIRECTORY:
42 110 return "directory";
43 2 case AP_COMPLETION_KIND_COMMAND:
44 2 return "command";
45 124 case AP_COMPLETION_KIND_NONE:
46 default:
47 124 return "none";
48 }
49 }
50
51 978 static const char *option_value_mode(const ap_arg_def *def) {
52
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 978 times.
978 if (!option_takes_value(def)) {
53 return "none";
54 }
55
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 972 times.
978 switch (def->opts.nargs) {
56 2 case AP_NARGS_OPTIONAL:
57 2 return "optional";
58 2 case AP_NARGS_ZERO_OR_MORE:
59 case AP_NARGS_ONE_OR_MORE:
60 2 return "multi";
61 2 case AP_NARGS_FIXED:
62
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return def->opts.nargs_count > 1 ? "fixed" : "single";
63 972 case AP_NARGS_ONE:
64 default:
65 972 return "single";
66 }
67 }
68
69 634 static int option_value_count(const ap_arg_def *def) {
70
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 634 times.
634 if (!option_takes_value(def)) {
71 return 0;
72 }
73
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 632 times.
634 if (def->opts.nargs == AP_NARGS_FIXED) {
74 2 return def->opts.nargs_count;
75 }
76 632 return 1;
77 }
78
79 16318 static int append_single_quoted(ap_string_builder *sb, const char *text) {
80
1/2
✓ Branch 0 taken 16318 times.
✗ Branch 1 not taken.
16318 const unsigned char *p = (const unsigned char *)(text ? text : "");
81
82
2/2
✓ Branch 1 taken 98 times.
✓ Branch 2 taken 16220 times.
16318 if (ap_sb_appendf(sb, "'") != 0) {
83 98 return -1;
84 }
85
2/2
✓ Branch 0 taken 83500 times.
✓ Branch 1 taken 15704 times.
99204 while (*p != '\0') {
86
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 83318 times.
83500 if (*p == '\'') {
87
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 180 times.
182 if (ap_sb_appendf(sb, "'\\''") != 0) {
88 2 return -1;
89 }
90
2/2
✓ Branch 1 taken 514 times.
✓ Branch 2 taken 82804 times.
83318 } else if (ap_sb_appendf(sb, "%c", (char)*p) != 0) {
91 514 return -1;
92 }
93 82984 p++;
94 }
95 15704 return ap_sb_appendf(sb, "'");
96 }
97
98 1244 static int append_identifier(ap_string_builder *sb, const char *text) {
99 size_t i;
100
1/2
✓ Branch 0 taken 1244 times.
✗ Branch 1 not taken.
1244 const char *value = text ? text : "argparse_c";
101
102
2/2
✓ Branch 0 taken 6888 times.
✓ Branch 1 taken 1200 times.
8088 for (i = 0; value[i] != '\0'; i++) {
103 6888 unsigned char c = (unsigned char)value[i];
104
4/4
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 6248 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 632 times.
6888 if (isalnum(c) || c == '_') {
105
2/2
✓ Branch 1 taken 40 times.
✓ Branch 2 taken 6216 times.
6256 if (ap_sb_appendf(sb, "%c", (char)c) != 0) {
106 40 return -1;
107 }
108
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 628 times.
632 } else if (ap_sb_appendf(sb, "_") != 0) {
109 4 return -1;
110 }
111 }
112 1200 return 0;
113 }
114
115 6690 static int append_parser_key(ap_string_builder *sb, const ap_parser *parser) {
116
3/4
✓ Branch 0 taken 6690 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5194 times.
✓ Branch 3 taken 1496 times.
6690 if (!parser || !parser->parent) {
117 5194 return ap_sb_appendf(sb, "root");
118 }
119
2/2
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 1482 times.
1496 if (append_parser_key(sb, parser->parent) != 0) {
120 14 return -1;
121 }
122 1482 return ap_sb_appendf(sb, "/%s", parser->command_name);
123 }
124
125 5354 static int append_words_array(ap_string_builder *sb, const char *name,
126 const ap_parser *parser, bool optionals,
127 bool value_only, bool flag_only) {
128 int i;
129 int j;
130
131
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 5324 times.
5354 if (ap_sb_appendf(sb, " %s=(", name) != 0) {
132 30 return -1;
133 }
134
2/2
✓ Branch 0 taken 13890 times.
✓ Branch 1 taken 4776 times.
18666 for (i = 0; i < parser->defs_count; i++) {
135 13890 const ap_arg_def *def = &parser->defs[i];
136
3/4
✓ Branch 0 taken 13890 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 13860 times.
13890 if (optionals && !def->is_optional) {
137 30 continue;
138 }
139
1/2
✓ Branch 0 taken 13860 times.
✗ Branch 1 not taken.
13860 if (optionals) {
140
4/4
✓ Branch 0 taken 4600 times.
✓ Branch 1 taken 9260 times.
✓ Branch 3 taken 1746 times.
✓ Branch 4 taken 2854 times.
13860 if (value_only && !option_takes_value(def)) {
141 1746 continue;
142 }
143
5/6
✓ Branch 0 taken 3972 times.
✓ Branch 1 taken 8142 times.
✓ Branch 2 taken 3972 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2380 times.
✓ Branch 6 taken 1592 times.
12114 if (flag_only && (!def->is_optional || option_takes_value(def))) {
144 2380 continue;
145 }
146
5/6
✓ Branch 0 taken 6880 times.
✓ Branch 1 taken 2854 times.
✓ Branch 2 taken 5288 times.
✓ Branch 3 taken 1592 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5288 times.
9734 if (!value_only && !flag_only && !def->is_optional) {
147 continue;
148 }
149
2/2
✓ Branch 0 taken 13230 times.
✓ Branch 1 taken 9186 times.
22416 for (j = 0; j < def->flags_count; j++) {
150
4/4
✓ Branch 1 taken 13162 times.
✓ Branch 2 taken 68 times.
✓ Branch 3 taken 480 times.
✓ Branch 4 taken 12682 times.
26392 if (ap_sb_appendf(sb, " ") != 0 ||
151 13162 append_single_quoted(sb, def->flags[j]) != 0) {
152 548 return -1;
153 }
154 }
155 }
156 }
157 4776 return ap_sb_appendf(sb, " )\n");
158 }
159
160 2126 static int append_load_parser_cases(ap_string_builder *sb,
161 const ap_parser *parser) {
162 int i;
163
164
6/6
✓ Branch 1 taken 2116 times.
✓ Branch 2 taken 10 times.
✓ Branch 4 taken 2100 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 2090 times.
4226 if (ap_sb_appendf(sb, " ") != 0 || append_parser_key(sb, parser) != 0 ||
165 2100 ap_sb_appendf(sb, ")\n parser_subcommands=(") != 0) {
166 36 return -1;
167 }
168
2/2
✓ Branch 0 taken 1692 times.
✓ Branch 1 taken 2042 times.
3734 for (i = 0; i < parser->subcommands_count; i++) {
169
4/4
✓ Branch 1 taken 1686 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 1644 times.
3378 if (ap_sb_appendf(sb, " ") != 0 ||
170 1686 append_single_quoted(sb, parser->subcommands[i].name) != 0) {
171 48 return -1;
172 }
173 }
174
4/4
✓ Branch 1 taken 2032 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 1738 times.
✓ Branch 4 taken 294 times.
4074 if (ap_sb_appendf(sb, " )\n") != 0 ||
175 2032 append_words_array(sb, "parser_options", parser, true, false, false) !=
176
2/2
✓ Branch 0 taken 1584 times.
✓ Branch 1 taken 154 times.
1738 0 ||
177 1738 append_words_array(sb, "parser_value_options", parser, true, true,
178
2/2
✓ Branch 0 taken 1424 times.
✓ Branch 1 taken 160 times.
1584 false) != 0 ||
179 1584 append_words_array(sb, "parser_flag_only_options", parser, true, false,
180
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1414 times.
1424 true) != 0 ||
181 1424 ap_sb_appendf(sb, " ;;\n") != 0) {
182 628 return -1;
183 }
184
185
2/2
✓ Branch 0 taken 982 times.
✓ Branch 1 taken 1138 times.
2120 for (i = 0; i < parser->subcommands_count; i++) {
186
2/2
✓ Branch 1 taken 276 times.
✓ Branch 2 taken 706 times.
982 if (append_load_parser_cases(sb, parser->subcommands[i].parser) != 0) {
187 276 return -1;
188 }
189 }
190 1138 return 0;
191 }
192
193 920 static int append_choice_cases(ap_string_builder *sb, const ap_parser *parser) {
194 int i;
195 int j;
196 int k;
197
198
2/2
✓ Branch 0 taken 2258 times.
✓ Branch 1 taken 800 times.
3058 for (i = 0; i < parser->defs_count; i++) {
199 2258 const ap_arg_def *def = &parser->defs[i];
200
2/2
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 1640 times.
2258 if (option_completion_kind(def) != AP_COMPLETION_KIND_CHOICES ||
201
2/4
✓ Branch 0 taken 618 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 618 times.
618 !def->opts.choices.items || def->opts.choices.count <= 0) {
202 1640 continue;
203 }
204
2/2
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 498 times.
1116 for (j = 0; j < def->flags_count; j++) {
205
4/4
✓ Branch 1 taken 612 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 604 times.
✓ Branch 4 taken 8 times.
1230 if (ap_sb_appendf(sb, " ") != 0 ||
206
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 598 times.
1216 append_parser_key(sb, parser) != 0 ||
207 604 ap_sb_appendf(sb, ":%s) reply=(", def->flags[j]) != 0) {
208 20 return -1;
209 }
210
2/2
✓ Branch 0 taken 1148 times.
✓ Branch 1 taken 504 times.
1652 for (k = 0; k < def->opts.choices.count; k++) {
211
4/4
✓ Branch 1 taken 1136 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 82 times.
✓ Branch 4 taken 1054 times.
2284 if (ap_sb_appendf(sb, " ") != 0 ||
212 1136 append_single_quoted(sb, def->opts.choices.items[k]) != 0) {
213 94 return -1;
214 }
215 }
216
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 498 times.
504 if (ap_sb_appendf(sb, " ) ;;\n") != 0) {
217 6 return -1;
218 }
219 }
220 }
221
2/2
✓ Branch 0 taken 492 times.
✓ Branch 1 taken 762 times.
1254 for (i = 0; i < parser->subcommands_count; i++) {
222
2/2
✓ Branch 1 taken 38 times.
✓ Branch 2 taken 454 times.
492 if (append_choice_cases(sb, parser->subcommands[i].parser) != 0) {
223 38 return -1;
224 }
225 }
226 762 return 0;
227 }
228
229 698 static int append_value_mode_cases(ap_string_builder *sb,
230 const ap_parser *parser) {
231 int i;
232 int j;
233
234
2/2
✓ Branch 0 taken 1734 times.
✓ Branch 1 taken 654 times.
2388 for (i = 0; i < parser->defs_count; i++) {
235 1734 const ap_arg_def *def = &parser->defs[i];
236
2/2
✓ Branch 1 taken 726 times.
✓ Branch 2 taken 1008 times.
1734 if (!option_takes_value(def)) {
237 726 continue;
238 }
239
2/2
✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 964 times.
1972 for (j = 0; j < def->flags_count; j++) {
240
4/4
✓ Branch 1 taken 994 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 978 times.
✓ Branch 4 taken 16 times.
2002 if (ap_sb_appendf(sb, " ") != 0 ||
241
2/2
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 964 times.
1972 append_parser_key(sb, parser) != 0 ||
242 978 ap_sb_appendf(sb, ":%s) printf '%%s\\n' '%s' ;;\n", def->flags[j],
243 option_value_mode(def)) != 0) {
244 44 return -1;
245 }
246 }
247 }
248
2/2
✓ Branch 0 taken 394 times.
✓ Branch 1 taken 646 times.
1040 for (i = 0; i < parser->subcommands_count; i++) {
249
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 386 times.
394 if (append_value_mode_cases(sb, parser->subcommands[i].parser) != 0) {
250 8 return -1;
251 }
252 }
253 646 return 0;
254 }
255
256 582 static int append_completion_kind_cases(ap_string_builder *sb,
257 const ap_parser *parser) {
258 int i;
259 int j;
260
261
2/2
✓ Branch 0 taken 1446 times.
✓ Branch 1 taken 538 times.
1984 for (i = 0; i < parser->defs_count; i++) {
262 1446 const ap_arg_def *def = &parser->defs[i];
263
2/2
✓ Branch 1 taken 610 times.
✓ Branch 2 taken 836 times.
1446 if (!option_takes_value(def)) {
264 610 continue;
265 }
266
2/2
✓ Branch 0 taken 836 times.
✓ Branch 1 taken 792 times.
1628 for (j = 0; j < def->flags_count; j++) {
267
4/4
✓ Branch 1 taken 822 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 806 times.
✓ Branch 4 taken 16 times.
1658 if (ap_sb_appendf(sb, " ") != 0 ||
268
2/2
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 792 times.
1628 append_parser_key(sb, parser) != 0 ||
269 806 ap_sb_appendf(sb, ":%s) printf '%%s\\n' '%s' ;;\n", def->flags[j],
270 completion_dispatch_kind_name(def)) != 0) {
271 44 return -1;
272 }
273 }
274 }
275
2/2
✓ Branch 0 taken 326 times.
✓ Branch 1 taken 530 times.
856 for (i = 0; i < parser->subcommands_count; i++) {
276
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 318 times.
326 if (append_completion_kind_cases(sb, parser->subcommands[i].parser) != 0) {
277 8 return -1;
278 }
279 }
280 530 return 0;
281 }
282
283 466 static int append_value_count_cases(ap_string_builder *sb,
284 const ap_parser *parser) {
285 int i;
286 int j;
287
288
2/2
✓ Branch 0 taken 1158 times.
✓ Branch 1 taken 422 times.
1580 for (i = 0; i < parser->defs_count; i++) {
289 1158 const ap_arg_def *def = &parser->defs[i];
290
2/2
✓ Branch 1 taken 494 times.
✓ Branch 2 taken 664 times.
1158 if (!option_takes_value(def)) {
291 494 continue;
292 }
293
2/2
✓ Branch 0 taken 664 times.
✓ Branch 1 taken 620 times.
1284 for (j = 0; j < def->flags_count; j++) {
294
4/4
✓ Branch 1 taken 650 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 634 times.
✓ Branch 4 taken 16 times.
1314 if (ap_sb_appendf(sb, " ") != 0 ||
295
2/2
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 620 times.
1284 append_parser_key(sb, parser) != 0 ||
296 634 ap_sb_appendf(sb, ":%s) printf '%%d\\n' %d ;;\n", def->flags[j],
297 option_value_count(def)) != 0) {
298 44 return -1;
299 }
300 }
301 }
302
2/2
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 414 times.
672 for (i = 0; i < parser->subcommands_count; i++) {
303
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 250 times.
258 if (append_value_count_cases(sb, parser->subcommands[i].parser) != 0) {
304 8 return -1;
305 }
306 }
307 414 return 0;
308 }
309
310 1178 char *ap_zsh_completion_build(const ap_parser *parser) {
311 ap_string_builder sb;
312 const char *prog;
313
314
5/6
✓ Branch 0 taken 1176 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1176 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1174 times.
1178 if (!parser || !parser->prog || parser->prog[0] == '\0') {
315 4 return NULL;
316 }
317
2/4
✓ Branch 0 taken 1174 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1174 times.
1174 prog = parser->command_name && parser->command_name[0] != '\0'
318 ? parser->command_name
319 : parser->prog;
320
321 1174 ap_sb_init(&sb);
322
2/2
✓ Branch 0 taken 1170 times.
✓ Branch 1 taken 4 times.
1174 if (ap_sb_appendf(&sb, "#compdef %s\n# zsh completion for %s\n_", prog,
323
2/2
✓ Branch 1 taken 1148 times.
✓ Branch 2 taken 22 times.
2344 parser->prog) != 0 ||
324
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1144 times.
2318 append_identifier(&sb, prog) != 0 ||
325 1148 ap_sb_appendf(
326 &sb, "() {\n"
327 " local cur parser_key pending_option pending_mode option_name "
328 "value_prefix completion_kind\n"
329 " local -a parser_subcommands parser_options "
330 "parser_value_options parser_flag_only_options choices reply "
331 "subcommand_descriptions option_descriptions dynamic_reply\n"
332 " cur=\"${words[CURRENT]}\"\n"
333 " parser_key='root'\n"
334 " pending_option=''\n"
335 " pending_mode=''\n"
336 " integer pending_fixed_remaining=0\n\n"
337 " __ap_zsh_load_parser() {\n"
338 " case \"$1\" in\n") != 0) {
339 30 ap_sb_free(&sb);
340 30 return NULL;
341 }
342
4/4
✓ Branch 1 taken 432 times.
✓ Branch 2 taken 712 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 428 times.
1576 if (append_load_parser_cases(&sb, parser) != 0 ||
343 432 ap_sb_appendf(&sb, " *) return 1 ;;\n"
344 " esac\n"
345 " return 0\n"
346 " }\n\n"
347 " __ap_zsh_choice_words() {\n"
348 " reply=()\n"
349 " case \"$1\" in\n") != 0) {
350 716 ap_sb_free(&sb);
351 716 return NULL;
352 }
353
4/4
✓ Branch 1 taken 308 times.
✓ Branch 2 taken 120 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 304 times.
736 if (append_choice_cases(&sb, parser) != 0 ||
354 308 ap_sb_appendf(&sb, " *) return 1 ;;\n"
355 " esac\n"
356 " return 0\n"
357 " }\n\n"
358 " __ap_zsh_option_value_mode() {\n"
359 " case \"$1\" in\n") != 0) {
360 124 ap_sb_free(&sb);
361 124 return NULL;
362 }
363
4/4
✓ Branch 1 taken 260 times.
✓ Branch 2 taken 44 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 256 times.
564 if (append_value_mode_cases(&sb, parser) != 0 ||
364 260 ap_sb_appendf(&sb, " *) return 1 ;;\n"
365 " esac\n"
366 " }\n\n"
367 " __ap_zsh_option_completion_kind() {\n"
368 " case \"$1\" in\n") != 0) {
369 48 ap_sb_free(&sb);
370 48 return NULL;
371 }
372
4/4
✓ Branch 1 taken 212 times.
✓ Branch 2 taken 44 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 208 times.
468 if (append_completion_kind_cases(&sb, parser) != 0 ||
373 212 ap_sb_appendf(&sb, " *) return 1 ;;\n"
374 " esac\n"
375 " }\n\n"
376 " __ap_zsh_option_value_count() {\n"
377 " case \"$1\" in\n") != 0) {
378 48 ap_sb_free(&sb);
379 48 return NULL;
380 }
381
4/4
✓ Branch 1 taken 164 times.
✓ Branch 2 taken 44 times.
✓ Branch 3 taken 160 times.
✓ Branch 4 taken 4 times.
372 if (append_value_count_cases(&sb, parser) != 0 ||
382 164 ap_sb_appendf(&sb, " *) return 1 ;;\n"
383 " esac\n"
384 " }\n\n"
385 " __ap_zsh_has_word() {\n"
386 " local item=$1\n"
387 " shift\n"
388 " local candidate\n"
389 " for candidate in \"$@\"; do\n"
390 " [[ \"$candidate\" == \"$item\" ]] && return 0\n"
391 " done\n"
392 " return 1\n"
393 " }\n\n"
394 " __ap_zsh_dynamic_query() {\n"
395 " local -a query_words\n"
396 " query_words=(\"${words[@]:2}\")\n"
397
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 30 times.
160 " ") != 0 ||
398
4/4
✓ Branch 2 taken 126 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 78 times.
✓ Branch 5 taken 48 times.
416 append_single_quoted(&sb, prog) != 0 || ap_sb_appendf(&sb, " ") != 0 ||
399
2/2
✓ Branch 2 taken 74 times.
✓ Branch 3 taken 4 times.
204 append_single_quoted(&sb, ap_parser_completion_entrypoint(parser)) != 0 ||
400 78 ap_sb_appendf(
401 &sb,
402 " --shell zsh -- \"${query_words[@]}\"\n"
403 " }\n\n"
404 " __ap_zsh_load_parser \"$parser_key\" || return 0\n"
405 " integer i=2\n"
406 " while (( i < CURRENT )); do\n"
407 " local token=${words[i]}\n"
408 " if [[ -n \"$pending_option\" ]]; then\n"
409 " case \"$pending_mode\" in\n"
410 " single)\n"
411 " pending_option=''\n"
412 " pending_mode=''\n"
413 " ;;\n"
414 " fixed)\n"
415 " pending_fixed_remaining=$((pending_fixed_remaining - 1))\n"
416 " if (( pending_fixed_remaining <= 0 )); then\n"
417 " pending_option=''\n"
418 " pending_mode=''\n"
419 " pending_fixed_remaining=0\n"
420 " fi\n"
421 " ;;\n"
422 " optional|multi)\n"
423 " if [[ \"$token\" != -* ]]; then\n"
424 " if [[ \"$pending_mode\" == optional ]]; then\n"
425 " pending_option=''\n"
426 " pending_mode=''\n"
427 " fi\n"
428 " else\n"
429 " pending_option=''\n"
430 " pending_mode=''\n"
431 " fi\n"
432 " ;;\n"
433 " esac\n"
434 " fi\n"
435 " if [[ \"$token\" == --*=* ]]; then\n"
436 " option_name=${token%%=*}\n"
437 " if __ap_zsh_has_word \"$option_name\" "
438 "\"${parser_value_options[@]}\"; then\n"
439 " :\n"
440 " fi\n"
441 " elif [[ \"$token\" == -* ]]; then\n"
442 " if __ap_zsh_has_word \"$token\" "
443 "\"${parser_value_options[@]}\"; then\n"
444 " pending_option=$token\n"
445 " pending_mode=$(__ap_zsh_option_value_mode "
446 "\"$parser_key:$token\")\n"
447 " pending_fixed_remaining=$(__ap_zsh_option_value_count "
448 "\"$parser_key:$token\")\n"
449 " fi\n"
450 " elif __ap_zsh_has_word \"$token\" \"${parser_subcommands[@]}\"; "
451 "then\n"
452 " if [[ \"$parser_key\" == root ]]; then\n"
453 " parser_key=\"root/$token\"\n"
454 " else\n"
455 " parser_key=\"$parser_key/$token\"\n"
456 " fi\n"
457 " pending_option=''\n"
458 " pending_mode=''\n"
459 " pending_fixed_remaining=0\n"
460 " __ap_zsh_load_parser \"$parser_key\" || return 0\n"
461 " fi\n"
462 " i=$((i + 1))\n"
463 " done\n\n"
464 " if [[ \"$cur\" == --*=* ]]; then\n"
465 " option_name=${cur%%=*}\n"
466 " value_prefix=${cur#*=}\n"
467 " completion_kind=$(__ap_zsh_option_completion_kind "
468 "\"$parser_key:$option_name\" 2>/dev/null || printf '%%s' none)\n"
469 " case \"$completion_kind\" in\n"
470 " choices)\n"
471 " if __ap_zsh_choice_words \"$parser_key:$option_name\" "
472 "2>/dev/null; then\n"
473 " compadd -Q -S '' -P \"$option_name=\" -- "
474 "${(M)reply:#$value_prefix*}\n"
475 " fi\n"
476 " return 0\n"
477 " ;;\n"
478 " dynamic)\n"
479 " dynamic_reply=(\"$(@f)$(__ap_zsh_dynamic_query)\")\n"
480 " compadd -Q -S '' -P \"$option_name=\" -- "
481 "${(M)dynamic_reply:#$value_prefix*}\n"
482 " return 0\n"
483 " ;;\n"
484 " file)\n"
485 " _files -P \"$option_name=\"\n"
486 " return 0\n"
487 " ;;\n"
488 " directory)\n"
489 " _files -/ -P \"$option_name=\"\n"
490 " return 0\n"
491 " ;;\n"
492 " command)\n"
493 " _command_names -P \"$option_name=\"\n"
494 " return 0\n"
495 " ;;\n"
496 " esac\n"
497 " fi\n\n"
498 " if [[ -n \"$pending_option\" ]]; then\n"
499 " completion_kind=$(__ap_zsh_option_completion_kind "
500 "\"$parser_key:$pending_option\" 2>/dev/null || printf '%%s' none)\n"
501 " case \"$completion_kind\" in\n"
502 " choices)\n"
503 " if __ap_zsh_choice_words \"$parser_key:$pending_option\" "
504 "2>/dev/null; then\n"
505 " compadd -Q -S '' -- $reply\n"
506 " fi\n"
507 " return 0\n"
508 " ;;\n"
509 " dynamic)\n"
510 " dynamic_reply=(\"$(@f)$(__ap_zsh_dynamic_query)\")\n"
511 " compadd -Q -S '' -- $dynamic_reply\n"
512 " return 0\n"
513 " ;;\n"
514 " file)\n"
515 " _files\n"
516 " return 0\n"
517 " ;;\n"
518 " directory)\n"
519 " _files -/\n"
520 " return 0\n"
521 " ;;\n"
522 " command)\n"
523 " _command_names\n"
524 " return 0\n"
525 " ;;\n"
526 " esac\n"
527 " fi\n\n"
528 " if [[ \"$cur\" == -* ]]; then\n"
529 " option_descriptions=()\n"
530 " local opt\n"
531 " for opt in \"${parser_options[@]}\"; do\n"
532 " option_descriptions+=(\"$opt\")\n"
533 " done\n"
534 " compadd -Q -S '' -- ${(M)option_descriptions:#$cur*}\n"
535 " return 0\n"
536 " fi\n\n"
537 " subcommand_descriptions=()\n"
538 " local sub\n"
539 " for sub in \"${parser_subcommands[@]}\"; do\n"
540 " subcommand_descriptions+=(\"$sub\")\n"
541 " done\n"
542 " if (( ${#subcommand_descriptions[@]} > 0 )); then\n"
543 " compadd -Q -S '' -- ${(M)subcommand_descriptions:#$cur*}\n"
544 " fi\n"
545 " dynamic_reply=(\"$(@f)$(__ap_zsh_dynamic_query)\")\n"
546 " if (( ${#dynamic_reply[@]} > 0 )); then\n"
547 " compadd -Q -S '' -- $dynamic_reply\n"
548 " fi\n"
549
2/2
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 22 times.
74 "}\n\ncompdef _") != 0 ||
550
4/4
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 30 times.
174 append_identifier(&sb, prog) != 0 || ap_sb_appendf(&sb, " ") != 0 ||
551
2/2
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 14 times.
66 append_single_quoted(&sb, prog) != 0 || ap_sb_appendf(&sb, "\n") != 0) {
552 194 ap_sb_free(&sb);
553 194 return NULL;
554 }
555
556 14 return sb.data;
557 }
558