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