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,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 #ifdef HAVE_CONFIG_H
23*0b459c2cSDavid du Colombier #include <config.h>
24*0b459c2cSDavid du Colombier #endif
25*0b459c2cSDavid du Colombier
26*0b459c2cSDavid du Colombier #include "getopt.h"
27*0b459c2cSDavid du Colombier
28*0b459c2cSDavid du Colombier #if !defined (__STDC__) || !__STDC__
29*0b459c2cSDavid du Colombier /* This is a separate conditional since some stdc systems
30*0b459c2cSDavid du Colombier reject `defined (const)'. */
31*0b459c2cSDavid du Colombier #ifndef const
32*0b459c2cSDavid du Colombier #define const
33*0b459c2cSDavid du Colombier #endif
34*0b459c2cSDavid du Colombier #endif
35*0b459c2cSDavid du Colombier
36*0b459c2cSDavid du Colombier #include <stdio.h>
37*0b459c2cSDavid du Colombier
38*0b459c2cSDavid du Colombier /* Comment out all this code if we are using the GNU C Library, and are not
39*0b459c2cSDavid du Colombier actually compiling the library itself. This code is part of the GNU C
40*0b459c2cSDavid du Colombier Library, but also included in many other GNU distributions. Compiling
41*0b459c2cSDavid du Colombier and linking in this code is a waste when using the GNU C library
42*0b459c2cSDavid du Colombier (especially if it is a shared library). Rather than having every GNU
43*0b459c2cSDavid du Colombier program understand `configure --with-gnu-libc' and omit the object files,
44*0b459c2cSDavid du Colombier it is simpler to just do this in the source for each such file. */
45*0b459c2cSDavid du Colombier
46*0b459c2cSDavid du Colombier #define GETOPT_INTERFACE_VERSION 2
47*0b459c2cSDavid du Colombier #if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
48*0b459c2cSDavid du Colombier #include <gnu-versions.h>
49*0b459c2cSDavid du Colombier #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
50*0b459c2cSDavid du Colombier #define ELIDE_CODE
51*0b459c2cSDavid du Colombier #endif
52*0b459c2cSDavid du Colombier #endif
53*0b459c2cSDavid du Colombier
54*0b459c2cSDavid du Colombier #ifndef ELIDE_CODE
55*0b459c2cSDavid du Colombier
56*0b459c2cSDavid du Colombier
57*0b459c2cSDavid du Colombier /* This needs to come after some library #include
58*0b459c2cSDavid du Colombier to get __GNU_LIBRARY__ defined. */
59*0b459c2cSDavid du Colombier #ifdef __GNU_LIBRARY__
60*0b459c2cSDavid du Colombier #include <stdlib.h>
61*0b459c2cSDavid du Colombier #endif
62*0b459c2cSDavid du Colombier
63*0b459c2cSDavid du Colombier #ifndef NULL
64*0b459c2cSDavid du Colombier #define NULL 0
65*0b459c2cSDavid du Colombier #endif
66*0b459c2cSDavid du Colombier
67*0b459c2cSDavid du Colombier int
getopt_long(argc,argv,options,long_options,opt_index)68*0b459c2cSDavid du Colombier getopt_long (argc, argv, options, long_options, opt_index)
69*0b459c2cSDavid du Colombier int argc;
70*0b459c2cSDavid du Colombier char *const *argv;
71*0b459c2cSDavid du Colombier const char *options;
72*0b459c2cSDavid du Colombier const struct option *long_options;
73*0b459c2cSDavid du Colombier int *opt_index;
74*0b459c2cSDavid du Colombier {
75*0b459c2cSDavid du Colombier return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
76*0b459c2cSDavid du Colombier }
77*0b459c2cSDavid du Colombier
78*0b459c2cSDavid du Colombier /* Like getopt_long, but '-' as well as '--' can indicate a long option.
79*0b459c2cSDavid du Colombier If an option that starts with '-' (not '--') doesn't match a long option,
80*0b459c2cSDavid du Colombier but does match a short option, it is parsed as a short option
81*0b459c2cSDavid du Colombier instead. */
82*0b459c2cSDavid du Colombier
83*0b459c2cSDavid du Colombier int
getopt_long_only(argc,argv,options,long_options,opt_index)84*0b459c2cSDavid du Colombier getopt_long_only (argc, argv, options, long_options, opt_index)
85*0b459c2cSDavid du Colombier int argc;
86*0b459c2cSDavid du Colombier char *const *argv;
87*0b459c2cSDavid du Colombier const char *options;
88*0b459c2cSDavid du Colombier const struct option *long_options;
89*0b459c2cSDavid du Colombier int *opt_index;
90*0b459c2cSDavid du Colombier {
91*0b459c2cSDavid du Colombier return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
92*0b459c2cSDavid du Colombier }
93*0b459c2cSDavid du Colombier
94*0b459c2cSDavid du Colombier
95*0b459c2cSDavid du Colombier #endif /* Not ELIDE_CODE. */
96*0b459c2cSDavid du Colombier
97*0b459c2cSDavid du Colombier #ifdef TEST
98*0b459c2cSDavid du Colombier
99*0b459c2cSDavid du Colombier #include <stdio.h>
100*0b459c2cSDavid du Colombier
101*0b459c2cSDavid du Colombier int
main(argc,argv)102*0b459c2cSDavid du Colombier main (argc, argv)
103*0b459c2cSDavid du Colombier int argc;
104*0b459c2cSDavid du Colombier char **argv;
105*0b459c2cSDavid du Colombier {
106*0b459c2cSDavid du Colombier int c;
107*0b459c2cSDavid du Colombier int digit_optind = 0;
108*0b459c2cSDavid du Colombier
109*0b459c2cSDavid du Colombier while (1)
110*0b459c2cSDavid du Colombier {
111*0b459c2cSDavid du Colombier int this_option_optind = optind ? optind : 1;
112*0b459c2cSDavid du Colombier int option_index = 0;
113*0b459c2cSDavid du Colombier static struct option long_options[] =
114*0b459c2cSDavid du Colombier {
115*0b459c2cSDavid du Colombier {"add", 1, 0, 0},
116*0b459c2cSDavid du Colombier {"append", 0, 0, 0},
117*0b459c2cSDavid du Colombier {"delete", 1, 0, 0},
118*0b459c2cSDavid du Colombier {"verbose", 0, 0, 0},
119*0b459c2cSDavid du Colombier {"create", 0, 0, 0},
120*0b459c2cSDavid du Colombier {"file", 1, 0, 0},
121*0b459c2cSDavid du Colombier {0, 0, 0, 0}
122*0b459c2cSDavid du Colombier };
123*0b459c2cSDavid du Colombier
124*0b459c2cSDavid du Colombier c = getopt_long (argc, argv, "abc:d:0123456789",
125*0b459c2cSDavid du Colombier long_options, &option_index);
126*0b459c2cSDavid du Colombier if (c == -1)
127*0b459c2cSDavid du Colombier break;
128*0b459c2cSDavid du Colombier
129*0b459c2cSDavid du Colombier switch (c)
130*0b459c2cSDavid du Colombier {
131*0b459c2cSDavid du Colombier case 0:
132*0b459c2cSDavid du Colombier printf ("option %s", long_options[option_index].name);
133*0b459c2cSDavid du Colombier if (optarg)
134*0b459c2cSDavid du Colombier printf (" with arg %s", optarg);
135*0b459c2cSDavid du Colombier printf ("\n");
136*0b459c2cSDavid du Colombier break;
137*0b459c2cSDavid du Colombier
138*0b459c2cSDavid du Colombier case '0':
139*0b459c2cSDavid du Colombier case '1':
140*0b459c2cSDavid du Colombier case '2':
141*0b459c2cSDavid du Colombier case '3':
142*0b459c2cSDavid du Colombier case '4':
143*0b459c2cSDavid du Colombier case '5':
144*0b459c2cSDavid du Colombier case '6':
145*0b459c2cSDavid du Colombier case '7':
146*0b459c2cSDavid du Colombier case '8':
147*0b459c2cSDavid du Colombier case '9':
148*0b459c2cSDavid du Colombier if (digit_optind != 0 && digit_optind != this_option_optind)
149*0b459c2cSDavid du Colombier printf ("digits occur in two different argv-elements.\n");
150*0b459c2cSDavid du Colombier digit_optind = this_option_optind;
151*0b459c2cSDavid du Colombier printf ("option %c\n", c);
152*0b459c2cSDavid du Colombier break;
153*0b459c2cSDavid du Colombier
154*0b459c2cSDavid du Colombier case 'a':
155*0b459c2cSDavid du Colombier printf ("option a\n");
156*0b459c2cSDavid du Colombier break;
157*0b459c2cSDavid du Colombier
158*0b459c2cSDavid du Colombier case 'b':
159*0b459c2cSDavid du Colombier printf ("option b\n");
160*0b459c2cSDavid du Colombier break;
161*0b459c2cSDavid du Colombier
162*0b459c2cSDavid du Colombier case 'c':
163*0b459c2cSDavid du Colombier printf ("option c with value `%s'\n", optarg);
164*0b459c2cSDavid du Colombier break;
165*0b459c2cSDavid du Colombier
166*0b459c2cSDavid du Colombier case 'd':
167*0b459c2cSDavid du Colombier printf ("option d with value `%s'\n", optarg);
168*0b459c2cSDavid du Colombier break;
169*0b459c2cSDavid du Colombier
170*0b459c2cSDavid du Colombier case '?':
171*0b459c2cSDavid du Colombier break;
172*0b459c2cSDavid du Colombier
173*0b459c2cSDavid du Colombier default:
174*0b459c2cSDavid du Colombier printf ("?? getopt returned character code 0%o ??\n", c);
175*0b459c2cSDavid du Colombier }
176*0b459c2cSDavid du Colombier }
177*0b459c2cSDavid du Colombier
178*0b459c2cSDavid du Colombier if (optind < argc)
179*0b459c2cSDavid du Colombier {
180*0b459c2cSDavid du Colombier printf ("non-option ARGV-elements: ");
181*0b459c2cSDavid du Colombier while (optind < argc)
182*0b459c2cSDavid du Colombier printf ("%s ", argv[optind++]);
183*0b459c2cSDavid du Colombier printf ("\n");
184*0b459c2cSDavid du Colombier }
185*0b459c2cSDavid du Colombier
186*0b459c2cSDavid du Colombier exit (0);
187*0b459c2cSDavid du Colombier }
188*0b459c2cSDavid du Colombier
189*0b459c2cSDavid du Colombier #endif /* TEST */
190