diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2004-10-29 15:39:02 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2004-10-29 15:39:02 (GMT) |
commit | f21fa0e01c0fb463b0ec26f3b0cef1218243908a (patch) | |
tree | 0fe2010a58b021f880f03fd319b7dce9e764cd63 /generic/tclIndexObj.c | |
parent | 151836cea1737631c005e07ca9a26e7641ff009d (diff) | |
download | tcl-f21fa0e01c0fb463b0ec26f3b0cef1218243908a.zip tcl-f21fa0e01c0fb463b0ec26f3b0cef1218243908a.tar.gz tcl-f21fa0e01c0fb463b0ec26f3b0cef1218243908a.tar.bz2 |
Allow ensembles to rewrite their subcommands' error messages to be more
relevant to users. [Patch 1056864]
Also patches to core to take advantage of this
Also other general cleaning up of Tcl_WrongNumArgs usage
Diffstat (limited to 'generic/tclIndexObj.c')
-rw-r--r-- | generic/tclIndexObj.c | 87 |
1 files changed, 82 insertions, 5 deletions
diff --git a/generic/tclIndexObj.c b/generic/tclIndexObj.c index 22397af..cd4dc44 100644 --- a/generic/tclIndexObj.c +++ b/generic/tclIndexObj.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIndexObj.c,v 1.20 2004/10/06 14:59:02 dgp Exp $ + * RCS: @(#) $Id: tclIndexObj.c,v 1.21 2004/10/29 15:39:05 dkf Exp $ */ #include "tclInt.h" @@ -445,12 +445,69 @@ Tcl_WrongNumArgs(interp, objc, objv, message) * message may be NULL. */ { Tcl_Obj *objPtr; - int i; + int i, len, elemLen, flags; register IndexRep *indexRep; + Interp *iPtr = (Interp *) interp; + char *elementStr; TclNewObj(objPtr); - Tcl_SetObjResult(interp, objPtr); Tcl_AppendToObj(objPtr, "wrong # args: should be \"", -1); + + /* + * Check to see if we are processing an ensemble implementation, + * and if so rewrite the results in terms of how the ensemble was + * invoked. + */ + + if (iPtr->ensembleRewrite.sourceObjs != NULL) { + /* + * We only know how to do rewriting if all the replaced + * objects are actually arguments (in objv) to this function. + * Otherwise it just gets too complicated... + */ + + if (objc >= iPtr->ensembleRewrite.numInsertedObjs) { + objv += iPtr->ensembleRewrite.numInsertedObjs; + objc -= iPtr->ensembleRewrite.numInsertedObjs; + /* + * We assume no object is of index type. + */ + for (i=0 ; i<iPtr->ensembleRewrite.numRemovedObjs ; i++) { + /* + * Add the element, quoting it if necessary. + */ + + elementStr = Tcl_GetStringFromObj( + iPtr->ensembleRewrite.sourceObjs[i], &elemLen); + len = Tcl_ScanCountedElement(elementStr, elemLen, &flags); + if (len != elemLen) { + char *quotedElementStr = ckalloc((unsigned) len); + len = Tcl_ConvertCountedElement(elementStr, elemLen, + quotedElementStr, flags); + Tcl_AppendToObj(objPtr, quotedElementStr, len); + ckfree(quotedElementStr); + } else { + Tcl_AppendToObj(objPtr, elementStr, elemLen); + } + + /* + * Add a space if the word is not the last one (which + * has a moderately complex condition here). + */ + + if ((i < (iPtr->ensembleRewrite.numRemovedObjs - 1)) + || objc || message) { + Tcl_AppendStringsToObj(objPtr, " ", (char *) NULL); + } + } + } + } + + /* + * Now add the arguments (other than those rewritten) that the + * caller took from its calling context. + */ + for (i = 0; i < objc; i++) { /* * If the object is an index type use the index table which allows @@ -462,8 +519,21 @@ Tcl_WrongNumArgs(interp, objc, objv, message) indexRep = (IndexRep *) objv[i]->internalRep.otherValuePtr; Tcl_AppendStringsToObj(objPtr, EXPAND_OF(indexRep), (char *) NULL); } else { - Tcl_AppendStringsToObj(objPtr, Tcl_GetString(objv[i]), - (char *) NULL); + /* + * Quote the argument if it contains spaces (Bug 942757). + */ + + elementStr = Tcl_GetStringFromObj(objv[i], &elemLen); + len = Tcl_ScanCountedElement(elementStr, elemLen, &flags); + if (len != elemLen) { + char *quotedElementStr = ckalloc((unsigned) len); + len = Tcl_ConvertCountedElement(elementStr, elemLen, + quotedElementStr, flags); + Tcl_AppendToObj(objPtr, quotedElementStr, len); + ckfree(quotedElementStr); + } else { + Tcl_AppendToObj(objPtr, elementStr, elemLen); + } } /* @@ -475,8 +545,15 @@ Tcl_WrongNumArgs(interp, objc, objv, message) } } + /* + * Add any trailing message bits and set the resulting string as + * the interpreter result. Caller is responsible for reporting + * this as an actual error. + */ + if (message) { Tcl_AppendStringsToObj(objPtr, message, (char *) NULL); } Tcl_AppendStringsToObj(objPtr, "\"", (char *) NULL); + Tcl_SetObjResult(interp, objPtr); } |