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