1 /* Hierarchial argument parsing help output
2 Copyright (C) 1995,1996,1997,1998,1999,2000 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Written by Miles Bader <miles@gnu.ai.mit.edu>.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
11 The GNU C Library 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 GNU
14 Library General Public License for more details.
16 You should have received a copy of the GNU Library General Public
17 License along with the GNU C Library; see the file COPYING.LIB. If not,
18 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 # define _GNU_SOURCE 1
31 # define alloca __builtin_alloca
32 # define HAVE_ALLOCA 1
34 # if defined HAVE_ALLOCA_H || defined _LIBC
58 /* This is for other GNU distributions with internationalized messages. */
59 # if defined HAVE_LIBINTL_H || defined _LIBC
63 # define dgettext(domain, msgid) __dcgettext (domain, msgid, LC_MESSAGES)
66 # define dgettext(domain, msgid) (msgid)
71 #include "argp-fmtstream.h"
72 #include "argp-namefrob.h"
75 /* FIXME: We could use a configure test to check for __attribute__,
76 * just like lsh does. */
79 # define UNUSED __attribute__ ((__unused__))
87 # define __strchrnul strchrnul
90 # define __mempcpy mempcpy
92 /* We need to use a different name, as __strndup is likely a macro. */
93 # define STRNDUP strndup
95 # define __flockfile flockfile
97 # ifndef __funlockfile
98 # define __funlockfile funlockfile
101 # define STRERROR strerror
103 # define STRERROR(x) (sys_errlist[x])
106 # define STRNDUP __strndup
107 # define STRERROR strerror
112 char *strndup (const char *s
, size_t size
);
113 # endif /* !HAVE_STRNDUP */
116 void *mempcpy (void *to
, const void *from
, size_t size
);
117 # endif /* !HAVE_MEMPCPY */
120 char *strchrnul(const char *s
, int c
);
121 # endif /* !HAVE_STRCHRNUL */
126 /* User-selectable (using an environment variable) formatting parameters.
128 These may be specified in an environment variable called `ARGP_HELP_FMT',
129 with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
130 Where VALn must be a positive integer. The list of variables is in the
131 UPARAM_NAMES vector, below. */
133 /* Default parameters. */
134 #define DUP_ARGS 0 /* True if option argument can be duplicated. */
135 #define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */
136 #define SHORT_OPT_COL 2 /* column in which short options start */
137 #define LONG_OPT_COL 6 /* column in which long options start */
138 #define DOC_OPT_COL 2 /* column in which doc options start */
139 #define OPT_DOC_COL 29 /* column in which option text starts */
140 #define HEADER_COL 1 /* column in which group headers are printed */
141 #define USAGE_INDENT 12 /* indentation of wrapped usage lines */
142 #define RMARGIN 79 /* right margin used for wrapping */
144 /* User-selectable (using an environment variable) formatting parameters.
145 They must all be of type `int' for the parsing code to work. */
148 /* If true, arguments for an option are shown with both short and long
149 options, even when a given option has both, e.g. `-x ARG, --longx=ARG'.
150 If false, then if an option has both, the argument is only shown with
151 the long one, e.g., `-x, --longx=ARG', and a message indicating that
152 this really means both is printed below the options. */
155 /* This is true if when DUP_ARGS is false, and some duplicate arguments have
156 been suppressed, an explanatory message should be printed. */
159 /* Various output columns. */
168 int valid
; /* True when the values in here are valid. */
171 /* This is a global variable, as user options are only ever read once. */
172 static struct uparams uparams
= {
173 DUP_ARGS
, DUP_ARGS_NOTE
,
174 SHORT_OPT_COL
, LONG_OPT_COL
, DOC_OPT_COL
, OPT_DOC_COL
, HEADER_COL
,
175 USAGE_INDENT
, RMARGIN
,
179 /* A particular uparam, and what the user name is. */
182 const char *name
; /* User name. */
183 int is_bool
; /* Whether it's `boolean'. */
184 size_t uparams_offs
; /* Location of the (int) field in UPARAMS. */
187 /* The name-field mappings we know about. */
188 static const struct uparam_name uparam_names
[] =
190 { "dup-args", 1, offsetof (struct uparams
, dup_args
) },
191 { "dup-args-note", 1, offsetof (struct uparams
, dup_args_note
) },
192 { "short-opt-col", 0, offsetof (struct uparams
, short_opt_col
) },
193 { "long-opt-col", 0, offsetof (struct uparams
, long_opt_col
) },
194 { "doc-opt-col", 0, offsetof (struct uparams
, doc_opt_col
) },
195 { "opt-doc-col", 0, offsetof (struct uparams
, opt_doc_col
) },
196 { "header-col", 0, offsetof (struct uparams
, header_col
) },
197 { "usage-indent", 0, offsetof (struct uparams
, usage_indent
) },
198 { "rmargin", 0, offsetof (struct uparams
, rmargin
) },
202 /* Read user options from the environment, and fill in UPARAMS appropiately. */
204 fill_in_uparams (const struct argp_state
*state
)
206 /* FIXME: Can we get away without an explicit cast? */
207 const unsigned char *var
= (unsigned char *) getenv ("ARGP_HELP_FMT");
209 #define SKIPWS(p) do { while (isspace (*p)) p++; } while (0);
220 const struct uparam_name
*un
;
221 int unspec
= 0, val
= 0;
222 const unsigned char *arg
= var
;
224 while (isalnum (*arg
) || *arg
== '-' || *arg
== '_')
230 if (*arg
== '\0' || *arg
== ',')
232 else if (*arg
== '=')
240 if (var
[0] == 'n' && var
[1] == 'o' && var
[2] == '-')
249 else if (isdigit (*arg
))
252 while (isdigit (*arg
))
257 for (un
= uparam_names
; un
->name
; un
++)
258 if (strlen (un
->name
) == var_len
259 && strncmp (var
, un
->name
, var_len
) == 0)
261 if (unspec
&& !un
->is_bool
)
262 __argp_failure (state
, 0, 0,
263 dgettext (state
->root_argp
->argp_domain
, "\
264 %.*s: ARGP_HELP_FMT parameter requires a value"),
267 *(int *)((char *)&uparams
+ un
->uparams_offs
) = val
;
271 __argp_failure (state
, 0, 0,
272 dgettext (state
->root_argp
->argp_domain
, "\
273 %.*s: Unknown ARGP_HELP_FMT parameter"),
282 __argp_failure (state
, 0, 0,
283 dgettext (state
->root_argp
->argp_domain
,
284 "Garbage in ARGP_HELP_FMT: %s"), var
);
290 /* Returns true if OPT hasn't been marked invisible. Visibility only affects
291 whether OPT is displayed or used in sorting, not option shadowing. */
292 #define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN))
294 /* Returns true if OPT is an alias for an earlier option. */
295 #define oalias(opt) ((opt)->flags & OPTION_ALIAS)
297 /* Returns true if OPT is an documentation-only entry. */
298 #define odoc(opt) ((opt)->flags & OPTION_DOC)
300 /* Returns true if OPT is the end-of-list marker for a list of options. */
301 #define oend(opt) __option_is_end (opt)
303 /* Returns true if OPT has a short option. */
304 #define oshort(opt) __option_is_short (opt)
307 The help format for a particular option is like:
309 -xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
311 Where ARG will be omitted if there's no argument, for this option, or
312 will be surrounded by "[" and "]" appropiately if the argument is
313 optional. The documentation string is word-wrapped appropiately, and if
314 the list of options is long enough, it will be started on a separate line.
315 If there are no short options for a given option, the first long option is
316 indented slighly in a way that's supposed to make most long options appear
317 to be in a separate column.
319 For example, the following output (from ps):
321 -p PID, --pid=PID List the process PID
322 --pgrp=PGRP List processes in the process group PGRP
323 -P, -x, --no-parent Include processes without parents
324 -Q, --all-fields Don't elide unusable fields (normally if there's
325 some reason ps can't print a field for any
326 process, it's removed from the output entirely)
327 -r, --reverse, --gratuitously-long-reverse-option
328 Reverse the order of any sort
329 --session[=SID] Add the processes from the session SID (which
330 defaults to the sid of the current process)
332 Here are some more options:
333 -f ZOT, --foonly=ZOT Glork a foonly
334 -z, --zaza Snit a zar
336 -?, --help Give this help list
337 --usage Give a short usage message
338 -V, --version Print program version
340 The struct argp_option array for the above could look like:
343 {"pid", 'p', "PID", 0, "List the process PID"},
344 {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},
345 {"no-parent", 'P', 0, 0, "Include processes without parents"},
346 {0, 'x', 0, OPTION_ALIAS},
347 {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally"
348 " if there's some reason ps can't"
349 " print a field for any process, it's"
350 " removed from the output entirely)" },
351 {"reverse", 'r', 0, 0, "Reverse the order of any sort"},
352 {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},
353 {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL,
354 "Add the processes from the session"
355 " SID (which defaults to the sid of"
356 " the current process)" },
358 {0,0,0,0, "Here are some more options:"},
359 {"foonly", 'f', "ZOT", 0, "Glork a foonly"},
360 {"zaza", 'z', 0, 0, "Snit a zar"},
365 Note that the last three options are automatically supplied by argp_parse,
366 unless you tell it not to with ARGP_NO_HELP.
370 /* Returns true if CH occurs between BEG and END. */
372 find_char (char ch
, char *beg
, char *end
)
382 struct hol_cluster
; /* fwd decl */
387 const struct argp_option
*opt
;
388 /* Number of options (including aliases). */
391 /* A pointers into the HOL's short_options field, to the first short option
392 letter for this entry. The order of the characters following this point
393 corresponds to the order of options pointed to by OPT, and there are at
394 most NUM. A short option recorded in a option following OPT is only
395 valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
396 probably been shadowed by some other entry). */
399 /* Entries are sorted by their group first, in the order:
400 1, 2, ..., n, 0, -m, ..., -2, -1
401 and then alphabetically within each group. The default is 0. */
404 /* The cluster of options this entry belongs to, or 0 if none. */
405 struct hol_cluster
*cluster
;
407 /* The argp from which this option came. */
408 const struct argp
*argp
;
411 /* A cluster of entries to reflect the argp tree structure. */
414 /* A descriptive header printed before options in this cluster. */
417 /* Used to order clusters within the same group with the same parent,
418 according to the order in which they occurred in the parent argp's child
422 /* How to sort this cluster with respect to options and other clusters at the
423 same depth (clusters always follow options in the same group). */
426 /* The cluster to which this cluster belongs, or 0 if it's at the base
428 struct hol_cluster
*parent
;
430 /* The argp from which this cluster is (eventually) derived. */
431 const struct argp
*argp
;
433 /* The distance this cluster is from the root. */
436 /* Clusters in a given hol are kept in a linked list, to make freeing them
438 struct hol_cluster
*next
;
441 /* A list of options for help. */
444 /* An array of hol_entry's. */
445 struct hol_entry
*entries
;
446 /* The number of entries in this hol. If this field is zero, the others
448 unsigned num_entries
;
450 /* A string containing all short options in this HOL. Each entry contains
451 pointers into this string, so the order can't be messed with blindly. */
454 /* Clusters of entries in this hol. */
455 struct hol_cluster
*clusters
;
458 /* Create a struct hol from the options in ARGP. CLUSTER is the
459 hol_cluster in which these entries occur, or 0, if at the root. */
461 make_hol (const struct argp
*argp
, struct hol_cluster
*cluster
)
464 const struct argp_option
*o
;
465 const struct argp_option
*opts
= argp
->options
;
466 struct hol_entry
*entry
;
467 unsigned num_short_options
= 0;
468 struct hol
*hol
= malloc (sizeof (struct hol
));
472 hol
->num_entries
= 0;
479 /* The first option must not be an alias. */
480 assert (! oalias (opts
));
482 /* Calculate the space needed. */
483 for (o
= opts
; ! oend (o
); o
++)
488 num_short_options
++; /* This is an upper bound. */
491 hol
->entries
= malloc (sizeof (struct hol_entry
) * hol
->num_entries
);
492 hol
->short_options
= malloc (num_short_options
+ 1);
494 assert (hol
->entries
&& hol
->short_options
);
496 /* Fill in the entries. */
497 so
= hol
->short_options
;
498 for (o
= opts
, entry
= hol
->entries
; ! oend (o
); entry
++)
502 entry
->short_options
= so
;
503 entry
->group
= cur_group
=
506 : ((!o
->name
&& !o
->key
)
509 entry
->cluster
= cluster
;
515 if (oshort (o
) && ! find_char (o
->key
, hol
->short_options
, so
))
516 /* O has a valid short option which hasn't already been used.*/
520 while (! oend (o
) && oalias (o
));
522 *so
= '\0'; /* null terminated so we can find the length */
528 /* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the
529 associated argp child list entry), INDEX, and PARENT, and return a pointer
530 to it. ARGP is the argp that this cluster results from. */
531 static struct hol_cluster
*
532 hol_add_cluster (struct hol
*hol
, int group
, const char *header
, int index
,
533 struct hol_cluster
*parent
, const struct argp
*argp
)
535 struct hol_cluster
*cl
= malloc (sizeof (struct hol_cluster
));
544 cl
->depth
= parent
? parent
->depth
+ 1 : 0;
546 cl
->next
= hol
->clusters
;
552 /* Free HOL and any resources it uses. */
554 hol_free (struct hol
*hol
)
556 struct hol_cluster
*cl
= hol
->clusters
;
560 struct hol_cluster
*next
= cl
->next
;
565 if (hol
->num_entries
> 0)
568 free (hol
->short_options
);
575 hol_entry_short_iterate (const struct hol_entry
*entry
,
576 int (*func
)(const struct argp_option
*opt
,
577 const struct argp_option
*real
,
578 const char *domain
, void *cookie
),
579 const char *domain
, void *cookie
)
583 const struct argp_option
*opt
, *real
= entry
->opt
;
584 char *so
= entry
->short_options
;
586 for (opt
= real
, nopts
= entry
->num
; nopts
> 0 && !val
; opt
++, nopts
--)
587 if (oshort (opt
) && *so
== opt
->key
)
592 val
= (*func
)(opt
, real
, domain
, cookie
);
600 hol_entry_long_iterate (const struct hol_entry
*entry
,
601 int (*func
)(const struct argp_option
*opt
,
602 const struct argp_option
*real
,
603 const char *domain
, void *cookie
),
604 const char *domain
, void *cookie
)
608 const struct argp_option
*opt
, *real
= entry
->opt
;
610 for (opt
= real
, nopts
= entry
->num
; nopts
> 0 && !val
; opt
++, nopts
--)
616 val
= (*func
)(opt
, real
, domain
, cookie
);
622 /* Iterator that returns true for the first short option. */
624 until_short (const struct argp_option
*opt
, const struct argp_option
*real UNUSED
,
625 const char *domain UNUSED
, void *cookie UNUSED
)
627 return oshort (opt
) ? opt
->key
: 0;
630 /* Returns the first valid short option in ENTRY, or 0 if there is none. */
632 hol_entry_first_short (const struct hol_entry
*entry
)
634 return hol_entry_short_iterate (entry
, until_short
,
635 entry
->argp
->argp_domain
, 0);
638 /* Returns the first valid long option in ENTRY, or 0 if there is none. */
640 hol_entry_first_long (const struct hol_entry
*entry
)
642 const struct argp_option
*opt
;
644 for (opt
= entry
->opt
, num
= entry
->num
; num
> 0; opt
++, num
--)
645 if (opt
->name
&& ovisible (opt
))
650 /* Returns the entry in HOL with the long option name NAME, or 0 if there is
652 static struct hol_entry
*
653 hol_find_entry (struct hol
*hol
, const char *name
)
655 struct hol_entry
*entry
= hol
->entries
;
656 unsigned num_entries
= hol
->num_entries
;
658 while (num_entries
-- > 0)
660 const struct argp_option
*opt
= entry
->opt
;
661 unsigned num_opts
= entry
->num
;
663 while (num_opts
-- > 0)
664 if (opt
->name
&& ovisible (opt
) && strcmp (opt
->name
, name
) == 0)
675 /* If an entry with the long option NAME occurs in HOL, set it's special
676 sort position to GROUP. */
678 hol_set_group (struct hol
*hol
, const char *name
, int group
)
680 struct hol_entry
*entry
= hol_find_entry (hol
, name
);
682 entry
->group
= group
;
685 /* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1.
686 EQ is what to return if GROUP1 and GROUP2 are the same. */
688 group_cmp (int group1
, int group2
, int eq
)
690 if (group1
== group2
)
692 else if ((group1
< 0 && group2
< 0) || (group1
>= 0 && group2
>= 0))
693 return group1
- group2
;
695 return group2
- group1
;
698 /* Compare clusters CL1 & CL2 by the order that they should appear in
701 hol_cluster_cmp (const struct hol_cluster
*cl1
, const struct hol_cluster
*cl2
)
703 /* If one cluster is deeper than the other, use its ancestor at the same
704 level, so that finding the common ancestor is straightforward. */
705 while (cl1
->depth
< cl2
->depth
)
707 while (cl2
->depth
< cl1
->depth
)
710 /* Now reduce both clusters to their ancestors at the point where both have
711 a common parent; these can be directly compared. */
712 while (cl1
->parent
!= cl2
->parent
)
713 cl1
= cl1
->parent
, cl2
= cl2
->parent
;
715 return group_cmp (cl1
->group
, cl2
->group
, cl2
->index
- cl1
->index
);
718 /* Return the ancestor of CL that's just below the root (i.e., has a parent
720 static struct hol_cluster
*
721 hol_cluster_base (struct hol_cluster
*cl
)
728 /* Return true if CL1 is a child of CL2. */
730 hol_cluster_is_child (const struct hol_cluster
*cl1
,
731 const struct hol_cluster
*cl2
)
733 while (cl1
&& cl1
!= cl2
)
738 /* Given the name of a OPTION_DOC option, modifies NAME to start at the tail
739 that should be used for comparisons, and returns true iff it should be
740 treated as a non-option. */
742 /* FIXME: Can we use unsigned char * for the argument? */
744 canon_doc_option (const char **name
)
747 /* Skip initial whitespace. */
748 while (isspace ( (unsigned char) **name
))
750 /* Decide whether this looks like an option (leading `-') or not. */
751 non_opt
= (**name
!= '-');
752 /* Skip until part of name used for sorting. */
753 while (**name
&& !isalnum ( (unsigned char) **name
))
758 /* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
761 hol_entry_cmp (const struct hol_entry
*entry1
,
762 const struct hol_entry
*entry2
)
764 /* The group numbers by which the entries should be ordered; if either is
765 in a cluster, then this is just the group within the cluster. */
766 int group1
= entry1
->group
, group2
= entry2
->group
;
768 if (entry1
->cluster
!= entry2
->cluster
)
770 /* The entries are not within the same cluster, so we can't compare them
771 directly, we have to use the appropiate clustering level too. */
772 if (! entry1
->cluster
)
773 /* ENTRY1 is at the `base level', not in a cluster, so we have to
774 compare it's group number with that of the base cluster in which
775 ENTRY2 resides. Note that if they're in the same group, the
776 clustered option always comes laster. */
777 return group_cmp (group1
, hol_cluster_base (entry2
->cluster
)->group
, -1);
778 else if (! entry2
->cluster
)
779 /* Likewise, but ENTRY2's not in a cluster. */
780 return group_cmp (hol_cluster_base (entry1
->cluster
)->group
, group2
, 1);
782 /* Both entries are in clusters, we can just compare the clusters. */
783 return hol_cluster_cmp (entry1
->cluster
, entry2
->cluster
);
785 else if (group1
== group2
)
786 /* The entries are both in the same cluster and group, so compare them
789 int short1
= hol_entry_first_short (entry1
);
790 int short2
= hol_entry_first_short (entry2
);
791 int doc1
= odoc (entry1
->opt
);
792 int doc2
= odoc (entry2
->opt
);
793 /* FIXME: Can we use unsigned char * instead? */
794 const char *long1
= hol_entry_first_long (entry1
);
795 const char *long2
= hol_entry_first_long (entry2
);
798 doc1
= canon_doc_option (&long1
);
800 doc2
= canon_doc_option (&long2
);
803 /* `documentation' options always follow normal options (or
804 documentation options that *look* like normal options). */
806 else if (!short1
&& !short2
&& long1
&& long2
)
807 /* Only long options. */
808 return __strcasecmp (long1
, long2
);
810 /* Compare short/short, long/short, short/long, using the first
811 character of long options. Entries without *any* valid
812 options (such as options with OPTION_HIDDEN set) will be put
813 first, but as they're not displayed, it doesn't matter where
816 unsigned char first1
= short1
? short1
: long1
? *long1
: 0;
817 unsigned char first2
= short2
? short2
: long2
? *long2
: 0;
819 int lower_cmp
= _tolower (first1
) - _tolower (first2
);
821 int lower_cmp
= tolower (first1
) - tolower (first2
);
823 /* Compare ignoring case, except when the options are both the
824 same letter, in which case lower-case always comes first. */
825 /* NOTE: The subtraction below does the right thing
826 even with eight-bit chars: first1 and first2 are
827 converted to int *before* the subtraction. */
828 return lower_cmp
? lower_cmp
: first2
- first1
;
832 /* Within the same cluster, but not the same group, so just compare
834 return group_cmp (group1
, group2
, 0);
837 /* Version of hol_entry_cmp with correct signature for qsort. */
839 hol_entry_qcmp (const void *entry1_v
, const void *entry2_v
)
841 return hol_entry_cmp (entry1_v
, entry2_v
);
844 /* Sort HOL by group and alphabetically by option name (with short options
845 taking precedence over long). Since the sorting is for display purposes
846 only, the shadowing of options isn't effected. */
848 hol_sort (struct hol
*hol
)
850 if (hol
->num_entries
> 0)
851 qsort (hol
->entries
, hol
->num_entries
, sizeof (struct hol_entry
),
855 /* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow
856 any in MORE with the same name. */
858 hol_append (struct hol
*hol
, struct hol
*more
)
860 struct hol_cluster
**cl_end
= &hol
->clusters
;
862 /* Steal MORE's cluster list, and add it to the end of HOL's. */
864 cl_end
= &(*cl_end
)->next
;
865 *cl_end
= more
->clusters
;
869 if (more
->num_entries
> 0)
871 if (hol
->num_entries
== 0)
873 hol
->num_entries
= more
->num_entries
;
874 hol
->entries
= more
->entries
;
875 hol
->short_options
= more
->short_options
;
876 more
->num_entries
= 0; /* Mark MORE's fields as invalid. */
879 /* Append the entries in MORE to those in HOL, taking care to only add
880 non-shadowed SHORT_OPTIONS values. */
885 unsigned num_entries
= hol
->num_entries
+ more
->num_entries
;
886 struct hol_entry
*entries
=
887 malloc (num_entries
* sizeof (struct hol_entry
));
888 unsigned hol_so_len
= strlen (hol
->short_options
);
889 char *short_options
=
890 malloc (hol_so_len
+ strlen (more
->short_options
) + 1);
892 __mempcpy (__mempcpy (entries
, hol
->entries
,
893 hol
->num_entries
* sizeof (struct hol_entry
)),
895 more
->num_entries
* sizeof (struct hol_entry
));
897 __mempcpy (short_options
, hol
->short_options
, hol_so_len
);
899 /* Fix up the short options pointers from HOL. */
900 for (e
= entries
, left
= hol
->num_entries
; left
> 0; e
++, left
--)
901 e
->short_options
+= (short_options
- hol
->short_options
);
903 /* Now add the short options from MORE, fixing up its entries
905 so
= short_options
+ hol_so_len
;
906 more_so
= more
->short_options
;
907 for (left
= more
->num_entries
; left
> 0; e
++, left
--)
910 const struct argp_option
*opt
;
912 e
->short_options
= so
;
914 for (opts_left
= e
->num
, opt
= e
->opt
; opts_left
; opt
++, opts_left
--)
917 if (oshort (opt
) && ch
== opt
->key
)
918 /* The next short option in MORE_SO, CH, is from OPT. */
920 if (! find_char (ch
, short_options
,
921 short_options
+ hol_so_len
))
922 /* The short option CH isn't shadowed by HOL's options,
923 so add it to the sum. */
933 free (hol
->short_options
);
935 hol
->entries
= entries
;
936 hol
->num_entries
= num_entries
;
937 hol
->short_options
= short_options
;
944 /* Inserts enough spaces to make sure STREAM is at column COL. */
946 indent_to (argp_fmtstream_t stream
, unsigned col
)
948 int needed
= col
- __argp_fmtstream_point (stream
);
950 __argp_fmtstream_putc (stream
, ' ');
953 /* Output to STREAM either a space, or a newline if there isn't room for at
954 least ENSURE characters before the right margin. */
956 space (argp_fmtstream_t stream
, size_t ensure
)
958 if (__argp_fmtstream_point (stream
) + ensure
959 >= __argp_fmtstream_rmargin (stream
))
960 __argp_fmtstream_putc (stream
, '\n');
962 __argp_fmtstream_putc (stream
, ' ');
965 /* If the option REAL has an argument, we print it in using the printf
966 format REQ_FMT or OPT_FMT depending on whether it's a required or
967 optional argument. */
969 arg (const struct argp_option
*real
, const char *req_fmt
, const char *opt_fmt
,
970 const char *domain UNUSED
, argp_fmtstream_t stream
)
974 if (real
->flags
& OPTION_ARG_OPTIONAL
)
975 __argp_fmtstream_printf (stream
, opt_fmt
,
976 dgettext (domain
, real
->arg
));
978 __argp_fmtstream_printf (stream
, req_fmt
,
979 dgettext (domain
, real
->arg
));
983 /* Helper functions for hol_entry_help. */
985 /* State used during the execution of hol_help. */
986 struct hol_help_state
988 /* PREV_ENTRY should contain the previous entry printed, or 0. */
989 struct hol_entry
*prev_entry
;
991 /* If an entry is in a different group from the previous one, and SEP_GROUPS
992 is true, then a blank line will be printed before any output. */
995 /* True if a duplicate option argument was suppressed (only ever set if
996 UPARAMS.dup_args is false). */
997 int suppressed_dup_arg
;
1000 /* Some state used while printing a help entry (used to communicate with
1001 helper functions). See the doc for hol_entry_help for more info, as most
1002 of the fields are copied from its arguments. */
1005 const struct hol_entry
*entry
;
1006 argp_fmtstream_t stream
;
1007 struct hol_help_state
*hhstate
;
1009 /* True if nothing's been printed so far. */
1012 /* If non-zero, the state that was used to print this help. */
1013 const struct argp_state
*state
;
1016 /* If a user doc filter should be applied to DOC, do so. */
1018 filter_doc (const char *doc
, int key
, const struct argp
*argp
,
1019 const struct argp_state
*state
)
1021 if (argp
->help_filter
)
1022 /* We must apply a user filter to this output. */
1024 void *input
= __argp_input (argp
, state
);
1025 return (*argp
->help_filter
) (key
, doc
, input
);
1032 /* Prints STR as a header line, with the margin lines set appropiately, and
1033 notes the fact that groups should be separated with a blank line. ARGP is
1034 the argp that should dictate any user doc filtering to take place. Note
1035 that the previous wrap margin isn't restored, but the left margin is reset
1038 print_header (const char *str
, const struct argp
*argp
,
1039 struct pentry_state
*pest
)
1041 const char *tstr
= dgettext (argp
->argp_domain
, str
);
1042 const char *fstr
= filter_doc (tstr
, ARGP_KEY_HELP_HEADER
, argp
, pest
->state
);
1048 if (pest
->hhstate
->prev_entry
)
1049 /* Precede with a blank line. */
1050 __argp_fmtstream_putc (pest
->stream
, '\n');
1051 indent_to (pest
->stream
, uparams
.header_col
);
1052 __argp_fmtstream_set_lmargin (pest
->stream
, uparams
.header_col
);
1053 __argp_fmtstream_set_wmargin (pest
->stream
, uparams
.header_col
);
1054 __argp_fmtstream_puts (pest
->stream
, fstr
);
1055 __argp_fmtstream_set_lmargin (pest
->stream
, 0);
1056 __argp_fmtstream_putc (pest
->stream
, '\n');
1059 pest
->hhstate
->sep_groups
= 1; /* Separate subsequent groups. */
1063 free ((char *) fstr
);
1066 /* Inserts a comma if this isn't the first item on the line, and then makes
1067 sure we're at least to column COL. If this *is* the first item on a line,
1068 prints any pending whitespace/headers that should precede this line. Also
1071 comma (unsigned col
, struct pentry_state
*pest
)
1075 const struct hol_entry
*pe
= pest
->hhstate
->prev_entry
;
1076 const struct hol_cluster
*cl
= pest
->entry
->cluster
;
1078 if (pest
->hhstate
->sep_groups
&& pe
&& pest
->entry
->group
!= pe
->group
)
1079 __argp_fmtstream_putc (pest
->stream
, '\n');
1081 if (cl
&& cl
->header
&& *cl
->header
1083 || (pe
->cluster
!= cl
1084 && !hol_cluster_is_child (pe
->cluster
, cl
))))
1085 /* If we're changing clusters, then this must be the start of the
1086 ENTRY's cluster unless that is an ancestor of the previous one
1087 (in which case we had just popped into a sub-cluster for a bit).
1088 If so, then print the cluster's header line. */
1090 int old_wm
= __argp_fmtstream_wmargin (pest
->stream
);
1091 print_header (cl
->header
, cl
->argp
, pest
);
1092 __argp_fmtstream_set_wmargin (pest
->stream
, old_wm
);
1098 __argp_fmtstream_puts (pest
->stream
, ", ");
1100 indent_to (pest
->stream
, col
);
1103 /* Print help for ENTRY to STREAM. */
1105 hol_entry_help (struct hol_entry
*entry
, const struct argp_state
*state
,
1106 argp_fmtstream_t stream
, struct hol_help_state
*hhstate
)
1109 const struct argp_option
*real
= entry
->opt
, *opt
;
1110 char *so
= entry
->short_options
;
1111 int have_long_opt
= 0; /* We have any long options. */
1112 /* Saved margins. */
1113 int old_lm
= __argp_fmtstream_set_lmargin (stream
, 0);
1114 int old_wm
= __argp_fmtstream_wmargin (stream
);
1115 /* PEST is a state block holding some of our variables that we'd like to
1116 share with helper functions. */
1118 struct pentry_state pest
= { entry
, stream
, hhstate
, 1, state
};
1119 #else /* !__GNUC__ */
1120 /* Decent initializers are a GNU extension */
1121 struct pentry_state pest
;
1123 pest
.stream
= stream
;
1124 pest
.hhstate
= hhstate
;
1127 #endif /* !__GNUC__ */
1130 for (opt
= real
, num
= entry
->num
; num
> 0; opt
++, num
--)
1131 if (opt
->name
&& ovisible (opt
))
1137 /* First emit short options. */
1138 __argp_fmtstream_set_wmargin (stream
, uparams
.short_opt_col
); /* For truly bizarre cases. */
1139 for (opt
= real
, num
= entry
->num
; num
> 0; opt
++, num
--)
1140 if (oshort (opt
) && opt
->key
== *so
)
1141 /* OPT has a valid (non shadowed) short option. */
1145 comma (uparams
.short_opt_col
, &pest
);
1146 __argp_fmtstream_putc (stream
, '-');
1147 __argp_fmtstream_putc (stream
, *so
);
1148 if (!have_long_opt
|| uparams
.dup_args
)
1149 arg (real
, " %s", "[%s]", state
->root_argp
->argp_domain
, stream
);
1151 hhstate
->suppressed_dup_arg
= 1;
1156 /* Now, long options. */
1158 /* A `documentation' option. */
1160 __argp_fmtstream_set_wmargin (stream
, uparams
.doc_opt_col
);
1161 for (opt
= real
, num
= entry
->num
; num
> 0; opt
++, num
--)
1162 if (opt
->name
&& ovisible (opt
))
1164 comma (uparams
.doc_opt_col
, &pest
);
1165 /* Calling gettext here isn't quite right, since sorting will
1166 have been done on the original; but documentation options
1167 should be pretty rare anyway... */
1168 __argp_fmtstream_puts (stream
,
1169 dgettext (state
->root_argp
->argp_domain
,
1174 /* A real long option. */
1176 int first_long_opt
= 1;
1178 __argp_fmtstream_set_wmargin (stream
, uparams
.long_opt_col
);
1179 for (opt
= real
, num
= entry
->num
; num
> 0; opt
++, num
--)
1180 if (opt
->name
&& ovisible (opt
))
1182 comma (uparams
.long_opt_col
, &pest
);
1183 __argp_fmtstream_printf (stream
, "--%s", opt
->name
);
1184 if (first_long_opt
|| uparams
.dup_args
)
1185 arg (real
, "=%s", "[=%s]", state
->root_argp
->argp_domain
,
1188 hhstate
->suppressed_dup_arg
= 1;
1192 /* Next, documentation strings. */
1193 __argp_fmtstream_set_lmargin (stream
, 0);
1197 /* Didn't print any switches, what's up? */
1198 if (!oshort (real
) && !real
->name
)
1199 /* This is a group header, print it nicely. */
1200 print_header (real
->doc
, entry
->argp
, &pest
);
1202 /* Just a totally shadowed option or null header; print nothing. */
1203 goto cleanup
; /* Just return, after cleaning up. */
1207 const char *tstr
= real
->doc
? dgettext (state
->root_argp
->argp_domain
,
1209 const char *fstr
= filter_doc (tstr
, real
->key
, entry
->argp
, state
);
1212 unsigned int col
= __argp_fmtstream_point (stream
);
1214 __argp_fmtstream_set_lmargin (stream
, uparams
.opt_doc_col
);
1215 __argp_fmtstream_set_wmargin (stream
, uparams
.opt_doc_col
);
1217 if (col
> (unsigned int) (uparams
.opt_doc_col
+ 3))
1218 __argp_fmtstream_putc (stream
, '\n');
1219 else if (col
>= (unsigned int) uparams
.opt_doc_col
)
1220 __argp_fmtstream_puts (stream
, " ");
1222 indent_to (stream
, uparams
.opt_doc_col
);
1224 __argp_fmtstream_puts (stream
, fstr
);
1226 if (fstr
&& fstr
!= tstr
)
1227 free ((char *) fstr
);
1229 /* Reset the left margin. */
1230 __argp_fmtstream_set_lmargin (stream
, 0);
1231 __argp_fmtstream_putc (stream
, '\n');
1234 hhstate
->prev_entry
= entry
;
1237 __argp_fmtstream_set_lmargin (stream
, old_lm
);
1238 __argp_fmtstream_set_wmargin (stream
, old_wm
);
1241 /* Output a long help message about the options in HOL to STREAM. */
1243 hol_help (struct hol
*hol
, const struct argp_state
*state
,
1244 argp_fmtstream_t stream
)
1247 struct hol_entry
*entry
;
1248 struct hol_help_state hhstate
= { 0, 0, 0 };
1250 for (entry
= hol
->entries
, num
= hol
->num_entries
; num
> 0; entry
++, num
--)
1251 hol_entry_help (entry
, state
, stream
, &hhstate
);
1253 if (hhstate
.suppressed_dup_arg
&& uparams
.dup_args_note
)
1255 const char *tstr
= dgettext (state
->root_argp
->argp_domain
, "\
1256 Mandatory or optional arguments to long options are also mandatory or \
1257 optional for any corresponding short options.");
1258 const char *fstr
= filter_doc (tstr
, ARGP_KEY_HELP_DUP_ARGS_NOTE
,
1259 state
? state
->root_argp
: 0, state
);
1262 __argp_fmtstream_putc (stream
, '\n');
1263 __argp_fmtstream_puts (stream
, fstr
);
1264 __argp_fmtstream_putc (stream
, '\n');
1266 if (fstr
&& fstr
!= tstr
)
1267 free ((char *) fstr
);
1271 /* Helper functions for hol_usage. */
1273 /* If OPT is a short option without an arg, append its key to the string
1274 pointer pointer to by COOKIE, and advance the pointer. */
1276 add_argless_short_opt (const struct argp_option
*opt
,
1277 const struct argp_option
*real
,
1278 const char *domain UNUSED
, void *cookie
)
1280 char **snao_end
= cookie
;
1281 if (!(opt
->arg
|| real
->arg
)
1282 && !((opt
->flags
| real
->flags
) & OPTION_NO_USAGE
))
1283 *(*snao_end
)++ = opt
->key
;
1287 /* If OPT is a short option with an arg, output a usage entry for it to the
1288 stream pointed at by COOKIE. */
1290 usage_argful_short_opt (const struct argp_option
*opt
,
1291 const struct argp_option
*real
,
1292 const char *domain UNUSED
, void *cookie
)
1294 argp_fmtstream_t stream
= cookie
;
1295 const char *arg
= opt
->arg
;
1296 int flags
= opt
->flags
| real
->flags
;
1301 if (arg
&& !(flags
& OPTION_NO_USAGE
))
1303 arg
= dgettext (domain
, arg
);
1305 if (flags
& OPTION_ARG_OPTIONAL
)
1306 __argp_fmtstream_printf (stream
, " [-%c[%s]]", opt
->key
, arg
);
1309 /* Manually do line wrapping so that it (probably) won't
1310 get wrapped at the embedded space. */
1311 space (stream
, 6 + strlen (arg
));
1312 __argp_fmtstream_printf (stream
, "[-%c %s]", opt
->key
, arg
);
1319 /* Output a usage entry for the long option opt to the stream pointed at by
1322 usage_long_opt (const struct argp_option
*opt
,
1323 const struct argp_option
*real
,
1324 const char *domain UNUSED
, void *cookie
)
1326 argp_fmtstream_t stream
= cookie
;
1327 const char *arg
= opt
->arg
;
1328 int flags
= opt
->flags
| real
->flags
;
1333 if (! (flags
& OPTION_NO_USAGE
))
1337 arg
= dgettext (domain
, arg
);
1338 if (flags
& OPTION_ARG_OPTIONAL
)
1339 __argp_fmtstream_printf (stream
, " [--%s[=%s]]", opt
->name
, arg
);
1341 __argp_fmtstream_printf (stream
, " [--%s=%s]", opt
->name
, arg
);
1344 __argp_fmtstream_printf (stream
, " [--%s]", opt
->name
);
1350 /* Print a short usage description for the arguments in HOL to STREAM. */
1352 hol_usage (struct hol
*hol
, argp_fmtstream_t stream
)
1354 if (hol
->num_entries
> 0)
1357 struct hol_entry
*entry
;
1358 char *short_no_arg_opts
= alloca (strlen (hol
->short_options
) + 1);
1359 char *snao_end
= short_no_arg_opts
;
1361 /* First we put a list of short options without arguments. */
1362 for (entry
= hol
->entries
, nentries
= hol
->num_entries
1364 ; entry
++, nentries
--)
1365 hol_entry_short_iterate (entry
, add_argless_short_opt
,
1366 entry
->argp
->argp_domain
, &snao_end
);
1367 if (snao_end
> short_no_arg_opts
)
1370 __argp_fmtstream_printf (stream
, " [-%s]", short_no_arg_opts
);
1373 /* Now a list of short options *with* arguments. */
1374 for (entry
= hol
->entries
, nentries
= hol
->num_entries
1376 ; entry
++, nentries
--)
1377 hol_entry_short_iterate (entry
, usage_argful_short_opt
,
1378 entry
->argp
->argp_domain
, stream
);
1380 /* Finally, a list of long options (whew!). */
1381 for (entry
= hol
->entries
, nentries
= hol
->num_entries
1383 ; entry
++, nentries
--)
1384 hol_entry_long_iterate (entry
, usage_long_opt
,
1385 entry
->argp
->argp_domain
, stream
);
1389 /* Make a HOL containing all levels of options in ARGP. CLUSTER is the
1390 cluster in which ARGP's entries should be clustered, or 0. */
1392 argp_hol (const struct argp
*argp
, struct hol_cluster
*cluster
)
1394 const struct argp_child
*child
= argp
->children
;
1395 struct hol
*hol
= make_hol (argp
, cluster
);
1399 struct hol_cluster
*child_cluster
=
1400 ((child
->group
|| child
->header
)
1401 /* Put CHILD->argp within its own cluster. */
1402 ? hol_add_cluster (hol
, child
->group
, child
->header
,
1403 child
- argp
->children
, cluster
, argp
)
1404 /* Just merge it into the parent's cluster. */
1406 hol_append (hol
, argp_hol (child
->argp
, child_cluster
)) ;
1412 /* Calculate how many different levels with alternative args strings exist in
1415 argp_args_levels (const struct argp
*argp
)
1418 const struct argp_child
*child
= argp
->children
;
1420 if (argp
->args_doc
&& strchr (argp
->args_doc
, '\n'))
1425 levels
+= argp_args_levels ((child
++)->argp
);
1430 /* Print all the non-option args documented in ARGP to STREAM. Any output is
1431 preceded by a space. LEVELS is a pointer to a byte vector the length
1432 returned by argp_args_levels; it should be initialized to zero, and
1433 updated by this routine for the next call if ADVANCE is true. True is
1434 returned as long as there are more patterns to output. */
1436 argp_args_usage (const struct argp
*argp
, const struct argp_state
*state
,
1437 char **levels
, int advance
, argp_fmtstream_t stream
)
1439 char *our_level
= *levels
;
1441 const struct argp_child
*child
= argp
->children
;
1442 const char *tdoc
= dgettext (argp
->argp_domain
, argp
->args_doc
), *nl
= 0;
1443 const char *fdoc
= filter_doc (tdoc
, ARGP_KEY_HELP_ARGS_DOC
, argp
, state
);
1447 const char *cp
= fdoc
;
1448 nl
= __strchrnul (cp
, '\n');
1450 /* This is a `multi-level' args doc; advance to the correct position
1451 as determined by our state in LEVELS, and update LEVELS. */
1455 for (i
= 0; i
< *our_level
; i
++)
1456 cp
= nl
+ 1, nl
= __strchrnul (cp
, '\n');
1460 /* Manually do line wrapping so that it (probably) won't get wrapped at
1461 any embedded spaces. */
1462 space (stream
, 1 + nl
- cp
);
1464 __argp_fmtstream_write (stream
, cp
, nl
- cp
);
1466 if (fdoc
&& fdoc
!= tdoc
)
1467 free ((char *)fdoc
); /* Free user's modified doc string. */
1471 advance
= !argp_args_usage ((child
++)->argp
, state
, levels
, advance
, stream
);
1473 if (advance
&& multiple
)
1475 /* Need to increment our level. */
1477 /* There's more we can do here. */
1480 advance
= 0; /* Our parent shouldn't advance also. */
1482 else if (*our_level
> 0)
1483 /* We had multiple levels, but used them up; reset to zero. */
1490 /* Print the documentation for ARGP to STREAM; if POST is false, then
1491 everything preceeding a `\v' character in the documentation strings (or
1492 the whole string, for those with none) is printed, otherwise, everything
1493 following the `\v' character (nothing for strings without). Each separate
1494 bit of documentation is separated a blank line, and if PRE_BLANK is true,
1495 then the first is as well. If FIRST_ONLY is true, only the first
1496 occurrence is output. Returns true if anything was output. */
1498 argp_doc (const struct argp
*argp
, const struct argp_state
*state
,
1499 int post
, int pre_blank
, int first_only
,
1500 argp_fmtstream_t stream
)
1503 const char *inp_text
;
1506 size_t inp_text_limit
= 0;
1507 const char *doc
= dgettext (argp
->argp_domain
, argp
->doc
);
1508 const struct argp_child
*child
= argp
->children
;
1512 char *vt
= strchr (doc
, '\v');
1513 inp_text
= post
? (vt
? vt
+ 1 : 0) : doc
;
1514 inp_text_limit
= (!post
&& vt
) ? (vt
- doc
) : 0;
1519 if (argp
->help_filter
)
1520 /* We have to filter the doc strings. */
1523 /* Copy INP_TEXT so that it's nul-terminated. */
1524 inp_text
= STRNDUP (inp_text
, inp_text_limit
);
1525 input
= __argp_input (argp
, state
);
1527 (*argp
->help_filter
) (post
1528 ? ARGP_KEY_HELP_POST_DOC
1529 : ARGP_KEY_HELP_PRE_DOC
,
1533 text
= (const char *) inp_text
;
1538 __argp_fmtstream_putc (stream
, '\n');
1540 if (text
== inp_text
&& inp_text_limit
)
1541 __argp_fmtstream_write (stream
, inp_text
, inp_text_limit
);
1543 __argp_fmtstream_puts (stream
, text
);
1545 if (__argp_fmtstream_point (stream
) > __argp_fmtstream_lmargin (stream
))
1546 __argp_fmtstream_putc (stream
, '\n');
1551 if (text
&& text
!= inp_text
)
1552 free ((char *) text
); /* Free TEXT returned from the help filter. */
1553 if (inp_text
&& inp_text_limit
&& argp
->help_filter
)
1554 free ((char *) inp_text
); /* We copied INP_TEXT, so free it now. */
1556 if (post
&& argp
->help_filter
)
1557 /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */
1559 text
= (*argp
->help_filter
) (ARGP_KEY_HELP_EXTRA
, 0, input
);
1562 if (anything
|| pre_blank
)
1563 __argp_fmtstream_putc (stream
, '\n');
1564 __argp_fmtstream_puts (stream
, text
);
1565 free ((char *) text
);
1566 if (__argp_fmtstream_point (stream
)
1567 > __argp_fmtstream_lmargin (stream
))
1568 __argp_fmtstream_putc (stream
, '\n');
1574 while (child
->argp
&& !(first_only
&& anything
))
1576 argp_doc ((child
++)->argp
, state
,
1577 post
, anything
|| pre_blank
, first_only
,
1583 /* Output a usage message for ARGP to STREAM. If called from
1584 argp_state_help, STATE is the relevent parsing state. FLAGS are from the
1585 set ARGP_HELP_*. NAME is what to use wherever a `program name' is
1589 _help (const struct argp
*argp
, const struct argp_state
*state
, FILE *stream
,
1590 unsigned flags
, const char *name
)
1592 int anything
= 0; /* Whether we've output anything. */
1593 struct hol
*hol
= 0;
1594 argp_fmtstream_t fs
;
1599 __flockfile (stream
);
1601 if (! uparams
.valid
)
1602 fill_in_uparams (state
);
1604 fs
= __argp_make_fmtstream (stream
, 0, uparams
.rmargin
, 0);
1607 __funlockfile (stream
);
1611 if (flags
& (ARGP_HELP_USAGE
| ARGP_HELP_SHORT_USAGE
| ARGP_HELP_LONG
))
1613 hol
= argp_hol (argp
, 0);
1615 /* If present, these options always come last. */
1616 hol_set_group (hol
, "help", -1);
1617 hol_set_group (hol
, "version", -1);
1622 if (flags
& (ARGP_HELP_USAGE
| ARGP_HELP_SHORT_USAGE
))
1623 /* Print a short `Usage:' message. */
1625 int first_pattern
= 1, more_patterns
;
1626 size_t num_pattern_levels
= argp_args_levels (argp
);
1627 char *pattern_levels
= alloca (num_pattern_levels
);
1629 memset (pattern_levels
, 0, num_pattern_levels
);
1634 int old_wm
= __argp_fmtstream_set_wmargin (fs
, uparams
.usage_indent
);
1635 char *levels
= pattern_levels
;
1638 __argp_fmtstream_printf (fs
, "%s %s",
1639 dgettext (argp
->argp_domain
, "Usage:"),
1642 __argp_fmtstream_printf (fs
, "%s %s",
1643 dgettext (argp
->argp_domain
, " or: "),
1646 /* We set the lmargin as well as the wmargin, because hol_usage
1647 manually wraps options with newline to avoid annoying breaks. */
1648 old_lm
= __argp_fmtstream_set_lmargin (fs
, uparams
.usage_indent
);
1650 if (flags
& ARGP_HELP_SHORT_USAGE
)
1651 /* Just show where the options go. */
1653 if (hol
->num_entries
> 0)
1654 __argp_fmtstream_puts (fs
, dgettext (argp
->argp_domain
,
1658 /* Actually print the options. */
1660 hol_usage (hol
, fs
);
1661 flags
|= ARGP_HELP_SHORT_USAGE
; /* But only do so once. */
1664 more_patterns
= argp_args_usage (argp
, state
, &levels
, 1, fs
);
1666 __argp_fmtstream_set_wmargin (fs
, old_wm
);
1667 __argp_fmtstream_set_lmargin (fs
, old_lm
);
1669 __argp_fmtstream_putc (fs
, '\n');
1674 while (more_patterns
);
1677 if (flags
& ARGP_HELP_PRE_DOC
)
1678 anything
|= argp_doc (argp
, state
, 0, 0, 1, fs
);
1680 if (flags
& ARGP_HELP_SEE
)
1682 __argp_fmtstream_printf (fs
, dgettext (argp
->argp_domain
, "\
1683 Try `%s --help' or `%s --usage' for more information.\n"),
1688 if (flags
& ARGP_HELP_LONG
)
1689 /* Print a long, detailed help message. */
1691 /* Print info about all the options. */
1692 if (hol
->num_entries
> 0)
1695 __argp_fmtstream_putc (fs
, '\n');
1696 hol_help (hol
, state
, fs
);
1701 if (flags
& ARGP_HELP_POST_DOC
)
1702 /* Print any documentation strings at the end. */
1703 anything
|= argp_doc (argp
, state
, 1, anything
, 0, fs
);
1705 if ((flags
& ARGP_HELP_BUG_ADDR
) && argp_program_bug_address
)
1708 __argp_fmtstream_putc (fs
, '\n');
1709 __argp_fmtstream_printf (fs
, dgettext (argp
->argp_domain
,
1710 "Report bugs to %s.\n"),
1711 argp_program_bug_address
);
1715 __funlockfile (stream
);
1720 __argp_fmtstream_free (fs
);
1723 /* Output a usage message for ARGP to STREAM. FLAGS are from the set
1724 ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */
1725 void __argp_help (const struct argp
*argp
, FILE *stream
,
1726 unsigned flags
, char *name
)
1728 _help (argp
, 0, stream
, flags
, name
);
1731 weak_alias (__argp_help
, argp_help
)
1734 char *__argp_basename(char *name
)
1736 char *short_name
= strrchr(name
, '/');
1737 return short_name
? short_name
+ 1 : name
;
1741 __argp_short_program_name(const struct argp_state
*state
)
1745 #if HAVE_PROGRAM_INVOCATION_SHORT_NAME
1746 return program_invocation_short_name
;
1747 #elif HAVE_PROGRAM_INVOCATION_NAME
1748 return __argp_basename(program_invocation_name
);
1749 #else /* !HAVE_PROGRAM_INVOCATION_NAME */
1750 /* FIXME: What now? Miles suggests that it is better to use NULL,
1751 but currently the value is passed on directly to fputs_unlocked,
1752 so that requires more changes. */
1754 # warning No reasonable value to return
1756 # endif /* __GNUC__ */
1757 #endif /* !HAVE_PROGRAM_INVOCATION_NAME */
1760 /* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
1761 from the set ARGP_HELP_*. */
1763 __argp_state_help (const struct argp_state
*state
, FILE *stream
, unsigned flags
)
1765 if ((!state
|| ! (state
->flags
& ARGP_NO_ERRS
)) && stream
)
1767 if (state
&& (state
->flags
& ARGP_LONG_ONLY
))
1768 flags
|= ARGP_HELP_LONG_ONLY
;
1770 _help (state
? state
->root_argp
: 0, state
, stream
, flags
,
1771 __argp_short_program_name(state
));
1773 if (!state
|| ! (state
->flags
& ARGP_NO_EXIT
))
1775 if (flags
& ARGP_HELP_EXIT_ERR
)
1776 exit (argp_err_exit_status
);
1777 if (flags
& ARGP_HELP_EXIT_OK
)
1783 weak_alias (__argp_state_help
, argp_state_help
)
1786 /* If appropriate, print the printf string FMT and following args, preceded
1787 by the program name and `:', to stderr, and followed by a `Try ... --help'
1788 message, then exit (1). */
1790 __argp_error (const struct argp_state
*state
, const char *fmt
, ...)
1792 if (!state
|| !(state
->flags
& ARGP_NO_ERRS
))
1794 FILE *stream
= state
? state
->err_stream
: stderr
;
1800 __flockfile (stream
);
1802 fputs_unlocked (__argp_short_program_name(state
),
1804 putc_unlocked (':', stream
);
1805 putc_unlocked (' ', stream
);
1808 vfprintf (stream
, fmt
, ap
);
1811 putc_unlocked ('\n', stream
);
1813 __argp_state_help (state
, stream
, ARGP_HELP_STD_ERR
);
1815 __funlockfile (stream
);
1820 weak_alias (__argp_error
, argp_error
)
1823 /* Similar to the standard gnu error-reporting function error(), but will
1824 respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
1825 to STATE->err_stream. This is useful for argument parsing code that is
1826 shared between program startup (when exiting is desired) and runtime
1827 option parsing (when typically an error code is returned instead). The
1828 difference between this function and argp_error is that the latter is for
1829 *parsing errors*, and the former is for other problems that occur during
1830 parsing but don't reflect a (syntactic) problem with the input. */
1832 __argp_failure (const struct argp_state
*state
, int status
, int errnum
,
1833 const char *fmt
, ...)
1835 if (!state
|| !(state
->flags
& ARGP_NO_ERRS
))
1837 FILE *stream
= state
? state
->err_stream
: stderr
;
1841 __flockfile (stream
);
1843 fputs_unlocked (__argp_short_program_name(state
),
1850 putc_unlocked (':', stream
);
1851 putc_unlocked (' ', stream
);
1854 vfprintf (stream
, fmt
, ap
);
1860 putc_unlocked (':', stream
);
1861 putc_unlocked (' ', stream
);
1862 fputs (STRERROR (errnum
), stream
);
1865 putc_unlocked ('\n', stream
);
1867 __funlockfile (stream
);
1869 if (status
&& (!state
|| !(state
->flags
& ARGP_NO_EXIT
)))
1875 weak_alias (__argp_failure
, argp_failure
)