From e6e1805c5f4df8cd15c84de3fdfd7a8016eab867 Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Thu, 4 May 2017 21:35:41 -0700 Subject: [PATCH] another step in fixing issue #3985 This changes all of the builtins to behave like `string` to return STATUS_INVALID_ARGS (121) if the args passed to the command don't make sense. Also change several of the builtins to use the existing symbols (e.g., STATUS_CMD_OK and STATUS_CMD_ERROR) rather than hardcoded "0" and "1" for consistency and to make it easier to find such values in the future. Fixes #3985 --- src/builtin.cpp | 194 ++++++++++++++++++------------------ src/builtin_commandline.cpp | 39 ++++---- src/builtin_complete.cpp | 16 +-- src/builtin_jobs.cpp | 14 +-- src/builtin_printf.cpp | 2 +- src/builtin_set.cpp | 23 ++--- src/builtin_set_color.cpp | 8 +- src/builtin_string.cpp | 4 +- src/builtin_test.cpp | 6 +- src/builtin_ulimit.cpp | 12 +-- src/common.h | 4 +- src/fish_tests.cpp | 8 +- tests/test4.out | 2 +- 13 files changed, 163 insertions(+), 169 deletions(-) diff --git a/src/builtin.cpp b/src/builtin.cpp index 956cf9df5..b407511ce 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -343,9 +343,9 @@ static void builtin_bind_function_names(io_streams_t &streams) { } /// Wraps input_terminfo_get_sequence(), appending the correct error messages as needed. -static int get_terminfo_sequence(const wchar_t *seq, wcstring *out_seq, io_streams_t &streams) { +static bool get_terminfo_sequence(const wchar_t *seq, wcstring *out_seq, io_streams_t &streams) { if (input_terminfo_get_sequence(seq, out_seq)) { - return 1; + return true; } wcstring eseq = escape_string(seq, 0); @@ -358,26 +358,26 @@ static int get_terminfo_sequence(const wchar_t *seq, wcstring *out_seq, io_strea streams.err.append_format(_(L"%ls: Unknown error trying to bind to key named '%ls'\n"), L"bind", eseq.c_str()); } - return 0; + return false; } /// Add specified key binding. -static int builtin_bind_add(const wchar_t *seq, const wchar_t *const *cmds, size_t cmds_len, - const wchar_t *mode, const wchar_t *sets_mode, int terminfo, - io_streams_t &streams) { +static bool builtin_bind_add(const wchar_t *seq, const wchar_t *const *cmds, size_t cmds_len, + const wchar_t *mode, const wchar_t *sets_mode, int terminfo, + io_streams_t &streams) { if (terminfo) { wcstring seq2; if (get_terminfo_sequence(seq, &seq2, streams)) { input_mapping_add(seq2.c_str(), cmds, cmds_len, mode, sets_mode); } else { - return 1; + return true; } } else { input_mapping_add(seq, cmds, cmds_len, mode, sets_mode); } - return 0; + return false; } /// Erase specified key bindings @@ -392,8 +392,8 @@ static int builtin_bind_add(const wchar_t *seq, const wchar_t *const *cmds, size /// @param use_terminfo /// Whether to look use terminfo -k name /// -static int builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int use_terminfo, - io_streams_t &streams) { +static bool builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int use_terminfo, + io_streams_t &streams) { if (all) { const std::vector lst = input_mapping_get_names(); for (std::vector::const_iterator it = lst.begin(), end = lst.end(); @@ -403,10 +403,10 @@ static int builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int u } } - return 0; + return false; } - int res = 0; + bool res = false; if (mode == NULL) mode = DEFAULT_BIND_MODE; //!OCLINT(parameter reassignment) while (*seq) { @@ -415,7 +415,7 @@ static int builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int u if (get_terminfo_sequence(*seq++, &seq2, streams)) { input_mapping_erase(seq2, mode); } else { - res = 1; + res = true; } } else { input_mapping_erase(*seq++, mode); @@ -497,7 +497,7 @@ static int builtin_bind(parser_t &parser, io_streams_t &streams, wchar_t **argv) case L'M': { if (!valid_var_name(w.woptarg)) { streams.err.append_format(BUILTIN_ERR_BIND_MODE, cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } bind_mode = w.woptarg; bind_mode_given = true; @@ -506,7 +506,7 @@ static int builtin_bind(parser_t &parser, io_streams_t &streams, wchar_t **argv) case L'm': { if (!valid_var_name(w.woptarg)) { streams.err.append_format(BUILTIN_ERR_BIND_MODE, cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } sets_bind_mode = w.woptarg; break; @@ -517,7 +517,7 @@ static int builtin_bind(parser_t &parser, io_streams_t &streams, wchar_t **argv) } case L'?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long_only"); @@ -640,7 +640,7 @@ static int builtin_block(parser_t &parser, io_streams_t &streams, wchar_t **argv } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -653,7 +653,7 @@ static int builtin_block(parser_t &parser, io_streams_t &streams, wchar_t **argv if (scope != UNSET) { streams.err.append_format(_(L"%ls: Can not specify scope when removing block\n"), argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (parser.global_event_blocks.empty()) { @@ -738,7 +738,7 @@ static int builtin_builtin(parser_t &parser, io_streams_t &streams, wchar_t **ar } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -788,7 +788,7 @@ static int builtin_emit(parser_t &parser, io_streams_t &streams, wchar_t **argv) } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -799,7 +799,7 @@ static int builtin_emit(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (!argv[w.woptind]) { streams.err.append_format(L"%ls: expected event name\n", argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } const wchar_t *eventname = argv[w.woptind]; wcstring_list_t args(argv + w.woptind + 1, argv + argc); @@ -852,7 +852,7 @@ static int builtin_command(parser_t &parser, io_streams_t &streams, wchar_t **ar } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -863,7 +863,7 @@ static int builtin_command(parser_t &parser, io_streams_t &streams, wchar_t **ar if (!find_path) { builtin_print_help(parser, streams, argv[0], streams.out); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } int found = 0; @@ -889,7 +889,7 @@ static int builtin_generic(parser_t &parser, io_streams_t &streams, wchar_t **ar // just print help. if (argc == 1) { builtin_print_help(parser, streams, argv[0], streams.out); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } static const struct woption long_options[] = {{L"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; @@ -914,7 +914,7 @@ static int builtin_generic(parser_t &parser, io_streams_t &streams, wchar_t **ar } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -1138,7 +1138,7 @@ static int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t ** } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -1152,7 +1152,7 @@ static int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t ** if (erase + describe + list + query + copy > 1) { streams.err.append_format(_(L"%ls: Invalid combination of options\n"), argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (erase) { @@ -1164,7 +1164,7 @@ static int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t ** if (argc - w.woptind != 1) { streams.err.append_format(_(L"%ls: Expected exactly one function name\n"), argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } func = argv[w.woptind]; @@ -1180,7 +1180,7 @@ static int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t ** if (argc - w.woptind != 1) { streams.err.append_format(_(L"%ls: Expected exactly one function name for --details\n"), argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } const wchar_t *funcname = argv[w.woptind]; @@ -1213,7 +1213,7 @@ static int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t ** L"and new function name)\n"), argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } current_func = argv[w.woptind]; new_func = argv[w.woptind + 1]; @@ -1229,7 +1229,7 @@ static int builtin_functions(parser_t &parser, io_streams_t &streams, wchar_t ** streams.err.append_format(_(L"%ls: Illegal function name '%ls'\n"), argv[0], new_func.c_str()); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Keep things simple: don't allow existing names to be copy targets. @@ -1376,7 +1376,7 @@ static bool builtin_echo_parse_numeric_sequence(const wchar_t *str, size_t *cons static int builtin_echo(parser_t &parser, io_streams_t &streams, wchar_t **argv) { UNUSED(parser); // Skip first arg - if (!*argv++) return STATUS_CMD_ERROR; + if (!*argv++) return STATUS_INVALID_ARGS; // Process options. Options must come at the beginning - the first non-option kicks us out. bool print_newline = true, print_spaces = true, interpret_special_chars = false; @@ -1530,7 +1530,7 @@ static int builtin_pwd(parser_t &parser, io_streams_t &streams, wchar_t **argv) UNUSED(parser); if (argv[1] != NULL) { streams.err.append_format(BUILTIN_ERR_ARG_COUNT1, argv[0], 0, builtin_count_args(argv)); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } wcstring res = wgetcwd(); @@ -1547,13 +1547,13 @@ static int validate_function_name(int argc, const wchar_t *const *argv, wcstring if (argc < 2) { // This is currently impossible but let's be paranoid. append_format(*out_err, _(L"%ls: Expected function name"), cmd); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } function_name = argv[1]; if (!valid_func_name(function_name)) { append_format(*out_err, _(L"%ls: Illegal function name '%ls'"), cmd, function_name.c_str()); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (parser_keywords_is_reserved(function_name)) { @@ -1561,7 +1561,7 @@ static int validate_function_name(int argc, const wchar_t *const *argv, wcstring *out_err, _(L"%ls: The name '%ls' is reserved,\nand can not be used as a function name"), cmd, function_name.c_str()); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } return STATUS_CMD_OK; @@ -1614,7 +1614,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis argv++; argc--; } else { - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } int opt; @@ -1629,7 +1629,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis int sig = wcs2sig(w.woptarg); if (sig == -1) { append_format(*out_err, _(L"%ls: Unknown signal '%ls'"), cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } events.push_back(event_t::signal_event(sig)); break; @@ -1637,7 +1637,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis case 'v': { if (!valid_var_name(w.woptarg)) { append_format(*out_err, BUILTIN_ERR_VARNAME, cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } events.push_back(event_t::variable_event(w.woptarg)); @@ -1674,7 +1674,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis if (job_id == -1) { append_format(*out_err, _(L"%ls: Cannot find calling job for event handler"), cmd); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } e.type = EVENT_JOB_ID; e.param1.job_id = job_id; @@ -1683,7 +1683,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis if (errno || pid < 0) { append_format(*out_err, _(L"%ls: Invalid process id '%ls'"), cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } e.type = EVENT_EXIT; @@ -1707,7 +1707,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis case 'V': { if (!valid_var_name(w.woptarg)) { append_format(*out_err, BUILTIN_ERR_VARNAME, cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } inherit_vars.push_back(w.woptarg); break; @@ -1718,11 +1718,11 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis } case ':': { streams.err.append_format(BUILTIN_ERR_MISSING, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case '?': { builtin_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long"); @@ -1739,7 +1739,7 @@ int builtin_function(parser_t &parser, io_streams_t &streams, const wcstring_lis } else { append_format(*out_err, _(L"%ls: Unexpected positional argument '%ls'"), cmd, argv[w.woptind]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } } @@ -1805,7 +1805,7 @@ static int builtin_random(parser_t &parser, io_streams_t &streams, wchar_t **arg } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -1821,7 +1821,7 @@ static int builtin_random(parser_t &parser, io_streams_t &streams, wchar_t **arg if (arg_count >= 1 && !wcscmp(argv[w.woptind], L"choice")) { if (arg_count == 1) { streams.err.append_format(L"%ls: nothing to choose from\n", argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } choice = true; start = 1; @@ -1851,7 +1851,7 @@ static int builtin_random(parser_t &parser, io_streams_t &streams, wchar_t **arg step = 1; } else if (arg_count == 1) { long long seed = parse_ll(argv[w.woptind]); - if (parse_error) return STATUS_CMD_ERROR; + if (parse_error) return STATUS_INVALID_ARGS; engine.seed(static_cast(seed)); return STATUS_CMD_OK; } else if (arg_count == 2) { @@ -1864,17 +1864,17 @@ static int builtin_random(parser_t &parser, io_streams_t &streams, wchar_t **arg end = parse_ll(argv[w.woptind + 2]); } else { streams.err.append_format(BUILTIN_ERR_TOO_MANY_ARGUMENTS, argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (parse_error) { - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } else if (start >= end) { streams.err.append_format(L"%ls: END must be greater than START\n", argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } else if (step == 0) { streams.err.append_format(L"%ls: STEP must be a positive integer\n", argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } } @@ -1897,7 +1897,7 @@ static int builtin_random(parser_t &parser, io_streams_t &streams, wchar_t **arg if (!choice && start == real_end) { streams.err.append_format(L"%ls: range contains only one possible value\n", argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } std::uniform_int_distribution dist(start, real_end); @@ -2164,13 +2164,13 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) streams.err.append_format(_(L"%ls: Argument '%ls' is out of range\n"), argv[0], w.woptarg); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } streams.err.append_format(_(L"%ls: Argument '%ls' must be an integer\n"), argv[0], w.woptarg); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } break; } @@ -2196,11 +2196,11 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) } case ':': { streams.err.append_format(BUILTIN_ERR_MISSING, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case L'?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long"); @@ -2212,7 +2212,7 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (prompt && prompt_str) { streams.err.append_format(_(L"%ls: You can't specify both -p and -P\n"), argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (prompt_str) { @@ -2225,7 +2225,7 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) if ((place & ENV_UNEXPORT) && (place & ENV_EXPORT)) { streams.err.append_format(BUILTIN_ERR_EXPUNEXP, argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if ((place & ENV_LOCAL ? 1 : 0) + (place & ENV_GLOBAL ? 1 : 0) + @@ -2234,7 +2234,7 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) streams.err.append_format(BUILTIN_ERR_GLOCAL, argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (array && w.woptind + 1 != argc) { @@ -2242,7 +2242,7 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Verify all variable names. @@ -2250,7 +2250,7 @@ static int builtin_read(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (!valid_var_name(argv[i])) { streams.err.append_format(BUILTIN_ERR_VARNAME, cmd, argv[i]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } } @@ -2384,7 +2384,7 @@ static bool set_status_cmd(wchar_t *const cmd, status_cmd_t *status_cmd, status_ const wchar_t *subcmd_str = enum_to_str(status_cmd, status_enum_map); \ if (!subcmd_str) subcmd_str = L"default"; \ streams.err.append_format(BUILTIN_ERR_ARG_COUNT2, cmd, subcmd_str, 0, args.size()); \ - status = STATUS_CMD_ERROR; \ + status = STATUS_INVALID_ARGS; \ break; \ } @@ -2507,11 +2507,11 @@ static int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **arg } case ':': { builtin_missing_argument(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long"); @@ -2561,7 +2561,7 @@ static int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **arg const wchar_t *subcmd_str = enum_to_str(status_cmd, status_enum_map); streams.err.append_format(BUILTIN_ERR_ARG_COUNT2, cmd, subcmd_str, 1, args.size()); - status = STATUS_CMD_ERROR; + status = STATUS_INVALID_ARGS; break; } new_job_control_mode = job_control_str_to_mode(args[0].c_str(), cmd, streams); @@ -2645,7 +2645,7 @@ static int builtin_exit(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (argc > 2) { streams.err.append_format(_(L"%ls: Too many arguments\n"), argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } long ec; @@ -2657,7 +2657,7 @@ static int builtin_exit(parser_t &parser, io_streams_t &streams, wchar_t **argv) streams.err.append_format(_(L"%ls: Argument '%ls' must be an integer\n"), argv[0], argv[1]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } } reader_exit(1, 0); @@ -2777,11 +2777,11 @@ static int builtin_contains(parser_t &parser, io_streams_t &streams, wchar_t **a } case ':': { builtin_missing_argument(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case 'i': { should_output_index = true; @@ -2801,11 +2801,11 @@ static int builtin_contains(parser_t &parser, io_streams_t &streams, wchar_t **a for (int i = w.woptind + 1; i < argc; i++) { if (!wcscmp(needle, argv[i])) { if (should_output_index) streams.out.append_format(L"%d\n", i - w.woptind); - return 0; + return STATUS_CMD_OK; } } } - return 1; + return STATUS_CMD_ERROR; } /// The . (dot) builtin, sometimes called source. Evaluates the contents of a file. @@ -2933,7 +2933,7 @@ static int builtin_fg(parser_t &parser, io_streams_t &streams, wchar_t **argv) { } if (!j) { - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (streams.err_is_redirected) { @@ -3008,12 +3008,12 @@ static int builtin_bg(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (errno || pid < 0) { streams.err.append_format(_(L"%ls: '%ls' is not a valid job specifier\n"), L"bg", argv[i]); - res = STATUS_CMD_ERROR; + res = STATUS_INVALID_ARGS; } pids.push_back(pid); } - if (res == STATUS_CMD_ERROR) return res; + if (res != STATUS_CMD_OK) return res; // Background all existing jobs that match the pids. // Non-existent jobs aren't an error, but information about them is useful. @@ -3033,7 +3033,7 @@ static int disown_job(parser_t &parser, io_streams_t &streams, job_t *j) { if (j == 0) { streams.err.append_format(_(L"%ls: Unknown job '%ls'\n"), L"bg"); builtin_print_help(parser, streams, L"disown", streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Stopped disowned jobs must be manually signalled; explain how to do so @@ -3083,7 +3083,7 @@ static int builtin_disown(parser_t &parser, io_streams_t &streams, wchar_t **arg if (errno || pid < 0) { streams.err.append_format(_(L"%ls: '%ls' is not a valid job specifier\n"), argv[0], argv[i]); - res = STATUS_CMD_ERROR; + res = STATUS_INVALID_ARGS; } else { if (job_t *j = parser.job_get_from_pid(pid)) { jobs.insert(j); @@ -3092,7 +3092,7 @@ static int builtin_disown(parser_t &parser, io_streams_t &streams, wchar_t **arg } } } - if (res == STATUS_CMD_ERROR) { + if (res != STATUS_CMD_OK) { return res; } @@ -3115,7 +3115,7 @@ static int builtin_break_continue(parser_t &parser, io_streams_t &streams, wchar streams.err.append_format(BUILTIN_ERR_UNKNOWN, argv[0], argv[1]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Find the index of the enclosing for or while loop. Recall that incrementing loop_idx goes @@ -3148,7 +3148,7 @@ static int builtin_break_continue(parser_t &parser, io_streams_t &streams, wchar static int builtin_breakpoint(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (argv[1] != NULL) { streams.err.append_format(BUILTIN_ERR_ARG_COUNT1, argv[0], 0, builtin_count_args(argv)); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } const breakpoint_block_t *bpb = parser.push_block(); @@ -3167,7 +3167,7 @@ static int builtin_return(parser_t &parser, io_streams_t &streams, wchar_t **arg if (argc > 2) { streams.err.append_format(BUILTIN_ERR_TOO_MANY_ARGUMENTS, argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } int status; @@ -3177,7 +3177,7 @@ static int builtin_return(parser_t &parser, io_streams_t &streams, wchar_t **arg streams.err.append_format(_(L"%ls: Argument '%ls' must be an integer\n"), argv[0], argv[1]); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } } else { status = proc_get_last_status(); @@ -3234,13 +3234,13 @@ static bool set_hist_cmd(wchar_t *const cmd, hist_cmd_t *hist_cmd, hist_cmd_t su const wchar_t *subcmd_str = enum_to_str(hist_cmd, hist_enum_map); \ streams.err.append_format(_(L"%ls: you cannot use any options with the %ls command\n"), \ cmd, subcmd_str); \ - status = STATUS_CMD_ERROR; \ + status = STATUS_INVALID_ARGS; \ break; \ } \ if (args.size() != 0) { \ const wchar_t *subcmd_str = enum_to_str(hist_cmd, hist_enum_map); \ streams.err.append_format(BUILTIN_ERR_ARG_COUNT2, cmd, subcmd_str, 0, args.size()); \ - status = STATUS_CMD_ERROR; \ + status = STATUS_INVALID_ARGS; \ break; \ } @@ -3344,7 +3344,7 @@ static int builtin_history(parser_t &parser, io_streams_t &streams, wchar_t **ar if (errno) { streams.err.append_format(_(L"%ls: max value '%ls' is not a valid number\n"), argv[0], w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } break; } @@ -3358,14 +3358,14 @@ static int builtin_history(parser_t &parser, io_streams_t &streams, wchar_t **ar } case ':': { streams.err.append_format(BUILTIN_ERR_MISSING, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case '?': { // Try to parse it as a number; e.g., "-123". max_items = fish_wcstol(argv[w.woptind - 1] + 1); if (errno) { streams.err.append_format(BUILTIN_ERR_UNKNOWN, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } w.nextchar = NULL; break; @@ -3380,7 +3380,7 @@ static int builtin_history(parser_t &parser, io_streams_t &streams, wchar_t **ar if (max_items <= 0) { streams.err.append_format(_(L"%ls: max value '%ls' is not a valid number\n"), argv[0], w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // If a history command hasn't already been specified via a flag check the first word. @@ -3390,7 +3390,7 @@ static int builtin_history(parser_t &parser, io_streams_t &streams, wchar_t **ar hist_cmd_t subcmd = str_to_enum(argv[w.woptind], hist_enum_map, hist_enum_map_len); if (subcmd != HIST_UNDEF) { if (!set_hist_cmd(cmd, &hist_cmd, subcmd, streams)) { - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } w.woptind++; } @@ -3422,13 +3422,13 @@ static int builtin_history(parser_t &parser, io_streams_t &streams, wchar_t **ar // be handled only by the history function's interactive delete feature. if (search_type != HISTORY_SEARCH_TYPE_EXACT) { streams.err.append_format(_(L"builtin history delete only supports --exact\n")); - status = STATUS_CMD_ERROR; + status = STATUS_INVALID_ARGS; break; } if (!case_sensitive) { streams.err.append_format( _(L"builtin history delete only supports --case-sensitive\n")); - status = STATUS_CMD_ERROR; + status = STATUS_INVALID_ARGS; break; } for (wcstring_list_t::const_iterator iter = args.begin(); iter != args.end(); ++iter) { @@ -3516,8 +3516,8 @@ int builtin_true(parser_t &parser, io_streams_t &streams, wchar_t **argv) { UNUSED(parser); UNUSED(streams); if (argv[1] != NULL) { - streams.err.append_format(BUILTIN_ERR_ARG_COUNT1, argv[0], 0, builtin_count_args(argv)); - return STATUS_CMD_ERROR; + streams.err.append_format(BUILTIN_ERR_ARG_COUNT1, argv[0], 0, builtin_count_args(argv) - 1); + return STATUS_INVALID_ARGS; } return STATUS_CMD_OK; } @@ -3526,8 +3526,8 @@ int builtin_false(parser_t &parser, io_streams_t &streams, wchar_t **argv) { UNUSED(parser); UNUSED(streams); if (argv[1] != NULL) { - streams.err.append_format(BUILTIN_ERR_ARG_COUNT1, argv[0], 0, builtin_count_args(argv)); - return STATUS_CMD_ERROR; + streams.err.append_format(BUILTIN_ERR_ARG_COUNT1, argv[0], 0, builtin_count_args(argv) - 1); + return STATUS_INVALID_ARGS; } return STATUS_CMD_ERROR; } @@ -3542,7 +3542,7 @@ int builtin_realpath(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (argc != 2) { builtin_print_help(parser, streams, argv[0], streams.out); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } wchar_t *real_path = wrealpath(argv[1], NULL); @@ -3667,7 +3667,7 @@ static bool builtin_handles_help(const wchar_t *cmd) { int builtin_run(parser_t &parser, const wchar_t *const *argv, io_streams_t &streams) { UNUSED(parser); UNUSED(streams); - if (argv == NULL || argv[0] == NULL) return STATUS_CMD_ERROR; + if (argv == NULL || argv[0] == NULL) return STATUS_INVALID_ARGS; const builtin_data_t *data = builtin_lookup(argv[0]); if (argv[1] != NULL && !builtin_handles_help(argv[0]) && argv[2] == NULL && diff --git a/src/builtin_commandline.cpp b/src/builtin_commandline.cpp index dafe6c286..5723e9d9c 100644 --- a/src/builtin_commandline.cpp +++ b/src/builtin_commandline.cpp @@ -201,13 +201,13 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (is_interactive_session) { // Prompt change requested while we don't have a prompt, most probably while reading the // init files. Just ignore it. - return 1; + return STATUS_CMD_ERROR; } streams.err.append(argv[0]); streams.err.append(L": Can not set commandline in non-interactive mode\n"); builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_CMD_ERROR; } w.woptind = 0; @@ -244,7 +244,7 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) long_options[opt_index].name); builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_CMD_ERROR; } case L'a': { append_mode = APPEND_MODE; @@ -313,11 +313,11 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) } case 'h': { builtin_print_help(parser, streams, argv[0], streams.out); - return 0; + return STATUS_CMD_OK; } case L'?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return 1; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -333,16 +333,14 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (buffer_part || cut_at_cursor || append_mode || tokenize || cursor_mode || line_mode || search_mode || paging_mode) { streams.err.append_format(BUILTIN_ERR_COMBO, argv[0]); - builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } if (argc == w.woptind) { streams.err.append_format(BUILTIN_ERR_MISSING, argv[0]); - builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } for (i = w.woptind; i < argc; i++) { @@ -355,11 +353,11 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) streams.err.append_format(_(L"%ls: Unknown input function '%ls'"), argv[0], argv[i]); builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } } - return 0; + return STATUS_CMD_OK; } if (selection_mode) { @@ -368,40 +366,37 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) if (reader_get_selection(&start, &len)) { streams.out.append(buffer + start, len); } - return 0; + return STATUS_CMD_OK; } // Check for invalid switch combinations. if ((search_mode || line_mode || cursor_mode || paging_mode) && (argc - w.woptind > 1)) { streams.err.append_format(L"%ls: Too many arguments", argv[0]); builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } if ((buffer_part || tokenize || cut_at_cursor) && (cursor_mode || line_mode || search_mode || paging_mode)) { streams.err.append_format(BUILTIN_ERR_COMBO, argv[0]); - builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } if ((tokenize || cut_at_cursor) && (argc - w.woptind)) { streams.err.append_format( BUILTIN_ERR_COMBO2, argv[0], L"--cut-at-cursor and --tokenize can not be used when setting the commandline"); - builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } if (append_mode && !(argc - w.woptind)) { streams.err.append_format( BUILTIN_ERR_COMBO2, argv[0], L"insertion mode switches can not be used when not in insertion mode"); - builtin_print_help(parser, streams, argv[0], streams.err); - return 1; + return STATUS_INVALID_ARGS; } // Set default modes. @@ -427,14 +422,14 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) } else { streams.out.append_format(L"%lu\n", (unsigned long)reader_get_cursor_pos()); } - return 0; + return STATUS_CMD_OK; } if (line_mode) { size_t pos = reader_get_cursor_pos(); const wchar_t *buff = reader_get_buffer(); streams.out.append_format(L"%lu\n", (unsigned long)parse_util_lineno(buff, pos)); - return 0; + return STATUS_CMD_OK; } if (search_mode) { @@ -483,5 +478,5 @@ int builtin_commandline(parser_t &parser, io_streams_t &streams, wchar_t **argv) replace_part(begin, end, sb.c_str(), append_mode); } - return 0; + return STATUS_CMD_OK; } diff --git a/src/builtin_complete.cpp b/src/builtin_complete.cpp index 060ca1ee2..2141a6d10 100644 --- a/src/builtin_complete.cpp +++ b/src/builtin_complete.cpp @@ -175,7 +175,7 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { cmd_to_complete.push_back(tmp); } else { streams.err.append_format(_(L"%ls: Invalid token '%ls'\n"), cmd, w.woptarg); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } break; } @@ -195,7 +195,7 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { short_opt.append(w.woptarg); if (w.woptarg[0] == '\0') { streams.err.append_format(_(L"%ls: -s requires a non-empty string\n"), cmd); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } break; } @@ -203,7 +203,7 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { gnu_opt.push_back(w.woptarg); if (w.woptarg[0] == '\0') { streams.err.append_format(_(L"%ls: -l requires a non-empty string\n"), cmd); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } break; } @@ -211,7 +211,7 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { old_opt.push_back(w.woptarg); if (w.woptarg[0] == '\0') { streams.err.append_format(_(L"%ls: -o requires a non-empty string\n"), cmd); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } break; } @@ -238,7 +238,7 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { // This corresponds to using 'complete -C' in non-interactive mode. // See #2361. builtin_missing_argument(parser, streams, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } do_complete_param = arg; break; @@ -249,11 +249,11 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { } case ':': { builtin_missing_argument(parser, streams, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case '?': { builtin_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long"); @@ -265,7 +265,7 @@ int builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (w.woptind != argc) { streams.err.append_format(BUILTIN_ERR_TOO_MANY_ARGUMENTS, cmd); builtin_print_help(parser, streams, cmd, streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } if (condition && wcslen(condition)) { diff --git a/src/builtin_jobs.cpp b/src/builtin_jobs.cpp index 8e8c8679c..599ab62e9 100644 --- a/src/builtin_jobs.cpp +++ b/src/builtin_jobs.cpp @@ -155,11 +155,11 @@ int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { } case 'h': { builtin_print_help(parser, streams, argv[0], streams.out); - return 0; + return STATUS_CMD_OK; } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); - return 1; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -175,7 +175,7 @@ int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { while ((j = jobs.next())) { if ((j->flags & JOB_CONSTRUCTED) && !job_is_completed(j)) { builtin_jobs_print(j, mode, !streams.out_is_redirected, streams); - return 0; + return STATUS_CMD_ERROR; } } @@ -187,7 +187,7 @@ int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { int pid = fish_wcstoi(argv[i]); if (errno || pid < 0) { streams.err.append_format(_(L"%ls: '%ls' is not a job\n"), argv[0], argv[i]); - return 1; + return STATUS_INVALID_ARGS; } const job_t *j = job_get_from_pid(pid); @@ -197,7 +197,7 @@ int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { found = 1; } else { streams.err.append_format(_(L"%ls: No suitable job: %d\n"), argv[0], pid); - return 1; + return STATUS_CMD_ERROR; } } } else { @@ -218,8 +218,8 @@ int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (!streams.out_is_redirected) { streams.out.append_format(_(L"%ls: There are no jobs\n"), argv[0]); } - return 1; + return STATUS_CMD_ERROR; } - return 0; + return STATUS_CMD_OK; } diff --git a/src/builtin_printf.cpp b/src/builtin_printf.cpp index e88367a56..a6ff9c9fd 100644 --- a/src/builtin_printf.cpp +++ b/src/builtin_printf.cpp @@ -728,7 +728,7 @@ int builtin_printf(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (argc <= 1) { state.fatal_error(_(L"printf: not enough arguments")); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } format = argv[1]; diff --git a/src/builtin_set.cpp b/src/builtin_set.cpp index 643bf077c..b16a9e374 100644 --- a/src/builtin_set.cpp +++ b/src/builtin_set.cpp @@ -344,7 +344,7 @@ int builtin_set(parser_t &parser, io_streams_t &streams, wchar_t **argv) { // Variables used for performing the actual work. wchar_t *dest = 0; - int retcode = 0; + int retcode = STATUS_CMD_OK; int scope; int slice = 0; @@ -402,11 +402,11 @@ int builtin_set(parser_t &parser, io_streams_t &streams, wchar_t **argv) { } case 'h': { builtin_print_help(parser, streams, cmd, streams.out); - return 0; + return STATUS_CMD_OK; } case '?': { builtin_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); - return 1; + return STATUS_INVALID_ARGS; } default: { break; } } @@ -416,31 +416,29 @@ int builtin_set(parser_t &parser, io_streams_t &streams, wchar_t **argv) { // a variable (-q) we can not also specify scope. if (query && (erase || list)) { streams.err.append_format(BUILTIN_ERR_COMBO, cmd); - builtin_print_help(parser, streams, cmd, streams.err); - return 1; + return STATUS_INVALID_ARGS; } // We can't both list and erase variables. if (erase && list) { streams.err.append_format(BUILTIN_ERR_COMBO, cmd); - builtin_print_help(parser, streams, cmd, streams.err); - return 1; + return STATUS_INVALID_ARGS; } // Variables can only have one scope. if (local + global + universal > 1) { streams.err.append_format(BUILTIN_ERR_GLOCAL, cmd); builtin_print_help(parser, streams, cmd, streams.err); - return 1; + return STATUS_INVALID_ARGS; } // Variables can only have one export status. if (exportv && unexport) { streams.err.append_format(BUILTIN_ERR_EXPUNEXP, argv[0]); builtin_print_help(parser, streams, cmd, streams.err); - return 1; + return STATUS_INVALID_ARGS; } // Calculate the scope value for variable assignement. @@ -496,16 +494,15 @@ int builtin_set(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (list) { // Maybe we should issue an error if there are any other arguments? print_variables(0, 0, shorten_ok, scope, streams); - return 0; + return STATUS_CMD_OK; } if (w.woptind == argc) { // Print values of variables. if (erase) { streams.err.append_format(_(L"%ls: Erase needs a variable name\n"), cmd); - builtin_print_help(parser, streams, cmd, streams.err); - retcode = 1; + retcode = STATUS_INVALID_ARGS; } else { print_variables(1, 1, shorten_ok, scope, streams); } @@ -524,7 +521,7 @@ int builtin_set(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (!valid_var_name(dest)) { streams.err.append_format(BUILTIN_ERR_VARNAME, cmd, dest); builtin_print_help(parser, streams, argv[0], streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Set assignment can work in two modes, either using slices or using the whole array. We detect diff --git a/src/builtin_set_color.cpp b/src/builtin_set_color.cpp index 9db52d30f..6610d7d7f 100644 --- a/src/builtin_set_color.cpp +++ b/src/builtin_set_color.cpp @@ -125,7 +125,7 @@ int builtin_set_color(parser_t &parser, io_streams_t &streams, wchar_t **argv) { return STATUS_CMD_OK; } case '?': { - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected opt"); @@ -140,7 +140,7 @@ int builtin_set_color(parser_t &parser, io_streams_t &streams, wchar_t **argv) { rgb_color_t fg = rgb_color_t(argv[w.woptind]); if (fg.is_none()) { streams.err.append_format(_(L"%ls: Unknown color '%ls'\n"), argv[0], argv[w.woptind]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } fgcolors.push_back(fg); } @@ -148,7 +148,7 @@ int builtin_set_color(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (fgcolors.empty() && bgcolor == NULL && !bold && !underline && !italics && !dim && !reverse) { streams.err.append_format(_(L"%ls: Expected an argument\n"), argv[0]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // #1323: We may have multiple foreground colors. Choose the best one. If we had no foreground @@ -159,7 +159,7 @@ int builtin_set_color(parser_t &parser, io_streams_t &streams, wchar_t **argv) { const rgb_color_t bg = rgb_color_t(bgcolor ? bgcolor : L""); if (bgcolor && bg.is_none()) { streams.err.append_format(_(L"%ls: Unknown color '%ls'\n"), argv[0], bgcolor); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Test if we have at least basic support for setting fonts, colors and related bits - otherwise diff --git a/src/builtin_string.cpp b/src/builtin_string.cpp index b72b22df8..5d6a3dca5 100644 --- a/src/builtin_string.cpp +++ b/src/builtin_string.cpp @@ -60,12 +60,12 @@ static const wchar_t *string_get_arg_stdin(wcstring *storage, const io_streams_t long rc = read_blocked(streams.stdin_fd, &ch, 1); if (rc < 0) { // failure - return 0; + return NULL; } if (rc == 0) { // EOF if (arg.empty()) { - return 0; + return NULL; } break; } diff --git a/src/builtin_test.cpp b/src/builtin_test.cpp index 48932dee8..fb843966f 100644 --- a/src/builtin_test.cpp +++ b/src/builtin_test.cpp @@ -591,7 +591,7 @@ bool combining_expression::evaluate(wcstring_list_t &errors) { } errors.push_back(format_string(L"Unknown token type in %s", __func__)); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } bool parenthetical_expression::evaluate(wcstring_list_t &errors) { @@ -741,7 +741,7 @@ int builtin_test(parser_t &parser, io_streams_t &streams, wchar_t **argv) { using namespace test_expressions; // The first argument should be the name of the command ('test'). - if (!argv[0]) return STATUS_CMD_ERROR; + if (!argv[0]) return STATUS_INVALID_ARGS; // Whether we are invoked with bracket '[' or not. wchar_t *program_name = argv[0]; @@ -758,7 +758,7 @@ int builtin_test(parser_t &parser, io_streams_t &streams, wchar_t **argv) { argc--; } else { streams.err.append(L"[: the last argument must be ']'\n"); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } } diff --git a/src/builtin_ulimit.cpp b/src/builtin_ulimit.cpp index 58f24fffc..6015fdbe3 100644 --- a/src/builtin_ulimit.cpp +++ b/src/builtin_ulimit.cpp @@ -240,15 +240,15 @@ int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **argv) { #endif case 'h': { builtin_print_help(parser, streams, cmd, streams.out); - return 0; + return STATUS_CMD_OK; } case ':': { streams.err.append_format(BUILTIN_ERR_MISSING, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } case '?': { builtin_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long"); @@ -270,7 +270,7 @@ int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **argv) { } else if (arg_count != 1) { streams.err.append_format(BUILTIN_ERR_TOO_MANY_ARGUMENTS, cmd); builtin_print_help(parser, streams, cmd, streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } // Change current limit value. @@ -283,7 +283,7 @@ int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (*argv[w.woptind] == L'\0') { streams.err.append_format(_(L"%ls: New limit cannot be an empty string\n"), cmd); builtin_print_help(parser, streams, cmd, streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } else if (wcscasecmp(argv[w.woptind], L"unlimited") == 0) { new_limit = RLIM_INFINITY; } else if (wcscasecmp(argv[w.woptind], L"hard") == 0) { @@ -295,7 +295,7 @@ int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **argv) { if (errno) { streams.err.append_format(_(L"%ls: Invalid limit '%ls'\n"), cmd, argv[w.woptind]); builtin_print_help(parser, streams, cmd, streams.err); - return STATUS_CMD_ERROR; + return STATUS_INVALID_ARGS; } new_limit *= get_multiplier(what); } diff --git a/src/common.h b/src/common.h index 028494704..88ed2bae3 100644 --- a/src/common.h +++ b/src/common.h @@ -874,7 +874,9 @@ enum { STATUS_ILLEGAL_CMD = 123, /// The status code used when `read` is asked to consume too much data. STATUS_READ_TOO_MUCH = 122, - /// The status code used for erroneous argument combinations in a command. + /// The status code used for invalid arguments given to a command. This is distinct from valid + /// arguments that might result in a command failure. An invalid args condition is something + /// like an unrecognized flag, missing or too many arguments, an invalid integer, etc. But STATUS_INVALID_ARGS = 121, }; #endif diff --git a/src/fish_tests.cpp b/src/fish_tests.cpp index dae98c85f..565e2cb39 100644 --- a/src/fish_tests.cpp +++ b/src/fish_tests.cpp @@ -1271,7 +1271,7 @@ static bool expand_test(const wchar_t *in, expand_flags_t flags, ...) { wcstring_list_t expected; va_start(va, flags); - while ((arg = va_arg(va, wchar_t *)) != 0) { + while ((arg = va_arg(va, wchar_t *)) != NULL) { expected.push_back(wcstring(arg)); } va_end(va); @@ -3799,7 +3799,7 @@ static void run_one_string_test(const wchar_t **argv, int expected_rc, streams.stdin_is_directly_redirected = false; // read from argv instead of stdin int rc = builtin_string(parser, streams, const_cast(argv)); wcstring args; - for (int i = 0; argv[i] != 0; i++) { + for (int i = 0; argv[i] != NULL; i++) { args += escape_string(argv[i], ESCAPE_ALL) + L' '; } args.resize(args.size() - 1); @@ -4103,10 +4103,10 @@ static void test_string(void) { {{L"string", L"trim", L"-c", L"\\/", L"\\a/"}, STATUS_CMD_OK, L"a\n"}, {{L"string", L"trim", L"-c", L"", L".a."}, STATUS_CMD_ERROR, L".a.\n"}, - {{0}, STATUS_CMD_ERROR, NULL}}; + {{NULL}, STATUS_CMD_ERROR, NULL}}; struct string_test *t = string_tests; - while (t->argv[0] != 0) { + while (t->argv[0]) { run_one_string_test(t->argv, t->expected_rc, t->expected_out); t++; } diff --git a/tests/test4.out b/tests/test4.out index f38fa96f9..903782b99 100644 --- a/tests/test4.out +++ b/tests/test4.out @@ -31,7 +31,7 @@ Verify that set passes through exit status, except when passed -n or -q or -e 6 0 7 1 8 0 -9 1 +9 121 10 0 A 11 1 B Verify set -ql behavior