Add translation support to wgetopt library

darcs-hash:20060128021740-ac50b-f670531d3d79cb8070756669f83f4e8b25233a0a.gz
This commit is contained in:
axel 2006-01-28 12:17:40 +10:00
parent 1977d3beb3
commit ea81321ccb
2 changed files with 392 additions and 379 deletions

View File

@ -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( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc )
AC_CHECK_FUNCS( wcstol dcgettext ) 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 # 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) ) AC_CHECK_FUNC(gettext, AC_SUBST(HAVE_GETTEXT,1), AC_SUBST(HAVE_GETTEXT,0) )

768
wgetopt.c
View File

@ -29,25 +29,25 @@
before changing it! before changing it!
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94 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 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 C library, however. The master source lives in /gd/gnu/lib.
The GNU C Library is free software; you can redistribute it and/or 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 modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version. License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful, The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details. Library General Public License for more details.
You should have received a copy of the GNU Library General Public 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 License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include "config.h" #include "config.h"
@ -139,41 +139,51 @@ int woptopt = '?';
/* Describe how to deal with options that follow non-option ARGV-elements. /* Describe how to deal with options that follow non-option ARGV-elements.
If the caller did not specify anything, If the caller did not specify anything,
the default is REQUIRE_ORDER if the environment variable the default is REQUIRE_ORDER if the environment variable
POSIXLY_CORRECT is defined, PERMUTE otherwise. POSIXLY_CORRECT is defined, PERMUTE otherwise.
REQUIRE_ORDER means don't recognize them as options; REQUIRE_ORDER means don't recognize them as options;
stop option processing when the first non-option is seen. stop option processing when the first non-option is seen.
This is what Unix does. This is what Unix does.
This mode of operation is selected by either setting the environment This mode of operation is selected by either setting the environment
variable POSIXLY_CORRECT, or using `+' as the first character variable POSIXLY_CORRECT, or using `+' as the first character
of the list of option characters. of the list of option characters.
PERMUTE is the default. We permute the contents of ARGV as we scan, 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 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 to be given in any order, even with programs that were not written to
expect this. expect this.
RETURN_IN_ORDER is an option available to programs that were written 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 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 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. as if it were the argument of an option with character code 1.
Using `-' as the first character of the list of option characters Using `-' as the first character of the list of option characters
selects this mode of operation. selects this mode of operation.
The special argument `--' forces an end of option-scanning regardless The special argument `--' forces an end of option-scanning regardless
of the value of `ordering'. In the case of RETURN_IN_ORDER, only of the value of `ordering'. In the case of RETURN_IN_ORDER, only
`--' can cause `getopt' to return EOF with `woptind' != ARGC. */ `--' can cause `getopt' to return EOF with `woptind' != ARGC. */
static enum static enum
{ {
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
} ordering; } ordering;
/* Value of POSIXLY_CORRECT environment variable. */ /* Value of POSIXLY_CORRECT environment variable. */
static char *posixly_correct; 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__ #ifdef __GNU_LIBRARY__
/* We want to avoid inclusion of string.h with non-GNU libraries /* We want to avoid inclusion of string.h with non-GNU libraries
because there are many ways it can cause trouble. because there are many ways it can cause trouble.
@ -190,16 +200,16 @@ char *getenv ();
static wchar_t * static wchar_t *
my_index (str, chr) my_index (str, chr)
const wchar_t *str; const wchar_t *str;
int chr; int chr;
{ {
while (*str) while (*str)
{ {
if (*str == chr) if (*str == chr)
return (wchar_t *) str; return (wchar_t *) str;
str++; str++;
} }
return 0; return 0;
} }
/* If using GCC, we can safely declare strlen this way. /* If using GCC, we can safely declare strlen this way.
@ -236,94 +246,94 @@ static int last_nonopt;
static void static void
exchange (argv) exchange (argv)
wchar_t **argv; wchar_t **argv;
{ {
int bottom = first_nonopt; int bottom = first_nonopt;
int middle = last_nonopt; int middle = last_nonopt;
int top = woptind; int top = woptind;
wchar_t *tem; wchar_t *tem;
/* Exchange the shorter segment with the far end of the longer segment. /* Exchange the shorter segment with the far end of the longer segment.
That puts the shorter segment into the right place. That puts the shorter segment into the right place.
It leaves the longer segment in the right place overall, It leaves the longer segment in the right place overall,
but it consists of two parts that need to be swapped next. */ 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) if (top - middle > middle - bottom)
{ {
/* Bottom segment is the short one. */ /* Bottom segment is the short one. */
int len = middle - bottom; int len = middle - bottom;
register int i; register int i;
/* Swap it with the top part of the top segment. */ /* Swap it with the top part of the top segment. */
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
tem = argv[bottom + i]; tem = argv[bottom + i];
argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[bottom + i] = argv[top - (middle - bottom) + i];
argv[top - (middle - bottom) + i] = tem; argv[top - (middle - bottom) + i] = tem;
} }
/* Exclude the moved bottom segment from further swapping. */ /* Exclude the moved bottom segment from further swapping. */
top -= len; top -= len;
} }
else else
{ {
/* Top segment is the short one. */ /* Top segment is the short one. */
int len = top - middle; int len = top - middle;
register int i; register int i;
/* Swap it with the bottom part of the bottom segment. */ /* Swap it with the bottom part of the bottom segment. */
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
tem = argv[bottom + i]; tem = argv[bottom + i];
argv[bottom + i] = argv[middle + i]; argv[bottom + i] = argv[middle + i];
argv[middle + i] = tem; argv[middle + i] = tem;
} }
/* Exclude the moved top segment from further swapping. */ /* Exclude the moved top segment from further swapping. */
bottom += len; 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); first_nonopt += (woptind - last_nonopt);
last_nonopt = woptind; last_nonopt = woptind;
} }
/* Initialize the internal data when the first call is made. */ /* Initialize the internal data when the first call is made. */
static const wchar_t * static const wchar_t *
_wgetopt_initialize (optstring) _wgetopt_initialize (optstring)
const wchar_t *optstring; 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
non-option ARGV-elements is empty. */ 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; ordering = RETURN_IN_ORDER;
++optstring; ++optstring;
} }
else if (optstring[0] == '+') else if (optstring[0] == '+')
{ {
ordering = REQUIRE_ORDER; ordering = REQUIRE_ORDER;
++optstring; ++optstring;
} }
else if (posixly_correct != NULL) else if (posixly_correct != NULL)
ordering = REQUIRE_ORDER; ordering = REQUIRE_ORDER;
else else
ordering = PERMUTE; ordering = PERMUTE;
return optstring; return optstring;
} }
/* Scan elements of ARGV (whose length is ARGC) for option characters /* Scan elements of ARGV (whose length is ARGC) for option characters
@ -384,321 +394,321 @@ _wgetopt_initialize (optstring)
int int
_wgetopt_internal (argc, argv, optstring, longopts, longind, long_only) _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
int argc; int argc;
wchar_t *const *argv; wchar_t *const *argv;
const wchar_t *optstring; const wchar_t *optstring;
const struct woption *longopts; const struct woption *longopts;
int *longind; int *longind;
int long_only; int long_only;
{ {
woptarg = NULL; woptarg = NULL;
if (woptind == 0) if (woptind == 0)
optstring = _wgetopt_initialize (optstring); 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 (ordering == PERMUTE)
{ {
/* If we have just processed some options following some non-options, /* If we have just processed some options following some non-options,
exchange them so that the options come first. */ exchange them so that the options come first. */
if (first_nonopt != last_nonopt && last_nonopt != woptind) if (first_nonopt != last_nonopt && last_nonopt != woptind)
exchange ((wchar_t **) argv); exchange ((wchar_t **) argv);
else if (last_nonopt != woptind) else if (last_nonopt != woptind)
first_nonopt = woptind; first_nonopt = woptind;
/* Skip any additional non-options /* Skip any additional non-options
and extend the range of non-options previously skipped. */ and extend the range of non-options previously skipped. */
while (woptind < argc while (woptind < argc
&& (argv[woptind][0] != '-' || argv[woptind][1] == '\0')) && (argv[woptind][0] != '-' || argv[woptind][1] == '\0'))
woptind++; woptind++;
last_nonopt = woptind; last_nonopt = woptind;
} }
/* The special ARGV-element `--' means premature end of options. /* The special ARGV-element `--' means premature end of options.
Skip it like a null option, Skip it like a null option,
then exchange with previous non-options as if it were an option, then exchange with previous non-options as if it were an option,
then skip everything else like a non-option. */ then skip everything else like a non-option. */
if (woptind != argc && !wcscmp (argv[woptind], L"--")) if (woptind != argc && !wcscmp (argv[woptind], L"--"))
{ {
woptind++; woptind++;
if (first_nonopt != last_nonopt && last_nonopt != woptind) if (first_nonopt != last_nonopt && last_nonopt != woptind)
exchange ((wchar_t **) argv); exchange ((wchar_t **) argv);
else if (first_nonopt == last_nonopt) else if (first_nonopt == last_nonopt)
first_nonopt = woptind; first_nonopt = woptind;
last_nonopt = argc; last_nonopt = argc;
woptind = argc; woptind = argc;
} }
/* If we have done all the ARGV-elements, stop the scan /* If we have done all the ARGV-elements, stop the scan
and back over any non-options that we skipped and permuted. */ and back over any non-options that we skipped and permuted. */
if (woptind == argc) if (woptind == argc)
{ {
/* Set the next-arg-index to point at the non-options /* Set the next-arg-index to point at the non-options
that we previously skipped, so the caller will digest them. */ that we previously skipped, so the caller will digest them. */
if (first_nonopt != last_nonopt) if (first_nonopt != last_nonopt)
woptind = first_nonopt; woptind = first_nonopt;
return EOF; return EOF;
} }
/* If we have come to a non-option and did not permute it, /* 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. */ either stop the scan or describe it to the caller and pass it by. */
if ((argv[woptind][0] != '-' || argv[woptind][1] == '\0')) if ((argv[woptind][0] != '-' || argv[woptind][1] == '\0'))
{ {
if (ordering == REQUIRE_ORDER) if (ordering == REQUIRE_ORDER)
return EOF; return EOF;
woptarg = argv[woptind++]; woptarg = argv[woptind++];
return 1; return 1;
} }
/* We have found another option-ARGV-element. /* We have found another option-ARGV-element.
Skip the initial punctuation. */ Skip the initial punctuation. */
nextchar = (argv[woptind] + 1 nextchar = (argv[woptind] + 1
+ (longopts != NULL && 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 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 valid short option, don't consider it an abbreviated form of
a long option that starts with f. Otherwise there would be no a long option that starts with f. Otherwise there would be no
way to give the -f short option. way to give the -f short option.
On the other hand, if there's a long option "fubar" and On the other hand, if there's a long option "fubar" and
the ARGV-element is "-fu", do consider that an abbreviation of the ARGV-element is "-fu", do consider that an abbreviation of
the long option, just like "--fu", and not "-f" with arg "u". 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 if (longopts != NULL
&& (argv[woptind][1] == '-' && (argv[woptind][1] == '-'
|| (long_only && (argv[woptind][2] || !my_index (optstring, argv[woptind][1]))))) || (long_only && (argv[woptind][2] || !my_index (optstring, argv[woptind][1])))))
{ {
wchar_t *nameend; wchar_t *nameend;
const struct woption *p; const struct woption *p;
const struct woption *pfound = NULL; const struct woption *pfound = NULL;
int exact = 0; int exact = 0;
int ambig = 0; int ambig = 0;
int indfound = 0; /* set to zero by Anton */ int indfound = 0; /* set to zero by Anton */
int option_index; int option_index;
for (nameend = nextchar; *nameend && *nameend != '='; nameend++) for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
/* Do nothing. */ ; /* Do nothing. */ ;
/* Test all long options for either exact match /* Test all long options for either exact match
or abbreviated matches. */ or abbreviated matches. */
for (p = longopts, option_index = 0; p->name; p++, option_index++) for (p = longopts, option_index = 0; p->name; p++, option_index++)
if (!wcsncmp(p->name, nextchar, nameend - nextchar)) if (!wcsncmp(p->name, nextchar, nameend - nextchar))
{ {
if ((unsigned int)(nameend - nextchar) == (unsigned int)wcslen (p->name)) if ((unsigned int)(nameend - nextchar) == (unsigned int)wcslen (p->name))
{ {
/* Exact match found. */ /* Exact match found. */
pfound = p; pfound = p;
indfound = option_index; indfound = option_index;
exact = 1; exact = 1;
break; break;
} }
else if (pfound == NULL) else if (pfound == NULL)
{ {
/* First nonexact match found. */ /* First nonexact match found. */
pfound = p; pfound = p;
indfound = option_index; indfound = option_index;
} }
else else
/* Second or later nonexact match found. */ /* Second or later nonexact match found. */
ambig = 1; ambig = 1;
} }
if (ambig && !exact) 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 (wopterr) if (wopterr)
{ fwprintf (stderr, _(L"%ls: Option `%ls' is ambiguous\n"),
if (argv[woptind - 1][1] == '-') argv[0], argv[woptind]);
/* --option */ nextchar += wcslen (nextchar);
fwprintf (stderr, woptind++;
L"%ls: option `--%ls' doesn't allow an argument\n", return '?';
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, if (pfound != NULL)
or the option starts with '--' or is not a valid short {
option, then it's an error. option_index = indfound;
Otherwise interpret it as a short option. */ woptind++;
if (!long_only || argv[woptind][1] == '-' if (*nameend)
|| my_index (optstring, *nextchar) == NULL) {
{ /* Don't test has_arg with >, because some C compilers don't
if (wopterr) allow it to be used on enums. */
{ if (pfound->has_arg)
if (argv[woptind][1] == '-') woptarg = nameend + 1;
/* --option */ else
fwprintf (stderr, L"%ls: unrecognized option `--%ls'\n", {
argv[0], nextchar); if (wopterr)
else {
/* +option or -option */ if (argv[woptind - 1][1] == '-')
fwprintf (stderr, L"%ls: unrecognized option `%lc%ls'\n", /* --option */
argv[0], argv[woptind][0], nextchar); fwprintf (stderr,
} _(L"%ls: Option `--%ls' doesn't allow an argument\n"),
nextchar = (wchar_t *) L""; argv[0], pfound->name);
woptind++; else
return '?'; /* +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 c = *nextchar++;
wchar_t *temp = my_index (optstring, c); wchar_t *temp = my_index (optstring, c);
/* Increment `woptind' when we start to process its last character. */ /* Increment `woptind' when we start to process its last character. */
if (*nextchar == '\0') if (*nextchar == '\0')
++woptind; ++woptind;
if (temp == NULL || c == ':') if (temp == NULL || c == ':')
{ {
if (wopterr) if (wopterr)
{ {
if (posixly_correct) if (posixly_correct)
/* 1003.2 specifies the format of this message. */ /* 1003.2 specifies the format of this message. */
fwprintf (stderr, L"%ls: illegal option -- %lc\n", argv[0], c); fwprintf (stderr, _(L"%ls: Illegal option -- %lc\n"), argv[0], c);
else 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; woptopt = c;
return '?'; return '?';
} }
if (temp[1] == ':') if (temp[1] == ':')
{ {
if (temp[2] == ':') if (temp[2] == ':')
{ {
/* This is an option that accepts an argument optionally. */ /* This is an option that accepts an argument optionally. */
if (*nextchar != '\0') if (*nextchar != '\0')
{ {
woptarg = nextchar; woptarg = nextchar;
woptind++; woptind++;
} }
else else
woptarg = NULL; woptarg = NULL;
nextchar = NULL; nextchar = NULL;
} }
else else
{ {
/* This is an option that requires an argument. */ /* This is an option that requires an argument. */
if (*nextchar != '\0') if (*nextchar != '\0')
{ {
woptarg = nextchar; woptarg = nextchar;
/* If we end this ARGV-element by taking the rest as an arg, /* If we end this ARGV-element by taking the rest as an arg,
we must advance to the next element now. */ we must advance to the next element now. */
woptind++; woptind++;
} }
else if (woptind == argc) else if (woptind == argc)
{ {
if (wopterr) if (wopterr)
{ {
/* 1003.2 specifies the format of this message. */ /* 1003.2 specifies the format of this message. */
fwprintf (stderr, L"%ls: option requires an argument -- %lc\n", fwprintf (stderr, _(L"%ls: Option requires an argument -- %lc\n"),
argv[0], c); argv[0], c);
} }
woptopt = c; woptopt = c;
if (optstring[0] == ':') if (optstring[0] == ':')
c = ':'; c = ':';
else else
c = '?'; c = '?';
} }
else else
/* We already incremented `woptind' once; /* We already incremented `woptind' once;
increment it again when taking next ARGV-elt as argument. */ increment it again when taking next ARGV-elt as argument. */
woptarg = argv[woptind++]; woptarg = argv[woptind++];
nextchar = NULL; nextchar = NULL;
} }
} }
return c; return c;
} }
} }
int int
wgetopt (argc, argv, optstring) wgetopt (argc, argv, optstring)
int argc; int argc;
wchar_t *const *argv; wchar_t *const *argv;
const wchar_t *optstring; const wchar_t *optstring;
{ {
return _wgetopt_internal (argc, argv, optstring, return _wgetopt_internal (argc, argv, optstring,
(const struct woption *) 0, (const struct woption *) 0,
(int *) 0, (int *) 0,
0); 0);
} }
int int
wgetopt_long (argc, argv, options, long_options, opt_index) wgetopt_long (argc, argv, options, long_options, opt_index)
int argc; int argc;
wchar_t *const *argv; wchar_t *const *argv;
const wchar_t *options; const wchar_t *options;
const struct woption *long_options; const struct woption *long_options;
int *opt_index; 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);
} }
@ -706,10 +716,10 @@ wgetopt_long (argc, argv, options, long_options, opt_index)
int int
wgetopt_long_only (argc, argv, options, long_options, opt_index) wgetopt_long_only (argc, argv, options, long_options, opt_index)
int argc; int argc;
wchar_t *const *argv; wchar_t *const *argv;
const wchar_t *options; const wchar_t *options;
const struct woption *long_options; const struct woption *long_options;
int *opt_index; 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);
} }