diff options
-rw-r--r-- | libshouldbeinlibc/argp-help.c | 326 |
1 files changed, 186 insertions, 140 deletions
diff --git a/libshouldbeinlibc/argp-help.c b/libshouldbeinlibc/argp-help.c index 62608f1c..5d20dba7 100644 --- a/libshouldbeinlibc/argp-help.c +++ b/libshouldbeinlibc/argp-help.c @@ -26,9 +26,12 @@ #include <stdarg.h> #include <malloc.h> #include <ctype.h> -#include <linewrap.h> + +extern char *__progname, *__progname_full; #include "argp.h" +#include "argp-fmtstream.h" +#include "argp-namefrob.h" #define SHORT_OPT_COL 2 /* column in which short options start */ #define LONG_OPT_COL 6 /* column in which long options start */ @@ -49,10 +52,10 @@ #define odoc(opt) ((opt)->flags & OPTION_DOC) /* Returns true if OPT is the end-of-list marker for a list of options. */ -#define oend(opt) _option_is_end (opt) +#define oend(opt) __option_is_end (opt) /* Returns true if OPT has a short option. */ -#define oshort(opt) (!odoc(opt) && _option_is_short (opt)) +#define oshort(opt) __option_is_short (opt) /* The help format for a particular option is like: @@ -67,40 +70,55 @@ indented slighly in a way that's supposed to make most long options appear to be in a separate column. - For example (from ps): + For example, the following output (from ps): + + -p PID, --pid=PID List the process PID + --pgrp=PGRP List processes in the process group PGRP + -P, -x, --no-parent Include processes without parents + -Q, --all-fields Don't elide unusable fields (normally if there's + some reason ps can't print a field for any + process, it's removed from the output entirely) + -r, --reverse, --gratuitously-long-reverse-option + Reverse the order of any sort + --session[=SID] Add the processes from the session SID (which + defaults to the sid of the current process) - -p PID, --pid=PID List the process PID - --pgrp=PGRP List processes in the process group PGRP - -P, -x, --no-parent Include processes without parents - -Q, --all-fields Don't elide unusable fields (normally if there's - some reason ps can't print a field for any - process, it's removed from the output entirely) - -r, --reverse, --gratuitously-long-reverse-option - Reverse the order of any sort - --session[=SID] Add the processes from the session SID (which - defaults to the sid of the current process) + Here are some more options: + -f ZOT, --foonly=ZOT Glork a foonly + -z, --zaza Snit a zar + + -?, --help Give this help list + --usage Give a short usage message + -V, --version Print program version The struct argp_option array for the above could look like: { - {"pid", 'p', "PID", 0, - "List the process PID"}, - {"pgrp", OPT_PGRP, "PGRP", 0, - "List processes in the process group PGRP"}, - {"no-parent", 'P', 0, 0, - "Include processes without parents"}, + {"pid", 'p', "PID", 0, "List the process PID"}, + {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"}, + {"no-parent", 'P', 0, 0, "Include processes without parents"}, {0, 'x', 0, OPTION_ALIAS}, - {"all-fields",'Q', 0, 0, - "Don't elide unusable fields (normally if there's some reason ps \ -can't print a field for any process, it's removed from the output entirely)"}, - {"reverse", 'r', 0, 0, - "Reverse the order of any sort"}, + {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally" + " if there's some reason ps can't" + " print a field for any process, it's" + " removed from the output entirely)" }, + {"reverse", 'r', 0, 0, "Reverse the order of any sort"}, {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS}, {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL, - "Add the processes from the session SID (which defaults to the sid of \ -the current process)"}, + "Add the processes from the session" + " SID (which defaults to the sid of" + " the current process)" }, + + {0,0,0,0, "Here are some more options:"}, + {"foonly", 'f', "ZOT", 0, "Glork a foonly"}, + {"zaza", 'z', 0, 0, "Snit a zar"}, + + {0} } + Note that the last three options are automatically supplied by argp_parse, + unless you tell it not to with ARGP_NO_HELP. + */ /* Returns true if CH occurs between BEG and END. */ @@ -187,8 +205,8 @@ struct hol /* Create a struct hol from an array of struct argp_option. CLUSTER is the hol_cluster in which these entries occur, or 0, if at the root. */ -struct hol *make_hol (const struct argp_option *opt, - struct hol_cluster *cluster) +static struct hol * +make_hol (const struct argp_option *opt, struct hol_cluster *cluster) { char *so; const struct argp_option *o; @@ -228,7 +246,12 @@ struct hol *make_hol (const struct argp_option *opt, entry->opt = o; entry->num = 0; entry->short_options = so; - entry->group = cur_group = o->group ?: cur_group; + entry->group = cur_group = + o->group + ? o->group + : ((!o->name && !o->key) + ? cur_group + 1 + : cur_group); entry->cluster = cluster; do @@ -344,7 +367,7 @@ static inline int until_short (const struct argp_option *opt, const struct argp_option *real, void *cookie) { - return oshort (opt); + return oshort (opt) ? opt->key : 0; } /* Returns the first valid short option in ENTRY, or 0 if there is none. */ @@ -400,14 +423,14 @@ hol_set_group (struct hol *hol, char *name, int group) entry->group = group; } -/* Order by group: 1, 2, ..., n, 0, -m, ..., -2, -1. +/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1. EQ is what to return if GROUP1 and GROUP2 are the same. */ static int group_cmp (int group1, int group2, int eq) { if (group1 == group2) return eq; - else if ((group1 < 0 && group2 < 0) || (group1 > 0 && group2 > 0)) + else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0)) return group1 - group2; else return group2 - group1; @@ -517,7 +540,7 @@ hol_entry_cmp (const struct hol_entry *entry1, const struct hol_entry *entry2) return doc1 - doc2; else if (!short1 && !short2 && long1 && long2) /* Only long options. */ - return strcasecmp (long1, long2); + return __strcasecmp (long1, long2); else /* Compare short/short, long/short, short/long, using the first character of long options. Entries without *any* valid @@ -525,11 +548,12 @@ hol_entry_cmp (const struct hol_entry *entry1, const struct hol_entry *entry2) first, but as they're not displayed, it doesn't matter where they are. */ { - char first1 = short1 ?: long1 ? *long1 : 0; - char first2 = short2 ?: long2 ? *long2 : 0; + char first1 = short1 ? short1 : long1 ? *long1 : 0; + char first2 = short2 ? short2 : long2 ? *long2 : 0; + int lower_cmp = tolower (first1) - tolower (first2); /* Compare ignoring case, except when the options are both the same letter, in which case lower-case always comes first. */ - return (tolower (first1) - tolower (first2)) ?: first2 - first1; + return lower_cmp ? lower_cmp : first2 - first1; } } else @@ -592,12 +616,12 @@ hol_append (struct hol *hol, struct hol *more) char *short_options = malloc (hol_so_len + strlen (more->short_options) + 1); - bcopy (hol->entries, entries, - hol->num_entries * sizeof (struct hol_entry)); - bcopy (more->entries, entries + hol->num_entries, - more->num_entries * sizeof (struct hol_entry)); + memcpy (entries, hol->entries, + hol->num_entries * sizeof (struct hol_entry)); + memcpy (entries + hol->num_entries, more->entries, + more->num_entries * sizeof (struct hol_entry)); - bcopy (hol->short_options, short_options, hol_so_len); + memcpy (short_options, hol->short_options, hol_so_len); /* Fix up the short options pointers from HOL. */ for (e = entries, left = hol->num_entries; left > 0; e++, left--) @@ -644,11 +668,11 @@ hol_append (struct hol *hol, struct hol *more) /* Inserts enough spaces to make sure STREAM is at column COL. */ static void -indent_to (FILE *stream, unsigned col) +indent_to (argp_fmtstream_t stream, unsigned col) { - int needed = col - line_wrap_point (stream); + int needed = col - __argp_fmtstream_point (stream); while (needed-- > 0) - putc (' ', stream); + __argp_fmtstream_putc (stream, ' '); } /* If the option REAL has an argument, we print it in using the printf @@ -656,13 +680,13 @@ indent_to (FILE *stream, unsigned col) optional argument. */ static void arg (const struct argp_option *real, char *req_fmt, char *opt_fmt, - FILE *stream) + argp_fmtstream_t stream) { if (real->arg) if (real->flags & OPTION_ARG_OPTIONAL) - fprintf (stream, opt_fmt, real->arg); + __argp_fmtstream_printf (stream, opt_fmt, real->arg); else - fprintf (stream, req_fmt, real->arg); + __argp_fmtstream_printf (stream, req_fmt, real->arg); } /* Helper functions for hol_entry_help. */ @@ -673,7 +697,7 @@ arg (const struct argp_option *real, char *req_fmt, char *opt_fmt, struct pentry_state { const struct hol_entry *entry; - FILE *stream; + argp_fmtstream_t stream; struct hol_entry **prev_entry; int *sep_groups; @@ -690,12 +714,12 @@ print_header (const char *str, struct pentry_state *st) if (*str) { if (st->prev_entry && *st->prev_entry) - putc ('\n', st->stream); /* Precede with a blank line. */ + __argp_fmtstream_putc (st->stream, '\n'); /* Precede with a blank line. */ indent_to (st->stream, HEADER_COL); - line_wrap_set_lmargin (st->stream, HEADER_COL); - line_wrap_set_wmargin (st->stream, HEADER_COL); - fputs (str, st->stream); - line_wrap_set_lmargin (st->stream, 0); + __argp_fmtstream_set_lmargin (st->stream, HEADER_COL); + __argp_fmtstream_set_wmargin (st->stream, HEADER_COL); + __argp_fmtstream_puts (st->stream, str); + __argp_fmtstream_set_lmargin (st->stream, 0); } if (st->sep_groups) @@ -714,7 +738,7 @@ comma (unsigned col, struct pentry_state *st) if (st->sep_groups && *st->sep_groups && pe && st->entry->group != pe->group) - putc ('\n', st->stream); + __argp_fmtstream_putc (st->stream, '\n'); if (pe && cl && pe->cluster != cl && cl->header && *cl->header && !hol_cluster_is_child (pe->cluster, cl)) @@ -723,16 +747,16 @@ comma (unsigned col, struct pentry_state *st) (in which case we had just popped into a sub-cluster for a bit). If so, then print the cluster's header line. */ { - int old_wm = line_wrap_wmargin (st->stream); + int old_wm = __argp_fmtstream_wmargin (st->stream); print_header (cl->header, st); - putc ('\n', st->stream); - line_wrap_set_wmargin (st->stream, old_wm); + __argp_fmtstream_putc (st->stream, '\n'); + __argp_fmtstream_set_wmargin (st->stream, old_wm); } st->first = 0; } else - fputs (", ", st->stream); + __argp_fmtstream_puts (st->stream, ", "); indent_to (st->stream, col); } @@ -743,18 +767,18 @@ comma (unsigned col, struct pentry_state *st) printed before any output. *SEP_GROUPS is also set to true if a user-specified group header is printed. */ static void -hol_entry_help (struct hol_entry *entry, FILE *stream, +hol_entry_help (struct hol_entry *entry, argp_fmtstream_t stream, struct hol_entry **prev_entry, int *sep_groups) { unsigned num; const struct argp_option *real = entry->opt, *opt; char *so = entry->short_options; - int old_lm = line_wrap_set_lmargin (stream, 0); - int old_wm = line_wrap_wmargin (stream); + int old_lm = __argp_fmtstream_set_lmargin (stream, 0); + int old_wm = __argp_fmtstream_wmargin (stream); struct pentry_state pest = { entry, stream, prev_entry, sep_groups, 1 }; /* First emit short options. */ - line_wrap_set_wmargin (stream, SHORT_OPT_COL); /* For truly bizarre cases. */ + __argp_fmtstream_set_wmargin (stream, SHORT_OPT_COL); /* For truly bizarre cases. */ for (opt = real, num = entry->num; num > 0; opt++, num--) if (oshort (opt) && opt->key == *so) /* OPT has a valid (non shadowed) short option. */ @@ -762,8 +786,8 @@ hol_entry_help (struct hol_entry *entry, FILE *stream, if (ovisible (opt)) { comma (SHORT_OPT_COL, &pest); - putc ('-', stream); - putc (*so, stream); + __argp_fmtstream_putc (stream, '-'); + __argp_fmtstream_putc (stream, *so); arg (real, " %s", "[%s]", stream); } so++; @@ -773,28 +797,28 @@ hol_entry_help (struct hol_entry *entry, FILE *stream, if (odoc (real)) /* Really a `documentation' option. */ { - line_wrap_set_wmargin (stream, DOC_OPT_COL); + __argp_fmtstream_set_wmargin (stream, DOC_OPT_COL); for (opt = real, num = entry->num; num > 0; opt++, num--) if (opt->name && ovisible (opt)) { comma (DOC_OPT_COL, &pest); - fputs (opt->name, stream); + __argp_fmtstream_puts (stream, opt->name); } } else /* A realy long option. */ { - line_wrap_set_wmargin (stream, LONG_OPT_COL); + __argp_fmtstream_set_wmargin (stream, LONG_OPT_COL); for (opt = real, num = entry->num; num > 0; opt++, num--) if (opt->name && ovisible (opt)) { comma (LONG_OPT_COL, &pest); - fprintf (stream, "--%s", opt->name); + __argp_fmtstream_printf (stream, "--%s", opt->name); arg (real, "=%s", "[=%s]", stream); } } - line_wrap_set_lmargin (stream, 0); + __argp_fmtstream_set_lmargin (stream, 0); if (pest.first) /* Didn't print any switches, what's up? */ if (!oshort (real) && !real->name && real->doc) @@ -806,38 +830,38 @@ hol_entry_help (struct hol_entry *entry, FILE *stream, else if (real->doc) /* Now the option documentation. */ { - unsigned col = line_wrap_point (stream); + unsigned col = __argp_fmtstream_point (stream); const char *doc = real->doc; - line_wrap_set_lmargin (stream, OPT_DOC_COL); - line_wrap_set_wmargin (stream, OPT_DOC_COL); + __argp_fmtstream_set_lmargin (stream, OPT_DOC_COL); + __argp_fmtstream_set_wmargin (stream, OPT_DOC_COL); if (col > OPT_DOC_COL + 3) - putc ('\n', stream); + __argp_fmtstream_putc (stream, '\n'); else if (col >= OPT_DOC_COL) - fprintf (stream, " "); + __argp_fmtstream_puts (stream, " "); else indent_to (stream, OPT_DOC_COL); - fputs (doc, stream); + __argp_fmtstream_puts (stream, doc); /* Reset the left margin. */ - line_wrap_set_lmargin (stream, 0); + __argp_fmtstream_set_lmargin (stream, 0); } - putc ('\n', stream); + __argp_fmtstream_putc (stream, '\n'); if (prev_entry) *prev_entry = entry; cleanup: - line_wrap_set_lmargin (stream, old_lm); - line_wrap_set_wmargin (stream, old_wm); + __argp_fmtstream_set_lmargin (stream, old_lm); + __argp_fmtstream_set_wmargin (stream, old_wm); } /* Output a long help message about the options in HOL to STREAM. */ static void -hol_help (struct hol *hol, FILE *stream) +hol_help (struct hol *hol, argp_fmtstream_t stream) { unsigned num; struct hol_entry *entry; @@ -870,23 +894,25 @@ usage_argful_short_opt (const struct argp_option *opt, const struct argp_option *real, void *cookie) { - FILE *stream = cookie; + argp_fmtstream_t stream = cookie; + const char *arg = opt->arg; - if (opt->arg || real->arg) + if (! arg) + arg = real->arg; + + if (arg) if ((opt->flags | real->flags) & OPTION_ARG_OPTIONAL) - fprintf (stream, " [-%c[%s]]", - opt->key, opt->arg ?: real->arg); + __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg); else { - const char *arg = opt->arg ?: real->arg; /* Manually do line wrapping so that it (probably) won't get wrapped at the embedded space. */ - if (line_wrap_point (stream) + 6 + strlen (arg) - >= line_wrap_rmargin (stream)) - putc ('\n', stream); + if (__argp_fmtstream_point (stream) + 6 + strlen (arg) + >= __argp_fmtstream_rmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); else - putc (' ', stream); - fprintf (stream, "[-%c %s]", opt->key, arg); + __argp_fmtstream_putc (stream, ' '); + __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg); } return 0; @@ -899,20 +925,26 @@ usage_long_opt (const struct argp_option *opt, const struct argp_option *real, void *cookie) { - FILE *stream = cookie; - if (opt->arg || real->arg) + argp_fmtstream_t stream = cookie; + const char *arg = opt->arg; + + if (! arg) + arg = real->arg; + + if (arg) if ((opt->flags | real->flags) & OPTION_ARG_OPTIONAL) - fprintf (stream, " [--%s[=%s]]", opt->name, opt->arg ?: real->arg); + __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg); else - fprintf (stream, " [--%s=%s]", opt->name, opt->arg ?: real->arg); + __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg); else - fprintf (stream, " [--%s]", opt->name); + __argp_fmtstream_printf (stream, " [--%s]", opt->name); + return 0; } /* Print a short usage description for the arguments in HOL to STREAM. */ static void -hol_usage (struct hol *hol, FILE *stream) +hol_usage (struct hol *hol, argp_fmtstream_t stream) { if (hol->num_entries > 0) { @@ -929,7 +961,7 @@ hol_usage (struct hol *hol, FILE *stream) if (snao_end > short_no_arg_opts) { *snao_end++ = 0; - fprintf (stream, " [-%s]", short_no_arg_opts); + __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts); } /* Now a list of short options *with* arguments. */ @@ -972,7 +1004,7 @@ argp_hol (const struct argp *argp, struct hol_cluster *cluster) /* Print all the non-option args documented in ARGP to STREAM. Any output is preceded by a space. */ static void -argp_args_usage (const struct argp *argp, FILE *stream) +argp_args_usage (const struct argp *argp, argp_fmtstream_t stream) { const struct argp_child *child = argp->children; const char *doc = argp->args_doc; @@ -980,12 +1012,12 @@ argp_args_usage (const struct argp *argp, FILE *stream) { /* Manually do line wrapping so that it (probably) won't get wrapped at any embedded spaces. */ - if (line_wrap_point (stream) + 1 + strlen (doc) - >= line_wrap_rmargin (stream)) - putc ('\n', stream); + if (__argp_fmtstream_point (stream) + 1 + strlen (doc) + >= __argp_fmtstream_rmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); else - putc (' ', stream); - fputs (doc, stream); + __argp_fmtstream_putc (stream, ' '); + __argp_fmtstream_puts (stream, doc); } if (child) while (child->argp) @@ -1001,7 +1033,7 @@ argp_args_usage (const struct argp *argp, FILE *stream) occurance is output. Returns true if anything was output. */ static int argp_doc (const struct argp *argp, int post, int pre_blank, int first_only, - FILE *stream) + argp_fmtstream_t stream) { const struct argp_child *child = argp->children; const char *doc = argp->doc; @@ -1009,21 +1041,21 @@ argp_doc (const struct argp *argp, int post, int pre_blank, int first_only, if (doc) { - char *vt = index (doc, '\v'); + char *vt = strchr (doc, '\v'); if (pre_blank && (vt || !post)) - putc ('\n', stream); + __argp_fmtstream_putc (stream, '\n'); if (vt) if (post) - fputs (vt + 1, stream); + __argp_fmtstream_puts (stream, vt + 1); else - fwrite (doc, 1, vt - doc, stream); + __argp_fmtstream_write (stream, doc, vt - doc); else if (! post) - fputs (doc, stream); - if (line_wrap_point (stream) > line_wrap_lmargin (stream)) - putc ('\n', stream); + __argp_fmtstream_puts (stream, doc); + if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); anything = 1; } @@ -1038,17 +1070,19 @@ argp_doc (const struct argp *argp, int post, int pre_blank, int first_only, /* Output a usage message for ARGP to STREAM. FLAGS are from the set ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */ -void argp_help (const struct argp *argp, FILE *stream, - unsigned flags, char *name) +void __argp_help (const struct argp *argp, FILE *stream, + unsigned flags, char *name) { int anything = 0; /* Whether we've output anything. */ struct hol *hol = 0; + argp_fmtstream_t fs; if (! stream) return; - stream = line_wrap_stream (stream, 0, RMARGIN, 0); - assert (stream); + fs = __argp_make_fmtstream (stream, 0, RMARGIN, 0); + if (! fs) + return; if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG)) { @@ -1065,38 +1099,38 @@ void argp_help (const struct argp *argp, FILE *stream, /* Print a short `Usage:' message. */ { int old_lm; - int old_wm = line_wrap_set_wmargin (stream, USAGE_INDENT); + int old_wm = __argp_fmtstream_set_wmargin (fs, USAGE_INDENT); - fprintf (stream, "Usage: %s", name); + __argp_fmtstream_printf (fs, "Usage: %s", name); /* We set the lmargin as well as the wmargin, because hol_usage manually wraps options with newline to avoid annoying breaks. */ - old_lm = line_wrap_set_lmargin (stream, USAGE_INDENT); + old_lm = __argp_fmtstream_set_lmargin (fs, USAGE_INDENT); if (flags & ARGP_HELP_SHORT_USAGE) /* Just show where the options go. */ { if (hol->num_entries > 0) - fputs (" [OPTION...]", stream); + __argp_fmtstream_puts (fs, " [OPTION...]"); } else /* Actually print the options. */ - hol_usage (hol, stream); - argp_args_usage (argp, stream); + hol_usage (hol, fs); + argp_args_usage (argp, fs); - line_wrap_set_wmargin (stream, old_wm); - line_wrap_set_lmargin (stream, old_lm); + __argp_fmtstream_set_wmargin (fs, old_wm); + __argp_fmtstream_set_lmargin (fs, old_lm); - putc ('\n', stream); + __argp_fmtstream_putc (fs, '\n'); anything = 1; } if (flags & ARGP_HELP_PRE_DOC) - anything |= argp_doc (argp, 0, 0, 1, stream); + anything |= argp_doc (argp, 0, 0, 1, fs); if (flags & ARGP_HELP_SEE) { - fprintf (stream, + __argp_fmtstream_printf (fs, "Try `%s --help' or `%s --usage' for more information.\n", name, name); anything = 1; @@ -1109,34 +1143,37 @@ void argp_help (const struct argp *argp, FILE *stream, if (hol->num_entries > 0) { if (anything) - putc ('\n', stream); - hol_help (hol, stream); + __argp_fmtstream_putc (fs, '\n'); + hol_help (hol, fs); anything = 1; } } if (flags & ARGP_HELP_POST_DOC) /* Print any documentation strings at the end. */ - anything |= argp_doc (argp, 1, anything, 0, stream); + anything |= argp_doc (argp, 1, anything, 0, fs); if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address) { if (anything) - putc ('\n', stream); - fprintf (stream, "Report bugs to %s.\n", argp_program_bug_address); + __argp_fmtstream_putc (fs, '\n'); + __argp_fmtstream_printf (fs, "Report bugs to %s.\n", argp_program_bug_address); anything = 1; } if (hol) hol_free (hol); - line_unwrap_stream (stream); + __argp_fmtstream_free (fs); } +#ifdef weak_alias +weak_alias (__argp_help, argp_help) +#endif /* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are from the set ARGP_HELP_*. */ void -argp_state_help (struct argp_state *state, FILE *stream, unsigned flags) +__argp_state_help (struct argp_state *state, FILE *stream, unsigned flags) { if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream) { @@ -1144,7 +1181,7 @@ argp_state_help (struct argp_state *state, FILE *stream, unsigned flags) flags |= ARGP_HELP_LONG_ONLY; argp_help (state ? state->argp : 0, stream, flags, - state ? state->name : program_invocation_name); + state ? state->name : __progname_full); if (!state || ! (state->flags & ARGP_NO_EXIT)) { @@ -1155,12 +1192,15 @@ argp_state_help (struct argp_state *state, FILE *stream, unsigned flags) } } } +#ifdef weak_alias +weak_alias (__argp_state_help, argp_state_help) +#endif /* If appropriate, print the printf string FMT and following args, preceded by the program name and `:', to stderr, and followed by a `Try ... --help' message, then exit (1). */ void -argp_error (struct argp_state *state, const char *fmt, ...) +__argp_error (struct argp_state *state, const char *fmt, ...) { if (!state || !(state->flags & ARGP_NO_ERRS)) { @@ -1170,7 +1210,7 @@ argp_error (struct argp_state *state, const char *fmt, ...) { va_list ap; - fputs (program_invocation_name, stream); + fputs (__progname_full, stream); putc (':', stream); putc (' ', stream); @@ -1180,10 +1220,13 @@ argp_error (struct argp_state *state, const char *fmt, ...) putc ('\n', stream); - argp_state_help (state, stream, ARGP_HELP_STD_ERR); + __argp_state_help (state, stream, ARGP_HELP_STD_ERR); } } } +#ifdef weak_alias +weak_alias (__argp_error, argp_error) +#endif /* Similar to the standard gnu error-reporting function error(), but will respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print @@ -1194,7 +1237,7 @@ argp_error (struct argp_state *state, const char *fmt, ...) *parsing errors*, and the former is for other problems that occur during parsing but don't reflect a (syntactic) problem with the input. */ void -argp_failure (struct argp_state *state, int status, int errnum, +__argp_failure (struct argp_state *state, int status, int errnum, const char *fmt, ...) { if (!state || !(state->flags & ARGP_NO_ERRS)) @@ -1203,7 +1246,7 @@ argp_failure (struct argp_state *state, int status, int errnum, if (stream) { - fputs (state ? state->name : program_invocation_name, stream); + fputs (state ? state->name : __progname_full, stream); if (fmt) { @@ -1231,3 +1274,6 @@ argp_failure (struct argp_state *state, int status, int errnum, } } } +#ifdef weak_alias +weak_alias (__argp_failure, argp_failure) +#endif |