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