1*53ee8cc1Swenshuai.xi /* Hierarchial argument parsing, layered over getopt.
2*53ee8cc1Swenshuai.xi Copyright (C) 1995-1999, 2003, 2004, 2005, 2006, 2007
3*53ee8cc1Swenshuai.xi Free Software Foundation, Inc.
4*53ee8cc1Swenshuai.xi This file is part of the GNU C Library.
5*53ee8cc1Swenshuai.xi Written by Miles Bader <miles@gnu.ai.mit.edu>.
6*53ee8cc1Swenshuai.xi
7*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or
8*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public
9*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either
10*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version.
11*53ee8cc1Swenshuai.xi
12*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful,
13*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of
14*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15*53ee8cc1Swenshuai.xi Lesser General Public License for more details.
16*53ee8cc1Swenshuai.xi
17*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public
18*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free
19*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20*53ee8cc1Swenshuai.xi 02111-1307 USA. */
21*53ee8cc1Swenshuai.xi
22*53ee8cc1Swenshuai.xi #ifndef _ARGP_H
23*53ee8cc1Swenshuai.xi #define _ARGP_H
24*53ee8cc1Swenshuai.xi
25*53ee8cc1Swenshuai.xi #include <stdio.h>
26*53ee8cc1Swenshuai.xi #include <ctype.h>
27*53ee8cc1Swenshuai.xi #include <getopt.h>
28*53ee8cc1Swenshuai.xi #include <limits.h>
29*53ee8cc1Swenshuai.xi
30*53ee8cc1Swenshuai.xi #define __need_error_t
31*53ee8cc1Swenshuai.xi #include <errno.h>
32*53ee8cc1Swenshuai.xi
33*53ee8cc1Swenshuai.xi #ifndef __const
34*53ee8cc1Swenshuai.xi # define __const const
35*53ee8cc1Swenshuai.xi #endif
36*53ee8cc1Swenshuai.xi
37*53ee8cc1Swenshuai.xi #ifndef __THROW
38*53ee8cc1Swenshuai.xi # define __THROW
39*53ee8cc1Swenshuai.xi #endif
40*53ee8cc1Swenshuai.xi #ifndef __NTH
41*53ee8cc1Swenshuai.xi # define __NTH(fct) fct __THROW
42*53ee8cc1Swenshuai.xi #endif
43*53ee8cc1Swenshuai.xi
44*53ee8cc1Swenshuai.xi #ifndef __attribute__
45*53ee8cc1Swenshuai.xi /* This feature is available in gcc versions 2.5 and later. */
46*53ee8cc1Swenshuai.xi # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
47*53ee8cc1Swenshuai.xi # define __attribute__(Spec) /* empty */
48*53ee8cc1Swenshuai.xi # endif
49*53ee8cc1Swenshuai.xi /* The __-protected variants of `format' and `printf' attributes
50*53ee8cc1Swenshuai.xi are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
51*53ee8cc1Swenshuai.xi # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || __STRICT_ANSI__
52*53ee8cc1Swenshuai.xi # define __format__ format
53*53ee8cc1Swenshuai.xi # define __printf__ printf
54*53ee8cc1Swenshuai.xi # endif
55*53ee8cc1Swenshuai.xi #endif
56*53ee8cc1Swenshuai.xi
57*53ee8cc1Swenshuai.xi /* GCC 2.95 and later have "__restrict"; C99 compilers have
58*53ee8cc1Swenshuai.xi "restrict", and "configure" may have defined "restrict". */
59*53ee8cc1Swenshuai.xi #ifndef __restrict
60*53ee8cc1Swenshuai.xi # if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
61*53ee8cc1Swenshuai.xi # if defined restrict || 199901L <= __STDC_VERSION__
62*53ee8cc1Swenshuai.xi # define __restrict restrict
63*53ee8cc1Swenshuai.xi # else
64*53ee8cc1Swenshuai.xi # define __restrict
65*53ee8cc1Swenshuai.xi # endif
66*53ee8cc1Swenshuai.xi # endif
67*53ee8cc1Swenshuai.xi #endif
68*53ee8cc1Swenshuai.xi
69*53ee8cc1Swenshuai.xi #ifndef __error_t_defined
70*53ee8cc1Swenshuai.xi typedef int error_t;
71*53ee8cc1Swenshuai.xi # define __error_t_defined
72*53ee8cc1Swenshuai.xi #endif
73*53ee8cc1Swenshuai.xi
74*53ee8cc1Swenshuai.xi #ifdef __cplusplus
75*53ee8cc1Swenshuai.xi extern "C" {
76*53ee8cc1Swenshuai.xi #endif
77*53ee8cc1Swenshuai.xi
78*53ee8cc1Swenshuai.xi /* A description of a particular option. A pointer to an array of
79*53ee8cc1Swenshuai.xi these is passed in the OPTIONS field of an argp structure. Each option
80*53ee8cc1Swenshuai.xi entry can correspond to one long option and/or one short option; more
81*53ee8cc1Swenshuai.xi names for the same option can be added by following an entry in an option
82*53ee8cc1Swenshuai.xi array with options having the OPTION_ALIAS flag set. */
83*53ee8cc1Swenshuai.xi struct argp_option
84*53ee8cc1Swenshuai.xi {
85*53ee8cc1Swenshuai.xi /* The long option name. For more than one name for the same option, you
86*53ee8cc1Swenshuai.xi can use following options with the OPTION_ALIAS flag set. */
87*53ee8cc1Swenshuai.xi __const char *name;
88*53ee8cc1Swenshuai.xi
89*53ee8cc1Swenshuai.xi /* What key is returned for this option. If > 0 and printable, then it's
90*53ee8cc1Swenshuai.xi also accepted as a short option. */
91*53ee8cc1Swenshuai.xi int key;
92*53ee8cc1Swenshuai.xi
93*53ee8cc1Swenshuai.xi /* If non-NULL, this is the name of the argument associated with this
94*53ee8cc1Swenshuai.xi option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */
95*53ee8cc1Swenshuai.xi __const char *arg;
96*53ee8cc1Swenshuai.xi
97*53ee8cc1Swenshuai.xi /* OPTION_ flags. */
98*53ee8cc1Swenshuai.xi int flags;
99*53ee8cc1Swenshuai.xi
100*53ee8cc1Swenshuai.xi /* The doc string for this option. If both NAME and KEY are 0, This string
101*53ee8cc1Swenshuai.xi will be printed outdented from the normal option column, making it
102*53ee8cc1Swenshuai.xi useful as a group header (it will be the first thing printed in its
103*53ee8cc1Swenshuai.xi group); in this usage, it's conventional to end the string with a `:'. */
104*53ee8cc1Swenshuai.xi __const char *doc;
105*53ee8cc1Swenshuai.xi
106*53ee8cc1Swenshuai.xi /* The group this option is in. In a long help message, options are sorted
107*53ee8cc1Swenshuai.xi alphabetically within each group, and the groups presented in the order
108*53ee8cc1Swenshuai.xi 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with
109*53ee8cc1Swenshuai.xi if this field 0 will inherit the group number of the previous entry, or
110*53ee8cc1Swenshuai.xi zero if it's the first one, unless its a group header (NAME and KEY both
111*53ee8cc1Swenshuai.xi 0), in which case, the previous entry + 1 is the default. Automagic
112*53ee8cc1Swenshuai.xi options such as --help are put into group -1. */
113*53ee8cc1Swenshuai.xi int group;
114*53ee8cc1Swenshuai.xi };
115*53ee8cc1Swenshuai.xi
116*53ee8cc1Swenshuai.xi /* The argument associated with this option is optional. */
117*53ee8cc1Swenshuai.xi #define OPTION_ARG_OPTIONAL 0x1
118*53ee8cc1Swenshuai.xi
119*53ee8cc1Swenshuai.xi /* This option isn't displayed in any help messages. */
120*53ee8cc1Swenshuai.xi #define OPTION_HIDDEN 0x2
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi /* This option is an alias for the closest previous non-alias option. This
123*53ee8cc1Swenshuai.xi means that it will be displayed in the same help entry, and will inherit
124*53ee8cc1Swenshuai.xi fields other than NAME and KEY from the aliased option. */
125*53ee8cc1Swenshuai.xi #define OPTION_ALIAS 0x4
126*53ee8cc1Swenshuai.xi
127*53ee8cc1Swenshuai.xi /* This option isn't actually an option (and so should be ignored by the
128*53ee8cc1Swenshuai.xi actual option parser), but rather an arbitrary piece of documentation that
129*53ee8cc1Swenshuai.xi should be displayed in much the same manner as the options. If this flag
130*53ee8cc1Swenshuai.xi is set, then the option NAME field is displayed unmodified (e.g., no `--'
131*53ee8cc1Swenshuai.xi prefix is added) at the left-margin (where a *short* option would normally
132*53ee8cc1Swenshuai.xi be displayed), and the documentation string in the normal place. For
133*53ee8cc1Swenshuai.xi purposes of sorting, any leading whitespace and punctuation is ignored,
134*53ee8cc1Swenshuai.xi except that if the first non-whitespace character is not `-', this entry
135*53ee8cc1Swenshuai.xi is displayed after all options (and OPTION_DOC entries with a leading `-')
136*53ee8cc1Swenshuai.xi in the same group. */
137*53ee8cc1Swenshuai.xi #define OPTION_DOC 0x8
138*53ee8cc1Swenshuai.xi
139*53ee8cc1Swenshuai.xi /* This option shouldn't be included in `long' usage messages (but is still
140*53ee8cc1Swenshuai.xi included in help messages). This is mainly intended for options that are
141*53ee8cc1Swenshuai.xi completely documented in an argp's ARGS_DOC field, in which case including
142*53ee8cc1Swenshuai.xi the option in the generic usage list would be redundant. For instance,
143*53ee8cc1Swenshuai.xi if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to
144*53ee8cc1Swenshuai.xi distinguish these two cases, -x should probably be marked
145*53ee8cc1Swenshuai.xi OPTION_NO_USAGE. */
146*53ee8cc1Swenshuai.xi #define OPTION_NO_USAGE 0x10
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi struct argp; /* fwd declare this type */
149*53ee8cc1Swenshuai.xi struct argp_state; /* " */
150*53ee8cc1Swenshuai.xi struct argp_child; /* " */
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi /* The type of a pointer to an argp parsing function. */
153*53ee8cc1Swenshuai.xi typedef error_t (*argp_parser_t) (int key, char *arg,
154*53ee8cc1Swenshuai.xi struct argp_state *state);
155*53ee8cc1Swenshuai.xi
156*53ee8cc1Swenshuai.xi /* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
157*53ee8cc1Swenshuai.xi returns will simply be ignored. For user keys, this error will be turned
158*53ee8cc1Swenshuai.xi into EINVAL (if the call to argp_parse is such that errors are propagated
159*53ee8cc1Swenshuai.xi back to the user instead of exiting); returning EINVAL itself would result
160*53ee8cc1Swenshuai.xi in an immediate stop to parsing in *all* cases. */
161*53ee8cc1Swenshuai.xi #define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi /* Special values for the KEY argument to an argument parsing function.
164*53ee8cc1Swenshuai.xi ARGP_ERR_UNKNOWN should be returned if they aren't understood.
165*53ee8cc1Swenshuai.xi
166*53ee8cc1Swenshuai.xi The sequence of keys to a parsing function is either (where each
167*53ee8cc1Swenshuai.xi uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key):
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
170*53ee8cc1Swenshuai.xi or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
171*53ee8cc1Swenshuai.xi or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized
172*53ee8cc1Swenshuai.xi
173*53ee8cc1Swenshuai.xi The third case is where every parser returned ARGP_KEY_UNKNOWN for an
174*53ee8cc1Swenshuai.xi argument, in which case parsing stops at that argument (returning the
175*53ee8cc1Swenshuai.xi unparsed arguments to the caller of argp_parse if requested, or stopping
176*53ee8cc1Swenshuai.xi with an error message if not).
177*53ee8cc1Swenshuai.xi
178*53ee8cc1Swenshuai.xi If an error occurs (either detected by argp, or because the parsing
179*53ee8cc1Swenshuai.xi function returned an error value), then the parser is called with
180*53ee8cc1Swenshuai.xi ARGP_KEY_ERROR, and no further calls are made. */
181*53ee8cc1Swenshuai.xi
182*53ee8cc1Swenshuai.xi /* This is not an option at all, but rather a command line argument. If a
183*53ee8cc1Swenshuai.xi parser receiving this key returns success, the fact is recorded, and the
184*53ee8cc1Swenshuai.xi ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the
185*53ee8cc1Swenshuai.xi argument, a parser function decrements the NEXT field of the state it's
186*53ee8cc1Swenshuai.xi passed, the option won't be considered processed; this is to allow you to
187*53ee8cc1Swenshuai.xi actually modify the argument (perhaps into an option), and have it
188*53ee8cc1Swenshuai.xi processed again. */
189*53ee8cc1Swenshuai.xi #define ARGP_KEY_ARG 0
190*53ee8cc1Swenshuai.xi /* There are remaining arguments not parsed by any parser, which may be found
191*53ee8cc1Swenshuai.xi starting at (STATE->argv + STATE->next). If success is returned, but
192*53ee8cc1Swenshuai.xi STATE->next left untouched, it's assumed that all arguments were consume,
193*53ee8cc1Swenshuai.xi otherwise, the parser should adjust STATE->next to reflect any arguments
194*53ee8cc1Swenshuai.xi consumed. */
195*53ee8cc1Swenshuai.xi #define ARGP_KEY_ARGS 0x1000006
196*53ee8cc1Swenshuai.xi /* There are no more command line arguments at all. */
197*53ee8cc1Swenshuai.xi #define ARGP_KEY_END 0x1000001
198*53ee8cc1Swenshuai.xi /* Because it's common to want to do some special processing if there aren't
199*53ee8cc1Swenshuai.xi any non-option args, user parsers are called with this key if they didn't
200*53ee8cc1Swenshuai.xi successfully process any non-option arguments. Called just before
201*53ee8cc1Swenshuai.xi ARGP_KEY_END (where more general validity checks on previously parsed
202*53ee8cc1Swenshuai.xi arguments can take place). */
203*53ee8cc1Swenshuai.xi #define ARGP_KEY_NO_ARGS 0x1000002
204*53ee8cc1Swenshuai.xi /* Passed in before any parsing is done. Afterwards, the values of each
205*53ee8cc1Swenshuai.xi element of the CHILD_INPUT field, if any, in the state structure is
206*53ee8cc1Swenshuai.xi copied to each child's state to be the initial value of the INPUT field. */
207*53ee8cc1Swenshuai.xi #define ARGP_KEY_INIT 0x1000003
208*53ee8cc1Swenshuai.xi /* Use after all other keys, including SUCCESS & END. */
209*53ee8cc1Swenshuai.xi #define ARGP_KEY_FINI 0x1000007
210*53ee8cc1Swenshuai.xi /* Passed in when parsing has successfully been completed (even if there are
211*53ee8cc1Swenshuai.xi still arguments remaining). */
212*53ee8cc1Swenshuai.xi #define ARGP_KEY_SUCCESS 0x1000004
213*53ee8cc1Swenshuai.xi /* Passed in if an error occurs. */
214*53ee8cc1Swenshuai.xi #define ARGP_KEY_ERROR 0x1000005
215*53ee8cc1Swenshuai.xi
216*53ee8cc1Swenshuai.xi /* An argp structure contains a set of options declarations, a function to
217*53ee8cc1Swenshuai.xi deal with parsing one, documentation string, a possible vector of child
218*53ee8cc1Swenshuai.xi argp's, and perhaps a function to filter help output. When actually
219*53ee8cc1Swenshuai.xi parsing options, getopt is called with the union of all the argp
220*53ee8cc1Swenshuai.xi structures chained together through their CHILD pointers, with conflicts
221*53ee8cc1Swenshuai.xi being resolved in favor of the first occurrence in the chain. */
222*53ee8cc1Swenshuai.xi struct argp
223*53ee8cc1Swenshuai.xi {
224*53ee8cc1Swenshuai.xi /* An array of argp_option structures, terminated by an entry with both
225*53ee8cc1Swenshuai.xi NAME and KEY having a value of 0. */
226*53ee8cc1Swenshuai.xi __const struct argp_option *options;
227*53ee8cc1Swenshuai.xi
228*53ee8cc1Swenshuai.xi /* What to do with an option from this structure. KEY is the key
229*53ee8cc1Swenshuai.xi associated with the option, and ARG is any associated argument (NULL if
230*53ee8cc1Swenshuai.xi none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be
231*53ee8cc1Swenshuai.xi returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then
232*53ee8cc1Swenshuai.xi parsing is stopped immediately, and that value is returned from
233*53ee8cc1Swenshuai.xi argp_parse(). For special (non-user-supplied) values of KEY, see the
234*53ee8cc1Swenshuai.xi ARGP_KEY_ definitions below. */
235*53ee8cc1Swenshuai.xi argp_parser_t parser;
236*53ee8cc1Swenshuai.xi
237*53ee8cc1Swenshuai.xi /* A string describing what other arguments are wanted by this program. It
238*53ee8cc1Swenshuai.xi is only used by argp_usage to print the `Usage:' message. If it
239*53ee8cc1Swenshuai.xi contains newlines, the strings separated by them are considered
240*53ee8cc1Swenshuai.xi alternative usage patterns, and printed on separate lines (lines after
241*53ee8cc1Swenshuai.xi the first are prefix by ` or: ' instead of `Usage:'). */
242*53ee8cc1Swenshuai.xi __const char *args_doc;
243*53ee8cc1Swenshuai.xi
244*53ee8cc1Swenshuai.xi /* If non-NULL, a string containing extra text to be printed before and
245*53ee8cc1Swenshuai.xi after the options in a long help message (separated by a vertical tab
246*53ee8cc1Swenshuai.xi `\v' character). */
247*53ee8cc1Swenshuai.xi __const char *doc;
248*53ee8cc1Swenshuai.xi
249*53ee8cc1Swenshuai.xi /* A vector of argp_children structures, terminated by a member with a 0
250*53ee8cc1Swenshuai.xi argp field, pointing to child argps should be parsed with this one. Any
251*53ee8cc1Swenshuai.xi conflicts are resolved in favor of this argp, or early argps in the
252*53ee8cc1Swenshuai.xi CHILDREN list. This field is useful if you use libraries that supply
253*53ee8cc1Swenshuai.xi their own argp structure, which you want to use in conjunction with your
254*53ee8cc1Swenshuai.xi own. */
255*53ee8cc1Swenshuai.xi __const struct argp_child *children;
256*53ee8cc1Swenshuai.xi
257*53ee8cc1Swenshuai.xi /* If non-zero, this should be a function to filter the output of help
258*53ee8cc1Swenshuai.xi messages. KEY is either a key from an option, in which case TEXT is
259*53ee8cc1Swenshuai.xi that option's help text, or a special key from the ARGP_KEY_HELP_
260*53ee8cc1Swenshuai.xi defines, below, describing which other help text TEXT is. The function
261*53ee8cc1Swenshuai.xi should return either TEXT, if it should be used as-is, a replacement
262*53ee8cc1Swenshuai.xi string, which should be malloced, and will be freed by argp, or NULL,
263*53ee8cc1Swenshuai.xi meaning `print nothing'. The value for TEXT is *after* any translation
264*53ee8cc1Swenshuai.xi has been done, so if any of the replacement text also needs translation,
265*53ee8cc1Swenshuai.xi that should be done by the filter function. INPUT is either the input
266*53ee8cc1Swenshuai.xi supplied to argp_parse, or NULL, if argp_help was called directly. */
267*53ee8cc1Swenshuai.xi char *(*help_filter) (int __key, __const char *__text, void *__input);
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi /* If non-zero the strings used in the argp library are translated using
270*53ee8cc1Swenshuai.xi the domain described by this string. Otherwise the currently installed
271*53ee8cc1Swenshuai.xi default domain is used. */
272*53ee8cc1Swenshuai.xi const char *argp_domain;
273*53ee8cc1Swenshuai.xi };
274*53ee8cc1Swenshuai.xi
275*53ee8cc1Swenshuai.xi /* Possible KEY arguments to a help filter function. */
276*53ee8cc1Swenshuai.xi #define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */
277*53ee8cc1Swenshuai.xi #define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
278*53ee8cc1Swenshuai.xi #define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
279*53ee8cc1Swenshuai.xi #define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
280*53ee8cc1Swenshuai.xi TEXT is NULL for this key. */
281*53ee8cc1Swenshuai.xi /* Explanatory note emitted when duplicate option arguments have been
282*53ee8cc1Swenshuai.xi suppressed. */
283*53ee8cc1Swenshuai.xi #define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005
284*53ee8cc1Swenshuai.xi #define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi /* When an argp has a non-zero CHILDREN field, it should point to a vector of
287*53ee8cc1Swenshuai.xi argp_child structures, each of which describes a subsidiary argp. */
288*53ee8cc1Swenshuai.xi struct argp_child
289*53ee8cc1Swenshuai.xi {
290*53ee8cc1Swenshuai.xi /* The child parser. */
291*53ee8cc1Swenshuai.xi __const struct argp *argp;
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi /* Flags for this child. */
294*53ee8cc1Swenshuai.xi int flags;
295*53ee8cc1Swenshuai.xi
296*53ee8cc1Swenshuai.xi /* If non-zero, an optional header to be printed in help output before the
297*53ee8cc1Swenshuai.xi child options. As a side-effect, a non-zero value forces the child
298*53ee8cc1Swenshuai.xi options to be grouped together; to achieve this effect without actually
299*53ee8cc1Swenshuai.xi printing a header string, use a value of "". */
300*53ee8cc1Swenshuai.xi __const char *header;
301*53ee8cc1Swenshuai.xi
302*53ee8cc1Swenshuai.xi /* Where to group the child options relative to the other (`consolidated')
303*53ee8cc1Swenshuai.xi options in the parent argp; the values are the same as the GROUP field
304*53ee8cc1Swenshuai.xi in argp_option structs, but all child-groupings follow parent options at
305*53ee8cc1Swenshuai.xi a particular group level. If both this field and HEADER are zero, then
306*53ee8cc1Swenshuai.xi they aren't grouped at all, but rather merged with the parent options
307*53ee8cc1Swenshuai.xi (merging the child's grouping levels with the parents). */
308*53ee8cc1Swenshuai.xi int group;
309*53ee8cc1Swenshuai.xi };
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi /* Parsing state. This is provided to parsing functions called by argp,
312*53ee8cc1Swenshuai.xi which may examine and, as noted, modify fields. */
313*53ee8cc1Swenshuai.xi struct argp_state
314*53ee8cc1Swenshuai.xi {
315*53ee8cc1Swenshuai.xi /* The top level ARGP being parsed. */
316*53ee8cc1Swenshuai.xi __const struct argp *root_argp;
317*53ee8cc1Swenshuai.xi
318*53ee8cc1Swenshuai.xi /* The argument vector being parsed. May be modified. */
319*53ee8cc1Swenshuai.xi int argc;
320*53ee8cc1Swenshuai.xi char **argv;
321*53ee8cc1Swenshuai.xi
322*53ee8cc1Swenshuai.xi /* The index in ARGV of the next arg that to be parsed. May be modified. */
323*53ee8cc1Swenshuai.xi int next;
324*53ee8cc1Swenshuai.xi
325*53ee8cc1Swenshuai.xi /* The flags supplied to argp_parse. May be modified. */
326*53ee8cc1Swenshuai.xi unsigned flags;
327*53ee8cc1Swenshuai.xi
328*53ee8cc1Swenshuai.xi /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the
329*53ee8cc1Swenshuai.xi number of the current arg, starting at zero, and incremented after each
330*53ee8cc1Swenshuai.xi such call returns. At all other times, this is the number of such
331*53ee8cc1Swenshuai.xi arguments that have been processed. */
332*53ee8cc1Swenshuai.xi unsigned arg_num;
333*53ee8cc1Swenshuai.xi
334*53ee8cc1Swenshuai.xi /* If non-zero, the index in ARGV of the first argument following a special
335*53ee8cc1Swenshuai.xi `--' argument (which prevents anything following being interpreted as an
336*53ee8cc1Swenshuai.xi option). Only set once argument parsing has proceeded past this point. */
337*53ee8cc1Swenshuai.xi int quoted;
338*53ee8cc1Swenshuai.xi
339*53ee8cc1Swenshuai.xi /* An arbitrary pointer passed in from the user. */
340*53ee8cc1Swenshuai.xi void *input;
341*53ee8cc1Swenshuai.xi /* Values to pass to child parsers. This vector will be the same length as
342*53ee8cc1Swenshuai.xi the number of children for the current parser. */
343*53ee8cc1Swenshuai.xi void **child_inputs;
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi /* For the parser's use. Initialized to 0. */
346*53ee8cc1Swenshuai.xi void *hook;
347*53ee8cc1Swenshuai.xi
348*53ee8cc1Swenshuai.xi /* The name used when printing messages. This is initialized to ARGV[0],
349*53ee8cc1Swenshuai.xi or PROGRAM_INVOCATION_NAME if that is unavailable. */
350*53ee8cc1Swenshuai.xi char *name;
351*53ee8cc1Swenshuai.xi
352*53ee8cc1Swenshuai.xi /* Streams used when argp prints something. */
353*53ee8cc1Swenshuai.xi FILE *err_stream; /* For errors; initialized to stderr. */
354*53ee8cc1Swenshuai.xi FILE *out_stream; /* For information; initialized to stdout. */
355*53ee8cc1Swenshuai.xi
356*53ee8cc1Swenshuai.xi void *pstate; /* Private, for use by argp. */
357*53ee8cc1Swenshuai.xi };
358*53ee8cc1Swenshuai.xi
359*53ee8cc1Swenshuai.xi /* Flags for argp_parse (note that the defaults are those that are
360*53ee8cc1Swenshuai.xi convenient for program command line parsing): */
361*53ee8cc1Swenshuai.xi
362*53ee8cc1Swenshuai.xi /* Don't ignore the first element of ARGV. Normally (and always unless
363*53ee8cc1Swenshuai.xi ARGP_NO_ERRS is set) the first element of the argument vector is
364*53ee8cc1Swenshuai.xi skipped for option parsing purposes, as it corresponds to the program name
365*53ee8cc1Swenshuai.xi in a command line. */
366*53ee8cc1Swenshuai.xi #define ARGP_PARSE_ARGV0 0x01
367*53ee8cc1Swenshuai.xi
368*53ee8cc1Swenshuai.xi /* Don't print error messages for unknown options to stderr; unless this flag
369*53ee8cc1Swenshuai.xi is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program
370*53ee8cc1Swenshuai.xi name in the error messages. This flag implies ARGP_NO_EXIT (on the
371*53ee8cc1Swenshuai.xi assumption that silent exiting upon errors is bad behaviour). */
372*53ee8cc1Swenshuai.xi #define ARGP_NO_ERRS 0x02
373*53ee8cc1Swenshuai.xi
374*53ee8cc1Swenshuai.xi /* Don't parse any non-option args. Normally non-option args are parsed by
375*53ee8cc1Swenshuai.xi calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg
376*53ee8cc1Swenshuai.xi as the value. Since it's impossible to know which parse function wants to
377*53ee8cc1Swenshuai.xi handle it, each one is called in turn, until one returns 0 or an error
378*53ee8cc1Swenshuai.xi other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the
379*53ee8cc1Swenshuai.xi argp_parse returns prematurely (but with a return value of 0). If all
380*53ee8cc1Swenshuai.xi args have been parsed without error, all parsing functions are called one
381*53ee8cc1Swenshuai.xi last time with a key of ARGP_KEY_END. This flag needn't normally be set,
382*53ee8cc1Swenshuai.xi as the normal behavior is to stop parsing as soon as some argument can't
383*53ee8cc1Swenshuai.xi be handled. */
384*53ee8cc1Swenshuai.xi #define ARGP_NO_ARGS 0x04
385*53ee8cc1Swenshuai.xi
386*53ee8cc1Swenshuai.xi /* Parse options and arguments in the same order they occur on the command
387*53ee8cc1Swenshuai.xi line -- normally they're rearranged so that all options come first. */
388*53ee8cc1Swenshuai.xi #define ARGP_IN_ORDER 0x08
389*53ee8cc1Swenshuai.xi
390*53ee8cc1Swenshuai.xi /* Don't provide the standard long option --help, which causes usage and
391*53ee8cc1Swenshuai.xi option help information to be output to stdout, and exit (0) called. */
392*53ee8cc1Swenshuai.xi #define ARGP_NO_HELP 0x10
393*53ee8cc1Swenshuai.xi
394*53ee8cc1Swenshuai.xi /* Don't exit on errors (they may still result in error messages). */
395*53ee8cc1Swenshuai.xi #define ARGP_NO_EXIT 0x20
396*53ee8cc1Swenshuai.xi
397*53ee8cc1Swenshuai.xi /* Use the gnu getopt `long-only' rules for parsing arguments. */
398*53ee8cc1Swenshuai.xi #define ARGP_LONG_ONLY 0x40
399*53ee8cc1Swenshuai.xi
400*53ee8cc1Swenshuai.xi /* Turns off any message-printing/exiting options. */
401*53ee8cc1Swenshuai.xi #define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP)
402*53ee8cc1Swenshuai.xi
403*53ee8cc1Swenshuai.xi /* Parse the options strings in ARGC & ARGV according to the options in ARGP.
404*53ee8cc1Swenshuai.xi FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the
405*53ee8cc1Swenshuai.xi index in ARGV of the first unparsed option is returned in it. If an
406*53ee8cc1Swenshuai.xi unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser
407*53ee8cc1Swenshuai.xi routine returned a non-zero value, it is returned; otherwise 0 is
408*53ee8cc1Swenshuai.xi returned. This function may also call exit unless the ARGP_NO_HELP flag
409*53ee8cc1Swenshuai.xi is set. INPUT is a pointer to a value to be passed in to the parser. */
410*53ee8cc1Swenshuai.xi extern error_t argp_parse (__const struct argp *__restrict __argp,
411*53ee8cc1Swenshuai.xi int __argc, char **__restrict __argv,
412*53ee8cc1Swenshuai.xi unsigned __flags, int *__restrict __arg_index,
413*53ee8cc1Swenshuai.xi void *__restrict __input);
414*53ee8cc1Swenshuai.xi extern error_t __argp_parse (__const struct argp *__restrict __argp,
415*53ee8cc1Swenshuai.xi int __argc, char **__restrict __argv,
416*53ee8cc1Swenshuai.xi unsigned __flags, int *__restrict __arg_index,
417*53ee8cc1Swenshuai.xi void *__restrict __input);
418*53ee8cc1Swenshuai.xi
419*53ee8cc1Swenshuai.xi /* Global variables. */
420*53ee8cc1Swenshuai.xi
421*53ee8cc1Swenshuai.xi /* If defined or set by the user program to a non-zero value, then a default
422*53ee8cc1Swenshuai.xi option --version is added (unless the ARGP_NO_HELP flag is used), which
423*53ee8cc1Swenshuai.xi will print this string followed by a newline and exit (unless the
424*53ee8cc1Swenshuai.xi ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
425*53ee8cc1Swenshuai.xi extern __const char *argp_program_version;
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi /* If defined or set by the user program to a non-zero value, then a default
428*53ee8cc1Swenshuai.xi option --version is added (unless the ARGP_NO_HELP flag is used), which
429*53ee8cc1Swenshuai.xi calls this function with a stream to print the version to and a pointer to
430*53ee8cc1Swenshuai.xi the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
431*53ee8cc1Swenshuai.xi used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
432*53ee8cc1Swenshuai.xi extern void (*argp_program_version_hook) (FILE *__restrict __stream,
433*53ee8cc1Swenshuai.xi struct argp_state *__restrict
434*53ee8cc1Swenshuai.xi __state);
435*53ee8cc1Swenshuai.xi
436*53ee8cc1Swenshuai.xi /* If defined or set by the user program, it should point to string that is
437*53ee8cc1Swenshuai.xi the bug-reporting address for the program. It will be printed by
438*53ee8cc1Swenshuai.xi argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
439*53ee8cc1Swenshuai.xi standard help messages), embedded in a sentence that says something like
440*53ee8cc1Swenshuai.xi `Report bugs to ADDR.'. */
441*53ee8cc1Swenshuai.xi extern __const char *argp_program_bug_address;
442*53ee8cc1Swenshuai.xi
443*53ee8cc1Swenshuai.xi /* The exit status that argp will use when exiting due to a parsing error.
444*53ee8cc1Swenshuai.xi If not defined or set by the user program, this defaults to EX_USAGE from
445*53ee8cc1Swenshuai.xi <sysexits.h>. */
446*53ee8cc1Swenshuai.xi extern error_t argp_err_exit_status;
447*53ee8cc1Swenshuai.xi
448*53ee8cc1Swenshuai.xi /* Flags for argp_help. */
449*53ee8cc1Swenshuai.xi #define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
450*53ee8cc1Swenshuai.xi #define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
451*53ee8cc1Swenshuai.xi #define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */
452*53ee8cc1Swenshuai.xi #define ARGP_HELP_LONG 0x08 /* a long help message. */
453*53ee8cc1Swenshuai.xi #define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
454*53ee8cc1Swenshuai.xi #define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
455*53ee8cc1Swenshuai.xi #define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)
456*53ee8cc1Swenshuai.xi #define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */
457*53ee8cc1Swenshuai.xi #define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to
458*53ee8cc1Swenshuai.xi reflect ARGP_LONG_ONLY mode. */
459*53ee8cc1Swenshuai.xi
460*53ee8cc1Swenshuai.xi /* These ARGP_HELP flags are only understood by argp_state_help. */
461*53ee8cc1Swenshuai.xi #define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */
462*53ee8cc1Swenshuai.xi #define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */
463*53ee8cc1Swenshuai.xi
464*53ee8cc1Swenshuai.xi /* The standard thing to do after a program command line parsing error, if an
465*53ee8cc1Swenshuai.xi error message has already been printed. */
466*53ee8cc1Swenshuai.xi #define ARGP_HELP_STD_ERR \
467*53ee8cc1Swenshuai.xi (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
468*53ee8cc1Swenshuai.xi /* The standard thing to do after a program command line parsing error, if no
469*53ee8cc1Swenshuai.xi more specific error message has been printed. */
470*53ee8cc1Swenshuai.xi #define ARGP_HELP_STD_USAGE \
471*53ee8cc1Swenshuai.xi (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
472*53ee8cc1Swenshuai.xi /* The standard thing to do in response to a --help option. */
473*53ee8cc1Swenshuai.xi #define ARGP_HELP_STD_HELP \
474*53ee8cc1Swenshuai.xi (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \
475*53ee8cc1Swenshuai.xi | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR)
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi /* Output a usage message for ARGP to STREAM. FLAGS are from the set
478*53ee8cc1Swenshuai.xi ARGP_HELP_*. */
479*53ee8cc1Swenshuai.xi extern void argp_help (__const struct argp *__restrict __argp,
480*53ee8cc1Swenshuai.xi FILE *__restrict __stream,
481*53ee8cc1Swenshuai.xi unsigned __flags, char *__restrict __name);
482*53ee8cc1Swenshuai.xi extern void __argp_help (__const struct argp *__restrict __argp,
483*53ee8cc1Swenshuai.xi FILE *__restrict __stream, unsigned __flags,
484*53ee8cc1Swenshuai.xi char *__name);
485*53ee8cc1Swenshuai.xi
486*53ee8cc1Swenshuai.xi /* The following routines are intended to be called from within an argp
487*53ee8cc1Swenshuai.xi parsing routine (thus taking an argp_state structure as the first
488*53ee8cc1Swenshuai.xi argument). They may or may not print an error message and exit, depending
489*53ee8cc1Swenshuai.xi on the flags in STATE -- in any case, the caller should be prepared for
490*53ee8cc1Swenshuai.xi them *not* to exit, and should return an appropiate error after calling
491*53ee8cc1Swenshuai.xi them. [argp_usage & argp_error should probably be called argp_state_...,
492*53ee8cc1Swenshuai.xi but they're used often enough that they should be short] */
493*53ee8cc1Swenshuai.xi
494*53ee8cc1Swenshuai.xi /* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
495*53ee8cc1Swenshuai.xi from the set ARGP_HELP_*. */
496*53ee8cc1Swenshuai.xi extern void argp_state_help (__const struct argp_state *__restrict __state,
497*53ee8cc1Swenshuai.xi FILE *__restrict __stream,
498*53ee8cc1Swenshuai.xi unsigned int __flags);
499*53ee8cc1Swenshuai.xi extern void __argp_state_help (__const struct argp_state *__restrict __state,
500*53ee8cc1Swenshuai.xi FILE *__restrict __stream,
501*53ee8cc1Swenshuai.xi unsigned int __flags);
502*53ee8cc1Swenshuai.xi
503*53ee8cc1Swenshuai.xi /* Possibly output the standard usage message for ARGP to stderr and exit. */
504*53ee8cc1Swenshuai.xi extern void argp_usage (__const struct argp_state *__state);
505*53ee8cc1Swenshuai.xi extern void __argp_usage (__const struct argp_state *__state);
506*53ee8cc1Swenshuai.xi
507*53ee8cc1Swenshuai.xi /* If appropriate, print the printf string FMT and following args, preceded
508*53ee8cc1Swenshuai.xi by the program name and `:', to stderr, and followed by a `Try ... --help'
509*53ee8cc1Swenshuai.xi message, then exit (1). */
510*53ee8cc1Swenshuai.xi extern void argp_error (__const struct argp_state *__restrict __state,
511*53ee8cc1Swenshuai.xi __const char *__restrict __fmt, ...)
512*53ee8cc1Swenshuai.xi __attribute__ ((__format__ (__printf__, 2, 3)));
513*53ee8cc1Swenshuai.xi extern void __argp_error (__const struct argp_state *__restrict __state,
514*53ee8cc1Swenshuai.xi __const char *__restrict __fmt, ...)
515*53ee8cc1Swenshuai.xi __attribute__ ((__format__ (__printf__, 2, 3)));
516*53ee8cc1Swenshuai.xi
517*53ee8cc1Swenshuai.xi /* Similar to the standard gnu error-reporting function error(), but will
518*53ee8cc1Swenshuai.xi respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
519*53ee8cc1Swenshuai.xi to STATE->err_stream. This is useful for argument parsing code that is
520*53ee8cc1Swenshuai.xi shared between program startup (when exiting is desired) and runtime
521*53ee8cc1Swenshuai.xi option parsing (when typically an error code is returned instead). The
522*53ee8cc1Swenshuai.xi difference between this function and argp_error is that the latter is for
523*53ee8cc1Swenshuai.xi *parsing errors*, and the former is for other problems that occur during
524*53ee8cc1Swenshuai.xi parsing but don't reflect a (syntactic) problem with the input. */
525*53ee8cc1Swenshuai.xi extern void argp_failure (__const struct argp_state *__restrict __state,
526*53ee8cc1Swenshuai.xi int __status, int __errnum,
527*53ee8cc1Swenshuai.xi __const char *__restrict __fmt, ...)
528*53ee8cc1Swenshuai.xi __attribute__ ((__format__ (__printf__, 4, 5)));
529*53ee8cc1Swenshuai.xi extern void __argp_failure (__const struct argp_state *__restrict __state,
530*53ee8cc1Swenshuai.xi int __status, int __errnum,
531*53ee8cc1Swenshuai.xi __const char *__restrict __fmt, ...)
532*53ee8cc1Swenshuai.xi __attribute__ ((__format__ (__printf__, 4, 5)));
533*53ee8cc1Swenshuai.xi
534*53ee8cc1Swenshuai.xi /* Returns true if the option OPT is a valid short option. */
535*53ee8cc1Swenshuai.xi extern int _option_is_short (__const struct argp_option *__opt) __THROW;
536*53ee8cc1Swenshuai.xi extern int __option_is_short (__const struct argp_option *__opt) __THROW;
537*53ee8cc1Swenshuai.xi
538*53ee8cc1Swenshuai.xi /* Returns true if the option OPT is in fact the last (unused) entry in an
539*53ee8cc1Swenshuai.xi options array. */
540*53ee8cc1Swenshuai.xi extern int _option_is_end (__const struct argp_option *__opt) __THROW;
541*53ee8cc1Swenshuai.xi extern int __option_is_end (__const struct argp_option *__opt) __THROW;
542*53ee8cc1Swenshuai.xi
543*53ee8cc1Swenshuai.xi /* Return the input field for ARGP in the parser corresponding to STATE; used
544*53ee8cc1Swenshuai.xi by the help routines. */
545*53ee8cc1Swenshuai.xi extern void *_argp_input (__const struct argp *__restrict __argp,
546*53ee8cc1Swenshuai.xi __const struct argp_state *__restrict __state)
547*53ee8cc1Swenshuai.xi __THROW;
548*53ee8cc1Swenshuai.xi extern void *__argp_input (__const struct argp *__restrict __argp,
549*53ee8cc1Swenshuai.xi __const struct argp_state *__restrict __state)
550*53ee8cc1Swenshuai.xi __THROW;
551*53ee8cc1Swenshuai.xi
552*53ee8cc1Swenshuai.xi #ifdef __USE_EXTERN_INLINES
553*53ee8cc1Swenshuai.xi
554*53ee8cc1Swenshuai.xi # if !_LIBC
555*53ee8cc1Swenshuai.xi # define __argp_usage argp_usage
556*53ee8cc1Swenshuai.xi # define __argp_state_help argp_state_help
557*53ee8cc1Swenshuai.xi # define __option_is_short _option_is_short
558*53ee8cc1Swenshuai.xi # define __option_is_end _option_is_end
559*53ee8cc1Swenshuai.xi # endif
560*53ee8cc1Swenshuai.xi
561*53ee8cc1Swenshuai.xi # ifndef ARGP_EI
562*53ee8cc1Swenshuai.xi # define ARGP_EI __extern_inline
563*53ee8cc1Swenshuai.xi # endif
564*53ee8cc1Swenshuai.xi
565*53ee8cc1Swenshuai.xi ARGP_EI void
__argp_usage(__const struct argp_state * __state)566*53ee8cc1Swenshuai.xi __argp_usage (__const struct argp_state *__state)
567*53ee8cc1Swenshuai.xi {
568*53ee8cc1Swenshuai.xi __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);
569*53ee8cc1Swenshuai.xi }
570*53ee8cc1Swenshuai.xi
571*53ee8cc1Swenshuai.xi ARGP_EI int
__NTH(__option_is_short (__const struct argp_option * __opt))572*53ee8cc1Swenshuai.xi __NTH (__option_is_short (__const struct argp_option *__opt))
573*53ee8cc1Swenshuai.xi {
574*53ee8cc1Swenshuai.xi if (__opt->flags & OPTION_DOC)
575*53ee8cc1Swenshuai.xi return 0;
576*53ee8cc1Swenshuai.xi else
577*53ee8cc1Swenshuai.xi {
578*53ee8cc1Swenshuai.xi int __key = __opt->key;
579*53ee8cc1Swenshuai.xi return __key > 0 && __key <= UCHAR_MAX && isprint (__key);
580*53ee8cc1Swenshuai.xi }
581*53ee8cc1Swenshuai.xi }
582*53ee8cc1Swenshuai.xi
583*53ee8cc1Swenshuai.xi ARGP_EI int
__NTH(__option_is_end (__const struct argp_option * __opt))584*53ee8cc1Swenshuai.xi __NTH (__option_is_end (__const struct argp_option *__opt))
585*53ee8cc1Swenshuai.xi {
586*53ee8cc1Swenshuai.xi return !__opt->key && !__opt->name && !__opt->doc && !__opt->group;
587*53ee8cc1Swenshuai.xi }
588*53ee8cc1Swenshuai.xi
589*53ee8cc1Swenshuai.xi # if !_LIBC
590*53ee8cc1Swenshuai.xi # undef __argp_usage
591*53ee8cc1Swenshuai.xi # undef __argp_state_help
592*53ee8cc1Swenshuai.xi # undef __option_is_short
593*53ee8cc1Swenshuai.xi # undef __option_is_end
594*53ee8cc1Swenshuai.xi # endif
595*53ee8cc1Swenshuai.xi #endif /* Use extern inlines. */
596*53ee8cc1Swenshuai.xi
597*53ee8cc1Swenshuai.xi #ifdef __cplusplus
598*53ee8cc1Swenshuai.xi }
599*53ee8cc1Swenshuai.xi #endif
600*53ee8cc1Swenshuai.xi
601*53ee8cc1Swenshuai.xi #endif /* argp.h */
602