1 This file is getopts.def, from which is created getopts.c.
2 It implements the builtin "getopts" in Bash.
4 Copyright (C) 1987, 1989, 1991 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 it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 1, or (at your option) any later
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING. If not, write to the Free Software
20 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25 $FUNCTION getopts_builtin
26 $SHORT_DOC getopts optstring name [arg]
27 Getopts is used by shell procedures to parse positional parameters.
29 OPTSTRING contains the option letters to be recognized; if a letter
30 is followed by a colon, the option is expected to have an argument,
31 which should be separated from it by white space.
33 Each time it is invoked, getopts will place the next option in the
34 shell variable $name, initializing name if it does not exist, and
35 the index of the next argument to be processed into the shell
36 variable OPTIND. OPTIND is initialized to 1 each time the shell or
37 a shell script is invoked. When an option requires an argument,
38 getopts places that argument into the shell variable OPTARG.
40 getopts reports errors in one of two ways. If the first character
41 of OPTSTRING is a colon, getopts uses silent error reporting. In
42 this mode, no error messages are printed. If an illegal option is
43 seen, getopts places the option character found into OPTARG. If a
44 required argument is not found, getopts places a ':' into NAME and
45 sets OPTARG to the option character found. If getopts is not in
46 silent mode, and an illegal option is seen, getopts places '?' into
47 NAME and unsets OPTARG. If a required option is not found, a '?'
48 is placed in NAME, OPTARG is unset, and a diagnostic message is
51 If the shell variable OPTERR has the value 0, getopts disables the
52 printing of error messages, even if the first character of
53 OPTSTRING is not a colon. OPTERR has the value 1 by default.
55 Getopts normally parses the positional parameters ($0 - $9), but if
56 more arguments are given, they are parsed instead.
63 #if defined (HAVE_UNISTD_H)
67 #include "../bashansi.h"
71 #include "bashgetopt.h"
75 #define G_ILLEGAL_OPT -2
76 #define G_ARG_MISSING -3
78 extern char *this_command_name;
79 extern WORD_LIST *rest_of_args;
81 /* getopts_reset is magic code for when OPTIND is reset. N is the
82 value that has just been assigned to OPTIND. */
84 getopts_reset (newind)
92 getopts_bind_variable (name, value)
97 if (legal_identifier (name))
99 v = bind_variable (name, value);
100 return (v && (readonly_p (v) == 0)) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
104 builtin_error ("`%s': not a valid identifier", name);
105 return (EXECUTION_FAILURE);
109 /* Error handling is now performed as specified by Posix.2, draft 11
110 (identical to that of ksh-88). The special handling is enabled if
111 the first character of the option string is a colon; this handling
112 disables diagnostic messages concerning missing option arguments
113 and illegal option characters. The handling is as follows.
117 if (special_error) then
118 OPTARG = option character found
125 MISSING OPTION ARGUMENT;
126 if (special_error) then
128 OPTARG = option character found
137 dogetopts (argc, argv)
141 int ret, special_error, old_opterr, i, n;
142 char strval[2], numval[16];
143 char *optstr; /* list of options */
144 char *name; /* variable to get flag val */
153 /* argv[0] is "getopts". */
160 special_error = optstr[0] == ':';
164 old_opterr = sh_opterr;
166 sh_opterr = 0; /* suppress diagnostic messages */
171 sh_getopt_restore_state (argv);
173 argv[0] = dollar_vars[0];
174 ret = sh_getopt (argc, argv, optstr);
177 else if (rest_of_args == (WORD_LIST *)NULL)
179 for (i = 0; i < 10 && dollar_vars[i]; i++)
181 ret = sh_getopt (i, dollar_vars, optstr);
185 register WORD_LIST *words;
188 for (i = 0; i < 10 && dollar_vars[i]; i++)
190 for (words = rest_of_args; words; words = words->next, i++)
192 v = (char **)xmalloc ((i + 1) * sizeof (char *));
193 for (i = 0; i < 10 && dollar_vars[i]; i++)
194 v[i] = dollar_vars[i];
195 for (words = rest_of_args; words; words = words->next, i++)
196 v[i] = words->word->word;
198 ret = sh_getopt (i, v, optstr);
203 sh_opterr = old_opterr;
205 /* Set the OPTIND variable in any case, to handle "--" skipping. */
208 numval[14] = sh_optind + '0';
214 numval[i = 15] = '\0';
218 numval[--i] = (n % 10) + '0';
222 bind_variable ("OPTIND", numval + i);
224 /* If an error occurred, decide which one it is and set the return
225 code appropriately. In all cases, the option character in error
226 is in OPTOPT. If an illegal option was encountered, OPTARG is
227 NULL. If a required option argument was missing, OPTARG points
228 to a NULL string (that is, sh_optarg[0] == 0). */
231 if (sh_optarg == NULL)
233 else if (sh_optarg[0] == '\0')
239 getopts_bind_variable (name, "?");
240 return (EXECUTION_FAILURE);
243 if (ret == G_ILLEGAL_OPT)
245 /* Illegal option encountered. */
246 ret = getopts_bind_variable (name, "?");
250 strval[0] = (char)sh_optopt;
252 bind_variable ("OPTARG", strval);
255 makunbound ("OPTARG", shell_variables);
260 if (ret == G_ARG_MISSING)
262 /* Required argument missing. */
265 ret = getopts_bind_variable (name, ":");
267 strval[0] = (char)sh_optopt;
269 bind_variable ("OPTARG", strval);
273 ret = getopts_bind_variable (name, "?");
274 makunbound ("OPTARG", shell_variables);
279 bind_variable ("OPTARG", sh_optarg);
281 strval[0] = (char) ret;
283 return (getopts_bind_variable (name, strval));
286 /* The getopts builtin. Build an argv, and call dogetopts with it. */
288 getopts_builtin (list)
295 return EXECUTION_FAILURE;
297 reset_internal_getopt ();
298 while ((ret = internal_getopt (list, "")) != -1)
309 av = make_builtin_argv (list, &ac);
310 ret = dogetopts (ac, av);