xref: /aosp_15_r20/external/libusb/msvc/getopt/getopt1.c (revision 86b64dcb59b3a0b37502ecd56e119234366a6f7e)
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