summaryrefslogtreecommitdiffstats
path: root/generic/tclParse.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2000-11-01 22:13:39 (GMT)
committerhobbs <hobbs>2000-11-01 22:13:39 (GMT)
commit6c75b366647b489cbfab9c56648ec03e116c4252 (patch)
treeda60ed6a2d899771d24a0194e4d4025378f9b814 /generic/tclParse.c
parent51d45cde58ea58db5d1b872e26b3a031971ea348 (diff)
downloadtcl-6c75b366647b489cbfab9c56648ec03e116c4252.zip
tcl-6c75b366647b489cbfab9c56648ec03e116c4252.tar.gz
tcl-6c75b366647b489cbfab9c56648ec03e116c4252.tar.bz2
* tests/subst.test: added tests for non-zero return code handling
by subst. * generic/tclParse.c (Tcl_EvalEx): corrected handling of non-zero, non-error return code cases for subst. [BUG: 119829]
Diffstat (limited to 'generic/tclParse.c')
-rw-r--r--generic/tclParse.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/generic/tclParse.c b/generic/tclParse.c
index ab50ac4..96678ef 100644
--- a/generic/tclParse.c
+++ b/generic/tclParse.c
@@ -9,12 +9,12 @@
* allow scripts to be evaluated directly, without compiling.
*
* Copyright (c) 1997 Sun Microsystems, Inc.
- * Copyright (c) 1998 by Scriptics Corporation.
+ * Copyright (c) 1998-2000 Ajuba Solutions.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclParse.c,v 1.13 1999/11/10 02:51:57 hobbs Exp $
+ * RCS: @(#) $Id: tclParse.c,v 1.14 2000/11/01 22:13:39 hobbs Exp $
*/
#include "tclInt.h"
@@ -1456,15 +1456,51 @@ Tcl_EvalEx(interp, script, numBytes, flags)
Tcl_DecrRefCount(objv[i]);
}
if (gotParse) {
- p = parse.commandStart + parse.commandSize;
+ next = parse.commandStart + parse.commandSize;
+ bytesLeft -= next - p;
+ p = next;
Tcl_FreeParse(&parse);
- if ((nested != 0) && (p > script) && (p[-1] == ']')) {
+
+ if ((nested != 0) && (p > script)) {
+ char *nextCmd = NULL; /* pointer to start of next command */
+
/*
* We get here in the special case where the TCL_BRACKET_TERM
- * flag was set in the interpreter and we reached a close
- * bracket in the script. Return immediately.
+ * flag was set in the interpreter.
+ *
+ * At this point, we want to find the end of the script
+ * (either end of script or the closing ']').
*/
+ while ((p[-1] != ']') && bytesLeft) {
+ if (Tcl_ParseCommand(NULL, p, bytesLeft, nested, &parse)
+ != TCL_OK) {
+ /*
+ * We were looking for the ']' to close the script.
+ * But if we find a syntax error, it is ok to quit
+ * early since in that case we no longer need to know
+ * where the ']' is (if there was one). We reset the
+ * pointer to the start of the command that after the
+ * one causing the return. -- hobbs
+ */
+
+ p = (nextCmd == NULL) ? parse.commandStart : nextCmd;
+ break;
+ }
+
+ if (nextCmd == NULL) {
+ nextCmd = parse.commandStart;
+ }
+
+ /*
+ * Advance to the next command in the script.
+ */
+
+ next = parse.commandStart + parse.commandSize;
+ bytesLeft -= next - p;
+ p = next;
+ Tcl_FreeParse(&parse);
+ }
iPtr->termOffset = (p - 1) - script;
} else {
iPtr->termOffset = p - script;