bool argv_format(struct argv_env *argv_env, const char ***dst_argv, const char *src_argv[], bool first, bool file_filter) { struct format_var vars[] = { #define FORMAT_VAR(type, name, ifempty, initval) \ { "%(" #name ")", STRING_SIZE("%(" #name ")"), type ## _formatter, &argv_env->name, ifempty }, ARGV_ENV_INFO(FORMAT_VAR) #define FORMAT_REPO_VAR(type, name) \ { "%(repo:" #name ")", STRING_SIZE("%(repo:" #name ")"), type ## _formatter, &repo.name, "" }, REPO_INFO(FORMAT_REPO_VAR) }; struct format_context format = { vars, ARRAY_SIZE(vars), "", 0, file_filter }; int argc; argv_free(*dst_argv); for (argc = 0; src_argv[argc]; argc++) { const char *arg = src_argv[argc]; if (!strcmp(arg, "%(fileargs)")) { if (file_filter && !argv_append_array(dst_argv, opt_file_args)) break; } else if (!strcmp(arg, DIFF_ARGS)) { if (!format_append_argv(&format, dst_argv, opt_diff_options)) break; } else if (!strcmp(arg, "%(blameargs)")) { if (!format_append_argv(&format, dst_argv, opt_blame_options)) break; } else if (!strcmp(arg, "%(logargs)")) { if (!format_append_argv(&format, dst_argv, opt_log_options)) break; } else if (!strcmp(arg, "%(mainargs)")) { if (!format_append_argv(&format, dst_argv, opt_main_options)) break; } else if (!strcmp(arg, "%(cmdlineargs)")) { if (!format_append_argv(&format, dst_argv, opt_cmdline_args)) break; } else if (!strcmp(arg, "%(revargs)") || (first && !strcmp(arg, "%(commit)"))) { if (!argv_append_array(dst_argv, opt_rev_args)) break; } else if (!format_append_arg(&format, dst_argv, arg)) { break; } } return src_argv[argc] == NULL; }
static bool format_append_argv(struct format_context *format, const char ***dst_argv, const char *src_argv[]) { int argc; if (!src_argv) return TRUE; for (argc = 0; src_argv[argc]; argc++) if (!format_append_arg(format, dst_argv, src_argv[argc])) return FALSE; return src_argv[argc] == NULL; }