| 1286 | } |
| 1287 | |
| 1288 | int format_set_trailers_options(struct process_trailer_options *opts, |
| 1289 | struct string_list *filter_list, |
| 1290 | struct strbuf *sepbuf, |
| 1291 | struct strbuf *kvsepbuf, |
| 1292 | const char **arg, |
| 1293 | char **invalid_arg) |
| 1294 | { |
| 1295 | for (;;) { |
| 1296 | const char *argval; |
| 1297 | size_t arglen; |
| 1298 | |
| 1299 | if (**arg == ')') |
| 1300 | break; |
| 1301 | |
| 1302 | if (match_placeholder_arg_value(*arg, "key", arg, &argval, &arglen)) { |
| 1303 | uintptr_t len = arglen; |
| 1304 | |
| 1305 | if (!argval) |
| 1306 | return -1; |
| 1307 | |
| 1308 | if (len && argval[len - 1] == ':') |
| 1309 | len--; |
| 1310 | string_list_append(filter_list, argval)->util = (char *)len; |
| 1311 | |
| 1312 | opts->filter = format_trailer_match_cb; |
| 1313 | opts->filter_data = filter_list; |
| 1314 | opts->only_trailers = 1; |
| 1315 | } else if (match_placeholder_arg_value(*arg, "separator", arg, &argval, &arglen)) { |
| 1316 | opts->separator = expand_string_arg(sepbuf, argval, arglen); |
| 1317 | } else if (match_placeholder_arg_value(*arg, "key_value_separator", arg, &argval, &arglen)) { |
| 1318 | opts->key_value_separator = expand_string_arg(kvsepbuf, argval, arglen); |
| 1319 | } else if (!match_placeholder_bool_arg(*arg, "only", arg, &opts->only_trailers) && |
| 1320 | !match_placeholder_bool_arg(*arg, "unfold", arg, &opts->unfold) && |
| 1321 | !match_placeholder_bool_arg(*arg, "keyonly", arg, &opts->key_only) && |
| 1322 | !match_placeholder_bool_arg(*arg, "valueonly", arg, &opts->value_only)) { |
| 1323 | if (invalid_arg) { |
| 1324 | size_t len = strcspn(*arg, ",)"); |
| 1325 | *invalid_arg = xstrndup(*arg, len); |
| 1326 | } |
| 1327 | return -1; |
| 1328 | } |
| 1329 | } |
| 1330 | return 0; |
| 1331 | } |
| 1332 | |
| 1333 | static size_t parse_describe_args(const char *start, struct strvec *args) |
| 1334 | { |
no test coverage detected