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