diff --git a/src/builtin.cpp b/src/builtin.cpp index 59778862b..3381996a7 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -636,7 +636,7 @@ static int builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode, int u */ static int builtin_bind(parser_t &parser, wchar_t **argv) { - + wgetopter_t w; enum { BIND_INSERT, @@ -657,7 +657,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) int use_terminfo = 0; - woptind=0; + w.woptind=0; static const struct woption long_options[] = { @@ -675,11 +675,11 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) while (1) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"aehkKfM:m:", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"aehkKfM:m:", + long_options, + &opt_index); if (opt == -1) break; @@ -722,17 +722,17 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) break; case 'M': - bind_mode = woptarg; + bind_mode = w.woptarg; bind_mode_given = true; break; case 'm': - sets_bind_mode = woptarg; + sets_bind_mode = w.woptarg; sets_bind_mode_given = true; break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; @@ -752,7 +752,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) case BIND_ERASE: { - if (builtin_bind_erase(&argv[woptind], all, bind_mode_given ? bind_mode : NULL, use_terminfo)) + if (builtin_bind_erase(&argv[w.woptind], all, bind_mode_given ? bind_mode : NULL, use_terminfo)) { res = STATUS_BUILTIN_ERROR; } @@ -761,7 +761,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) case BIND_INSERT: { - switch (argc-woptind) + switch (argc-w.woptind) { case 0: { @@ -774,7 +774,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) wcstring seq; if (use_terminfo) { - if (!get_terminfo_sequence(argv[woptind], &seq)) + if (!get_terminfo_sequence(argv[w.woptind], &seq)) { res = STATUS_BUILTIN_ERROR; // get_terminfo_sequence already printed the error @@ -783,12 +783,12 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) } else { - seq = argv[woptind]; + seq = argv[w.woptind]; } if (!builtin_bind_list_one(seq, bind_mode)) { res = STATUS_BUILTIN_ERROR; - wcstring eseq = escape_string(argv[woptind], 0); + wcstring eseq = escape_string(argv[w.woptind], 0); if (use_terminfo) { append_format(stderr_buffer, _(L"%ls: No binding found for key '%ls'\n"), argv[0], eseq.c_str()); @@ -803,7 +803,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) default: { - if (builtin_bind_add(argv[woptind], (const wchar_t **)argv + (woptind + 1), argc - (woptind + 1), bind_mode, sets_bind_mode, use_terminfo)) + if (builtin_bind_add(argv[w.woptind], (const wchar_t **)argv + (w.woptind + 1), argc - (w.woptind + 1), bind_mode, sets_bind_mode, use_terminfo)) { res = STATUS_BUILTIN_ERROR; } @@ -845,6 +845,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) */ static int builtin_block(parser_t &parser, wchar_t **argv) { + wgetopter_t w; enum { UNSET, @@ -857,7 +858,7 @@ static int builtin_block(parser_t &parser, wchar_t **argv) int erase = 0; int argc=builtin_count_args(argv); - woptind=0; + w.woptind=0; static const struct woption long_options[] = @@ -888,11 +889,11 @@ static int builtin_block(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"elgh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"elgh", + long_options, + &opt_index); if (opt == -1) break; @@ -925,7 +926,7 @@ static int builtin_block(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1003,8 +1004,7 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) { int argc=builtin_count_args(argv); int list=0; - - woptind=0; + wgetopter_t w; static const struct woption long_options[] = @@ -1027,11 +1027,11 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"nh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"nh", + long_options, + &opt_index); if (opt == -1) break; @@ -1057,7 +1057,7 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1085,10 +1085,9 @@ static int builtin_builtin(parser_t &parser, wchar_t **argv) */ static int builtin_emit(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=builtin_count_args(argv); - woptind=0; - static const struct woption long_options[] = { @@ -1106,11 +1105,11 @@ static int builtin_emit(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"h", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"h", + long_options, + &opt_index); if (opt == -1) break; @@ -1131,20 +1130,20 @@ static int builtin_emit(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } } - if (!argv[woptind]) + if (!argv[w.woptind]) { append_format(stderr_buffer, L"%ls: expected event name\n", argv[0]); return STATUS_BUILTIN_ERROR; } - const wchar_t *eventname = argv[woptind]; - wcstring_list_t args(argv + woptind + 1, argv + argc); + const wchar_t *eventname = argv[w.woptind]; + wcstring_list_t args(argv + w.woptind + 1, argv + argc); event_fire_generic(eventname, &args); return STATUS_BUILTIN_OK; @@ -1157,10 +1156,11 @@ static int builtin_emit(parser_t &parser, wchar_t **argv) */ static int builtin_command(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=builtin_count_args(argv); int print_path=0; - woptind=0; + w.woptind=0; static const struct woption long_options[] = @@ -1174,11 +1174,11 @@ static int builtin_command(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"svh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"svh", + long_options, + &opt_index); if (opt == -1) break; @@ -1204,7 +1204,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1219,7 +1219,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv) int found=0; - for (int idx = woptind; argv[idx]; ++idx) + for (int idx = w.woptind; argv[idx]; ++idx) { const wchar_t *command_name = argv[idx]; wcstring path; @@ -1239,6 +1239,7 @@ static int builtin_command(parser_t &parser, wchar_t **argv) */ static int builtin_generic(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int argc=builtin_count_args(argv); /* Hackish - if we have no arguments other than the command, we are a "naked invocation" and we just print help */ @@ -1248,8 +1249,6 @@ static int builtin_generic(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_ERROR; } - woptind=0; - static const struct woption long_options[] = { @@ -1261,11 +1260,11 @@ static int builtin_generic(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"h", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"h", + long_options, + &opt_index); if (opt == -1) break; @@ -1286,7 +1285,7 @@ static int builtin_generic(parser_t &parser, wchar_t **argv) return STATUS_BUILTIN_OK; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1435,6 +1434,7 @@ static void functions_def(const wcstring &name, wcstring &out) */ static int builtin_functions(parser_t &parser, wchar_t **argv) { + wgetopter_t w; int i; int erase=0; wchar_t *desc=0; @@ -1446,8 +1446,6 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) int query = 0; int copy = 0; - woptind=0; - static const struct woption long_options[] = { @@ -1489,11 +1487,11 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) { int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"ed:nahqc", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"ed:nahqc", + long_options, + &opt_index); if (opt == -1) break; @@ -1516,7 +1514,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) break; case 'd': - desc=woptarg; + desc=w.woptarg; break; case 'n': @@ -1540,7 +1538,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) break; case '?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return STATUS_BUILTIN_ERROR; } @@ -1564,7 +1562,7 @@ static int builtin_functions(parser_t &parser, wchar_t **argv) if (erase) { int i; - for (i=woptind; i 1)) + if ((search_mode || line_mode || cursor_mode || paging_mode) && (argc-w.woptind > 1)) { append_format(stderr_buffer, @@ -513,7 +513,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) } - if ((tokenize || cut_at_cursor) && (argc-woptind)) + if ((tokenize || cut_at_cursor) && (argc-w.woptind)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, @@ -525,7 +525,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) return 1; } - if (append_mode && !(argc-woptind)) + if (append_mode && !(argc-w.woptind)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, @@ -551,19 +551,19 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) if (cursor_mode) { - if (argc-woptind) + if (argc-w.woptind) { wchar_t *endptr; long new_pos; errno = 0; - new_pos = wcstol(argv[woptind], &endptr, 10); + new_pos = wcstol(argv[w.woptind], &endptr, 10); if (*endptr || errno) { append_format(stderr_buffer, BUILTIN_ERR_NOT_NUMBER, argv[0], - argv[woptind]); + argv[w.woptind]); builtin_print_help(parser, argv[0], stderr_buffer); } @@ -639,7 +639,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) } - switch (argc-woptind) + switch (argc-w.woptind) { case 0: { @@ -649,16 +649,16 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv) case 1: { - replace_part(begin, end, argv[woptind], append_mode); + replace_part(begin, end, argv[w.woptind], append_mode); break; } default: { - wcstring sb = argv[woptind]; + wcstring sb = argv[w.woptind]; int i; - for (i=woptind+1; i fgcolors; - for (; woptind < argc; woptind++) + for (; w.woptind < argc; w.woptind++) { - rgb_color_t fg = rgb_color_t(argv[woptind]); + rgb_color_t fg = rgb_color_t(argv[w.woptind]); if (fg.is_none() || fg.is_ignore()) { - append_format(stderr_buffer, _(L"%ls: Unknown color '%ls'\n"), argv[0], argv[woptind]); + append_format(stderr_buffer, _(L"%ls: Unknown color '%ls'\n"), argv[0], argv[w.woptind]); return STATUS_BUILTIN_ERROR; } fgcolors.push_back(fg); diff --git a/src/builtin_ulimit.cpp b/src/builtin_ulimit.cpp index 23524543a..64b126b79 100644 --- a/src/builtin_ulimit.cpp +++ b/src/builtin_ulimit.cpp @@ -254,6 +254,7 @@ static int set(int resource, int hard, int soft, rlim_t value) */ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) { + wgetopter_t w; int hard=0; int soft=0; @@ -262,7 +263,7 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) int argc = builtin_count_args(argv); - woptind=0; + w.woptind=0; while (1) { @@ -334,11 +335,11 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) int opt_index = 0; - int opt = wgetopt_long(argc, - argv, - L"aHScdflmnstuvh", - long_options, - &opt_index); + int opt = w.wgetopt_long(argc, + argv, + L"aHScdflmnstuvh", + long_options, + &opt_index); if (opt == -1) break; @@ -419,14 +420,14 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) return 0; case L'?': - builtin_unknown_option(parser, argv[0], argv[woptind-1]); + builtin_unknown_option(parser, argv[0], argv[w.woptind-1]); return 1; } } if (report_all) { - if (argc - woptind == 0) + if (argc - w.woptind == 0) { print_all(hard); } @@ -441,7 +442,7 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) return 0; } - switch (argc - woptind) + switch (argc - w.woptind) { case 0: { @@ -468,28 +469,28 @@ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) hard=soft=1; } - if (wcscasecmp(argv[woptind], L"unlimited")==0) + if (wcscasecmp(argv[w.woptind], L"unlimited")==0) { new_limit = RLIM_INFINITY; } - else if (wcscasecmp(argv[woptind], L"hard")==0) + else if (wcscasecmp(argv[w.woptind], L"hard")==0) { new_limit = get(what, 1); } - else if (wcscasecmp(argv[woptind], L"soft")==0) + else if (wcscasecmp(argv[w.woptind], L"soft")==0) { new_limit = get(what, soft); } else { errno=0; - new_limit = wcstol(argv[woptind], &end, 10); + new_limit = wcstol(argv[w.woptind], &end, 10); if (errno || *end) { append_format(stderr_buffer, L"%ls: Invalid limit '%ls'\n", argv[0], - argv[woptind]); + argv[w.woptind]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } diff --git a/src/wgetopt.cpp b/src/wgetopt.cpp index 2d2117f6d..b63fe74fd 100644 --- a/src/wgetopt.cpp +++ b/src/wgetopt.cpp @@ -84,9 +84,6 @@ when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ @@ -95,87 +92,6 @@ #include "fallback.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -wchar_t *woptarg = NULL; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `woptind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int woptind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static wchar_t *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int wopterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int woptopt = '?'; - -/* Describe how to deal with options that follow non-option ARGV-elements. - -If the caller did not specify anything, -the default is REQUIRE_ORDER if the environment variable -POSIXLY_CORRECT is defined, PERMUTE otherwise. - -REQUIRE_ORDER means don't recognize them as options; -stop option processing when the first non-option is seen. -This is what Unix does. -This mode of operation is selected by either setting the environment -variable POSIXLY_CORRECT, or using `+' as the first character -of the list of option characters. - -PERMUTE is the default. We permute the contents of ARGV as we scan, -so that eventually all the non-options are at the end. This allows options -to be given in any order, even with programs that were not written to -expect this. - -RETURN_IN_ORDER is an option available to programs that were written -to expect options and other ARGV-elements in any order and that care about -the ordering of the two. We describe each non-option ARGV-element -as if it were the argument of an option with character code 1. -Using `-' as the first character of the list of option characters -selects this mode of operation. - -The special argument `--' forces an end of option-scanning regardless -of the value of `ordering'. In the case of RETURN_IN_ORDER, only -`--' can cause `getopt' to return EOF with `woptind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -/* Value of POSIXLY_CORRECT environment variable. */ -static char *posixly_correct; - /** Use translation functions if available */ @@ -233,14 +149,6 @@ extern int wcslen(const wchar_t *); #endif /* not __GNU_LIBRARY__ */ -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) @@ -251,8 +159,7 @@ static int last_nonopt; `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ -static void -exchange(wchar_t **argv) +void wgetopter_t::exchange(wchar_t **argv) { int bottom = first_nonopt; int middle = last_nonopt; @@ -308,8 +215,7 @@ exchange(wchar_t **argv) /* Initialize the internal data when the first call is made. */ -static const wchar_t * -_wgetopt_initialize(const wchar_t *optstring) +const wchar_t * wgetopter_t::_wgetopt_initialize(const wchar_t *optstring) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped @@ -319,8 +225,6 @@ _wgetopt_initialize(const wchar_t *optstring) nextchar = NULL; - posixly_correct = getenv("POSIXLY_CORRECT"); - /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') @@ -333,8 +237,6 @@ _wgetopt_initialize(const wchar_t *optstring) ordering = REQUIRE_ORDER; ++optstring; } - else if (posixly_correct != NULL) - ordering = REQUIRE_ORDER; else ordering = PERMUTE; @@ -368,7 +270,7 @@ _wgetopt_initialize(const wchar_t *optstring) so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, - it is returned in `woptarg', otherwise `woptarg' is set to zero. + it is returned in `w.woptarg', otherwise `w.woptarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. @@ -397,8 +299,7 @@ _wgetopt_initialize(const wchar_t *optstring) If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ -int -_wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only) +int wgetopter_t::_wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only) { woptarg = NULL; @@ -631,11 +532,7 @@ _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, cons { if (wopterr) { - if (posixly_correct) - /* 1003.2 specifies the format of this message. */ - fwprintf(stderr, _(L"%ls: Illegal option -- %lc\n"), argv[0], c); - else - fwprintf(stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c); + fwprintf(stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c); } woptopt = c; @@ -693,8 +590,7 @@ _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, cons } } -int -wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) +int wgetopter_t::wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) { return _wgetopt_internal(argc, argv, optstring, (const struct woption *) 0, @@ -702,14 +598,12 @@ wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) 0); } -int -wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) +int wgetopter_t::wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) { return _wgetopt_internal(argc, argv, options, long_options, opt_index, 0); } -int -wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) +int wgetopter_t::wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) { return _wgetopt_internal(argc, argv, options, long_options, opt_index, 1); } diff --git a/src/wgetopt.h b/src/wgetopt.h index 5a03ba33c..91d50489e 100644 --- a/src/wgetopt.h +++ b/src/wgetopt.h @@ -49,162 +49,170 @@ Cambridge, MA 02139, USA. */ #include -#ifdef __cplusplus -extern "C" { -#endif - - /** For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - - extern wchar_t *woptarg; - - /** Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `woptind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - - extern int woptind; - - /** Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - - extern int wopterr; - - /** Set to an option character which was unrecognized. */ - - extern int woptopt; - - /** Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - - struct woption +class wgetopter_t +{ +private: + void exchange(wchar_t **argv); + const wchar_t * _wgetopt_initialize(const wchar_t *optstring); + int _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only); + +public: + /* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + + wchar_t *woptarg; + + /* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `woptind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + + /* XXX 1003.2 says this must be 1 before any call. */ + int woptind; + + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + + wchar_t *nextchar; + + /* Callers store zero here to inhibit the error message + for unrecognized options. */ + + int wopterr; + + /* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + + int woptopt; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is PERMUTE. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by using `+' as the first + character of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return EOF with `woptind' != ARGC. */ + + enum { - /** - long name for switch - */ -#if defined (__STDC__) && __STDC__ - const wchar_t *name; -#else - wchar_t *name; -#endif - /** - Must be one of no_argument, required_argument and - optional_argument. + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } ordering; + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + + int first_nonopt; + int last_nonopt; + + + wgetopter_t() : woptarg(NULL), woptind(0), nextchar(0), wopterr(0), woptopt('?'), first_nonopt(0), last_nonopt(0) + { + } + + int wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring); + int wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index); + int wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index); +}; - 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; +/** Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. - /** - If non-null, the flag whose value should be set if this switch is encountered - */ - int *flag; + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. - /** - If \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; - }; + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. - /* 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 - /** - Specifies that a switch requires an argument - */ +/** + Specifies that a switch requires an argument +*/ #define required_argument 1 - /** - Specifies that a switch accepts an optional argument - */ +/** + Specifies that a switch accepts an optional argument +*/ #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 */