summaryrefslogtreecommitdiff
path: root/argp/argp-help.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-10-02 22:55:10 +0000
committerUlrich Drepper <drepper@redhat.com>2003-10-02 22:55:10 +0000
commitf39941e4127085f2120e40ffefc287f8c4a9548a (patch)
treef0573c549da40417a8113d097adc062ad9c483da /argp/argp-help.c
parent134abcb5b9ba854fec25051cd3c9f88e760913c5 (diff)
Update.
2003-08-22 Simon Josefsson <jas@extundo.com> * argp/argp-fmtstream.h [!__attribute__]: Define to nothing. * argp/argp-help.c: Don't include malloc.h, some platforms complain and it doesn't appear to be used. [!_LIBC && HAVE_STRERROR_R && !HAVE_DECL_STRERROR_R]: Declare strerror_r. [!_LIBC && !HAVE_STRERROR_R && !HAVE_DECL_STRERROR]: Declare strerror. (hol_entry_long_iterate): Change __attribute to __attribute__. (_help, __argp_error, __argp_failure) [!_LIBC && (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)]: Protect call to flockfile and funlockfile. (__argp_basename) [!_LIBC]: New. Taken from LSH, by Niels Möller, modifed after comments from Ulrich Drepper. (__argp_short_program_name): Ditto. (__argp_state_help, __argp_error, __argp_failure): Use it. (__argp_failure): Use strerror when necessary. * argp/argp-namefrob.h (__flockfile, __funlockfile, __mempcpy) (__strchrnul, __strerror_r, __strndup) [!_LIBC]: Remove __-prefix. (clearerr_unlocked, feof_unlocked, ferror_unlocked) (fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked) (fread_unlocked, fwrite_unlocked, getc_unlocked, getchar_unlocked) (putc_unlocked, putchar_unlocked) [!_LIBC && !HAVE_DECL_*]: Map to non-unlocked functions. [!_LIBC]: Add prototypes for __argp_basename and __argp_short_program_name. * argp/argp-parse.c (argp_default_parser): Only use program_invocation{_short,}_name if declared. (parser_init): Use __argp_short_program_name. * argp/argp-xinl.c [_LIBC || HAVE_FEATURES_H]: Add CPP check for '#include features.h'. * argp/argp.h [!__attribute__]: Define to nothing.
Diffstat (limited to 'argp/argp-help.c')
-rw-r--r--argp/argp-help.c69
1 files changed, 62 insertions, 7 deletions
diff --git a/argp/argp-help.c b/argp/argp-help.c
index 3a2cfb4936..f39ce2a74f 100644
--- a/argp/argp-help.c
+++ b/argp/argp-help.c
@@ -50,7 +50,6 @@ char *alloca ();
#include <string.h>
#include <assert.h>
#include <stdarg.h>
-#include <malloc.h>
#include <ctype.h>
#ifdef USE_IN_LIBIO
# include <wchar.h>
@@ -70,6 +69,18 @@ char *alloca ();
# endif
#endif
+#ifndef _LIBC
+# if HAVE_STRERROR_R
+# if !HAVE_DECL_STRERROR_R
+char *strerror_r (int errnum, char *buf, size_t buflen);
+# endif
+# else
+# if !HAVE_DECL_STRERROR
+char *strerror (int errnum);
+# endif
+# endif
+#endif
+
#include "argp.h"
#include "argp-fmtstream.h"
#include "argp-namefrob.h"
@@ -552,7 +563,7 @@ hol_entry_short_iterate (const struct hol_entry *entry,
}
static inline int
-__attribute ((always_inline))
+__attribute__ ((always_inline))
hol_entry_long_iterate (const struct hol_entry *entry,
int (*func)(const struct argp_option *opt,
const struct argp_option *real,
@@ -1538,7 +1549,9 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
if (! stream)
return;
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__flockfile (stream);
+#endif
if (! uparams.valid)
fill_in_uparams (state);
@@ -1546,7 +1559,9 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);
if (! fs)
{
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__funlockfile (stream);
+#endif
return;
}
@@ -1654,7 +1669,9 @@ Try `%s --help' or `%s --usage' for more information.\n"),
anything = 1;
}
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__funlockfile (stream);
+#endif
if (hol)
hol_free (hol);
@@ -1673,6 +1690,32 @@ void __argp_help (const struct argp *argp, FILE *stream,
weak_alias (__argp_help, argp_help)
#endif
+#ifndef _LIBC
+char *__argp_basename (char *name)
+{
+ char *short_name = strrchr (name, '/');
+ return short_name ? short_name + 1 : name;
+}
+#endif
+
+char *
+__argp_short_program_name (void)
+{
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ return program_invocation_short_name;
+#elif HAVE_DECL_PROGRAM_INVOCATION_NAME
+ return __argp_basename (program_invocation_name);
+#else
+ /* FIXME: What now? Miles suggests that it is better to use NULL,
+ but currently the value is passed on directly to fputs_unlocked,
+ so that requires more changes. */
+#if __GNUC__
+# warning No reasonable value to return
+#endif /* __GNUC__ */
+ return "";
+#endif
+}
+
/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
from the set ARGP_HELP_*. */
void
@@ -1684,7 +1727,7 @@ __argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
flags |= ARGP_HELP_LONG_ONLY;
_help (state ? state->root_argp : 0, state, stream, flags,
- state ? state->name : program_invocation_short_name);
+ state ? state->name : __argp_short_program_name ());
if (!state || ! (state->flags & ARGP_NO_EXIT))
{
@@ -1713,7 +1756,9 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
{
va_list ap;
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__flockfile (stream);
+#endif
va_start (ap, fmt);
@@ -1725,7 +1770,7 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
__asprintf (&buf, fmt, ap);
__fwprintf (stream, L"%s: %s\n",
- state ? state->name : program_invocation_short_name,
+ state ? state->name : __argp_short_program_name (),
buf);
free (buf);
@@ -1734,7 +1779,7 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
#endif
{
fputs_unlocked (state
- ? state->name : program_invocation_short_name,
+ ? state->name : __argp_short_program_name (),
stream);
putc_unlocked (':', stream);
putc_unlocked (' ', stream);
@@ -1748,7 +1793,9 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
va_end (ap);
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__funlockfile (stream);
+#endif
}
}
}
@@ -1774,16 +1821,18 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
if (stream)
{
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__flockfile (stream);
+#endif
#ifdef USE_IN_LIBIO
if (_IO_fwide (stream, 0) > 0)
__fwprintf (stream, L"%s",
- state ? state->name : program_invocation_short_name);
+ state ? state->name : __argp_short_program_name ());
else
#endif
fputs_unlocked (state
- ? state->name : program_invocation_short_name,
+ ? state->name : __argp_short_program_name (),
stream);
if (fmt)
@@ -1827,7 +1876,11 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
{
putc_unlocked (':', stream);
putc_unlocked (' ', stream);
+#if defined _LIBC || defined HAVE_STRERROR_R
fputs (__strerror_r (errnum, buf, sizeof (buf)), stream);
+#else
+ fputs (strerror (errnum), stream);
+#endif
}
}
@@ -1838,7 +1891,9 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
#endif
putc_unlocked ('\n', stream);
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
__funlockfile (stream);
+#endif
if (status && (!state || !(state->flags & ARGP_NO_EXIT)))
exit (status);