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( 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) )

126
wgetopt.c
View File

@ -31,23 +31,23 @@
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94
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,32 +139,32 @@ 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
{
@ -174,6 +174,16 @@ static enum
/* 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.
@ -385,11 +395,11 @@ _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;
wchar_t *const *argv;
const wchar_t *optstring;
const struct woption *longopts;
int *longind;
int long_only;
{
woptarg = NULL;
@ -524,7 +534,7 @@ _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
if (ambig && !exact)
{
if (wopterr)
fwprintf (stderr, L"%ls: option `%ls' is ambiguous\n",
fwprintf (stderr, _(L"%ls: Option `%ls' is ambiguous\n"),
argv[0], argv[woptind]);
nextchar += wcslen (nextchar);
woptind++;
@ -548,12 +558,12 @@ _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
if (argv[woptind - 1][1] == '-')
/* --option */
fwprintf (stderr,
L"%ls: option `--%ls' doesn't allow an argument\n",
_(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",
_(L"%ls: Option `%lc%ls' doesn't allow an argument\n"),
argv[0], argv[woptind - 1][0], pfound->name);
}
nextchar += wcslen (nextchar);
@ -567,7 +577,7 @@ _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
else
{
if (wopterr)
fwprintf (stderr, L"%ls: option `%ls' requires an argument\n",
fwprintf (stderr, _(L"%ls: Option `%ls' requires an argument\n"),
argv[0], argv[woptind - 1]);
nextchar += wcslen (nextchar);
return optstring[0] == ':' ? ':' : '?';
@ -595,11 +605,11 @@ _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
{
if (argv[woptind][1] == '-')
/* --option */
fwprintf (stderr, L"%ls: unrecognized option `--%ls'\n",
fwprintf (stderr, _(L"%ls: Unrecognized option `--%ls'\n"),
argv[0], nextchar);
else
/* +option or -option */
fwprintf (stderr, L"%ls: unrecognized option `%lc%ls'\n",
fwprintf (stderr, _(L"%ls: Unrecognized option `%lc%ls'\n"),
argv[0], argv[woptind][0], nextchar);
}
nextchar = (wchar_t *) L"";
@ -624,9 +634,9 @@ _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
{
if (posixly_correct)
/* 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
fwprintf (stderr, L"%ls: invalid option -- %lc\n", argv[0], c);
fwprintf (stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c);
}
woptopt = c;
return '?';
@ -660,7 +670,7 @@ _wgetopt_internal (argc, argv, optstring, longopts, longind, long_only)
if (wopterr)
{
/* 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);
}
woptopt = c;
@ -695,10 +705,10 @@ wgetopt (argc, argv, optstring)
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);
}