mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-12 14:21:18 +08:00
Update.
1998-03-06 12:42 Ulrich Drepper <drepper@cygnus.com> * argp/argp.h (struct argp): Add new field domain. * argp/argp-help.c: Change all gettext calls to dgettext and use domain field from appropriate argp in call. * argp/argp-parse.c: Likewise.
This commit is contained in:
parent
ac16e90592
commit
9184d3db10
@ -1,3 +1,10 @@
|
||||
1998-03-06 12:42 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* argp/argp.h (struct argp): Add new field domain.
|
||||
* argp/argp-help.c: Change all gettext calls to dgettext and use
|
||||
domain field from appropriate argp in call.
|
||||
* argp/argp-parse.c: Likewise.
|
||||
|
||||
1998-03-06 11:35 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* posix/wordexp-test.c: Change testsuite so that it can run even
|
||||
|
102
argp/argp-help.c
102
argp/argp-help.c
@ -1,5 +1,5 @@
|
||||
/* Hierarchial argument parsing help output
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||
|
||||
@ -35,9 +35,8 @@
|
||||
When compiling libc, the _ macro is predefined. */
|
||||
#ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# define _(msgid) gettext (msgid)
|
||||
#else
|
||||
# define _(msgid) (msgid)
|
||||
# define dgettext(domain, msgid) (msgid)
|
||||
# define gettext(msgid) (msgid)
|
||||
#endif
|
||||
#endif
|
||||
@ -180,16 +179,18 @@ fill_in_uparams (const struct argp_state *state)
|
||||
{
|
||||
if (unspec && !un->is_bool)
|
||||
__argp_failure (state, 0, 0,
|
||||
_("%.*s: ARGP_HELP_FMT parameter requires a value"),
|
||||
(int)var_len, var);
|
||||
dgettext (state->root_argp->argp_domain, "\
|
||||
%.*s: ARGP_HELP_FMT parameter requires a value"),
|
||||
(int) var_len, var);
|
||||
else
|
||||
*(int *)((char *)&uparams + un->uparams_offs) = val;
|
||||
break;
|
||||
}
|
||||
if (! un->name)
|
||||
__argp_failure (state, 0, 0,
|
||||
_("%.*s: Unknown ARGP_HELP_FMT parameter"),
|
||||
(int)var_len, var);
|
||||
dgettext (state->root_argp->argp_domain, "\
|
||||
%.*s: Unknown ARGP_HELP_FMT parameter"),
|
||||
(int) var_len, var);
|
||||
|
||||
var = arg;
|
||||
if (*var == ',')
|
||||
@ -198,7 +199,8 @@ fill_in_uparams (const struct argp_state *state)
|
||||
else if (*var)
|
||||
{
|
||||
__argp_failure (state, 0, 0,
|
||||
_("Garbage in ARGP_HELP_FMT: %s"), var);
|
||||
dgettext (state->root_argp->argp_domain,
|
||||
"Garbage in ARGP_HELP_FMT: %s"), var);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -492,8 +494,8 @@ static inline int
|
||||
hol_entry_short_iterate (const struct hol_entry *entry,
|
||||
int (*func)(const struct argp_option *opt,
|
||||
const struct argp_option *real,
|
||||
void *cookie),
|
||||
void *cookie)
|
||||
const char *domain, void *cookie),
|
||||
const char *domain, void *cookie)
|
||||
{
|
||||
unsigned nopts;
|
||||
int val = 0;
|
||||
@ -506,7 +508,7 @@ hol_entry_short_iterate (const struct hol_entry *entry,
|
||||
if (!oalias (opt))
|
||||
real = opt;
|
||||
if (ovisible (opt))
|
||||
val = (*func)(opt, real, cookie);
|
||||
val = (*func)(opt, real, domain, cookie);
|
||||
so++;
|
||||
}
|
||||
|
||||
@ -517,8 +519,8 @@ static inline int
|
||||
hol_entry_long_iterate (const struct hol_entry *entry,
|
||||
int (*func)(const struct argp_option *opt,
|
||||
const struct argp_option *real,
|
||||
void *cookie),
|
||||
void *cookie)
|
||||
const char *domain, void *cookie),
|
||||
const char *domain, void *cookie)
|
||||
{
|
||||
unsigned nopts;
|
||||
int val = 0;
|
||||
@ -530,7 +532,7 @@ hol_entry_long_iterate (const struct hol_entry *entry,
|
||||
if (!oalias (opt))
|
||||
real = opt;
|
||||
if (ovisible (opt))
|
||||
val = (*func)(opt, real, cookie);
|
||||
val = (*func)(opt, real, domain, cookie);
|
||||
}
|
||||
|
||||
return val;
|
||||
@ -539,7 +541,7 @@ hol_entry_long_iterate (const struct hol_entry *entry,
|
||||
/* Iterator that returns true for the first short option. */
|
||||
static inline int
|
||||
until_short (const struct argp_option *opt, const struct argp_option *real,
|
||||
void *cookie)
|
||||
const char *domain, void *cookie)
|
||||
{
|
||||
return oshort (opt) ? opt->key : 0;
|
||||
}
|
||||
@ -548,7 +550,8 @@ until_short (const struct argp_option *opt, const struct argp_option *real,
|
||||
static char
|
||||
hol_entry_first_short (const struct hol_entry *entry)
|
||||
{
|
||||
return hol_entry_short_iterate (entry, until_short, 0);
|
||||
return hol_entry_short_iterate (entry, until_short,
|
||||
entry->argp->argp_domain, 0);
|
||||
}
|
||||
|
||||
/* Returns the first valid long option in ENTRY, or 0 if there is none. */
|
||||
@ -672,7 +675,8 @@ canon_doc_option (const char **name)
|
||||
/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
|
||||
listing. */
|
||||
static int
|
||||
hol_entry_cmp (const struct hol_entry *entry1, const struct hol_entry *entry2)
|
||||
hol_entry_cmp (const struct hol_entry *entry1,
|
||||
const struct hol_entry *entry2)
|
||||
{
|
||||
/* The group numbers by which the entries should be ordered; if either is
|
||||
in a cluster, then this is just the group within the cluster. */
|
||||
@ -867,13 +871,13 @@ space (argp_fmtstream_t stream, size_t ensure)
|
||||
optional argument. */
|
||||
static void
|
||||
arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,
|
||||
argp_fmtstream_t stream)
|
||||
const char *domain, argp_fmtstream_t stream)
|
||||
{
|
||||
if (real->arg)
|
||||
if (real->flags & OPTION_ARG_OPTIONAL)
|
||||
__argp_fmtstream_printf (stream, opt_fmt, gettext (real->arg));
|
||||
__argp_fmtstream_printf (stream, opt_fmt, dgettext (domain, real->arg));
|
||||
else
|
||||
__argp_fmtstream_printf (stream, req_fmt, gettext (real->arg));
|
||||
__argp_fmtstream_printf (stream, req_fmt, dgettext (domain, real->arg));
|
||||
}
|
||||
|
||||
/* Helper functions for hol_entry_help. */
|
||||
@ -934,7 +938,7 @@ static void
|
||||
print_header (const char *str, const struct argp *argp,
|
||||
struct pentry_state *pest)
|
||||
{
|
||||
const char *tstr = gettext (str);
|
||||
const char *tstr = dgettext (argp->argp_domain, str);
|
||||
const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state);
|
||||
|
||||
if (fstr)
|
||||
@ -1032,7 +1036,7 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
|
||||
__argp_fmtstream_putc (stream, '-');
|
||||
__argp_fmtstream_putc (stream, *so);
|
||||
if (!have_long_opt || uparams.dup_args)
|
||||
arg (real, " %s", "[%s]", stream);
|
||||
arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream);
|
||||
else if (real->arg)
|
||||
hhstate->suppressed_dup_arg = 1;
|
||||
}
|
||||
@ -1051,7 +1055,9 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
|
||||
/* Calling gettext here isn't quite right, since sorting will
|
||||
have been done on the original; but documentation options
|
||||
should be pretty rare anyway... */
|
||||
__argp_fmtstream_puts (stream, gettext (opt->name));
|
||||
__argp_fmtstream_puts (stream,
|
||||
dgettext (state->root_argp->argp_domain,
|
||||
opt->name));
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1066,7 +1072,8 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
|
||||
comma (uparams.long_opt_col, &pest);
|
||||
__argp_fmtstream_printf (stream, "--%s", opt->name);
|
||||
if (first_long_opt || uparams.dup_args)
|
||||
arg (real, "=%s", "[=%s]", stream);
|
||||
arg (real, "=%s", "[=%s]", state->root_argp->argp_domain,
|
||||
stream);
|
||||
else if (real->arg)
|
||||
hhstate->suppressed_dup_arg = 1;
|
||||
}
|
||||
@ -1085,7 +1092,8 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
|
||||
goto cleanup; /* Just return, after cleaning up. */
|
||||
else
|
||||
{
|
||||
const char *tstr = real->doc ? gettext (real->doc) : 0;
|
||||
const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain,
|
||||
real->doc) : 0;
|
||||
const char *fstr = filter_doc (tstr, real->key, entry->argp, state);
|
||||
if (fstr && *fstr)
|
||||
{
|
||||
@ -1132,7 +1140,7 @@ hol_help (struct hol *hol, const struct argp_state *state,
|
||||
|
||||
if (hhstate.suppressed_dup_arg && uparams.dup_args_note)
|
||||
{
|
||||
const char *tstr = _("\
|
||||
const char *tstr = dgettext (state->root_argp->argp_domain, "\
|
||||
Mandatory or optional arguments to long options are also mandatory or \
|
||||
optional for any corresponding short options.");
|
||||
const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
|
||||
@ -1155,7 +1163,7 @@ optional for any corresponding short options.");
|
||||
static int
|
||||
add_argless_short_opt (const struct argp_option *opt,
|
||||
const struct argp_option *real,
|
||||
void *cookie)
|
||||
const char *domain, void *cookie)
|
||||
{
|
||||
char **snao_end = cookie;
|
||||
if (!(opt->arg || real->arg)
|
||||
@ -1169,7 +1177,7 @@ add_argless_short_opt (const struct argp_option *opt,
|
||||
static int
|
||||
usage_argful_short_opt (const struct argp_option *opt,
|
||||
const struct argp_option *real,
|
||||
void *cookie)
|
||||
const char *domain, void *cookie)
|
||||
{
|
||||
argp_fmtstream_t stream = cookie;
|
||||
const char *arg = opt->arg;
|
||||
@ -1180,7 +1188,7 @@ usage_argful_short_opt (const struct argp_option *opt,
|
||||
|
||||
if (arg && !(flags & OPTION_NO_USAGE))
|
||||
{
|
||||
arg = gettext (arg);
|
||||
arg = dgettext (domain, arg);
|
||||
|
||||
if (flags & OPTION_ARG_OPTIONAL)
|
||||
__argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg);
|
||||
@ -1201,7 +1209,7 @@ usage_argful_short_opt (const struct argp_option *opt,
|
||||
static int
|
||||
usage_long_opt (const struct argp_option *opt,
|
||||
const struct argp_option *real,
|
||||
void *cookie)
|
||||
const char *domain, void *cookie)
|
||||
{
|
||||
argp_fmtstream_t stream = cookie;
|
||||
const char *arg = opt->arg;
|
||||
@ -1213,7 +1221,7 @@ usage_long_opt (const struct argp_option *opt,
|
||||
if (! (flags & OPTION_NO_USAGE))
|
||||
if (arg)
|
||||
{
|
||||
arg = gettext (arg);
|
||||
arg = dgettext (domain, arg);
|
||||
if (flags & OPTION_ARG_OPTIONAL)
|
||||
__argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg);
|
||||
else
|
||||
@ -1240,7 +1248,8 @@ hol_usage (struct hol *hol, argp_fmtstream_t stream)
|
||||
for (entry = hol->entries, nentries = hol->num_entries
|
||||
; nentries > 0
|
||||
; entry++, nentries--)
|
||||
hol_entry_short_iterate (entry, add_argless_short_opt, &snao_end);
|
||||
hol_entry_short_iterate (entry, add_argless_short_opt,
|
||||
entry->argp->argp_domain, &snao_end);
|
||||
if (snao_end > short_no_arg_opts)
|
||||
{
|
||||
*snao_end++ = 0;
|
||||
@ -1251,13 +1260,15 @@ hol_usage (struct hol *hol, argp_fmtstream_t stream)
|
||||
for (entry = hol->entries, nentries = hol->num_entries
|
||||
; nentries > 0
|
||||
; entry++, nentries--)
|
||||
hol_entry_short_iterate (entry, usage_argful_short_opt, stream);
|
||||
hol_entry_short_iterate (entry, usage_argful_short_opt,
|
||||
entry->argp->argp_domain, stream);
|
||||
|
||||
/* Finally, a list of long options (whew!). */
|
||||
for (entry = hol->entries, nentries = hol->num_entries
|
||||
; nentries > 0
|
||||
; entry++, nentries--)
|
||||
hol_entry_long_iterate (entry, usage_long_opt, stream);
|
||||
hol_entry_long_iterate (entry, usage_long_opt,
|
||||
entry->argp->argp_domain, stream);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1314,7 +1325,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
|
||||
char *our_level = *levels;
|
||||
int multiple = 0;
|
||||
const struct argp_child *child = argp->children;
|
||||
const char *tdoc = gettext (argp->args_doc), *nl = 0;
|
||||
const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0;
|
||||
const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
|
||||
|
||||
if (fdoc)
|
||||
@ -1379,7 +1390,7 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
|
||||
void *input = 0;
|
||||
int anything = 0;
|
||||
size_t inp_text_limit = 0;
|
||||
const char *doc = gettext (argp->doc);
|
||||
const char *doc = dgettext (argp->argp_domain, argp->doc);
|
||||
const struct argp_child *child = argp->children;
|
||||
|
||||
if (doc)
|
||||
@ -1503,9 +1514,14 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
||||
int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
|
||||
char *levels = pattern_levels;
|
||||
|
||||
__argp_fmtstream_printf (fs, "%s %s",
|
||||
_(first_pattern ? "Usage:" : " or: "),
|
||||
name);
|
||||
if (first_pattern)
|
||||
__argp_fmtstream_printf (fs, "%s %s",
|
||||
dgettext (argp->argp_domain, "Usage:"),
|
||||
name);
|
||||
else
|
||||
__argp_fmtstream_printf (fs, "%s %s",
|
||||
dgettext (argp->argp_domain, " or: "),
|
||||
name);
|
||||
|
||||
/* We set the lmargin as well as the wmargin, because hol_usage
|
||||
manually wraps options with newline to avoid annoying breaks. */
|
||||
@ -1515,7 +1531,8 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
||||
/* Just show where the options go. */
|
||||
{
|
||||
if (hol->num_entries > 0)
|
||||
__argp_fmtstream_puts (fs, _(" [OPTION...]"));
|
||||
__argp_fmtstream_puts (fs, dgettext (argp->argp_domain,
|
||||
" [OPTION...]"));
|
||||
}
|
||||
else
|
||||
/* Actually print the options. */
|
||||
@ -1542,7 +1559,7 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
||||
|
||||
if (flags & ARGP_HELP_SEE)
|
||||
{
|
||||
__argp_fmtstream_printf (fs, _("\
|
||||
__argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
|
||||
Try `%s --help' or `%s --usage' for more information.\n"),
|
||||
name, name);
|
||||
anything = 1;
|
||||
@ -1569,7 +1586,8 @@ Try `%s --help' or `%s --usage' for more information.\n"),
|
||||
{
|
||||
if (anything)
|
||||
__argp_fmtstream_putc (fs, '\n');
|
||||
__argp_fmtstream_printf (fs, _("Report bugs to %s.\n"),
|
||||
__argp_fmtstream_printf (fs, dgettext (argp->argp_domain,
|
||||
"Report bugs to %s.\n"),
|
||||
argp_program_bug_address);
|
||||
anything = 1;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Hierarchial argument parsing, layered over getopt
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||
|
||||
@ -33,9 +33,8 @@
|
||||
When compiling libc, the _ macro is predefined. */
|
||||
#ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# define _(msgid) gettext (msgid)
|
||||
#else
|
||||
# define _(msgid) (msgid)
|
||||
# define dgettext(domain, msgid) (msgid)
|
||||
# define gettext(msgid) (msgid)
|
||||
#endif
|
||||
#define N_(msgid) (msgid)
|
||||
@ -161,7 +160,8 @@ argp_version_parser (int key, char *arg, struct argp_state *state)
|
||||
else if (argp_program_version)
|
||||
fprintf (state->out_stream, "%s\n", argp_program_version);
|
||||
else
|
||||
__argp_error (state, _("(PROGRAM ERROR) No version known!?"));
|
||||
__argp_error (state, dgettext (state->root_argp->argp_domain,
|
||||
"(PROGRAM ERROR) No version known!?"));
|
||||
if (! (state->flags & ARGP_NO_EXIT))
|
||||
exit (0);
|
||||
break;
|
||||
@ -634,7 +634,8 @@ parser_finalize (struct parser *parser,
|
||||
{
|
||||
if (!(parser->state.flags & ARGP_NO_ERRS) && parser->state.err_stream)
|
||||
fprintf (parser->state.err_stream,
|
||||
_("%s: Too many arguments\n"), parser->state.name);
|
||||
dgettext (parser->argp->argp_domain,
|
||||
"%s: Too many arguments\n"), parser->state.name);
|
||||
err = EBADKEY;
|
||||
}
|
||||
|
||||
@ -775,7 +776,8 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
|
||||
static const char bad_key_err[] =
|
||||
N_("(PROGRAM ERROR) Option should have been recognized!?");
|
||||
if (group_key == 0)
|
||||
__argp_error (&parser->state, "-%c: %s", opt, _(bad_key_err));
|
||||
__argp_error (&parser->state, "-%c: %s", opt,
|
||||
dgettext (parser->argp->argp_domain, bad_key_err));
|
||||
else
|
||||
{
|
||||
struct option *long_opt = parser->long_opts;
|
||||
@ -783,9 +785,9 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
|
||||
long_opt++;
|
||||
__argp_error (&parser->state, "--%s: %s",
|
||||
long_opt->name ? long_opt->name : "???",
|
||||
_(bad_key_err));
|
||||
dgettext (parser->argp->argp_domain, bad_key_err));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -867,7 +869,7 @@ parser_parse_next (struct parser *parser, int *arg_ebadkey)
|
||||
err = parser_parse_arg (parser, optarg);
|
||||
else
|
||||
err = parser_parse_opt (parser, opt, optarg);
|
||||
|
||||
|
||||
if (err == EBADKEY)
|
||||
*arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Hierarchial argument parsing, layered over getopt.
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||
|
||||
@ -238,6 +238,11 @@ struct argp
|
||||
that should be done by the filter function. INPUT is either the input
|
||||
supplied to argp_parse, or NULL, if argp_help was called directly. */
|
||||
char *(*help_filter)(int __key, __const char *__text, void *__input);
|
||||
|
||||
/* If non-zero the strings used in the argp library are translated using
|
||||
the domain described by this string. Otherwise the currently installed
|
||||
default domain is used. */
|
||||
const char *argp_domain;
|
||||
};
|
||||
|
||||
/* Possible KEY arguments to a help filter function. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user