Tcl Source Code

Artifact [ce698564ad]
Login

Artifact ce698564ad5027c4fffcc223ea3d6655fb62c068:

Attachment "result.diff" to ticket [1041072fff] added by dkf 2004-10-06 05:50:28.
Index: generic/tclResult.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclResult.c,v
retrieving revision 1.12
diff -u -u -r1.12 tclResult.c
--- generic/tclResult.c	5 Oct 2004 18:14:28 -0000	1.12
+++ generic/tclResult.c	5 Oct 2004 22:47:42 -0000
@@ -446,92 +446,19 @@
  */
 
 void
-Tcl_AppendResultVA (interp, argList)
+Tcl_AppendResultVA(interp, argList)
     Tcl_Interp *interp;		/* Interpreter with which to associate the
 				 * return value. */
     va_list argList;		/* Variable argument list. */
 {
-#define STATIC_LIST_SIZE 16
-    Interp *iPtr = (Interp *) interp;
-    char *string, *static_list[STATIC_LIST_SIZE];
-    char **args = static_list;
-    int nargs_space = STATIC_LIST_SIZE;
-    int nargs, newSpace, i;
-
-    /*
-     * If the string result is empty, move the object result to the
-     * string result, then reset the object result.
-     */
-
-    if (*(iPtr->result) == 0) {
-	Tcl_SetResult((Tcl_Interp *) iPtr,
-	        TclGetString(Tcl_GetObjResult((Tcl_Interp *) iPtr)),
-	        TCL_VOLATILE);
-    }
-    
-    /*
-     * Scan through all the arguments to see how much space is needed
-     * and save pointers to the arguments in the args array,
-     * reallocating as necessary.
-     */
+    Tcl_Obj *objPtr = Tcl_GetObjResult(interp);
 
-    nargs = 0;
-    newSpace = 0;
-    while (1) {
- 	string = va_arg(argList, char *);
-	if (string == NULL) {
-	    break;
-	}
- 	if (nargs >= nargs_space) {
- 	    /* 
- 	     * Expand the args buffer
- 	     */
- 	    nargs_space += STATIC_LIST_SIZE;
- 	    if (args == static_list) {
- 	    	args = (void *)ckalloc(nargs_space * sizeof(char *));
- 		for (i = 0; i < nargs; ++i) {
- 		    args[i] = static_list[i];
- 		}
- 	    } else {
- 		args = (void *)ckrealloc((void *)args,
-			nargs_space * sizeof(char *));
- 	    }
- 	}
-  	newSpace += strlen(string);
-	args[nargs++] = string;
-    }
-
-    /*
-     * If the append buffer isn't already setup and large enough to hold
-     * the new data, set it up.
-     */
-
-    if ((iPtr->result != iPtr->appendResult)
-	    || (iPtr->appendResult[iPtr->appendUsed] != 0)
-	    || ((newSpace + iPtr->appendUsed) >= iPtr->appendAvl)) {
-       SetupAppendBuffer(iPtr, newSpace);
-    }
-
-    /*
-     * Now go through all the argument strings again, copying them into the
-     * buffer.
-     */
-
-    for (i = 0; i < nargs; ++i) {
- 	string = args[i];
-  	strcpy(iPtr->appendResult + iPtr->appendUsed, string);
-  	iPtr->appendUsed += strlen(string);
-    }
- 
-    /*
-     * If we had to allocate a buffer from the heap, 
-     * free it now.
-     */
- 
-    if (args != static_list) {
-     	ckfree((void *)args);
+    if (Tcl_IsShared(objPtr)) {
+	objPtr = Tcl_DuplicateObj(objPtr);
+	Tcl_SetObjResult(interp, objPtr);
     }
-#undef STATIC_LIST_SIZE
+    Tcl_AppendStringsToObjVA(objPtr, argList);
+    (void) Tcl_GetStringResult(interp);
 }
 
 /*