Eliminate wgetopt global variables

Replace them with a new struct wgetopter_t that uses
instance variables instead.
This commit is contained in:
ridiculousfish 2015-07-25 18:16:00 -07:00
parent caab298f72
commit f4d1657c22
9 changed files with 405 additions and 506 deletions

View file

@ -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) static int builtin_bind(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
enum enum
{ {
BIND_INSERT, BIND_INSERT,
@ -657,7 +657,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
int use_terminfo = 0; int use_terminfo = 0;
woptind=0; w.woptind=0;
static const struct woption long_options[] = static const struct woption long_options[] =
{ {
@ -675,11 +675,11 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
while (1) while (1)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"aehkKfM:m:", L"aehkKfM:m:",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -722,17 +722,17 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
break; break;
case 'M': case 'M':
bind_mode = woptarg; bind_mode = w.woptarg;
bind_mode_given = true; bind_mode_given = true;
break; break;
case 'm': case 'm':
sets_bind_mode = woptarg; sets_bind_mode = w.woptarg;
sets_bind_mode_given = true; sets_bind_mode_given = true;
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
@ -752,7 +752,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
case BIND_ERASE: 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; res = STATUS_BUILTIN_ERROR;
} }
@ -761,7 +761,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
case BIND_INSERT: case BIND_INSERT:
{ {
switch (argc-woptind) switch (argc-w.woptind)
{ {
case 0: case 0:
{ {
@ -774,7 +774,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
wcstring seq; wcstring seq;
if (use_terminfo) if (use_terminfo)
{ {
if (!get_terminfo_sequence(argv[woptind], &seq)) if (!get_terminfo_sequence(argv[w.woptind], &seq))
{ {
res = STATUS_BUILTIN_ERROR; res = STATUS_BUILTIN_ERROR;
// get_terminfo_sequence already printed the error // get_terminfo_sequence already printed the error
@ -783,12 +783,12 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
} }
else else
{ {
seq = argv[woptind]; seq = argv[w.woptind];
} }
if (!builtin_bind_list_one(seq, bind_mode)) if (!builtin_bind_list_one(seq, bind_mode))
{ {
res = STATUS_BUILTIN_ERROR; res = STATUS_BUILTIN_ERROR;
wcstring eseq = escape_string(argv[woptind], 0); wcstring eseq = escape_string(argv[w.woptind], 0);
if (use_terminfo) if (use_terminfo)
{ {
append_format(stderr_buffer, _(L"%ls: No binding found for key '%ls'\n"), argv[0], eseq.c_str()); 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: 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; 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) static int builtin_block(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
enum enum
{ {
UNSET, UNSET,
@ -857,7 +858,7 @@ static int builtin_block(parser_t &parser, wchar_t **argv)
int erase = 0; int erase = 0;
int argc=builtin_count_args(argv); int argc=builtin_count_args(argv);
woptind=0; w.woptind=0;
static const struct woption static const struct woption
long_options[] = long_options[] =
@ -888,11 +889,11 @@ static int builtin_block(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"elgh", L"elgh",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -925,7 +926,7 @@ static int builtin_block(parser_t &parser, wchar_t **argv)
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; 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 argc=builtin_count_args(argv);
int list=0; int list=0;
wgetopter_t w;
woptind=0;
static const struct woption static const struct woption
long_options[] = long_options[] =
@ -1027,11 +1027,11 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"nh", L"nh",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -1057,7 +1057,7 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv)
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; 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) static int builtin_emit(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
int argc=builtin_count_args(argv); int argc=builtin_count_args(argv);
woptind=0;
static const struct woption static const struct woption
long_options[] = long_options[] =
{ {
@ -1106,11 +1105,11 @@ static int builtin_emit(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"h", L"h",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -1131,20 +1130,20 @@ static int builtin_emit(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
} }
if (!argv[woptind]) if (!argv[w.woptind])
{ {
append_format(stderr_buffer, L"%ls: expected event name\n", argv[0]); append_format(stderr_buffer, L"%ls: expected event name\n", argv[0]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
const wchar_t *eventname = argv[woptind]; const wchar_t *eventname = argv[w.woptind];
wcstring_list_t args(argv + woptind + 1, argv + argc); wcstring_list_t args(argv + w.woptind + 1, argv + argc);
event_fire_generic(eventname, &args); event_fire_generic(eventname, &args);
return STATUS_BUILTIN_OK; 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) static int builtin_command(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
int argc=builtin_count_args(argv); int argc=builtin_count_args(argv);
int print_path=0; int print_path=0;
woptind=0; w.woptind=0;
static const struct woption static const struct woption
long_options[] = long_options[] =
@ -1174,11 +1174,11 @@ static int builtin_command(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"svh", L"svh",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -1204,7 +1204,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv)
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
@ -1219,7 +1219,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv)
int found=0; 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]; const wchar_t *command_name = argv[idx];
wcstring path; 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) static int builtin_generic(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
int argc=builtin_count_args(argv); 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 */ /* 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; return STATUS_BUILTIN_ERROR;
} }
woptind=0;
static const struct woption static const struct woption
long_options[] = long_options[] =
{ {
@ -1261,11 +1260,11 @@ static int builtin_generic(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"h", L"h",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -1286,7 +1285,7 @@ static int builtin_generic(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; 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) static int builtin_functions(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
int i; int i;
int erase=0; int erase=0;
wchar_t *desc=0; wchar_t *desc=0;
@ -1446,8 +1446,6 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
int query = 0; int query = 0;
int copy = 0; int copy = 0;
woptind=0;
static const struct woption static const struct woption
long_options[] = long_options[] =
{ {
@ -1489,11 +1487,11 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"ed:nahqc", L"ed:nahqc",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -1516,7 +1514,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
break; break;
case 'd': case 'd':
desc=woptarg; desc=w.woptarg;
break; break;
case 'n': case 'n':
@ -1540,7 +1538,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
@ -1564,7 +1562,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
if (erase) if (erase)
{ {
int i; int i;
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
function_remove(argv[i]); function_remove(argv[i]);
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
} }
@ -1572,7 +1570,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
{ {
wchar_t *func; wchar_t *func;
if (argc-woptind != 1) if (argc-w.woptind != 1)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Expected exactly one function name\n"), _(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; return STATUS_BUILTIN_ERROR;
} }
func = argv[woptind]; func = argv[w.woptind];
if (!function_exists(func)) if (!function_exists(func))
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
@ -1598,7 +1596,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
} }
else if (list || (argc==woptind)) else if (list || (argc==w.woptind))
{ {
int is_screen = !builtin_out_redirect && isatty(1); int is_screen = !builtin_out_redirect && isatty(1);
size_t i; size_t i;
@ -1632,7 +1630,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
wcstring current_func; wcstring current_func;
wcstring new_func; wcstring new_func;
if (argc-woptind != 2) if (argc-w.woptind != 2)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Expected exactly two names (current function name, and new function name)\n"), _(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; return STATUS_BUILTIN_ERROR;
} }
current_func = argv[woptind]; current_func = argv[w.woptind];
new_func = argv[woptind+1]; new_func = argv[w.woptind+1];
if (!function_exists(current_func)) if (!function_exists(current_func))
{ {
@ -1683,7 +1681,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
{ {
if (!function_exists(argv[i])) if (!function_exists(argv[i]))
res++; res++;
@ -1691,7 +1689,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv)
{ {
if (!query) if (!query)
{ {
if (i != woptind) if (i != w.woptind)
stdout_buffer.append(L"\n"); stdout_buffer.append(L"\n");
functions_def(argv[i], stdout_buffer); 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. */ /** 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) 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); assert(out_err != NULL);
/* wgetopt expects 'function' as the first argument. Make a new wcstring_list with that property. */ /* 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; bool shadows = true;
woptind=0;
wcstring_list_t wrap_targets; wcstring_list_t wrap_targets;
/* If -a/--argument-names is specified before the function name, /* 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; int opt_index = 0;
// The leading - here specifies RETURN_IN_ORDER // The leading - here specifies RETURN_IN_ORDER
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"-d:s:j:p:v:e:haSV:", L"-d:s:j:p:v:e:haSV:",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -2066,19 +2063,19 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr
break; break;
case 'd': case 'd':
desc=woptarg; desc=w.woptarg;
break; break;
case 's': case 's':
{ {
int sig = wcs2sig(woptarg); int sig = wcs2sig(w.woptarg);
if (sig < 0) if (sig < 0)
{ {
append_format(*out_err, append_format(*out_err,
_(L"%ls: Unknown signal '%ls'\n"), _(L"%ls: Unknown signal '%ls'\n"),
argv[0], argv[0],
woptarg); w.woptarg);
res=1; res=1;
break; break;
} }
@ -2088,24 +2085,24 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr
case 'v': case 'v':
{ {
if (wcsvarname(woptarg)) if (wcsvarname(w.woptarg))
{ {
append_format(*out_err, append_format(*out_err,
_(L"%ls: Invalid variable name '%ls'\n"), _(L"%ls: Invalid variable name '%ls'\n"),
argv[0], argv[0],
woptarg); w.woptarg);
res=STATUS_BUILTIN_ERROR; res=STATUS_BUILTIN_ERROR;
break; break;
} }
events.push_back(event_t::variable_event(woptarg)); events.push_back(event_t::variable_event(w.woptarg));
break; break;
} }
case 'e': case 'e':
{ {
events.push_back(event_t::generic_event(woptarg)); events.push_back(event_t::generic_event(w.woptarg));
break; break;
} }
@ -2117,7 +2114,7 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr
event_t e(EVENT_ANY); event_t e(EVENT_ANY);
if ((opt == 'j') && if ((opt == 'j') &&
(wcscasecmp(woptarg, L"caller") == 0)) (wcscasecmp(w.woptarg, L"caller") == 0))
{ {
int job_id = -1; int job_id = -1;
@ -2158,13 +2155,13 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr
else else
{ {
errno = 0; errno = 0;
pid = fish_wcstoi(woptarg, &end, 10); pid = fish_wcstoi(w.woptarg, &end, 10);
if (errno || !end || *end) if (errno || !end || *end)
{ {
append_format(*out_err, append_format(*out_err,
_(L"%ls: Invalid process id %ls\n"), _(L"%ls: Invalid process id %ls\n"),
argv[0], argv[0],
woptarg); w.woptarg);
res=1; res=1;
break; break;
} }
@ -2195,19 +2192,19 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr
break; break;
case 'w': case 'w':
wrap_targets.push_back(woptarg); wrap_targets.push_back(w.woptarg);
break; break;
case 'V': 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; res = STATUS_BUILTIN_ERROR;
break; break;
} }
inherit_vars.push_back(woptarg); inherit_vars.push_back(w.woptarg);
break; break;
} }
@ -2216,12 +2213,12 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
case 1: case 1:
assert(woptarg != NULL); assert(w.woptarg != NULL);
positionals.push_back(woptarg); positionals.push_back(w.woptarg);
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
res = 1; res = 1;
break; break;
@ -2350,7 +2347,7 @@ static int builtin_random(parser_t &parser, wchar_t **argv)
int argc = builtin_count_args(argv); int argc = builtin_count_args(argv);
woptind=0; wgetopter_t w;
static const struct woption static const struct woption
long_options[] = long_options[] =
@ -2369,11 +2366,11 @@ static int builtin_random(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"h", L"h",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -2395,14 +2392,14 @@ static int builtin_random(parser_t &parser, wchar_t **argv)
break; break;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
} }
switch (argc-woptind) switch (argc-w.woptind)
{ {
case 0: case 0:
@ -2426,13 +2423,13 @@ static int builtin_random(parser_t &parser, wchar_t **argv)
wchar_t *end=0; wchar_t *end=0;
errno=0; errno=0;
foo = wcstol(argv[woptind], &end, 10); foo = wcstol(argv[w.woptind], &end, 10);
if (errno || *end) if (errno || *end)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Seed value '%ls' is not a valid number\n"), _(L"%ls: Seed value '%ls' is not a valid number\n"),
argv[0], argv[0],
argv[woptind]); argv[w.woptind]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
@ -2446,7 +2443,7 @@ static int builtin_random(parser_t &parser, wchar_t **argv)
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Expected zero or one argument, got %d\n"), _(L"%ls: Expected zero or one argument, got %d\n"),
argv[0], argv[0],
argc-woptind); argc-w.woptind);
builtin_print_help(parser, argv[0], stderr_buffer); builtin_print_help(parser, argv[0], stderr_buffer);
return STATUS_BUILTIN_ERROR; 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) static int builtin_read(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
wcstring buff; wcstring buff;
int i, argc = builtin_count_args(argv); int i, argc = builtin_count_args(argv);
int place = ENV_USER; int place = ENV_USER;
@ -2474,8 +2472,6 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
int array = 0; int array = 0;
bool split_null = false; bool split_null = false;
woptind=0;
while (1) while (1)
{ {
static const struct woption static const struct woption
@ -2545,11 +2541,11 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"xglUup:R:c:hm:n:saz", L"xglUup:R:c:hm:n:saz",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -2587,24 +2583,24 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
break; break;
case L'p': case L'p':
prompt = woptarg; prompt = w.woptarg;
break; break;
case L'R': case L'R':
right_prompt = woptarg; right_prompt = w.woptarg;
break; break;
case L'c': case L'c':
commandline = woptarg; commandline = w.woptarg;
break; break;
case L'm': case L'm':
mode_name = woptarg; mode_name = w.woptarg;
break; break;
case L'n': case L'n':
errno = 0; errno = 0;
nchars = fish_wcstoi(woptarg, &end, 10); nchars = fish_wcstoi(w.woptarg, &end, 10);
if (errno || *end != 0) if (errno || *end != 0)
{ {
switch (errno) switch (errno)
@ -2613,7 +2609,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Argument '%ls' is out of range\n"), _(L"%ls: Argument '%ls' is out of range\n"),
argv[0], argv[0],
woptarg); w.woptarg);
builtin_print_help(parser, argv[0], stderr_buffer); builtin_print_help(parser, argv[0], stderr_buffer);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
@ -2621,7 +2617,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Argument '%ls' must be an integer\n"), _(L"%ls: Argument '%ls' must be an integer\n"),
argv[0], argv[0],
woptarg); w.woptarg);
builtin_print_help(parser, argv[0], stderr_buffer); builtin_print_help(parser, argv[0], stderr_buffer);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
} }
@ -2645,7 +2641,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
case L'?': 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; return STATUS_BUILTIN_ERROR;
} }
@ -2672,7 +2668,7 @@ static int builtin_read(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_ERROR; 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]); append_format(stderr_buffer, _(L"%ls: --array option requires a single variable name.\n"), argv[0]);
builtin_print_help(parser, argv[0], stderr_buffer); 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 Verify all variable names
*/ */
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
{ {
wchar_t *src; 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 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() 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) static int builtin_status(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
enum enum
{ {
NORMAL, NORMAL,
@ -2927,8 +2923,6 @@ static int builtin_status(parser_t &parser, wchar_t **argv)
int argc = builtin_count_args(argv); int argc = builtin_count_args(argv);
int res=STATUS_BUILTIN_OK; int res=STATUS_BUILTIN_OK;
woptind=0;
const struct woption const struct woption
long_options[] = long_options[] =
@ -2991,11 +2985,11 @@ static int builtin_status(parser_t &parser, wchar_t **argv)
{ {
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L":cbilfnhj:t", L":cbilfnhj:t",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -3040,17 +3034,17 @@ static int builtin_status(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
case 'j': case 'j':
if (wcscmp(woptarg, L"full") == 0) if (wcscmp(w.woptarg, L"full") == 0)
job_control_mode = JOB_CONTROL_ALL; 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; 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; job_control_mode = JOB_CONTROL_NONE;
else else
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
L"%ls: Invalid job control mode '%ls'\n", L"%ls: Invalid job control mode '%ls'\n",
L"status", woptarg); L"status", w.woptarg);
res = 1; res = 1;
} }
mode = DONE; mode = DONE;
@ -3062,11 +3056,11 @@ static int builtin_status(parser_t &parser, wchar_t **argv)
case ':': case ':':
builtin_missing_argument(parser, argv[0], argv[woptind-1]); builtin_missing_argument(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; 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) static int builtin_contains(parser_t &parser, wchar_t ** argv)
{ {
wgetopter_t w;
int argc; int argc;
argc = builtin_count_args(argv); argc = builtin_count_args(argv);
wchar_t *needle; wchar_t *needle;
bool should_output_index = false; bool should_output_index = false;
woptind=0;
const struct woption long_options[] = const struct woption long_options[] =
{ {
{ L"help", no_argument, 0, 'h' } , { 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_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"+hi", L"+hi",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -3369,11 +3362,11 @@ static int builtin_contains(parser_t &parser, wchar_t ** argv)
case ':': case ':':
builtin_missing_argument(parser, argv[0], argv[woptind-1]); builtin_missing_argument(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return STATUS_BUILTIN_ERROR; return STATUS_BUILTIN_ERROR;
case 'i': 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) if (!needle)
{ {
append_format(stderr_buffer, _(L"%ls: Key not specified\n"), argv[0]); 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 (!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; return 0;
} }
} }
@ -3908,14 +3901,15 @@ static int builtin_history(parser_t &parser, wchar_t **argv)
int opt = 0; int opt = 0;
int opt_index = 0; int opt_index = 0;
woptind = 0;
wgetopter_t w;
history_t *history = reader_get_history(); 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 */ /* Use the default history if we have none (which happens if invoked non-interactively, e.g. from webconfig.py */
if (! history) if (! history)
history = &history_t::history_with_name(L"fish"); 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) switch (opt)
{ {
@ -3944,17 +3938,17 @@ static int builtin_history(parser_t &parser, wchar_t **argv)
return STATUS_BUILTIN_OK; return STATUS_BUILTIN_OK;
break; break;
case '?': 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; return STATUS_BUILTIN_ERROR;
break; break;
default: 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; return STATUS_BUILTIN_ERROR;
} }
} }
/* Everything after is an argument */ /* 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) if (argc == 1)
{ {
@ -4157,8 +4151,6 @@ static const builtin_data_t *builtin_lookup(const wcstring &name)
void builtin_init() void builtin_init()
{ {
wopterr = 0;
for (size_t i=0; i < BUILTIN_COUNT; i++) for (size_t i=0; i < BUILTIN_COUNT; i++)
{ {
intern_static(builtin_datas[i].name); intern_static(builtin_datas[i].name);

View file

@ -247,7 +247,7 @@ static void write_part(const wchar_t *begin,
*/ */
static int builtin_commandline(parser_t &parser, wchar_t **argv) static int builtin_commandline(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
int buffer_part=0; int buffer_part=0;
int cut_at_cursor=0; int cut_at_cursor=0;
@ -298,7 +298,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
return 1; return 1;
} }
woptind=0; w.woptind=0;
while (1) while (1)
{ {
@ -327,11 +327,11 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"abijpctwforhI:CLSsP", L"abijpctwforhI:CLSsP",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -390,8 +390,8 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
break; break;
case 'I': case 'I':
current_buffer = woptarg; current_buffer = w.woptarg;
current_cursor_pos = wcslen(woptarg); current_cursor_pos = wcslen(w.woptarg);
break; break;
case 'C': case 'C':
@ -419,7 +419,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
return 0; return 0;
case L'?': case L'?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return 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, append_format(stderr_buffer,
BUILTIN_ERR_MISSING, 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); builtin_print_help(parser, argv[0], stderr_buffer);
return 1; return 1;
} }
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
{ {
wchar_t c = input_function_get_code(argv[i]); wchar_t c = input_function_get_code(argv[i]);
if (c != (wchar_t)(-1)) if (c != (wchar_t)(-1))
@ -491,7 +491,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
/* /*
Check for invalid switch combinations 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, 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, append_format(stderr_buffer,
BUILTIN_ERR_COMBO2, BUILTIN_ERR_COMBO2,
@ -525,7 +525,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
return 1; return 1;
} }
if (append_mode && !(argc-woptind)) if (append_mode && !(argc-w.woptind))
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
BUILTIN_ERR_COMBO2, BUILTIN_ERR_COMBO2,
@ -551,19 +551,19 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
if (cursor_mode) if (cursor_mode)
{ {
if (argc-woptind) if (argc-w.woptind)
{ {
wchar_t *endptr; wchar_t *endptr;
long new_pos; long new_pos;
errno = 0; errno = 0;
new_pos = wcstol(argv[woptind], &endptr, 10); new_pos = wcstol(argv[w.woptind], &endptr, 10);
if (*endptr || errno) if (*endptr || errno)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
BUILTIN_ERR_NOT_NUMBER, BUILTIN_ERR_NOT_NUMBER,
argv[0], argv[0],
argv[woptind]); argv[w.woptind]);
builtin_print_help(parser, argv[0], stderr_buffer); 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: case 0:
{ {
@ -649,16 +649,16 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
case 1: case 1:
{ {
replace_part(begin, end, argv[woptind], append_mode); replace_part(begin, end, argv[w.woptind], append_mode);
break; break;
} }
default: default:
{ {
wcstring sb = argv[woptind]; wcstring sb = argv[w.woptind];
int i; int i;
for (i=woptind+1; i<argc; i++) for (i=w.woptind+1; i<argc; i++)
{ {
sb.push_back(L'\n'); sb.push_back(L'\n');
sb.append(argv[i]); sb.append(argv[i]);

View file

@ -287,6 +287,7 @@ static void builtin_complete_remove(const wcstring_list_t &cmd,
static int builtin_complete(parser_t &parser, wchar_t **argv) static int builtin_complete(parser_t &parser, wchar_t **argv)
{ {
ASSERT_IS_MAIN_THREAD(); ASSERT_IS_MAIN_THREAD();
wgetopter_t w;
bool res=false; bool res=false;
int argc=0; int argc=0;
int result_mode=SHARED; int result_mode=SHARED;
@ -308,7 +309,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
argc = builtin_count_args(argv); argc = builtin_count_args(argv);
woptind=0; w.woptind=0;
while (! res) while (! res)
{ {
@ -337,11 +338,11 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"a:c:p:s:l:o:d:frxeuAn:C::w:h", L"a:c:p:s:l:o:d:frxeuAn:C::w:h",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -376,7 +377,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
case 'c': case 'c':
{ {
wcstring tmp; wcstring tmp;
if (unescape_string(woptarg, &tmp, UNESCAPE_SPECIAL)) if (unescape_string(w.woptarg, &tmp, UNESCAPE_SPECIAL))
{ {
if (opt=='p') if (opt=='p')
path.push_back(tmp); path.push_back(tmp);
@ -385,14 +386,14 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
} }
else 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; res = true;
} }
break; break;
} }
case 'd': case 'd':
desc = woptarg; desc = w.woptarg;
break; break;
case 'u': case 'u':
@ -404,19 +405,19 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
break; break;
case 's': case 's':
short_opt.append(woptarg); short_opt.append(w.woptarg);
break; break;
case 'l': case 'l':
gnu_opt.push_back(woptarg); gnu_opt.push_back(w.woptarg);
break; break;
case 'o': case 'o':
old_opt.push_back(woptarg); old_opt.push_back(w.woptarg);
break; break;
case 'a': case 'a':
comp = woptarg; comp = w.woptarg;
break; break;
case 'e': case 'e':
@ -424,16 +425,16 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
break; break;
case 'n': case 'n':
condition = woptarg; condition = w.woptarg;
break; break;
case 'w': case 'w':
wrap_targets.push_back(woptarg); wrap_targets.push_back(w.woptarg);
break; break;
case 'C': case 'C':
do_complete = true; do_complete = true;
do_complete_param = woptarg ? woptarg : reader_get_buffer(); do_complete_param = w.woptarg ? w.woptarg : reader_get_buffer();
break; break;
case 'h': case 'h':
@ -441,7 +442,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
return 0; return 0;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
res = true; res = true;
break; break;
@ -545,7 +546,7 @@ static int builtin_complete(parser_t &parser, wchar_t **argv)
recursion_level--; recursion_level--;
} }
} }
else if (woptind != argc) else if (w.woptind != argc)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Too many arguments\n"), _(L"%ls: Too many arguments\n"),

View file

@ -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) static int builtin_jobs(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
int argc=0; int argc=0;
int found=0; int found=0;
int mode=JOBS_DEFAULT; int mode=JOBS_DEFAULT;
int print_last = 0; int print_last = 0;
argc = builtin_count_args(argv); argc = builtin_count_args(argv);
woptind=0; w.woptind=0;
while (1) while (1)
{ {
@ -201,11 +202,11 @@ static int builtin_jobs(parser_t &parser, wchar_t **argv)
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"pclgh", L"pclgh",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -248,7 +249,7 @@ static int builtin_jobs(parser_t &parser, wchar_t **argv)
return 0; return 0;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return 1; return 1;
} }
@ -283,13 +284,13 @@ static int builtin_jobs(parser_t &parser, wchar_t **argv)
} }
else else
{ {
if (woptind < argc) if (w.woptind < argc)
{ {
int i; int i;
found = 1; found = 1;
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
{ {
int pid; int pid;
wchar_t *end; wchar_t *end;

View file

@ -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) static int builtin_set(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
/** Variables used for parsing the argument list */ /** Variables used for parsing the argument list */
const struct woption long_options[] = 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 */ /* Parse options to obtain the requested operation and the modifiers */
woptind = 0; w.woptind = 0;
while (1) 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) if (c == -1)
{ {
@ -498,7 +499,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
return 0; return 0;
case '?': case '?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return 1; return 1;
default: default:
@ -573,7 +574,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
out of the specified variables. out of the specified variables.
*/ */
int i; int i;
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
{ {
wchar_t *arg = argv[i]; wchar_t *arg = argv[i];
int slice=0; int slice=0;
@ -635,7 +636,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
return 0; return 0;
} }
if (woptind == argc) if (w.woptind == argc)
{ {
/* /*
Print values of variables Print values of variables
@ -658,7 +659,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
return retcode; return retcode;
} }
if (!(dest = wcsdup(argv[woptind]))) if (!(dest = wcsdup(argv[w.woptind])))
{ {
DIE_MEM(); DIE_MEM();
} }
@ -711,9 +712,9 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
if (!retcode) 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); builtin_print_help(parser, argv[0], stderr_buffer);
retcode = 1; retcode = 1;
@ -721,7 +722,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
} }
size_t idx_count = indexes.size(); size_t idx_count = indexes.size();
size_t val_count = argc-woptind-1; size_t val_count = argc-w.woptind-1;
if (!erase) if (!erase)
{ {
@ -734,7 +735,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
} }
if (val_count == idx_count) if (val_count == idx_count)
{ {
woptind++; w.woptind++;
break; break;
} }
} }
@ -756,9 +757,9 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
{ {
wcstring_list_t value; 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, if (update_values(result,
@ -778,14 +779,14 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
} }
else else
{ {
woptind++; w.woptind++;
/* /*
No slicing No slicing
*/ */
if (erase) if (erase)
{ {
if (woptind != argc) if (w.woptind != argc)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
_(L"%ls: Values cannot be specfied with erase\n"), _(L"%ls: Values cannot be specfied with erase\n"),
@ -801,7 +802,7 @@ static int builtin_set(parser_t &parser, wchar_t **argv)
else else
{ {
wcstring_list_t val; wcstring_list_t val;
for (i=woptind; i<argc; i++) for (i=w.woptind; i<argc; i++)
val.push_back(argv[i]); val.push_back(argv[i]);
retcode = my_env_set(dest, val, scope); retcode = my_env_set(dest, val, scope);
} }

View file

@ -67,6 +67,7 @@ static int set_color_builtin_outputter(char c)
*/ */
static int builtin_set_color(parser_t &parser, wchar_t **argv) static int builtin_set_color(parser_t &parser, wchar_t **argv)
{ {
wgetopter_t w;
/** Variables used for parsing the argument list */ /** Variables used for parsing the argument list */
const struct woption long_options[] = const struct woption long_options[] =
{ {
@ -94,10 +95,10 @@ static int builtin_set_color(parser_t &parser, wchar_t **argv)
int errret; int errret;
/* Parse options to obtain the requested operation and the modifiers */ /* Parse options to obtain the requested operation and the modifiers */
woptind = 0; w.woptind = 0;
while (1) 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) if (c == -1)
{ {
@ -110,7 +111,7 @@ static int builtin_set_color(parser_t &parser, wchar_t **argv)
break; break;
case 'b': case 'b':
bgcolor = woptarg; bgcolor = w.woptarg;
break; break;
case 'h': case 'h':
@ -136,12 +137,12 @@ static int builtin_set_color(parser_t &parser, wchar_t **argv)
/* Remaining arguments are foreground color */ /* Remaining arguments are foreground color */
std::vector<rgb_color_t> fgcolors; 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()) 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; return STATUS_BUILTIN_ERROR;
} }
fgcolors.push_back(fg); fgcolors.push_back(fg);

View file

@ -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) static int builtin_ulimit(parser_t &parser, wchar_t ** argv)
{ {
wgetopter_t w;
int hard=0; int hard=0;
int soft=0; int soft=0;
@ -262,7 +263,7 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv)
int argc = builtin_count_args(argv); int argc = builtin_count_args(argv);
woptind=0; w.woptind=0;
while (1) while (1)
{ {
@ -334,11 +335,11 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv)
int opt_index = 0; int opt_index = 0;
int opt = wgetopt_long(argc, int opt = w.wgetopt_long(argc,
argv, argv,
L"aHScdflmnstuvh", L"aHScdflmnstuvh",
long_options, long_options,
&opt_index); &opt_index);
if (opt == -1) if (opt == -1)
break; break;
@ -419,14 +420,14 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv)
return 0; return 0;
case L'?': case L'?':
builtin_unknown_option(parser, argv[0], argv[woptind-1]); builtin_unknown_option(parser, argv[0], argv[w.woptind-1]);
return 1; return 1;
} }
} }
if (report_all) if (report_all)
{ {
if (argc - woptind == 0) if (argc - w.woptind == 0)
{ {
print_all(hard); print_all(hard);
} }
@ -441,7 +442,7 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv)
return 0; return 0;
} }
switch (argc - woptind) switch (argc - w.woptind)
{ {
case 0: case 0:
{ {
@ -468,28 +469,28 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv)
hard=soft=1; hard=soft=1;
} }
if (wcscasecmp(argv[woptind], L"unlimited")==0) if (wcscasecmp(argv[w.woptind], L"unlimited")==0)
{ {
new_limit = RLIM_INFINITY; 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); 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); new_limit = get(what, soft);
} }
else else
{ {
errno=0; errno=0;
new_limit = wcstol(argv[woptind], &end, 10); new_limit = wcstol(argv[w.woptind], &end, 10);
if (errno || *end) if (errno || *end)
{ {
append_format(stderr_buffer, append_format(stderr_buffer,
L"%ls: Invalid limit '%ls'\n", L"%ls: Invalid limit '%ls'\n",
argv[0], argv[0],
argv[woptind]); argv[w.woptind]);
builtin_print_help(parser, argv[0], stderr_buffer); builtin_print_help(parser, argv[0], stderr_buffer);
return 1; return 1;
} }

View file

@ -84,9 +84,6 @@
when it is done, all the options precede everything else. Thus when it is done, all the options precede everything else. Thus
all application programs are extended to handle flexible argument order. 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 GNU application programs can use a third alternative mode in which
they can distinguish the relative order of options and other arguments. */ they can distinguish the relative order of options and other arguments. */
@ -95,87 +92,6 @@
#include "fallback.h" #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 Use translation functions if available
*/ */
@ -233,14 +149,6 @@ extern int wcslen(const wchar_t *);
#endif /* not __GNU_LIBRARY__ */ #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. /* Exchange two adjacent subsequences of ARGV.
One subsequence is elements [first_nonopt,last_nonopt) 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 `first_nonopt' and `last_nonopt' are relocated so that they describe
the new indices of the non-options in ARGV after they are moved. */ the new indices of the non-options in ARGV after they are moved. */
static void void wgetopter_t::exchange(wchar_t **argv)
exchange(wchar_t **argv)
{ {
int bottom = first_nonopt; int bottom = first_nonopt;
int middle = last_nonopt; int middle = last_nonopt;
@ -308,8 +215,7 @@ exchange(wchar_t **argv)
/* Initialize the internal data when the first call is made. */ /* Initialize the internal data when the first call is made. */
static const wchar_t * const wchar_t * wgetopter_t::_wgetopt_initialize(const wchar_t *optstring)
_wgetopt_initialize(const wchar_t *optstring)
{ {
/* Start processing options with ARGV-element 1 (since ARGV-element 0 /* Start processing options with ARGV-element 1 (since ARGV-element 0
is the program name); the sequence of previously skipped is the program name); the sequence of previously skipped
@ -319,8 +225,6 @@ _wgetopt_initialize(const wchar_t *optstring)
nextchar = NULL; nextchar = NULL;
posixly_correct = getenv("POSIXLY_CORRECT");
/* Determine how to handle the ordering of options and nonoptions. */ /* Determine how to handle the ordering of options and nonoptions. */
if (optstring[0] == '-') if (optstring[0] == '-')
@ -333,8 +237,6 @@ _wgetopt_initialize(const wchar_t *optstring)
ordering = REQUIRE_ORDER; ordering = REQUIRE_ORDER;
++optstring; ++optstring;
} }
else if (posixly_correct != NULL)
ordering = REQUIRE_ORDER;
else else
ordering = PERMUTE; 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 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 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, 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 If OPTSTRING starts with `-' or `+', it requests different methods of
handling the non-option ARGV-elements. 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 If LONG_ONLY is nonzero, '-' as well as '--' can introduce
long-named options. */ long-named options. */
int int wgetopter_t::_wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only)
_wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only)
{ {
woptarg = NULL; woptarg = NULL;
@ -631,11 +532,7 @@ _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, cons
{ {
if (wopterr) if (wopterr)
{ {
if (posixly_correct) fwprintf(stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c);
/* 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);
} }
woptopt = c; woptopt = c;
@ -693,8 +590,7 @@ _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, cons
} }
} }
int int wgetopter_t::wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring)
wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring)
{ {
return _wgetopt_internal(argc, argv, optstring, return _wgetopt_internal(argc, argv, optstring,
(const struct woption *) 0, (const struct woption *) 0,
@ -702,14 +598,12 @@ wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring)
0); 0);
} }
int int wgetopter_t::wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index)
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); return _wgetopt_internal(argc, argv, options, long_options, opt_index, 0);
} }
int int wgetopter_t::wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index)
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); return _wgetopt_internal(argc, argv, options, long_options, opt_index, 1);
} }

View file

@ -49,162 +49,170 @@ Cambridge, MA 02139, USA. */
#include <wchar.h> #include <wchar.h>
#ifdef __cplusplus class wgetopter_t
extern "C" { {
#endif private:
void exchange(wchar_t **argv);
/** For communication from `getopt' to the caller. const wchar_t * _wgetopt_initialize(const wchar_t *optstring);
When `getopt' finds an option that takes an argument, int _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only);
the argument value is returned here.
Also, when `ordering' is RETURN_IN_ORDER, public:
each non-option ARGV-element is returned here. */ /* For communication from `getopt' to the caller.
When `getopt' finds an option that takes an argument,
extern wchar_t *woptarg; the argument value is returned here.
Also, when `ordering' is RETURN_IN_ORDER,
/** Index in ARGV of the next element to be scanned. each non-option ARGV-element is returned here. */
This is used for communication to and from the caller
and for communication between successive calls to `getopt'. wchar_t *woptarg;
On entry to `getopt', zero means this is the first call; initialize. /* Index in ARGV of the next element to be scanned.
This is used for communication to and from the caller
When `getopt' returns EOF, this is the index of the first of the and for communication between successive calls to `getopt'.
non-option elements that the caller should itself scan.
On entry to `getopt', zero means this is the first call; initialize.
Otherwise, `woptind' communicates from one call to the next
how much of ARGV has been scanned so far. */ When `getopt' returns EOF, this is the index of the first of the
non-option elements that the caller should itself scan.
extern int woptind;
Otherwise, `woptind' communicates from one call to the next
/** Callers store zero here to inhibit the error message `getopt' prints how much of ARGV has been scanned so far. */
for unrecognized options. */
/* XXX 1003.2 says this must be 1 before any call. */
extern int wopterr; int woptind;
/** Set to an option character which was unrecognized. */
/* The next char to be scanned in the option-element
extern int woptopt; in which the last option character we returned was found.
This allows us to pick up the scan where we left off.
/** Describe the long-named options requested by the application.
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector If this is zero, or a null string, it means resume the scan
of `struct option' terminated by an element containing a name which is by advancing to the next ARGV-element. */
zero.
wchar_t *nextchar;
The field `has_arg' is:
no_argument (or 0) if the option does not take an argument, /* Callers store zero here to inhibit the error message
required_argument (or 1) if the option requires an argument, for unrecognized options. */
optional_argument (or 2) if the option takes an optional argument.
int wopterr;
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 /* Set to an option character which was unrecognized.
left unchanged if the option is not found. This must be initialized on some systems to avoid linking in the
system's own getopt implementation. */
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 int woptopt;
option's `flag' field to zero and its `val' field to a nonzero
value (the equivalent single-letter option character, if there is /* Describe how to deal with options that follow non-option ARGV-elements.
one). For long options that have a zero `flag' field, `getopt'
returns the contents of the `val' field. */ If the caller did not specify anything,
the default is PERMUTE.
struct woption
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
{ {
/** REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
long name for switch } ordering;
*/
#if defined (__STDC__) && __STDC__ /* Handle permutation of arguments. */
const wchar_t *name;
#else /* Describe the part of ARGV that contains non-options that have
wchar_t *name; been skipped. `first_nonopt' is the index in ARGV of the first of them;
#endif `last_nonopt' is the index after the last of them. */
/**
Must be one of no_argument, required_argument and int first_nonopt;
optional_argument. 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);
};
has_arg can't be an enum because some compilers complain about /** Describe the long-named options requested by the application.
type mismatches in all the code that assumes it is an int. 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
int has_arg; zero.
/** The field `has_arg' is:
If non-null, the flag whose value should be set if this switch is encountered no_argument (or 0) if the option does not take an argument,
*/ required_argument (or 1) if the option requires an argument,
int *flag; 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
If \c flag is non-null, this is the value that flag will be set to the value given in the field `val' when the option is found, but
to. Otherwise, this is the return-value of the function call. left unchanged if the option is not found.
*/
int val;
};
/* Names for the values of the `has_arg' field of `struct option'. */ 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
{
/**
long name for switch
*/
const wchar_t *name;
/**
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;
/** /**
Specifies that a switch does not accept an argument 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'. */
/**
Specifies that a switch does not accept an argument
*/
#define no_argument 0 #define no_argument 0
/** /**
Specifies that a switch requires an argument Specifies that a switch requires an argument
*/ */
#define required_argument 1 #define required_argument 1
/** /**
Specifies that a switch accepts an optional argument Specifies that a switch accepts an optional argument
*/ */
#define optional_argument 2 #define optional_argument 2
#if defined (__STDC__) && __STDC__
#ifdef __GNU_LIBRARY__
/**
Get options from argument list. See the glibc manual for information on how to use this function.
*/
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);
/**
Internal only. Users should not call this directly.
*/
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();
/**
Internal only. Users should not call this directly.
*/
extern int _wgetopt_internal();
#endif /* __STDC__ */
#ifdef __cplusplus
}
#endif
#endif /* FISH_WGETOPT_H */ #endif /* FISH_WGETOPT_H */