summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authormdejong <mdejong>2005-06-20 07:48:52 (GMT)
committermdejong <mdejong>2005-06-20 07:48:52 (GMT)
commit1ffccc907f8947bb84f4ccd20460b5122be83c9a (patch)
treeee1c355ba23b428babc4af24558cc67d779747dc /generic
parent6c01aeca56323105bfa7810baba82c7da8ee928d (diff)
downloadtcl-1ffccc907f8947bb84f4ccd20460b5122be83c9a.zip
tcl-1ffccc907f8947bb84f4ccd20460b5122be83c9a.tar.gz
tcl-1ffccc907f8947bb84f4ccd20460b5122be83c9a.tar.bz2
* generic/tclCmdMZ.c (Tcl_SwitchObjCmd): Generate
an error if a mode argument like -exact is passed more than once to the switch command. The previous implementation silently accepted invalid switch invocations like [switch -exact -glob $str ...]. * tests/for.test: Check some error cases when invoking continue and break inside a for loop next script. * tests/switch.test: Add checks for shortened version of a mode argument like -exact. Add test for more than one mode argument. Add test for odd case of passing a variable as a body script.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCmdMZ.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 3c796a8..7d0f80f 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -15,7 +15,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclCmdMZ.c,v 1.125 2005/06/07 09:07:14 dkf Exp $
+ * RCS: @(#) $Id: tclCmdMZ.c,v 1.126 2005/06/20 07:49:11 mdejong Exp $
*/
#include "tclInt.h"
@@ -2520,7 +2520,7 @@ Tcl_SwitchObjCmd(dummy, interp, objc, objv)
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
- int i, j, index, mode, result, splitObjs, numMatchesSaved, noCase;
+ int i, j, index, mode, foundmode, result, splitObjs, numMatchesSaved, noCase;
char *pattern;
Tcl_Obj *stringObj, *indexVarObj, *matchVarObj;
Tcl_Obj *CONST *savedObjv = objv;
@@ -2542,6 +2542,7 @@ Tcl_SwitchObjCmd(dummy, interp, objc, objv)
strCmpFn_t strCmpFn = strcmp;
mode = OPT_EXACT;
+ foundmode = 0;
indexVarObj = NULL;
matchVarObj = NULL;
numMatchesSaved = 0;
@@ -2588,6 +2589,18 @@ Tcl_SwitchObjCmd(dummy, interp, objc, objv)
strCmpFn = strcasecmp;
noCase = 1;
} else {
+ if ( foundmode ) {
+ /* Mode already set via -exact, -glob, or -regexp */
+ Tcl_AppendResult(interp,
+ "bad option \"",
+ TclGetString(objv[i]),
+ "\": ",
+ options[mode],
+ " option already found",
+ (char *) NULL);
+ return TCL_ERROR;
+ }
+ foundmode = 1;
mode = index;
}
}