X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=builtins%2Fgetopts.def;h=c077c8e0519e6f1a14ac89948610b7eb45b38c76;hb=3185942a5234e26ab13fa02f9c51d340cec514f8;hp=0e881d24f3f2573776ed4690940c5fa02ac8b261;hpb=f73dda092b33638d2d5e9c35375f687a607b5403;p=platform%2Fupstream%2Fbash.git
diff --git a/builtins/getopts.def b/builtins/getopts.def
index 0e881d2..c077c8e 100644
--- a/builtins/getopts.def
+++ b/builtins/getopts.def
@@ -1,30 +1,32 @@
This file is getopts.def, from which is created getopts.c.
It implements the builtin "getopts" in Bash.
-Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
+Copyright (C) 1987-2004 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
-Bash is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
+Bash is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
-Bash is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
+Bash is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along
-with Bash; see the file COPYING. If not, write to the Free Software
-Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+You should have received a copy of the GNU General Public License
+along with Bash. If not, see .
$PRODUCES getopts.c
$BUILTIN getopts
$FUNCTION getopts_builtin
$SHORT_DOC getopts optstring name [arg]
-Getopts is used by shell procedures to parse positional parameters.
+Parse option arguments.
+
+Getopts is used by shell procedures to parse positional parameters
+as options.
OPTSTRING contains the option letters to be recognized; if a letter
is followed by a colon, the option is expected to have an argument,
@@ -39,12 +41,12 @@ getopts places that argument into the shell variable OPTARG.
getopts reports errors in one of two ways. If the first character
of OPTSTRING is a colon, getopts uses silent error reporting. In
-this mode, no error messages are printed. If an illegal option is
+this mode, no error messages are printed. If an invalid option is
seen, getopts places the option character found into OPTARG. If a
required argument is not found, getopts places a ':' into NAME and
sets OPTARG to the option character found. If getopts is not in
-silent mode, and an illegal option is seen, getopts places '?' into
-NAME and unsets OPTARG. If a required option is not found, a '?'
+silent mode, and an invalid option is seen, getopts places '?' into
+NAME and unsets OPTARG. If a required argument is not found, a '?'
is placed in NAME, OPTARG is unset, and a diagnostic message is
printed.
@@ -54,6 +56,10 @@ OPTSTRING is not a colon. OPTERR has the value 1 by default.
Getopts normally parses the positional parameters ($0 - $9), but if
more arguments are given, they are parsed instead.
+
+Exit Status:
+Returns success if an option is found; fails if the end of options is
+encountered or an error occurs.
$END
#include
@@ -75,11 +81,14 @@ $END
#include "getopt.h"
#define G_EOF -1
-#define G_ILLEGAL_OPT -2
+#define G_INVALID_OPT -2
#define G_ARG_MISSING -3
extern char *this_command_name;
+static int getopts_bind_variable __P((char *, char *));
+static int dogetopts __P((int, char **));
+
/* getopts_reset is magic code for when OPTIND is reset. N is the
value that has just been assigned to OPTIND. */
void
@@ -98,12 +107,12 @@ getopts_bind_variable (name, value)
if (legal_identifier (name))
{
- v = bind_variable (name, value);
+ v = bind_variable (name, value, 0);
return (v && (readonly_p (v) == 0)) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
}
else
{
- builtin_error ("`%s': not a valid identifier", name);
+ sh_invalidid (name);
return (EXECUTION_FAILURE);
}
}
@@ -112,9 +121,9 @@ getopts_bind_variable (name, value)
(identical to that of ksh-88). The special handling is enabled if
the first character of the option string is a colon; this handling
disables diagnostic messages concerning missing option arguments
- and illegal option characters. The handling is as follows.
+ and invalid option characters. The handling is as follows.
- ILLEGAL OPTIONS:
+ INVALID OPTIONS:
name -> "?"
if (special_error) then
OPTARG = option character found
@@ -193,7 +202,7 @@ dogetopts (argc, argv)
;
for (words = rest_of_args; words; words = words->next, i++)
;
- v = alloc_array (i + 1);
+ v = strvec_create (i + 1);
for (i = 0; i < 10 && dollar_vars[i]; i++)
v[i] = dollar_vars[i];
for (words = rest_of_args; words; words = words->next, i++)
@@ -207,7 +216,8 @@ dogetopts (argc, argv)
if (special_error)
sh_opterr = old_opterr;
- /* Set the OPTIND variable in any case, to handle "--" skipping. */
+ /* Set the OPTIND variable in any case, to handle "--" skipping. It's
+ highly unlikely that 14 digits will be too few. */
if (sh_optind < 10)
{
numval[14] = sh_optind + '0';
@@ -224,40 +234,41 @@ dogetopts (argc, argv)
}
while (n /= 10);
}
- bind_variable ("OPTIND", numval + i);
+ bind_variable ("OPTIND", numval + i, 0);
/* If an error occurred, decide which one it is and set the return
code appropriately. In all cases, the option character in error
- is in OPTOPT. If an illegal option was encountered, OPTARG is
+ is in OPTOPT. If an invalid option was encountered, OPTARG is
NULL. If a required option argument was missing, OPTARG points
to a NULL string (that is, sh_optarg[0] == 0). */
if (ret == '?')
{
if (sh_optarg == NULL)
- ret = G_ILLEGAL_OPT;
+ ret = G_INVALID_OPT;
else if (sh_optarg[0] == '\0')
ret = G_ARG_MISSING;
}
if (ret == G_EOF)
{
+ unbind_variable ("OPTARG");
getopts_bind_variable (name, "?");
return (EXECUTION_FAILURE);
}
- if (ret == G_ILLEGAL_OPT)
+ if (ret == G_INVALID_OPT)
{
- /* Illegal option encountered. */
+ /* Invalid option encountered. */
ret = getopts_bind_variable (name, "?");
if (special_error)
{
strval[0] = (char)sh_optopt;
strval[1] = '\0';
- bind_variable ("OPTARG", strval);
+ bind_variable ("OPTARG", strval, 0);
}
else
- makunbound ("OPTARG", shell_variables);
+ unbind_variable ("OPTARG");
return (ret);
}
@@ -271,17 +282,17 @@ dogetopts (argc, argv)
strval[0] = (char)sh_optopt;
strval[1] = '\0';
- bind_variable ("OPTARG", strval);
+ bind_variable ("OPTARG", strval, 0);
}
else
{
ret = getopts_bind_variable (name, "?");
- makunbound ("OPTARG", shell_variables);
+ unbind_variable ("OPTARG");
}
return (ret);
}
- bind_variable ("OPTARG", sh_optarg);
+ bind_variable ("OPTARG", sh_optarg, 0);
strval[0] = (char) ret;
strval[1] = '\0';