xref: /dflybsd-src/contrib/cvs-1.12/lib/getopt1.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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