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