format_completion_fish.c
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include <ctype.h> | ||
| 2 | #include <stdlib.h> | ||
| 3 | #include <string.h> | ||
| 4 | |||
| 5 | #include "ap_internal.h" | ||
| 6 | |||
| 7 | 24112 | static bool action_takes_no_value(ap_action action) { | |
| 8 |
3/4✓ Branch 0 taken 16250 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 16238 times.
✓ Branch 3 taken 12 times.
|
16250 | return action == AP_ACTION_STORE_TRUE || action == AP_ACTION_STORE_FALSE || |
| 9 |
3/4✓ Branch 0 taken 16250 times.
✓ Branch 1 taken 7862 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16238 times.
|
40362 | action == AP_ACTION_COUNT || action == AP_ACTION_STORE_CONST; |
| 10 | } | ||
| 11 | |||
| 12 | 24116 | static bool option_takes_value(const ap_arg_def *def) { | |
| 13 |
5/6✓ Branch 0 taken 24116 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 24112 times.
✓ Branch 3 taken 4 times.
✓ Branch 5 taken 16238 times.
✓ Branch 6 taken 7874 times.
|
24116 | return def && def->is_optional && !action_takes_no_value(def->opts.action); |
| 14 | } | ||
| 15 | |||
| 16 | 14942 | static ap_completion_kind option_completion_kind(const ap_arg_def *def) { | |
| 17 |
2/2✓ Branch 1 taken 6304 times.
✓ Branch 2 taken 8638 times.
|
14942 | if (!option_takes_value(def)) { |
| 18 | 6304 | return AP_COMPLETION_KIND_NONE; | |
| 19 | } | ||
| 20 |
2/2✓ Branch 0 taken 2468 times.
✓ Branch 1 taken 6170 times.
|
8638 | if (def->opts.completion_kind != AP_COMPLETION_KIND_NONE) { |
| 21 | 2468 | return def->opts.completion_kind; | |
| 22 | } | ||
| 23 |
3/4✓ Branch 0 taken 3634 times.
✓ Branch 1 taken 2536 times.
✓ Branch 2 taken 3634 times.
✗ Branch 3 not taken.
|
6170 | if (def->opts.choices.items && def->opts.choices.count > 0) { |
| 24 | 3634 | return AP_COMPLETION_KIND_CHOICES; | |
| 25 | } | ||
| 26 | 2536 | return AP_COMPLETION_KIND_NONE; | |
| 27 | } | ||
| 28 | |||
| 29 | 2658 | static bool option_has_dynamic_completion(const ap_arg_def *def) { | |
| 30 |
3/4✓ Branch 1 taken 2658 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 310 times.
✓ Branch 4 taken 2348 times.
|
2658 | return option_takes_value(def) && def->opts.completion_callback != NULL; |
| 31 | } | ||
| 32 | |||
| 33 | 2258 | static const char *metavar_for(const ap_arg_def *def) { | |
| 34 | static char fallback[64]; | ||
| 35 | size_t i; | ||
| 36 | |||
| 37 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2256 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2258 | if (def->opts.metavar && def->opts.metavar[0] != '\0') { |
| 38 | 2 | return def->opts.metavar; | |
| 39 | } | ||
| 40 |
4/6✓ Branch 0 taken 11684 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11684 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9428 times.
✓ Branch 5 taken 2256 times.
|
11684 | for (i = 0; i < sizeof(fallback) - 1 && def->dest && def->dest[i] != '\0'; |
| 41 | 9428 | i++) { | |
| 42 | 9428 | char c = def->dest[i]; | |
| 43 |
3/4✓ Branch 0 taken 9420 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 9420 times.
✗ Branch 3 not taken.
|
9428 | if (c >= 'a' && c <= 'z') { |
| 44 | 9420 | fallback[i] = (char)(c - 'a' + 'A'); | |
| 45 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
|
8 | } else if (c == '_') { |
| 46 | 6 | fallback[i] = '-'; | |
| 47 | } else { | ||
| 48 | 2 | fallback[i] = c; | |
| 49 | } | ||
| 50 | } | ||
| 51 | 2256 | fallback[i] = '\0'; | |
| 52 | 2256 | return fallback; | |
| 53 | } | ||
| 54 | |||
| 55 | 21554 | static int append_fish_double_quoted(ap_string_builder *sb, const char *text) { | |
| 56 |
1/2✓ Branch 0 taken 21554 times.
✗ Branch 1 not taken.
|
21554 | const unsigned char *p = (const unsigned char *)(text ? text : ""); |
| 57 | |||
| 58 |
2/2✓ Branch 1 taken 90 times.
✓ Branch 2 taken 21464 times.
|
21554 | if (ap_sb_appendf(sb, "\"") != 0) { |
| 59 | 90 | return -1; | |
| 60 | } | ||
| 61 |
2/2✓ Branch 0 taken 177676 times.
✓ Branch 1 taken 20656 times.
|
198332 | while (*p != '\0') { |
| 62 |
6/6✓ Branch 0 taken 177160 times.
✓ Branch 1 taken 516 times.
✓ Branch 2 taken 177148 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 504 times.
✓ Branch 5 taken 176644 times.
|
177676 | if (*p == '\\' || *p == '"' || *p == '$') { |
| 63 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1028 times.
|
1032 | if (ap_sb_appendf(sb, "\\%c", (char)*p) != 0) { |
| 64 | 4 | return -1; | |
| 65 | } | ||
| 66 |
3/4✓ Branch 0 taken 176150 times.
✓ Branch 1 taken 494 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 176150 times.
|
176644 | } else if (*p == '\n' || *p == '\r') { |
| 67 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 492 times.
|
494 | if (ap_sb_appendf(sb, " ") != 0) { |
| 68 | 2 | return -1; | |
| 69 | } | ||
| 70 |
2/2✓ Branch 1 taken 802 times.
✓ Branch 2 taken 175348 times.
|
176150 | } else if (ap_sb_appendf(sb, "%c", (char)*p) != 0) { |
| 71 | 802 | return -1; | |
| 72 | } | ||
| 73 | 176868 | p++; | |
| 74 | } | ||
| 75 | 20656 | return ap_sb_appendf(sb, "\""); | |
| 76 | } | ||
| 77 | |||
| 78 | 18734 | static int append_identifier(ap_string_builder *sb, const char *text) { | |
| 79 | size_t i; | ||
| 80 |
1/2✓ Branch 0 taken 18734 times.
✗ Branch 1 not taken.
|
18734 | const char *value = text ? text : "argparse_c"; |
| 81 | |||
| 82 |
2/2✓ Branch 0 taken 105968 times.
✓ Branch 1 taken 18352 times.
|
124320 | for (i = 0; value[i] != '\0'; i++) { |
| 83 | 105968 | unsigned char c = (unsigned char)value[i]; | |
| 84 |
3/4✓ Branch 0 taken 10586 times.
✓ Branch 1 taken 95382 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10586 times.
|
105968 | if (isalnum(c) || c == '_') { |
| 85 |
2/2✓ Branch 1 taken 348 times.
✓ Branch 2 taken 95034 times.
|
95382 | if (ap_sb_appendf(sb, "%c", (char)c) != 0) { |
| 86 | 348 | return -1; | |
| 87 | } | ||
| 88 |
2/2✓ Branch 1 taken 34 times.
✓ Branch 2 taken 10552 times.
|
10586 | } else if (ap_sb_appendf(sb, "_") != 0) { |
| 89 | 34 | return -1; | |
| 90 | } | ||
| 91 | } | ||
| 92 | 18352 | return 0; | |
| 93 | } | ||
| 94 | |||
| 95 | 19016 | static int append_parser_key(ap_string_builder *sb, const ap_parser *parser) { | |
| 96 |
3/4✓ Branch 0 taken 19016 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14636 times.
✓ Branch 3 taken 4380 times.
|
19016 | if (!parser || !parser->parent) { |
| 97 | 14636 | return ap_sb_appendf(sb, "root"); | |
| 98 | } | ||
| 99 |
2/2✓ Branch 1 taken 18 times.
✓ Branch 2 taken 4362 times.
|
4380 | if (append_parser_key(sb, parser->parent) != 0) { |
| 100 | 18 | return -1; | |
| 101 | } | ||
| 102 | 4362 | return ap_sb_appendf(sb, "/%s", parser->command_name); | |
| 103 | } | ||
| 104 | |||
| 105 | 4732 | static int append_description(ap_string_builder *sb, const ap_arg_def *def) { | |
| 106 | 4732 | const char *help = def->opts.help; | |
| 107 | |||
| 108 |
3/4✓ Branch 0 taken 2460 times.
✓ Branch 1 taken 2272 times.
✓ Branch 2 taken 2460 times.
✗ Branch 3 not taken.
|
4732 | if (help && help[0] != '\0') { |
| 109 |
4/4✓ Branch 1 taken 2448 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 390 times.
✓ Branch 4 taken 2058 times.
|
4908 | if (ap_sb_appendf(sb, " -d ") != 0 || |
| 110 | 2448 | append_fish_double_quoted(sb, help) != 0) { | |
| 111 | 402 | return -1; | |
| 112 | } | ||
| 113 |
2/2✓ Branch 1 taken 2270 times.
✓ Branch 2 taken 2 times.
|
2272 | } else if (option_takes_value(def)) { |
| 114 |
4/4✓ Branch 1 taken 2258 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 74 times.
✓ Branch 4 taken 2184 times.
|
4528 | if (ap_sb_appendf(sb, " -d ") != 0 || |
| 115 | 2258 | append_fish_double_quoted(sb, metavar_for(def)) != 0) { | |
| 116 | 86 | return -1; | |
| 117 | } | ||
| 118 | } | ||
| 119 | 4244 | return 0; | |
| 120 | } | ||
| 121 | |||
| 122 | 4554 | static int append_transition_cases(ap_string_builder *sb, | |
| 123 | const ap_parser *parser) { | ||
| 124 | int i; | ||
| 125 | |||
| 126 |
2/2✓ Branch 0 taken 2794 times.
✓ Branch 1 taken 4512 times.
|
7306 | for (i = 0; i < parser->subcommands_count; i++) { |
| 127 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2788 times.
|
2794 | if (ap_sb_appendf(sb, " case \"") != 0) { |
| 128 | 6 | return -1; | |
| 129 | } | ||
| 130 |
4/4✓ Branch 1 taken 2782 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 2776 times.
✓ Branch 4 taken 6 times.
|
5570 | if (append_parser_key(sb, parser) != 0 || |
| 131 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2770 times.
|
5558 | ap_sb_appendf(sb, ":%s\"\n", parser->subcommands[i].name) != 0 || |
| 132 | 2776 | ap_sb_appendf(sb, " set key \"") != 0) { | |
| 133 | 18 | return -1; | |
| 134 | } | ||
| 135 |
4/4✓ Branch 1 taken 2758 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2752 times.
|
5528 | if (append_parser_key(sb, parser->subcommands[i].parser) != 0 || |
| 136 | 2758 | ap_sb_appendf(sb, "\"\n") != 0) { | |
| 137 | 18 | return -1; | |
| 138 | } | ||
| 139 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2752 times.
|
2752 | if (append_transition_cases(sb, parser->subcommands[i].parser) != 0) { |
| 140 | ✗ | return -1; | |
| 141 | } | ||
| 142 | } | ||
| 143 | 4512 | return 0; | |
| 144 | } | ||
| 145 | |||
| 146 | 4156 | static int append_choice_cases(ap_string_builder *sb, const ap_parser *parser) { | |
| 147 | int i; | ||
| 148 | int j; | ||
| 149 | int k; | ||
| 150 | |||
| 151 |
2/2✓ Branch 0 taken 9712 times.
✓ Branch 1 taken 4036 times.
|
13748 | for (i = 0; i < parser->defs_count; i++) { |
| 152 | 9712 | const ap_arg_def *def = &parser->defs[i]; | |
| 153 |
2/2✓ Branch 1 taken 2374 times.
✓ Branch 2 taken 7338 times.
|
9712 | if (option_completion_kind(def) != AP_COMPLETION_KIND_CHOICES || |
| 154 |
2/4✓ Branch 0 taken 2374 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2374 times.
|
2374 | !def->opts.choices.items || def->opts.choices.count <= 0) { |
| 155 | 7338 | continue; | |
| 156 | } | ||
| 157 |
2/2✓ Branch 0 taken 2374 times.
✓ Branch 1 taken 2254 times.
|
4628 | for (j = 0; j < def->flags_count; j++) { |
| 158 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2368 times.
|
2374 | if (ap_sb_appendf(sb, " case \"") != 0) { |
| 159 | 6 | return -1; | |
| 160 | } | ||
| 161 |
4/4✓ Branch 1 taken 2360 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2354 times.
|
4728 | if (append_parser_key(sb, parser) != 0 || |
| 162 | 2360 | ap_sb_appendf(sb, ":%s\"\n printf '%%s\\n'", def->flags[j]) != | |
| 163 | 0) { | ||
| 164 | 14 | return -1; | |
| 165 | } | ||
| 166 |
2/2✓ Branch 0 taken 4666 times.
✓ Branch 1 taken 2260 times.
|
6926 | for (k = 0; k < def->opts.choices.count; k++) { |
| 167 |
4/4✓ Branch 1 taken 4654 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 82 times.
✓ Branch 4 taken 4572 times.
|
9320 | if (ap_sb_appendf(sb, " ") != 0 || |
| 168 | 4654 | append_fish_double_quoted(sb, def->opts.choices.items[k]) != 0) { | |
| 169 | 94 | return -1; | |
| 170 | } | ||
| 171 | } | ||
| 172 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2254 times.
|
2260 | if (ap_sb_appendf(sb, "\n") != 0) { |
| 173 | 6 | return -1; | |
| 174 | } | ||
| 175 | } | ||
| 176 | } | ||
| 177 | |||
| 178 |
2/2✓ Branch 0 taken 2478 times.
✓ Branch 1 taken 3998 times.
|
6476 | for (i = 0; i < parser->subcommands_count; i++) { |
| 179 |
2/2✓ Branch 1 taken 38 times.
✓ Branch 2 taken 2440 times.
|
2478 | if (append_choice_cases(sb, parser->subcommands[i].parser) != 0) { |
| 180 | 38 | return -1; | |
| 181 | } | ||
| 182 | } | ||
| 183 | 3998 | return 0; | |
| 184 | } | ||
| 185 | |||
| 186 | 5230 | static int append_option_complete(ap_string_builder *sb, const char *prog, | |
| 187 | const ap_parser *parser, | ||
| 188 | const ap_arg_def *def) { | ||
| 189 | int i; | ||
| 190 | 5230 | ap_completion_kind completion_kind = option_completion_kind(def); | |
| 191 | |||
| 192 |
4/4✓ Branch 1 taken 5206 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 5026 times.
✓ Branch 4 taken 180 times.
|
10436 | if (ap_sb_appendf(sb, "complete -c ") != 0 || |
| 193 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 5002 times.
|
10232 | append_fish_double_quoted(sb, prog) != 0 || |
| 194 | 5026 | ap_sb_appendf(sb, " -n '") != 0) { | |
| 195 | 228 | return -1; | |
| 196 | } | ||
| 197 |
6/6✓ Branch 1 taken 4978 times.
✓ Branch 2 taken 24 times.
✓ Branch 4 taken 4846 times.
✓ Branch 5 taken 132 times.
✓ Branch 6 taken 4822 times.
✓ Branch 7 taken 24 times.
|
9848 | if (ap_sb_appendf(sb, "__ap_") != 0 || append_identifier(sb, prog) != 0 || |
| 198 |
2/2✓ Branch 1 taken 4790 times.
✓ Branch 2 taken 32 times.
|
9668 | ap_sb_appendf(sb, "_parser_is ") != 0 || |
| 199 |
2/2✓ Branch 2 taken 24 times.
✓ Branch 3 taken 4766 times.
|
9612 | append_parser_key(sb, parser) != 0 || ap_sb_appendf(sb, "'") != 0) { |
| 200 | 236 | return -1; | |
| 201 | } | ||
| 202 | |||
| 203 |
2/2✓ Branch 0 taken 6682 times.
✓ Branch 1 taken 4732 times.
|
11414 | for (i = 0; i < def->flags_count; i++) { |
| 204 | 6682 | const char *flag = def->flags[i]; | |
| 205 |
2/2✓ Branch 1 taken 1926 times.
✓ Branch 2 taken 4756 times.
|
6682 | if (ap_is_short_flag(flag)) { |
| 206 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1916 times.
|
1926 | if (ap_sb_appendf(sb, " -s %c", flag[1]) != 0) { |
| 207 | 10 | return -1; | |
| 208 | } | ||
| 209 |
1/2✓ Branch 1 taken 4756 times.
✗ Branch 2 not taken.
|
4756 | } else if (ap_is_long_flag(flag)) { |
| 210 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 4732 times.
|
4756 | if (ap_sb_appendf(sb, " -l %s", flag + 2) != 0) { |
| 211 | 24 | return -1; | |
| 212 | } | ||
| 213 | } | ||
| 214 | } | ||
| 215 | |||
| 216 |
2/2✓ Branch 1 taken 488 times.
✓ Branch 2 taken 4244 times.
|
4732 | if (append_description(sb, def) != 0) { |
| 217 | 488 | return -1; | |
| 218 | } | ||
| 219 | |||
| 220 |
2/2✓ Branch 1 taken 2672 times.
✓ Branch 2 taken 1572 times.
|
4244 | if (option_takes_value(def)) { |
| 221 |
2/2✓ Branch 1 taken 14 times.
✓ Branch 2 taken 2658 times.
|
2672 | if (ap_sb_appendf(sb, " -r") != 0) { |
| 222 | 14 | return -1; | |
| 223 | } | ||
| 224 |
2/2✓ Branch 1 taken 310 times.
✓ Branch 2 taken 2348 times.
|
2658 | if (option_has_dynamic_completion(def)) { |
| 225 |
4/4✓ Branch 1 taken 308 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 300 times.
✓ Branch 4 taken 8 times.
|
618 | if (ap_sb_appendf(sb, " -a '(__ap_") != 0 || |
| 226 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 298 times.
|
608 | append_identifier(sb, prog) != 0 || |
| 227 | 300 | ap_sb_appendf(sb, "_dynamic_complete)'") != 0) { | |
| 228 | 12 | return -1; | |
| 229 | } | ||
| 230 | 298 | return ap_sb_appendf(sb, "\n"); | |
| 231 | } | ||
| 232 |
5/5✓ Branch 0 taken 1100 times.
✓ Branch 1 taken 364 times.
✓ Branch 2 taken 404 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 478 times.
|
2348 | switch (completion_kind) { |
| 233 | 1100 | case AP_COMPLETION_KIND_CHOICES: | |
| 234 |
4/4✓ Branch 1 taken 1094 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 1064 times.
✓ Branch 4 taken 30 times.
|
2194 | if (ap_sb_appendf(sb, " -a '(__ap_") != 0 || |
| 235 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1058 times.
|
2158 | append_identifier(sb, prog) != 0 || |
| 236 | 1064 | ap_sb_appendf(sb, "_value_choices ") != 0) { | |
| 237 | 42 | return -1; | |
| 238 | } | ||
| 239 |
4/4✓ Branch 1 taken 1050 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1044 times.
|
2108 | if (append_parser_key(sb, parser) != 0 || |
| 240 | 1050 | ap_sb_appendf(sb, ":%s)'", def->flags[def->flags_count - 1]) != 0) { | |
| 241 | 14 | return -1; | |
| 242 | } | ||
| 243 | 1044 | break; | |
| 244 | 364 | case AP_COMPLETION_KIND_FILE: | |
| 245 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 362 times.
|
364 | if (ap_sb_appendf(sb, " -F") != 0) { |
| 246 | 2 | return -1; | |
| 247 | } | ||
| 248 | 362 | break; | |
| 249 | 404 | case AP_COMPLETION_KIND_DIRECTORY: | |
| 250 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 402 times.
|
404 | if (ap_sb_appendf(sb, " -a '(__fish_complete_directories)'") != 0) { |
| 251 | 2 | return -1; | |
| 252 | } | ||
| 253 | 402 | break; | |
| 254 | 2 | case AP_COMPLETION_KIND_COMMAND: | |
| 255 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | if (ap_sb_appendf(sb, " -a '(__fish_complete_command)'") != 0) { |
| 256 | ✗ | return -1; | |
| 257 | } | ||
| 258 | 2 | break; | |
| 259 | 478 | case AP_COMPLETION_KIND_NONE: | |
| 260 | default: | ||
| 261 | 478 | break; | |
| 262 | } | ||
| 263 | } | ||
| 264 | |||
| 265 | 3860 | return ap_sb_appendf(sb, "\n"); | |
| 266 | } | ||
| 267 | |||
| 268 | 938 | static int append_subcommand_complete(ap_string_builder *sb, const char *prog, | |
| 269 | const ap_parser *parser, | ||
| 270 | const ap_subcommand_def *sub) { | ||
| 271 |
4/4✓ Branch 1 taken 932 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 884 times.
✓ Branch 4 taken 48 times.
|
1870 | if (ap_sb_appendf(sb, "complete -c ") != 0 || |
| 272 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 878 times.
|
1816 | append_fish_double_quoted(sb, prog) != 0 || |
| 273 | 884 | ap_sb_appendf(sb, " -n '") != 0) { | |
| 274 | 60 | return -1; | |
| 275 | } | ||
| 276 |
6/6✓ Branch 1 taken 872 times.
✓ Branch 2 taken 6 times.
✓ Branch 4 taken 836 times.
✓ Branch 5 taken 36 times.
✓ Branch 6 taken 830 times.
✓ Branch 7 taken 6 times.
|
1714 | if (ap_sb_appendf(sb, "__ap_") != 0 || append_identifier(sb, prog) != 0 || |
| 277 |
2/2✓ Branch 1 taken 824 times.
✓ Branch 2 taken 6 times.
|
1666 | ap_sb_appendf(sb, "_parser_is ") != 0 || |
| 278 |
2/2✓ Branch 1 taken 818 times.
✓ Branch 2 taken 6 times.
|
1654 | append_parser_key(sb, parser) != 0 || |
| 279 |
2/2✓ Branch 1 taken 42 times.
✓ Branch 2 taken 776 times.
|
1642 | ap_sb_appendf(sb, "' -f -a ") != 0 || |
| 280 | 818 | append_fish_double_quoted(sb, sub->name) != 0) { | |
| 281 | 102 | return -1; | |
| 282 | } | ||
| 283 |
3/4✓ Branch 0 taken 776 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 506 times.
|
776 | if (sub->help && sub->help[0] != '\0') { |
| 284 |
4/4✓ Branch 1 taken 268 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 34 times.
✓ Branch 4 taken 234 times.
|
538 | if (ap_sb_appendf(sb, " -d ") != 0 || |
| 285 | 268 | append_fish_double_quoted(sb, sub->help) != 0) { | |
| 286 | 36 | return -1; | |
| 287 | } | ||
| 288 | } | ||
| 289 | 740 | return ap_sb_appendf(sb, "\n"); | |
| 290 | } | ||
| 291 | |||
| 292 | 2124 | static int append_complete_commands(ap_string_builder *sb, const char *prog, | |
| 293 | const ap_parser *parser) { | ||
| 294 | int i; | ||
| 295 | |||
| 296 |
2/2✓ Branch 0 taken 5234 times.
✓ Branch 1 taken 1028 times.
|
6262 | for (i = 0; i < parser->defs_count; i++) { |
| 297 | 5234 | const ap_arg_def *def = &parser->defs[i]; | |
| 298 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 5230 times.
|
5234 | if (!def->is_optional) { |
| 299 | 4 | continue; | |
| 300 | } | ||
| 301 |
2/2✓ Branch 1 taken 1096 times.
✓ Branch 2 taken 4134 times.
|
5230 | if (append_option_complete(sb, prog, parser, def) != 0) { |
| 302 | 1096 | return -1; | |
| 303 | } | ||
| 304 | } | ||
| 305 | |||
| 306 |
2/2✓ Branch 0 taken 938 times.
✓ Branch 1 taken 404 times.
|
1342 | for (i = 0; i < parser->subcommands_count; i++) { |
| 307 |
2/2✓ Branch 1 taken 204 times.
✓ Branch 2 taken 734 times.
|
938 | if (append_subcommand_complete(sb, prog, parser, &parser->subcommands[i]) != |
| 308 | 0) { | ||
| 309 | 204 | return -1; | |
| 310 | } | ||
| 311 |
2/2✓ Branch 1 taken 420 times.
✓ Branch 2 taken 314 times.
|
734 | if (append_complete_commands(sb, prog, parser->subcommands[i].parser) != |
| 312 | 0) { | ||
| 313 | 420 | return -1; | |
| 314 | } | ||
| 315 | } | ||
| 316 | 404 | return 0; | |
| 317 | } | ||
| 318 | |||
| 319 | 1874 | char *ap_fish_completion_build(const ap_parser *parser) { | |
| 320 | ap_string_builder sb; | ||
| 321 | const char *prog; | ||
| 322 | |||
| 323 |
5/6✓ Branch 0 taken 1872 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1872 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1870 times.
|
1874 | if (!parser || !parser->prog || parser->prog[0] == '\0') { |
| 324 | 4 | return NULL; | |
| 325 | } | ||
| 326 |
2/4✓ Branch 0 taken 1870 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1870 times.
|
1870 | prog = parser->command_name && parser->command_name[0] != '\0' |
| 327 | ? parser->command_name | ||
| 328 | : parser->prog; | ||
| 329 | |||
| 330 | 1870 | ap_sb_init(&sb); | |
| 331 |
4/4✓ Branch 1 taken 1866 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 1862 times.
✓ Branch 4 taken 4 times.
|
3736 | if (ap_sb_appendf(&sb, "# fish completion for %s\n", parser->prog) != 0 || |
| 332 |
2/2✓ Branch 1 taken 1832 times.
✓ Branch 2 taken 30 times.
|
3728 | ap_sb_appendf(&sb, "complete -c ") != 0 || |
| 333 |
2/2✓ Branch 1 taken 1828 times.
✓ Branch 2 taken 4 times.
|
3694 | append_fish_double_quoted(&sb, prog) != 0 || |
| 334 |
2/2✓ Branch 1 taken 1806 times.
✓ Branch 2 taken 22 times.
|
3660 | ap_sb_appendf(&sb, " -f\n\nfunction __ap_") != 0 || |
| 335 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1802 times.
|
3634 | append_identifier(&sb, prog) != 0 || |
| 336 | 1806 | ap_sb_appendf(&sb, "_parser_key\n" | |
| 337 | " set -l tokens (commandline -opc)\n" | ||
| 338 | " set -e tokens[1]\n" | ||
| 339 | " set -l key root\n" | ||
| 340 | " for token in $tokens\n" | ||
| 341 | " switch \"$key:$token\"\n") != 0) { | ||
| 342 | 68 | ap_sb_free(&sb); | |
| 343 | 68 | return NULL; | |
| 344 | } | ||
| 345 | |||
| 346 |
4/4✓ Branch 1 taken 1760 times.
✓ Branch 2 taken 42 times.
✓ Branch 3 taken 1756 times.
✓ Branch 4 taken 4 times.
|
3562 | if (append_transition_cases(&sb, parser) != 0 || |
| 347 | 1760 | ap_sb_appendf(&sb, | |
| 348 | " end\n" | ||
| 349 | " end\n" | ||
| 350 | " printf '%s\\n' \"$key\"\n" | ||
| 351 | "end\n\n" | ||
| 352 | "function __ap_", | ||
| 353 |
2/2✓ Branch 0 taken 1734 times.
✓ Branch 1 taken 22 times.
|
1756 | "%s") != 0 || |
| 354 |
2/2✓ Branch 1 taken 1730 times.
✓ Branch 2 taken 4 times.
|
3490 | append_identifier(&sb, prog) != 0 || |
| 355 | 1734 | ap_sb_appendf(&sb, "_parser_is\n" | |
| 356 |
2/2✓ Branch 0 taken 1708 times.
✓ Branch 1 taken 22 times.
|
1730 | " test (__ap_") != 0 || |
| 357 |
2/2✓ Branch 1 taken 1704 times.
✓ Branch 2 taken 4 times.
|
3438 | append_identifier(&sb, prog) != 0 || |
| 358 | 1708 | ap_sb_appendf(&sb, "_parser_key) = \"$argv[1]\"\n" | |
| 359 | "end\n\n" | ||
| 360 |
2/2✓ Branch 0 taken 1682 times.
✓ Branch 1 taken 22 times.
|
1704 | "function __ap_") != 0 || |
| 361 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1678 times.
|
3386 | append_identifier(&sb, prog) != 0 || |
| 362 | 1682 | ap_sb_appendf(&sb, "_value_choices\n" | |
| 363 | " switch \"$argv[1]\"\n") != 0) { | ||
| 364 | 124 | ap_sb_free(&sb); | |
| 365 | 124 | return NULL; | |
| 366 | } | ||
| 367 | |||
| 368 |
4/4✓ Branch 1 taken 1558 times.
✓ Branch 2 taken 120 times.
✓ Branch 3 taken 1554 times.
✓ Branch 4 taken 4 times.
|
3236 | if (append_choice_cases(&sb, parser) != 0 || |
| 369 | 1558 | ap_sb_appendf(&sb, " end\n" | |
| 370 |
2/2✓ Branch 0 taken 1532 times.
✓ Branch 1 taken 22 times.
|
1554 | "end\n\nfunction __ap_") != 0 || |
| 371 |
2/2✓ Branch 1 taken 1528 times.
✓ Branch 2 taken 4 times.
|
3086 | append_identifier(&sb, prog) != 0 || |
| 372 | 1532 | ap_sb_appendf(&sb, "_dynamic_complete\n" | |
| 373 | " set -l tokens (commandline -opc)\n" | ||
| 374 | " set -e tokens[1]\n" | ||
| 375 | " set -l current (commandline -ct)\n" | ||
| 376 |
2/2✓ Branch 0 taken 1498 times.
✓ Branch 1 taken 30 times.
|
1528 | " ") != 0 || |
| 377 |
2/2✓ Branch 1 taken 1494 times.
✓ Branch 2 taken 4 times.
|
3026 | append_fish_double_quoted(&sb, prog) != 0 || |
| 378 |
2/2✓ Branch 1 taken 1446 times.
✓ Branch 2 taken 48 times.
|
2992 | ap_sb_appendf(&sb, " ") != 0 || |
| 379 | 1494 | append_fish_double_quoted(&sb, ap_parser_completion_entrypoint(parser)) != | |
| 380 |
2/2✓ Branch 0 taken 1442 times.
✓ Branch 1 taken 4 times.
|
1446 | 0 || |
| 381 | 1446 | ap_sb_appendf(&sb, " --shell fish -- $tokens $current\n" | |
| 382 |
2/2✓ Branch 0 taken 1420 times.
✓ Branch 1 taken 22 times.
|
1442 | "end\n\nfunction __ap_") != 0 || |
| 383 |
2/2✓ Branch 1 taken 1416 times.
✓ Branch 2 taken 4 times.
|
2862 | append_identifier(&sb, prog) != 0 || |
| 384 | 1420 | ap_sb_appendf(&sb, "_positional_complete\n" | |
| 385 | " set -l current (commandline -ct)\n" | ||
| 386 | " if string match -qr '^-' -- \"$current\"\n" | ||
| 387 | " return 1\n" | ||
| 388 | " end\n" | ||
| 389 |
2/2✓ Branch 0 taken 1394 times.
✓ Branch 1 taken 22 times.
|
1416 | " __ap_") != 0 || |
| 390 |
2/2✓ Branch 1 taken 1390 times.
✓ Branch 2 taken 4 times.
|
2810 | append_identifier(&sb, prog) != 0 || |
| 391 | 1394 | ap_sb_appendf(&sb, "_dynamic_complete\n" | |
| 392 |
2/2✓ Branch 0 taken 90 times.
✓ Branch 1 taken 1300 times.
|
1390 | "end\n\n") != 0 || |
| 393 |
2/2✓ Branch 1 taken 86 times.
✓ Branch 2 taken 4 times.
|
1480 | append_complete_commands(&sb, prog, parser) != 0 || |
| 394 |
2/2✓ Branch 1 taken 56 times.
✓ Branch 2 taken 30 times.
|
176 | ap_sb_appendf(&sb, "complete -c ") != 0 || |
| 395 |
2/2✓ Branch 1 taken 52 times.
✓ Branch 2 taken 4 times.
|
142 | append_fish_double_quoted(&sb, prog) != 0 || |
| 396 |
2/2✓ Branch 1 taken 30 times.
✓ Branch 2 taken 22 times.
|
108 | ap_sb_appendf(&sb, " -f -a '(__ap_") != 0 || |
| 397 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 26 times.
|
82 | append_identifier(&sb, prog) != 0 || |
| 398 | 30 | ap_sb_appendf(&sb, "_positional_complete)'\n") != 0) { | |
| 399 | 1652 | ap_sb_free(&sb); | |
| 400 | 1652 | return NULL; | |
| 401 | } | ||
| 402 | |||
| 403 | 26 | return sb.data; | |
| 404 | } | ||
| 405 |