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