1
This file is getopts.def, from which is created getopts.c.
2
It implements the builtin "getopts" in Bash.
4
Copyright (C) 1987-2004 Free Software Foundation, Inc.
6
This file is part of GNU Bash, the Bourne Again SHell.
8
Bash is free software: you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation, either version 3 of the License, or
11
(at your option) any later version.
13
Bash is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License
19
along with Bash. If not, see <http://www.gnu.org/licenses/>.
24
$FUNCTION getopts_builtin
25
$SHORT_DOC getopts optstring name [arg]
26
Parse option arguments.
28
Getopts is used by shell procedures to parse positional parameters
31
OPTSTRING contains the option letters to be recognized; if a letter
32
is followed by a colon, the option is expected to have an argument,
33
which should be separated from it by white space.
35
Each time it is invoked, getopts will place the next option in the
36
shell variable $name, initializing name if it does not exist, and
37
the index of the next argument to be processed into the shell
38
variable OPTIND. OPTIND is initialized to 1 each time the shell or
39
a shell script is invoked. When an option requires an argument,
40
getopts places that argument into the shell variable OPTARG.
42
getopts reports errors in one of two ways. If the first character
43
of OPTSTRING is a colon, getopts uses silent error reporting. In
44
this mode, no error messages are printed. If an invalid option is
45
seen, getopts places the option character found into OPTARG. If a
46
required argument is not found, getopts places a ':' into NAME and
47
sets OPTARG to the option character found. If getopts is not in
48
silent mode, and an invalid option is seen, getopts places '?' into
49
NAME and unsets OPTARG. If a required argument is not found, a '?'
50
is placed in NAME, OPTARG is unset, and a diagnostic message is
53
If the shell variable OPTERR has the value 0, getopts disables the
54
printing of error messages, even if the first character of
55
OPTSTRING is not a colon. OPTERR has the value 1 by default.
57
Getopts normally parses the positional parameters ($0 - $9), but if
58
more arguments are given, they are parsed instead.
61
Returns success if an option is found; fails if the end of options is
62
encountered or an error occurs.
69
#if defined (HAVE_UNISTD_H)
71
# include <sys/types.h>
76
#include "../bashansi.h"
80
#include "bashgetopt.h"
84
#define G_INVALID_OPT -2
85
#define G_ARG_MISSING -3
87
extern char *this_command_name;
89
static int getopts_bind_variable __P((char *, char *));
90
static int dogetopts __P((int, char **));
92
/* getopts_reset is magic code for when OPTIND is reset. N is the
93
value that has just been assigned to OPTIND. */
95
getopts_reset (newind)
103
getopts_bind_variable (name, value)
108
if (legal_identifier (name))
110
v = bind_variable (name, value, 0);
111
if (v && (readonly_p (v) || noassign_p (v)))
112
return (EX_MISCERROR);
113
return (v ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
118
return (EXECUTION_FAILURE);
122
/* Error handling is now performed as specified by Posix.2, draft 11
123
(identical to that of ksh-88). The special handling is enabled if
124
the first character of the option string is a colon; this handling
125
disables diagnostic messages concerning missing option arguments
126
and invalid option characters. The handling is as follows.
130
if (special_error) then
131
OPTARG = option character found
138
MISSING OPTION ARGUMENT;
139
if (special_error) then
141
OPTARG = option character found
150
dogetopts (argc, argv)
154
int ret, special_error, old_opterr, i, n;
155
char strval[2], numval[16];
156
char *optstr; /* list of options */
157
char *name; /* variable to get flag val */
166
/* argv[0] is "getopts". */
173
special_error = optstr[0] == ':';
177
old_opterr = sh_opterr;
179
sh_opterr = 0; /* suppress diagnostic messages */
184
sh_getopt_restore_state (argv);
186
argv[0] = dollar_vars[0];
187
ret = sh_getopt (argc, argv, optstr);
190
else if (rest_of_args == (WORD_LIST *)NULL)
192
for (i = 0; i < 10 && dollar_vars[i]; i++)
195
sh_getopt_restore_state (dollar_vars);
196
ret = sh_getopt (i, dollar_vars, optstr);
200
register WORD_LIST *words;
203
for (i = 0; i < 10 && dollar_vars[i]; i++)
205
for (words = rest_of_args; words; words = words->next, i++)
207
v = strvec_create (i + 1);
208
for (i = 0; i < 10 && dollar_vars[i]; i++)
209
v[i] = dollar_vars[i];
210
for (words = rest_of_args; words; words = words->next, i++)
211
v[i] = words->word->word;
213
sh_getopt_restore_state (v);
214
ret = sh_getopt (i, v, optstr);
219
sh_opterr = old_opterr;
221
/* Set the OPTIND variable in any case, to handle "--" skipping. It's
222
highly unlikely that 14 digits will be too few. */
225
numval[14] = sh_optind + '0';
231
numval[i = 15] = '\0';
235
numval[--i] = (n % 10) + '0';
239
bind_variable ("OPTIND", numval + i, 0);
241
/* If an error occurred, decide which one it is and set the return
242
code appropriately. In all cases, the option character in error
243
is in OPTOPT. If an invalid option was encountered, OPTARG is
244
NULL. If a required option argument was missing, OPTARG points
245
to a NULL string (that is, sh_optarg[0] == 0). */
248
if (sh_optarg == NULL)
250
else if (sh_optarg[0] == '\0')
256
unbind_variable ("OPTARG");
257
getopts_bind_variable (name, "?");
258
return (EXECUTION_FAILURE);
261
if (ret == G_INVALID_OPT)
263
/* Invalid option encountered. */
264
ret = getopts_bind_variable (name, "?");
268
strval[0] = (char)sh_optopt;
270
bind_variable ("OPTARG", strval, 0);
273
unbind_variable ("OPTARG");
278
if (ret == G_ARG_MISSING)
280
/* Required argument missing. */
283
ret = getopts_bind_variable (name, ":");
285
strval[0] = (char)sh_optopt;
287
bind_variable ("OPTARG", strval, 0);
291
ret = getopts_bind_variable (name, "?");
292
unbind_variable ("OPTARG");
297
bind_variable ("OPTARG", sh_optarg, 0);
299
strval[0] = (char) ret;
301
return (getopts_bind_variable (name, strval));
304
/* The getopts builtin. Build an argv, and call dogetopts with it. */
306
getopts_builtin (list)
318
reset_internal_getopt ();
319
if (internal_getopt (list, "") != -1)
326
av = make_builtin_argv (list, &ac);
327
ret = dogetopts (ac, av);