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:
Ulrich Drepper 1998-03-06 12:45:08 +00:00
parent ac16e90592
commit 9184d3db10
4 changed files with 84 additions and 52 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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. */