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