From ea81321ccba999ce165a2a646310d7b8d9c84dbb Mon Sep 17 00:00:00 2001 From: axel Date: Sat, 28 Jan 2006 12:17:40 +1000 Subject: [PATCH] Add translation support to wgetopt library darcs-hash:20060128021740-ac50b-f670531d3d79cb8070756669f83f4e8b25233a0a.gz --- configure.ac | 3 + wgetopt.c | 768 ++++++++++++++++++++++++++------------------------- 2 files changed, 392 insertions(+), 379 deletions(-) diff --git a/configure.ac b/configure.ac index c92d328bf..fe654b295 100644 --- a/configure.ac +++ b/configure.ac @@ -165,6 +165,9 @@ AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext fwprintf ) AC_CHECK_FUNCS( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc ) AC_CHECK_FUNCS( wcstol dcgettext ) +AC_DEFINE([HAVE_TRANSLATE_H], [1], + [Define to 1 if the wgettext function should be used for translating strings.]) + # Check again for gettext library, and insert results into the Makefile AC_CHECK_FUNC(gettext, AC_SUBST(HAVE_GETTEXT,1), AC_SUBST(HAVE_GETTEXT,0) ) diff --git a/wgetopt.c b/wgetopt.c index 0c18198c2..72b1ea5b4 100644 --- a/wgetopt.c +++ b/wgetopt.c @@ -29,25 +29,25 @@ before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94 - Free Software Foundation, Inc. + Free Software Foundation, Inc. -This file is part of the GNU C Library. Its master source is NOT part of -the C library, however. The master source lives in /gd/gnu/lib. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., 675 Mass Ave, + Cambridge, MA 02139, USA. */ #include "config.h" @@ -139,41 +139,51 @@ 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. +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. +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. +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. +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. */ +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 + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; +/** + Use translation functions if available +*/ +#ifdef HAVE_TRANSLATE_H +#include "translate.h" +#define _(wstr) wgettext(wstr) +#else +#define _(wstr) wstr +#endif + #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. @@ -190,16 +200,16 @@ char *getenv (); static wchar_t * my_index (str, chr) - const wchar_t *str; - int chr; + const wchar_t *str; + int chr; { - while (*str) + while (*str) { - if (*str == chr) - return (wchar_t *) str; - str++; + if (*str == chr) + return (wchar_t *) str; + str++; } - return 0; + return 0; } /* If using GCC, we can safely declare strlen this way. @@ -236,94 +246,94 @@ static int last_nonopt; static void exchange (argv) - wchar_t **argv; + wchar_t **argv; { - int bottom = first_nonopt; - int middle = last_nonopt; - int top = woptind; - wchar_t *tem; + int bottom = first_nonopt; + int middle = last_nonopt; + int top = woptind; + wchar_t *tem; - /* Exchange the shorter segment with the far end of the longer segment. - That puts the shorter segment into the right place. - It leaves the longer segment in the right place overall, - but it consists of two parts that need to be swapped next. */ + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ - while (top > middle && middle > bottom) + while (top > middle && middle > bottom) { - if (top - middle > middle - bottom) - { - /* Bottom segment is the short one. */ - int len = middle - bottom; - register int i; + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; - /* Swap it with the top part of the top segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[top - (middle - bottom) + i]; - argv[top - (middle - bottom) + i] = tem; - } - /* Exclude the moved bottom segment from further swapping. */ - top -= len; - } - else - { - /* Top segment is the short one. */ - int len = top - middle; - register int i; + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; - /* Swap it with the bottom part of the bottom segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[middle + i]; - argv[middle + i] = tem; - } - /* Exclude the moved top segment from further swapping. */ - bottom += len; - } + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } } - /* Update records for the slots the non-options now occupy. */ + /* Update records for the slots the non-options now occupy. */ - first_nonopt += (woptind - last_nonopt); - last_nonopt = woptind; + first_nonopt += (woptind - last_nonopt); + last_nonopt = woptind; } /* Initialize the internal data when the first call is made. */ static const wchar_t * _wgetopt_initialize (optstring) - const wchar_t *optstring; + const wchar_t *optstring; { - /* Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ - first_nonopt = last_nonopt = woptind = 1; + first_nonopt = last_nonopt = woptind = 1; - nextchar = NULL; + nextchar = NULL; - posixly_correct = getenv ("POSIXLY_CORRECT"); + 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] == '-') { - ordering = RETURN_IN_ORDER; - ++optstring; + ordering = RETURN_IN_ORDER; + ++optstring; } - else if (optstring[0] == '+') + else if (optstring[0] == '+') { - ordering = REQUIRE_ORDER; - ++optstring; + ordering = REQUIRE_ORDER; + ++optstring; } - else if (posixly_correct != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; - return optstring; + return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters @@ -384,321 +394,321 @@ _wgetopt_initialize (optstring) int _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - wchar_t *const *argv; - const wchar_t *optstring; - const struct woption *longopts; - int *longind; - int long_only; + int argc; +wchar_t *const *argv; +const wchar_t *optstring; +const struct woption *longopts; +int *longind; +int long_only; { - woptarg = NULL; + woptarg = NULL; - if (woptind == 0) - optstring = _wgetopt_initialize (optstring); + if (woptind == 0) + optstring = _wgetopt_initialize (optstring); - if (nextchar == NULL || *nextchar == '\0') + if (nextchar == NULL || *nextchar == '\0') { - /* Advance to the next ARGV-element. */ + /* Advance to the next ARGV-element. */ - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ - if (first_nonopt != last_nonopt && last_nonopt != woptind) - exchange ((wchar_t **) argv); - else if (last_nonopt != woptind) - first_nonopt = woptind; + if (first_nonopt != last_nonopt && last_nonopt != woptind) + exchange ((wchar_t **) argv); + else if (last_nonopt != woptind) + first_nonopt = woptind; - /* Skip any additional non-options - and extend the range of non-options previously skipped. */ + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ - while (woptind < argc - && (argv[woptind][0] != '-' || argv[woptind][1] == '\0')) - woptind++; - last_nonopt = woptind; - } + while (woptind < argc + && (argv[woptind][0] != '-' || argv[woptind][1] == '\0')) + woptind++; + last_nonopt = woptind; + } - /* The special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ - if (woptind != argc && !wcscmp (argv[woptind], L"--")) - { - woptind++; + if (woptind != argc && !wcscmp (argv[woptind], L"--")) + { + woptind++; - if (first_nonopt != last_nonopt && last_nonopt != woptind) - exchange ((wchar_t **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = woptind; - last_nonopt = argc; + if (first_nonopt != last_nonopt && last_nonopt != woptind) + exchange ((wchar_t **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = woptind; + last_nonopt = argc; - woptind = argc; - } + woptind = argc; + } - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ - if (woptind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - woptind = first_nonopt; - return EOF; - } + if (woptind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + woptind = first_nonopt; + return EOF; + } - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ - if ((argv[woptind][0] != '-' || argv[woptind][1] == '\0')) - { - if (ordering == REQUIRE_ORDER) - return EOF; - woptarg = argv[woptind++]; - return 1; - } + if ((argv[woptind][0] != '-' || argv[woptind][1] == '\0')) + { + if (ordering == REQUIRE_ORDER) + return EOF; + woptarg = argv[woptind++]; + return 1; + } - /* We have found another option-ARGV-element. - Skip the initial punctuation. */ + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ - nextchar = (argv[woptind] + 1 - + (longopts != NULL && argv[woptind][1] == '-')); + nextchar = (argv[woptind] + 1 + + (longopts != NULL && argv[woptind][1] == '-')); } - /* Decode the current option-ARGV-element. */ + /* Decode the current option-ARGV-element. */ - /* Check whether the ARGV-element is a long option. + /* Check whether the ARGV-element is a long option. - If long_only and the ARGV-element has the form "-f", where f is - a valid short option, don't consider it an abbreviated form of - a long option that starts with f. Otherwise there would be no - way to give the -f short option. + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. - On the other hand, if there's a long option "fubar" and - the ARGV-element is "-fu", do consider that an abbreviation of - the long option, just like "--fu", and not "-f" with arg "u". + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". - This distinction seems to be the most useful approach. */ + This distinction seems to be the most useful approach. */ - if (longopts != NULL - && (argv[woptind][1] == '-' - || (long_only && (argv[woptind][2] || !my_index (optstring, argv[woptind][1]))))) + if (longopts != NULL + && (argv[woptind][1] == '-' + || (long_only && (argv[woptind][2] || !my_index (optstring, argv[woptind][1]))))) { - wchar_t *nameend; - const struct woption *p; - const struct woption *pfound = NULL; - int exact = 0; - int ambig = 0; - int indfound = 0; /* set to zero by Anton */ - int option_index; + wchar_t *nameend; + const struct woption *p; + const struct woption *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; /* set to zero by Anton */ + int option_index; - for (nameend = nextchar; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; - /* Test all long options for either exact match - or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!wcsncmp(p->name, nextchar, nameend - nextchar)) - { - if ((unsigned int)(nameend - nextchar) == (unsigned int)wcslen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second or later nonexact match found. */ - ambig = 1; - } + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!wcsncmp(p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int)(nameend - nextchar) == (unsigned int)wcslen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } - if (ambig && !exact) - { - if (wopterr) - fwprintf (stderr, L"%ls: option `%ls' is ambiguous\n", - argv[0], argv[woptind]); - nextchar += wcslen (nextchar); - woptind++; - return '?'; - } - - if (pfound != NULL) - { - option_index = indfound; - woptind++; - if (*nameend) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - woptarg = nameend + 1; - else + if (ambig && !exact) { - if (wopterr) - { - if (argv[woptind - 1][1] == '-') - /* --option */ - fwprintf (stderr, - L"%ls: option `--%ls' doesn't allow an argument\n", - argv[0], pfound->name); - else - /* +option or -option */ - fwprintf (stderr, - L"%ls: option `%lc%ls' doesn't allow an argument\n", - argv[0], argv[woptind - 1][0], pfound->name); - } - nextchar += wcslen (nextchar); - return '?'; + if (wopterr) + fwprintf (stderr, _(L"%ls: Option `%ls' is ambiguous\n"), + argv[0], argv[woptind]); + nextchar += wcslen (nextchar); + woptind++; + return '?'; } - } - else if (pfound->has_arg == 1) - { - if (woptind < argc) - woptarg = argv[woptind++]; - else - { - if (wopterr) - fwprintf (stderr, L"%ls: option `%ls' requires an argument\n", - argv[0], argv[woptind - 1]); - nextchar += wcslen (nextchar); - return optstring[0] == ':' ? ':' : '?'; - } - } - nextchar += wcslen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[woptind][1] == '-' - || my_index (optstring, *nextchar) == NULL) - { - if (wopterr) - { - if (argv[woptind][1] == '-') - /* --option */ - fwprintf (stderr, L"%ls: unrecognized option `--%ls'\n", - argv[0], nextchar); - else - /* +option or -option */ - fwprintf (stderr, L"%ls: unrecognized option `%lc%ls'\n", - argv[0], argv[woptind][0], nextchar); - } - nextchar = (wchar_t *) L""; - woptind++; - return '?'; - } + if (pfound != NULL) + { + option_index = indfound; + woptind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + woptarg = nameend + 1; + else + { + if (wopterr) + { + if (argv[woptind - 1][1] == '-') + /* --option */ + fwprintf (stderr, + _(L"%ls: Option `--%ls' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fwprintf (stderr, + _(L"%ls: Option `%lc%ls' doesn't allow an argument\n"), + argv[0], argv[woptind - 1][0], pfound->name); + } + nextchar += wcslen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (woptind < argc) + woptarg = argv[woptind++]; + else + { + if (wopterr) + fwprintf (stderr, _(L"%ls: Option `%ls' requires an argument\n"), + argv[0], argv[woptind - 1]); + nextchar += wcslen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += wcslen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[woptind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (wopterr) + { + if (argv[woptind][1] == '-') + /* --option */ + fwprintf (stderr, _(L"%ls: Unrecognized option `--%ls'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fwprintf (stderr, _(L"%ls: Unrecognized option `%lc%ls'\n"), + argv[0], argv[woptind][0], nextchar); + } + nextchar = (wchar_t *) L""; + woptind++; + return '?'; + } } - /* Look at and handle the next short option-character. */ + /* Look at and handle the next short option-character. */ - { - wchar_t c = *nextchar++; - wchar_t *temp = my_index (optstring, c); + { + wchar_t c = *nextchar++; + wchar_t *temp = my_index (optstring, c); - /* Increment `woptind' when we start to process its last character. */ - if (*nextchar == '\0') - ++woptind; + /* Increment `woptind' when we start to process its last character. */ + if (*nextchar == '\0') + ++woptind; - if (temp == NULL || c == ':') - { - 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); - } - woptopt = c; - return '?'; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - woptarg = nextchar; - woptind++; - } - else - woptarg = NULL; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - woptarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - woptind++; - } - else if (woptind == argc) - { - if (wopterr) - { - /* 1003.2 specifies the format of this message. */ - fwprintf (stderr, L"%ls: option requires an argument -- %lc\n", - argv[0], c); - } - woptopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } - else - /* We already incremented `woptind' once; - increment it again when taking next ARGV-elt as argument. */ - woptarg = argv[woptind++]; - nextchar = NULL; - } - } - return c; - } + if (temp == NULL || c == ':') + { + 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); + } + woptopt = c; + return '?'; + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + woptarg = nextchar; + woptind++; + } + else + woptarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + woptarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + woptind++; + } + else if (woptind == argc) + { + if (wopterr) + { + /* 1003.2 specifies the format of this message. */ + fwprintf (stderr, _(L"%ls: Option requires an argument -- %lc\n"), + argv[0], c); + } + woptopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `woptind' once; + increment it again when taking next ARGV-elt as argument. */ + woptarg = argv[woptind++]; + nextchar = NULL; + } + } + return c; + } } int wgetopt (argc, argv, optstring) - int argc; - wchar_t *const *argv; - const wchar_t *optstring; + int argc; + wchar_t *const *argv; + const wchar_t *optstring; { - return _wgetopt_internal (argc, argv, optstring, - (const struct woption *) 0, - (int *) 0, - 0); + return _wgetopt_internal (argc, argv, optstring, + (const struct woption *) 0, + (int *) 0, + 0); } int wgetopt_long (argc, argv, options, long_options, opt_index) int argc; - wchar_t *const *argv; - const wchar_t *options; - const struct woption *long_options; - int *opt_index; +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); } @@ -706,10 +716,10 @@ wgetopt_long (argc, argv, options, long_options, opt_index) int wgetopt_long_only (argc, argv, options, long_options, opt_index) int argc; - wchar_t *const *argv; - const wchar_t *options; - const struct woption *long_options; - int *opt_index; +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); }