xref: /plan9/sys/src/ape/cmd/patch/getopt.h (revision 0b459c2cb92b7c9d88818e9a2f72e678e5bc4553)
1*0b459c2cSDavid du Colombier /* Declarations for getopt.
2*0b459c2cSDavid du Colombier    Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
3*0b459c2cSDavid du Colombier 
4*0b459c2cSDavid du Colombier NOTE: The canonical source of this file is maintained with the GNU C Library.
5*0b459c2cSDavid du Colombier Bugs can be reported to bug-glibc@prep.ai.mit.edu.
6*0b459c2cSDavid du Colombier 
7*0b459c2cSDavid du Colombier This program is free software; you can redistribute it and/or modify it
8*0b459c2cSDavid du Colombier under the terms of the GNU General Public License as published by the
9*0b459c2cSDavid du Colombier Free Software Foundation; either version 2, or (at your option) any
10*0b459c2cSDavid du Colombier later version.
11*0b459c2cSDavid du Colombier 
12*0b459c2cSDavid du Colombier This program is distributed in the hope that it will be useful,
13*0b459c2cSDavid du Colombier but WITHOUT ANY WARRANTY; without even the implied warranty of
14*0b459c2cSDavid du Colombier MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*0b459c2cSDavid du Colombier GNU General Public License for more details.
16*0b459c2cSDavid du Colombier 
17*0b459c2cSDavid du Colombier You should have received a copy of the GNU General Public License
18*0b459c2cSDavid du Colombier along with this program; if not, write to the Free Software
19*0b459c2cSDavid du Colombier Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20*0b459c2cSDavid du Colombier USA.  */
21*0b459c2cSDavid du Colombier 
22*0b459c2cSDavid du Colombier #ifndef _GETOPT_H
23*0b459c2cSDavid du Colombier #define _GETOPT_H 1
24*0b459c2cSDavid du Colombier 
25*0b459c2cSDavid du Colombier #ifdef	__cplusplus
26*0b459c2cSDavid du Colombier extern "C" {
27*0b459c2cSDavid du Colombier #endif
28*0b459c2cSDavid du Colombier 
29*0b459c2cSDavid du Colombier /* For communication from `getopt' to the caller.
30*0b459c2cSDavid du Colombier    When `getopt' finds an option that takes an argument,
31*0b459c2cSDavid du Colombier    the argument value is returned here.
32*0b459c2cSDavid du Colombier    Also, when `ordering' is RETURN_IN_ORDER,
33*0b459c2cSDavid du Colombier    each non-option ARGV-element is returned here.  */
34*0b459c2cSDavid du Colombier 
35*0b459c2cSDavid du Colombier extern char *optarg;
36*0b459c2cSDavid du Colombier 
37*0b459c2cSDavid du Colombier /* Index in ARGV of the next element to be scanned.
38*0b459c2cSDavid du Colombier    This is used for communication to and from the caller
39*0b459c2cSDavid du Colombier    and for communication between successive calls to `getopt'.
40*0b459c2cSDavid du Colombier 
41*0b459c2cSDavid du Colombier    On entry to `getopt', zero means this is the first call; initialize.
42*0b459c2cSDavid du Colombier 
43*0b459c2cSDavid du Colombier    When `getopt' returns -1, this is the index of the first of the
44*0b459c2cSDavid du Colombier    non-option elements that the caller should itself scan.
45*0b459c2cSDavid du Colombier 
46*0b459c2cSDavid du Colombier    Otherwise, `optind' communicates from one call to the next
47*0b459c2cSDavid du Colombier    how much of ARGV has been scanned so far.  */
48*0b459c2cSDavid du Colombier 
49*0b459c2cSDavid du Colombier extern int optind;
50*0b459c2cSDavid du Colombier 
51*0b459c2cSDavid du Colombier /* Callers store zero here to inhibit the error message `getopt' prints
52*0b459c2cSDavid du Colombier    for unrecognized options.  */
53*0b459c2cSDavid du Colombier 
54*0b459c2cSDavid du Colombier extern int opterr;
55*0b459c2cSDavid du Colombier 
56*0b459c2cSDavid du Colombier /* Set to an option character which was unrecognized.  */
57*0b459c2cSDavid du Colombier 
58*0b459c2cSDavid du Colombier extern int optopt;
59*0b459c2cSDavid du Colombier 
60*0b459c2cSDavid du Colombier /* Describe the long-named options requested by the application.
61*0b459c2cSDavid du Colombier    The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
62*0b459c2cSDavid du Colombier    of `struct option' terminated by an element containing a name which is
63*0b459c2cSDavid du Colombier    zero.
64*0b459c2cSDavid du Colombier 
65*0b459c2cSDavid du Colombier    The field `has_arg' is:
66*0b459c2cSDavid du Colombier    no_argument		(or 0) if the option does not take an argument,
67*0b459c2cSDavid du Colombier    required_argument	(or 1) if the option requires an argument,
68*0b459c2cSDavid du Colombier    optional_argument 	(or 2) if the option takes an optional argument.
69*0b459c2cSDavid du Colombier 
70*0b459c2cSDavid du Colombier    If the field `flag' is not NULL, it points to a variable that is set
71*0b459c2cSDavid du Colombier    to the value given in the field `val' when the option is found, but
72*0b459c2cSDavid du Colombier    left unchanged if the option is not found.
73*0b459c2cSDavid du Colombier 
74*0b459c2cSDavid du Colombier    To have a long-named option do something other than set an `int' to
75*0b459c2cSDavid du Colombier    a compiled-in constant, such as set a value from `optarg', set the
76*0b459c2cSDavid du Colombier    option's `flag' field to zero and its `val' field to a nonzero
77*0b459c2cSDavid du Colombier    value (the equivalent single-letter option character, if there is
78*0b459c2cSDavid du Colombier    one).  For long options that have a zero `flag' field, `getopt'
79*0b459c2cSDavid du Colombier    returns the contents of the `val' field.  */
80*0b459c2cSDavid du Colombier 
81*0b459c2cSDavid du Colombier struct option
82*0b459c2cSDavid du Colombier {
83*0b459c2cSDavid du Colombier #if defined (__STDC__) && __STDC__
84*0b459c2cSDavid du Colombier   const char *name;
85*0b459c2cSDavid du Colombier #else
86*0b459c2cSDavid du Colombier   char *name;
87*0b459c2cSDavid du Colombier #endif
88*0b459c2cSDavid du Colombier   /* has_arg can't be an enum because some compilers complain about
89*0b459c2cSDavid du Colombier      type mismatches in all the code that assumes it is an int.  */
90*0b459c2cSDavid du Colombier   int has_arg;
91*0b459c2cSDavid du Colombier   int *flag;
92*0b459c2cSDavid du Colombier   int val;
93*0b459c2cSDavid du Colombier };
94*0b459c2cSDavid du Colombier 
95*0b459c2cSDavid du Colombier /* Names for the values of the `has_arg' field of `struct option'.  */
96*0b459c2cSDavid du Colombier 
97*0b459c2cSDavid du Colombier #define	no_argument		0
98*0b459c2cSDavid du Colombier #define required_argument	1
99*0b459c2cSDavid du Colombier #define optional_argument	2
100*0b459c2cSDavid du Colombier 
101*0b459c2cSDavid du Colombier #if defined (__STDC__) && __STDC__
102*0b459c2cSDavid du Colombier #ifdef __GNU_LIBRARY__
103*0b459c2cSDavid du Colombier /* Many other libraries have conflicting prototypes for getopt, with
104*0b459c2cSDavid du Colombier    differences in the consts, in stdlib.h.  To avoid compilation
105*0b459c2cSDavid du Colombier    errors, only prototype getopt for the GNU C library.  */
106*0b459c2cSDavid du Colombier extern int getopt (int argc, char *const *argv, const char *shortopts);
107*0b459c2cSDavid du Colombier #else /* not __GNU_LIBRARY__ */
108*0b459c2cSDavid du Colombier extern int getopt ();
109*0b459c2cSDavid du Colombier #endif /* __GNU_LIBRARY__ */
110*0b459c2cSDavid du Colombier extern int getopt_long (int argc, char *const *argv, const char *shortopts,
111*0b459c2cSDavid du Colombier 		        const struct option *longopts, int *longind);
112*0b459c2cSDavid du Colombier extern int getopt_long_only (int argc, char *const *argv,
113*0b459c2cSDavid du Colombier 			     const char *shortopts,
114*0b459c2cSDavid du Colombier 		             const struct option *longopts, int *longind);
115*0b459c2cSDavid du Colombier 
116*0b459c2cSDavid du Colombier /* Internal only.  Users should not call this directly.  */
117*0b459c2cSDavid du Colombier extern int _getopt_internal (int argc, char *const *argv,
118*0b459c2cSDavid du Colombier 			     const char *shortopts,
119*0b459c2cSDavid du Colombier 		             const struct option *longopts, int *longind,
120*0b459c2cSDavid du Colombier 			     int long_only);
121*0b459c2cSDavid du Colombier #else /* not __STDC__ */
122*0b459c2cSDavid du Colombier extern int getopt ();
123*0b459c2cSDavid du Colombier extern int getopt_long ();
124*0b459c2cSDavid du Colombier extern int getopt_long_only ();
125*0b459c2cSDavid du Colombier 
126*0b459c2cSDavid du Colombier extern int _getopt_internal ();
127*0b459c2cSDavid du Colombier #endif /* __STDC__ */
128*0b459c2cSDavid du Colombier 
129*0b459c2cSDavid du Colombier #ifdef	__cplusplus
130*0b459c2cSDavid du Colombier }
131*0b459c2cSDavid du Colombier #endif
132*0b459c2cSDavid du Colombier 
133*0b459c2cSDavid du Colombier #endif /* _GETOPT_H */
134