about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Doc/Zsh/invoke.yo7
-rw-r--r--Src/init.c20
3 files changed, 23 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 7649ef8f8..7e966ca2a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2000-07-30  Andrew Main <zefram@zsh.org>
 
+	* 12436: Doc/Zsh/invoke.yo, Src/init.c: Make -b behave like
+	the csh -b, permitting more options to be stacked after it and
+	take effect.  Make -b take effect depending on SH_OPTION_LETTERS,
+	consistent with all the other single-letter options, rather than
+	having a clashing check of emulation type.
+
+2000-07-30  Andrew Main <zefram@zsh.org>
+
 	* 12434: Doc/Zsh/invoke.yo, Src/init.c, Src/options.c, Src/zsh.h,
 	Src/zsh.mdd: Allow options to be specified on the zsh command line
 	in the form of GNU-style long options.	Also handle --version
diff --git a/Doc/Zsh/invoke.yo b/Doc/Zsh/invoke.yo
index de0ed6b6b..2d6767975 100644
--- a/Doc/Zsh/invoke.yo
+++ b/Doc/Zsh/invoke.yo
@@ -72,8 +72,11 @@ with preceding options (so `tt(-x-)' is equivalent to `tt(-x --)').  Options
 are not permitted to be stacked after `tt(--)' (so `tt(-x-f)' is an error),
 but note the GNU-style option form discussed above, where `tt(--shwordsplit)'
 is permitted and does not end option processing.
-Except when emulating sh or ksh, the option `tt(-b)' is treated the same way
-as `tt(--)' for the purpose of ending option processing.
+
+Except when the bf(sh)/bf(ksh) emulation single-letter options are in effect,
+the option `tt(-b)' (or `tt(PLUS()b)') ends option processing.
+`tt(-b)' is like `tt(--)', except that further single-letter options can be
+stacked after the `tt(-b)' and will take effect as normal.
 
 startmenu()
 menu(Compatibility)
diff --git a/Src/init.c b/Src/init.c
index 04ed141dd..d0140a525 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -186,10 +186,10 @@ static int restricted;
 void
 parseargs(char **argv)
 {
+    int optionbreak = 0;
     char **x;
     int action, optno;
     LinkList paramlist;
-    int bourne = (emulation == EMULATE_KSH || emulation == EMULATE_SH);
 
     argzero = *argv++;
     SHIN = 0;
@@ -206,17 +206,15 @@ parseargs(char **argv)
     opts[SINGLECOMMAND] = 0;
 
     /* loop through command line options (begins with "-" or "+") */
-    while (*argv && (**argv == '-' || **argv == '+')) {
+    while (!optionbreak && *argv && (**argv == '-' || **argv == '+')) {
 	char *args = *argv;
 	action = (**argv == '-');
 	if (!argv[0][1])
 	    *argv = "--";
 	while (*++*argv) {
-	    /* The pseudo-option `--' signifies the end of options. *
-	     * `-b' does too, csh-style, unless we're emulating a   *
-	     * Bourne style shell.                                  */
-	    if (**argv == '-' || (!bourne && **argv == 'b')) {
+	    if (**argv == '-') {
 		if(!argv[0][1]) {
+		    /* The pseudo-option `--' signifies the end of options. */
 		    argv++;
 		    goto doneoptions;
 		}
@@ -240,7 +238,11 @@ parseargs(char **argv)
 		goto longoptions;
 	    }
 
-	    if (**argv == 'c') {         /* -c command */
+	    if (unset(SHOPTIONLETTERS) && **argv == 'b') {
+		/* -b ends options at the end of this argument */
+		optionbreak = 1;
+	    } else if (**argv == 'c') {
+		/* -c command */
 		cmd = *argv;
 		opts[INTERACTIVE] &= 1;
 		opts[SHINSTDIN] = 0;
@@ -321,13 +323,11 @@ parseargs(char **argv)
 static void
 printhelp(void)
 {
-    int bourne = (emulation == EMULATE_KSH || emulation == EMULATE_SH);
-
     printf("Usage: %s [<options>] [<argument> ...]\n", argzero);
     printf("\nSpecial options:\n");
     printf("  --help     show this message, then exit\n");
     printf("  --version  show zsh version number, then exit\n");
-    if(!bourne)
+    if(unset(SHOPTIONLETTERS))
 	printf("  -b         end option processing, like --\n");
     printf("  -c         take first argument as a command to execute\n");
     printf("  -o OPTION  set an option by name (see below)\n");