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