mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-12 04:58:57 +00:00
Eliminate wgetopt global variables
Replace them with a new struct wgetopter_t that uses instance variables instead.
This commit is contained in:
parent
caab298f72
commit
f4d1657c22
9 changed files with 405 additions and 506 deletions
316
src/builtin.cpp
316
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)
|
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);
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
122
src/wgetopt.cpp
122
src/wgetopt.cpp
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
300
src/wgetopt.h
300
src/wgetopt.h
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue