From 37b8cfaeba2b7a356f61bf9b382926deaf2812a1 Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Thu, 15 Jun 2017 17:57:37 -0700 Subject: [PATCH] avoid struct name clashes Running the tests on travis revealed that some compilers (or at least with some options) call the wrong struct constructor if there is more than one struct with the same name but differing definitions. --- src/builtin.h | 3 --- src/builtin_bg.cpp | 2 +- src/builtin_bind.cpp | 53 +++++++++++++++++++-------------------- src/builtin_block.cpp | 16 ++++++------ src/builtin_builtin.cpp | 12 ++++----- src/builtin_command.cpp | 14 +++++------ src/builtin_contains.cpp | 12 ++++----- src/builtin_echo.cpp | 16 ++++++------ src/builtin_exit.cpp | 10 ++++---- src/builtin_function.cpp | 33 ++++++++++++------------ src/builtin_function.h | 5 +++- src/builtin_functions.cpp | 27 ++++++++++---------- src/builtin_history.cpp | 42 +++++++++++++++---------------- src/builtin_read.cpp | 40 ++++++++++++++--------------- src/builtin_return.cpp | 10 ++++---- src/builtin_status.cpp | 46 ++++++++++++++++----------------- src/parse_execution.cpp | 1 + 17 files changed, 171 insertions(+), 171 deletions(-) diff --git a/src/builtin.h b/src/builtin.h index 9847cb7ef..364478d29 100644 --- a/src/builtin.h +++ b/src/builtin.h @@ -102,9 +102,6 @@ class builtin_commandline_scoped_transient_t { wcstring builtin_help_get(parser_t &parser, const wchar_t *cmd); -int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_list_t &c_args, - const wcstring &contents, int definition_line_offset, wcstring *out_err); - void builtin_print_help(parser_t &parser, io_streams_t &streams, const wchar_t *cmd, output_stream_t &b); int builtin_count_args(const wchar_t *const *argv); diff --git a/src/builtin_bg.cpp b/src/builtin_bg.cpp index a678f9cbc..1b63e8d9e 100644 --- a/src/builtin_bg.cpp +++ b/src/builtin_bg.cpp @@ -38,7 +38,7 @@ static int send_to_bg(parser_t &parser, io_streams_t &streams, job_t *j) { int builtin_bg(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts_help_only opts; + cmd_opts_help_only opts; int optind; int retval = parse_cmd_opts_help_only(&opts, &optind, argc, argv, parser, streams); diff --git a/src/builtin_bind.cpp b/src/builtin_bind.cpp index 0a0c50c29..8153400de 100644 --- a/src/builtin_bind.cpp +++ b/src/builtin_bind.cpp @@ -19,15 +19,14 @@ #include "wutil.h" // IWYU pragma: keep enum { BIND_INSERT, BIND_ERASE, BIND_KEY_NAMES, BIND_FUNCTION_NAMES }; -struct cmd_opts { - int mode = BIND_INSERT; - int res = STATUS_CMD_OK; - bool all = false; - bool use_terminfo = false; - const wchar_t *bind_mode = DEFAULT_BIND_MODE; +struct bind_cmd_opts_t { + bool print_help = false; bool bind_mode_given = false; bool list_modes = false; - bool print_help = false; + bool all = false; + bool use_terminfo = false; + int mode = BIND_INSERT; + const wchar_t *bind_mode = DEFAULT_BIND_MODE; const wchar_t *sets_bind_mode = L""; }; @@ -212,16 +211,16 @@ static bool builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int return res; } -static bool builtin_bind_insert(struct cmd_opts *opts, int optind, int argc, wchar_t **argv, +static bool builtin_bind_insert(bind_cmd_opts_t &opts, int optind, int argc, wchar_t **argv, io_streams_t &streams) { wchar_t *cmd = argv[0]; int arg_count = argc - optind; if (arg_count == 0) { - builtin_bind_list(opts->bind_mode_given ? opts->bind_mode : NULL, streams); + builtin_bind_list(opts.bind_mode_given ? opts.bind_mode : NULL, streams); } else if (arg_count == 1) { wcstring seq; - if (opts->use_terminfo) { + if (opts.use_terminfo) { if (!get_terminfo_sequence(argv[optind], &seq, streams)) { // get_terminfo_sequence already printed the error. return true; @@ -230,9 +229,9 @@ static bool builtin_bind_insert(struct cmd_opts *opts, int optind, int argc, wch seq = argv[optind]; } - if (!builtin_bind_list_one(seq, opts->bind_mode, streams)) { + if (!builtin_bind_list_one(seq, opts.bind_mode, streams)) { wcstring eseq = escape_string(argv[optind], 0); - if (opts->use_terminfo) { + if (opts.use_terminfo) { streams.err.append_format(_(L"%ls: No binding found for key '%ls'\n"), cmd, eseq.c_str()); } else { @@ -243,7 +242,7 @@ static bool builtin_bind_insert(struct cmd_opts *opts, int optind, int argc, wch } } else { if (builtin_bind_add(argv[optind], argv + (optind + 1), argc - (optind + 1), - opts->bind_mode, opts->sets_bind_mode, opts->use_terminfo, streams)) { + opts.bind_mode, opts.sets_bind_mode, opts.use_terminfo, streams)) { return true; } } @@ -267,7 +266,7 @@ static void builtin_bind_list_modes(io_streams_t &streams) { } } -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(bind_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; static const wchar_t *short_options = L"aehkKfM:Lm:"; @@ -287,27 +286,27 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case L'a': { - opts->all = true; + opts.all = true; break; } case L'e': { - opts->mode = BIND_ERASE; + opts.mode = BIND_ERASE; break; } case L'h': { - opts->print_help = true; + opts.print_help = true; break; } case L'k': { - opts->use_terminfo = true; + opts.use_terminfo = true; break; } case L'K': { - opts->mode = BIND_KEY_NAMES; + opts.mode = BIND_KEY_NAMES; break; } case L'f': { - opts->mode = BIND_FUNCTION_NAMES; + opts.mode = BIND_FUNCTION_NAMES; break; } case L'M': { @@ -315,8 +314,8 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc streams.err.append_format(BUILTIN_ERR_BIND_MODE, cmd, w.woptarg); return STATUS_INVALID_ARGS; } - opts->bind_mode = w.woptarg; - opts->bind_mode_given = true; + opts.bind_mode = w.woptarg; + opts.bind_mode_given = true; break; } case L'm': { @@ -324,11 +323,11 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc streams.err.append_format(BUILTIN_ERR_BIND_MODE, cmd, w.woptarg); return STATUS_INVALID_ARGS; } - opts->sets_bind_mode = w.woptarg; + opts.sets_bind_mode = w.woptarg; break; } case L'L': { - opts->list_modes = true; + opts.list_modes = true; return STATUS_CMD_OK; } case L'?': { @@ -350,10 +349,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc int builtin_bind(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + bind_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.list_modes) { @@ -375,7 +374,7 @@ int builtin_bind(parser_t &parser, io_streams_t &streams, wchar_t **argv) { break; } case BIND_INSERT: { - if (builtin_bind_insert(&opts, optind, argc, argv, streams)) { + if (builtin_bind_insert(opts, optind, argc, argv, streams)) { return STATUS_CMD_ERROR; } break; diff --git a/src/builtin_block.cpp b/src/builtin_block.cpp index 9d929d7d9..bc2bdff4e 100644 --- a/src/builtin_block.cpp +++ b/src/builtin_block.cpp @@ -14,13 +14,13 @@ #include "wutil.h" // IWYU pragma: keep enum { UNSET, GLOBAL, LOCAL }; -struct cmd_opts { +struct block_cmd_opts_t { int scope = UNSET; bool erase = false; bool print_help = false; }; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(block_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; static const wchar_t *short_options = L"eghl"; @@ -35,19 +35,19 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case 'g': { - opts->scope = GLOBAL; + opts.scope = GLOBAL; break; } case 'l': { - opts->scope = LOCAL; + opts.scope = LOCAL; break; } case 'e': { - opts->erase = true; + opts.erase = true; break; } case '?': { @@ -69,10 +69,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc int builtin_block(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + block_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_builtin.cpp b/src/builtin_builtin.cpp index a42a323f3..6bc187aae 100644 --- a/src/builtin_builtin.cpp +++ b/src/builtin_builtin.cpp @@ -14,7 +14,7 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct builtin_cmd_opts_t { bool print_help = false; bool list_names = false; }; @@ -22,7 +22,7 @@ static const wchar_t *short_options = L"hn"; static const struct woption long_options[] = { {L"help", no_argument, NULL, 'h'}, {L"names", no_argument, NULL, 'n'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t **argv, +static int parse_cmd_opts(builtin_cmd_opts_t &opts, int *optind, int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -30,11 +30,11 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case 'n': { - opts->list_names = true; + opts.list_names = true; break; } case '?': { @@ -58,10 +58,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t int builtin_builtin(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + builtin_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_command.cpp b/src/builtin_command.cpp index 9c2426928..a8e37e2a6 100644 --- a/src/builtin_command.cpp +++ b/src/builtin_command.cpp @@ -12,7 +12,7 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct command_cmd_opts_t { bool print_help = false; bool find_path = false; bool quiet = false; @@ -23,7 +23,7 @@ static const struct woption long_options[] = {{L"help", no_argument, NULL, 'h'}, {L"search", no_argument, NULL, 's'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t **argv, +static int parse_cmd_opts(command_cmd_opts_t &opts, int *optind, int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -31,16 +31,16 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case 'q': { - opts->quiet = true; + opts.quiet = true; break; } case 's': // -s and -v are aliases case 'v': { - opts->find_path = true; + opts.find_path = true; break; } case '?': { @@ -63,10 +63,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t int builtin_command(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + command_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_contains.cpp b/src/builtin_contains.cpp index 100e00822..a4009593b 100644 --- a/src/builtin_contains.cpp +++ b/src/builtin_contains.cpp @@ -12,7 +12,7 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct contains_cmd_opts_t { bool print_help = false; bool print_index = false; }; @@ -20,7 +20,7 @@ static const wchar_t *short_options = L"+hi"; static const struct woption long_options[] = { {L"help", no_argument, NULL, 'h'}, {L"index", no_argument, NULL, 'i'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t **argv, +static int parse_cmd_opts(contains_cmd_opts_t &opts, int *optind, int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -28,11 +28,11 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case 'i': { - opts->print_index = true; + opts.print_index = true; break; } case '?': { @@ -55,10 +55,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t int builtin_contains(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + contains_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_echo.cpp b/src/builtin_echo.cpp index 9b244c95a..3c59987c9 100644 --- a/src/builtin_echo.cpp +++ b/src/builtin_echo.cpp @@ -12,7 +12,7 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct echo_cmd_opts_t { bool print_help = false; bool print_newline = true; bool print_spaces = true; @@ -21,7 +21,7 @@ struct cmd_opts { static const wchar_t *short_options = L"+Eens"; static const struct woption *long_options = NULL; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t **argv, +static int parse_cmd_opts(echo_cmd_opts_t &opts, int *optind, int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { UNUSED(parser); UNUSED(streams); @@ -30,19 +30,19 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, int argc, wchar_t while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'n': { - opts->print_newline = false; + opts.print_newline = false; break; } case 'e': { - opts->interpret_special_chars = true; + opts.interpret_special_chars = true; break; } case 's': { - opts->print_spaces = false; + opts.print_spaces = false; break; } case 'E': { - opts->interpret_special_chars = false; + opts.interpret_special_chars = false; break; } case '?': { @@ -175,9 +175,9 @@ static bool builtin_echo_parse_numeric_sequence(const wchar_t *str, size_t *cons int builtin_echo(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + echo_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; // The special character \c can be used to indicate no more output. diff --git a/src/builtin_exit.cpp b/src/builtin_exit.cpp index cfdae708b..a77aa40cf 100644 --- a/src/builtin_exit.cpp +++ b/src/builtin_exit.cpp @@ -14,14 +14,14 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct exit_cmd_opts_t { bool print_help = false; }; static const wchar_t *short_options = L"h"; static const struct woption long_options[] = {{L"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(exit_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { UNUSED(parser); UNUSED(streams); @@ -31,7 +31,7 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { //!OCLINT(too few branches) case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case '?': { @@ -56,10 +56,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc int builtin_exit(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + exit_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_function.cpp b/src/builtin_function.cpp index e48cfee00..58aa73665 100644 --- a/src/builtin_function.cpp +++ b/src/builtin_function.cpp @@ -24,10 +24,10 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct function_cmd_opts_t { bool print_help = false; bool shadow_scope = true; - wchar_t *desc = NULL; + wcstring description = L""; std::vector events; wcstring_list_t named_arguments; wcstring_list_t inherit_vars; @@ -51,7 +51,7 @@ static const struct woption long_options[] = { {L"inherit-variable", required_argument, NULL, 'V'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(function_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams, wcstring *out_err) { wchar_t *cmd = argv[0]; @@ -60,7 +60,7 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'd': { - opts->desc = w.woptarg; + opts.description = w.woptarg; break; } case 's': { @@ -69,7 +69,7 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc append_format(*out_err, _(L"%ls: Unknown signal '%ls'"), cmd, w.woptarg); return STATUS_INVALID_ARGS; } - opts->events.push_back(event_t::signal_event(sig)); + opts.events.push_back(event_t::signal_event(sig)); break; } case 'v': { @@ -78,11 +78,11 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc return STATUS_INVALID_ARGS; } - opts->events.push_back(event_t::variable_event(w.woptarg)); + opts.events.push_back(event_t::variable_event(w.woptarg)); break; } case 'e': { - opts->events.push_back(event_t::generic_event(w.woptarg)); + opts.events.push_back(event_t::generic_event(w.woptarg)); break; } case 'j': @@ -127,19 +127,19 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc e.type = EVENT_EXIT; e.param1.pid = (opt == 'j' ? -1 : 1) * abs(pid); } - opts->events.push_back(e); + opts.events.push_back(e); break; } case 'a': { - opts->named_arguments.push_back(w.woptarg); + opts.named_arguments.push_back(w.woptarg); break; } case 'S': { - opts->shadow_scope = false; + opts.shadow_scope = false; break; } case 'w': { - opts->wrap_targets.push_back(w.woptarg); + opts.wrap_targets.push_back(w.woptarg); break; } case 'V': { @@ -147,11 +147,11 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc append_format(*out_err, BUILTIN_ERR_VARNAME, cmd, w.woptarg); return STATUS_INVALID_ARGS; } - opts->inherit_vars.push_back(w.woptarg); + opts.inherit_vars.push_back(w.woptarg); break; } case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case ':': { @@ -217,7 +217,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); wcstring function_name; - struct cmd_opts opts; + function_cmd_opts_t opts; // A valid function name has to be the first argument. int retval = validate_function_name(argc, argv, function_name, cmd, out_err); @@ -226,7 +226,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis argc--; int optind; - retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams, out_err); + retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams, out_err); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { @@ -249,7 +249,8 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis // We have what we need to actually define the function. function_data_t d; d.name = function_name; - if (opts.desc) d.description = opts.desc; + if (!opts.description.empty()) d.description = opts.description; + //d.description = opts.description; d.events.swap(opts.events); d.shadow_scope = opts.shadow_scope; d.named_arguments.swap(opts.named_arguments); diff --git a/src/builtin_function.h b/src/builtin_function.h index 8722eef57..56e68b7a4 100644 --- a/src/builtin_function.h +++ b/src/builtin_function.h @@ -2,8 +2,11 @@ #ifndef FISH_BUILTIN_FUNCTION_H #define FISH_BUILTIN_FUNCTION_H +#include "common.h" + class parser_t; struct io_streams_t; -int builtin_function(parser_t &parser, io_streams_t &streams, wchar_t **argv); +int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_list_t &c_args, + const wcstring &contents, int definition_line_offset, wcstring *out_err); #endif diff --git a/src/builtin_functions.cpp b/src/builtin_functions.cpp index 888b2213d..4cd1b0485 100644 --- a/src/builtin_functions.cpp +++ b/src/builtin_functions.cpp @@ -26,7 +26,7 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct functions_cmd_opts_t { bool print_help = false; bool erase = false; bool list = false; @@ -45,8 +45,7 @@ static const struct woption long_options[] = { {L"copy", no_argument, NULL, 'c'}, {L"details", no_argument, NULL, 'D'}, {L"verbose", no_argument, NULL, 'v'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, - int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(functions_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -54,39 +53,39 @@ static int parse_cmd_opts(struct cmd_opts *opts, while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'v': { - opts->verbose = true; + opts.verbose = true; break; } case 'e': { - opts->erase = true; + opts.erase = true; break; } case 'D': { - opts->report_metadata = true; + opts.report_metadata = true; break; } case 'd': { - opts->description = w.woptarg; + opts.description = w.woptarg; break; } case 'n': { - opts->list = true; + opts.list = true; break; } case 'a': { - opts->show_hidden = true; + opts.show_hidden = true; break; } case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case 'q': { - opts->query = true; + opts.query = true; break; } case 'c': { - opts->copy = true; + opts.copy = true; break; } case '?': { @@ -257,10 +256,10 @@ static int report_function_metadata(const wchar_t *funcname, bool verbose, io_st int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + functions_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_history.cpp b/src/builtin_history.cpp index 31c4795d2..f799bd08c 100644 --- a/src/builtin_history.cpp +++ b/src/builtin_history.cpp @@ -27,7 +27,7 @@ const enum_map hist_enum_map[] = {{HIST_CLEAR, L"clear"}, {HIST_DE {HIST_SEARCH, L"search"}, {HIST_UNDEF, NULL}}; #define hist_enum_map_len (sizeof hist_enum_map / sizeof *hist_enum_map) -struct cmd_opts { +struct history_cmd_opts_t { bool print_help = false; hist_cmd_t hist_cmd = HIST_UNDEF; history_search_type_t search_type = (history_search_type_t)-1; @@ -92,7 +92,7 @@ static bool set_hist_cmd(wchar_t *const cmd, hist_cmd_t *hist_cmd, hist_cmd_t su break; \ } -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(history_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -100,60 +100,60 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 1: { - if (!set_hist_cmd(cmd, &opts->hist_cmd, HIST_DELETE, streams)) { + if (!set_hist_cmd(cmd, &opts.hist_cmd, HIST_DELETE, streams)) { return STATUS_CMD_ERROR; } break; } case 2: { - if (!set_hist_cmd(cmd, &opts->hist_cmd, HIST_SEARCH, streams)) { + if (!set_hist_cmd(cmd, &opts.hist_cmd, HIST_SEARCH, streams)) { return STATUS_CMD_ERROR; } break; } case 3: { - if (!set_hist_cmd(cmd, &opts->hist_cmd, HIST_SAVE, streams)) { + if (!set_hist_cmd(cmd, &opts.hist_cmd, HIST_SAVE, streams)) { return STATUS_CMD_ERROR; } break; } case 4: { - if (!set_hist_cmd(cmd, &opts->hist_cmd, HIST_CLEAR, streams)) { + if (!set_hist_cmd(cmd, &opts.hist_cmd, HIST_CLEAR, streams)) { return STATUS_CMD_ERROR; } break; } case 5: { - if (!set_hist_cmd(cmd, &opts->hist_cmd, HIST_MERGE, streams)) { + if (!set_hist_cmd(cmd, &opts.hist_cmd, HIST_MERGE, streams)) { return STATUS_CMD_ERROR; } break; } case 'C': { - opts->case_sensitive = true; + opts.case_sensitive = true; break; } case 'p': { - opts->search_type = HISTORY_SEARCH_TYPE_PREFIX; - opts->history_search_type_defined = true; + opts.search_type = HISTORY_SEARCH_TYPE_PREFIX; + opts.history_search_type_defined = true; break; } case 'c': { - opts->search_type = HISTORY_SEARCH_TYPE_CONTAINS; - opts->history_search_type_defined = true; + opts.search_type = HISTORY_SEARCH_TYPE_CONTAINS; + opts.history_search_type_defined = true; break; } case 'e': { - opts->search_type = HISTORY_SEARCH_TYPE_EXACT; - opts->history_search_type_defined = true; + opts.search_type = HISTORY_SEARCH_TYPE_EXACT; + opts.history_search_type_defined = true; break; } case 't': { - opts->show_time_format = w.woptarg ? w.woptarg : L"# %c%n"; + opts.show_time_format = w.woptarg ? w.woptarg : L"# %c%n"; break; } case 'n': { - opts->max_items = fish_wcstol(w.woptarg); + opts.max_items = fish_wcstol(w.woptarg); if (errno) { streams.err.append_format(_(L"%ls: max value '%ls' is not a valid number\n"), cmd, w.woptarg); @@ -162,11 +162,11 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc break; } case 'z': { - opts->null_terminate = true; + opts.null_terminate = true; break; } case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case ':': { @@ -175,7 +175,7 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc } case '?': { // Try to parse it as a number; e.g., "-123". - opts->max_items = fish_wcstol(argv[w.woptind - 1] + 1); + opts.max_items = fish_wcstol(argv[w.woptind - 1] + 1); if (errno) { builtin_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); return STATUS_INVALID_ARGS; @@ -198,10 +198,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc int builtin_history(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + history_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_read.cpp b/src/builtin_read.cpp index 1dac3abd7..b204f746d 100644 --- a/src/builtin_read.cpp +++ b/src/builtin_read.cpp @@ -29,7 +29,7 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct read_cmd_opts_t { bool print_help = false; int place = ENV_USER; wcstring prompt_cmd; @@ -64,7 +64,7 @@ static const struct woption long_options[] = {{L"export", no_argument, NULL, 'x' {L"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(read_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -72,47 +72,47 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case L'x': { - opts->place |= ENV_EXPORT; + opts.place |= ENV_EXPORT; break; } case L'g': { - opts->place |= ENV_GLOBAL; + opts.place |= ENV_GLOBAL; break; } case L'l': { - opts->place |= ENV_LOCAL; + opts.place |= ENV_LOCAL; break; } case L'U': { - opts->place |= ENV_UNIVERSAL; + opts.place |= ENV_UNIVERSAL; break; } case L'u': { - opts->place |= ENV_UNEXPORT; + opts.place |= ENV_UNEXPORT; break; } case L'p': { - opts->prompt = w.woptarg; + opts.prompt = w.woptarg; break; } case L'P': { - opts->prompt_str = w.woptarg; + opts.prompt_str = w.woptarg; break; } case L'R': { - opts->right_prompt = w.woptarg; + opts.right_prompt = w.woptarg; break; } case L'c': { - opts->commandline = w.woptarg; + opts.commandline = w.woptarg; break; } case L'm': { - opts->mode_name = w.woptarg; + opts.mode_name = w.woptarg; break; } case L'n': { - opts->nchars = fish_wcstoi(w.woptarg); + opts.nchars = fish_wcstoi(w.woptarg); if (errno) { if (errno == ERANGE) { streams.err.append_format(_(L"%ls: Argument '%ls' is out of range\n"), cmd, @@ -129,23 +129,23 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc break; } case 's': { - opts->shell = true; + opts.shell = true; break; } case 'a': { - opts->array = true; + opts.array = true; break; } case L'i': { - opts->silent = true; + opts.silent = true; break; } case L'z': { - opts->split_null = true; + opts.split_null = true; break; } case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case ':': { @@ -321,10 +321,10 @@ int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) { int argc = builtin_count_args(argv); wcstring buff; int exit_res = STATUS_CMD_OK; - struct cmd_opts opts; + read_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_return.cpp b/src/builtin_return.cpp index bb5e385dd..d0ed090a1 100644 --- a/src/builtin_return.cpp +++ b/src/builtin_return.cpp @@ -14,14 +14,14 @@ #include "wgetopt.h" #include "wutil.h" // IWYU pragma: keep -struct cmd_opts { +struct return_cmd_opts_t { bool print_help = false; }; static const wchar_t *short_options = L"h"; static const struct woption long_options[] = {{L"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}}; -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(return_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { UNUSED(parser); UNUSED(streams); @@ -31,7 +31,7 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { //!OCLINT(too few branches) case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case '?': { @@ -56,10 +56,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc int builtin_return(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + return_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { diff --git a/src/builtin_status.cpp b/src/builtin_status.cpp index a59f8dcfc..9ef251e4b 100644 --- a/src/builtin_status.cpp +++ b/src/builtin_status.cpp @@ -70,7 +70,7 @@ int job_control_str_to_mode(const wchar_t *mode, wchar_t *cmd, io_streams_t &str return -1; } -struct cmd_opts { +struct status_cmd_opts_t { bool print_help = false; status_cmd_t status_cmd = STATUS_UNDEF; int new_job_control_mode = -1; @@ -96,11 +96,11 @@ static const struct woption long_options[] = {{L"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}}; /// Remember the status subcommand and disallow selecting more than one status subcommand. -static bool set_status_cmd(wchar_t *const cmd, status_cmd_t *status_cmd, status_cmd_t sub_cmd, +static bool set_status_cmd(wchar_t *const cmd, status_cmd_opts_t &opts, status_cmd_t sub_cmd, io_streams_t &streams) { - if (*status_cmd != STATUS_UNDEF) { + if (opts.status_cmd != STATUS_UNDEF) { wchar_t err_text[1024]; - const wchar_t *subcmd_str1 = enum_to_str(*status_cmd, status_enum_map); + const wchar_t *subcmd_str1 = enum_to_str(opts.status_cmd, status_enum_map); const wchar_t *subcmd_str2 = enum_to_str(sub_cmd, status_enum_map); swprintf(err_text, sizeof(err_text) / sizeof(wchar_t), _(L"you cannot do both '%ls' and '%ls' in the same invocation"), subcmd_str1, @@ -109,11 +109,11 @@ static bool set_status_cmd(wchar_t *const cmd, status_cmd_t *status_cmd, status_ return false; } - *status_cmd = sub_cmd; + opts.status_cmd = sub_cmd; return true; } -static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high ncss method) +static int parse_cmd_opts(status_cmd_opts_t &opts, int *optind, //!OCLINT(high ncss method) int argc, wchar_t **argv, parser_t &parser, io_streams_t &streams) { wchar_t *cmd = argv[0]; int opt; @@ -121,78 +121,78 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 1: { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_FULL_JOB_CTRL, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_IS_FULL_JOB_CTRL, streams)) { return STATUS_CMD_ERROR; } break; } case 2: { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_INTERACTIVE_JOB_CTRL, + if (!set_status_cmd(cmd, opts, STATUS_IS_INTERACTIVE_JOB_CTRL, streams)) { return STATUS_CMD_ERROR; } break; } case 3: { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_NO_JOB_CTRL, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_IS_NO_JOB_CTRL, streams)) { return STATUS_CMD_ERROR; } break; } case 'c': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_COMMAND_SUB, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_IS_COMMAND_SUB, streams)) { return STATUS_CMD_ERROR; } break; } case 'b': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_BLOCK, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_IS_BLOCK, streams)) { return STATUS_CMD_ERROR; } break; } case 'i': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_INTERACTIVE, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_IS_INTERACTIVE, streams)) { return STATUS_CMD_ERROR; } break; } case 'l': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_IS_LOGIN, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_IS_LOGIN, streams)) { return STATUS_CMD_ERROR; } break; } case 'f': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_CURRENT_FILENAME, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_CURRENT_FILENAME, streams)) { return STATUS_CMD_ERROR; } break; } case 'n': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_CURRENT_LINE_NUMBER, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_CURRENT_LINE_NUMBER, streams)) { return STATUS_CMD_ERROR; } break; } case 'j': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_SET_JOB_CONTROL, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_SET_JOB_CONTROL, streams)) { return STATUS_CMD_ERROR; } - opts->new_job_control_mode = job_control_str_to_mode(w.woptarg, cmd, streams); - if (opts->new_job_control_mode == -1) { + opts.new_job_control_mode = job_control_str_to_mode(w.woptarg, cmd, streams); + if (opts.new_job_control_mode == -1) { return STATUS_CMD_ERROR; } break; } case 't': { - if (!set_status_cmd(cmd, &opts->status_cmd, STATUS_PRINT_STACK_TRACE, streams)) { + if (!set_status_cmd(cmd, opts, STATUS_PRINT_STACK_TRACE, streams)) { return STATUS_CMD_ERROR; } break; } case 'h': { - opts->print_help = true; + opts.print_help = true; break; } case ':': { @@ -218,10 +218,10 @@ static int parse_cmd_opts(struct cmd_opts *opts, int *optind, //!OCLINT(high nc int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); - struct cmd_opts opts; + status_cmd_opts_t opts; int optind; - int retval = parse_cmd_opts(&opts, &optind, argc, argv, parser, streams); + int retval = parse_cmd_opts(opts, &optind, argc, argv, parser, streams); if (retval != STATUS_CMD_OK) return retval; if (opts.print_help) { @@ -234,7 +234,7 @@ int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (optind < argc) { status_cmd_t subcmd = str_to_enum(argv[optind], status_enum_map, status_enum_map_len); if (subcmd != STATUS_UNDEF) { - if (!set_status_cmd(cmd, &opts.status_cmd, subcmd, streams)) { + if (!set_status_cmd(cmd, opts, subcmd, streams)) { return STATUS_CMD_ERROR; } optind++; diff --git a/src/parse_execution.cpp b/src/parse_execution.cpp index 32e91e087..6cd09d6c5 100644 --- a/src/parse_execution.cpp +++ b/src/parse_execution.cpp @@ -24,6 +24,7 @@ #include #include "builtin.h" +#include "builtin_function.h" #include "common.h" #include "complete.h" #include "env.h"