Import upstream version 1.28
[debian/tar] / gnu / argp-help.c
1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* Hierarchical argument parsing help output
4    Copyright (C) 1995-2005, 2007, 2009-2014 Free Software Foundation, Inc.
5    This file is part of the GNU C Library.
6    Written by Miles Bader <miles@gnu.ai.mit.edu>.
7
8    This program is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #ifndef _GNU_SOURCE
22 # define _GNU_SOURCE    1
23 #endif
24
25 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28
29 #include <alloca.h>
30 #include <errno.h>
31 #include <stddef.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <strings.h>
35 #include <assert.h>
36 #include <stdarg.h>
37 #include <ctype.h>
38 #include <limits.h>
39 #ifdef USE_IN_LIBIO
40 # include <wchar.h>
41 #endif
42
43 #ifdef _LIBC
44 # include <libintl.h>
45 # undef dgettext
46 # define dgettext(domain, msgid) \
47    INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
48 #else
49 # include "gettext.h"
50 #endif
51
52 #include "argp.h"
53 #include "argp-fmtstream.h"
54 #include "argp-namefrob.h"
55
56 #ifndef SIZE_MAX
57 # define SIZE_MAX ((size_t) -1)
58 #endif
59 \f
60 /* User-selectable (using an environment variable) formatting parameters.
61
62    These may be specified in an environment variable called 'ARGP_HELP_FMT',
63    with a contents like:  VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
64    Where VALn must be a positive integer.  The list of variables is in the
65    UPARAM_NAMES vector, below.  */
66
67 /* Default parameters.  */
68 #define DUP_ARGS      0         /* True if option argument can be duplicated. */
69 #define DUP_ARGS_NOTE 1         /* True to print a note about duplicate args. */
70 #define SHORT_OPT_COL 2         /* column in which short options start */
71 #define LONG_OPT_COL  6         /* column in which long options start */
72 #define DOC_OPT_COL   2         /* column in which doc options start */
73 #define OPT_DOC_COL  29         /* column in which option text starts */
74 #define HEADER_COL    1         /* column in which group headers are printed */
75 #define USAGE_INDENT 12         /* indentation of wrapped usage lines */
76 #define RMARGIN      79         /* right margin used for wrapping */
77
78 /* User-selectable (using an environment variable) formatting parameters.
79    They must all be of type 'int' for the parsing code to work.  */
80 struct uparams
81 {
82   /* If true, arguments for an option are shown with both short and long
83      options, even when a given option has both, e.g. '-x ARG, --longx=ARG'.
84      If false, then if an option has both, the argument is only shown with
85      the long one, e.g., '-x, --longx=ARG', and a message indicating that
86      this really means both is printed below the options.  */
87   int dup_args;
88
89   /* This is true if when DUP_ARGS is false, and some duplicate arguments have
90      been suppressed, an explanatory message should be printed.  */
91   int dup_args_note;
92
93   /* Various output columns.  */
94   int short_opt_col;      /* column in which short options start */
95   int long_opt_col;       /* column in which long options start */
96   int doc_opt_col;        /* column in which doc options start */
97   int opt_doc_col;        /* column in which option text starts */
98   int header_col;         /* column in which group headers are printed */
99   int usage_indent;       /* indentation of wrapped usage lines */
100   int rmargin;            /* right margin used for wrapping */
101
102   int valid;              /* True when the values in here are valid.  */
103 };
104
105 /* This is a global variable, as user options are only ever read once.  */
106 static struct uparams uparams = {
107   DUP_ARGS, DUP_ARGS_NOTE,
108   SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL,
109   USAGE_INDENT, RMARGIN,
110   0
111 };
112
113 /* A particular uparam, and what the user name is.  */
114 struct uparam_name
115 {
116   const char *name;             /* User name.  */
117   int is_bool;                  /* Whether it's 'boolean'.  */
118   size_t uparams_offs;          /* Location of the (int) field in UPARAMS.  */
119 };
120
121 /* The name-field mappings we know about.  */
122 static const struct uparam_name uparam_names[] =
123 {
124   { "dup-args",       1, offsetof (struct uparams, dup_args) },
125   { "dup-args-note",  1, offsetof (struct uparams, dup_args_note) },
126   { "short-opt-col",  0, offsetof (struct uparams, short_opt_col) },
127   { "long-opt-col",   0, offsetof (struct uparams, long_opt_col) },
128   { "doc-opt-col",    0, offsetof (struct uparams, doc_opt_col) },
129   { "opt-doc-col",    0, offsetof (struct uparams, opt_doc_col) },
130   { "header-col",     0, offsetof (struct uparams, header_col) },
131   { "usage-indent",   0, offsetof (struct uparams, usage_indent) },
132   { "rmargin",        0, offsetof (struct uparams, rmargin) },
133   { 0 }
134 };
135
136 static void
137 validate_uparams (const struct argp_state *state, struct uparams *upptr)
138 {
139   const struct uparam_name *up;
140
141   for (up = uparam_names; up->name; up++)
142     {
143       if (up->is_bool
144           || up->uparams_offs == offsetof (struct uparams, rmargin))
145         continue;
146       if (*(int *)((char *)upptr + up->uparams_offs) >= upptr->rmargin)
147         {
148           __argp_failure (state, 0, 0,
149                           dgettext (state->root_argp->argp_domain,
150                                     "\
151 ARGP_HELP_FMT: %s value is less than or equal to %s"),
152                           "rmargin", up->name);
153           return;
154         }
155     }
156   uparams = *upptr;
157   uparams.valid = 1;
158 }
159
160 /* Read user options from the environment, and fill in UPARAMS appropriately. */
161 static void
162 fill_in_uparams (const struct argp_state *state)
163 {
164   const char *var = getenv ("ARGP_HELP_FMT");
165   struct uparams new_params = uparams;
166
167 #define SKIPWS(p) do { while (isspace ((unsigned char) *p)) p++; } while (0);
168
169   if (var)
170     {
171       /* Parse var. */
172       while (*var)
173         {
174           SKIPWS (var);
175
176           if (isalpha ((unsigned char) *var))
177             {
178               size_t var_len;
179               const struct uparam_name *un;
180               int unspec = 0, val = 0;
181               const char *arg = var;
182
183               while (isalnum ((unsigned char) *arg) || *arg == '-' || *arg == '_')
184                 arg++;
185               var_len = arg - var;
186
187               SKIPWS (arg);
188
189               if (*arg == '\0' || *arg == ',')
190                 unspec = 1;
191               else if (*arg == '=')
192                 {
193                   arg++;
194                   SKIPWS (arg);
195                 }
196
197               if (unspec)
198                 {
199                   if (var[0] == 'n' && var[1] == 'o' && var[2] == '-')
200                     {
201                       val = 0;
202                       var += 3;
203                       var_len -= 3;
204                     }
205                   else
206                     val = 1;
207                 }
208               else if (isdigit ((unsigned char) *arg))
209                 {
210                   val = atoi (arg);
211                   while (isdigit ((unsigned char) *arg))
212                     arg++;
213                   SKIPWS (arg);
214                 }
215
216               for (un = uparam_names; un->name; un++)
217                 if (strlen (un->name) == var_len
218                     && strncmp (var, un->name, var_len) == 0)
219                   {
220                     if (unspec && !un->is_bool)
221                       __argp_failure (state, 0, 0,
222                                       dgettext (state->root_argp->argp_domain,
223                                                 "\
224 %.*s: ARGP_HELP_FMT parameter requires a value"),
225                                       (int) var_len, var);
226                     else if (val < 0)
227                       __argp_failure (state, 0, 0,
228                                       dgettext (state->root_argp->argp_domain,
229                                                 "\
230 %.*s: ARGP_HELP_FMT parameter must be positive"),
231                                       (int) var_len, var);
232                     else
233                       *(int *)((char *)&new_params + un->uparams_offs) = val;
234                     break;
235                   }
236               if (! un->name)
237                 __argp_failure (state, 0, 0,
238                                 dgettext (state->root_argp->argp_domain, "\
239 %.*s: Unknown ARGP_HELP_FMT parameter"),
240                                 (int) var_len, var);
241
242               var = arg;
243               if (*var == ',')
244                 var++;
245             }
246           else if (*var)
247             {
248               __argp_failure (state, 0, 0,
249                               dgettext (state->root_argp->argp_domain,
250                                         "Garbage in ARGP_HELP_FMT: %s"), var);
251               break;
252             }
253         }
254       validate_uparams (state, &new_params);
255     }
256 }
257 \f
258 /* Returns true if OPT hasn't been marked invisible.  Visibility only affects
259    whether OPT is displayed or used in sorting, not option shadowing.  */
260 #define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN))
261
262 /* Returns true if OPT is an alias for an earlier option.  */
263 #define oalias(opt) ((opt)->flags & OPTION_ALIAS)
264
265 /* Returns true if OPT is a documentation-only entry.  */
266 #define odoc(opt) ((opt)->flags & OPTION_DOC)
267
268 /* Returns true if OPT should not be translated */
269 #define onotrans(opt) ((opt)->flags & OPTION_NO_TRANS)
270
271 /* Returns true if OPT is the end-of-list marker for a list of options.  */
272 #define oend(opt) __option_is_end (opt)
273
274 /* Returns true if OPT has a short option.  */
275 #define oshort(opt) __option_is_short (opt)
276 \f
277 /*
278    The help format for a particular option is like:
279
280      -xARG, -yARG, --long1=ARG, --long2=ARG        Documentation...
281
282    Where ARG will be omitted if there's no argument, for this option, or
283    will be surrounded by "[" and "]" appropriately if the argument is
284    optional.  The documentation string is word-wrapped appropriately, and if
285    the list of options is long enough, it will be started on a separate line.
286    If there are no short options for a given option, the first long option is
287    indented slightly in a way that's supposed to make most long options appear
288    to be in a separate column.
289
290    For example, the following output (from ps):
291
292      -p PID, --pid=PID          List the process PID
293          --pgrp=PGRP            List processes in the process group PGRP
294      -P, -x, --no-parent        Include processes without parents
295      -Q, --all-fields           Don't elide unusable fields (normally if there's
296                                 some reason ps can't print a field for any
297                                 process, it's removed from the output entirely)
298      -r, --reverse, --gratuitously-long-reverse-option
299                                 Reverse the order of any sort
300          --session[=SID]        Add the processes from the session SID (which
301                                 defaults to the sid of the current process)
302
303     Here are some more options:
304      -f ZOT, --foonly=ZOT       Glork a foonly
305      -z, --zaza                 Snit a zar
306
307      -?, --help                 Give this help list
308          --usage                Give a short usage message
309      -V, --version              Print program version
310
311    The struct argp_option array for the above could look like:
312
313    {
314      {"pid",       'p',      "PID",  0, "List the process PID"},
315      {"pgrp",      OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},
316      {"no-parent", 'P',       0,     0, "Include processes without parents"},
317      {0,           'x',       0,     OPTION_ALIAS},
318      {"all-fields",'Q',       0,     0, "Don't elide unusable fields (normally"
319                                         " if there's some reason ps can't"
320                                         " print a field for any process, it's"
321                                         " removed from the output entirely)" },
322      {"reverse",   'r',       0,     0, "Reverse the order of any sort"},
323      {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},
324      {"session",   OPT_SESS,  "SID", OPTION_ARG_OPTIONAL,
325                                         "Add the processes from the session"
326                                         " SID (which defaults to the sid of"
327                                         " the current process)" },
328
329      {0,0,0,0, "Here are some more options:"},
330      {"foonly", 'f', "ZOT", 0, "Glork a foonly"},
331      {"zaza", 'z', 0, 0, "Snit a zar"},
332
333      {0}
334    }
335
336    Note that the last three options are automatically supplied by argp_parse,
337    unless you tell it not to with ARGP_NO_HELP.
338
339 */
340 \f
341 /* Returns true if CH occurs between BEG and END.  */
342 static int
343 find_char (char ch, char *beg, char *end)
344 {
345   while (beg < end)
346     if (*beg == ch)
347       return 1;
348     else
349       beg++;
350   return 0;
351 }
352 \f
353 struct hol_cluster;             /* fwd decl */
354
355 struct hol_entry
356 {
357   /* First option.  */
358   const struct argp_option *opt;
359   /* Number of options (including aliases).  */
360   unsigned num;
361
362   /* A pointers into the HOL's short_options field, to the first short option
363      letter for this entry.  The order of the characters following this point
364      corresponds to the order of options pointed to by OPT, and there are at
365      most NUM.  A short option recorded in an option following OPT is only
366      valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
367      probably been shadowed by some other entry).  */
368   char *short_options;
369
370   /* Entries are sorted by their group first, in the order:
371        1, 2, ..., n, 0, -m, ..., -2, -1
372      and then alphabetically within each group.  The default is 0.  */
373   int group;
374
375   /* The cluster of options this entry belongs to, or 0 if none.  */
376   struct hol_cluster *cluster;
377
378   /* The argp from which this option came.  */
379   const struct argp *argp;
380
381   /* Position in the array */
382   unsigned ord;
383 };
384
385 /* A cluster of entries to reflect the argp tree structure.  */
386 struct hol_cluster
387 {
388   /* A descriptive header printed before options in this cluster.  */
389   const char *header;
390
391   /* Used to order clusters within the same group with the same parent,
392      according to the order in which they occurred in the parent argp's child
393      list.  */
394   int index;
395
396   /* How to sort this cluster with respect to options and other clusters at the
397      same depth (clusters always follow options in the same group).  */
398   int group;
399
400   /* The cluster to which this cluster belongs, or 0 if it's at the base
401      level.  */
402   struct hol_cluster *parent;
403
404   /* The argp from which this cluster is (eventually) derived.  */
405   const struct argp *argp;
406
407   /* The distance this cluster is from the root.  */
408   int depth;
409
410   /* Clusters in a given hol are kept in a linked list, to make freeing them
411      possible.  */
412   struct hol_cluster *next;
413 };
414
415 /* A list of options for help.  */
416 struct hol
417 {
418   /* An array of hol_entry's.  */
419   struct hol_entry *entries;
420   /* The number of entries in this hol.  If this field is zero, the others
421      are undefined.  */
422   unsigned num_entries;
423
424   /* A string containing all short options in this HOL.  Each entry contains
425      pointers into this string, so the order can't be messed with blindly.  */
426   char *short_options;
427
428   /* Clusters of entries in this hol.  */
429   struct hol_cluster *clusters;
430 };
431 \f
432 /* Create a struct hol from the options in ARGP.  CLUSTER is the
433    hol_cluster in which these entries occur, or 0, if at the root.  */
434 static struct hol *
435 make_hol (const struct argp *argp, struct hol_cluster *cluster)
436 {
437   char *so;
438   const struct argp_option *o;
439   const struct argp_option *opts = argp->options;
440   struct hol_entry *entry;
441   unsigned num_short_options = 0;
442   struct hol *hol = malloc (sizeof (struct hol));
443
444   assert (hol);
445
446   hol->num_entries = 0;
447   hol->clusters = 0;
448
449   if (opts)
450     {
451       int cur_group = 0;
452
453       /* The first option must not be an alias.  */
454       assert (! oalias (opts));
455
456       /* Calculate the space needed.  */
457       for (o = opts; ! oend (o); o++)
458         {
459           if (! oalias (o))
460             hol->num_entries++;
461           if (oshort (o))
462             num_short_options++;        /* This is an upper bound.  */
463         }
464
465       hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries);
466       hol->short_options = malloc (num_short_options + 1);
467
468       assert (hol->entries && hol->short_options);
469       if (SIZE_MAX <= UINT_MAX)
470         assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry));
471
472       /* Fill in the entries.  */
473       so = hol->short_options;
474       for (o = opts, entry = hol->entries; ! oend (o); entry++)
475         {
476           entry->opt = o;
477           entry->num = 0;
478           entry->short_options = so;
479           entry->group = cur_group =
480             o->group
481             ? o->group
482             : ((!o->name && !o->key)
483                ? cur_group + 1
484                : cur_group);
485           entry->cluster = cluster;
486           entry->argp = argp;
487
488           do
489             {
490               entry->num++;
491               if (oshort (o) && ! find_char (o->key, hol->short_options, so))
492                 /* O has a valid short option which hasn't already been used.*/
493                 *so++ = o->key;
494               o++;
495             }
496           while (! oend (o) && oalias (o));
497         }
498       *so = '\0';               /* null terminated so we can find the length */
499     }
500
501   return hol;
502 }
503 \f
504 /* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the
505    associated argp child list entry), INDEX, and PARENT, and return a pointer
506    to it.  ARGP is the argp that this cluster results from.  */
507 static struct hol_cluster *
508 hol_add_cluster (struct hol *hol, int group, const char *header, int index,
509                  struct hol_cluster *parent, const struct argp *argp)
510 {
511   struct hol_cluster *cl = malloc (sizeof (struct hol_cluster));
512   if (cl)
513     {
514       cl->group = group;
515       cl->header = header;
516
517       cl->index = index;
518       cl->parent = parent;
519       cl->argp = argp;
520       cl->depth = parent ? parent->depth + 1 : 0;
521
522       cl->next = hol->clusters;
523       hol->clusters = cl;
524     }
525   return cl;
526 }
527 \f
528 /* Free HOL and any resources it uses.  */
529 static void
530 hol_free (struct hol *hol)
531 {
532   struct hol_cluster *cl = hol->clusters;
533
534   while (cl)
535     {
536       struct hol_cluster *next = cl->next;
537       free (cl);
538       cl = next;
539     }
540
541   if (hol->num_entries > 0)
542     {
543       free (hol->entries);
544       free (hol->short_options);
545     }
546
547   free (hol);
548 }
549 \f
550 static int
551 hol_entry_short_iterate (const struct hol_entry *entry,
552                          int (*func)(const struct argp_option *opt,
553                                      const struct argp_option *real,
554                                      const char *domain, void *cookie),
555                          const char *domain, void *cookie)
556 {
557   unsigned nopts;
558   int val = 0;
559   const struct argp_option *opt, *real = entry->opt;
560   char *so = entry->short_options;
561
562   for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
563     if (oshort (opt) && *so == opt->key)
564       {
565         if (!oalias (opt))
566           real = opt;
567         if (ovisible (opt))
568           val = (*func)(opt, real, domain, cookie);
569         so++;
570       }
571
572   return val;
573 }
574
575 static inline int
576 #if __GNUC__ >= 3
577 __attribute__ ((always_inline))
578 #endif
579 hol_entry_long_iterate (const struct hol_entry *entry,
580                         int (*func)(const struct argp_option *opt,
581                                     const struct argp_option *real,
582                                     const char *domain, void *cookie),
583                         const char *domain, void *cookie)
584 {
585   unsigned nopts;
586   int val = 0;
587   const struct argp_option *opt, *real = entry->opt;
588
589   for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
590     if (opt->name)
591       {
592         if (!oalias (opt))
593           real = opt;
594         if (ovisible (opt))
595           val = (*func)(opt, real, domain, cookie);
596       }
597
598   return val;
599 }
600 \f
601 /* Iterator that returns true for the first short option.  */
602 static int
603 until_short (const struct argp_option *opt, const struct argp_option *real,
604              const char *domain, void *cookie)
605 {
606   return oshort (opt) ? opt->key : 0;
607 }
608
609 /* Returns the first valid short option in ENTRY, or 0 if there is none.  */
610 static char
611 hol_entry_first_short (const struct hol_entry *entry)
612 {
613   return hol_entry_short_iterate (entry, until_short,
614                                   entry->argp->argp_domain, 0);
615 }
616
617 /* Returns the first valid long option in ENTRY, or 0 if there is none.  */
618 static const char *
619 hol_entry_first_long (const struct hol_entry *entry)
620 {
621   const struct argp_option *opt;
622   unsigned num;
623   for (opt = entry->opt, num = entry->num; num > 0; opt++, num--)
624     if (opt->name && ovisible (opt))
625       return opt->name;
626   return 0;
627 }
628
629 /* Returns the entry in HOL with the long option name NAME, or 0 if there is
630    none.  */
631 static struct hol_entry *
632 hol_find_entry (struct hol *hol, const char *name)
633 {
634   struct hol_entry *entry = hol->entries;
635   unsigned num_entries = hol->num_entries;
636
637   while (num_entries-- > 0)
638     {
639       const struct argp_option *opt = entry->opt;
640       unsigned num_opts = entry->num;
641
642       while (num_opts-- > 0)
643         if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0)
644           return entry;
645         else
646           opt++;
647
648       entry++;
649     }
650
651   return 0;
652 }
653 \f
654 /* If an entry with the long option NAME occurs in HOL, set its special
655    sort position to GROUP.  */
656 static void
657 hol_set_group (struct hol *hol, const char *name, int group)
658 {
659   struct hol_entry *entry = hol_find_entry (hol, name);
660   if (entry)
661     entry->group = group;
662 }
663 \f
664 /* Order by group:  0, 1, 2, ..., n, -m, ..., -2, -1.
665    EQ is what to return if GROUP1 and GROUP2 are the same.  */
666 static int
667 group_cmp (int group1, int group2, int eq)
668 {
669   if (group1 == group2)
670     return eq;
671   else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0))
672     return group1 - group2;
673   else
674     return group2 - group1;
675 }
676
677 /* Compare clusters CL1 & CL2 by the order that they should appear in
678    output.  */
679 static int
680 hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)
681 {
682   /* If one cluster is deeper than the other, use its ancestor at the same
683      level, so that finding the common ancestor is straightforward.
684
685      clN->depth > 0 means that clN->parent != NULL (see hol_add_cluster) */
686   while (cl1->depth > cl2->depth)
687     cl1 = cl1->parent;
688   while (cl2->depth > cl1->depth)
689     cl2 = cl2->parent;
690
691   /* Now reduce both clusters to their ancestors at the point where both have
692      a common parent; these can be directly compared.  */
693   while (cl1->parent != cl2->parent)
694     cl1 = cl1->parent, cl2 = cl2->parent;
695
696   return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index);
697 }
698
699 /* Return the ancestor of CL that's just below the root (i.e., has a parent
700    of 0).  */
701 static struct hol_cluster *
702 hol_cluster_base (struct hol_cluster *cl)
703 {
704   while (cl->parent)
705     cl = cl->parent;
706   return cl;
707 }
708
709 /* Return true if CL1 is a child of CL2.  */
710 static int
711 hol_cluster_is_child (const struct hol_cluster *cl1,
712                       const struct hol_cluster *cl2)
713 {
714   while (cl1 && cl1 != cl2)
715     cl1 = cl1->parent;
716   return cl1 == cl2;
717 }
718 \f
719 /* Given the name of an OPTION_DOC option, modifies NAME to start at the tail
720    that should be used for comparisons, and returns true iff it should be
721    treated as a non-option.  */
722 static int
723 canon_doc_option (const char **name)
724 {
725   int non_opt;
726
727   if (!*name)
728     non_opt = 1;
729   else
730     {
731       /* Skip initial whitespace.  */
732       while (isspace ((unsigned char) **name))
733         (*name)++;
734       /* Decide whether this looks like an option (leading '-') or not.  */
735       non_opt = (**name != '-');
736       /* Skip until part of name used for sorting.  */
737       while (**name && !isalnum ((unsigned char) **name))
738         (*name)++;
739     }
740   return non_opt;
741 }
742
743 #define HOL_ENTRY_PTRCMP(a,b) ((a)->ord < (b)->ord ? -1 : 1)
744
745 /* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
746    listing.  */
747 static int
748 hol_entry_cmp (const struct hol_entry *entry1,
749                const struct hol_entry *entry2)
750 {
751   /* The group numbers by which the entries should be ordered; if either is
752      in a cluster, then this is just the group within the cluster.  */
753   int group1 = entry1->group, group2 = entry2->group;
754   int rc;
755
756   if (entry1->cluster != entry2->cluster)
757     {
758       /* The entries are not within the same cluster, so we can't compare them
759          directly, we have to use the appropriate clustering level too.  */
760       if (! entry1->cluster)
761         /* ENTRY1 is at the "base level", not in a cluster, so we have to
762            compare it's group number with that of the base cluster in which
763            ENTRY2 resides.  Note that if they're in the same group, the
764            clustered option always comes laster.  */
765         return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1);
766       else if (! entry2->cluster)
767         /* Likewise, but ENTRY2's not in a cluster.  */
768         return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1);
769       else
770         /* Both entries are in clusters, we can just compare the clusters.  */
771         return (rc = hol_cluster_cmp (entry1->cluster, entry2->cluster)) ?
772                rc : HOL_ENTRY_PTRCMP (entry1, entry2);
773     }
774   else if (group1 == group2)
775     /* The entries are both in the same cluster and group, so compare them
776        alphabetically.  */
777     {
778       int short1 = hol_entry_first_short (entry1);
779       int short2 = hol_entry_first_short (entry2);
780       int doc1 = odoc (entry1->opt);
781       int doc2 = odoc (entry2->opt);
782       const char *long1 = hol_entry_first_long (entry1);
783       const char *long2 = hol_entry_first_long (entry2);
784
785       if (doc1)
786         doc1 = canon_doc_option (&long1);
787       if (doc2)
788         doc2 = canon_doc_option (&long2);
789
790       if (doc1 != doc2)
791         /* "documentation" options always follow normal options (or
792            documentation options that *look* like normal options).  */
793         return doc1 - doc2;
794       else if (!short1 && !short2 && long1 && long2)
795         /* Only long options.  */
796         return (rc = __strcasecmp (long1, long2)) ?
797                rc : HOL_ENTRY_PTRCMP (entry1, entry2);
798       else
799         /* Compare short/short, long/short, short/long, using the first
800            character of long options.  Entries without *any* valid
801            options (such as options with OPTION_HIDDEN set) will be put
802            first, but as they're not displayed, it doesn't matter where
803            they are.  */
804         {
805           unsigned char first1 = short1 ? short1 : long1 ? *long1 : 0;
806           unsigned char first2 = short2 ? short2 : long2 ? *long2 : 0;
807           /* Use tolower, not _tolower, since only the former is
808              guaranteed to work on something already lower case.  */
809           int lower_cmp = tolower (first1) - tolower (first2);
810           /* Compare ignoring case, except when the options are both the
811              same letter, in which case lower-case always comes first.  */
812           return lower_cmp ? lower_cmp :
813                  (rc = first2 - first1) ?
814                  rc : HOL_ENTRY_PTRCMP (entry1, entry2);
815         }
816     }
817   else
818     /* Within the same cluster, but not the same group, so just compare
819        groups.  */
820     return group_cmp (group1, group2, HOL_ENTRY_PTRCMP (entry1, entry2));
821 }
822
823 /* Version of hol_entry_cmp with correct signature for qsort.  */
824 static int
825 hol_entry_qcmp (const void *entry1_v, const void *entry2_v)
826 {
827   return hol_entry_cmp (entry1_v, entry2_v);
828 }
829
830 /* Sort HOL by group and alphabetically by option name (with short options
831    taking precedence over long).  Since the sorting is for display purposes
832    only, the shadowing of options isn't effected.  */
833 static void
834 hol_sort (struct hol *hol)
835 {
836   if (hol->num_entries > 0)
837     {
838       unsigned i;
839       struct hol_entry *e;
840       for (i = 0, e = hol->entries; i < hol->num_entries; i++, e++)
841         e->ord = i;
842       qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry),
843              hol_entry_qcmp);
844     }
845 }
846 \f
847 /* Append MORE to HOL, destroying MORE in the process.  Options in HOL shadow
848    any in MORE with the same name.  */
849 static void
850 hol_append (struct hol *hol, struct hol *more)
851 {
852   struct hol_cluster **cl_end = &hol->clusters;
853
854   /* Steal MORE's cluster list, and add it to the end of HOL's.  */
855   while (*cl_end)
856     cl_end = &(*cl_end)->next;
857   *cl_end = more->clusters;
858   more->clusters = 0;
859
860   /* Merge entries.  */
861   if (more->num_entries > 0)
862     {
863       if (hol->num_entries == 0)
864         {
865           hol->num_entries = more->num_entries;
866           hol->entries = more->entries;
867           hol->short_options = more->short_options;
868           more->num_entries = 0;        /* Mark MORE's fields as invalid.  */
869         }
870       else
871         /* Append the entries in MORE to those in HOL, taking care to only add
872            non-shadowed SHORT_OPTIONS values.  */
873         {
874           unsigned left;
875           char *so, *more_so;
876           struct hol_entry *e;
877           unsigned num_entries = hol->num_entries + more->num_entries;
878           struct hol_entry *entries =
879             malloc (num_entries * sizeof (struct hol_entry));
880           unsigned hol_so_len = strlen (hol->short_options);
881           char *short_options =
882             malloc (hol_so_len + strlen (more->short_options) + 1);
883
884           assert (entries && short_options);
885           if (SIZE_MAX <= UINT_MAX)
886             assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry));
887
888           __mempcpy (__mempcpy (entries, hol->entries,
889                                 hol->num_entries * sizeof (struct hol_entry)),
890                      more->entries,
891                      more->num_entries * sizeof (struct hol_entry));
892
893           __mempcpy (short_options, hol->short_options, hol_so_len);
894
895           /* Fix up the short options pointers from HOL.  */
896           for (e = entries, left = hol->num_entries; left > 0; e++, left--)
897             e->short_options =
898               short_options + (e->short_options - hol->short_options);
899
900           /* Now add the short options from MORE, fixing up its entries
901              too.  */
902           so = short_options + hol_so_len;
903           more_so = more->short_options;
904           for (left = more->num_entries; left > 0; e++, left--)
905             {
906               int opts_left;
907               const struct argp_option *opt;
908
909               e->short_options = so;
910
911               for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--)
912                 {
913                   int ch = *more_so;
914                   if (oshort (opt) && ch == opt->key)
915                     /* The next short option in MORE_SO, CH, is from OPT.  */
916                     {
917                       if (! find_char (ch, short_options,
918                                        short_options + hol_so_len))
919                         /* The short option CH isn't shadowed by HOL's options,
920                            so add it to the sum.  */
921                         *so++ = ch;
922                       more_so++;
923                     }
924                 }
925             }
926
927           *so = '\0';
928
929           free (hol->entries);
930           free (hol->short_options);
931
932           hol->entries = entries;
933           hol->num_entries = num_entries;
934           hol->short_options = short_options;
935         }
936     }
937
938   hol_free (more);
939 }
940 \f
941 /* Inserts enough spaces to make sure STREAM is at column COL.  */
942 static void
943 indent_to (argp_fmtstream_t stream, unsigned col)
944 {
945   int needed = col - __argp_fmtstream_point (stream);
946   while (needed-- > 0)
947     __argp_fmtstream_putc (stream, ' ');
948 }
949
950 /* Output to STREAM either a space, or a newline if there isn't room for at
951    least ENSURE characters before the right margin.  */
952 static void
953 space (argp_fmtstream_t stream, size_t ensure)
954 {
955   if (__argp_fmtstream_point (stream) + ensure
956       >= __argp_fmtstream_rmargin (stream))
957     __argp_fmtstream_putc (stream, '\n');
958   else
959     __argp_fmtstream_putc (stream, ' ');
960 }
961
962 /* If the option REAL has an argument, we print it in using the printf
963    format REQ_FMT or OPT_FMT depending on whether it's a required or
964    optional argument.  */
965 static void
966 arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,
967      const char *domain, argp_fmtstream_t stream)
968 {
969   if (real->arg)
970     {
971       if (real->flags & OPTION_ARG_OPTIONAL)
972         __argp_fmtstream_printf (stream, opt_fmt,
973                                  dgettext (domain, real->arg));
974       else
975         __argp_fmtstream_printf (stream, req_fmt,
976                                  dgettext (domain, real->arg));
977     }
978 }
979 \f
980 /* Helper functions for hol_entry_help.  */
981
982 /* State used during the execution of hol_help.  */
983 struct hol_help_state
984 {
985   /* PREV_ENTRY should contain the previous entry printed, or 0.  */
986   struct hol_entry *prev_entry;
987
988   /* If an entry is in a different group from the previous one, and SEP_GROUPS
989      is true, then a blank line will be printed before any output. */
990   int sep_groups;
991
992   /* True if a duplicate option argument was suppressed (only ever set if
993      UPARAMS.dup_args is false).  */
994   int suppressed_dup_arg;
995 };
996
997 /* Some state used while printing a help entry (used to communicate with
998    helper functions).  See the doc for hol_entry_help for more info, as most
999    of the fields are copied from its arguments.  */
1000 struct pentry_state
1001 {
1002   const struct hol_entry *entry;
1003   argp_fmtstream_t stream;
1004   struct hol_help_state *hhstate;
1005
1006   /* True if nothing's been printed so far.  */
1007   int first;
1008
1009   /* If non-zero, the state that was used to print this help.  */
1010   const struct argp_state *state;
1011 };
1012
1013 /* If a user doc filter should be applied to DOC, do so.  */
1014 static const char *
1015 filter_doc (const char *doc, int key, const struct argp *argp,
1016             const struct argp_state *state)
1017 {
1018   if (argp->help_filter)
1019     /* We must apply a user filter to this output.  */
1020     {
1021       void *input = __argp_input (argp, state);
1022       return (*argp->help_filter) (key, doc, input);
1023     }
1024   else
1025     /* No filter.  */
1026     return doc;
1027 }
1028
1029 /* Prints STR as a header line, with the margin lines set appropriately, and
1030    notes the fact that groups should be separated with a blank line.  ARGP is
1031    the argp that should dictate any user doc filtering to take place.  Note
1032    that the previous wrap margin isn't restored, but the left margin is reset
1033    to 0.  */
1034 static void
1035 print_header (const char *str, const struct argp *argp,
1036               struct pentry_state *pest)
1037 {
1038   const char *tstr = dgettext (argp->argp_domain, str);
1039   const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state);
1040
1041   if (fstr)
1042     {
1043       if (*fstr)
1044         {
1045           if (pest->hhstate->prev_entry)
1046             /* Precede with a blank line.  */
1047             __argp_fmtstream_putc (pest->stream, '\n');
1048           indent_to (pest->stream, uparams.header_col);
1049           __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col);
1050           __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col);
1051           __argp_fmtstream_puts (pest->stream, fstr);
1052           __argp_fmtstream_set_lmargin (pest->stream, 0);
1053           __argp_fmtstream_putc (pest->stream, '\n');
1054         }
1055
1056       pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */
1057     }
1058
1059   if (fstr != tstr)
1060     free ((char *) fstr);
1061 }
1062
1063 /* Inserts a comma if this isn't the first item on the line, and then makes
1064    sure we're at least to column COL.  If this *is* the first item on a line,
1065    prints any pending whitespace/headers that should precede this line. Also
1066    clears FIRST.  */
1067 static void
1068 comma (unsigned col, struct pentry_state *pest)
1069 {
1070   if (pest->first)
1071     {
1072       const struct hol_entry *pe = pest->hhstate->prev_entry;
1073       const struct hol_cluster *cl = pest->entry->cluster;
1074
1075       if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group)
1076         __argp_fmtstream_putc (pest->stream, '\n');
1077
1078       if (cl && cl->header && *cl->header
1079           && (!pe
1080               || (pe->cluster != cl
1081                   && !hol_cluster_is_child (pe->cluster, cl))))
1082         /* If we're changing clusters, then this must be the start of the
1083            ENTRY's cluster unless that is an ancestor of the previous one
1084            (in which case we had just popped into a sub-cluster for a bit).
1085            If so, then print the cluster's header line.  */
1086         {
1087           int old_wm = __argp_fmtstream_wmargin (pest->stream);
1088           print_header (cl->header, cl->argp, pest);
1089           __argp_fmtstream_set_wmargin (pest->stream, old_wm);
1090         }
1091
1092       pest->first = 0;
1093     }
1094   else
1095     __argp_fmtstream_puts (pest->stream, ", ");
1096
1097   indent_to (pest->stream, col);
1098 }
1099 \f
1100 /* Print help for ENTRY to STREAM.  */
1101 static void
1102 hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
1103                 argp_fmtstream_t stream, struct hol_help_state *hhstate)
1104 {
1105   unsigned num;
1106   const struct argp_option *real = entry->opt, *opt;
1107   char *so = entry->short_options;
1108   int have_long_opt = 0;        /* We have any long options.  */
1109   /* Saved margins.  */
1110   int old_lm = __argp_fmtstream_set_lmargin (stream, 0);
1111   int old_wm = __argp_fmtstream_wmargin (stream);
1112   /* PEST is a state block holding some of our variables that we'd like to
1113      share with helper functions.  */
1114   struct pentry_state pest;
1115
1116   pest.entry = entry;
1117   pest.stream = stream;
1118   pest.hhstate = hhstate;
1119   pest.first = 1;
1120   pest.state = state;
1121
1122   if (! odoc (real))
1123     for (opt = real, num = entry->num; num > 0; opt++, num--)
1124       if (opt->name && ovisible (opt))
1125         {
1126           have_long_opt = 1;
1127           break;
1128         }
1129
1130   /* First emit short options.  */
1131   __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */
1132   for (opt = real, num = entry->num; num > 0; opt++, num--)
1133     if (oshort (opt) && opt->key == *so)
1134       /* OPT has a valid (non shadowed) short option.  */
1135       {
1136         if (ovisible (opt))
1137           {
1138             comma (uparams.short_opt_col, &pest);
1139             __argp_fmtstream_putc (stream, '-');
1140             __argp_fmtstream_putc (stream, *so);
1141             if (!have_long_opt || uparams.dup_args)
1142               arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream);
1143             else if (real->arg)
1144               hhstate->suppressed_dup_arg = 1;
1145           }
1146         so++;
1147       }
1148
1149   /* Now, long options.  */
1150   if (odoc (real))
1151     /* A "documentation" option.  */
1152     {
1153       __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
1154       for (opt = real, num = entry->num; num > 0; opt++, num--)
1155         if (opt->name && *opt->name && ovisible (opt))
1156           {
1157             comma (uparams.doc_opt_col, &pest);
1158             /* Calling dgettext here isn't quite right, since sorting will
1159                have been done on the original; but documentation options
1160                should be pretty rare anyway...  */
1161             __argp_fmtstream_puts (stream,
1162                                    onotrans (opt) ?
1163                                              opt->name :
1164                                    dgettext (state->root_argp->argp_domain,
1165                                              opt->name));
1166           }
1167     }
1168   else
1169     /* A real long option.  */
1170     {
1171       int first_long_opt = 1;
1172
1173       __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col);
1174       for (opt = real, num = entry->num; num > 0; opt++, num--)
1175         if (opt->name && ovisible (opt))
1176           {
1177             comma (uparams.long_opt_col, &pest);
1178             __argp_fmtstream_printf (stream, "--%s", opt->name);
1179             if (first_long_opt || uparams.dup_args)
1180               arg (real, "=%s", "[=%s]", state->root_argp->argp_domain,
1181                    stream);
1182             else if (real->arg)
1183               hhstate->suppressed_dup_arg = 1;
1184           }
1185     }
1186
1187   /* Next, documentation strings.  */
1188   __argp_fmtstream_set_lmargin (stream, 0);
1189
1190   if (pest.first)
1191     {
1192       /* Didn't print any switches, what's up?  */
1193       if (!oshort (real) && !real->name)
1194         /* This is a group header, print it nicely.  */
1195         print_header (real->doc, entry->argp, &pest);
1196       else
1197         /* Just a totally shadowed option or null header; print nothing.  */
1198         goto cleanup;           /* Just return, after cleaning up.  */
1199     }
1200   else
1201     {
1202       const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain,
1203                                                real->doc) : 0;
1204       const char *fstr = filter_doc (tstr, real->key, entry->argp, state);
1205       if (fstr && *fstr)
1206         {
1207           unsigned int col = __argp_fmtstream_point (stream);
1208
1209           __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col);
1210           __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col);
1211
1212           if (col > (unsigned int) (uparams.opt_doc_col + 3))
1213             __argp_fmtstream_putc (stream, '\n');
1214           else if (col >= (unsigned int) uparams.opt_doc_col)
1215             __argp_fmtstream_puts (stream, "   ");
1216           else
1217             indent_to (stream, uparams.opt_doc_col);
1218
1219           __argp_fmtstream_puts (stream, fstr);
1220         }
1221       if (fstr && fstr != tstr)
1222         free ((char *) fstr);
1223
1224       /* Reset the left margin.  */
1225       __argp_fmtstream_set_lmargin (stream, 0);
1226       __argp_fmtstream_putc (stream, '\n');
1227     }
1228
1229   hhstate->prev_entry = entry;
1230
1231 cleanup:
1232   __argp_fmtstream_set_lmargin (stream, old_lm);
1233   __argp_fmtstream_set_wmargin (stream, old_wm);
1234 }
1235 \f
1236 /* Output a long help message about the options in HOL to STREAM.  */
1237 static void
1238 hol_help (struct hol *hol, const struct argp_state *state,
1239           argp_fmtstream_t stream)
1240 {
1241   unsigned num;
1242   struct hol_entry *entry;
1243   struct hol_help_state hhstate = { 0, 0, 0 };
1244
1245   for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--)
1246     hol_entry_help (entry, state, stream, &hhstate);
1247
1248   if (hhstate.suppressed_dup_arg && uparams.dup_args_note)
1249     {
1250       const char *tstr = dgettext (state->root_argp->argp_domain, "\
1251 Mandatory or optional arguments to long options are also mandatory or \
1252 optional for any corresponding short options.");
1253       const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
1254                                      state ? state->root_argp : 0, state);
1255       if (fstr && *fstr)
1256         {
1257           __argp_fmtstream_putc (stream, '\n');
1258           __argp_fmtstream_puts (stream, fstr);
1259           __argp_fmtstream_putc (stream, '\n');
1260         }
1261       if (fstr && fstr != tstr)
1262         free ((char *) fstr);
1263     }
1264 }
1265 \f
1266 /* Helper functions for hol_usage.  */
1267
1268 /* If OPT is a short option without an arg, append its key to the string
1269    pointer pointer to by COOKIE, and advance the pointer.  */
1270 static int
1271 add_argless_short_opt (const struct argp_option *opt,
1272                        const struct argp_option *real,
1273                        const char *domain, void *cookie)
1274 {
1275   char **snao_end = cookie;
1276   if (!(opt->arg || real->arg)
1277       && !((opt->flags | real->flags) & OPTION_NO_USAGE))
1278     *(*snao_end)++ = opt->key;
1279   return 0;
1280 }
1281
1282 /* If OPT is a short option with an arg, output a usage entry for it to the
1283    stream pointed at by COOKIE.  */
1284 static int
1285 usage_argful_short_opt (const struct argp_option *opt,
1286                         const struct argp_option *real,
1287                         const char *domain, void *cookie)
1288 {
1289   argp_fmtstream_t stream = cookie;
1290   const char *arg = opt->arg;
1291   int flags = opt->flags | real->flags;
1292
1293   if (! arg)
1294     arg = real->arg;
1295
1296   if (arg && !(flags & OPTION_NO_USAGE))
1297     {
1298       arg = dgettext (domain, arg);
1299
1300       if (flags & OPTION_ARG_OPTIONAL)
1301         __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg);
1302       else
1303         {
1304           /* Manually do line wrapping so that it (probably) won't
1305              get wrapped at the embedded space.  */
1306           space (stream, 6 + strlen (arg));
1307           __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg);
1308         }
1309     }
1310
1311   return 0;
1312 }
1313
1314 /* Output a usage entry for the long option opt to the stream pointed at by
1315    COOKIE.  */
1316 static int
1317 usage_long_opt (const struct argp_option *opt,
1318                 const struct argp_option *real,
1319                 const char *domain, void *cookie)
1320 {
1321   argp_fmtstream_t stream = cookie;
1322   const char *arg = opt->arg;
1323   int flags = opt->flags | real->flags;
1324
1325   if (! arg)
1326     arg = real->arg;
1327
1328   if (! (flags & OPTION_NO_USAGE) && !odoc (opt))
1329     {
1330       if (arg)
1331         {
1332           arg = dgettext (domain, arg);
1333           if (flags & OPTION_ARG_OPTIONAL)
1334             __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg);
1335           else
1336             __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg);
1337         }
1338       else
1339         __argp_fmtstream_printf (stream, " [--%s]", opt->name);
1340     }
1341
1342   return 0;
1343 }
1344 \f
1345 /* Print a short usage description for the arguments in HOL to STREAM.  */
1346 static void
1347 hol_usage (struct hol *hol, argp_fmtstream_t stream)
1348 {
1349   if (hol->num_entries > 0)
1350     {
1351       unsigned nentries;
1352       struct hol_entry *entry;
1353       char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1);
1354       char *snao_end = short_no_arg_opts;
1355
1356       /* First we put a list of short options without arguments.  */
1357       for (entry = hol->entries, nentries = hol->num_entries
1358            ; nentries > 0
1359            ; entry++, nentries--)
1360         hol_entry_short_iterate (entry, add_argless_short_opt,
1361                                  entry->argp->argp_domain, &snao_end);
1362       if (snao_end > short_no_arg_opts)
1363         {
1364           *snao_end++ = 0;
1365           __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts);
1366         }
1367
1368       /* Now a list of short options *with* arguments.  */
1369       for (entry = hol->entries, nentries = hol->num_entries
1370            ; nentries > 0
1371            ; entry++, nentries--)
1372         hol_entry_short_iterate (entry, usage_argful_short_opt,
1373                                  entry->argp->argp_domain, stream);
1374
1375       /* Finally, a list of long options (whew!).  */
1376       for (entry = hol->entries, nentries = hol->num_entries
1377            ; nentries > 0
1378            ; entry++, nentries--)
1379         hol_entry_long_iterate (entry, usage_long_opt,
1380                                 entry->argp->argp_domain, stream);
1381     }
1382 }
1383 \f
1384 /* Make a HOL containing all levels of options in ARGP.  CLUSTER is the
1385    cluster in which ARGP's entries should be clustered, or 0.  */
1386 static struct hol *
1387 argp_hol (const struct argp *argp, struct hol_cluster *cluster)
1388 {
1389   const struct argp_child *child = argp->children;
1390   struct hol *hol = make_hol (argp, cluster);
1391   if (child)
1392     while (child->argp)
1393       {
1394         struct hol_cluster *child_cluster =
1395           ((child->group || child->header)
1396            /* Put CHILD->argp within its own cluster.  */
1397            ? hol_add_cluster (hol, child->group, child->header,
1398                               child - argp->children, cluster, argp)
1399            /* Just merge it into the parent's cluster.  */
1400            : cluster);
1401         hol_append (hol, argp_hol (child->argp, child_cluster)) ;
1402         child++;
1403       }
1404   return hol;
1405 }
1406 \f
1407 /* Calculate how many different levels with alternative args strings exist in
1408    ARGP.  */
1409 static size_t
1410 argp_args_levels (const struct argp *argp)
1411 {
1412   size_t levels = 0;
1413   const struct argp_child *child = argp->children;
1414
1415   if (argp->args_doc && strchr (argp->args_doc, '\n'))
1416     levels++;
1417
1418   if (child)
1419     while (child->argp)
1420       levels += argp_args_levels ((child++)->argp);
1421
1422   return levels;
1423 }
1424
1425 /* Print all the non-option args documented in ARGP to STREAM.  Any output is
1426    preceded by a space.  LEVELS is a pointer to a byte vector the length
1427    returned by argp_args_levels; it should be initialized to zero, and
1428    updated by this routine for the next call if ADVANCE is true.  True is
1429    returned as long as there are more patterns to output.  */
1430 static int
1431 argp_args_usage (const struct argp *argp, const struct argp_state *state,
1432                  char **levels, int advance, argp_fmtstream_t stream)
1433 {
1434   char *our_level = *levels;
1435   int multiple = 0;
1436   const struct argp_child *child = argp->children;
1437   const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0;
1438   const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
1439
1440   if (fdoc)
1441     {
1442       const char *cp = fdoc;
1443       nl = __strchrnul (cp, '\n');
1444       if (*nl != '\0')
1445         /* This is a "multi-level" args doc; advance to the correct position
1446            as determined by our state in LEVELS, and update LEVELS.  */
1447         {
1448           int i;
1449           multiple = 1;
1450           for (i = 0; i < *our_level; i++)
1451             cp = nl + 1, nl = __strchrnul (cp, '\n');
1452           (*levels)++;
1453         }
1454
1455       /* Manually do line wrapping so that it (probably) won't get wrapped at
1456          any embedded spaces.  */
1457       space (stream, 1 + nl - cp);
1458
1459       __argp_fmtstream_write (stream, cp, nl - cp);
1460     }
1461   if (fdoc && fdoc != tdoc)
1462     free ((char *)fdoc);        /* Free user's modified doc string.  */
1463
1464   if (child)
1465     while (child->argp)
1466       advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream);
1467
1468   if (advance && multiple)
1469     {
1470       /* Need to increment our level.  */
1471       if (*nl)
1472         /* There's more we can do here.  */
1473         {
1474           (*our_level)++;
1475           advance = 0;          /* Our parent shouldn't advance also. */
1476         }
1477       else if (*our_level > 0)
1478         /* We had multiple levels, but used them up; reset to zero.  */
1479         *our_level = 0;
1480     }
1481
1482   return !advance;
1483 }
1484 \f
1485 /* Print the documentation for ARGP to STREAM; if POST is false, then
1486    everything preceding a '\v' character in the documentation strings (or
1487    the whole string, for those with none) is printed, otherwise, everything
1488    following the '\v' character (nothing for strings without).  Each separate
1489    bit of documentation is separated a blank line, and if PRE_BLANK is true,
1490    then the first is as well.  If FIRST_ONLY is true, only the first
1491    occurrence is output.  Returns true if anything was output.  */
1492 static int
1493 argp_doc (const struct argp *argp, const struct argp_state *state,
1494           int post, int pre_blank, int first_only,
1495           argp_fmtstream_t stream)
1496 {
1497   const char *text;
1498   const char *inp_text;
1499   size_t inp_text_len = 0;
1500   const char *trans_text;
1501   void *input = 0;
1502   int anything = 0;
1503   const struct argp_child *child = argp->children;
1504
1505   if (argp->doc)
1506     {
1507       char *vt = strchr (argp->doc, '\v');
1508       if (vt)
1509         {
1510           if (post)
1511             inp_text = vt + 1;
1512           else
1513             {
1514               inp_text_len = vt - argp->doc;
1515               inp_text = __strndup (argp->doc, inp_text_len);
1516             }
1517         }
1518       else
1519         inp_text = post ? 0 : argp->doc;
1520       trans_text = inp_text ? dgettext (argp->argp_domain, inp_text) : NULL;
1521     }
1522   else
1523     trans_text = inp_text = 0;
1524
1525   if (argp->help_filter)
1526     /* We have to filter the doc strings.  */
1527     {
1528       input = __argp_input (argp, state);
1529       text =
1530         (*argp->help_filter) (post
1531                               ? ARGP_KEY_HELP_POST_DOC
1532                               : ARGP_KEY_HELP_PRE_DOC,
1533                               trans_text, input);
1534     }
1535   else
1536     text = (const char *) trans_text;
1537
1538   if (text)
1539     {
1540       if (pre_blank)
1541         __argp_fmtstream_putc (stream, '\n');
1542
1543       __argp_fmtstream_puts (stream, text);
1544
1545       if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
1546         __argp_fmtstream_putc (stream, '\n');
1547
1548       anything = 1;
1549     }
1550
1551   if (text && text != trans_text)
1552     free ((char *) text);       /* Free TEXT returned from the help filter.  */
1553
1554   if (inp_text && inp_text_len)
1555     free ((char *) inp_text);   /* We copied INP_TEXT, so free it now.  */
1556
1557   if (post && argp->help_filter)
1558     /* Now see if we have to output an ARGP_KEY_HELP_EXTRA text.  */
1559     {
1560       text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
1561       if (text)
1562         {
1563           if (anything || pre_blank)
1564             __argp_fmtstream_putc (stream, '\n');
1565           __argp_fmtstream_puts (stream, text);
1566           free ((char *) text);
1567           if (__argp_fmtstream_point (stream)
1568               > __argp_fmtstream_lmargin (stream))
1569             __argp_fmtstream_putc (stream, '\n');
1570           anything = 1;
1571         }
1572     }
1573
1574   if (child)
1575     while (child->argp && !(first_only && anything))
1576       anything |=
1577         argp_doc ((child++)->argp, state,
1578                   post, anything || pre_blank, first_only,
1579                   stream);
1580
1581   return anything;
1582 }
1583 \f
1584 /* Output a usage message for ARGP to STREAM.  If called from
1585    argp_state_help, STATE is the relevant parsing state.  FLAGS are from the
1586    set ARGP_HELP_*.  NAME is what to use wherever a "program name" is
1587    needed. */
1588 static void
1589 _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
1590        unsigned flags, char *name)
1591 {
1592   int anything = 0;             /* Whether we've output anything.  */
1593   struct hol *hol = 0;
1594   argp_fmtstream_t fs;
1595
1596   if (! stream)
1597     return;
1598
1599 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1600   __flockfile (stream);
1601 #endif
1602
1603   if (! uparams.valid)
1604     fill_in_uparams (state);
1605
1606   fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);
1607   if (! fs)
1608     {
1609 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1610       __funlockfile (stream);
1611 #endif
1612       return;
1613     }
1614
1615   if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG))
1616     {
1617       hol = argp_hol (argp, 0);
1618
1619       /* If present, these options always come last.  */
1620       hol_set_group (hol, "help", -1);
1621       hol_set_group (hol, "version", -1);
1622
1623       hol_sort (hol);
1624     }
1625
1626   if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
1627     /* Print a short "Usage:" message.  */
1628     {
1629       int first_pattern = 1, more_patterns;
1630       size_t num_pattern_levels = argp_args_levels (argp);
1631       char *pattern_levels = alloca (num_pattern_levels);
1632
1633       memset (pattern_levels, 0, num_pattern_levels);
1634
1635       do
1636         {
1637           int old_lm;
1638           int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
1639           char *levels = pattern_levels;
1640
1641           if (first_pattern)
1642             __argp_fmtstream_printf (fs, "%s %s",
1643                                      dgettext (argp->argp_domain, "Usage:"),
1644                                      name);
1645           else
1646             __argp_fmtstream_printf (fs, "%s %s",
1647                                      dgettext (argp->argp_domain, "  or: "),
1648                                      name);
1649
1650           /* We set the lmargin as well as the wmargin, because hol_usage
1651              manually wraps options with newline to avoid annoying breaks.  */
1652           old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);
1653
1654           if (flags & ARGP_HELP_SHORT_USAGE)
1655             /* Just show where the options go.  */
1656             {
1657               if (hol->num_entries > 0)
1658                 __argp_fmtstream_puts (fs, dgettext (argp->argp_domain,
1659                                                      " [OPTION...]"));
1660             }
1661           else
1662             /* Actually print the options.  */
1663             {
1664               hol_usage (hol, fs);
1665               flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once.  */
1666             }
1667
1668           more_patterns = argp_args_usage (argp, state, &levels, 1, fs);
1669
1670           __argp_fmtstream_set_wmargin (fs, old_wm);
1671           __argp_fmtstream_set_lmargin (fs, old_lm);
1672
1673           __argp_fmtstream_putc (fs, '\n');
1674           anything = 1;
1675
1676           first_pattern = 0;
1677         }
1678       while (more_patterns);
1679     }
1680
1681   if (flags & ARGP_HELP_PRE_DOC)
1682     anything |= argp_doc (argp, state, 0, 0, 1, fs);
1683
1684   if (flags & ARGP_HELP_SEE)
1685     {
1686       __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
1687 Try '%s --help' or '%s --usage' for more information.\n"),
1688                                name, name);
1689       anything = 1;
1690     }
1691
1692   if (flags & ARGP_HELP_LONG)
1693     /* Print a long, detailed help message.  */
1694     {
1695       /* Print info about all the options.  */
1696       if (hol->num_entries > 0)
1697         {
1698           if (anything)
1699             __argp_fmtstream_putc (fs, '\n');
1700           hol_help (hol, state, fs);
1701           anything = 1;
1702         }
1703     }
1704
1705   if (flags & ARGP_HELP_POST_DOC)
1706     /* Print any documentation strings at the end.  */
1707     anything |= argp_doc (argp, state, 1, anything, 0, fs);
1708
1709   if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address)
1710     {
1711       if (anything)
1712         __argp_fmtstream_putc (fs, '\n');
1713       __argp_fmtstream_printf (fs, dgettext (argp->argp_domain,
1714                                              "Report bugs to %s.\n"),
1715                                argp_program_bug_address);
1716       anything = 1;
1717     }
1718
1719 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1720   __funlockfile (stream);
1721 #endif
1722
1723   if (hol)
1724     hol_free (hol);
1725
1726   __argp_fmtstream_free (fs);
1727 }
1728 \f
1729 /* Output a usage message for ARGP to STREAM.  FLAGS are from the set
1730    ARGP_HELP_*.  NAME is what to use wherever a "program name" is needed. */
1731 void __argp_help (const struct argp *argp, FILE *stream,
1732                   unsigned flags, char *name)
1733 {
1734   struct argp_state state;
1735   memset (&state, 0, sizeof state);
1736   state.root_argp = argp;
1737   _help (argp, &state, stream, flags, name);
1738 }
1739 #ifdef weak_alias
1740 weak_alias (__argp_help, argp_help)
1741 #endif
1742
1743 #if ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
1744 char *
1745 __argp_short_program_name (void)
1746 {
1747 # if HAVE_DECL_PROGRAM_INVOCATION_NAME
1748   return __argp_base_name (program_invocation_name);
1749 # else
1750   /* FIXME: What now? Miles suggests that it is better to use NULL,
1751      but currently the value is passed on directly to fputs_unlocked,
1752      so that requires more changes. */
1753 # if __GNUC__
1754 #  warning No reasonable value to return
1755 # endif /* __GNUC__ */
1756   return "";
1757 # endif
1758 }
1759 #endif
1760
1761 /* Output, if appropriate, a usage message for STATE to STREAM.  FLAGS are
1762    from the set ARGP_HELP_*.  */
1763 void
1764 __argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
1765 {
1766   if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream)
1767     {
1768       if (state && (state->flags & ARGP_LONG_ONLY))
1769         flags |= ARGP_HELP_LONG_ONLY;
1770
1771       _help (state ? state->root_argp : 0, state, stream, flags,
1772              state ? state->name : __argp_short_program_name ());
1773
1774       if (!state || ! (state->flags & ARGP_NO_EXIT))
1775         {
1776           if (flags & ARGP_HELP_EXIT_ERR)
1777             exit (argp_err_exit_status);
1778           if (flags & ARGP_HELP_EXIT_OK)
1779             exit (0);
1780         }
1781   }
1782 }
1783 #ifdef weak_alias
1784 weak_alias (__argp_state_help, argp_state_help)
1785 #endif
1786 \f
1787 /* If appropriate, print the printf string FMT and following args, preceded
1788    by the program name and ':', to stderr, and followed by a "Try ... --help"
1789    message, then exit (1).  */
1790 void
1791 __argp_error (const struct argp_state *state, const char *fmt, ...)
1792 {
1793   if (!state || !(state->flags & ARGP_NO_ERRS))
1794     {
1795       FILE *stream = state ? state->err_stream : stderr;
1796
1797       if (stream)
1798         {
1799           va_list ap;
1800
1801 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1802           __flockfile (stream);
1803 #endif
1804
1805           va_start (ap, fmt);
1806
1807 #ifdef USE_IN_LIBIO
1808           if (_IO_fwide (stream, 0) > 0)
1809             {
1810               char *buf;
1811
1812               if (__asprintf (&buf, fmt, ap) < 0)
1813                 buf = NULL;
1814
1815               __fwprintf (stream, L"%s: %s\n",
1816                           state ? state->name : __argp_short_program_name (),
1817                           buf);
1818
1819               free (buf);
1820             }
1821           else
1822 #endif
1823             {
1824               fputs_unlocked (state
1825                               ? state->name : __argp_short_program_name (),
1826                               stream);
1827               putc_unlocked (':', stream);
1828               putc_unlocked (' ', stream);
1829
1830               vfprintf (stream, fmt, ap);
1831
1832               putc_unlocked ('\n', stream);
1833             }
1834
1835           __argp_state_help (state, stream, ARGP_HELP_STD_ERR);
1836
1837           va_end (ap);
1838
1839 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1840           __funlockfile (stream);
1841 #endif
1842         }
1843     }
1844 }
1845 #ifdef weak_alias
1846 weak_alias (__argp_error, argp_error)
1847 #endif
1848 \f
1849 /* Similar to the standard gnu error-reporting function error(), but will
1850    respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
1851    to STATE->err_stream.  This is useful for argument parsing code that is
1852    shared between program startup (when exiting is desired) and runtime
1853    option parsing (when typically an error code is returned instead).  The
1854    difference between this function and argp_error is that the latter is for
1855    *parsing errors*, and the former is for other problems that occur during
1856    parsing but don't reflect a (syntactic) problem with the input.  */
1857 void
1858 __argp_failure (const struct argp_state *state, int status, int errnum,
1859                 const char *fmt, ...)
1860 {
1861   if (!state || !(state->flags & ARGP_NO_ERRS))
1862     {
1863       FILE *stream = state ? state->err_stream : stderr;
1864
1865       if (stream)
1866         {
1867 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1868           __flockfile (stream);
1869 #endif
1870
1871 #ifdef USE_IN_LIBIO
1872           if (_IO_fwide (stream, 0) > 0)
1873             __fwprintf (stream, L"%s",
1874                         state ? state->name : __argp_short_program_name ());
1875           else
1876 #endif
1877             fputs_unlocked (state
1878                             ? state->name : __argp_short_program_name (),
1879                             stream);
1880
1881           if (fmt)
1882             {
1883               va_list ap;
1884
1885               va_start (ap, fmt);
1886 #ifdef USE_IN_LIBIO
1887               if (_IO_fwide (stream, 0) > 0)
1888                 {
1889                   char *buf;
1890
1891                   if (__asprintf (&buf, fmt, ap) < 0)
1892                     buf = NULL;
1893
1894                   __fwprintf (stream, L": %s", buf);
1895
1896                   free (buf);
1897                 }
1898               else
1899 #endif
1900                 {
1901                   putc_unlocked (':', stream);
1902                   putc_unlocked (' ', stream);
1903
1904                   vfprintf (stream, fmt, ap);
1905                 }
1906
1907               va_end (ap);
1908             }
1909
1910           if (errnum)
1911             {
1912               char buf[200];
1913
1914 #ifdef USE_IN_LIBIO
1915               if (_IO_fwide (stream, 0) > 0)
1916                 __fwprintf (stream, L": %s",
1917                             __strerror_r (errnum, buf, sizeof (buf)));
1918               else
1919 #endif
1920                 {
1921                   char const *s = NULL;
1922                   putc_unlocked (':', stream);
1923                   putc_unlocked (' ', stream);
1924 #if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P && !defined strerror_r)
1925                   s = __strerror_r (errnum, buf, sizeof buf);
1926 #elif HAVE_DECL_STRERROR_R
1927                   if (__strerror_r (errnum, buf, sizeof buf) == 0)
1928                     s = buf;
1929 #endif
1930 #if !_LIBC
1931                   if (! s && ! (s = strerror (errnum)))
1932                     s = dgettext (state->root_argp->argp_domain,
1933                                   "Unknown system error");
1934 #endif
1935                   fputs (s, stream);
1936                 }
1937             }
1938
1939 #ifdef USE_IN_LIBIO
1940           if (_IO_fwide (stream, 0) > 0)
1941             putwc_unlocked (L'\n', stream);
1942           else
1943 #endif
1944             putc_unlocked ('\n', stream);
1945
1946 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
1947           __funlockfile (stream);
1948 #endif
1949
1950           if (status && (!state || !(state->flags & ARGP_NO_EXIT)))
1951             exit (status);
1952         }
1953     }
1954 }
1955 #ifdef weak_alias
1956 weak_alias (__argp_failure, argp_failure)
1957 #endif