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 |