diff options
Diffstat (limited to 'generic/tclIndexObj.c')
| -rw-r--r-- | generic/tclIndexObj.c | 535 |
1 files changed, 184 insertions, 351 deletions
diff --git a/generic/tclIndexObj.c b/generic/tclIndexObj.c index 944fb8e..cc50fd3 100644 --- a/generic/tclIndexObj.c +++ b/generic/tclIndexObj.c @@ -1,33 +1,36 @@ -/* +/* * tclIndexObj.c -- * - * This file implements objects of type "index". This object type is used - * to lookup a keyword in a table of valid values and cache the index of - * the matching entry. + * This file implements objects of type "index". This object type + * is used to lookup a keyword in a table of valid values and cache + * the index of the matching entry. * * Copyright (c) 1997 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" +#include "tclPort.h" /* - * Prototypes for functions defined later in this file: + * Prototypes for procedures defined later in this file: */ -static int SetIndexFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr); -static void UpdateStringOfIndex(Tcl_Obj *objPtr); -static void DupIndex(Tcl_Obj *srcPtr, Tcl_Obj *dupPtr); -static void FreeIndex(Tcl_Obj *objPtr); +static int SetIndexFromAny _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr)); +static void UpdateStringOfIndex _ANSI_ARGS_((Tcl_Obj *objPtr)); +static void DupIndex _ANSI_ARGS_((Tcl_Obj *srcPtr, + Tcl_Obj *dupPtr)); +static void FreeIndex _ANSI_ARGS_((Tcl_Obj *objPtr)); /* - * The structure below defines the index Tcl object type by means of functions - * that can be invoked by generic object code. + * The structure below defines the index Tcl object type by means of + * procedures that can be invoked by generic object code. */ -static Tcl_ObjType indexType = { +Tcl_ObjType tclIndexType = { "index", /* name */ FreeIndex, /* freeIntRepProc */ DupIndex, /* dupIntRepProc */ @@ -36,15 +39,15 @@ static Tcl_ObjType indexType = { }; /* - * The definition of the internal representation of the "index" object; The - * internalRep.otherValuePtr field of an object of "index" type will be a - * pointer to one of these structures. + * The definition of the internal representation of the "index" + * object; The internalRep.otherValuePtr field of an object of "index" + * type will be a pointer to one of these structures. * * Keep this structure declaration in sync with tclTestObj.c */ typedef struct { - void *tablePtr; /* Pointer to the table of strings */ + VOID *tablePtr; /* Pointer to the table of strings */ int offset; /* Offset between table entries */ int index; /* Selected index into table. */ } IndexRep; @@ -52,68 +55,68 @@ typedef struct { /* * The following macros greatly simplify moving through a table... */ - #define STRING_AT(table, offset, index) \ - (*((const char *const *)(((char *)(table)) + ((offset) * (index))))) + (*((CONST char * CONST *)(((char *)(table)) + ((offset) * (index))))) #define NEXT_ENTRY(table, offset) \ (&(STRING_AT(table, offset, 1))) #define EXPAND_OF(indexRep) \ STRING_AT((indexRep)->tablePtr, (indexRep)->offset, (indexRep)->index) + /* *---------------------------------------------------------------------- * * Tcl_GetIndexFromObj -- * - * This function looks up an object's value in a table of strings and - * returns the index of the matching string, if any. + * This procedure looks up an object's value in a table of strings + * and returns the index of the matching string, if any. * * Results: - * If the value of objPtr is identical to or a unique abbreviation for - * one of the entries in objPtr, then the return value is TCL_OK and the - * index of the matching entry is stored at *indexPtr. If there isn't a - * proper match, then TCL_ERROR is returned and an error message is left - * in interp's result (unless interp is NULL). The msg argument is used - * in the error message; for example, if msg has the value "option" then - * the error message will say something flag 'bad option "foo": must be + * + * If the value of objPtr is identical to or a unique abbreviation + * for one of the entries in objPtr, then the return value is + * TCL_OK and the index of the matching entry is stored at + * *indexPtr. If there isn't a proper match, then TCL_ERROR is + * returned and an error message is left in interp's result (unless + * interp is NULL). The msg argument is used in the error + * message; for example, if msg has the value "option" then the + * error message will say something flag 'bad option "foo": must be * ...' * * Side effects: - * The result of the lookup is cached as the internal rep of objPtr, so - * that repeated lookups can be done quickly. + * The result of the lookup is cached as the internal rep of + * objPtr, so that repeated lookups can be done quickly. * *---------------------------------------------------------------------- */ int -Tcl_GetIndexFromObj( - Tcl_Interp *interp, /* Used for error reporting if not NULL. */ - Tcl_Obj *objPtr, /* Object containing the string to lookup. */ - const char **tablePtr, /* Array of strings to compare against the +Tcl_GetIndexFromObj(interp, objPtr, tablePtr, msg, flags, indexPtr) + Tcl_Interp *interp; /* Used for error reporting if not NULL. */ + Tcl_Obj *objPtr; /* Object containing the string to lookup. */ + CONST char **tablePtr; /* Array of strings to compare against the * value of objPtr; last entry must be NULL * and there must not be duplicate entries. */ - const char *msg, /* Identifying word to use in error - * messages. */ - int flags, /* 0 or TCL_EXACT */ - int *indexPtr) /* Place to store resulting integer index. */ + CONST char *msg; /* Identifying word to use in error messages. */ + int flags; /* 0 or TCL_EXACT */ + int *indexPtr; /* Place to store resulting integer index. */ { /* - * See if there is a valid cached result from a previous lookup (doing the - * check here saves the overhead of calling Tcl_GetIndexFromObjStruct in - * the common case where the result is cached). + * See if there is a valid cached result from a previous lookup + * (doing the check here saves the overhead of calling + * Tcl_GetIndexFromObjStruct in the common case where the result + * is cached). */ - if (objPtr->typePtr == &indexType) { - IndexRep *indexRep = objPtr->internalRep.otherValuePtr; - + if (objPtr->typePtr == &tclIndexType) { + IndexRep *indexRep = (IndexRep *) objPtr->internalRep.otherValuePtr; /* - * Here's hoping we don't get hit by unfortunate packing constraints - * on odd platforms like a Cray PVP... + * Here's hoping we don't get hit by unfortunate packing + * constraints on odd platforms like a Cray PVP... */ - - if (indexRep->tablePtr == (void *) tablePtr - && indexRep->offset == sizeof(char *)) { + if (indexRep->tablePtr == (VOID *)tablePtr && + indexRep->offset == sizeof(char *)) { *indexPtr = indexRep->index; return TCL_OK; } @@ -127,46 +130,49 @@ Tcl_GetIndexFromObj( * * Tcl_GetIndexFromObjStruct -- * - * This function looks up an object's value given a starting string and - * an offset for the amount of space between strings. This is useful when - * the strings are embedded in some other kind of array. + * This procedure looks up an object's value given a starting + * string and an offset for the amount of space between strings. + * This is useful when the strings are embedded in some other + * kind of array. * * Results: - * If the value of objPtr is identical to or a unique abbreviation for - * one of the entries in objPtr, then the return value is TCL_OK and the - * index of the matching entry is stored at *indexPtr. If there isn't a - * proper match, then TCL_ERROR is returned and an error message is left - * in interp's result (unless interp is NULL). The msg argument is used - * in the error message; for example, if msg has the value "option" then - * the error message will say something flag 'bad option "foo": must be + * + * If the value of objPtr is identical to or a unique abbreviation + * for one of the entries in objPtr, then the return value is + * TCL_OK and the index of the matching entry is stored at + * *indexPtr. If there isn't a proper match, then TCL_ERROR is + * returned and an error message is left in interp's result (unless + * interp is NULL). The msg argument is used in the error + * message; for example, if msg has the value "option" then the + * error message will say something flag 'bad option "foo": must be * ...' * * Side effects: - * The result of the lookup is cached as the internal rep of objPtr, so - * that repeated lookups can be done quickly. + * The result of the lookup is cached as the internal rep of + * objPtr, so that repeated lookups can be done quickly. * *---------------------------------------------------------------------- */ int -Tcl_GetIndexFromObjStruct( - Tcl_Interp *interp, /* Used for error reporting if not NULL. */ - Tcl_Obj *objPtr, /* Object containing the string to lookup. */ - const void *tablePtr, /* The first string in the table. The second +Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, offset, msg, flags, + indexPtr) + Tcl_Interp *interp; /* Used for error reporting if not NULL. */ + Tcl_Obj *objPtr; /* Object containing the string to lookup. */ + CONST VOID *tablePtr; /* The first string in the table. The second * string will be at this address plus the * offset, the third plus the offset again, - * etc. The last entry must be NULL and there - * must not be duplicate entries. */ - int offset, /* The number of bytes between entries */ - const char *msg, /* Identifying word to use in error - * messages. */ - int flags, /* 0 or TCL_EXACT */ - int *indexPtr) /* Place to store resulting integer index. */ + * etc. The last entry must be NULL + * and there must not be duplicate entries. */ + int offset; /* The number of bytes between entries */ + CONST char *msg; /* Identifying word to use in error messages. */ + int flags; /* 0 or TCL_EXACT */ + int *indexPtr; /* Place to store resulting integer index. */ { - int index, idx, numAbbrev; + int index, i, numAbbrev; char *key, *p1; - const char *p2; - const char *const *entryPtr; + CONST char *p2; + CONST char * CONST *entryPtr; Tcl_Obj *resultPtr; IndexRep *indexRep; @@ -174,8 +180,8 @@ Tcl_GetIndexFromObjStruct( * See if there is a valid cached result from a previous lookup. */ - if (objPtr->typePtr == &indexType) { - indexRep = objPtr->internalRep.otherValuePtr; + if (objPtr->typePtr == &tclIndexType) { + indexRep = (IndexRep *) objPtr->internalRep.otherValuePtr; if (indexRep->tablePtr==tablePtr && indexRep->offset==offset) { *indexPtr = indexRep->index; return TCL_OK; @@ -183,7 +189,7 @@ Tcl_GetIndexFromObjStruct( } /* - * Lookup the value of the object in the table. Accept unique + * Lookup the value of the object in the table. Accept unique * abbreviations unless TCL_EXACT is set in flags. */ @@ -197,65 +203,63 @@ Tcl_GetIndexFromObjStruct( * - A single abbreviation (allowed depending on flags) * - Several abbreviations (never allowed, but overridden by exact match) */ - - for (entryPtr = tablePtr, idx = 0; *entryPtr != NULL; - entryPtr = NEXT_ENTRY(entryPtr, offset), idx++) { + for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; + entryPtr = NEXT_ENTRY(entryPtr, offset), i++) { for (p1 = key, p2 = *entryPtr; *p1 == *p2; p1++, p2++) { if (*p1 == '\0') { - index = idx; + index = i; goto done; } } if (*p1 == '\0') { /* - * The value is an abbreviation for this entry. Continue checking - * other entries to make sure it's unique. If we get more than one - * unique abbreviation, keep searching to see if there is an exact - * match, but remember the number of unique abbreviations and - * don't allow either. + * The value is an abbreviation for this entry. Continue + * checking other entries to make sure it's unique. If we + * get more than one unique abbreviation, keep searching to + * see if there is an exact match, but remember the number + * of unique abbreviations and don't allow either. */ numAbbrev++; - index = idx; + index = i; } } - /* - * Check if we were instructed to disallow abbreviations. + * Check if we were instructed to disallow abbreviations. */ - if ((flags & TCL_EXACT) || (key[0] == '\0') || (numAbbrev != 1)) { goto error; } - done: + done: /* - * Cache the found representation. Note that we want to avoid allocating a - * new internal-rep if at all possible since that is potentially a slow - * operation. + * Cache the found representation. Note that we want to avoid + * allocating a new internal-rep if at all possible since that is + * potentially a slow operation. */ - - if (objPtr->typePtr == &indexType) { - indexRep = objPtr->internalRep.otherValuePtr; + if (objPtr->typePtr == &tclIndexType) { + indexRep = (IndexRep *) objPtr->internalRep.otherValuePtr; } else { - TclFreeIntRep(objPtr); + if ((objPtr->typePtr != NULL) + && (objPtr->typePtr->freeIntRepProc != NULL)) { + objPtr->typePtr->freeIntRepProc(objPtr); + } indexRep = (IndexRep *) ckalloc(sizeof(IndexRep)); - objPtr->internalRep.otherValuePtr = indexRep; - objPtr->typePtr = &indexType; + objPtr->internalRep.otherValuePtr = (VOID *) indexRep; + objPtr->typePtr = &tclIndexType; } - indexRep->tablePtr = (void *) tablePtr; + indexRep->tablePtr = (VOID*) tablePtr; indexRep->offset = offset; indexRep->index = index; *indexPtr = index; return TCL_OK; - error: + error: if (interp != NULL) { /* * Produce a fancy error message. */ - int count = 0; TclNewObj(resultPtr); @@ -265,20 +269,21 @@ Tcl_GetIndexFromObjStruct( entryPtr = NEXT_ENTRY(entryPtr, offset); } Tcl_AppendStringsToObj(resultPtr, (numAbbrev > 1) && - !(flags & TCL_EXACT) ? "ambiguous " : "bad ", msg, " \"", key, - "\": must be ", *entryPtr, NULL); + !(flags & TCL_EXACT) ? "ambiguous " : "bad ", msg, " \"", + key, "\": must be ", *entryPtr, (char*)NULL); entryPtr = NEXT_ENTRY(entryPtr, offset); while (*entryPtr != NULL) { if (*NEXT_ENTRY(entryPtr, offset) == NULL) { - Tcl_AppendStringsToObj(resultPtr, ((count > 0) ? "," : ""), - " or ", *entryPtr, NULL); + Tcl_AppendStringsToObj(resultPtr, + (count > 0) ? ", or " : " or ", *entryPtr, + (char *) NULL); } else if (**entryPtr) { - Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr, NULL); + Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr, + (char *) NULL); count++; } entryPtr = NEXT_ENTRY(entryPtr, offset); } - Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "INDEX", msg, key, NULL); } return TCL_ERROR; } @@ -288,14 +293,14 @@ Tcl_GetIndexFromObjStruct( * * SetIndexFromAny -- * - * This function is called to convert a Tcl object to index internal - * form. However, this doesn't make sense (need to have a table of - * keywords in order to do the conversion) so the function always - * generates an error. + * This procedure is called to convert a Tcl object to index + * internal form. However, this doesn't make sense (need to have a + * table of keywords in order to do the conversion) so the + * procedure always generates an error. * * Results: - * The return value is always TCL_ERROR, and an error message is left in - * interp's result if interp isn't NULL. + * The return value is always TCL_ERROR, and an error message is + * left in interp's result if interp isn't NULL. * * Side effects: * None. @@ -304,14 +309,14 @@ Tcl_GetIndexFromObjStruct( */ static int -SetIndexFromAny( - Tcl_Interp *interp, /* Used for error reporting if not NULL. */ - register Tcl_Obj *objPtr) /* The object to convert. */ +SetIndexFromAny(interp, objPtr) + Tcl_Interp *interp; /* Used for error reporting if not NULL. */ + register Tcl_Obj *objPtr; /* The object to convert. */ { if (interp) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_AppendToObj(Tcl_GetObjResult(interp), "can't convert value to index except via Tcl_GetIndexFromObj API", - -1)); + -1); } return TCL_ERROR; } @@ -321,8 +326,9 @@ SetIndexFromAny( * * UpdateStringOfIndex -- * - * This function is called to convert a Tcl object from index internal - * form to its string form. No abbreviation is ever generated. + * This procedure is called to convert a Tcl object from index + * internal form to its string form. No abbreviation is ever + * generated. * * Results: * None. @@ -334,13 +340,13 @@ SetIndexFromAny( */ static void -UpdateStringOfIndex( - Tcl_Obj *objPtr) +UpdateStringOfIndex(objPtr) + Tcl_Obj *objPtr; { - IndexRep *indexRep = objPtr->internalRep.otherValuePtr; + IndexRep *indexRep = (IndexRep *) objPtr->internalRep.otherValuePtr; register char *buf; register unsigned len; - register const char *indexStr = EXPAND_OF(indexRep); + register CONST char *indexStr = EXPAND_OF(indexRep); len = strlen(indexStr); buf = (char *) ckalloc(len + 1); @@ -354,30 +360,29 @@ UpdateStringOfIndex( * * DupIndex -- * - * This function is called to copy the internal rep of an index Tcl - * object from to another object. + * This procedure is called to copy the internal rep of an index + * Tcl object from to another object. * * Results: * None. * * Side effects: - * The internal representation of the target object is updated and the - * type is set. + * The internal representation of the target object is updated + * and the type is set. * *---------------------------------------------------------------------- */ static void -DupIndex( - Tcl_Obj *srcPtr, - Tcl_Obj *dupPtr) +DupIndex(srcPtr, dupPtr) + Tcl_Obj *srcPtr, *dupPtr; { - IndexRep *srcIndexRep = srcPtr->internalRep.otherValuePtr; + IndexRep *srcIndexRep = (IndexRep *) srcPtr->internalRep.otherValuePtr; IndexRep *dupIndexRep = (IndexRep *) ckalloc(sizeof(IndexRep)); memcpy(dupIndexRep, srcIndexRep, sizeof(IndexRep)); - dupPtr->internalRep.otherValuePtr = dupIndexRep; - dupPtr->typePtr = &indexType; + dupPtr->internalRep.otherValuePtr = (VOID *) dupIndexRep; + dupPtr->typePtr = &tclIndexType; } /* @@ -385,8 +390,8 @@ DupIndex( * * FreeIndex -- * - * This function is called to delete the internal rep of an index Tcl - * object. + * This procedure is called to delete the internal rep of an index + * Tcl object. * * Results: * None. @@ -398,11 +403,10 @@ DupIndex( */ static void -FreeIndex( - Tcl_Obj *objPtr) +FreeIndex(objPtr) + Tcl_Obj *objPtr; { ckfree((char *) objPtr->internalRep.otherValuePtr); - objPtr->typePtr = NULL; } /* @@ -410,241 +414,70 @@ FreeIndex( * * Tcl_WrongNumArgs -- * - * This function generates a "wrong # args" error message in an - * interpreter. It is used as a utility function by many command - * functions, including the function that implements procedures. + * This procedure generates a "wrong # args" error message in an + * interpreter. It is used as a utility function by many command + * procedures. * * Results: * None. * * Side effects: - * An error message is generated in interp's result object to indicate - * that a command was invoked with the wrong number of arguments. The - * message has the form + * An error message is generated in interp's result object to + * indicate that a command was invoked with the wrong number of + * arguments. The message has the form * wrong # args: should be "foo bar additional stuff" - * where "foo" and "bar" are the initial objects in objv (objc determines - * how many of these are printed) and "additional stuff" is the contents - * of the message argument. - * - * The message printed is modified somewhat if the command is wrapped - * inside an ensemble. In that case, the error message generated is - * rewritten in such a way that it appears to be generated from the - * user-visible command and not how that command is actually implemented, - * giving a better overall user experience. - * - * Internally, the Tcl core may set the flag INTERP_ALTERNATE_WRONG_ARGS - * in the interpreter to generate complex multi-part messages by calling - * this function repeatedly. This allows the code that knows how to - * handle ensemble-related error messages to be kept here while still - * generating suitable error messages for commands like [read] and - * [socket]. Ideally, this would be done through an extra flags argument, - * but that wouldn't be source-compatible with the existing API and it's - * a fairly rare requirement anyway. + * where "foo" and "bar" are the initial objects in objv (objc + * determines how many of these are printed) and "additional stuff" + * is the contents of the message argument. * *---------------------------------------------------------------------- */ void -Tcl_WrongNumArgs( - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments to print from objv. */ - Tcl_Obj *const objv[], /* Initial argument objects, which should be - * included in the error message. */ - const char *message) /* Error message to print after the leading - * objects in objv. The message may be - * NULL. */ +Tcl_WrongNumArgs(interp, objc, objv, message) + Tcl_Interp *interp; /* Current interpreter. */ + int objc; /* Number of arguments to print + * from objv. */ + Tcl_Obj *CONST objv[]; /* Initial argument objects, which + * should be included in the error + * message. */ + CONST char *message; /* Error message to print after the + * leading objects in objv. The + * message may be NULL. */ { Tcl_Obj *objPtr; - int i, len, elemLen, flags; - Interp *iPtr = (Interp *) interp; - const char *elementStr; - - /* - * [incr Tcl] does something fairly horrific when generating error - * messages for its ensembles; it passes the whole set of ensemble - * arguments as a list in the first argument. This means that this code - * causes a problem in iTcl if it attempts to correctly quote all - * arguments, which would be the correct thing to do. We work around this - * nasty behaviour for now, and hope that we can remove it all in the - * future... - */ - -#ifndef AVOID_HACKS_FOR_ITCL - int isFirst = 1; /* Special flag used to inhibit the treating - * of the first word as a list element so the - * hacky way Itcl generates error messages for - * its ensembles will still work. [Bug - * 1066837] */ -# define MAY_QUOTE_WORD (!isFirst) -# define AFTER_FIRST_WORD (isFirst = 0) -#else /* !AVOID_HACKS_FOR_ITCL */ -# define MAY_QUOTE_WORD 1 -# define AFTER_FIRST_WORD (void) 0 -#endif /* AVOID_HACKS_FOR_ITCL */ + int i; + register IndexRep *indexRep; TclNewObj(objPtr); - if (iPtr->flags & INTERP_ALTERNATE_WRONG_ARGS) { - Tcl_AppendObjToObj(objPtr, Tcl_GetObjResult(interp)); - Tcl_AppendToObj(objPtr, " or \"", -1); - } else { - 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) { - int toSkip = iPtr->ensembleRewrite.numInsertedObjs; - int toPrint = iPtr->ensembleRewrite.numRemovedObjs; - Tcl_Obj *const *origObjv = iPtr->ensembleRewrite.sourceObjs; - - /* - * 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 and we'd be better off just giving a slightly - * confusing error message... - */ - - if (objc < toSkip) { - goto addNormalArgumentsToMessage; - } - - /* - * Strip out the actual arguments that the ensemble inserted. - */ - - objv += toSkip; - objc -= toSkip; - - /* - * We assume no object is of index type. - */ - - for (i=0 ; i<toPrint ; i++) { - /* - * Add the element, quoting it if necessary. - */ - - if (origObjv[i]->typePtr == &indexType) { - register IndexRep *indexRep = - origObjv[i]->internalRep.otherValuePtr; - - elementStr = EXPAND_OF(indexRep); - elemLen = strlen(elementStr); - } else if (origObjv[i]->typePtr == &tclEnsembleCmdType) { - register EnsembleCmdRep *ecrPtr = - origObjv[i]->internalRep.otherValuePtr; - - elementStr = ecrPtr->fullSubcmdName; - elemLen = strlen(elementStr); - } else { - elementStr = TclGetStringFromObj(origObjv[i], &elemLen); - } - flags = 0; - len = TclScanElement(elementStr, elemLen, &flags); - - if (MAY_QUOTE_WORD && len != elemLen) { - char *quotedElementStr = TclStackAlloc(interp, - (unsigned)len + 1); - - len = TclConvertElement(elementStr, elemLen, - quotedElementStr, flags); - Tcl_AppendToObj(objPtr, quotedElementStr, len); - TclStackFree(interp, quotedElementStr); - } else { - Tcl_AppendToObj(objPtr, elementStr, elemLen); - } - - AFTER_FIRST_WORD; - - /* - * Add a space if the word is not the last one (which has a - * moderately complex condition here). - */ - - if (i<toPrint-1 || objc!=0 || message!=NULL) { - Tcl_AppendStringsToObj(objPtr, " ", NULL); - } - } - } - - /* - * Now add the arguments (other than those rewritten) that the caller took - * from its calling context. - */ - - addNormalArgumentsToMessage: + Tcl_SetObjResult(interp, objPtr); + Tcl_AppendToObj(objPtr, "wrong # args: should be \"", -1); for (i = 0; i < objc; i++) { /* - * If the object is an index type use the index table which allows for - * the correct error message even if the subcommand was abbreviated. - * Otherwise, just use the string rep. + * If the object is an index type use the index table which allows + * for the correct error message even if the subcommand was + * abbreviated. Otherwise, just use the string rep. */ - - if (objv[i]->typePtr == &indexType) { - register IndexRep *indexRep = objv[i]->internalRep.otherValuePtr; - - Tcl_AppendStringsToObj(objPtr, EXPAND_OF(indexRep), NULL); - } else if (objv[i]->typePtr == &tclEnsembleCmdType) { - register EnsembleCmdRep *ecrPtr = - objv[i]->internalRep.otherValuePtr; - - Tcl_AppendStringsToObj(objPtr, ecrPtr->fullSubcmdName, NULL); + + if (objv[i]->typePtr == &tclIndexType) { + indexRep = (IndexRep *) objv[i]->internalRep.otherValuePtr; + Tcl_AppendStringsToObj(objPtr, EXPAND_OF(indexRep), (char *) NULL); } else { - /* - * Quote the argument if it contains spaces (Bug 942757). - */ - - elementStr = TclGetStringFromObj(objv[i], &elemLen); - flags = 0; - len = TclScanElement(elementStr, elemLen, &flags); - - if (MAY_QUOTE_WORD && len != elemLen) { - char *quotedElementStr = TclStackAlloc(interp, - (unsigned) len + 1); - - len = TclConvertElement(elementStr, elemLen, - quotedElementStr, flags); - Tcl_AppendToObj(objPtr, quotedElementStr, len); - TclStackFree(interp, quotedElementStr); - } else { - Tcl_AppendToObj(objPtr, elementStr, elemLen); - } + Tcl_AppendStringsToObj(objPtr, Tcl_GetString(objv[i]), + (char *) NULL); } - AFTER_FIRST_WORD; - /* * Append a space character (" ") if there is more text to follow * (either another element from objv, or the message string). */ - - if (i<objc-1 || message!=NULL) { - Tcl_AppendStringsToObj(objPtr, " ", NULL); + if ((i < (objc - 1)) || message) { + Tcl_AppendStringsToObj(objPtr, " ", (char *) NULL); } } - /* - * 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 != NULL) { - Tcl_AppendStringsToObj(objPtr, message, NULL); + if (message) { + Tcl_AppendStringsToObj(objPtr, message, (char *) NULL); } - Tcl_AppendStringsToObj(objPtr, "\"", NULL); - Tcl_SetObjResult(interp, objPtr); -#undef MAY_QUOTE_WORD -#undef AFTER_FIRST_WORD + Tcl_AppendStringsToObj(objPtr, "\"", (char *) NULL); } - -/* - * Local Variables: - * mode: c - * c-basic-offset: 4 - * fill-column: 78 - * End: - */ |
