summaryrefslogtreecommitdiffstats
path: root/generic/tclListObj.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclListObj.c')
-rw-r--r--generic/tclListObj.c634
1 files changed, 317 insertions, 317 deletions
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index aa793f4..7aaa8e0 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -1,26 +1,25 @@
-/*
+/*
* tclListObj.c --
*
- * This file contains procedures that implement the Tcl list object
- * type.
+ * This file contains functions that implement the Tcl list object type.
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright (c) 1998 by Scriptics Corporation.
* Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
*
- * 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.
*
- * RCS: @(#) $Id: tclListObj.c,v 1.23 2005/05/10 18:34:44 kennykb Exp $
+ * RCS: @(#) $Id: tclListObj.c,v 1.24 2005/07/19 00:09:07 dkf Exp $
*/
#include "tclInt.h"
/*
- * Prototypes for procedures defined later in this file:
+ * Prototypes for functions defined later in this file:
*/
-static List* NewListIntRep _ANSI_ARGS_((int objc,
+static List* NewListIntRep _ANSI_ARGS_((int objc,
Tcl_Obj *CONST objv[]));
static void DupListInternalRep _ANSI_ARGS_((Tcl_Obj *srcPtr,
Tcl_Obj *copyPtr));
@@ -30,17 +29,16 @@ static int SetListFromAny _ANSI_ARGS_((Tcl_Interp *interp,
static void UpdateStringOfList _ANSI_ARGS_((Tcl_Obj *listPtr));
/*
- * The structure below defines the list Tcl object type by means of
- * procedures that can be invoked by generic object code.
+ * The structure below defines the list Tcl object type by means of functions
+ * that can be invoked by generic object code.
*
* The internal representation of a list object is a two-pointer
- * representation. The first pointer designates a List structure that
- * contains an array of pointers to the element objects, together with
- * integers that represent the current element count and the allocated
- * size of the array. The second pointer is normally NULL; during
- * execution of functions in this file that operate on nested sublists,
- * it is occasionally used as working storage to avoid an auxiliary
- * stack.
+ * representation. The first pointer designates a List structure that contains
+ * an array of pointers to the element objects, together with integers that
+ * represent the current element count and the allocated size of the array.
+ * The second pointer is normally NULL; during execution of functions in this
+ * file that operate on nested sublists, it is occasionally used as working
+ * storage to avoid an auxiliary stack.
*/
Tcl_ObjType tclListType = {
@@ -48,7 +46,7 @@ Tcl_ObjType tclListType = {
FreeListInternalRep, /* freeIntRepProc */
DupListInternalRep, /* dupIntRepProc */
UpdateStringOfList, /* updateStringProc */
- NULL /* setFromAnyProc */
+ NULL /* setFromAnyProc */
};
@@ -57,17 +55,17 @@ Tcl_ObjType tclListType = {
*
* NewListIntRep --
*
- * If objc>0 and objv!=NULL, this procedure creates a list internal rep
+ * If objc>0 and objv!=NULL, this function creates a list internal rep
* with objc elements given in the array objv.
- * If objc>0 and objv==NULL it creates the list internal rep of a list
+ * If objc>0 and objv==NULL it creates the list internal rep of a list
* with 0 elements, where enough space has been preallocated to store
* objc elements.
- * If objc<=0, it returns NULL.
+ * If objc<=0, it returns NULL.
*
* Results:
* A new List struct is returned. If objc<=0 or if the allocation fails
- * for lack of memory, NULL is returned.
- * The list returned has refCount 0.
+ * for lack of memory, NULL is returned. The list returned has refCount
+ * 0.
*
* Side effects:
* The ref counts of the elements in objv are incremented since the
@@ -89,16 +87,17 @@ NewListIntRep(objc, objv)
return NULL;
}
- /* First check to see if we'd overflow and try to allocate an
- * object larger than our memory allocator allows. Note that this
- * is actually a fairly small value when you're on a serious
- * 64-bit machine, but that requires API changes to fix.
+ /*
+ * First check to see if we'd overflow and try to allocate an object
+ * larger than our memory allocator allows. Note that this is actually a
+ * fairly small value when you're on a serious 64-bit machine, but that
+ * requires API changes to fix.
*/
-
+
if (objc > INT_MAX/sizeof(Tcl_Obj *)) {
return NULL;
}
-
+
listRepPtr = (List *) attemptckalloc(sizeof(List) +
((objc-1) * sizeof(Tcl_Obj *)));
if (listRepPtr == NULL) {
@@ -114,7 +113,7 @@ NewListIntRep(objc, objv)
for (i = 0; i < objc; i++) {
elemPtrs[i] = objv[i];
Tcl_IncrRefCount(elemPtrs[i]);
- }
+ }
} else {
listRepPtr->elemCount = 0;
}
@@ -126,19 +125,19 @@ NewListIntRep(objc, objv)
*
* Tcl_NewListObj --
*
- * This procedure is normally called when not debugging: i.e., when
+ * This function is normally called when not debugging: i.e., when
* TCL_MEM_DEBUG is not defined. It creates a new list object from an
* (objc,objv) array: that is, each of the objc elements of the array
* referenced by objv is inserted as an element into a new Tcl object.
*
- * When TCL_MEM_DEBUG is defined, this procedure just returns the
- * result of calling the debugging version Tcl_DbNewListObj.
+ * When TCL_MEM_DEBUG is defined, this function just returns the result
+ * of calling the debugging version Tcl_DbNewListObj.
*
* Results:
* A new list object is returned that is initialized from the object
* pointers in objv. If objc is less than or equal to zero, an empty
- * object is returned. The new object's string representation
- * is left NULL. The resulting new list object has ref count 0.
+ * object is returned. The new object's string representation is left
+ * NULL. The resulting new list object has ref count 0.
*
* Side effects:
* The ref counts of the elements in objv are incremented since the
@@ -173,7 +172,7 @@ Tcl_NewListObj(objc, objv)
if (objc <= 0) {
return listPtr;
}
-
+
/*
* Create the internal rep.
*/
@@ -186,7 +185,7 @@ Tcl_NewListObj(objc, objv)
/*
* Now create the object.
*/
-
+
Tcl_InvalidateStringRep(listPtr);
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
@@ -202,22 +201,22 @@ Tcl_NewListObj(objc, objv)
*
* Tcl_DbNewListObj --
*
- * This procedure is normally called when debugging: i.e., when
- * TCL_MEM_DEBUG is defined. It creates new list objects. It is the
- * same as the Tcl_NewListObj procedure above except that it calls
+ * This function is normally called when debugging: i.e., when
+ * TCL_MEM_DEBUG is defined. It creates new list objects. It is the same
+ * as the Tcl_NewListObj function above except that it calls
* Tcl_DbCkalloc directly with the file name and line number from its
* caller. This simplifies debugging since then the [memory active]
- * command will report the correct file name and line number when
+ * command will report the correct file name and line number when
* reporting objects that haven't been freed.
*
- * When TCL_MEM_DEBUG is not defined, this procedure just returns the
+ * When TCL_MEM_DEBUG is not defined, this function just returns the
* result of calling Tcl_NewListObj.
*
* Results:
* A new list object is returned that is initialized from the object
* pointers in objv. If objc is less than or equal to zero, an empty
- * object is returned. The new object's string representation
- * is left NULL. The new list object has ref count 0.
+ * object is returned. The new object's string representation is left
+ * NULL. The new list object has ref count 0.
*
* Side effects:
* The ref counts of the elements in objv are incremented since the
@@ -233,9 +232,9 @@ Tcl_DbNewListObj(objc, objv, file, line)
int objc; /* Count of objects referenced by objv. */
Tcl_Obj *CONST objv[]; /* An array of pointers to Tcl objects. */
CONST char *file; /* The name of the source file calling this
- * procedure; used for debugging. */
- int line; /* Line number in the source file; used
- * for debugging. */
+ * function; used for debugging. */
+ int line; /* Line number in the source file; used for
+ * debugging. */
{
Tcl_Obj *listPtr;
List *listRepPtr;
@@ -245,7 +244,7 @@ Tcl_DbNewListObj(objc, objv, file, line)
if (objc <= 0) {
return listPtr;
}
-
+
/*
* Create the internal rep.
*/
@@ -258,7 +257,7 @@ Tcl_DbNewListObj(objc, objv, file, line)
/*
* Now create the object.
*/
-
+
Tcl_InvalidateStringRep(listPtr);
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
@@ -275,9 +274,9 @@ Tcl_DbNewListObj(objc, objv, file, line)
int objc; /* Count of objects referenced by objv. */
Tcl_Obj *CONST objv[]; /* An array of pointers to Tcl objects. */
CONST char *file; /* The name of the source file calling this
- * procedure; used for debugging. */
- int line; /* Line number in the source file; used
- * for debugging. */
+ * function; used for debugging. */
+ int line; /* Line number in the source file; used for
+ * debugging. */
{
return Tcl_NewListObj(objc, objv);
}
@@ -288,8 +287,8 @@ Tcl_DbNewListObj(objc, objv, file, line)
*
* Tcl_SetListObj --
*
- * Modify an object to be a list containing each of the objc elements
- * of the object array referenced by objv.
+ * Modify an object to be a list containing each of the objc elements of
+ * the object array referenced by objv.
*
* Results:
* None.
@@ -297,10 +296,10 @@ Tcl_DbNewListObj(objc, objv, file, line)
* Side effects:
* The object is made a list object and is initialized from the object
* pointers in objv. If objc is less than or equal to zero, an empty
- * object is returned. The new object's string representation
- * is left NULL. The ref counts of the elements in objv are incremented
- * since the list now refers to them. The object's old string and
- * internal representations are freed and its type is set NULL.
+ * object is returned. The new object's string representation is left
+ * NULL. The ref counts of the elements in objv are incremented since the
+ * list now refers to them. The object's old string and internal
+ * representations are freed and its type is set NULL.
*
*----------------------------------------------------------------------
*/
@@ -327,8 +326,8 @@ Tcl_SetListObj(objPtr, objc, objv)
/*
* Set the object's type to "list" and initialize the internal rep.
- * However, if there are no elements to put in the list, just give
- * the object an empty string rep and a NULL type.
+ * However, if there are no elements to put in the list, just give the
+ * object an empty string rep and a NULL type.
*/
if (objc > 0) {
@@ -351,23 +350,23 @@ Tcl_SetListObj(objPtr, objc, objv)
*
* Tcl_ListObjGetElements --
*
- * This procedure returns an (objc,objv) array of the elements in a
- * list object.
+ * This function returns an (objc,objv) array of the elements in a list
+ * object.
*
* Results:
* The return value is normally TCL_OK; in this case *objcPtr is set to
* the count of list elements and *objvPtr is set to a pointer to an
- * array of (*objcPtr) pointers to each list element. If listPtr does
- * not refer to a list object and the object can not be converted to
- * one, TCL_ERROR is returned and an error message will be left in
- * the interpreter's result if interp is not NULL.
+ * array of (*objcPtr) pointers to each list element. If listPtr does not
+ * refer to a list object and the object can not be converted to one,
+ * TCL_ERROR is returned and an error message will be left in the
+ * interpreter's result if interp is not NULL.
*
* The objects referenced by the returned array should be treated as
* readonly and their ref counts are _not_ incremented; the caller must
- * do that if it holds on to a reference. Furthermore, the pointer
- * and length returned by this procedure may change as soon as any
- * procedure is called on the list object; be careful about retaining
- * the pointer in a local data structure.
+ * do that if it holds on to a reference. Furthermore, the pointer and
+ * length returned by this function may change as soon as any function is
+ * called on the list object; be careful about retaining the pointer in a
+ * local data structure.
*
* Side effects:
* The possible conversion of the object referenced by listPtr
@@ -379,12 +378,12 @@ Tcl_SetListObj(objPtr, objc, objv)
int
Tcl_ListObjGetElements(interp, listPtr, objcPtr, objvPtr)
Tcl_Interp *interp; /* Used to report errors if not NULL. */
- register Tcl_Obj *listPtr; /* List object for which an element array
- * is to be returned. */
+ register Tcl_Obj *listPtr; /* List object for which an element array is
+ * to be returned. */
int *objcPtr; /* Where to store the count of objects
* referenced by objv. */
- Tcl_Obj ***objvPtr; /* Where to store the pointer to an array
- * of pointers to the list's objects. */
+ Tcl_Obj ***objvPtr; /* Where to store the pointer to an array of
+ * pointers to the list's objects. */
{
register List *listRepPtr;
@@ -414,22 +413,22 @@ Tcl_ListObjGetElements(interp, listPtr, objcPtr, objvPtr)
*
* Tcl_ListObjAppendList --
*
- * This procedure appends the objects in the list referenced by
+ * This function appends the objects in the list referenced by
* elemListPtr to the list object referenced by listPtr. If listPtr is
* not already a list object, an attempt will be made to convert it to
* one.
*
* Results:
- * The return value is normally TCL_OK. If listPtr or elemListPtr do
- * not refer to list objects and they can not be converted to one,
- * TCL_ERROR is returned and an error message is left in
- * the interpreter's result if interp is not NULL.
+ * The return value is normally TCL_OK. If listPtr or elemListPtr do not
+ * refer to list objects and they can not be converted to one, TCL_ERROR
+ * is returned and an error message is left in the interpreter's result
+ * if interp is not NULL.
*
* Side effects:
* The reference counts of the elements in elemListPtr are incremented
* since the list now refers to them. listPtr and elemListPtr are
- * converted, if necessary, to list objects. Also, appending the
- * new elements may cause listObj's array of element pointers to grow.
+ * converted, if necessary, to list objects. Also, appending the new
+ * elements may cause listObj's array of element pointers to grow.
* listPtr's old string representation, if any, is invalidated.
*
*----------------------------------------------------------------------
@@ -471,24 +470,24 @@ Tcl_ListObjAppendList(interp, listPtr, elemListPtr)
*
* Tcl_ListObjAppendElement --
*
- * This procedure is a special purpose version of
- * Tcl_ListObjAppendList: it appends a single object referenced by
- * objPtr to the list object referenced by listPtr. If listPtr is not
- * already a list object, an attempt will be made to convert it to one.
+ * This function is a special purpose version of Tcl_ListObjAppendList:
+ * it appends a single object referenced by objPtr to the list object
+ * referenced by listPtr. If listPtr is not already a list object, an
+ * attempt will be made to convert it to one.
*
* Results:
- * The return value is normally TCL_OK; in this case objPtr is added
- * to the end of listPtr's list. If listPtr does not refer to a list
- * object and the object can not be converted to one, TCL_ERROR is
- * returned and an error message will be left in the interpreter's
- * result if interp is not NULL.
+ * The return value is normally TCL_OK; in this case objPtr is added to
+ * the end of listPtr's list. If listPtr does not refer to a list object
+ * and the object can not be converted to one, TCL_ERROR is returned and
+ * an error message will be left in the interpreter's result if interp is
+ * not NULL.
*
* Side effects:
- * The ref count of objPtr is incremented since the list now refers
- * to it. listPtr will be converted, if necessary, to a list object.
- * Also, appending the new element may cause listObj's array of element
- * pointers to grow. listPtr's old string representation, if any,
- * is invalidated.
+ * The ref count of objPtr is incremented since the list now refers to
+ * it. listPtr will be converted, if necessary, to a list object. Also,
+ * appending the new element may cause listObj's array of element
+ * pointers to grow. listPtr's old string representation, if any, is
+ * invalidated.
*
*----------------------------------------------------------------------
*/
@@ -526,9 +525,9 @@ Tcl_ListObjAppendElement(interp, listPtr, objPtr)
numRequired = numElems + 1 ;
/*
- * If there is no room in the current array of element pointers,
- * allocate a new, larger array and copy the pointers to it. If the
- * List struct is shared, allocate a new one.
+ * If there is no room in the current array of element pointers, allocate
+ * a new, larger array and copy the pointers to it. If the List struct is
+ * shared, allocate a new one.
*/
if (numRequired > listRepPtr->maxElemCount){
@@ -542,7 +541,7 @@ Tcl_ListObjAppendElement(interp, listPtr, objPtr)
if (listRepPtr->refCount > 1) {
List *oldListRepPtr = listRepPtr;
Tcl_Obj **oldElems;
-
+
listRepPtr = NewListIntRep(newMax, NULL);
if (!listRepPtr) {
Tcl_Panic("Not enough memory to allocate list");
@@ -554,7 +553,7 @@ Tcl_ListObjAppendElement(interp, listPtr, objPtr)
Tcl_IncrRefCount(elemPtrs[i]);
}
listRepPtr->elemCount = numElems;
- listRepPtr->refCount++;
+ listRepPtr->refCount++;
oldListRepPtr->refCount--;
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
} else if (newSize) {
@@ -564,8 +563,8 @@ Tcl_ListObjAppendElement(interp, listPtr, objPtr)
}
/*
- * Add objPtr to the end of listPtr's array of element
- * pointers. Increment the ref count for the (now shared) objPtr.
+ * Add objPtr to the end of listPtr's array of element pointers. Increment
+ * the ref count for the (now shared) objPtr.
*/
elemPtrs = &listRepPtr->elements;
@@ -587,20 +586,20 @@ Tcl_ListObjAppendElement(interp, listPtr, objPtr)
*
* Tcl_ListObjIndex --
*
- * This procedure returns a pointer to the index'th object from the
- * list referenced by listPtr. The first element has index 0. If index
- * is negative or greater than or equal to the number of elements in
- * the list, a NULL is returned. If listPtr is not a list object, an
- * attempt will be made to convert it to a list.
+ * This function returns a pointer to the index'th object from the list
+ * referenced by listPtr. The first element has index 0. If index is
+ * negative or greater than or equal to the number of elements in the
+ * list, a NULL is returned. If listPtr is not a list object, an attempt
+ * will be made to convert it to a list.
*
* Results:
- * The return value is normally TCL_OK; in this case objPtrPtr is set
- * to the Tcl_Obj pointer for the index'th list element or NULL if
- * index is out of range. This object should be treated as readonly and
- * its ref count is _not_ incremented; the caller must do that if it
- * holds on to the reference. If listPtr does not refer to a list and
- * can't be converted to one, TCL_ERROR is returned and an error
- * message is left in the interpreter's result if interp is not NULL.
+ * The return value is normally TCL_OK; in this case objPtrPtr is set to
+ * the Tcl_Obj pointer for the index'th list element or NULL if index is
+ * out of range. This object should be treated as readonly and its ref
+ * count is _not_ incremented; the caller must do that if it holds on to
+ * the reference. If listPtr does not refer to a list and can't be
+ * converted to one, TCL_ERROR is returned and an error message is left
+ * in the interpreter's result if interp is not NULL.
*
* Side effects:
* listPtr will be converted, if necessary, to a list object.
@@ -647,16 +646,16 @@ Tcl_ListObjIndex(interp, listPtr, index, objPtrPtr)
*
* Tcl_ListObjLength --
*
- * This procedure returns the number of elements in a list object. If
- * the object is not already a list object, an attempt will be made to
+ * This function returns the number of elements in a list object. If the
+ * object is not already a list object, an attempt will be made to
* convert it to one.
*
* Results:
- * The return value is normally TCL_OK; in this case *intPtr will be
- * set to the integer count of list elements. If listPtr does not refer
- * to a list object and the object can not be converted to one,
- * TCL_ERROR is returned and an error message will be left in
- * the interpreter's result if interp is not NULL.
+ * The return value is normally TCL_OK; in this case *intPtr will be set
+ * to the integer count of list elements. If listPtr does not refer to a
+ * list object and the object can not be converted to one, TCL_ERROR is
+ * returned and an error message will be left in the interpreter's result
+ * if interp is not NULL.
*
* Side effects:
* The possible conversion of the argument object to a list object.
@@ -696,36 +695,36 @@ Tcl_ListObjLength(interp, listPtr, intPtr)
*----------------------------------------------------------------------
*
* Tcl_ListObjReplace --
- *
- * This procedure replaces zero or more elements of the list referenced
- * by listPtr with the objects from an (objc,objv) array.
- * The objc elements of the array referenced by objv replace the
- * count elements in listPtr starting at first.
+ *
+ * This function replaces zero or more elements of the list referenced by
+ * listPtr with the objects from an (objc,objv) array. The objc elements
+ * of the array referenced by objv replace the count elements in listPtr
+ * starting at first.
*
* If the argument first is zero or negative, it refers to the first
* element. If first is greater than or equal to the number of elements
* in the list, then no elements are deleted; the new elements are
- * appended to the list. Count gives the number of elements to
- * replace. If count is zero or negative then no elements are deleted;
- * the new elements are simply inserted before first.
+ * appended to the list. Count gives the number of elements to replace.
+ * If count is zero or negative then no elements are deleted; the new
+ * elements are simply inserted before first.
*
* The argument objv refers to an array of objc pointers to the new
- * elements to be added to listPtr in place of those that were
- * deleted. If objv is NULL, no new elements are added. If listPtr is
- * not a list object, an attempt will be made to convert it to one.
+ * elements to be added to listPtr in place of those that were deleted.
+ * If objv is NULL, no new elements are added. If listPtr is not a list
+ * object, an attempt will be made to convert it to one.
*
* Results:
- * The return value is normally TCL_OK. If listPtr does
- * not refer to a list object and can not be converted to one,
- * TCL_ERROR is returned and an error message will be left in
- * the interpreter's result if interp is not NULL.
+ * The return value is normally TCL_OK. If listPtr does not refer to a
+ * list object and can not be converted to one, TCL_ERROR is returned and
+ * an error message will be left in the interpreter's result if interp is
+ * not NULL.
*
* Side effects:
- * The ref counts of the objc elements in objv are incremented since
- * the resulting list now refers to them. Similarly, the ref counts for
- * replaced objects are decremented. listPtr is converted, if
- * necessary, to a list object. listPtr's old string representation, if
- * any, is freed.
+ * The ref counts of the objc elements in objv are incremented since the
+ * resulting list now refers to them. Similarly, the ref counts for
+ * replaced objects are decremented. listPtr is converted, if necessary,
+ * to a list object. listPtr's old string representation, if any, is
+ * freed.
*
*----------------------------------------------------------------------
*/
@@ -737,8 +736,8 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
int first; /* Index of first element to replace. */
int count; /* Number of elements to replace. */
int objc; /* Number of objects to insert. */
- Tcl_Obj *CONST objv[]; /* An array of objc pointers to Tcl objects
- * to insert. */
+ Tcl_Obj *CONST objv[]; /* An array of objc pointers to Tcl objects to
+ * insert. */
{
List *listRepPtr;
register Tcl_Obj **elemPtrs;
@@ -746,7 +745,7 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
int numElems, numRequired, numAfterLast;
int start, shift, newMax, i, j, result;
int isShared;
-
+
if (Tcl_IsShared(listPtr)) {
Tcl_Panic("Tcl_ListObjReplace called with shared object");
}
@@ -758,16 +757,16 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
if (objc) {
Tcl_SetListObj(listPtr, objc, NULL);
} else {
- return TCL_OK;
+ return TCL_OK;
}
- } else {
+ } else {
result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
}
-
+
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
elemPtrs = &listRepPtr->elements;
numElems = listRepPtr->elemCount;
@@ -776,7 +775,7 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
first = 0;
}
if (first >= numElems) {
- first = numElems; /* so we'll insert after last element */
+ first = numElems; /* So we'll insert after last element. */
}
if (count < 0) {
count = 0;
@@ -784,14 +783,14 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
count = numElems - first;
}
- isShared = (listRepPtr->refCount > 1);
+ isShared = (listRepPtr->refCount > 1);
numRequired = (numElems - count + objc);
-
+
if ((numRequired <= listRepPtr->maxElemCount)
&& !isShared) {
/*
- * Can use the current List struct. First "delete" count
- * elements starting at first.
+ * Can use the current List struct. First "delete" count elements
+ * starting at first.
*/
for (j = first; j < first + count; j++) {
@@ -800,8 +799,8 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
}
/*
- * Shift the elements after the last one removed to their
- * new locations.
+ * Shift the elements after the last one removed to their new
+ * locations.
*/
start = (first + count);
@@ -811,13 +810,13 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
Tcl_Obj **src, **dst;
src = elemPtrs + start; dst = src + shift;
- memmove((VOID*) dst, (VOID*) src,
- (size_t) (numAfterLast * sizeof(Tcl_Obj*)));
+ memmove((VOID*) dst, (VOID*) src,
+ (size_t) (numAfterLast * sizeof(Tcl_Obj*)));
}
} else {
/*
- * Cannot use the current List struct - it is shared, too small,
- * or both. Allocate a new struct and insert elements into it.
+ * Cannot use the current List struct - it is shared, too small, or
+ * both. Allocate a new struct and insert elements into it.
*/
List *oldListRepPtr = listRepPtr;
@@ -828,7 +827,7 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
} else {
newMax = listRepPtr->maxElemCount;
}
-
+
listRepPtr = NewListIntRep(newMax, NULL);
if (!listRepPtr) {
Tcl_Panic("Not enough memory to allocate list");
@@ -838,11 +837,12 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
listRepPtr->refCount++;
elemPtrs = &listRepPtr->elements;
-
+
if (isShared) {
/*
* The old struct will remain in place; need new refCounts for the
- * new List struct references. Copy over only the surviving elements.
+ * new List struct references. Copy over only the surviving
+ * elements.
*/
for (i=0; i < first; i++) {
@@ -858,7 +858,7 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
oldListRepPtr->refCount--;
} else {
/*
- * The old struct will be removed; use its inherited refCounts.
+ * The old struct will be removed; use its inherited refCounts.
*/
if (first > 0) {
@@ -869,17 +869,17 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
/*
* "Delete" count elements starting at first.
*/
-
+
for (j = first; j < first + count; j++) {
victimPtr = oldPtrs[j];
TclDecrRefCount(victimPtr);
}
-
+
/*
- * Copy the elements after the last one removed, shifted to
- * their new locations.
+ * Copy the elements after the last one removed, shifted to their
+ * new locations.
*/
-
+
start = (first + count);
numAfterLast = (numElems - start);
if (numAfterLast > 0) {
@@ -895,18 +895,18 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
/*
* Insert the new elements into elemPtrs before "first".
*/
-
+
for (i=0,j=first ; i<objc ; i++,j++) {
elemPtrs[j] = objv[i];
Tcl_IncrRefCount(objv[i]);
}
-
+
/*
* Update the count of elements.
*/
-
+
listRepPtr->elemCount = numRequired;
-
+
/*
* Invalidate and free any old string representation since it no longer
* reflects the list's internal representation.
@@ -920,45 +920,43 @@ Tcl_ListObjReplace(interp, listPtr, first, count, objc, objv)
*----------------------------------------------------------------------
*
* TclLsetList --
- *
- * Core of the 'lset' command when objc == 4. Objv[2] may be
- * either a scalar index or a list of indices.
+ *
+ * Core of the 'lset' command when objc == 4. Objv[2] may be either a
+ * scalar index or a list of indices.
*
* Results:
- * Returns the new value of the list variable, or NULL if an
- * error occurs.
+ * Returns the new value of the list variable, or NULL if an error
+ * occurs.
*
* Side effects:
- * Surgery is performed on the list value to produce the
- * result.
- *
- * On entry, the reference count of the variable value does not reflect
- * any references held on the stack. The first action of this function
- * is to determine whether the object is shared, and to duplicate it if
- * it is. The reference count of the duplicate is incremented.
- * At this point, the reference count will be 1 for either case, so that
- * the object will appear to be unshared.
- *
- * If an error occurs, and the object has been duplicated, the reference
- * count on the duplicate is decremented so that it is now 0: this dismisses
- * any memory that was allocated by this procedure.
- *
- * If no error occurs, the reference count of the original object is
- * incremented if the object has not been duplicated, and nothing is
- * done to a reference count of the duplicate. Now the reference count
- * of an unduplicated object is 2 (the returned pointer, plus the one
- * stored in the variable). The reference count of a duplicate object
- * is 1, reflecting that the returned pointer is the only active
- * reference. The caller is expected to store the returned value back
- * in the variable and decrement its reference count. (INST_STORE_*
- * does exactly this.)
- *
- * Tcl_LsetFlat and related functions maintain a linked list of
- * Tcl_Obj's whose string representations must be spoilt by threading
- * via 'ptr2' of the two-pointer internal representation. On entry
- * to Tcl_LsetList, the values of 'ptr2' are immaterial; on exit,
- * the 'ptr2' field of any Tcl_Obj that has been modified is set to
- * NULL.
+ * Surgery is performed on the list value to produce the result.
+ *
+ * On entry, the reference count of the variable value does not reflect
+ * any references held on the stack. The first action of this function is
+ * to determine whether the object is shared, and to duplicate it if it
+ * is. The reference count of the duplicate is incremented. At this
+ * point, the reference count will be 1 for either case, so that the
+ * object will appear to be unshared.
+ *
+ * If an error occurs, and the object has been duplicated, the reference
+ * count on the duplicate is decremented so that it is now 0: this
+ * dismisses any memory that was allocated by this function.
+ *
+ * If no error occurs, the reference count of the original object is
+ * incremented if the object has not been duplicated, and nothing is done
+ * to a reference count of the duplicate. Now the reference count of an
+ * unduplicated object is 2 (the returned pointer, plus the one stored in
+ * the variable). The reference count of a duplicate object is 1,
+ * reflecting that the returned pointer is the only active reference.
+ * The caller is expected to store the returned value back in the
+ * variable and decrement its reference count. (INST_STORE_* does exactly
+ * this.)
+ *
+ * Tcl_LsetFlat and related functions maintain a linked list of Tcl_Obj's
+ * whose string representations must be spoilt by threading via 'ptr2' of
+ * the two-pointer internal representation. On entry to Tcl_LsetList,
+ * the values of 'ptr2' are immaterial; on exit, the 'ptr2' field of any
+ * Tcl_Obj that has been modified is set to NULL.
*
*----------------------------------------------------------------------
*/
@@ -976,11 +974,11 @@ TclLsetList(interp, listPtr, indexArgPtr, valuePtr)
int index; /* Current index in the list - discarded */
int i;
List *indexListRepPtr;
-
+
/*
- * Determine whether the index arg designates a list or a single
- * index. We have to be careful about the order of the checks to
- * avoid repeated shimmering; see TIP #22 and #23 for details.
+ * Determine whether the index arg designates a list or a single index.
+ * We have to be careful about the order of the checks to avoid repeated
+ * shimmering; see TIP #22 and #23 for details.
*/
if (indexArgPtr->typePtr != &tclListType
@@ -1002,11 +1000,11 @@ TclLsetList(interp, listPtr, indexArgPtr, valuePtr)
}
/*
- * At this point, we know that argPtr designates a well formed list,
- * and the 'else if' above has parsed it into indexCount and indices.
- * Increase the reference count of the internal rep of indexArgPtr,
- * in order to insure the validity of pointers even if indexArgPtr
- * shimmers to another type.
+ * At this point, we know that argPtr designates a well formed list, and
+ * the 'else if' above has parsed it into indexCount and indices.
+ * Increase the reference count of the internal rep of indexArgPtr, in
+ * order to insure the validity of pointers even if indexArgPtr shimmers
+ * to another type.
*/
if (indexCount) {
@@ -1015,7 +1013,6 @@ TclLsetList(interp, listPtr, indexArgPtr, valuePtr)
} else {
indexListRepPtr = NULL; /* avoid compiler warning*/
}
-
/*
* Let TclLsetFlat handle the actual lset'ting.
@@ -1025,9 +1022,9 @@ TclLsetList(interp, listPtr, indexArgPtr, valuePtr)
/*
* If we are the only users of indexListRepPtr, we free it before
- * returning.
+ * returning.
*/
-
+
if (indexCount) {
if (--indexListRepPtr->refCount <= 0) {
for (i=0; i<indexCount; i++) {
@@ -1044,44 +1041,42 @@ TclLsetList(interp, listPtr, indexArgPtr, valuePtr)
*
* TclLsetFlat --
*
- * Core of the 'lset' command when objc>=5. Objv[2], ... ,
- * objv[objc-2] contain scalar indices.
+ * Core of the 'lset' command when objc>=5. Objv[2], ... , objv[objc-2]
+ * contain scalar indices.
*
* Results:
- * Returns the new value of the list variable, or NULL if an
- * error occurs.
+ * Returns the new value of the list variable, or NULL if an error
+ * occurs.
*
* Side effects:
- * Surgery is performed on the list value to produce the
- * result.
- *
- * On entry, the reference count of the variable value does not reflect
- * any references held on the stack. The first action of this function
- * is to determine whether the object is shared, and to duplicate it if
- * it is. The reference count of the duplicate is incremented.
- * At this point, the reference count will be 1 for either case, so that
- * the object will appear to be unshared.
- *
- * If an error occurs, and the object has been duplicated, the reference
- * count on the duplicate is decremented so that it is now 0: this dismisses
- * any memory that was allocated by this procedure.
- *
- * If no error occurs, the reference count of the original object is
- * incremented if the object has not been duplicated, and nothing is
- * done to a reference count of the duplicate. Now the reference count
- * of an unduplicated object is 2 (the returned pointer, plus the one
- * stored in the variable). The reference count of a duplicate object
- * is 1, reflecting that the returned pointer is the only active
- * reference. The caller is expected to store the returned value back
- * in the variable and decrement its reference count. (INST_STORE_*
- * does exactly this.)
- *
- * Tcl_LsetList and related functions maintain a linked list of
- * Tcl_Obj's whose string representations must be spoilt by threading
- * via 'ptr2' of the two-pointer internal representation. On entry
- * to Tcl_LsetList, the values of 'ptr2' are immaterial; on exit,
- * the 'ptr2' field of any Tcl_Obj that has been modified is set to
- * NULL.
+ * Surgery is performed on the list value to produce the result.
+ *
+ * On entry, the reference count of the variable value does not reflect
+ * any references held on the stack. The first action of this function is
+ * to determine whether the object is shared, and to duplicate it if it
+ * is. The reference count of the duplicate is incremented. At this
+ * point, the reference count will be 1 for either case, so that the
+ * object will appear to be unshared.
+ *
+ * If an error occurs, and the object has been duplicated, the reference
+ * count on the duplicate is decremented so that it is now 0: this
+ * dismisses any memory that was allocated by this function.
+ *
+ * If no error occurs, the reference count of the original object is
+ * incremented if the object has not been duplicated, and nothing is done
+ * to a reference count of the duplicate. Now the reference count of an
+ * unduplicated object is 2 (the returned pointer, plus the one stored in
+ * the variable). The reference count of a duplicate object is 1,
+ * reflecting that the returned pointer is the only active reference.
+ * The caller is expected to store the returned value back in the
+ * variable and decrement its reference count. (INST_STORE_* does
+ * exactly this.)
+ *
+ * Tcl_LsetList and related functions maintain a linked list of Tcl_Obj's
+ * whose string representations must be spoilt by threading via 'ptr2' of
+ * the two-pointer internal representation. On entry to Tcl_LsetList,
+ * the values of 'ptr2' are immaterial; on exit, the 'ptr2' field of any
+ * Tcl_Obj that has been modified is set to NULL.
*
*----------------------------------------------------------------------
*/
@@ -1095,22 +1090,22 @@ TclLsetFlat(interp, listPtr, indexCount, indexArray, valuePtr)
/* Index args */
Tcl_Obj* valuePtr; /* Value arg to 'lset' */
{
- int duplicated; /* Flag == 1 if the obj has been
- * duplicated, 0 otherwise */
+ int duplicated; /* Flag == 1 if the obj has been duplicated, 0
+ * otherwise */
Tcl_Obj* retValuePtr; /* Pointer to the list to be returned */
int elemCount; /* Length of one sublist being changed */
Tcl_Obj** elemPtrs; /* Pointers to the elements of a sublist */
Tcl_Obj* subListPtr; /* Pointer to the current sublist */
int index; /* Index of the element to replace in the
* current sublist */
- Tcl_Obj* chainPtr; /* Pointer to the enclosing list of
- * the current sublist. */
+ Tcl_Obj* chainPtr; /* Pointer to the enclosing list of the
+ * current sublist. */
int result; /* Status return from library calls */
int i;
-
+
/*
- * If there are no indices, then simply return the new value,
- * counting the returned pointer as a reference
+ * If there are no indices, then simply return the new value, counting the
+ * returned pointer as a reference.
*/
if (indexCount == 0) {
@@ -1139,7 +1134,7 @@ TclLsetFlat(interp, listPtr, indexCount, indexArray, valuePtr)
chainPtr = NULL;
/*
- * Handle each index arg by diving into the appropriate sublist
+ * Handle each index arg by diving into the appropriate sublist.
*/
for (i=0 ; ; i++) {
@@ -1197,19 +1192,20 @@ TclLsetFlat(interp, listPtr, indexCount, indexArray, valuePtr)
subListPtr = Tcl_DuplicateObj(subListPtr);
result = TclListObjSetElement(interp, listPtr, index, subListPtr);
if (result != TCL_OK) {
- /*
- * We actually shouldn't be able to get here.
- * If we do, it would result in leaking subListPtr,
- * but everything's been validated already; the error
- * exit from TclListObjSetElement should never happen.
+ /*
+ * We actually shouldn't be able to get here. If we do, it
+ * would result in leaking subListPtr, but everything's been
+ * validated already; the error exit from TclListObjSetElement
+ * should never happen.
*/
+
break;
}
}
- /*
- * Chain the current sublist onto the linked list of Tcl_Obj's
- * whose string reps must be spoilt.
+ /*
+ * Chain the current sublist onto the linked list of Tcl_Obj's whose
+ * string reps must be spoilt.
*/
chainPtr = listPtr;
@@ -1258,26 +1254,23 @@ TclLsetFlat(interp, listPtr, indexCount, indexArray, valuePtr)
* Set a single element of a list to a specified value
*
* Results:
- *
- * The return value is normally TCL_OK. If listPtr does not
- * refer to a list object and cannot be converted to one, TCL_ERROR
- * is returned and an error message will be left in the interpreter
- * result if interp is not NULL. Similarly, if index designates
- * an element outside the range [0..listLength-1], where
- * listLength is the count of elements in the list object designated
- * by listPtr, TCL_ERROR is returned and an error message is left
- * in the interpreter result.
+ * The return value is normally TCL_OK. If listPtr does not refer to a
+ * list object and cannot be converted to one, TCL_ERROR is returned and
+ * an error message will be left in the interpreter result if interp is
+ * not NULL. Similarly, if index designates an element outside the range
+ * [0..listLength-1], where listLength is the count of elements in the
+ * list object designated by listPtr, TCL_ERROR is returned and an error
+ * message is left in the interpreter result.
*
* Side effects:
+ * Tcl_Panic if listPtr designates a shared object. Otherwise, attempts
+ * to convert it to a list with a non-shared internal rep. Decrements the
+ * ref count of the object at the specified index within the list,
+ * replaces with the object designated by valuePtr, and increments the
+ * ref count of the replacement object.
*
- * Tcl_Panic if listPtr designates a shared object. Otherwise,
- * attempts to convert it to a list with a non-shared internal rep.
- * Decrements the ref count of the object at the specified index within
- * the list, replaces with the object designated by valuePtr, and
- * increments the ref count of the replacement object.
- *
- * It is the caller's responsibility to invalidate the string
- * representation of the object.
+ * It is the caller's responsibility to invalidate the string
+ * representation of the object.
*
*----------------------------------------------------------------------
*/
@@ -1289,16 +1282,16 @@ TclListObjSetElement(interp, listPtr, index, valuePtr)
Tcl_Obj* listPtr; /* List object in which element should be
* stored */
int index; /* Index of element to store */
- Tcl_Obj* valuePtr; /* Tcl object to store in the designated
- * list element */
+ Tcl_Obj* valuePtr; /* Tcl object to store in the designated list
+ * element */
{
int result; /* Return value from this function */
- List* listRepPtr; /* Internal representation of the list
- * being modified */
+ List* listRepPtr; /* Internal representation of the list being
+ * modified */
Tcl_Obj** elemPtrs; /* Pointers to elements of the list */
int elemCount; /* Number of elements in the list */
int i;
-
+
/* Ensure that the listPtr parameter designates an unshared list */
if (Tcl_IsShared(listPtr)) {
@@ -1318,7 +1311,7 @@ TclListObjSetElement(interp, listPtr, index, valuePtr)
return result;
}
}
-
+
listRepPtr = (List*) listPtr->internalRep.twoPtrValue.ptr1;
elemCount = listRepPtr->elemCount;
elemPtrs = &listRepPtr->elements;
@@ -1340,7 +1333,7 @@ TclListObjSetElement(interp, listPtr, index, valuePtr)
if (listRepPtr->refCount > 1) {
List *oldListRepPtr = listRepPtr;
Tcl_Obj **oldElemPtrs = elemPtrs;
-
+
listRepPtr = NewListIntRep(listRepPtr->maxElemCount, NULL);
elemPtrs = &listRepPtr->elements;
for (i=0; i < elemCount; i++) {
@@ -1381,8 +1374,8 @@ TclListObjSetElement(interp, listPtr, index, valuePtr)
*
* Side effects:
* Frees listPtr's List* internal representation and sets listPtr's
- * internalRep.twoPtrValue.ptr1 to NULL. Decrements the ref counts
- * of all element objects, which may free them.
+ * internalRep.twoPtrValue.ptr1 to NULL. Decrements the ref counts of all
+ * element objects, which may free them.
*
*----------------------------------------------------------------------
*/
@@ -1402,9 +1395,9 @@ FreeListInternalRep(listPtr)
objPtr = elemPtrs[i];
Tcl_DecrRefCount(objPtr);
}
- ckfree((char *) listRepPtr);
+ ckfree((char *) listRepPtr);
}
-
+
listPtr->internalRep.twoPtrValue.ptr1 = NULL;
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
}
@@ -1414,14 +1407,14 @@ FreeListInternalRep(listPtr)
*
* DupListInternalRep --
*
- * Initialize the internal representation of a list Tcl_Obj to share
- * the internal representation of an existing list object.
+ * Initialize the internal representation of a list Tcl_Obj to share the
+ * internal representation of an existing list object.
*
* Results:
* None.
*
* Side effects:
- * The reference count of the List internal rep is incremented.
+ * The reference count of the List internal rep is incremented.
*
*----------------------------------------------------------------------
*/
@@ -1444,8 +1437,7 @@ DupListInternalRep(srcPtr, copyPtr)
*
* SetListFromAny --
*
- * Attempt to generate a list internal form for the Tcl object
- * "objPtr".
+ * Attempt to generate a list internal form for the Tcl object "objPtr".
*
* Results:
* The return value is TCL_OK or TCL_ERROR. If an error occurs during
@@ -1505,17 +1497,17 @@ SetListFromAny(interp, objPtr)
listRepPtr = NewListIntRep(estCount, NULL);
if(!listRepPtr) {
- Tcl_SetObjResult(interp,
- Tcl_NewStringObj("Not enough memory to allocate the list internal rep",-1));
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "Not enough memory to allocate the list internal rep", -1));
return TCL_ERROR;
}
elemPtrs = &listRepPtr->elements;
-
+
for (p = string, lenRemain = length, i = 0;
lenRemain > 0;
p = nextElem, lenRemain = (limit - nextElem), i++) {
result = TclFindElement(interp, p, lenRemain, &elemStart, &nextElem,
- &elemSize, &hasBrace);
+ &elemSize, &hasBrace);
if (result != TCL_OK) {
for (j = 0; j < i; j++) {
elemPtr = elemPtrs[j];
@@ -1554,8 +1546,8 @@ SetListFromAny(interp, objPtr)
listRepPtr->elemCount = i;
/*
- * Free the old internalRep before setting the new one. We do this as
- * late as possible to allow the conversion code, in particular
+ * Free the old internalRep before setting the new one. We do this as late
+ * as possible to allow the conversion code, in particular
* Tcl_GetStringFromObj, to use that old internalRep.
*/
@@ -1572,18 +1564,18 @@ SetListFromAny(interp, objPtr)
*
* UpdateStringOfList --
*
- * Update the string representation for a list object.
- * Note: This procedure does not invalidate an existing old string rep
- * so storage will be lost if this has not already been done.
+ * Update the string representation for a list object. Note: This
+ * function does not invalidate an existing old string rep so storage
+ * will be lost if this has not already been done.
*
* Results:
* None.
*
* Side effects:
- * The object's string is set to a valid string that results from
- * the list-to-string conversion. This string will be empty if the
- * list has no elements. The list internal representation
- * should not be NULL and we assume it is not NULL.
+ * The object's string is set to a valid string that results from the
+ * list-to-string conversion. This string will be empty if the list has
+ * no elements. The list internal representation should not be NULL and
+ * we assume it is not NULL.
*
*----------------------------------------------------------------------
*/
@@ -1600,10 +1592,10 @@ UpdateStringOfList(listPtr)
char *elem, *dst;
int length;
Tcl_Obj **elemPtrs;
-
+
/*
- * Convert each element of the list to string form and then convert it
- * to proper list element form, adding it to the result buffer.
+ * Convert each element of the list to string form and then convert it to
+ * proper list element form, adding it to the result buffer.
*/
/*
@@ -1647,3 +1639,11 @@ UpdateStringOfList(listPtr)
}
listPtr->length = dst - listPtr->bytes;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */