diff options
Diffstat (limited to 'argp')
-rw-r--r-- | argp/Makefile | 6 | ||||
-rw-r--r-- | argp/argp-eexst.c | 2 | ||||
-rw-r--r-- | argp/argp-fmtstream.c | 42 | ||||
-rw-r--r-- | argp/argp-fmtstream.h | 4 | ||||
-rw-r--r-- | argp/argp-fs-xinl.c | 2 | ||||
-rw-r--r-- | argp/argp-help.c | 189 | ||||
-rw-r--r-- | argp/argp-xinl.c | 2 | ||||
-rw-r--r-- | argp/argp.h | 7 | ||||
-rw-r--r-- | argp/bug-argp1.c | 26 | ||||
-rw-r--r-- | argp/tst-argp2.c | 101 |
10 files changed, 137 insertions, 244 deletions
diff --git a/argp/Makefile b/argp/Makefile index b8c9fca0fb..a68ca1bee3 100644 --- a/argp/Makefile +++ b/argp/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1997, 2002, 2003, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) 1997, 2002, 2003 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -26,12 +26,10 @@ distribute = argp-fmtstream.h argp-namefrob.h routines = $(addprefix argp-, ba fmtstream fs-xinl help parse pv \ pvh xinl eexst) -tests = argp-test tst-argp1 bug-argp1 tst-argp2 +tests = argp-test tst-argp1 CFLAGS-argp-help.c = $(uses-callbacks) -fexceptions CFLAGS-argp-parse.c = $(uses-callbacks) CFLAGS-argp-fmtstream.c = -fexceptions -bug-argp1-ARGS = -- --help - include ../Rules diff --git a/argp/argp-eexst.c b/argp/argp-eexst.c index 84df089e03..151f89a1c0 100644 --- a/argp/argp-eexst.c +++ b/argp/argp-eexst.c @@ -19,7 +19,7 @@ 02111-1307 USA. */ #ifdef HAVE_CONFIG_H -# include <config.h> +#include <config.h> #endif #include <sysexits.h> diff --git a/argp/argp-fmtstream.c b/argp/argp-fmtstream.c index 55ac7f9183..215160bdcd 100644 --- a/argp/argp-fmtstream.c +++ b/argp/argp-fmtstream.c @@ -1,5 +1,5 @@ /* Word-wrapping and line-truncating streams - Copyright (C) 1997-1999,2001,2002,2003,2005 Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2001,2002,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Miles Bader <miles@gnu.ai.mit.edu>. @@ -22,7 +22,7 @@ don't have that. */ #ifdef HAVE_CONFIG_H -# include <config.h> +#include <config.h> #endif #include <stdlib.h> @@ -102,10 +102,11 @@ __argp_fmtstream_free (argp_fmtstream_t fs) if (fs->p > fs->buf) { #ifdef USE_IN_LIBIO - __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); -#else - fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); + if (_IO_fwide (fs->stream, 0) > 0) + __fwprintf (fs->stream, L"%.*s", (int) (fs->p - fs->buf), fs->buf); + else #endif + fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); } free (fs->buf); free (fs); @@ -290,15 +291,17 @@ __argp_fmtstream_update (argp_fmtstream_t fs) else /* Output the first line so we can use the space. */ { -#ifdef _LIBC - __fxprintf (fs->stream, "%.*s\n", - (int) (nl - fs->buf), fs->buf); -#else - if (nl > fs->buf) - fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); - putc_unlocked ('\n', fs->stream); +#ifdef USE_IN_LIBIO + if (_IO_fwide (fs->stream, 0) > 0) + __fwprintf (fs->stream, L"%.*s\n", + (int) (nl - fs->buf), fs->buf); + else #endif - + { + if (nl > fs->buf) + fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); + putc_unlocked ('\n', fs->stream); + } len += buf - fs->buf; nl = buf = fs->buf; } @@ -357,12 +360,15 @@ __argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount) /* Flush FS's buffer. */ __argp_fmtstream_update (fs); -#ifdef _LIBC - __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); - wrote = fs->p - fs->buf; -#else - wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); +#ifdef USE_IN_LIBIO + if (_IO_fwide (fs->stream, 0) > 0) + { + __fwprintf (fs->stream, L"%.*s", (int) (fs->p - fs->buf), fs->buf); + wrote = fs->p - fs->buf; + } + else #endif + wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); if (wrote == fs->p - fs->buf) { fs->p = fs->buf; diff --git a/argp/argp-fmtstream.h b/argp/argp-fmtstream.h index f94207a20b..5d0d5eac92 100644 --- a/argp/argp-fmtstream.h +++ b/argp/argp-fmtstream.h @@ -26,6 +26,10 @@ #ifndef _ARGP_FMTSTREAM_H #define _ARGP_FMTSTREAM_H +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + #include <stdio.h> #include <string.h> #include <unistd.h> diff --git a/argp/argp-fs-xinl.c b/argp/argp-fs-xinl.c index 442ffa05d1..3cf1f9827d 100644 --- a/argp/argp-fs-xinl.c +++ b/argp/argp-fs-xinl.c @@ -19,7 +19,7 @@ 02111-1307 USA. */ #ifdef HAVE_CONFIG_H -# include <config.h> +#include <config.h> #endif #define ARGP_FS_EI diff --git a/argp/argp-help.c b/argp/argp-help.c index c12b10e235..67018709d3 100644 --- a/argp/argp-help.c +++ b/argp/argp-help.c @@ -1,6 +1,5 @@ /* Hierarchial argument parsing help output - Copyright (C) 1995-2003, 2004, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Miles Bader <miles@gnu.ai.mit.edu>. @@ -49,8 +48,7 @@ char *alloca (); #include <stdarg.h> #include <ctype.h> #include <limits.h> -#ifdef _LIBC -# include <../libio/libioP.h> +#ifdef USE_IN_LIBIO # include <wchar.h> #endif @@ -129,37 +127,40 @@ struct uparams int header_col; int usage_indent; int rmargin; + + int valid; /* True when the values in here are valid. */ }; /* This is a global variable, as user options are only ever read once. */ static struct uparams uparams = { DUP_ARGS, DUP_ARGS_NOTE, SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL, - USAGE_INDENT, RMARGIN + USAGE_INDENT, RMARGIN, + 0 }; /* A particular uparam, and what the user name is. */ struct uparam_name { - const char name[14]; /* User name. */ - bool is_bool; /* Whether it's `boolean'. */ - uint8_t uparams_offs; /* Location of the (int) field in UPARAMS. */ + const char *name; /* User name. */ + int is_bool; /* Whether it's `boolean'. */ + size_t uparams_offs; /* Location of the (int) field in UPARAMS. */ }; /* The name-field mappings we know about. */ static const struct uparam_name uparam_names[] = { - { "dup-args", true, offsetof (struct uparams, dup_args) }, - { "dup-args-note", true, offsetof (struct uparams, dup_args_note) }, - { "short-opt-col", false, offsetof (struct uparams, short_opt_col) }, - { "long-opt-col", false, offsetof (struct uparams, long_opt_col) }, - { "doc-opt-col", false, offsetof (struct uparams, doc_opt_col) }, - { "opt-doc-col", false, offsetof (struct uparams, opt_doc_col) }, - { "header-col", false, offsetof (struct uparams, header_col) }, - { "usage-indent", false, offsetof (struct uparams, usage_indent) }, - { "rmargin", false, offsetof (struct uparams, rmargin) } + { "dup-args", 1, offsetof (struct uparams, dup_args) }, + { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) }, + { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) }, + { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) }, + { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) }, + { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) }, + { "header-col", 0, offsetof (struct uparams, header_col) }, + { "usage-indent", 0, offsetof (struct uparams, usage_indent) }, + { "rmargin", 0, offsetof (struct uparams, rmargin) }, + { 0 } }; -#define nuparam_names (sizeof (uparam_names) / sizeof (uparam_names[0])) /* Read user options from the environment, and fill in UPARAMS appropiately. */ static void @@ -215,27 +216,22 @@ fill_in_uparams (const struct argp_state *state) SKIPWS (arg); } - un = uparam_names; - size_t u; - for (u = 0; u < nuparam_names; ++un, ++u) + for (un = uparam_names; un->name; un++) if (strlen (un->name) == var_len && strncmp (var, un->name, var_len) == 0) { if (unspec && !un->is_bool) __argp_failure (state, 0, 0, - dgettext (state == NULL ? NULL - : state->root_argp->argp_domain, - "\ + 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 (u == nuparam_names) + if (! un->name) __argp_failure (state, 0, 0, - dgettext (state == NULL ? NULL - : state->root_argp->argp_domain, "\ + dgettext (state->root_argp->argp_domain, "\ %.*s: Unknown ARGP_HELP_FMT parameter"), (int) var_len, var); @@ -246,8 +242,7 @@ fill_in_uparams (const struct argp_state *state) else if (*var) { __argp_failure (state, 0, 0, - dgettext (state == NULL ? NULL - : state->root_argp->argp_domain, + dgettext (state->root_argp->argp_domain, "Garbage in ARGP_HELP_FMT: %s"), var); break; } @@ -673,9 +668,9 @@ hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2) { /* If one cluster is deeper than the other, use its ancestor at the same level, so that finding the common ancestor is straightforward. */ - while (cl1->depth > cl2->depth) + while (cl1->depth < cl2->depth) cl1 = cl1->parent; - while (cl2->depth > cl1->depth) + while (cl2->depth < cl1->depth) cl2 = cl2->parent; /* Now reduce both clusters to their ancestors at the point where both have @@ -763,9 +758,9 @@ hol_entry_cmp (const struct hol_entry *entry1, const char *long2 = hol_entry_first_long (entry2); if (doc1) - doc1 = long1 != NULL && canon_doc_option (&long1); + doc1 = canon_doc_option (&long1); if (doc2) - doc2 = long2 != NULL && canon_doc_option (&long2); + doc2 = canon_doc_option (&long2); if (doc1 != doc2) /* `documentation' options always follow normal options (or @@ -988,7 +983,7 @@ static const char * filter_doc (const char *doc, int key, const struct argp *argp, const struct argp_state *state) { - if (argp && argp->help_filter) + if (argp->help_filter) /* We must apply a user filter to this output. */ { void *input = __argp_input (argp, state); @@ -1106,9 +1101,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]", - state == NULL ? NULL : state->root_argp->argp_domain, - stream); + arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream); else if (real->arg) hhstate->suppressed_dup_arg = 1; } @@ -1128,22 +1121,26 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state, have been done on the original; but documentation options should be pretty rare anyway... */ __argp_fmtstream_puts (stream, - dgettext (state == NULL ? NULL - : state->root_argp->argp_domain, + dgettext (state->root_argp->argp_domain, opt->name)); } } else /* A real long option. */ { + int first_long_opt = 1; + __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col); for (opt = real, num = entry->num; num > 0; opt++, num--) if (opt->name && ovisible (opt)) { comma (uparams.long_opt_col, &pest); __argp_fmtstream_printf (stream, "--%s", opt->name); - arg (real, "=%s", "[=%s]", - state == NULL ? NULL : state->root_argp->argp_domain, stream); + if (first_long_opt || uparams.dup_args) + arg (real, "=%s", "[=%s]", state->root_argp->argp_domain, + stream); + else if (real->arg) + hhstate->suppressed_dup_arg = 1; } } @@ -1162,8 +1159,7 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state, } else { - const char *tstr = real->doc ? dgettext (state == NULL ? NULL - : state->root_argp->argp_domain, + 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) @@ -1211,8 +1207,7 @@ hol_help (struct hol *hol, const struct argp_state *state, if (hhstate.suppressed_dup_arg && uparams.dup_args_note) { - const char *tstr = dgettext (state == NULL ? NULL - : state->root_argp->argp_domain, "\ + 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, @@ -1559,7 +1554,8 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream, __flockfile (stream); #endif - fill_in_uparams (state); + if (! uparams.valid) + fill_in_uparams (state); fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0); if (! fs) @@ -1767,26 +1763,33 @@ __argp_error (const struct argp_state *state, const char *fmt, ...) va_start (ap, fmt); -#ifdef _LIBC - char *buf; +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + { + char *buf; - if (_IO_vasprintf (&buf, fmt, ap) < 0) - buf = NULL; + if (__asprintf (&buf, fmt, ap) < 0) + buf = NULL; - __fxprintf (stream, "%s: %s\n", - state ? state->name : __argp_short_program_name (), buf); + __fwprintf (stream, L"%s: %s\n", + state ? state->name : __argp_short_program_name (), + buf); - free (buf); -#else - fputs_unlocked (state ? state->name : __argp_short_program_name (), - stream); - putc_unlocked (':', stream); - putc_unlocked (' ', stream); + free (buf); + } + else +#endif + { + fputs_unlocked (state + ? state->name : __argp_short_program_name (), + stream); + putc_unlocked (':', stream); + putc_unlocked (' ', stream); - vfprintf (stream, fmt, ap); + vfprintf (stream, fmt, ap); - putc_unlocked ('\n', stream); -#endif + putc_unlocked ('\n', stream); + } __argp_state_help (state, stream, ARGP_HELP_STD_ERR); @@ -1824,34 +1827,41 @@ __argp_failure (const struct argp_state *state, int status, int errnum, __flockfile (stream); #endif -#ifdef _LIBC - __fxprintf (stream, "%s", - state ? state->name : __argp_short_program_name ()); -#else - fputs_unlocked (state ? state->name : __argp_short_program_name (), - stream); +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + __fwprintf (stream, L"%s", + state ? state->name : __argp_short_program_name ()); + else #endif + fputs_unlocked (state + ? state->name : __argp_short_program_name (), + stream); if (fmt) { va_list ap; va_start (ap, fmt); -#ifdef _LIBC - char *buf; - - if (_IO_vasprintf (&buf, fmt, ap) < 0) - buf = NULL; +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + { + char *buf; - __fxprintf (stream, ": %s", buf); + if (__asprintf (&buf, fmt, ap) < 0) + buf = NULL; - free (buf); -#else - putc_unlocked (':', stream); - putc_unlocked (' ', stream); + __fwprintf (stream, L": %s", buf); - vfprintf (stream, fmt, ap); + free (buf); + } + else #endif + { + putc_unlocked (':', stream); + putc_unlocked (' ', stream); + + vfprintf (stream, fmt, ap); + } va_end (ap); } @@ -1860,18 +1870,21 @@ __argp_failure (const struct argp_state *state, int status, int errnum, { char buf[200]; -#ifdef _LIBC - __fxprintf (stream, ": %s", - __strerror_r (errnum, buf, sizeof (buf))); +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + __fwprintf (stream, L": %s", + __strerror_r (errnum, buf, sizeof (buf))); + else +#endif + { + putc_unlocked (':', stream); + putc_unlocked (' ', stream); +#if defined _LIBC || defined HAVE_STRERROR_R + fputs (__strerror_r (errnum, buf, sizeof (buf)), stream); #else - putc_unlocked (':', stream); - putc_unlocked (' ', stream); -# ifdef HAVE_STRERROR_R - fputs (__strerror_r (errnum, buf, sizeof (buf)), stream); -# else - fputs (strerror (errnum), stream); -# endif + fputs (strerror (errnum), stream); #endif + } } #ifdef USE_IN_LIBIO diff --git a/argp/argp-xinl.c b/argp/argp-xinl.c index 7913b061ac..73177585e8 100644 --- a/argp/argp-xinl.c +++ b/argp/argp-xinl.c @@ -19,7 +19,7 @@ 02111-1307 USA. */ #ifdef HAVE_CONFIG_H -# include <config.h> +#include <config.h> #endif #if defined _LIBC || defined HAVE_FEATURES_H diff --git a/argp/argp.h b/argp/argp.h index 3a5cb01fd8..008e039f9e 100644 --- a/argp/argp.h +++ b/argp/argp.h @@ -1,5 +1,5 @@ /* Hierarchial argument parsing, layered over getopt. - Copyright (C) 1995-1999,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1995-1999,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Miles Bader <miles@gnu.ai.mit.edu>. @@ -24,7 +24,6 @@ #include <stdio.h> #include <ctype.h> #include <getopt.h> -#include <limits.h> #define __need_error_t #include <errno.h> @@ -562,7 +561,7 @@ extern void *__argp_input (__const struct argp *__restrict __argp, # endif ARGP_EI void -__argp_usage (__const struct argp_state *__state) +__NTH (__argp_usage (__const struct argp_state *__state)) { __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE); } @@ -575,7 +574,7 @@ __NTH (__option_is_short (__const struct argp_option *__opt)) else { int __key = __opt->key; - return __key > 0 && __key <= UCHAR_MAX && isprint (__key); + return __key > 0 && isprint (__key); } } diff --git a/argp/bug-argp1.c b/argp/bug-argp1.c deleted file mode 100644 index a28cf4b9c7..0000000000 --- a/argp/bug-argp1.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <argp.h> - - -static const struct argp_option test_options[] = -{ - { NULL, 'a', NULL, OPTION_DOC, NULL }, - { NULL, 'b', NULL, OPTION_DOC, NULL }, - { NULL, 0, NULL, 0, NULL } -}; - -static struct argp test_argp = -{ - test_options -}; - - -static int -do_test (int argc, char *argv[]) -{ - int i; - argp_parse (&test_argp, argc, argv, 0, &i, NULL); - return 0; -} - -#define TEST_FUNCTION do_test (argc, argv) -#include "../test-skeleton.c" diff --git a/argp/tst-argp2.c b/argp/tst-argp2.c deleted file mode 100644 index 926614fbc8..0000000000 --- a/argp/tst-argp2.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (C) 2007 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2007. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <argp.h> - -static const struct argp_option opt1[] = - { - { "opt1", '1', "NUMBER", 0, "Option 1" }, - { NULL, 0, NULL, 0, NULL } - }; - -static const struct argp_option opt2[] = - { - { "opt2", '2', "NUMBER", 0, "Option 2" }, - { NULL, 0, NULL, 0, NULL } - }; - -static const struct argp_option opt3[] = - { - { "opt3", '3', "NUMBER", 0, "Option 3" }, - { NULL, 0, NULL, 0, NULL } - }; - -static const struct argp_option opt4[] = - { - { "opt4", '4', "NUMBER", 0, "Option 4" }, - { NULL, 0, NULL, 0, NULL } - }; - -static const struct argp_option opt5[] = - { - { "opt5", '5', "NUMBER", 0, "Option 5" }, - { NULL, 0, NULL, 0, NULL } - }; - -static struct argp argp5 = - { - opt5, NULL, "args doc5", "doc5", NULL, NULL, NULL - }; - -static struct argp argp4 = - { - opt4, NULL, "args doc4", "doc4", NULL, NULL, NULL - }; - -static struct argp argp3 = - { - opt3, NULL, "args doc3", "doc3", NULL, NULL, NULL - }; - -static struct argp_child children2[] = - { - { &argp4, 0, "child3", 3 }, - { &argp5, 0, "child4", 4 }, - { NULL, 0, NULL, 0 } - }; - -static struct argp argp2 = - { - opt2, NULL, "args doc2", "doc2", children2, NULL, NULL - }; - -static struct argp_child children1[] = - { - { &argp2, 0, "child1", 1 }, - { &argp3, 0, "child2", 2 }, - { NULL, 0, NULL, 0 } - }; - -static struct argp argp1 = - { - opt1, NULL, "args doc1", "doc1", children1, NULL, NULL - }; - - -static int -do_test (void) -{ - argp_help (&argp1, stdout, ARGP_HELP_LONG, (char *) "tst-argp2"); - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" |