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