X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fargp-help.c;h=e82f488353fede5fce3f80a8c1f479b90c693b45;hb=fdae5d9f72a0596fc7b5933509a9cd03cbebf6eb;hp=497bae148855bee17056d2bb1f4a660719b0833f;hpb=a82fdff58064e24994117ed668ae13362253be46;p=gnulib.git diff --git a/lib/argp-help.c b/lib/argp-help.c index 497bae148..e82f48835 100644 --- a/lib/argp-help.c +++ b/lib/argp-help.c @@ -25,20 +25,16 @@ #include #endif -#ifndef alloca -# ifdef __GNUC__ -# define alloca __builtin_alloca -# define HAVE_ALLOCA 1 +/* AIX requires this to be the first thing in the file. */ +#ifndef __GNUC__ +# if HAVE_ALLOCA_H || defined _LIBC +# include # else -# if defined HAVE_ALLOCA_H || defined _LIBC -# include +# ifdef _AIX +#pragma alloca # else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca +# ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); -# endif # endif # endif # endif @@ -49,7 +45,6 @@ char *alloca (); #include #include #include -#include #include #ifdef USE_IN_LIBIO # include @@ -69,9 +64,25 @@ 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" + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif /* User-selectable (using an environment variable) formatting parameters. @@ -440,7 +451,8 @@ make_hol (const struct argp *argp, struct hol_cluster *cluster) hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries); hol->short_options = malloc (num_short_options + 1); - assert (hol->entries && hol->short_options); + assert (hol->entries && hol->short_options + && hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry)); /* Fill in the entries. */ so = hol->short_options; @@ -546,7 +558,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, @@ -833,6 +845,9 @@ hol_append (struct hol *hol, struct hol *more) char *short_options = malloc (hol_so_len + strlen (more->short_options) + 1); + assert (entries && short_options + && num_entries <= SIZE_MAX / sizeof (struct hol_entry)); + __mempcpy (__mempcpy (entries, hol->entries, hol->num_entries * sizeof (struct hol_entry)), more->entries, @@ -1529,7 +1544,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); @@ -1537,7 +1554,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; } @@ -1645,7 +1664,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); @@ -1664,6 +1685,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; +} + +char * +__argp_short_program_name (void) +{ +# if 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 +} +#endif + /* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are from the set ARGP_HELP_*. */ void @@ -1675,7 +1722,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)) { @@ -1704,7 +1751,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); @@ -1716,7 +1765,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); @@ -1725,7 +1774,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); @@ -1739,7 +1788,9 @@ __argp_error (const struct argp_state *state, const char *fmt, ...) va_end (ap); +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) __funlockfile (stream); +#endif } } } @@ -1765,16 +1816,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) @@ -1818,7 +1871,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 } } @@ -1829,7 +1886,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);