From e8b56578db3d971b18d59a5c579ae19b70ec50a1 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 9 Jan 2007 21:59:31 +0000 Subject: users/11111: add DEBUG_BEFORE_CMD option --- ChangeLog | 4 ++++ Doc/Zsh/options.yo | 8 ++++++++ Src/exec.c | 18 +++++++++++++++++- Src/options.c | 1 + Src/zsh.h | 1 + 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 850059322..661ca260d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2007-01-09 Peter Stephenson + * 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, -- cgit 1.4.1