diff options
author | ridiculousfish <corydoras@ridiculousfish.com> | 2015-07-25 18:16:00 -0700 |
---|---|---|
committer | ridiculousfish <corydoras@ridiculousfish.com> | 2015-07-25 18:16:34 -0700 |
commit | f4d1657c22c81a7720a91026f915b80d2d6aa6e8 (patch) | |
tree | 03ebc46be5d18b98e2eecc76ccde83697a5b89cd | |
parent | caab298f723590fdaaff887ec32d1530da18920b (diff) |
Eliminate wgetopt global variables
Replace them with a new struct wgetopter_t that uses
instance variables instead.
-rw-r--r-- | src/builtin.cpp | 316 | ||||
-rw-r--r-- | src/builtin_commandline.cpp | 44 | ||||
-rw-r--r-- | src/builtin_complete.cpp | 37 | ||||
-rw-r--r-- | src/builtin_jobs.cpp | 19 | ||||
-rw-r--r-- | src/builtin_set.cpp | 31 | ||||
-rw-r--r-- | src/builtin_set_color.cpp | 13 | ||||
-rw-r--r-- | src/builtin_ulimit.cpp | 29 | ||||
-rw-r--r-- | src/wgetopt.cpp | 122 | ||||
-rw-r--r-- | src/wgetopt.h | 296 |
9 files changed, 403 insertions, 504 deletions
diff --git a/src/builtin.cpp b/src/builtin.cpp index 59778862..3381996a 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -636,7 +636,7 @@ static int builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int u */ static int builtin_bind(parser_t &parser, wchar_t **argv) { - + wgetopter_t w; enum { BIND_INSERT, @@ -657,7 +657,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) int use_terminfo = 0; - woptind=0; + w.woptind=0; static const struct woption long_options[] = { @@ -675,11 +675,11 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) while (1) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"aehkKfM:m:", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"aehkKfM:m:", + long_options, + &opt_index); if (opt == -1) break; @@ -722,17 +722,17 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) break; case 'M': - bind_mode = woptarg; + bind_mode = w.woptarg; bind_mode_given = true; break; case 'm': - sets_bind_mode = woptarg; + sets_bind_mode = w.woptarg; sets_bind_mode_given = true; break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; @@ -752,7 +752,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) case BIND_ERASE: { - if (builtin_bind_erase(&argv[woptind], all, bind_mode_given ? bind_mode : NULL, use_terminfo)) + if (builtin_bind_erase(&argv[w.woptind], all, bind_mode_given ? bind_mode : NULL, use_terminfo)) { res = STATUS_BUILTIN_ERROR; } @@ -761,7 +761,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) case BIND_INSERT: { - switch (argc-woptind) + switch (argc-w.woptind) { case 0: { @@ -774,7 +774,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) wcstring seq; if (use_terminfo) { - if (!get_terminfo_sequence(argv[woptind], &seq)) + if (!get_terminfo_sequence(argv[w.woptind], &seq)) { res = STATUS_BUILTIN_ERROR; // get_terminfo_sequence already printed the error @@ -783,12 +783,12 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) } else { - seq = argv[woptind]; + seq = argv[w.woptind]; } if (!builtin_bind_list_one(seq, bind_mode)) { res = STATUS_BUILTIN_ERROR; - wcstring eseq = escape_string(argv[woptind], 0); + wcstring eseq = escape_string(argv[w.woptind], 0); if (use_terminfo) { append_format(stderr_buffer, _(L"%ls: No binding found for key '%ls'\n"), argv[0], eseq.c_str()); @@ -803,7 +803,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) default: { - if (builtin_bind_add(argv[woptind], (const wchar_t **)argv + (woptind + 1), argc - (woptind + 1), bind_mode, sets_bind_mode, use_terminfo)) + if (builtin_bind_add(argv[w.woptind], (const wchar_t **)argv + (w.woptind + 1), argc - (w.woptind + 1), bind_mode, sets_bind_mode, use_terminfo)) { res = STATUS_BUILTIN_ERROR; } @@ -845,6 +845,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) */ static int builtin_block(parser_t &parser, wchar_t **argv) { + wgetopter_t w; enum { UNSET, @@ -857,7 +858,7 @@ static int builtin_block(parser_t &parser, wchar_t **argv) int erase = 0; int argc=builtin_count_args(argv); - woptind=0; + w.woptind=0; static const struct woption long_options[] = @@ -888,11 +889,11 @@ static int builtin_block(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"elgh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"elgh", + long_options, + &opt_index); if (opt == -1) break; @@ -925,7 +926,7 @@ static int builtin_block(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1003,8 +1004,7 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) { int argc=builtin_count_args(argv); int list=0; - - woptind=0; + wgetopter_t w; static const struct woption long_options[] = @@ -1027,11 +1027,11 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"nh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"nh", + long_options, + &opt_index); if (opt == -1) break; @@ -1057,7 +1057,7 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1085,10 +1085,9 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) */ static int builtin_emit(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=builtin_count_args(argv); - woptind=0; - static const struct woption long_options[] = { @@ -1106,11 +1105,11 @@ static int builtin_emit(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"h", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"h", + long_options, + &opt_index); if (opt == -1) break; @@ -1131,20 +1130,20 @@ static int builtin_emit(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } } - if (!argv[woptind]) + if (!argv[w.woptind]) { append_format(stderr_buffer, L"%ls: expected event name\n", argv[0]); return STATUS_BUILTIN_ERROR; } - const wchar_t *eventname = argv[woptind]; - wcstring_list_t args(argv + woptind + 1, argv + argc); + const wchar_t *eventname = argv[w.woptind]; + wcstring_list_t args(argv + w.woptind + 1, argv + argc); event_fire_generic(eventname, &args); return STATUS_BUILTIN_OK; @@ -1157,10 +1156,11 @@ static int builtin_emit(parser_t &parser, wchar_t **argv) */ static int builtin_command(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=builtin_count_args(argv); int print_path=0; - woptind=0; + w.woptind=0; static const struct woption long_options[] = @@ -1174,11 +1174,11 @@ static int builtin_command(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"svh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"svh", + long_options, + &opt_index); if (opt == -1) break; @@ -1204,7 +1204,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1219,7 +1219,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv) int found=0; - for (int idx = woptind; argv[idx]; ++idx) + for (int idx = w.woptind; argv[idx]; ++idx) { const wchar_t *command_name = argv[idx]; wcstring path; @@ -1239,6 +1239,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv) */ static int builtin_generic(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=builtin_count_args(argv); /* Hackish - if we have no arguments other than the command, we are a "naked invocation" and we just print help */ @@ -1248,8 +1249,6 @@ static int builtin_generic(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_ERROR; } - woptind=0; - static const struct woption long_options[] = { @@ -1261,11 +1260,11 @@ static int builtin_generic(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"h", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"h", + long_options, + &opt_index); if (opt == -1) break; @@ -1286,7 +1285,7 @@ static int builtin_generic(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1435,6 +1434,7 @@ static void functions_def(const wcstring &name, wcstring &out) */ static int builtin_functions(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int i; int erase=0; wchar_t *desc=0; @@ -1446,8 +1446,6 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) int query = 0; int copy = 0; - woptind=0; - static const struct woption long_options[] = { @@ -1489,11 +1487,11 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"ed:nahqc", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"ed:nahqc", + long_options, + &opt_index); if (opt == -1) break; @@ -1516,7 +1514,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) break; case 'd': - desc=woptarg; + desc=w.woptarg; break; case 'n': @@ -1540,7 +1538,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1564,7 +1562,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) if (erase) { int i; - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) function_remove(argv[i]); return STATUS_BUILTIN_OK; } @@ -1572,7 +1570,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) { wchar_t *func; - if (argc-woptind != 1) + if (argc-w.woptind != 1) { append_format(stderr_buffer, _(L"%ls: Expected exactly one function name\n"), @@ -1581,7 +1579,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_ERROR; } - func = argv[woptind]; + func = argv[w.woptind]; if (!function_exists(func)) { append_format(stderr_buffer, @@ -1598,7 +1596,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; } - else if (list || (argc==woptind)) + else if (list || (argc==w.woptind)) { int is_screen = !builtin_out_redirect && isatty(1); size_t i; @@ -1632,7 +1630,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) wcstring current_func; wcstring new_func; - if (argc-woptind != 2) + if (argc-w.woptind != 2) { append_format(stderr_buffer, _(L"%ls: Expected exactly two names (current function name, and new function name)\n"), @@ -1641,8 +1639,8 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_ERROR; } - current_func = argv[woptind]; - new_func = argv[woptind+1]; + current_func = argv[w.woptind]; + new_func = argv[w.woptind+1]; if (!function_exists(current_func)) { @@ -1683,7 +1681,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_ERROR; } - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) { if (!function_exists(argv[i])) res++; @@ -1691,7 +1689,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) { if (!query) { - if (i != woptind) + if (i != w.woptind) stdout_buffer.append(L"\n"); functions_def(argv[i], stdout_buffer); @@ -1987,6 +1985,7 @@ static int builtin_pwd(parser_t &parser, wchar_t **argv) /** Adds a function to the function set. It calls into function.cpp to perform any heavy lifting. */ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstring &contents, int definition_line_offset, wcstring *out_err) { + wgetopter_t w; assert(out_err != NULL); /* wgetopt expects 'function' as the first argument. Make a new wcstring_list with that property. */ @@ -2009,8 +2008,6 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr bool shadows = true; - woptind=0; - wcstring_list_t wrap_targets; /* If -a/--argument-names is specified before the function name, @@ -2041,11 +2038,11 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr int opt_index = 0; // The leading - here specifies RETURN_IN_ORDER - int opt = wgetopt_long(argc, - argv, - L"-d:s:j:p:v:e:haSV:", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"-d:s:j:p:v:e:haSV:", + long_options, + &opt_index); if (opt == -1) break; @@ -2066,19 +2063,19 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr break; case 'd': - desc=woptarg; + desc=w.woptarg; break; case 's': { - int sig = wcs2sig(woptarg); + int sig = wcs2sig(w.woptarg); if (sig < 0) { append_format(*out_err, _(L"%ls: Unknown signal '%ls'\n"), argv[0], - woptarg); + w.woptarg); res=1; break; } @@ -2088,24 +2085,24 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr case 'v': { - if (wcsvarname(woptarg)) + if (wcsvarname(w.woptarg)) { append_format(*out_err, _(L"%ls: Invalid variable name '%ls'\n"), argv[0], - woptarg); + w.woptarg); res=STATUS_BUILTIN_ERROR; break; } - events.push_back(event_t::variable_event(woptarg)); + events.push_back(event_t::variable_event(w.woptarg)); break; } case 'e': { - events.push_back(event_t::generic_event(woptarg)); + events.push_back(event_t::generic_event(w.woptarg)); break; } @@ -2117,7 +2114,7 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr event_t e(EVENT_ANY); if ((opt == 'j') && - (wcscasecmp(woptarg, L"caller") == 0)) + (wcscasecmp(w.woptarg, L"caller") == 0)) { int job_id = -1; @@ -2158,13 +2155,13 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr else { errno = 0; - pid = fish_wcstoi(woptarg, &end, 10); + pid = fish_wcstoi(w.woptarg, &end, 10); if (errno || !end || *end) { append_format(*out_err, _(L"%ls: Invalid process id %ls\n"), argv[0], - woptarg); + w.woptarg); res=1; break; } @@ -2195,19 +2192,19 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr break; case 'w': - wrap_targets.push_back(woptarg); + wrap_targets.push_back(w.woptarg); break; case 'V': { - if (wcsvarname(woptarg)) + if (wcsvarname(w.woptarg)) { - append_format(*out_err, _(L"%ls: Invalid variable name '%ls'\n"), argv[0], woptarg); + append_format(*out_err, _(L"%ls: Invalid variable name '%ls'\n"), argv[0], w.woptarg); res = STATUS_BUILTIN_ERROR; break; } - inherit_vars.push_back(woptarg); + inherit_vars.push_back(w.woptarg); break; } @@ -2216,12 +2213,12 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr return STATUS_BUILTIN_OK; case 1: - assert(woptarg != NULL); - positionals.push_back(woptarg); + assert(w.woptarg != NULL); + positionals.push_back(w.woptarg); break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); res = 1; break; @@ -2350,7 +2347,7 @@ static int builtin_random(parser_t &parser, wchar_t **argv) int argc = builtin_count_args(argv); - woptind=0; + wgetopter_t w; static const struct woption long_options[] = @@ -2369,11 +2366,11 @@ static int builtin_random(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"h", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"h", + long_options, + &opt_index); if (opt == -1) break; @@ -2395,14 +2392,14 @@ static int builtin_random(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } } - switch (argc-woptind) + switch (argc-w.woptind) { case 0: @@ -2426,13 +2423,13 @@ static int builtin_random(parser_t &parser, wchar_t **argv) wchar_t *end=0; errno=0; - foo = wcstol(argv[woptind], &end, 10); + foo = wcstol(argv[w.woptind], &end, 10); if (errno || *end) { append_format(stderr_buffer, _(L"%ls: Seed value '%ls' is not a valid number\n"), argv[0], - argv[woptind]); + argv[w.woptind]); return STATUS_BUILTIN_ERROR; } @@ -2446,7 +2443,7 @@ static int builtin_random(parser_t &parser, wchar_t **argv) append_format(stderr_buffer, _(L"%ls: Expected zero or one argument, got %d\n"), argv[0], - argc-woptind); + argc-w.woptind); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } @@ -2460,6 +2457,7 @@ static int builtin_random(parser_t &parser, wchar_t **argv) */ static int builtin_read(parser_t &parser, wchar_t **argv) { + wgetopter_t w; wcstring buff; int i, argc = builtin_count_args(argv); int place = ENV_USER; @@ -2474,8 +2472,6 @@ static int builtin_read(parser_t &parser, wchar_t **argv) int array = 0; bool split_null = false; - woptind=0; - while (1) { static const struct woption @@ -2545,11 +2541,11 @@ static int builtin_read(parser_t &parser, wchar_t **argv) int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"xglUup:R:c:hm:n:saz", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"xglUup:R:c:hm:n:saz", + long_options, + &opt_index); if (opt == -1) break; @@ -2587,24 +2583,24 @@ static int builtin_read(parser_t &parser, wchar_t **argv) break; case L'p': - prompt = woptarg; + prompt = w.woptarg; break; case L'R': - right_prompt = woptarg; + right_prompt = w.woptarg; break; case L'c': - commandline = woptarg; + commandline = w.woptarg; break; case L'm': - mode_name = woptarg; + mode_name = w.woptarg; break; case L'n': errno = 0; - nchars = fish_wcstoi(woptarg, &end, 10); + nchars = fish_wcstoi(w.woptarg, &end, 10); if (errno || *end != 0) { switch (errno) @@ -2613,7 +2609,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) append_format(stderr_buffer, _(L"%ls: Argument '%ls' is out of range\n"), argv[0], - woptarg); + w.woptarg); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; @@ -2621,7 +2617,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) append_format(stderr_buffer, _(L"%ls: Argument '%ls' must be an integer\n"), argv[0], - woptarg); + w.woptarg); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } @@ -2645,7 +2641,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; case L'?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -2672,7 +2668,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_ERROR; } - if (array && woptind+1 != argc) + if (array && w.woptind+1 != argc) { append_format(stderr_buffer, _(L"%ls: --array option requires a single variable name.\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); @@ -2683,7 +2679,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) /* Verify all variable names */ - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) { wchar_t *src; @@ -2708,7 +2704,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) /* The call to reader_readline may change woptind, so we save it away here */ - i=woptind; + i=w.woptind; /* Check if we should read interactively using \c reader_readline() @@ -2904,7 +2900,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv) */ static int builtin_status(parser_t &parser, wchar_t **argv) { - + wgetopter_t w; enum { NORMAL, @@ -2927,8 +2923,6 @@ static int builtin_status(parser_t &parser, wchar_t **argv) int argc = builtin_count_args(argv); int res=STATUS_BUILTIN_OK; - woptind=0; - const struct woption long_options[] = @@ -2991,11 +2985,11 @@ static int builtin_status(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L":cbilfnhj:t", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L":cbilfnhj:t", + long_options, + &opt_index); if (opt == -1) break; @@ -3040,17 +3034,17 @@ static int builtin_status(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; case 'j': - if (wcscmp(woptarg, L"full") == 0) + if (wcscmp(w.woptarg, L"full") == 0) job_control_mode = JOB_CONTROL_ALL; - else if (wcscmp(woptarg, L"interactive") == 0) + else if (wcscmp(w.woptarg, L"interactive") == 0) job_control_mode = JOB_CONTROL_INTERACTIVE; - else if (wcscmp(woptarg, L"none") == 0) + else if (wcscmp(w.woptarg, L"none") == 0) job_control_mode = JOB_CONTROL_NONE; else { append_format(stderr_buffer, L"%ls: Invalid job control mode '%ls'\n", - L"status", woptarg); + L"status", w.woptarg); res = 1; } mode = DONE; @@ -3062,11 +3056,11 @@ static int builtin_status(parser_t &parser, wchar_t **argv) case ':': - builtin_missing_argument(parser, argv[0], argv[woptind-1]); + builtin_missing_argument(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -3323,13 +3317,12 @@ static int builtin_count(parser_t &parser, wchar_t ** argv) */ static int builtin_contains(parser_t &parser, wchar_t ** argv) { + wgetopter_t w; int argc; argc = builtin_count_args(argv); wchar_t *needle; bool should_output_index = false; - woptind=0; - const struct woption long_options[] = { { L"help", no_argument, 0, 'h' } , @@ -3341,11 +3334,11 @@ static int builtin_contains(parser_t &parser, wchar_t ** argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"+hi", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"+hi", + long_options, + &opt_index); if (opt == -1) break; @@ -3369,11 +3362,11 @@ static int builtin_contains(parser_t &parser, wchar_t ** argv) case ':': - builtin_missing_argument(parser, argv[0], argv[woptind-1]); + builtin_missing_argument(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; case 'i': @@ -3383,19 +3376,19 @@ static int builtin_contains(parser_t &parser, wchar_t ** argv) } - needle = argv[woptind]; + needle = argv[w.woptind]; if (!needle) { append_format(stderr_buffer, _(L"%ls: Key not specified\n"), argv[0]); } - for (int i=woptind+1; i<argc; i++) + for (int i=w.woptind+1; i<argc; i++) { if (!wcscmp(needle, argv[i])) { - if (should_output_index) append_format(stdout_buffer, L"%d\n", i-woptind); + if (should_output_index) append_format(stdout_buffer, L"%d\n", i-w.woptind); return 0; } } @@ -3908,14 +3901,15 @@ static int builtin_history(parser_t &parser, wchar_t **argv) int opt = 0; int opt_index = 0; - woptind = 0; + + wgetopter_t w; history_t *history = reader_get_history(); /* Use the default history if we have none (which happens if invoked non-interactively, e.g. from webconfig.py */ if (! history) history = &history_t::history_with_name(L"fish"); - while ((opt = wgetopt_long_only(argc, argv, L"pdscvl", long_options, &opt_index)) != EOF) + while ((opt = w.wgetopt_long_only(argc, argv, L"pdscvl", long_options, &opt_index)) != EOF) { switch (opt) { @@ -3944,17 +3938,17 @@ static int builtin_history(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; break; case '?': - append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[woptind-1]); + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; break; default: - append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[woptind-1]); + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } } /* Everything after is an argument */ - const wcstring_list_t args(argv + woptind, argv + argc); + const wcstring_list_t args(argv + w.woptind, argv + argc); if (argc == 1) { @@ -4157,8 +4151,6 @@ static const builtin_data_t *builtin_lookup(const wcstring &name) void builtin_init() { - - wopterr = 0; for (size_t i=0; i < BUILTIN_COUNT; i++) { intern_static(builtin_datas[i].name); diff --git a/src/builtin_commandline.cpp b/src/builtin_commandline.cpp index 01bc123a..23aaaa52 100644 --- a/src/builtin_commandline.cpp +++ b/src/builtin_commandline.cpp @@ -247,7 +247,7 @@ static void write_part(const wchar_t *begin, */ static int builtin_commandline(parser_t &parser, wchar_t **argv) { - + wgetopter_t w; int buffer_part=0; int cut_at_cursor=0; @@ -298,7 +298,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) return 1; } - woptind=0; + w.woptind=0; while (1) { @@ -327,11 +327,11 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"abijpctwforhI:CLSsP", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"abijpctwforhI:CLSsP", + long_options, + &opt_index); if (opt == -1) break; @@ -390,8 +390,8 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) break; case 'I': - current_buffer = woptarg; - current_cursor_pos = wcslen(woptarg); + current_buffer = w.woptarg; + current_cursor_pos = wcslen(w.woptarg); break; case 'C': @@ -419,7 +419,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) return 0; case L'?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return 1; } } @@ -442,7 +442,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) } - if (argc == woptind) + if (argc == w.woptind) { append_format(stderr_buffer, BUILTIN_ERR_MISSING, @@ -451,7 +451,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) builtin_print_help(parser, argv[0], stderr_buffer); return 1; } - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) { wchar_t c = input_function_get_code(argv[i]); if (c != (wchar_t)(-1)) @@ -491,7 +491,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) /* Check for invalid switch combinations */ - if ((search_mode || line_mode || cursor_mode || paging_mode) && (argc-woptind > 1)) + if ((search_mode || line_mode || cursor_mode || paging_mode) && (argc-w.woptind > 1)) { append_format(stderr_buffer, @@ -513,7 +513,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) } - if ((tokenize || cut_at_cursor) && (argc-woptind)) + if ((tokenize || cut_at_cursor) && (argc-w.woptind)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, @@ -525,7 +525,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) return 1; } - if (append_mode && !(argc-woptind)) + if (append_mode && !(argc-w.woptind)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, @@ -551,19 +551,19 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) if (cursor_mode) { - if (argc-woptind) + if (argc-w.woptind) { wchar_t *endptr; long new_pos; errno = 0; - new_pos = wcstol(argv[woptind], &endptr, 10); + new_pos = wcstol(argv[w.woptind], &endptr, 10); if (*endptr || errno) { append_format(stderr_buffer, BUILTIN_ERR_NOT_NUMBER, argv[0], - argv[woptind]); + argv[w.woptind]); builtin_print_help(parser, argv[0], stderr_buffer); } @@ -639,7 +639,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) } - switch (argc-woptind) + switch (argc-w.woptind) { case 0: { @@ -649,16 +649,16 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) case 1: { - replace_part(begin, end, argv[woptind], append_mode); + replace_part(begin, end, argv[w.woptind], append_mode); break; } default: { - wcstring sb = argv[woptind]; + wcstring sb = argv[w.woptind]; int i; - for (i=woptind+1; i<argc; i++) + for (i=w.woptind+1; i<argc; i++) { sb.push_back(L'\n'); sb.append(argv[i]); diff --git a/src/builtin_complete.cpp b/src/builtin_complete.cpp index b11ad7bf..6c4ccbcb 100644 --- a/src/builtin_complete.cpp +++ b/src/builtin_complete.cpp @@ -287,6 +287,7 @@ static void builtin_complete_remove(const wcstring_list_t &cmd, static int builtin_complete(parser_t &parser, wchar_t **argv) { ASSERT_IS_MAIN_THREAD(); + wgetopter_t w; bool res=false; int argc=0; int result_mode=SHARED; @@ -308,7 +309,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) argc = builtin_count_args(argv); - woptind=0; + w.woptind=0; while (! res) { @@ -337,11 +338,11 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"a:c:p:s:l:o:d:frxeuAn:C::w:h", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"a:c:p:s:l:o:d:frxeuAn:C::w:h", + long_options, + &opt_index); if (opt == -1) break; @@ -376,7 +377,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) case 'c': { wcstring tmp; - if (unescape_string(woptarg, &tmp, UNESCAPE_SPECIAL)) + if (unescape_string(w.woptarg, &tmp, UNESCAPE_SPECIAL)) { if (opt=='p') path.push_back(tmp); @@ -385,14 +386,14 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) } else { - append_format(stderr_buffer, L"%ls: Invalid token '%ls'\n", argv[0], woptarg); + append_format(stderr_buffer, L"%ls: Invalid token '%ls'\n", argv[0], w.woptarg); res = true; } break; } case 'd': - desc = woptarg; + desc = w.woptarg; break; case 'u': @@ -404,19 +405,19 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) break; case 's': - short_opt.append(woptarg); + short_opt.append(w.woptarg); break; case 'l': - gnu_opt.push_back(woptarg); + gnu_opt.push_back(w.woptarg); break; case 'o': - old_opt.push_back(woptarg); + old_opt.push_back(w.woptarg); break; case 'a': - comp = woptarg; + comp = w.woptarg; break; case 'e': @@ -424,16 +425,16 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) break; case 'n': - condition = woptarg; + condition = w.woptarg; break; case 'w': - wrap_targets.push_back(woptarg); + wrap_targets.push_back(w.woptarg); break; case 'C': do_complete = true; - do_complete_param = woptarg ? woptarg : reader_get_buffer(); + do_complete_param = w.woptarg ? w.woptarg : reader_get_buffer(); break; case 'h': @@ -441,7 +442,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) return 0; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); res = true; break; @@ -545,7 +546,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv) recursion_level--; } } - else if (woptind != argc) + else if (w.woptind != argc) { append_format(stderr_buffer, _(L"%ls: Too many arguments\n"), diff --git a/src/builtin_jobs.cpp b/src/builtin_jobs.cpp index 02bf94f2..32079287 100644 --- a/src/builtin_jobs.cpp +++ b/src/builtin_jobs.cpp @@ -160,13 +160,14 @@ static void builtin_jobs_print(const job_t *j, int mode, int header) */ static int builtin_jobs(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=0; int found=0; int mode=JOBS_DEFAULT; int print_last = 0; argc = builtin_count_args(argv); - woptind=0; + w.woptind=0; while (1) { @@ -201,11 +202,11 @@ static int builtin_jobs(parser_t &parser, wchar_t **argv) int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"pclgh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"pclgh", + long_options, + &opt_index); if (opt == -1) break; @@ -248,7 +249,7 @@ static int builtin_jobs(parser_t &parser, wchar_t **argv) return 0; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return 1; } @@ -283,13 +284,13 @@ static int builtin_jobs(parser_t &parser, wchar_t **argv) } else { - if (woptind < argc) + if (w.woptind < argc) { int i; found = 1; - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) { int pid; wchar_t *end; diff --git a/src/builtin_set.cpp b/src/builtin_set.cpp index b1b6b0ea..c7bde4fb 100644 --- a/src/builtin_set.cpp +++ b/src/builtin_set.cpp @@ -396,6 +396,7 @@ static void print_variables(int include_values, int esc, bool shorten_ok, int sc */ static int builtin_set(parser_t &parser, wchar_t **argv) { + wgetopter_t w; /** Variables used for parsing the argument list */ const struct woption long_options[] = { @@ -439,10 +440,10 @@ static int builtin_set(parser_t &parser, wchar_t **argv) /* Parse options to obtain the requested operation and the modifiers */ - woptind = 0; + w.woptind = 0; while (1) { - int c = wgetopt_long(argc, argv, short_options, long_options, 0); + int c = w.wgetopt_long(argc, argv, short_options, long_options, 0); if (c == -1) { @@ -498,7 +499,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) return 0; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return 1; default: @@ -573,7 +574,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) out of the specified variables. */ int i; - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) { wchar_t *arg = argv[i]; int slice=0; @@ -635,7 +636,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) return 0; } - if (woptind == argc) + if (w.woptind == argc) { /* Print values of variables @@ -658,7 +659,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) return retcode; } - if (!(dest = wcsdup(argv[woptind]))) + if (!(dest = wcsdup(argv[w.woptind]))) { DIE_MEM(); } @@ -711,9 +712,9 @@ static int builtin_set(parser_t &parser, wchar_t **argv) if (!retcode) { - for (; woptind<argc; woptind++) + for (; w.woptind<argc; w.woptind++) { - if (!parse_index(indexes, argv[woptind], dest, result.size())) + if (!parse_index(indexes, argv[w.woptind], dest, result.size())) { builtin_print_help(parser, argv[0], stderr_buffer); retcode = 1; @@ -721,7 +722,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) } size_t idx_count = indexes.size(); - size_t val_count = argc-woptind-1; + size_t val_count = argc-w.woptind-1; if (!erase) { @@ -734,7 +735,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) } if (val_count == idx_count) { - woptind++; + w.woptind++; break; } } @@ -756,9 +757,9 @@ static int builtin_set(parser_t &parser, wchar_t **argv) { wcstring_list_t value; - while (woptind < argc) + while (w.woptind < argc) { - value.push_back(argv[woptind++]); + value.push_back(argv[w.woptind++]); } if (update_values(result, @@ -778,14 +779,14 @@ static int builtin_set(parser_t &parser, wchar_t **argv) } else { - woptind++; + w.woptind++; /* No slicing */ if (erase) { - if (woptind != argc) + if (w.woptind != argc) { append_format(stderr_buffer, _(L"%ls: Values cannot be specfied with erase\n"), @@ -801,7 +802,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv) else { wcstring_list_t val; - for (i=woptind; i<argc; i++) + for (i=w.woptind; i<argc; i++) val.push_back(argv[i]); retcode = my_env_set(dest, val, scope); } diff --git a/src/builtin_set_color.cpp b/src/builtin_set_color.cpp index 36ad7080..7f400543 100644 --- a/src/builtin_set_color.cpp +++ b/src/builtin_set_color.cpp @@ -67,6 +67,7 @@ static int set_color_builtin_outputter(char c) */ static int builtin_set_color(parser_t &parser, wchar_t **argv) { + wgetopter_t w; /** Variables used for parsing the argument list */ const struct woption long_options[] = { @@ -94,10 +95,10 @@ static int builtin_set_color(parser_t &parser, wchar_t **argv) int errret; /* Parse options to obtain the requested operation and the modifiers */ - woptind = 0; + w.woptind = 0; while (1) { - int c = wgetopt_long(argc, argv, short_options, long_options, 0); + int c = w.wgetopt_long(argc, argv, short_options, long_options, 0); if (c == -1) { @@ -110,7 +111,7 @@ static int builtin_set_color(parser_t &parser, wchar_t **argv) break; case 'b': - bgcolor = woptarg; + bgcolor = w.woptarg; break; case 'h': @@ -136,12 +137,12 @@ static int builtin_set_color(parser_t &parser, wchar_t **argv) /* Remaining arguments are foreground color */ std::vector<rgb_color_t> fgcolors; - for (; woptind < argc; woptind++) + for (; w.woptind < argc; w.woptind++) { - rgb_color_t fg = rgb_color_t(argv[woptind]); + rgb_color_t fg = rgb_color_t(argv[w.woptind]); if (fg.is_none() || fg.is_ignore()) { - append_format(stderr_buffer, _(L"%ls: Unknown color '%ls'\n"), argv[0], argv[woptind]); + append_format(stderr_buffer, _(L"%ls: Unknown color '%ls'\n"), argv[0], argv[w.woptind]); return STATUS_BUILTIN_ERROR; } fgcolors.push_back(fg); diff --git a/src/builtin_ulimit.cpp b/src/builtin_ulimit.cpp index 23524543..64b126b7 100644 --- a/src/builtin_ulimit.cpp +++ b/src/builtin_ulimit.cpp @@ -254,6 +254,7 @@ static int set(int resource, int hard, int soft, rlim_t value) */ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) { + wgetopter_t w; int hard=0; int soft=0; @@ -262,7 +263,7 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) int argc = builtin_count_args(argv); - woptind=0; + w.woptind=0; while (1) { @@ -334,11 +335,11 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"aHScdflmnstuvh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"aHScdflmnstuvh", + long_options, + &opt_index); if (opt == -1) break; @@ -419,14 +420,14 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) return 0; case L'?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return 1; } } if (report_all) { - if (argc - woptind == 0) + if (argc - w.woptind == 0) { print_all(hard); } @@ -441,7 +442,7 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) return 0; } - switch (argc - woptind) + switch (argc - w.woptind) { case 0: { @@ -468,28 +469,28 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) hard=soft=1; } - if (wcscasecmp(argv[woptind], L"unlimited")==0) + if (wcscasecmp(argv[w.woptind], L"unlimited")==0) { new_limit = RLIM_INFINITY; } - else if (wcscasecmp(argv[woptind], L"hard")==0) + else if (wcscasecmp(argv[w.woptind], L"hard")==0) { new_limit = get(what, 1); } - else if (wcscasecmp(argv[woptind], L"soft")==0) + else if (wcscasecmp(argv[w.woptind], L"soft")==0) { new_limit = get(what, soft); } else { errno=0; - new_limit = wcstol(argv[woptind], &end, 10); + new_limit = wcstol(argv[w.woptind], &end, 10); if (errno || *end) { append_format(stderr_buffer, L"%ls: Invalid limit '%ls'\n", argv[0], - argv[woptind]); + argv[w.woptind]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } diff --git a/src/wgetopt.cpp b/src/wgetopt.cpp index 2d2117f6..b63fe74f 100644 --- a/src/wgetopt.cpp +++ b/src/wgetopt.cpp @@ -84,9 +84,6 @@ when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ @@ -95,87 +92,6 @@ #include "fallback.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -wchar_t *woptarg = NULL; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `woptind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int woptind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static wchar_t *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int wopterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int woptopt = '?'; - -/* Describe how to deal with options that follow non-option ARGV-elements. - -If the caller did not specify anything, -the default is REQUIRE_ORDER if the environment variable -POSIXLY_CORRECT is defined, PERMUTE otherwise. - -REQUIRE_ORDER means don't recognize them as options; -stop option processing when the first non-option is seen. -This is what Unix does. -This mode of operation is selected by either setting the environment -variable POSIXLY_CORRECT, or using `+' as the first character -of the list of option characters. - -PERMUTE is the default. We permute the contents of ARGV as we scan, -so that eventually all the non-options are at the end. This allows options -to be given in any order, even with programs that were not written to -expect this. - -RETURN_IN_ORDER is an option available to programs that were written -to expect options and other ARGV-elements in any order and that care about -the ordering of the two. We describe each non-option ARGV-element -as if it were the argument of an option with character code 1. -Using `-' as the first character of the list of option characters -selects this mode of operation. - -The special argument `--' forces an end of option-scanning regardless -of the value of `ordering'. In the case of RETURN_IN_ORDER, only -`--' can cause `getopt' to return EOF with `woptind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -/* Value of POSIXLY_CORRECT environment variable. */ -static char *posixly_correct; - /** Use translation functions if available */ @@ -233,14 +149,6 @@ extern int wcslen(const wchar_t *); #endif /* not __GNU_LIBRARY__ */ -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) @@ -251,8 +159,7 @@ static int last_nonopt; `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ -static void -exchange(wchar_t **argv) +void wgetopter_t::exchange(wchar_t **argv) { int bottom = first_nonopt; int middle = last_nonopt; @@ -308,8 +215,7 @@ exchange(wchar_t **argv) /* Initialize the internal data when the first call is made. */ -static const wchar_t * -_wgetopt_initialize(const wchar_t *optstring) +const wchar_t * wgetopter_t::_wgetopt_initialize(const wchar_t *optstring) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped @@ -319,8 +225,6 @@ _wgetopt_initialize(const wchar_t *optstring) nextchar = NULL; - posixly_correct = getenv("POSIXLY_CORRECT"); - /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') @@ -333,8 +237,6 @@ _wgetopt_initialize(const wchar_t *optstring) ordering = REQUIRE_ORDER; ++optstring; } - else if (posixly_correct != NULL) - ordering = REQUIRE_ORDER; else ordering = PERMUTE; @@ -368,7 +270,7 @@ _wgetopt_initialize(const wchar_t *optstring) so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, - it is returned in `woptarg', otherwise `woptarg' is set to zero. + it is returned in `w.woptarg', otherwise `w.woptarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. @@ -397,8 +299,7 @@ _wgetopt_initialize(const wchar_t *optstring) If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ -int -_wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only) +int wgetopter_t::_wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only) { woptarg = NULL; @@ -631,11 +532,7 @@ _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, cons { if (wopterr) { - if (posixly_correct) - /* 1003.2 specifies the format of this message. */ - fwprintf(stderr, _(L"%ls: Illegal option -- %lc\n"), argv[0], c); - else - fwprintf(stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c); + fwprintf(stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c); } woptopt = c; @@ -693,8 +590,7 @@ _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, cons } } -int -wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) +int wgetopter_t::wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) { return _wgetopt_internal(argc, argv, optstring, (const struct woption *) 0, @@ -702,14 +598,12 @@ wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) 0); } -int -wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) +int wgetopter_t::wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) { return _wgetopt_internal(argc, argv, options, long_options, opt_index, 0); } -int -wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) +int wgetopter_t::wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) { return _wgetopt_internal(argc, argv, options, long_options, opt_index, 1); } diff --git a/src/wgetopt.h b/src/wgetopt.h index 5a03ba33..91d50489 100644 --- a/src/wgetopt.h +++ b/src/wgetopt.h @@ -49,162 +49,170 @@ Cambridge, MA 02139, USA. */ #include <wchar.h> -#ifdef __cplusplus -extern "C" { -#endif - - /** For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - - extern wchar_t *woptarg; - - /** Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `woptind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - - extern int woptind; - - /** Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - - extern int wopterr; - - /** Set to an option character which was unrecognized. */ - - extern int woptopt; - - /** Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - - struct woption +class wgetopter_t +{ +private: + void exchange(wchar_t **argv); + const wchar_t * _wgetopt_initialize(const wchar_t *optstring); + int _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only); + +public: + /* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + + wchar_t *woptarg; + + /* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `woptind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + + /* XXX 1003.2 says this must be 1 before any call. */ + int woptind; + + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + + wchar_t *nextchar; + + /* Callers store zero here to inhibit the error message + for unrecognized options. */ + + int wopterr; + + /* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + + int woptopt; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is PERMUTE. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by using `+' as the first + character of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return EOF with `woptind' != ARGC. */ + + enum { - /** - long name for switch - */ -#if defined (__STDC__) && __STDC__ - const wchar_t *name; -#else - wchar_t *name; -#endif - /** - Must be one of no_argument, required_argument and - optional_argument. - - has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. - */ - int has_arg; - - /** - If non-null, the flag whose value should be set if this switch is encountered - */ - int *flag; - - /** - If \c flag is non-null, this is the value that flag will be set - to. Otherwise, this is the return-value of the function call. - */ - int val; - }; - - /* Names for the values of the `has_arg' field of `struct option'. */ - + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } ordering; + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + + int first_nonopt; + int last_nonopt; + + + wgetopter_t() : woptarg(NULL), woptind(0), nextchar(0), wopterr(0), woptopt('?'), first_nonopt(0), last_nonopt(0) + { + } + + int wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring); + int wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index); + int wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index); +}; + +/** Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct woption +{ /** - Specifies that a switch does not accept an argument + long name for switch */ -#define no_argument 0 + const wchar_t *name; /** - Specifies that a switch requires an argument - */ -#define required_argument 1 - /** - Specifies that a switch accepts an optional argument - */ -#define optional_argument 2 + Must be one of no_argument, required_argument and + optional_argument. -#if defined (__STDC__) && __STDC__ -#ifdef __GNU_LIBRARY__ - /** - Get options from argument list. See the glibc manual for information on how to use this function. + has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ - extern int wgetopt(int argc, wchar_t *const *argv, const wchar_t *shortopts); -#else /* not __GNU_LIBRARY__ */ - - extern int wgetopt(); -#endif /* __GNU_LIBRARY__ */ - /** - Get options from argument list. See the glibc manual for information on how to use this function. - */ - extern int wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *shortopts, - const struct woption *longopts, int *longind); - /** - Get options from argument list. See the glibc manual for information on how to use this function. - */ - extern int wgetopt_long_only(int argc, wchar_t *const *argv, - const wchar_t *shortopts, - const struct woption *longopts, int *longind); + int has_arg; /** - Internal only. Users should not call this directly. + If non-null, the flag whose value should be set if this switch is encountered */ - extern int _wgetopt_internal(int argc, wchar_t *const *argv, - const wchar_t *shortopts, - const struct woption *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ - - /** - Get options from argument list. See the glibc manual for information on how to use this function. - */ - extern int wgetopt(); - - /** - Get options from argument list. See the glibc manual for information on how to use this function. - */ - extern int wgetopt_long(); - - /** - Get options from argument list. See the glibc manual for information on how to use this function. - */ - extern int wgetopt_long_only(); + int *flag; /** - Internal only. Users should not call this directly. + If \c flag is non-null, this is the value that flag will be set + to. Otherwise, this is the return-value of the function call. */ - extern int _wgetopt_internal(); -#endif /* __STDC__ */ + int val; +}; -#ifdef __cplusplus -} -#endif +/* Names for the values of the `has_arg' field of `struct option'. */ + +/** + Specifies that a switch does not accept an argument +*/ +#define no_argument 0 +/** + Specifies that a switch requires an argument +*/ +#define required_argument 1 +/** + Specifies that a switch accepts an optional argument +*/ +#define optional_argument 2 #endif /* FISH_WGETOPT_H */ |