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