summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Doc/Zsh/options.yo8
-rw-r--r--Src/exec.c18
-rw-r--r--Src/options.c1
-rw-r--r--Src/zsh.h1
5 files changed, 31 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 850059322..661ca260d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2007-01-09  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* users/11111: Doc/Zsh/options.yo, Src/exec.c, Src/options.c,
+	Src/zsh.h: add DEBUG_BEFORE_CMD option to run DEBUG traps
+	before the command instead of after.
+
 	* 23098: Src/builtin.c, Test/D07multibyte.ztst: print widths
 	in printf take account of multibyte characters.
 
diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo
index 3790beaed..e1f3fc509 100644
--- a/Doc/Zsh/options.yo
+++ b/Doc/Zsh/options.yo
@@ -1009,6 +1009,14 @@ on the choice of the output base, nor on the output of bases other than
 hexadecimal and octal.  Note that these formats will be understood on input
 irrespective of the setting of tt(C_BASES).
 )
+pindex(DEBUG_BEFORE_CMD)
+cindex(traps, DEBUG, before or after command)
+cindex(DEBUG trap, before or after command)
+item(tt(DEBUG_BEFORE_CMD))(
+Run the tt(DEBUG) trap before each command; otherwise it is run after
+each command.  Setting this option mimics the behaviour of ksh 93; with
+the option unset the behaviour is that of ksh 88.
+)
 pindex(ERR_EXIT)
 cindex(exit status, trapping)
 item(tt(ERR_EXIT) (tt(-e), ksh: tt(-e)))(
diff --git a/Src/exec.c b/Src/exec.c
index d65c0a91e..487838a25 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -865,6 +865,22 @@ execlist(Estate state, int dont_change_job, int exiting)
      * semi-colon or ampersand (`sublists').               */
     code = *state->pc++;
     while (wc_code(code) == WC_LIST && !breaks && !retflag) {
+	int donedebug;
+	if (sigtrapped[SIGDEBUG] && isset(DEBUGBEFORECMD)) {
+	    exiting = donetrap;
+	    ret = lastval;
+	    dotrap(SIGDEBUG);
+	    lastval = ret;
+	    donetrap = exiting;
+	    noerrexit = oldnoerrexit;
+	    /*
+	     * Only execute the trap once per sublist, even
+	     * if the DEBUGBEFORECMD option changes.
+	     */
+	    donedebug = 1;
+	} else
+	    donedebug = 0;
+
 	ltype = WC_LIST_TYPE(code);
 	csp = cmdsp;
 
@@ -969,7 +985,7 @@ sublist_done:
 
 	noerrexit = oldnoerrexit;
 
-	if (sigtrapped[SIGDEBUG]) {
+	if (sigtrapped[SIGDEBUG] && !isset(DEBUGBEFORECMD) && !donedebug) {
 	    exiting = donetrap;
 	    ret = lastval;
 	    dotrap(SIGDEBUG);
diff --git a/Src/options.c b/Src/options.c
index 821773d2f..d5e5ee552 100644
--- a/Src/options.c
+++ b/Src/options.c
@@ -108,6 +108,7 @@ static struct optname optns[] = {
 {{NULL, "cshjunkiequotes",    OPT_EMULATE|OPT_CSH},	 CSHJUNKIEQUOTES},
 {{NULL, "cshnullcmd",	      OPT_EMULATE|OPT_CSH},	 CSHNULLCMD},
 {{NULL, "cshnullglob",	      OPT_EMULATE|OPT_CSH},	 CSHNULLGLOB},
+{{NULL, "debugbeforecmd",     OPT_EMULATE},		 DEBUGBEFORECMD},
 {{NULL, "emacs",	      0},			 EMACSMODE},
 {{NULL, "equals",	      OPT_EMULATE|OPT_ZSH},	 EQUALS},
 {{NULL, "errexit",	      OPT_EMULATE},		 ERREXIT},
diff --git a/Src/zsh.h b/Src/zsh.h
index 2f627a37f..6f70fd0df 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1602,6 +1602,7 @@ enum {
     CSHJUNKIEQUOTES,
     CSHNULLCMD,
     CSHNULLGLOB,
+    DEBUGBEFORECMD,
     EMACSMODE,
     EQUALS,
     ERREXIT,