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