1*0b459c2cSDavid du Colombier /* getopt_long and getopt_long_only entry points for GNU getopt.
2*0b459c2cSDavid du Colombier Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
3*0b459c2cSDavid du Colombier Free Software Foundation, Inc.
4*0b459c2cSDavid du Colombier
5*0b459c2cSDavid du Colombier This program is free software; you can redistribute it and/or modify it
6*0b459c2cSDavid du Colombier under the terms of the GNU General Public License as published by the
7*0b459c2cSDavid du Colombier Free Software Foundation; either version 2, or (at your option) any
8*0b459c2cSDavid du Colombier later version.
9*0b459c2cSDavid du Colombier
10*0b459c2cSDavid du Colombier This program is distributed in the hope that it will be useful,
11*0b459c2cSDavid du Colombier but WITHOUT ANY WARRANTY; without even the implied warranty of
12*0b459c2cSDavid du Colombier MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*0b459c2cSDavid du Colombier GNU General Public License for more details.
14*0b459c2cSDavid du Colombier
15*0b459c2cSDavid du Colombier You should have received a copy of the GNU General Public License
16*0b459c2cSDavid du Colombier along with this program; if not, write to the Free Software
17*0b459c2cSDavid du Colombier Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
18*0b459c2cSDavid du Colombier
19*0b459c2cSDavid du Colombier #ifdef HAVE_CONFIG_H
20*0b459c2cSDavid du Colombier #include <config.h>
21*0b459c2cSDavid du Colombier #endif
22*0b459c2cSDavid du Colombier
23*0b459c2cSDavid du Colombier #include "getopt.h"
24*0b459c2cSDavid du Colombier
25*0b459c2cSDavid du Colombier #ifndef __STDC__
26*0b459c2cSDavid du Colombier /* This is a separate conditional since some stdc systems
27*0b459c2cSDavid du Colombier reject `defined (const)'. */
28*0b459c2cSDavid du Colombier #ifndef const
29*0b459c2cSDavid du Colombier #define const
30*0b459c2cSDavid du Colombier #endif
31*0b459c2cSDavid du Colombier #endif
32*0b459c2cSDavid du Colombier
33*0b459c2cSDavid du Colombier #include <stdio.h>
34*0b459c2cSDavid du Colombier
35*0b459c2cSDavid du Colombier /* Comment out all this code if we are using the GNU C Library, and are not
36*0b459c2cSDavid du Colombier actually compiling the library itself. This code is part of the GNU C
37*0b459c2cSDavid du Colombier Library, but also included in many other GNU distributions. Compiling
38*0b459c2cSDavid du Colombier and linking in this code is a waste when using the GNU C library
39*0b459c2cSDavid du Colombier (especially if it is a shared library). Rather than having every GNU
40*0b459c2cSDavid du Colombier program understand `configure --with-gnu-libc' and omit the object files,
41*0b459c2cSDavid du Colombier it is simpler to just do this in the source for each such file. */
42*0b459c2cSDavid du Colombier
43*0b459c2cSDavid du Colombier #if defined (_LIBC) || !defined (__GNU_LIBRARY__)
44*0b459c2cSDavid du Colombier
45*0b459c2cSDavid du Colombier
46*0b459c2cSDavid du Colombier /* This needs to come after some library #include
47*0b459c2cSDavid du Colombier to get __GNU_LIBRARY__ defined. */
48*0b459c2cSDavid du Colombier #ifdef __GNU_LIBRARY__
49*0b459c2cSDavid du Colombier #include <stdlib.h>
50*0b459c2cSDavid du Colombier #else
51*0b459c2cSDavid du Colombier char *getenv ();
52*0b459c2cSDavid du Colombier #endif
53*0b459c2cSDavid du Colombier
54*0b459c2cSDavid du Colombier #ifndef NULL
55*0b459c2cSDavid du Colombier #define NULL 0
56*0b459c2cSDavid du Colombier #endif
57*0b459c2cSDavid du Colombier
58*0b459c2cSDavid du Colombier int
getopt_long(argc,argv,options,long_options,opt_index)59*0b459c2cSDavid du Colombier getopt_long (argc, argv, options, long_options, opt_index)
60*0b459c2cSDavid du Colombier int argc;
61*0b459c2cSDavid du Colombier char *const *argv;
62*0b459c2cSDavid du Colombier const char *options;
63*0b459c2cSDavid du Colombier const struct option *long_options;
64*0b459c2cSDavid du Colombier int *opt_index;
65*0b459c2cSDavid du Colombier {
66*0b459c2cSDavid du Colombier return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
67*0b459c2cSDavid du Colombier }
68*0b459c2cSDavid du Colombier
69*0b459c2cSDavid du Colombier /* Like getopt_long, but '-' as well as '--' can indicate a long option.
70*0b459c2cSDavid du Colombier If an option that starts with '-' (not '--') doesn't match a long option,
71*0b459c2cSDavid du Colombier but does match a short option, it is parsed as a short option
72*0b459c2cSDavid du Colombier instead. */
73*0b459c2cSDavid du Colombier
74*0b459c2cSDavid du Colombier int
getopt_long_only(argc,argv,options,long_options,opt_index)75*0b459c2cSDavid du Colombier getopt_long_only (argc, argv, options, long_options, opt_index)
76*0b459c2cSDavid du Colombier int argc;
77*0b459c2cSDavid du Colombier char *const *argv;
78*0b459c2cSDavid du Colombier const char *options;
79*0b459c2cSDavid du Colombier const struct option *long_options;
80*0b459c2cSDavid du Colombier int *opt_index;
81*0b459c2cSDavid du Colombier {
82*0b459c2cSDavid du Colombier return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
83*0b459c2cSDavid du Colombier }
84*0b459c2cSDavid du Colombier
85*0b459c2cSDavid du Colombier
86*0b459c2cSDavid du Colombier #endif /* _LIBC or not __GNU_LIBRARY__. */
87*0b459c2cSDavid du Colombier
88*0b459c2cSDavid du Colombier #ifdef TEST
89*0b459c2cSDavid du Colombier
90*0b459c2cSDavid du Colombier #include <stdio.h>
91*0b459c2cSDavid du Colombier
92*0b459c2cSDavid du Colombier int
main(argc,argv)93*0b459c2cSDavid du Colombier main (argc, argv)
94*0b459c2cSDavid du Colombier int argc;
95*0b459c2cSDavid du Colombier char **argv;
96*0b459c2cSDavid du Colombier {
97*0b459c2cSDavid du Colombier int c;
98*0b459c2cSDavid du Colombier int digit_optind = 0;
99*0b459c2cSDavid du Colombier
100*0b459c2cSDavid du Colombier while (1)
101*0b459c2cSDavid du Colombier {
102*0b459c2cSDavid du Colombier int this_option_optind = optind ? optind : 1;
103*0b459c2cSDavid du Colombier int option_index = 0;
104*0b459c2cSDavid du Colombier static struct option long_options[] =
105*0b459c2cSDavid du Colombier {
106*0b459c2cSDavid du Colombier {"add", 1, 0, 0},
107*0b459c2cSDavid du Colombier {"append", 0, 0, 0},
108*0b459c2cSDavid du Colombier {"delete", 1, 0, 0},
109*0b459c2cSDavid du Colombier {"verbose", 0, 0, 0},
110*0b459c2cSDavid du Colombier {"create", 0, 0, 0},
111*0b459c2cSDavid du Colombier {"file", 1, 0, 0},
112*0b459c2cSDavid du Colombier {0, 0, 0, 0}
113*0b459c2cSDavid du Colombier };
114*0b459c2cSDavid du Colombier
115*0b459c2cSDavid du Colombier c = getopt_long (argc, argv, "abc:d:0123456789",
116*0b459c2cSDavid du Colombier long_options, &option_index);
117*0b459c2cSDavid du Colombier if (c == EOF)
118*0b459c2cSDavid du Colombier break;
119*0b459c2cSDavid du Colombier
120*0b459c2cSDavid du Colombier switch (c)
121*0b459c2cSDavid du Colombier {
122*0b459c2cSDavid du Colombier case 0:
123*0b459c2cSDavid du Colombier printf ("option %s", long_options[option_index].name);
124*0b459c2cSDavid du Colombier if (optarg)
125*0b459c2cSDavid du Colombier printf (" with arg %s", optarg);
126*0b459c2cSDavid du Colombier printf ("\n");
127*0b459c2cSDavid du Colombier break;
128*0b459c2cSDavid du Colombier
129*0b459c2cSDavid du Colombier case '0':
130*0b459c2cSDavid du Colombier case '1':
131*0b459c2cSDavid du Colombier case '2':
132*0b459c2cSDavid du Colombier case '3':
133*0b459c2cSDavid du Colombier case '4':
134*0b459c2cSDavid du Colombier case '5':
135*0b459c2cSDavid du Colombier case '6':
136*0b459c2cSDavid du Colombier case '7':
137*0b459c2cSDavid du Colombier case '8':
138*0b459c2cSDavid du Colombier case '9':
139*0b459c2cSDavid du Colombier if (digit_optind != 0 && digit_optind != this_option_optind)
140*0b459c2cSDavid du Colombier printf ("digits occur in two different argv-elements.\n");
141*0b459c2cSDavid du Colombier digit_optind = this_option_optind;
142*0b459c2cSDavid du Colombier printf ("option %c\n", c);
143*0b459c2cSDavid du Colombier break;
144*0b459c2cSDavid du Colombier
145*0b459c2cSDavid du Colombier case 'a':
146*0b459c2cSDavid du Colombier printf ("option a\n");
147*0b459c2cSDavid du Colombier break;
148*0b459c2cSDavid du Colombier
149*0b459c2cSDavid du Colombier case 'b':
150*0b459c2cSDavid du Colombier printf ("option b\n");
151*0b459c2cSDavid du Colombier break;
152*0b459c2cSDavid du Colombier
153*0b459c2cSDavid du Colombier case 'c':
154*0b459c2cSDavid du Colombier printf ("option c with value `%s'\n", optarg);
155*0b459c2cSDavid du Colombier break;
156*0b459c2cSDavid du Colombier
157*0b459c2cSDavid du Colombier case 'd':
158*0b459c2cSDavid du Colombier printf ("option d with value `%s'\n", optarg);
159*0b459c2cSDavid du Colombier break;
160*0b459c2cSDavid du Colombier
161*0b459c2cSDavid du Colombier case '?':
162*0b459c2cSDavid du Colombier break;
163*0b459c2cSDavid du Colombier
164*0b459c2cSDavid du Colombier default:
165*0b459c2cSDavid du Colombier printf ("?? getopt returned character code 0%o ??\n", c);
166*0b459c2cSDavid du Colombier }
167*0b459c2cSDavid du Colombier }
168*0b459c2cSDavid du Colombier
169*0b459c2cSDavid du Colombier if (optind < argc)
170*0b459c2cSDavid du Colombier {
171*0b459c2cSDavid du Colombier printf ("non-option ARGV-elements: ");
172*0b459c2cSDavid du Colombier while (optind < argc)
173*0b459c2cSDavid du Colombier printf ("%s ", argv[optind++]);
174*0b459c2cSDavid du Colombier printf ("\n");
175*0b459c2cSDavid du Colombier }
176*0b459c2cSDavid du Colombier
177*0b459c2cSDavid du Colombier exit (0);
178*0b459c2cSDavid du Colombier }
179*0b459c2cSDavid du Colombier
180*0b459c2cSDavid du Colombier #endif /* TEST */
181