about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-05-28 18:32:39 +0100
committerPeter Stephenson <pws@zsh.org>2015-05-28 18:32:39 +0100
commit2b08d0ed6747a4acf44b73068bfafc54ca1d0acf (patch)
tree6b2ef1ca29d0633ee231e6181a1b0d5e16356691
parentcb596a55d921cb638a3cf0ede3ee60ae13728c10 (diff)
downloadzsh-2b08d0ed6747a4acf44b73068bfafc54ca1d0acf.tar.gz
zsh-2b08d0ed6747a4acf44b73068bfafc54ca1d0acf.tar.xz
zsh-2b08d0ed6747a4acf44b73068bfafc54ca1d0acf.zip
35318: POSIX_BUILTINS behaviour for getopts.
It needs to keep OPTIND, as well as the index within the
string pointed to by OPTIND, global in this case.
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/builtins.yo3
-rw-r--r--Doc/Zsh/options.yo4
-rw-r--r--Src/builtin.c4
-rw-r--r--Src/exec.c12
5 files changed, 24 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 625fd0160..cc1c86b71 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-28  Peter Stephenson  <p.stephenson@samsung.com>
+
+	* 35318: Doc/Zsh/builtins.yo, Doc/Zsh/options.yo, Src/builtin.c,
+	Src/exec.c: POSIX_BUILTINS compatibility for OPTIND processing
+	in getopts.
+
 2015-05-27  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
 	* 35306: Src/parse.c, Test/C02cond.ztst: "test -z \("
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index a2c03bcc4..f8e4edf91 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -866,7 +866,8 @@ vindex(OPTARG, use of)
 
 The first option to be examined may be changed by explicitly assigning
 to tt(OPTIND).  tt(OPTIND) has an initial value of tt(1), and is
-normally reset to tt(1) upon exit from a shell function.  tt(OPTARG)
+normally set to tt(1) upon entry to a shell function and restored
+upon exit (this is disabled by the tt(POSIX_BUILTINS) option).  tt(OPTARG)
 is not reset and retains its value from the most recent call to
 tt(getopts).  If either of tt(OPTIND) or tt(OPTARG) is explicitly
 unset, it remains unset, and the index or option argument is not
diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo
index 032423def..4c0ae122f 100644
--- a/Doc/Zsh/options.yo
+++ b/Doc/Zsh/options.yo
@@ -2038,6 +2038,10 @@ tt(unset).
 In addition, various error conditions associated with the above builtins
 or tt(exec) cause a non-interactive shell to exit and an interactive
 shell to return to its top-level processing.
+
+Furthermore, the tt(getopts) builtin behaves in a POSIX-compatible
+fashion in that the associated variable tt(OPTIND) is not made
+local to functions.
 )
 pindex(POSIX_IDENTIFIERS)
 pindex(NO_POSIX_IDENTIFIERS)
diff --git a/Src/builtin.c b/Src/builtin.c
index a9afb4540..18c22f29e 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -4713,6 +4713,10 @@ bin_shift(char *name, char **argv, Options ops, UNUSED(int func))
     return ret;
 }
 
+/*
+ * Position of getopts option within OPTIND argument with multiple options.
+ */
+
 /**/
 int optcind;
 
diff --git a/Src/exec.c b/Src/exec.c
index 527d61197..9f163a627 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -4910,9 +4910,11 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
     if (!(flags & PM_UNDEFINED))
 	scriptname = dupstring(name);
     oldzoptind = zoptind;
-    zoptind = 1;
     oldoptcind = optcind;
-    optcind = 0;
+    if (!isset(POSIXBUILTINS)) {
+	zoptind = 1;
+	optcind = 0;
+    }
 
     /* We need to save the current options even if LOCALOPTIONS is *
      * not currently set.  That's because if it gets set in the    *
@@ -5049,8 +5051,10 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
 	argzero = oargv0;
     }
     pparams = pptab;
-    optcind = oldoptcind;
-    zoptind = oldzoptind;
+    if (!isset(POSIXBUILTINS)) {
+	zoptind = oldzoptind;
+	optcind = oldoptcind;
+    }
     scriptname = oldscriptname;
     oflags = ooflags;