0000: 2f 2a 0a 20 2a 20 74 63 6c 4c 69 73 74 4f 62 6a /*. * tclListObj
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 .c --. *. *.This
0020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66 file contains f
0030: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69 6d unctions that im
0040: 70 6c 65 6d 65 6e 74 20 74 68 65 20 54 63 6c 20 plement the Tcl
0050: 6c 69 73 74 20 6f 62 6a 65 63 74 20 74 79 70 65 list object type
0060: 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 .. *. * Copyrigh
0070: 74 20 28 63 29 20 31 39 39 35 2d 31 39 39 37 20 t (c) 1995-1997
0080: 53 75 6e 20 4d 69 63 72 6f 73 79 73 74 65 6d 73 Sun Microsystems
0090: 2c 20 49 6e 63 2e 0a 20 2a 20 43 6f 70 79 72 69 , Inc.. * Copyri
00a0: 67 68 74 20 28 63 29 20 31 39 39 38 20 62 79 20 ght (c) 1998 by
00b0: 53 63 72 69 70 74 69 63 73 20 43 6f 72 70 6f 72 Scriptics Corpor
00c0: 61 74 69 6f 6e 2e 0a 20 2a 20 43 6f 70 79 72 69 ation.. * Copyri
00d0: 67 68 74 20 28 63 29 20 32 30 30 31 20 62 79 20 ght (c) 2001 by
00e0: 4b 65 76 69 6e 20 42 2e 20 4b 65 6e 6e 79 2e 20 Kevin B. Kenny.
00f0: 20 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65 All rights rese
0100: 72 76 65 64 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 rved.. *. * See
0110: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 the file "licens
0120: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 e.terms" for inf
0130: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 ormation on usag
0140: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 e and redistribu
0150: 74 69 6f 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 tion of. * this
0160: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 file, and for a
0170: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c DISCLAIMER OF AL
0180: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a L WARRANTIES.. *
0190: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c /..#include "tcl
01a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 50 72 Int.h"../*. * Pr
01b0: 6f 74 6f 74 79 70 65 73 20 66 6f 72 20 66 75 6e ototypes for fun
01c0: 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 6c ctions defined l
01d0: 61 74 65 72 20 69 6e 20 74 68 69 73 20 66 69 6c ater in this fil
01e0: 65 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 4c e:. */..static L
01f0: 69 73 74 20 2a 09 09 41 74 74 65 6d 70 74 4e 65 ist *..AttemptNe
0200: 77 4c 69 73 74 28 54 63 6c 5f 49 6e 74 65 72 70 wList(Tcl_Interp
0210: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
0220: 6a 63 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f jc,.... Tcl_O
0230: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
0240: 29 3b 0a 73 74 61 74 69 63 20 4c 69 73 74 20 2a );.static List *
0250: 09 09 4e 65 77 4c 69 73 74 49 6e 74 52 65 70 28 ..NewListIntRep(
0260: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
0270: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c j *const objv[],
0280: 20 69 6e 74 20 70 29 3b 0a 73 74 61 74 69 63 20 int p);.static
0290: 76 6f 69 64 09 09 44 75 70 4c 69 73 74 49 6e 74 void..DupListInt
02a0: 65 72 6e 61 6c 52 65 70 28 54 63 6c 5f 4f 62 6a ernalRep(Tcl_Obj
02b0: 20 2a 73 72 63 50 74 72 2c 20 54 63 6c 5f 4f 62 *srcPtr, Tcl_Ob
02c0: 6a 20 2a 63 6f 70 79 50 74 72 29 3b 0a 73 74 61 j *copyPtr);.sta
02d0: 74 69 63 20 76 6f 69 64 09 09 46 72 65 65 4c 69 tic void..FreeLi
02e0: 73 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 54 63 stInternalRep(Tc
02f0: 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 29 3b l_Obj *listPtr);
0300: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 53 65 74 .static int..Set
0310: 4c 69 73 74 46 72 6f 6d 41 6e 79 28 54 63 6c 5f ListFromAny(Tcl_
0320: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
0330: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 29 Tcl_Obj *objPtr)
0340: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 55 ;.static void..U
0350: 70 64 61 74 65 53 74 72 69 6e 67 4f 66 4c 69 73 pdateStringOfLis
0360: 74 28 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 t(Tcl_Obj *listP
0370: 74 72 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 tr);../*. * The
0380: 73 74 72 75 63 74 75 72 65 20 62 65 6c 6f 77 20 structure below
0390: 64 65 66 69 6e 65 73 20 74 68 65 20 6c 69 73 74 defines the list
03a0: 20 54 63 6c 20 6f 62 6a 65 63 74 20 74 79 70 65 Tcl object type
03b0: 20 62 79 20 6d 65 61 6e 73 20 6f 66 20 66 75 6e by means of fun
03c0: 63 74 69 6f 6e 73 0a 20 2a 20 74 68 61 74 20 63 ctions. * that c
03d0: 61 6e 20 62 65 20 69 6e 76 6f 6b 65 64 20 62 79 an be invoked by
03e0: 20 67 65 6e 65 72 69 63 20 6f 62 6a 65 63 74 20 generic object
03f0: 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 54 68 65 20 code.. *. * The
0400: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 internal represe
0410: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 6c 69 73 ntation of a lis
0420: 74 20 6f 62 6a 65 63 74 20 69 73 20 61 20 74 77 t object is a tw
0430: 6f 2d 70 6f 69 6e 74 65 72 0a 20 2a 20 72 65 70 o-pointer. * rep
0440: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 54 68 65 resentation. The
0450: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 64 first pointer d
0460: 65 73 69 67 6e 61 74 65 73 20 61 20 4c 69 73 74 esignates a List
0470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 structure that
0480: 63 6f 6e 74 61 69 6e 73 0a 20 2a 20 61 6e 20 61 contains. * an a
0490: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 rray of pointers
04a0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 to the element
04b0: 6f 62 6a 65 63 74 73 2c 20 74 6f 67 65 74 68 65 objects, togethe
04c0: 72 20 77 69 74 68 20 69 6e 74 65 67 65 72 73 20 r with integers
04d0: 74 68 61 74 0a 20 2a 20 72 65 70 72 65 73 65 6e that. * represen
04e0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6c t the current el
04f0: 65 6d 65 6e 74 20 63 6f 75 6e 74 20 61 6e 64 20 ement count and
0500: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 the allocated si
0510: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e ze of the array.
0520: 0a 20 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 . * The second p
0530: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 72 6d 61 6c ointer is normal
0540: 6c 79 20 4e 55 4c 4c 3b 20 64 75 72 69 6e 67 20 ly NULL; during
0550: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 66 75 6e execution of fun
0560: 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 0a 20 ctions in this.
0570: 2a 20 66 69 6c 65 20 74 68 61 74 20 6f 70 65 72 * file that oper
0580: 61 74 65 20 6f 6e 20 6e 65 73 74 65 64 20 73 75 ate on nested su
0590: 62 6c 69 73 74 73 2c 20 69 74 20 69 73 20 6f 63 blists, it is oc
05a0: 63 61 73 69 6f 6e 61 6c 6c 79 20 75 73 65 64 20 casionally used
05b0: 61 73 20 77 6f 72 6b 69 6e 67 0a 20 2a 20 73 74 as working. * st
05c0: 6f 72 61 67 65 20 74 6f 20 61 76 6f 69 64 20 61 orage to avoid a
05d0: 6e 20 61 75 78 69 6c 69 61 72 79 20 73 74 61 63 n auxiliary stac
05e0: 6b 2e 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 54 63 k.. */..const Tc
05f0: 6c 5f 4f 62 6a 54 79 70 65 20 74 63 6c 4c 69 73 l_ObjType tclLis
0600: 74 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 6c tType = {. "l
0610: 69 73 74 22 2c 09 09 09 2f 2a 20 6e 61 6d 65 20 ist",.../* name
0620: 2a 2f 0a 20 20 20 20 46 72 65 65 4c 69 73 74 49 */. FreeListI
0630: 6e 74 65 72 6e 61 6c 52 65 70 2c 09 2f 2a 20 66 nternalRep,./* f
0640: 72 65 65 49 6e 74 52 65 70 50 72 6f 63 20 2a 2f reeIntRepProc */
0650: 0a 20 20 20 20 44 75 70 4c 69 73 74 49 6e 74 65 . DupListInte
0660: 72 6e 61 6c 52 65 70 2c 09 09 2f 2a 20 64 75 70 rnalRep,../* dup
0670: 49 6e 74 52 65 70 50 72 6f 63 20 2a 2f 0a 20 20 IntRepProc */.
0680: 20 20 55 70 64 61 74 65 53 74 72 69 6e 67 4f 66 UpdateStringOf
0690: 4c 69 73 74 2c 09 09 2f 2a 20 75 70 64 61 74 65 List,../* update
06a0: 53 74 72 69 6e 67 50 72 6f 63 20 2a 2f 0a 20 20 StringProc */.
06b0: 20 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e 79 SetListFromAny
06c0: 09 09 2f 2a 20 73 65 74 46 72 6f 6d 41 6e 79 50 ../* setFromAnyP
06d0: 72 6f 63 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 roc */.};..#ifnd
06e0: 65 66 20 54 43 4c 5f 4d 49 4e 5f 45 4c 45 4d 45 ef TCL_MIN_ELEME
06f0: 4e 54 5f 47 52 4f 57 54 48 0a 23 64 65 66 69 6e NT_GROWTH.#defin
0700: 65 20 54 43 4c 5f 4d 49 4e 5f 45 4c 45 4d 45 4e e TCL_MIN_ELEMEN
0710: 54 5f 47 52 4f 57 54 48 20 54 43 4c 5f 4d 49 4e T_GROWTH TCL_MIN
0720: 5f 47 52 4f 57 54 48 2f 73 69 7a 65 6f 66 28 54 _GROWTH/sizeof(T
0730: 63 6c 5f 4f 62 6a 20 2a 29 0a 23 65 6e 64 69 66 cl_Obj *).#endif
0740: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0790: 2a 0a 20 2a 20 4e 65 77 4c 69 73 74 49 6e 74 52 *. * NewListIntR
07a0: 65 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 ep --. *. *.Crea
07b0: 74 65 73 20 61 20 27 4c 69 73 74 27 20 73 74 72 tes a 'List' str
07c0: 75 63 74 75 72 65 20 77 69 74 68 20 73 70 61 63 ucture with spac
07d0: 65 20 66 6f 72 20 27 6f 62 6a 63 27 20 65 6c 65 e for 'objc' ele
07e0: 6d 65 6e 74 73 2e 20 20 27 6f 62 6a 63 27 20 6d ments. 'objc' m
07f0: 75 73 74 0a 20 2a 09 62 65 20 3e 20 30 2e 20 20 ust. *.be > 0.
0800: 49 66 20 27 6f 62 6a 76 27 20 69 73 20 6e 6f 74 If 'objv' is not
0810: 20 4e 55 4c 4c 2c 20 54 68 65 20 6c 69 73 74 20 NULL, The list
0820: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 is initialized w
0830: 69 74 68 20 66 69 72 73 74 0a 20 2a 09 27 6f 62 ith first. *.'ob
0840: 6a 63 27 20 76 61 6c 75 65 73 20 69 6e 20 74 68 jc' values in th
0850: 61 74 20 61 72 72 61 79 2e 20 20 4f 74 68 65 72 at array. Other
0860: 77 69 73 65 20 74 68 65 20 6c 69 73 74 20 69 73 wise the list is
0870: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 initialized to
0880: 68 61 76 65 0a 20 2a 09 30 20 65 6c 65 6d 65 6e have. *.0 elemen
0890: 74 73 2c 20 77 69 74 68 20 73 70 61 63 65 20 74 ts, with space t
08a0: 6f 20 61 64 64 20 27 6f 62 6a 63 27 20 6d 6f 72 o add 'objc' mor
08b0: 65 2e 20 20 46 6c 61 67 20 76 61 6c 75 65 20 27 e. Flag value '
08c0: 70 27 20 69 6e 64 69 63 61 74 65 73 0a 20 2a 09 p' indicates. *.
08d0: 68 6f 77 20 74 6f 20 62 65 68 61 76 65 20 6f 6e how to behave on
08e0: 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20 failure.. *. *
08f0: 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 41 20 6e 65 Value. *. *.A ne
0900: 77 20 27 4c 69 73 74 27 20 73 74 72 75 63 74 75 w 'List' structu
0910: 72 65 20 77 69 74 68 20 72 65 66 43 6f 75 6e 74 re with refCount
0920: 20 30 2e 20 49 66 20 73 6f 6d 65 20 66 61 69 6c 0. If some fail
0930: 75 72 65 0a 20 2a 09 70 72 65 76 65 6e 74 73 20 ure. *.prevents
0940: 74 68 69 73 20 4e 55 4c 4c 20 69 73 20 72 65 74 this NULL is ret
0950: 75 72 6e 65 64 20 69 66 20 27 70 27 20 69 73 20 urned if 'p' is
0960: 30 20 2c 20 61 6e 64 20 27 54 63 6c 5f 50 61 6e 0 , and 'Tcl_Pan
0970: 69 63 27 0a 20 2a 09 69 73 20 63 61 6c 6c 65 64 ic'. *.is called
0980: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 20 if it is not..
0990: 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a 20 *. * Effect. *.
09a0: 2a 09 54 68 65 20 72 65 66 43 6f 75 6e 74 20 6f *.The refCount o
09b0: 66 20 65 61 63 68 20 76 61 6c 75 65 20 69 6e 20 f each value in
09c0: 27 6f 62 6a 76 27 20 69 73 20 69 6e 63 72 65 6d 'objv' is increm
09d0: 65 6e 74 65 64 20 61 73 20 69 74 20 69 73 20 61 ented as it is a
09e0: 64 64 65 64 0a 20 2a 09 74 6f 20 74 68 65 20 6c dded. *.to the l
09f0: 69 73 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ist.. *. *------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a40: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 4c 69 73 . */..static Lis
0a50: 74 20 2a 0a 4e 65 77 4c 69 73 74 49 6e 74 52 65 t *.NewListIntRe
0a60: 70 28 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p(. int objc,
0a70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
0a80: 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 20 20 20 20 nst objv[],.
0a90: 69 6e 74 20 70 29 0a 7b 0a 20 20 20 20 4c 69 73 int p).{. Lis
0aa0: 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b 0a 0a t *listRepPtr;..
0ab0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 3d 20 if (objc <=
0ac0: 30 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 28 0) {..Tcl_Panic(
0ad0: 22 4e 65 77 4c 69 73 74 49 6e 74 52 65 70 3a 20 "NewListIntRep:
0ae0: 65 78 70 65 63 74 73 20 70 6f 73 74 69 76 65 20 expects postive
0af0: 65 6c 65 6d 65 6e 74 20 63 6f 75 6e 74 22 29 3b element count");
0b00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
0b10: 20 20 20 20 2a 20 46 69 72 73 74 20 63 68 65 63 * First chec
0b20: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 27 64 k to see if we'd
0b30: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 74 72 overflow and tr
0b40: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e y to allocate an
0b50: 20 6f 62 6a 65 63 74 0a 20 20 20 20 20 2a 20 6c object. * l
0b60: 61 72 67 65 72 20 74 68 61 6e 20 6f 75 72 20 6d arger than our m
0b70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 emory allocator
0b80: 61 6c 6c 6f 77 73 2e 20 4e 6f 74 65 20 74 68 61 allows. Note tha
0b90: 74 20 74 68 69 73 20 69 73 20 61 63 74 75 61 6c t this is actual
0ba0: 6c 79 20 61 0a 20 20 20 20 20 2a 20 66 61 69 72 ly a. * fair
0bb0: 6c 79 20 73 6d 61 6c 6c 20 76 61 6c 75 65 20 77 ly small value w
0bc0: 68 65 6e 20 79 6f 75 27 72 65 20 6f 6e 20 61 20 hen you're on a
0bd0: 73 65 72 69 6f 75 73 20 36 34 2d 62 69 74 20 6d serious 64-bit m
0be0: 61 63 68 69 6e 65 2c 20 62 75 74 20 74 68 61 74 achine, but that
0bf0: 0a 20 20 20 20 20 2a 20 72 65 71 75 69 72 65 73 . * requires
0c00: 20 41 50 49 20 63 68 61 6e 67 65 73 20 74 6f 20 API changes to
0c10: 66 69 78 2e 20 53 65 65 20 5b 42 75 67 20 32 31 fix. See [Bug 21
0c20: 39 31 39 36 5d 20 66 6f 72 20 61 20 64 69 73 63 9196] for a disc
0c30: 75 73 73 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a ussion.. */.
0c40: 0a 20 20 20 20 69 66 20 28 28 73 69 7a 65 5f 74 . if ((size_t
0c50: 29 6f 62 6a 63 20 3e 20 4c 49 53 54 5f 4d 41 58 )objc > LIST_MAX
0c60: 29 20 7b 0a 09 69 66 20 28 70 29 20 7b 0a 09 20 ) {..if (p) {..
0c70: 20 20 20 54 63 6c 5f 50 61 6e 69 63 28 22 6d 61 Tcl_Panic("ma
0c80: 78 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 54 63 x length of a Tc
0c90: 6c 20 6c 69 73 74 20 28 25 64 20 65 6c 65 6d 65 l list (%d eleme
0ca0: 6e 74 73 29 20 65 78 63 65 65 64 65 64 22 2c 0a nts) exceeded",.
0cb0: 09 09 20 20 20 20 4c 49 53 54 5f 4d 41 58 29 3b .. LIST_MAX);
0cc0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ..}..return NULL
0cd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73 ;. }.. lis
0ce0: 74 52 65 70 50 74 72 20 3d 20 61 74 74 65 6d 70 tRepPtr = attemp
0cf0: 74 63 6b 61 6c 6c 6f 63 28 4c 49 53 54 5f 53 49 tckalloc(LIST_SI
0d00: 5a 45 28 6f 62 6a 63 29 29 3b 0a 20 20 20 20 69 ZE(objc));. i
0d10: 66 20 28 6c 69 73 74 52 65 70 50 74 72 20 3d 3d f (listRepPtr ==
0d20: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 70 29 NULL) {..if (p)
0d30: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 50 61 6e 69 {.. Tcl_Pani
0d40: 63 28 22 6c 69 73 74 20 63 72 65 61 74 69 6f 6e c("list creation
0d50: 20 66 61 69 6c 65 64 3a 20 75 6e 61 62 6c 65 20 failed: unable
0d60: 74 6f 20 61 6c 6c 6f 63 20 25 75 20 62 79 74 65 to alloc %u byte
0d70: 73 22 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f 53 s",... LIST_S
0d80: 49 5a 45 28 6f 62 6a 63 29 29 3b 0a 09 7d 0a 09 IZE(objc));..}..
0d90: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
0da0: 20 7d 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 50 }.. listRepP
0db0: 74 72 2d 3e 63 61 6e 6f 6e 69 63 61 6c 46 6c 61 tr->canonicalFla
0dc0: 67 20 3d 20 30 3b 0a 20 20 20 20 6c 69 73 74 52 g = 0;. listR
0dd0: 65 70 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20 epPtr->refCount
0de0: 3d 20 30 3b 0a 20 20 20 20 6c 69 73 74 52 65 70 = 0;. listRep
0df0: 50 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e Ptr->maxElemCoun
0e00: 74 20 3d 20 6f 62 6a 63 3b 0a 0a 20 20 20 20 69 t = objc;.. i
0e10: 66 20 28 6f 62 6a 76 29 20 7b 0a 09 54 63 6c 5f f (objv) {..Tcl_
0e20: 4f 62 6a 20 2a 2a 65 6c 65 6d 50 74 72 73 3b 0a Obj **elemPtrs;.
0e30: 09 69 6e 74 20 69 3b 0a 0a 09 6c 69 73 74 52 65 .int i;...listRe
0e40: 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 20 pPtr->elemCount
0e50: 3d 20 6f 62 6a 63 3b 0a 09 65 6c 65 6d 50 74 72 = objc;..elemPtr
0e60: 73 20 3d 20 26 6c 69 73 74 52 65 70 50 74 72 2d s = &listRepPtr-
0e70: 3e 65 6c 65 6d 65 6e 74 73 3b 0a 09 66 6f 72 20 >elements;..for
0e80: 28 69 20 3d 20 30 3b 20 20 69 20 3c 20 6f 62 6a (i = 0; i < obj
0e90: 63 3b 20 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 c; i++) {..
0ea0: 65 6c 65 6d 50 74 72 73 5b 69 5d 20 3d 20 6f 62 elemPtrs[i] = ob
0eb0: 6a 76 5b 69 5d 3b 0a 09 20 20 20 20 54 63 6c 5f jv[i];.. Tcl_
0ec0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 65 6c 65 IncrRefCount(ele
0ed0: 6d 50 74 72 73 5b 69 5d 29 3b 0a 09 7d 0a 20 20 mPtrs[i]);..}.
0ee0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 } else {..list
0ef0: 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e RepPtr->elemCoun
0f00: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 t = 0;. }.
0f10: 20 72 65 74 75 72 6e 20 6c 69 73 74 52 65 70 50 return listRepP
0f20: 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d tr;.}.../*. *---
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 20 41 74 74 65 6d ---. *. * Attem
0f80: 70 74 4e 65 77 4c 69 73 74 20 2d 2d 0a 20 2a 0a ptNewList --. *.
0f90: 20 2a 09 4c 69 6b 65 20 4e 65 77 4c 69 73 74 49 *.Like NewListI
0fa0: 6e 74 52 65 70 2c 20 62 75 74 20 61 64 64 69 74 ntRep, but addit
0fb0: 69 6f 6e 61 6c 6c 79 20 73 65 74 73 20 61 6e 20 ionally sets an
0fc0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e error message on
0fd0: 20 66 61 69 6c 75 72 65 2e 20 0a 20 2a 20 0a 20 failure. . * .
0fe0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
1030: 74 69 63 20 4c 69 73 74 20 2a 0a 41 74 74 65 6d tic List *.Attem
1040: 70 74 4e 65 77 4c 69 73 74 28 0a 20 20 20 20 54 ptNewList(. T
1050: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1060: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
1070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
1080: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
1090: 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50 List *listRepP
10a0: 74 72 20 3d 20 4e 65 77 4c 69 73 74 49 6e 74 52 tr = NewListIntR
10b0: 65 70 28 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 30 ep(objc, objv, 0
10c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 );.. if (inte
10d0: 72 70 20 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 69 rp != NULL && li
10e0: 73 74 52 65 70 50 74 72 20 3d 3d 20 4e 55 4c 4c stRepPtr == NULL
10f0: 29 20 7b 0a 09 69 66 20 28 6f 62 6a 63 20 3e 20 ) {..if (objc >
1100: 4c 49 53 54 5f 4d 41 58 29 20 7b 0a 09 20 20 20 LIST_MAX) {..
1110: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
1120: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
1130: 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 jPrintf(... "
1140: 6d 61 78 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 max length of a
1150: 54 63 6c 20 6c 69 73 74 20 28 25 64 20 65 6c 65 Tcl list (%d ele
1160: 6d 65 6e 74 73 29 20 65 78 63 65 65 64 65 64 22 ments) exceeded"
1170: 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f 4d 41 58 ,... LIST_MAX
1180: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ));..} else {..
1190: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
11a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
11b0: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 ObjPrintf(...
11c0: 20 22 6c 69 73 74 20 63 72 65 61 74 69 6f 6e 20 "list creation
11d0: 66 61 69 6c 65 64 3a 20 75 6e 61 62 6c 65 20 74 failed: unable t
11e0: 6f 20 61 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 o alloc %u bytes
11f0: 22 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f 53 49 ",... LIST_SI
1200: 5a 45 28 6f 62 6a 63 29 29 29 3b 0a 09 7d 0a 09 ZE(objc)));..}..
1210: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
1220: 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 (interp, "TCL",
1230: 22 4d 45 4d 4f 52 59 22 2c 20 4e 55 4c 4c 29 3b "MEMORY", NULL);
1240: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
1250: 6e 20 6c 69 73 74 52 65 70 50 74 72 3b 0a 7d 0a n listRepPtr;.}.
1260: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12b0: 0a 20 2a 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f . * Tcl_NewListO
12c0: 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 bj --. *. *.Crea
12d0: 74 65 73 20 61 20 6e 65 77 20 6c 69 73 74 20 6f tes a new list o
12e0: 62 6a 65 63 74 20 61 6e 64 20 61 64 64 73 20 76 bject and adds v
12f0: 61 6c 75 65 73 20 74 6f 20 69 74 2e 20 57 68 65 alues to it. Whe
1300: 6e 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 20 n TCL_MEM_DEBUG
1310: 69 73 0a 20 2a 09 64 65 66 69 6e 65 64 2c 20 27 is. *.defined, '
1320: 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74 4f 62 6a Tcl_DbNewListObj
1330: 27 20 69 73 20 63 61 6c 6c 65 64 20 69 6e 73 74 ' is called inst
1340: 65 61 64 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 ead.. *. * Value
1350: 0a 20 2a 0a 20 2a 09 41 20 6e 65 77 20 6c 69 73 . *. *.A new lis
1360: 74 20 27 54 63 6c 5f 4f 62 6a 27 20 74 6f 20 77 t 'Tcl_Obj' to w
1370: 68 69 63 68 20 69 73 20 61 70 70 65 6e 64 65 64 hich is appended
1380: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 27 6f 62 values from 'ob
1390: 6a 76 27 2c 20 6f 72 20 69 66 0a 20 2a 09 27 6f jv', or if. *.'o
13a0: 62 6a 63 27 20 69 73 20 6c 65 73 73 20 74 68 61 bjc' is less tha
13b0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 n or equal to ze
13c0: 72 6f 2c 20 61 20 6c 69 73 74 20 27 54 63 6c 5f ro, a list 'Tcl_
13d0: 4f 62 6a 27 20 68 61 76 69 6e 67 20 6e 6f 0a 20 Obj' having no.
13e0: 2a 09 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 65 *.elements. The
13f0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e string represen
1400: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 tation of the ne
1410: 77 20 27 54 63 6c 5f 4f 62 6a 27 20 69 73 20 73 w 'Tcl_Obj' is s
1420: 65 74 20 74 6f 0a 20 2a 09 4e 55 4c 4c 2e 20 20 et to. *.NULL.
1430: 54 68 65 20 72 65 66 43 6f 75 6e 74 20 6f 66 20 The refCount of
1440: 74 68 65 20 6c 69 73 74 20 69 73 20 30 2e 0a 20 the list is 0..
1450: 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a 20 *. * Effect. *.
1460: 2a 09 54 68 65 20 72 65 66 43 6f 75 6e 74 20 6f *.The refCount o
1470: 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 73 20 f each elements
1480: 69 6e 20 27 6f 62 6a 76 27 20 69 73 20 69 6e 63 in 'objv' is inc
1490: 72 65 6d 65 6e 74 65 64 20 61 73 20 69 74 20 69 remented as it i
14a0: 73 20 61 64 64 65 64 0a 20 2a 09 74 6f 20 74 68 s added. *.to th
14b0: 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d e list.. *. *---
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1500: 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 ---. */..#ifdef
1510: 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 23 75 TCL_MEM_DEBUG.#u
1520: 6e 64 65 66 20 54 63 6c 5f 4e 65 77 4c 69 73 74 ndef Tcl_NewList
1530: 4f 62 6a 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 Obj..Tcl_Obj *.T
1540: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 0a 20 cl_NewListObj(.
1550: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f int objc,.../
1560: 2a 20 43 6f 75 6e 74 20 6f 66 20 6f 62 6a 65 63 * Count of objec
1570: 74 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 ts referenced by
1580: 20 6f 62 6a 76 2e 20 2a 2f 0a 20 20 20 20 54 63 objv. */. Tc
1590: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
15a0: 76 5b 5d 29 09 2f 2a 20 41 6e 20 61 72 72 61 79 v[])./* An array
15b0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 of pointers to
15c0: 54 63 6c 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a Tcl objects. */.
15d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c {. return Tcl
15e0: 5f 44 62 4e 65 77 4c 69 73 74 4f 62 6a 28 6f 62 _DbNewListObj(ob
15f0: 6a 63 2c 20 6f 62 6a 76 2c 20 22 75 6e 6b 6e 6f jc, objv, "unkno
1600: 77 6e 22 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6c 73 wn", 0);.}..#els
1610: 65 20 2f 2a 20 69 66 20 6e 6f 74 20 54 43 4c 5f e /* if not TCL_
1620: 4d 45 4d 5f 44 45 42 55 47 20 2a 2f 0a 0a 54 63 MEM_DEBUG */..Tc
1630: 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 5f 4e 65 77 4c l_Obj *.Tcl_NewL
1640: 69 73 74 4f 62 6a 28 0a 20 20 20 20 69 6e 74 20 istObj(. int
1650: 6f 62 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 objc,.../* Count
1660: 20 6f 66 20 6f 62 6a 65 63 74 73 20 72 65 66 65 of objects refe
1670: 72 65 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 renced by objv.
1680: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
1690: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a const objv[])./*
16a0: 20 41 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 An array of poi
16b0: 6e 74 65 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a nters to Tcl obj
16c0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4c ects. */.{. L
16d0: 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b ist *listRepPtr;
16e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 . Tcl_Obj *li
16f0: 73 74 50 74 72 3b 0a 0a 20 20 20 20 54 63 6c 4e stPtr;.. TclN
1700: 65 77 4f 62 6a 28 6c 69 73 74 50 74 72 29 3b 0a ewObj(listPtr);.
1710: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 3d . if (objc <=
1720: 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 6c 69 0) {..return li
1730: 73 74 50 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 stPtr;. }..
1740: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 /*. * Crea
1750: 74 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 te the internal
1760: 72 65 70 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 rep.. */..
1770: 20 20 6c 69 73 74 52 65 70 50 74 72 20 3d 20 4e listRepPtr = N
1780: 65 77 4c 69 73 74 49 6e 74 52 65 70 28 6f 62 6a ewListIntRep(obj
1790: 63 2c 20 6f 62 6a 76 2c 20 31 29 3b 0a 0a 20 20 c, objv, 1);..
17a0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20 /*. * Now
17b0: 63 72 65 61 74 65 20 74 68 65 20 6f 62 6a 65 63 create the objec
17c0: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 t.. */..
17d0: 54 63 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72 TclInvalidateStr
17e0: 69 6e 67 52 65 70 28 6c 69 73 74 50 74 72 29 3b ingRep(listPtr);
17f0: 0a 20 20 20 20 4c 69 73 74 53 65 74 49 6e 74 52 . ListSetIntR
1800: 65 70 28 6c 69 73 74 50 74 72 2c 20 6c 69 73 74 ep(listPtr, list
1810: 52 65 70 50 74 72 29 3b 0a 20 20 20 20 72 65 74 RepPtr);. ret
1820: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 23 urn listPtr;.}.#
1830: 65 6e 64 69 66 20 2f 2a 20 69 66 20 54 43 4c 5f endif /* if TCL_
1840: 4d 45 4d 5f 44 45 42 55 47 20 2a 2f 0a 0c 0a 2f MEM_DEBUG */.../
1850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
18a0: 20 20 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74 4f Tcl_DbNewListO
18b0: 62 6a 20 2d 2d 0a 20 2a 20 0a 20 2a 09 4c 69 6b bj --. * . *.Lik
18c0: 65 20 27 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 e 'Tcl_NewListOb
18d0: 6a 27 2c 20 62 75 74 20 69 74 20 63 61 6c 6c 73 j', but it calls
18e0: 20 54 63 6c 5f 44 62 43 6b 61 6c 6c 6f 63 20 64 Tcl_DbCkalloc d
18f0: 69 72 65 63 74 6c 79 20 77 69 74 68 20 74 68 65 irectly with the
1900: 0a 20 2a 09 66 69 6c 65 20 6e 61 6d 65 20 61 6e . *.file name an
1910: 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 66 72 d line number fr
1920: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 2e 20 20 om its caller.
1930: 54 68 69 73 20 73 69 6d 70 6c 69 66 69 65 73 20 This simplifies
1940: 64 65 62 75 67 67 69 6e 67 0a 20 2a 09 73 69 6e debugging. *.sin
1950: 63 65 20 74 68 65 20 5b 6d 65 6d 6f 72 79 20 61 ce the [memory a
1960: 63 74 69 76 65 5d 20 63 6f 6d 6d 61 6e 64 20 77 ctive] command w
1970: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 63 ill report the c
1980: 6f 72 72 65 63 74 20 66 69 6c 65 0a 20 2a 09 6e orrect file. *.n
1990: 61 6d 65 20 61 6e 64 20 6c 69 6e 65 20 6e 75 6d ame and line num
19a0: 62 65 72 20 77 68 65 6e 20 72 65 70 6f 72 74 69 ber when reporti
19b0: 6e 67 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 ng objects that
19c0: 68 61 76 65 6e 27 74 20 62 65 65 6e 20 66 72 65 haven't been fre
19d0: 65 64 2e 0a 20 2a 20 0a 20 2a 09 57 68 65 6e 20 ed.. * . *.When
19e0: 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 20 69 73 TCL_MEM_DEBUG is
19f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 27 54 not defined, 'T
1a00: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 27 20 69 cl_NewListObj' i
1a10: 73 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 s called instead
1a20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1a70: 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 /..#ifdef TCL_ME
1a80: 4d 5f 44 45 42 55 47 0a 0a 54 63 6c 5f 4f 62 6a M_DEBUG..Tcl_Obj
1a90: 20 2a 0a 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74 *.Tcl_DbNewList
1aa0: 4f 62 6a 28 0a 20 20 20 20 69 6e 74 20 6f 62 6a Obj(. int obj
1ab0: 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 c,.../* Count of
1ac0: 20 6f 62 6a 65 63 74 73 20 72 65 66 65 72 65 6e objects referen
1ad0: 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 2a 2f 0a ced by objv. */.
1ae0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
1af0: 73 74 20 6f 62 6a 76 5b 5d 2c 09 2f 2a 20 41 6e st objv[],./* An
1b00: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 array of pointe
1b10: 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a 65 63 74 rs to Tcl object
1b20: 73 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 s. */. const
1b30: 63 68 61 72 20 2a 66 69 6c 65 2c 09 09 2f 2a 20 char *file,../*
1b40: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 The name of the
1b50: 73 6f 75 72 63 65 20 66 69 6c 65 20 63 61 6c 6c source file call
1b60: 69 6e 67 20 74 68 69 73 0a 09 09 09 09 20 2a 20 ing this..... *
1b70: 66 75 6e 63 74 69 6f 6e 3b 20 75 73 65 64 20 66 function; used f
1b80: 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 2a 2f or debugging. */
1b90: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 29 09 09 . int line)..
1ba0: 09 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 ./* Line number
1bb0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 in the source fi
1bc0: 6c 65 3b 20 75 73 65 64 20 66 6f 72 0a 09 09 09 le; used for....
1bd0: 09 20 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 2a . * debugging. *
1be0: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 /.{. Tcl_Obj
1bf0: 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 4c 69 *listPtr;. Li
1c00: 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b 0a st *listRepPtr;.
1c10: 0a 20 20 20 20 54 63 6c 44 62 4e 65 77 4f 62 6a . TclDbNewObj
1c20: 28 6c 69 73 74 50 74 72 2c 20 66 69 6c 65 2c 20 (listPtr, file,
1c30: 6c 69 6e 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 line);.. if (
1c40: 6f 62 6a 63 20 3c 3d 20 30 29 20 7b 0a 09 72 65 objc <= 0) {..re
1c50: 74 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 20 20 turn listPtr;.
1c60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
1c70: 20 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6e * Create the in
1c80: 74 65 72 6e 61 6c 20 72 65 70 2e 0a 20 20 20 20 ternal rep..
1c90: 20 2a 2f 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 */.. listRep
1ca0: 50 74 72 20 3d 20 4e 65 77 4c 69 73 74 49 6e 74 Ptr = NewListInt
1cb0: 52 65 70 28 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 Rep(objc, objv,
1cc0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 1);.. /*.
1cd0: 20 2a 20 4e 6f 77 20 63 72 65 61 74 65 20 74 68 * Now create th
1ce0: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 20 2a e object.. *
1cf0: 2f 0a 0a 20 20 20 20 54 63 6c 49 6e 76 61 6c 69 /.. TclInvali
1d00: 64 61 74 65 53 74 72 69 6e 67 52 65 70 28 6c 69 dateStringRep(li
1d10: 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 69 73 74 stPtr);. List
1d20: 53 65 74 49 6e 74 52 65 70 28 6c 69 73 74 50 74 SetIntRep(listPt
1d30: 72 2c 20 6c 69 73 74 52 65 70 50 74 72 29 3b 0a r, listRepPtr);.
1d40: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74 . return list
1d50: 50 74 72 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a Ptr;.}..#else /*
1d60: 20 69 66 20 6e 6f 74 20 54 43 4c 5f 4d 45 4d 5f if not TCL_MEM_
1d70: 44 45 42 55 47 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 DEBUG */..Tcl_Ob
1d80: 6a 20 2a 0a 54 63 6c 5f 44 62 4e 65 77 4c 69 73 j *.Tcl_DbNewLis
1d90: 74 4f 62 6a 28 0a 20 20 20 20 69 6e 74 20 6f 62 tObj(. int ob
1da0: 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 20 6f jc,.../* Count o
1db0: 66 20 6f 62 6a 65 63 74 73 20 72 65 66 65 72 65 f objects refere
1dc0: 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 2a 2f nced by objv. */
1dd0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
1de0: 6e 73 74 20 6f 62 6a 76 5b 5d 2c 09 2f 2a 20 41 nst objv[],./* A
1df0: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 n array of point
1e00: 65 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a 65 63 ers to Tcl objec
1e10: 74 73 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ts. */. const
1e20: 20 63 68 61 72 20 2a 66 69 6c 65 2c 09 09 2f 2a char *file,../*
1e30: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 The name of the
1e40: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 63 61 6c source file cal
1e50: 6c 69 6e 67 20 74 68 69 73 0a 09 09 09 09 20 2a ling this..... *
1e60: 20 66 75 6e 63 74 69 6f 6e 3b 20 75 73 65 64 20 function; used
1e70: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 2a for debugging. *
1e80: 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 29 09 /. int line).
1e90: 09 09 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 ../* Line number
1ea0: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 in the source f
1eb0: 69 6c 65 3b 20 75 73 65 64 20 66 6f 72 0a 09 09 ile; used for...
1ec0: 09 09 20 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 .. * debugging.
1ed0: 2a 2f 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 */.{. return
1ee0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6f Tcl_NewListObj(o
1ef0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 bjc, objv);.}.#e
1f00: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 4d 45 4d 5f ndif /* TCL_MEM_
1f10: 44 45 42 55 47 20 2a 2f 0a 0c 0a 2f 2a 0a 20 2a DEBUG */.../*. *
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f60: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
1f70: 5f 53 65 74 4c 69 73 74 4f 62 6a 20 2d 2d 0a 20 _SetListObj --.
1f80: 2a 0a 20 2a 09 4c 69 6b 65 20 27 54 63 6c 5f 4e *. *.Like 'Tcl_N
1f90: 65 77 4c 69 73 74 4f 62 6a 27 2c 20 62 75 74 20 ewListObj', but
1fa0: 6f 70 65 72 61 74 65 73 20 6f 6e 20 61 6e 20 65 operates on an e
1fb0: 78 69 73 74 69 6e 67 20 27 54 63 6c 5f 4f 62 6a xisting 'Tcl_Obj
1fc0: 27 69 6e 73 74 65 61 64 20 6f 66 0a 20 2a 09 63 'instead of. *.c
1fd0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e reating a new on
1fe0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2030: 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 5f 53 65 74 */..void.Tcl_Set
2040: 4c 69 73 74 4f 62 6a 28 0a 20 20 20 20 54 63 6c ListObj(. Tcl
2050: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 09 09 2f _Obj *objPtr,../
2060: 2a 20 4f 62 6a 65 63 74 20 77 68 6f 73 65 20 69 * Object whose i
2070: 6e 74 65 72 6e 61 6c 20 72 65 70 20 74 6f 20 69 nternal rep to i
2080: 6e 69 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 nit. */. int
2090: 6f 62 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 objc,.../* Count
20a0: 20 6f 66 20 6f 62 6a 65 63 74 73 20 72 65 66 65 of objects refe
20b0: 72 65 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 renced by objv.
20c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
20d0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a const objv[])./*
20e0: 20 41 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 An array of poi
20f0: 6e 74 65 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a nters to Tcl obj
2100: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4c ects. */.{. L
2110: 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b ist *listRepPtr;
2120: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 73 .. if (Tcl_Is
2130: 53 68 61 72 65 64 28 6f 62 6a 50 74 72 29 29 20 Shared(objPtr))
2140: 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 28 22 25 73 {..Tcl_Panic("%s
2150: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 73 68 61 called with sha
2160: 72 65 64 20 6f 62 6a 65 63 74 22 2c 20 22 54 63 red object", "Tc
2170: 6c 5f 53 65 74 4c 69 73 74 4f 62 6a 22 29 3b 0a l_SetListObj");.
2180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
2190: 20 20 20 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c * Free any ol
21a0: 64 20 73 74 72 69 6e 67 20 72 65 70 20 61 6e 64 d string rep and
21b0: 20 61 6e 79 20 69 6e 74 65 72 6e 61 6c 20 72 65 any internal re
21c0: 70 20 66 6f 72 20 74 68 65 20 6f 6c 64 20 74 79 p for the old ty
21d0: 70 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 pe.. */..
21e0: 20 54 63 6c 46 72 65 65 49 6e 74 52 65 70 28 6f TclFreeIntRep(o
21f0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 49 bjPtr);. TclI
2200: 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 52 nvalidateStringR
2210: 65 70 28 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 ep(objPtr);..
2220: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 74 /*. * Set t
2230: 68 65 20 6f 62 6a 65 63 74 27 73 20 74 79 70 65 he object's type
2240: 20 74 6f 20 22 6c 69 73 74 22 20 61 6e 64 20 69 to "list" and i
2250: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e nitialize the in
2260: 74 65 72 6e 61 6c 20 72 65 70 2e 0a 20 20 20 20 ternal rep..
2270: 20 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 * However, if t
2280: 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6c 65 6d here are no elem
2290: 65 6e 74 73 20 74 6f 20 70 75 74 20 69 6e 20 74 ents to put in t
22a0: 68 65 20 6c 69 73 74 2c 20 6a 75 73 74 20 67 69 he list, just gi
22b0: 76 65 20 74 68 65 0a 20 20 20 20 20 2a 20 6f 62 ve the. * ob
22c0: 6a 65 63 74 20 61 6e 20 65 6d 70 74 79 20 73 74 ject an empty st
22d0: 72 69 6e 67 20 72 65 70 20 61 6e 64 20 61 20 4e ring rep and a N
22e0: 55 4c 4c 20 74 79 70 65 2e 0a 20 20 20 20 20 2a ULL type.. *
22f0: 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 /.. if (objc
2300: 3e 20 30 29 20 7b 0a 09 6c 69 73 74 52 65 70 50 > 0) {..listRepP
2310: 74 72 20 3d 20 4e 65 77 4c 69 73 74 49 6e 74 52 tr = NewListIntR
2320: 65 70 28 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 31 ep(objc, objv, 1
2330: 29 3b 0a 09 4c 69 73 74 53 65 74 49 6e 74 52 65 );..ListSetIntRe
2340: 70 28 6f 62 6a 50 74 72 2c 20 6c 69 73 74 52 65 p(objPtr, listRe
2350: 70 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 pPtr);. } els
2360: 65 20 7b 0a 09 6f 62 6a 50 74 72 2d 3e 62 79 74 e {..objPtr->byt
2370: 65 73 20 3d 20 74 63 6c 45 6d 70 74 79 53 74 72 es = tclEmptyStr
2380: 69 6e 67 52 65 70 3b 0a 09 6f 62 6a 50 74 72 2d ingRep;..objPtr-
2390: 3e 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 >length = 0;.
23a0: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d }.}.../*. *----
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23f0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4c 69 73 74 --. *. * TclList
2400: 4f 62 6a 43 6f 70 79 20 2d 2d 0a 20 2a 0a 20 2a ObjCopy --. *. *
2410: 09 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 27 .Creates a new '
2420: 54 63 6c 5f 4f 62 6a 27 20 77 68 69 63 68 20 69 Tcl_Obj' which i
2430: 73 20 61 20 70 75 72 65 20 63 6f 70 79 20 6f 66 s a pure copy of
2440: 20 61 20 6c 69 73 74 20 76 61 6c 75 65 2e 20 54 a list value. T
2450: 68 69 73 0a 20 2a 09 70 72 6f 76 69 64 65 73 20 his. *.provides
2460: 66 6f 72 20 74 68 65 20 43 20 6c 65 76 65 6c 20 for the C level
2470: 61 20 63 6f 75 6e 74 65 72 70 61 72 74 20 6f 66 a counterpart of
2480: 20 74 68 65 20 5b 6c 72 61 6e 67 65 20 24 6c 69 the [lrange $li
2490: 73 74 20 30 20 65 6e 64 5d 0a 20 2a 09 63 6f 6d st 0 end]. *.com
24a0: 6d 61 6e 64 2c 20 77 68 69 6c 65 20 75 73 69 6e mand, while usin
24b0: 67 20 69 6e 74 65 72 6e 61 6c 73 20 64 65 74 61 g internals deta
24c0: 69 6c 73 20 74 6f 20 62 65 20 61 73 20 65 66 66 ils to be as eff
24d0: 69 63 69 65 6e 74 20 61 73 20 70 6f 73 73 69 62 icient as possib
24e0: 6c 65 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a le.. *. * Value.
24f0: 20 2a 0a 20 2a 09 54 68 65 20 61 64 64 72 65 73 *. *.The addres
2500: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 27 54 63 s of the new 'Tc
2510: 6c 5f 4f 62 6a 27 20 77 68 69 63 68 20 73 68 61 l_Obj' which sha
2520: 72 65 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c res its internal
2530: 0a 20 2a 09 72 65 70 72 65 73 65 6e 74 61 74 69 . *.representati
2540: 6f 6e 20 77 69 74 68 20 27 6c 69 73 74 50 74 72 on with 'listPtr
2550: 27 2c 20 61 6e 64 20 77 68 6f 73 65 20 72 65 66 ', and whose ref
2560: 43 6f 75 6e 74 20 69 73 20 30 2e 20 20 49 66 20 Count is 0. If
2570: 27 6c 69 73 74 50 74 72 27 0a 20 2a 09 69 73 20 'listPtr'. *.is
2580: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 6c not actually a l
2590: 69 73 74 2c 20 74 68 65 20 76 61 6c 75 65 20 69 ist, the value i
25a0: 73 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 6e 20 65 s NULL, and an e
25b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
25c0: 6c 65 66 74 0a 20 2a 09 69 6e 20 27 69 6e 74 65 left. *.in 'inte
25d0: 72 70 27 20 69 66 20 69 74 20 69 73 20 6e 6f 74 rp' if it is not
25e0: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 66 66 NULL.. *. * Eff
25f0: 65 63 74 0a 20 2a 0a 20 2a 09 27 6c 69 73 74 50 ect. *. *.'listP
2600: 74 72 27 20 69 73 20 63 6f 6e 76 65 72 74 65 64 tr' is converted
2610: 20 74 6f 20 61 20 6c 69 73 74 20 69 66 20 69 74 to a list if it
2620: 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 isn't one alrea
2630: 64 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d dy.. *. *-------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2680: 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 */..Tcl_Obj *.T
2690: 63 6c 4c 69 73 74 4f 62 6a 43 6f 70 79 28 0a 20 clListObjCopy(.
26a0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
26b0: 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20 nterp,../* Used
26c0: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 to report errors
26d0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f if not NULL. */
26e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 . Tcl_Obj *li
26f0: 73 74 50 74 72 29 09 09 2f 2a 20 4c 69 73 74 20 stPtr)../* List
2700: 6f 62 6a 65 63 74 20 66 6f 72 20 77 68 69 63 68 object for which
2710: 20 61 6e 20 65 6c 65 6d 65 6e 74 20 61 72 72 61 an element arra
2720: 79 20 69 73 0a 09 09 09 09 20 2a 20 74 6f 20 62 y is..... * to b
2730: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 7b e returned. */.{
2740: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
2750: 70 79 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 pyPtr;.. if (
2760: 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 50 74 72 listPtr->typePtr
2770: 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 79 70 65 != &tclListType
2780: 29 20 7b 0a 09 69 66 20 28 53 65 74 4c 69 73 74 ) {..if (SetList
2790: 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20 FromAny(interp,
27a0: 6c 69 73 74 50 74 72 29 20 21 3d 20 54 43 4c 5f listPtr) != TCL_
27b0: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
27c0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
27d0: 0a 0a 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a 28 .. TclNewObj(
27e0: 63 6f 70 79 50 74 72 29 3b 0a 20 20 20 20 54 63 copyPtr);. Tc
27f0: 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e lInvalidateStrin
2800: 67 52 65 70 28 63 6f 70 79 50 74 72 29 3b 0a 20 gRep(copyPtr);.
2810: 20 20 20 44 75 70 4c 69 73 74 49 6e 74 65 72 6e DupListIntern
2820: 61 6c 52 65 70 28 6c 69 73 74 50 74 72 2c 20 63 alRep(listPtr, c
2830: 6f 70 79 50 74 72 29 3b 0a 20 20 20 20 72 65 74 opyPtr);. ret
2840: 75 72 6e 20 63 6f 70 79 50 74 72 3b 0a 7d 0a 0c urn copyPtr;.}..
2850: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
28a0: 20 2a 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 * Tcl_ListObjGe
28b0: 74 45 6c 65 6d 65 6e 74 73 20 2d 2d 0a 20 2a 0a tElements --. *.
28c0: 20 2a 09 52 65 74 72 65 69 76 65 20 74 68 65 20 *.Retreive the
28d0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 20 6c 69 elements in a li
28e0: 73 74 20 27 54 63 6c 5f 4f 62 6a 27 2e 0a 20 2a st 'Tcl_Obj'.. *
28f0: 0a 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 . * Value. *. *.
2900: 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 20 20 20 TCL_OK. *. *.
2910: 20 41 20 63 6f 75 6e 74 20 6f 66 20 6c 69 73 74 A count of list
2920: 20 65 6c 65 6d 65 6e 74 73 20 69 73 20 73 74 6f elements is sto
2930: 72 65 64 2c 20 27 6f 62 6a 63 50 74 72 27 2c 20 red, 'objcPtr',
2940: 41 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f And a pointer to
2950: 20 74 68 65 0a 20 2a 09 20 20 20 20 61 72 72 61 the. *. arra
2960: 79 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e y of elements in
2970: 20 74 68 65 20 6c 69 73 74 20 69 73 20 73 74 6f the list is sto
2980: 72 65 64 20 69 6e 20 27 6f 62 6a 76 50 74 72 27 red in 'objvPtr'
2990: 2e 0a 20 2a 0a 20 2a 09 20 20 20 20 54 68 65 20 .. *. *. The
29a0: 65 6c 65 6d 65 6e 74 73 20 61 63 63 65 73 73 69 elements accessi
29b0: 62 6c 65 20 76 69 61 20 27 6f 62 6a 76 50 74 72 ble via 'objvPtr
29c0: 27 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 ' should be trea
29d0: 74 65 64 20 61 73 20 72 65 61 64 6f 6e 6c 79 0a ted as readonly.
29e0: 20 2a 09 20 20 20 20 61 6e 64 20 74 68 65 20 72 *. and the r
29f0: 65 66 43 6f 75 6e 74 20 66 6f 72 20 65 61 63 68 efCount for each
2a00: 20 6f 62 6a 65 63 74 20 69 73 20 5f 6e 6f 74 5f object is _not_
2a10: 20 69 6e 63 72 65 6d 65 6e 74 65 64 3b 20 74 68 incremented; th
2a20: 65 20 63 61 6c 6c 65 72 0a 20 2a 09 20 20 20 20 e caller. *.
2a30: 6d 75 73 74 20 64 6f 20 74 68 61 74 20 69 66 20 must do that if
2a40: 69 74 20 68 6f 6c 64 73 20 6f 6e 20 74 6f 20 61 it holds on to a
2a50: 20 72 65 66 65 72 65 6e 63 65 2e 20 46 75 72 74 reference. Furt
2a60: 68 65 72 6d 6f 72 65 2c 20 74 68 65 0a 20 2a 09 hermore, the. *.
2a70: 20 20 20 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 pointer and
2a80: 6c 65 6e 67 74 68 20 72 65 74 75 72 6e 65 64 20 length returned
2a90: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e by this function
2aa0: 20 6d 61 79 20 63 68 61 6e 67 65 20 61 73 20 73 may change as s
2ab0: 6f 6f 6e 20 61 73 0a 20 2a 09 20 20 20 20 61 6e oon as. *. an
2ac0: 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 y function is ca
2ad0: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6c 69 73 74 lled on the list
2ae0: 20 6f 62 6a 65 63 74 2e 20 42 65 20 63 61 72 65 object. Be care
2af0: 66 75 6c 20 61 62 6f 75 74 0a 20 2a 09 20 20 20 ful about. *.
2b00: 20 72 65 74 61 69 6e 69 6e 67 20 74 68 65 20 70 retaining the p
2b10: 6f 69 6e 74 65 72 20 69 6e 20 61 20 6c 6f 63 61 ointer in a loca
2b20: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 l data structure
2b30: 2e 0a 20 2a 0a 20 2a 09 54 43 4c 5f 45 52 52 4f .. *. *.TCL_ERRO
2b40: 52 0a 20 2a 0a 20 2a 09 20 20 20 20 27 6c 69 73 R. *. *. 'lis
2b50: 74 50 74 72 27 20 69 73 20 6e 6f 74 20 61 20 76 tPtr' is not a v
2b60: 61 6c 69 64 20 6c 69 73 74 2e 20 41 6e 20 65 72 alid list. An er
2b70: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c ror message is l
2b80: 65 66 74 20 69 6e 20 74 68 65 0a 20 2a 09 20 20 eft in the. *.
2b90: 20 20 69 6e 74 65 72 70 72 65 74 65 72 27 73 20 interpreter's
2ba0: 72 65 73 75 6c 74 20 69 66 20 27 69 6e 74 65 72 result if 'inter
2bb0: 70 27 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a p' is not NULL..
2bc0: 20 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a *. * Effect. *.
2bd0: 20 2a 09 27 6c 69 73 74 50 74 72 27 20 69 73 20 *.'listPtr' is
2be0: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6c converted to a l
2bf0: 69 73 74 20 6f 62 6a 65 63 74 20 69 66 20 69 74 ist object if it
2c00: 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 isn't one alrea
2c10: 64 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d dy.. *. *-------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2c60: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c 69 73 */..int.Tcl_Lis
2c70: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
2c80: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
2c90: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 *interp,../* Use
2ca0: 64 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f d to report erro
2cb0: 72 73 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 rs if not NULL.
2cc0: 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 */. register
2cd0: 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 Tcl_Obj *listPtr
2ce0: 2c 09 2f 2a 20 4c 69 73 74 20 6f 62 6a 65 63 74 ,./* List object
2cf0: 20 66 6f 72 20 77 68 69 63 68 20 61 6e 20 65 6c for which an el
2d00: 65 6d 65 6e 74 20 61 72 72 61 79 20 69 73 0a 09 ement array is..
2d10: 09 09 09 20 2a 20 74 6f 20 62 65 20 72 65 74 75 ... * to be retu
2d20: 72 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 rned. */. int
2d30: 20 2a 6f 62 6a 63 50 74 72 2c 09 09 2f 2a 20 57 *objcPtr,../* W
2d40: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 here to store th
2d50: 65 20 63 6f 75 6e 74 20 6f 66 20 6f 62 6a 65 63 e count of objec
2d60: 74 73 0a 09 09 09 09 20 2a 20 72 65 66 65 72 65 ts..... * refere
2d70: 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 2a 2f nced by objv. */
2d80: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a . Tcl_Obj ***
2d90: 6f 62 6a 76 50 74 72 29 09 09 2f 2a 20 57 68 65 objvPtr)../* Whe
2da0: 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 re to store the
2db0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 pointer to an ar
2dc0: 72 61 79 20 6f 66 0a 09 09 09 09 20 2a 20 70 6f ray of..... * po
2dd0: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6c 69 inters to the li
2de0: 73 74 27 73 20 6f 62 6a 65 63 74 73 2e 20 2a 2f st's objects. */
2df0: 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 .{. register
2e00: 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 List *listRepPtr
2e10: 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 50 ;.. if (listP
2e20: 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26 tr->typePtr != &
2e30: 74 63 6c 4c 69 73 74 54 79 70 65 29 20 7b 0a 09 tclListType) {..
2e40: 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 09 69 66 int result;...if
2e50: 20 28 6c 69 73 74 50 74 72 2d 3e 62 79 74 65 73 (listPtr->bytes
2e60: 20 3d 3d 20 74 63 6c 45 6d 70 74 79 53 74 72 69 == tclEmptyStri
2e70: 6e 67 52 65 70 29 20 7b 0a 09 20 20 20 20 2a 6f ngRep) {.. *o
2e80: 62 6a 63 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 bjcPtr = 0;..
2e90: 20 2a 6f 62 6a 76 50 74 72 20 3d 20 4e 55 4c 4c *objvPtr = NULL
2ea0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
2eb0: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 L_OK;..}..result
2ec0: 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e = SetListFromAn
2ed0: 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 y(interp, listPt
2ee0: 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 r);..if (result
2ef0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
2f00: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b return result;
2f10: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 ..}. }. li
2f20: 73 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74 52 stRepPtr = ListR
2f30: 65 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b 0a epPtr(listPtr);.
2f40: 20 20 20 20 2a 6f 62 6a 63 50 74 72 20 3d 20 6c *objcPtr = l
2f50: 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 istRepPtr->elemC
2f60: 6f 75 6e 74 3b 0a 20 20 20 20 2a 6f 62 6a 76 50 ount;. *objvP
2f70: 74 72 20 3d 20 26 6c 69 73 74 52 65 70 50 74 72 tr = &listRepPtr
2f80: 2d 3e 65 6c 65 6d 65 6e 74 73 3b 0a 20 20 20 20 ->elements;.
2f90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
2fa0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2ff0: 2a 0a 20 2a 20 54 63 6c 5f 4c 69 73 74 4f 62 6a *. * Tcl_ListObj
3000: 41 70 70 65 6e 64 4c 69 73 74 20 2d 2d 0a 20 2a AppendList --. *
3010: 0a 20 2a 09 41 70 70 65 6e 64 73 20 74 68 65 20 . *.Appends the
3020: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 65 6c 65 6d elements of elem
3030: 4c 69 73 74 50 74 72 20 74 6f 20 74 68 6f 73 65 ListPtr to those
3040: 20 6f 66 20 6c 69 73 74 50 74 72 2e 0a 20 2a 0a of listPtr.. *.
3050: 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 54 * Value. *. *.T
3060: 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 20 20 20 20 CL_OK. *. *.
3070: 53 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 09 54 Success.. *. *.T
3080: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 09 20 CL_ERROR. *. *.
3090: 20 20 20 27 6c 69 73 74 50 74 72 27 20 6f 72 20 'listPtr' or
30a0: 27 65 6c 65 6d 4c 69 73 74 50 74 72 27 20 61 72 'elemListPtr' ar
30b0: 65 20 6e 6f 74 20 76 61 6c 69 64 20 6c 69 73 74 e not valid list
30c0: 73 2e 20 20 41 6e 20 65 72 72 6f 72 0a 20 2a 09 s. An error. *.
30d0: 20 20 20 20 6d 65 73 73 61 67 65 20 69 73 20 6c message is l
30e0: 65 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 eft in the inter
30f0: 70 72 65 74 65 72 27 73 20 72 65 73 75 6c 74 20 preter's result
3100: 69 66 20 27 69 6e 74 65 72 70 27 20 69 73 20 6e if 'interp' is n
3110: 6f 74 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 ot NULL.. *. * E
3120: 66 66 65 63 74 0a 20 2a 0a 20 2a 09 54 68 65 20 ffect. *. *.The
3130: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
3140: 6f 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 of each element
3150: 6f 66 20 27 65 6c 65 6d 4c 69 73 74 50 74 72 27 of 'elemListPtr'
3160: 20 61 73 20 69 74 20 69 73 20 61 64 64 65 64 20 as it is added
3170: 74 6f 0a 20 2a 09 27 6c 69 73 74 50 74 72 27 2e to. *.'listPtr'.
3180: 20 27 6c 69 73 74 50 74 72 27 20 61 6e 64 20 27 'listPtr' and '
3190: 65 6c 65 6d 4c 69 73 74 50 74 72 27 20 61 72 65 elemListPtr' are
31a0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 27 74 converted to 't
31b0: 63 6c 4c 69 73 74 54 79 70 65 27 0a 20 2a 09 69 clListType'. *.i
31c0: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 f they are not a
31d0: 6c 72 65 61 64 79 2e 20 41 70 70 65 6e 64 69 6e lready. Appendin
31e0: 67 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e g the new elemen
31f0: 74 73 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 ts may cause the
3200: 0a 20 2a 09 61 72 72 61 79 20 6f 66 20 65 6c 65 . *.array of ele
3210: 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 20 69 6e ment pointers in
3220: 20 27 6c 69 73 74 4f 62 6a 27 20 74 6f 20 67 72 'listObj' to gr
3230: 6f 77 2e 20 20 49 66 20 61 6e 79 20 6f 62 6a 65 ow. If any obje
3240: 63 74 73 20 61 72 65 0a 20 2a 09 61 70 70 65 6e cts are. *.appen
3250: 64 65 64 20 74 6f 20 27 6c 69 73 74 50 74 72 27 ded to 'listPtr'
3260: 2e 20 41 6e 79 20 70 72 65 65 78 69 73 74 69 6e . Any preexistin
3270: 67 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 g string represe
3280: 6e 74 61 74 69 6f 6e 20 6f 66 0a 20 2a 09 27 6c ntation of. *.'l
3290: 69 73 74 50 74 72 27 20 69 73 20 69 6e 76 61 6c istPtr' is inval
32a0: 69 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d idated.. *. *---
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32f0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
3300: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 4c 69 _ListObjAppendLi
3310: 73 74 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 st(. Tcl_Inte
3320: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
3330: 55 73 65 64 20 74 6f 20 72 65 70 6f 72 74 20 65 Used to report e
3340: 72 72 6f 72 73 20 69 66 20 6e 6f 74 20 4e 55 4c rrors if not NUL
3350: 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 L. */. regist
3360: 65 72 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 er Tcl_Obj *list
3370: 50 74 72 2c 09 2f 2a 20 4c 69 73 74 20 6f 62 6a Ptr,./* List obj
3380: 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 65 6c ect to append el
3390: 65 6d 65 6e 74 73 20 74 6f 2e 20 2a 2f 0a 20 20 ements to. */.
33a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 65 6c 65 6d 4c Tcl_Obj *elemL
33b0: 69 73 74 50 74 72 29 09 2f 2a 20 4c 69 73 74 20 istPtr)./* List
33c0: 6f 62 6a 20 77 69 74 68 20 65 6c 65 6d 65 6e 74 obj with element
33d0: 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 2a 2f 0a s to append. */.
33e0: 7b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a {. int objc;.
33f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6f 62 Tcl_Obj **ob
3400: 6a 76 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c jv;.. if (Tcl
3410: 5f 49 73 53 68 61 72 65 64 28 6c 69 73 74 50 74 _IsShared(listPt
3420: 72 29 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 r)) {..Tcl_Panic
3430: 28 22 25 73 20 63 61 6c 6c 65 64 20 77 69 74 68 ("%s called with
3440: 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 22 2c shared object",
3450: 20 22 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 "Tcl_ListObjApp
3460: 65 6e 64 4c 69 73 74 22 29 3b 0a 20 20 20 20 7d endList");. }
3470: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
3480: 50 75 6c 6c 20 74 68 65 20 65 6c 65 6d 65 6e 74 Pull the element
3490: 73 20 74 6f 20 61 70 70 65 6e 64 20 66 72 6f 6d s to append from
34a0: 20 65 6c 65 6d 4c 69 73 74 50 74 72 2e 0a 20 20 elemListPtr..
34b0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 54 */.. if (T
34c0: 43 4c 5f 4f 4b 20 21 3d 20 54 63 6c 4c 69 73 74 CL_OK != TclList
34d0: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
34e0: 6e 74 65 72 70 2c 20 65 6c 65 6d 4c 69 73 74 50 nterp, elemListP
34f0: 74 72 2c 20 26 6f 62 6a 63 2c 20 26 6f 62 6a 76 tr, &objc, &objv
3500: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c )) {..return TCL
3510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
3520: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 73 /*. * Ins
3530: 65 72 74 20 74 68 65 20 6e 65 77 20 65 6c 65 6d ert the new elem
3540: 65 6e 74 73 20 73 74 61 72 74 69 6e 67 20 61 66 ents starting af
3550: 74 65 72 20 74 68 65 20 6c 69 73 74 73 27 73 20 ter the lists's
3560: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 last element..
3570: 20 20 20 2a 20 44 65 6c 65 74 65 20 7a 65 72 6f * Delete zero
3580: 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e existing elemen
3590: 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ts.. */..
35a0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4c 69 73 74 return Tcl_List
35b0: 4f 62 6a 52 65 70 6c 61 63 65 28 69 6e 74 65 72 ObjReplace(inter
35c0: 70 2c 20 6c 69 73 74 50 74 72 2c 20 4c 49 53 54 p, listPtr, LIST
35d0: 5f 4d 41 58 2c 20 30 2c 20 6f 62 6a 63 2c 20 6f _MAX, 0, objc, o
35e0: 62 6a 76 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d bjv);.}.../*. *-
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f -----. *. * Tcl_
3640: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3650: 6d 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 4c 69 ment --. *. *.Li
3660: 6b 65 20 27 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ke 'Tcl_ListObjA
3670: 70 70 65 6e 64 4c 69 73 74 27 2c 20 62 75 74 20 ppendList', but
3680: 41 70 70 65 6e 64 73 20 61 20 73 69 6e 67 6c 65 Appends a single
3690: 20 76 61 6c 75 65 20 74 6f 20 61 20 6c 69 73 74 value to a list
36a0: 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20 2a .. *. * Value. *
36b0: 0a 20 2a 09 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a . *.TCL_OK. *. *
36c0: 09 20 20 20 20 27 6f 62 6a 50 74 72 27 20 69 73 . 'objPtr' is
36d0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 appended to the
36e0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 27 6c 69 elements of 'li
36f0: 73 74 50 74 72 27 2e 0a 20 2a 0a 20 2a 09 54 43 stPtr'.. *. *.TC
3700: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 09 20 20 L_ERROR. *. *.
3710: 20 20 6c 69 73 74 50 74 72 20 64 6f 65 73 20 6e listPtr does n
3720: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 20 6c 69 ot refer to a li
3730: 73 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 st object and th
3740: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 6e 6f 74 e object can not
3750: 20 62 65 0a 20 2a 09 20 20 20 20 63 6f 6e 76 65 be. *. conve
3760: 72 74 65 64 20 74 6f 20 6f 6e 65 2e 20 41 6e 20 rted to one. An
3770: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 error message wi
3780: 6c 6c 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 ll be left in th
3790: 65 0a 20 2a 09 20 20 20 20 69 6e 74 65 72 70 72 e. *. interpr
37a0: 65 74 65 72 27 73 20 72 65 73 75 6c 74 20 69 66 eter's result if
37b0: 20 69 6e 74 65 72 70 20 69 73 20 6e 6f 74 20 4e interp is not N
37c0: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63 ULL.. *. * Effec
37d0: 74 0a 20 2a 0a 20 2a 09 49 66 20 27 6c 69 73 74 t. *. *.If 'list
37e0: 50 74 72 27 20 69 73 20 6e 6f 74 20 61 6c 72 65 Ptr' is not alre
37f0: 61 64 79 20 6f 66 20 74 79 70 65 20 27 74 63 6c ady of type 'tcl
3800: 4c 69 73 74 54 79 70 65 27 2c 20 69 74 20 69 73 ListType', it is
3810: 20 63 6f 6e 76 65 72 74 65 64 2e 0a 20 2a 09 54 converted.. *.T
3820: 68 65 20 27 72 65 66 43 6f 75 6e 74 27 20 6f 66 he 'refCount' of
3830: 20 27 6f 62 6a 50 74 72 27 20 69 73 20 69 6e 63 'objPtr' is inc
3840: 72 65 6d 65 6e 74 65 64 20 61 73 20 69 74 20 69 remented as it i
3850: 73 20 61 64 64 65 64 20 74 6f 20 27 6c 69 73 74 s added to 'list
3860: 50 74 72 27 2e 0a 20 2a 09 41 70 70 65 6e 64 69 Ptr'.. *.Appendi
3870: 6e 67 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 ng the new eleme
3880: 6e 74 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 nt may cause the
3890: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 65 6c the array of el
38a0: 65 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 0a 20 ement pointers.
38b0: 2a 09 69 6e 20 27 6c 69 73 74 4f 62 6a 27 20 74 *.in 'listObj' t
38c0: 6f 20 67 72 6f 77 2e 20 20 41 6e 79 20 70 72 65 o grow. Any pre
38d0: 65 78 69 73 74 69 6e 67 20 73 74 72 69 6e 67 20 existing string
38e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f representation o
38f0: 66 0a 20 2a 09 27 6c 69 73 74 50 74 72 27 20 69 f. *.'listPtr' i
3900: 73 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 s invalidated..
3910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
3960: 69 6e 74 0a 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 int.Tcl_ListObjA
3970: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 ppendElement(.
3980: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3990: 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20 74 terp,../* Used t
39a0: 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 o report errors
39b0: 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f 0a if not NULL. */.
39c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 Tcl_Obj *lis
39d0: 74 50 74 72 2c 09 09 2f 2a 20 4c 69 73 74 20 6f tPtr,../* List o
39e0: 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 bject to append
39f0: 6f 62 6a 50 74 72 20 74 6f 2e 20 2a 2f 0a 20 20 objPtr to. */.
3a00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
3a10: 72 29 09 09 2f 2a 20 4f 62 6a 65 63 74 20 74 6f r)../* Object to
3a20: 20 61 70 70 65 6e 64 20 74 6f 20 6c 69 73 74 50 append to listP
3a30: 74 72 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 7b 0a tr's list. */.{.
3a40: 20 20 20 20 72 65 67 69 73 74 65 72 20 4c 69 73 register Lis
3a50: 74 20 2a 6c 69 73 74 52 65 70 50 74 72 2c 20 2a t *listRepPtr, *
3a60: 6e 65 77 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 newPtr = NULL;.
3a70: 20 20 20 69 6e 74 20 6e 75 6d 45 6c 65 6d 73 2c int numElems,
3a80: 20 6e 75 6d 52 65 71 75 69 72 65 64 2c 20 6e 65 numRequired, ne
3a90: 65 64 47 72 6f 77 2c 20 69 73 53 68 61 72 65 64 edGrow, isShared
3aa0: 2c 20 61 74 74 65 6d 70 74 3b 0a 0a 20 20 20 20 , attempt;..
3ab0: 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 if (Tcl_IsShared
3ac0: 28 6c 69 73 74 50 74 72 29 29 20 7b 0a 09 54 63 (listPtr)) {..Tc
3ad0: 6c 5f 50 61 6e 69 63 28 22 25 73 20 63 61 6c 6c l_Panic("%s call
3ae0: 65 64 20 77 69 74 68 20 73 68 61 72 65 64 20 6f ed with shared o
3af0: 62 6a 65 63 74 22 2c 20 22 54 63 6c 5f 4c 69 73 bject", "Tcl_Lis
3b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3b10: 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 t");. }. i
3b20: 66 20 28 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 f (listPtr->type
3b30: 50 74 72 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 Ptr != &tclListT
3b40: 79 70 65 29 20 7b 0a 09 69 6e 74 20 72 65 73 75 ype) {..int resu
3b50: 6c 74 3b 0a 0a 09 69 66 20 28 6c 69 73 74 50 74 lt;...if (listPt
3b60: 72 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c 45 r->bytes == tclE
3b70: 6d 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 7b mptyStringRep) {
3b80: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4c 69 73 .. Tcl_SetLis
3b90: 74 4f 62 6a 28 6c 69 73 74 50 74 72 2c 20 31 2c tObj(listPtr, 1,
3ba0: 20 26 6f 62 6a 50 74 72 29 3b 0a 09 20 20 20 20 &objPtr);..
3bb0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
3bc0: 7d 0a 09 72 65 73 75 6c 74 20 3d 20 53 65 74 4c }..result = SetL
3bd0: 69 73 74 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72 istFromAny(inter
3be0: 70 2c 20 6c 69 73 74 50 74 72 29 3b 0a 09 69 66 p, listPtr);..if
3bf0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
3c00: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
3c10: 6e 20 72 65 73 75 6c 74 3b 0a 09 7d 0a 20 20 20 n result;..}.
3c20: 20 7d 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 50 }.. listRepP
3c30: 74 72 20 3d 20 4c 69 73 74 52 65 70 50 74 72 28 tr = ListRepPtr(
3c40: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 6e 75 listPtr);. nu
3c50: 6d 45 6c 65 6d 73 20 3d 20 6c 69 73 74 52 65 70 mElems = listRep
3c60: 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 3b 0a Ptr->elemCount;.
3c70: 20 20 20 20 6e 75 6d 52 65 71 75 69 72 65 64 20 numRequired
3c80: 3d 20 6e 75 6d 45 6c 65 6d 73 20 2b 20 31 20 3b = numElems + 1 ;
3c90: 0a 20 20 20 20 6e 65 65 64 47 72 6f 77 20 3d 20 . needGrow =
3ca0: 28 6e 75 6d 52 65 71 75 69 72 65 64 20 3e 20 6c (numRequired > l
3cb0: 69 73 74 52 65 70 50 74 72 2d 3e 6d 61 78 45 6c istRepPtr->maxEl
3cc0: 65 6d 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 73 emCount);. is
3cd0: 53 68 61 72 65 64 20 3d 20 28 6c 69 73 74 52 65 Shared = (listRe
3ce0: 70 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3e pPtr->refCount >
3cf0: 20 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6e 75 1);.. if (nu
3d00: 6d 52 65 71 75 69 72 65 64 20 3e 20 4c 49 53 54 mRequired > LIST
3d10: 5f 4d 41 58 29 20 7b 0a 09 69 66 20 28 69 6e 74 _MAX) {..if (int
3d20: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 erp != NULL) {..
3d30: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
3d40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
3d50: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 _ObjPrintf(...
3d60: 20 20 22 6d 61 78 20 6c 65 6e 67 74 68 20 6f 66 "max length of
3d70: 20 61 20 54 63 6c 20 6c 69 73 74 20 28 25 64 20 a Tcl list (%d
3d80: 65 6c 65 6d 65 6e 74 73 29 20 65 78 63 65 65 64 elements) exceed
3d90: 65 64 22 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f ed",... LIST_
3da0: 4d 41 58 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f MAX));.. Tcl_
3db0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
3dc0: 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4d 45 4d erp, "TCL", "MEM
3dd0: 4f 52 59 22 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a ORY", NULL);..}.
3de0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
3df0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
3e00: 20 28 6e 65 65 64 47 72 6f 77 20 26 26 20 21 69 (needGrow && !i
3e10: 73 53 68 61 72 65 64 29 20 7b 0a 09 2f 2a 0a 09 sShared) {../*..
3e20: 20 2a 20 4e 65 65 64 20 74 6f 20 67 72 6f 77 20 * Need to grow
3e30: 2b 20 75 6e 73 68 61 72 65 64 20 69 6e 74 72 65 + unshared intre
3e40: 70 20 3d 3e 20 74 72 79 20 74 6f 20 72 65 61 6c p => try to real
3e50: 6c 6f 63 0a 09 20 2a 2f 0a 0a 09 61 74 74 65 6d loc.. */...attem
3e60: 70 74 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75 pt = 2 * numRequ
3e70: 69 72 65 64 3b 0a 09 69 66 20 28 61 74 74 65 6d ired;..if (attem
3e80: 70 74 20 3c 3d 20 4c 49 53 54 5f 4d 41 58 29 20 pt <= LIST_MAX)
3e90: 7b 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 {.. newPtr =
3ea0: 61 74 74 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 attemptckrealloc
3eb0: 28 6c 69 73 74 52 65 70 50 74 72 2c 20 4c 49 53 (listRepPtr, LIS
3ec0: 54 5f 53 49 5a 45 28 61 74 74 65 6d 70 74 29 29 T_SIZE(attempt))
3ed0: 3b 0a 09 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 ;..}..if (newPtr
3ee0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
3ef0: 20 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 attempt = numRe
3f00: 71 75 69 72 65 64 20 2b 20 31 20 2b 20 54 43 4c quired + 1 + TCL
3f10: 5f 4d 49 4e 5f 45 4c 45 4d 45 4e 54 5f 47 52 4f _MIN_ELEMENT_GRO
3f20: 57 54 48 3b 0a 09 20 20 20 20 69 66 20 28 61 74 WTH;.. if (at
3f30: 74 65 6d 70 74 20 3e 20 4c 49 53 54 5f 4d 41 58 tempt > LIST_MAX
3f40: 29 20 7b 0a 09 09 61 74 74 65 6d 70 74 20 3d 20 ) {...attempt =
3f50: 4c 49 53 54 5f 4d 41 58 3b 0a 09 20 20 20 20 7d LIST_MAX;.. }
3f60: 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 61 .. newPtr = a
3f70: 74 74 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 28 ttemptckrealloc(
3f80: 6c 69 73 74 52 65 70 50 74 72 2c 20 4c 49 53 54 listRepPtr, LIST
3f90: 5f 53 49 5a 45 28 61 74 74 65 6d 70 74 29 29 3b _SIZE(attempt));
3fa0: 0a 09 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 ..}..if (newPtr
3fb0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
3fc0: 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 71 attempt = numReq
3fd0: 75 69 72 65 64 3b 0a 09 20 20 20 20 6e 65 77 50 uired;.. newP
3fe0: 74 72 20 3d 20 61 74 74 65 6d 70 74 63 6b 72 65 tr = attemptckre
3ff0: 61 6c 6c 6f 63 28 6c 69 73 74 52 65 70 50 74 72 alloc(listRepPtr
4000: 2c 20 4c 49 53 54 5f 53 49 5a 45 28 61 74 74 65 , LIST_SIZE(atte
4010: 6d 70 74 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6e mpt));..}..if (n
4020: 65 77 50 74 72 29 20 7b 0a 09 20 20 20 20 6c 69 ewPtr) {.. li
4030: 73 74 52 65 70 50 74 72 20 3d 20 6e 65 77 50 74 stRepPtr = newPt
4040: 72 3b 0a 09 20 20 20 20 6c 69 73 74 52 65 70 50 r;.. listRepP
4050: 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74 tr->maxElemCount
4060: 20 3d 20 61 74 74 65 6d 70 74 3b 0a 09 20 20 20 = attempt;..
4070: 20 6e 65 65 64 47 72 6f 77 20 3d 20 30 3b 0a 09 needGrow = 0;..
4080: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. }. if (
4090: 69 73 53 68 61 72 65 64 20 7c 7c 20 6e 65 65 64 isShared || need
40a0: 47 72 6f 77 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a Grow) {..Tcl_Obj
40b0: 20 2a 2a 64 73 74 2c 20 2a 2a 73 72 63 20 3d 20 **dst, **src =
40c0: 26 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 &listRepPtr->ele
40d0: 6d 65 6e 74 73 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 ments;.../*.. *
40e0: 45 69 74 68 65 72 20 77 65 20 68 61 76 65 20 61 Either we have a
40f0: 20 73 68 61 72 65 64 20 69 6e 74 72 65 70 20 61 shared intrep a
4100: 6e 64 20 77 65 20 6d 75 73 74 20 63 6f 70 79 20 nd we must copy
4110: 74 6f 20 77 72 69 74 65 2c 20 6f 72 20 77 65 0a to write, or we.
4120: 09 20 2a 20 6e 65 65 64 20 74 6f 20 67 72 6f 77 . * need to grow
4130: 20 61 6e 64 20 72 65 61 6c 6c 6f 63 20 61 74 74 and realloc att
4140: 65 6d 70 74 73 20 66 61 69 6c 65 64 2e 20 20 41 empts failed. A
4150: 74 74 65 6d 70 74 20 69 6e 74 72 65 70 20 63 6f ttempt intrep co
4160: 70 79 2e 0a 09 20 2a 2f 0a 0a 09 61 74 74 65 6d py... */...attem
4170: 70 74 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75 pt = 2 * numRequ
4180: 69 72 65 64 3b 0a 09 6e 65 77 50 74 72 20 3d 20 ired;..newPtr =
4190: 41 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 4e AttemptNewList(N
41a0: 55 4c 4c 2c 20 61 74 74 65 6d 70 74 2c 20 4e 55 ULL, attempt, NU
41b0: 4c 4c 29 3b 0a 09 69 66 20 28 6e 65 77 50 74 72 LL);..if (newPtr
41c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
41d0: 20 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 attempt = numRe
41e0: 71 75 69 72 65 64 20 2b 20 31 20 2b 20 54 43 4c quired + 1 + TCL
41f0: 5f 4d 49 4e 5f 45 4c 45 4d 45 4e 54 5f 47 52 4f _MIN_ELEMENT_GRO
4200: 57 54 48 3b 0a 09 20 20 20 20 69 66 20 28 61 74 WTH;.. if (at
4210: 74 65 6d 70 74 20 3e 20 4c 49 53 54 5f 4d 41 58 tempt > LIST_MAX
4220: 29 20 7b 0a 09 09 61 74 74 65 6d 70 74 20 3d 20 ) {...attempt =
4230: 4c 49 53 54 5f 4d 41 58 3b 0a 09 20 20 20 20 7d LIST_MAX;.. }
4240: 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 41 .. newPtr = A
4250: 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 4e 55 ttemptNewList(NU
4260: 4c 4c 2c 20 61 74 74 65 6d 70 74 2c 20 4e 55 4c LL, attempt, NUL
4270: 4c 29 3b 0a 09 7d 0a 09 69 66 20 28 6e 65 77 50 L);..}..if (newP
4280: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 tr == NULL) {..
4290: 20 20 20 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d attempt = num
42a0: 52 65 71 75 69 72 65 64 3b 0a 09 20 20 20 20 6e Required;.. n
42b0: 65 77 50 74 72 20 3d 20 41 74 74 65 6d 70 74 4e ewPtr = AttemptN
42c0: 65 77 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 61 ewList(interp, a
42d0: 74 74 65 6d 70 74 2c 20 4e 55 4c 4c 29 3b 0a 09 ttempt, NULL);..
42e0: 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d 3d }..if (newPtr ==
42f0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
4300: 0a 09 20 20 20 20 20 2a 20 41 6c 6c 20 67 72 6f .. * All gro
4310: 77 74 68 20 61 74 74 65 6d 70 74 73 20 66 61 69 wth attempts fai
4320: 6c 65 64 3b 20 74 68 72 6f 77 20 74 68 65 20 65 led; throw the e
4330: 72 72 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a rror... */..
4340: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
4350: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 64 73 74 20 ERROR;..}...dst
4360: 3d 20 26 6e 65 77 50 74 72 2d 3e 65 6c 65 6d 65 = &newPtr->eleme
4370: 6e 74 73 3b 0a 09 6e 65 77 50 74 72 2d 3e 72 65 nts;..newPtr->re
4380: 66 43 6f 75 6e 74 2b 2b 3b 0a 09 6e 65 77 50 74 fCount++;..newPt
4390: 72 2d 3e 63 61 6e 6f 6e 69 63 61 6c 46 6c 61 67 r->canonicalFlag
43a0: 20 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 63 = listRepPtr->c
43b0: 61 6e 6f 6e 69 63 61 6c 46 6c 61 67 3b 0a 09 6e anonicalFlag;..n
43c0: 65 77 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 ewPtr->elemCount
43d0: 20 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 = listRepPtr->e
43e0: 6c 65 6d 43 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 lemCount;...if (
43f0: 69 73 53 68 61 72 65 64 29 20 7b 0a 09 20 20 20 isShared) {..
4400: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 /*.. * The
4410: 6f 72 69 67 69 6e 61 6c 20 69 6e 74 72 65 70 20 original intrep
4420: 6d 75 73 74 20 72 65 6d 61 69 6e 20 75 6e 64 69 must remain undi
4430: 73 74 75 72 62 65 64 2e 20 20 43 6f 70 79 20 69 sturbed. Copy i
4440: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 09 20 20 20 nto the new..
4450: 20 20 2a 20 6f 6e 65 20 61 6e 64 20 62 75 6d 70 * one and bump
4460: 20 72 65 66 63 6f 75 6e 74 73 0a 09 20 20 20 20 refcounts..
4470: 20 2a 2f 0a 09 20 20 20 20 77 68 69 6c 65 20 28 */.. while (
4480: 6e 75 6d 45 6c 65 6d 73 2d 2d 29 20 7b 0a 09 09 numElems--) {...
4490: 2a 64 73 74 20 3d 20 2a 73 72 63 2b 2b 3b 0a 09 *dst = *src++;..
44a0: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e .Tcl_IncrRefCoun
44b0: 74 28 2a 64 73 74 2b 2b 29 3b 0a 09 20 20 20 20 t(*dst++);..
44c0: 7d 0a 09 20 20 20 20 6c 69 73 74 52 65 70 50 74 }.. listRepPt
44d0: 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d 3b 0a 09 r->refCount--;..
44e0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a } else {.. /*
44f0: 0a 09 20 20 20 20 20 2a 20 4f 6c 64 20 69 6e 74 .. * Old int
4500: 72 65 70 20 74 6f 20 62 65 20 66 72 65 65 64 2c rep to be freed,
4510: 20 72 65 2d 75 73 65 20 72 65 66 43 6f 75 6e 74 re-use refCount
4520: 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 s... */...
4530: 20 20 6d 65 6d 63 70 79 28 64 73 74 2c 20 73 72 memcpy(dst, sr
4540: 63 2c 20 28 73 69 7a 65 5f 74 29 20 6e 75 6d 45 c, (size_t) numE
4550: 6c 65 6d 73 20 2a 20 73 69 7a 65 6f 66 28 54 63 lems * sizeof(Tc
4560: 6c 5f 4f 62 6a 20 2a 29 29 3b 0a 09 20 20 20 20 l_Obj *));..
4570: 63 6b 66 72 65 65 28 6c 69 73 74 52 65 70 50 74 ckfree(listRepPt
4580: 72 29 3b 0a 09 7d 0a 09 6c 69 73 74 52 65 70 50 r);..}..listRepP
4590: 74 72 20 3d 20 6e 65 77 50 74 72 3b 0a 20 20 20 tr = newPtr;.
45a0: 20 7d 0a 20 20 20 20 6c 69 73 74 50 74 72 2d 3e }. listPtr->
45b0: 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 internalRep.twoP
45c0: 74 72 56 61 6c 75 65 2e 70 74 72 31 20 3d 20 6c trValue.ptr1 = l
45d0: 69 73 74 52 65 70 50 74 72 3b 0a 0a 20 20 20 20 istRepPtr;..
45e0: 2f 2a 0a 20 20 20 20 20 2a 20 41 64 64 20 6f 62 /*. * Add ob
45f0: 6a 50 74 72 20 74 6f 20 74 68 65 20 65 6e 64 20 jPtr to the end
4600: 6f 66 20 6c 69 73 74 50 74 72 27 73 20 61 72 72 of listPtr's arr
4610: 61 79 20 6f 66 20 65 6c 65 6d 65 6e 74 20 70 6f ay of element po
4620: 69 6e 74 65 72 73 2e 20 49 6e 63 72 65 6d 65 6e inters. Incremen
4630: 74 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 66 t. * the ref
4640: 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 count for the (
4650: 6e 6f 77 20 73 68 61 72 65 64 29 20 6f 62 6a 50 now shared) objP
4660: 74 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 tr.. */..
4670: 20 2a 28 26 6c 69 73 74 52 65 70 50 74 72 2d 3e *(&listRepPtr->
4680: 65 6c 65 6d 65 6e 74 73 20 2b 20 6c 69 73 74 52 elements + listR
4690: 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 epPtr->elemCount
46a0: 29 20 3d 20 6f 62 6a 50 74 72 3b 0a 20 20 20 20 ) = objPtr;.
46b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
46c0: 28 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 6c 69 (objPtr);. li
46d0: 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f stRepPtr->elemCo
46e0: 75 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 unt++;.. /*.
46f0: 20 20 20 20 2a 20 49 6e 76 61 6c 69 64 61 74 65 * Invalidate
4700: 20 61 6e 79 20 6f 6c 64 20 73 74 72 69 6e 67 20 any old string
4710: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 representation s
4720: 69 6e 63 65 20 74 68 65 20 6c 69 73 74 27 73 20 ince the list's
4730: 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 2a 20 internal. *
4740: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 68 representation h
4750: 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 as changed..
4760: 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 49 6e 76 61 */.. TclInva
4770: 6c 69 64 61 74 65 53 74 72 69 6e 67 52 65 70 28 lidateStringRep(
4780: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 72 65 listPtr);. re
4790: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
47a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
47f0: 20 2a 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e * Tcl_ListObjIn
4800: 64 65 78 20 2d 2d 0a 20 2a 0a 20 2a 20 09 52 65 dex --. *. * .Re
4810: 74 72 69 65 76 65 20 61 20 70 6f 69 6e 74 65 72 trieve a pointer
4820: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 to the element
4830: 6f 66 20 27 6c 69 73 74 50 74 72 27 20 61 74 20 of 'listPtr' at
4840: 27 69 6e 64 65 78 27 2e 20 20 54 68 65 20 69 6e 'index'. The in
4850: 64 65 78 0a 20 2a 20 09 6f 66 20 74 68 65 20 66 dex. * .of the f
4860: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 73 20 irst element is
4870: 30 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20 0.. *. * Value.
4880: 2a 0a 20 2a 20 09 54 43 4c 5f 4f 4b 0a 20 2a 0a *. * .TCL_OK. *.
4890: 20 2a 09 20 20 20 20 41 20 70 6f 69 6e 74 65 72 *. A pointer
48a0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 to the element
48b0: 61 74 20 27 69 6e 64 65 78 27 20 69 73 20 73 74 at 'index' is st
48c0: 6f 72 65 64 20 69 6e 20 27 6f 62 6a 50 74 72 50 ored in 'objPtrP
48d0: 74 72 27 2e 20 20 49 66 0a 20 2a 09 20 20 20 20 tr'. If. *.
48e0: 27 69 6e 64 65 78 27 20 69 73 20 6f 75 74 20 6f 'index' is out o
48f0: 66 20 72 61 6e 67 65 2c 20 4e 55 4c 4c 20 69 73 f range, NULL is
4900: 20 73 74 6f 72 65 64 20 69 6e 20 27 6f 62 6a 50 stored in 'objP
4910: 74 72 50 74 72 27 2e 20 20 54 68 69 73 0a 20 2a trPtr'. This. *
4920: 09 20 20 20 20 6f 62 6a 65 63 74 20 73 68 6f 75 . object shou
4930: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73 ld be treated as
4940: 20 72 65 61 64 6f 6e 6c 79 20 61 6e 64 20 69 74 readonly and it
4950: 73 20 27 72 65 66 43 6f 75 6e 74 27 20 69 73 20 s 'refCount' is
4960: 5f 6e 6f 74 5f 0a 20 2a 09 20 20 20 20 69 6e 63 _not_. *. inc
4970: 72 65 6d 65 6e 74 65 64 2e 20 54 68 65 20 63 61 remented. The ca
4980: 6c 6c 65 72 20 6d 75 73 74 20 64 6f 20 74 68 61 ller must do tha
4990: 74 20 69 66 20 69 74 20 68 6f 6c 64 73 20 6f 6e t if it holds on
49a0: 20 74 6f 20 74 68 65 0a 20 2a 09 20 20 20 20 72 to the. *. r
49b0: 65 66 65 72 65 6e 63 65 2e 0a 20 2a 20 0a 20 2a eference.. * . *
49c0: 20 09 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 .TCL_ERROR. *.
49d0: 2a 20 09 20 20 20 20 27 6c 69 73 74 50 74 72 27 * . 'listPtr'
49e0: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 is not a valid
49f0: 6c 69 73 74 2e 20 41 6e 20 61 6e 20 65 72 72 6f list. An an erro
4a00: 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 r message is lef
4a10: 74 20 69 6e 20 74 68 65 0a 20 2a 20 09 20 20 20 t in the. * .
4a20: 20 69 6e 74 65 72 70 72 65 74 65 72 27 73 20 72 interpreter's r
4a30: 65 73 75 6c 74 20 69 66 20 27 69 6e 74 65 72 70 esult if 'interp
4a40: 27 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 ' is not NULL..
4a50: 2a 0a 20 2a 20 20 45 66 66 65 63 74 0a 20 2a 0a *. * Effect. *.
4a60: 20 2a 20 09 49 66 20 27 6c 69 73 74 50 74 72 27 * .If 'listPtr'
4a70: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 is not already
4a80: 6f 66 20 74 79 70 65 20 27 74 63 6c 4c 69 73 74 of type 'tclList
4a90: 54 79 70 65 27 2c 20 69 74 20 69 73 20 63 6f 6e Type', it is con
4aa0: 76 65 72 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d verted.. *. *---
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4af0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
4b00: 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28 0a 20 _ListObjIndex(.
4b10: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
4b20: 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20 nterp,../* Used
4b30: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 to report errors
4b40: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f if not NULL. */
4b50: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 63 . register Tc
4b60: 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 2c 09 l_Obj *listPtr,.
4b70: 2f 2a 20 4c 69 73 74 20 6f 62 6a 65 63 74 20 74 /* List object t
4b80: 6f 20 69 6e 64 65 78 20 69 6e 74 6f 2e 20 2a 2f o index into. */
4b90: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e . register in
4ba0: 74 20 69 6e 64 65 78 2c 09 09 2f 2a 20 49 6e 64 t index,../* Ind
4bb0: 65 78 20 6f 66 20 65 6c 65 6d 65 6e 74 20 74 6f ex of element to
4bc0: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 20 20 return. */.
4bd0: 54 63 6c 5f 4f 62 6a 20 2a 2a 6f 62 6a 50 74 72 Tcl_Obj **objPtr
4be0: 50 74 72 29 09 2f 2a 20 54 68 65 20 72 65 73 75 Ptr)./* The resu
4bf0: 6c 74 69 6e 67 20 54 63 6c 5f 4f 62 6a 2a 20 69 lting Tcl_Obj* i
4c00: 73 20 73 74 6f 72 65 64 20 68 65 72 65 2e 20 2a s stored here. *
4c10: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 /.{. register
4c20: 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 List *listRepPt
4c30: 72 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 r;.. if (list
4c40: 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 Ptr->typePtr !=
4c50: 26 74 63 6c 4c 69 73 74 54 79 70 65 29 20 7b 0a &tclListType) {.
4c60: 09 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 09 69 .int result;...i
4c70: 66 20 28 6c 69 73 74 50 74 72 2d 3e 62 79 74 65 f (listPtr->byte
4c80: 73 20 3d 3d 20 74 63 6c 45 6d 70 74 79 53 74 72 s == tclEmptyStr
4c90: 69 6e 67 52 65 70 29 20 7b 0a 09 20 20 20 20 2a ingRep) {.. *
4ca0: 6f 62 6a 50 74 72 50 74 72 20 3d 20 4e 55 4c 4c objPtrPtr = NULL
4cb0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
4cc0: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 L_OK;..}..result
4cd0: 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e = SetListFromAn
4ce0: 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 y(interp, listPt
4cf0: 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 r);..if (result
4d00: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
4d10: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b return result;
4d20: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c ..}. }.. l
4d30: 69 73 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74 istRepPtr = List
4d40: 52 65 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b RepPtr(listPtr);
4d50: 0a 20 20 20 20 69 66 20 28 28 69 6e 64 65 78 20 . if ((index
4d60: 3c 20 30 29 20 7c 7c 20 28 69 6e 64 65 78 20 3e < 0) || (index >
4d70: 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c = listRepPtr->el
4d80: 65 6d 43 6f 75 6e 74 29 29 20 7b 0a 09 2a 6f 62 emCount)) {..*ob
4d90: 6a 50 74 72 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a jPtrPtr = NULL;.
4da0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f } else {..*o
4db0: 62 6a 50 74 72 50 74 72 20 3d 20 28 26 6c 69 73 bjPtrPtr = (&lis
4dc0: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 tRepPtr->element
4dd0: 73 29 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20 7d s)[index];. }
4de0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
4df0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e40: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4c ----. *. * Tcl_L
4e50: 69 73 74 4f 62 6a 4c 65 6e 67 74 68 20 2d 2d 0a istObjLength --.
4e60: 20 2a 0a 20 2a 20 09 52 65 74 72 69 65 76 65 20 *. * .Retrieve
4e70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c the number of el
4e80: 65 6d 65 6e 74 73 20 69 6e 20 61 20 6c 69 73 74 ements in a list
4e90: 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20 2a .. *. * Value. *
4ea0: 0a 20 2a 09 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a . *.TCL_OK. *. *
4eb0: 09 20 20 20 20 41 20 63 6f 75 6e 74 20 6f 66 20 . A count of
4ec0: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 20 69 73 list elements is
4ed0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 61 stored at the a
4ee0: 64 64 72 65 73 73 20 70 72 6f 76 69 64 65 64 20 ddress provided
4ef0: 62 79 0a 20 2a 09 20 20 20 20 27 69 6e 74 50 74 by. *. 'intPt
4f00: 72 27 2e 20 49 66 20 27 6c 69 73 74 50 74 72 27 r'. If 'listPtr'
4f10: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 is not already
4f20: 6f 66 20 74 79 70 65 20 27 74 63 6c 4c 69 73 74 of type 'tclList
4f30: 50 74 72 27 2c 20 69 74 20 69 73 0a 20 2a 09 20 Ptr', it is. *.
4f40: 20 20 20 63 6f 6e 76 65 72 74 65 64 2e 0a 20 2a converted.. *
4f50: 0a 20 2a 09 54 43 4c 5f 45 52 52 4f 52 0a 20 2a . *.TCL_ERROR. *
4f60: 0a 20 2a 09 20 20 20 20 27 6c 69 73 74 50 74 72 . *. 'listPtr
4f70: 27 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 ' is not a valid
4f80: 20 6c 69 73 74 2e 20 20 41 6e 20 65 72 72 6f 72 list. An error
4f90: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 62 65 message will be
4fa0: 20 6c 65 66 74 20 69 6e 0a 20 2a 09 20 20 20 20 left in. *.
4fb0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 27 the interpreter'
4fc0: 73 20 72 65 73 75 6c 74 20 69 66 20 27 69 6e 74 s result if 'int
4fd0: 65 72 70 27 20 69 73 20 6e 6f 74 20 4e 55 4c 4c erp' is not NULL
4fe0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5030: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c 69 73 74 4f /..int.Tcl_ListO
5040: 62 6a 4c 65 6e 67 74 68 28 0a 20 20 20 20 54 63 bjLength(. Tc
5050: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5060: 2c 09 09 2f 2a 20 55 73 65 64 20 74 6f 20 72 65 ,../* Used to re
5070: 70 6f 72 74 20 65 72 72 6f 72 73 20 69 66 20 6e port errors if n
5080: 6f 74 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 ot NULL. */.
5090: 72 65 67 69 73 74 65 72 20 54 63 6c 5f 4f 62 6a register Tcl_Obj
50a0: 20 2a 6c 69 73 74 50 74 72 2c 09 2f 2a 20 4c 69 *listPtr,./* Li
50b0: 73 74 20 6f 62 6a 65 63 74 20 77 68 6f 73 65 20 st object whose
50c0: 23 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 74 #elements to ret
50d0: 75 72 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 urn. */. regi
50e0: 73 74 65 72 20 69 6e 74 20 2a 69 6e 74 50 74 72 ster int *intPtr
50f0: 29 09 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 69 )./* The resulti
5100: 6e 67 20 69 6e 74 20 69 73 20 73 74 6f 72 65 64 ng int is stored
5110: 20 68 65 72 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 here. */.{.
5120: 72 65 67 69 73 74 65 72 20 4c 69 73 74 20 2a 6c register List *l
5130: 69 73 74 52 65 70 50 74 72 3b 0a 0a 20 20 20 20 istRepPtr;..
5140: 69 66 20 28 6c 69 73 74 50 74 72 2d 3e 74 79 70 if (listPtr->typ
5150: 65 50 74 72 20 21 3d 20 26 74 63 6c 4c 69 73 74 ePtr != &tclList
5160: 54 79 70 65 29 20 7b 0a 09 69 6e 74 20 72 65 73 Type) {..int res
5170: 75 6c 74 3b 0a 0a 09 69 66 20 28 6c 69 73 74 50 ult;...if (listP
5180: 74 72 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c tr->bytes == tcl
5190: 45 6d 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 EmptyStringRep)
51a0: 7b 0a 09 20 20 20 20 2a 69 6e 74 50 74 72 20 3d {.. *intPtr =
51b0: 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 0;.. return
51c0: 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 72 65 73 75 TCL_OK;..}..resu
51d0: 6c 74 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d lt = SetListFrom
51e0: 41 6e 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 Any(interp, list
51f0: 50 74 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c Ptr);..if (resul
5200: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 t != TCL_OK) {..
5210: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
5220: 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 t;..}. }..
5230: 20 6c 69 73 74 52 65 70 50 74 72 20 3d 20 4c 69 listRepPtr = Li
5240: 73 74 52 65 70 50 74 72 28 6c 69 73 74 50 74 72 stRepPtr(listPtr
5250: 29 3b 0a 20 20 20 20 2a 69 6e 74 50 74 72 20 3d );. *intPtr =
5260: 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 listRepPtr->ele
5270: 6d 43 6f 75 6e 74 3b 0a 20 20 20 20 72 65 74 75 mCount;. retu
5280: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
5290: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
52e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 52 65 70 6c Tcl_ListObjRepl
52f0: 61 63 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 70 ace --. *. *.Rep
5300: 6c 61 63 65 20 76 61 6c 75 65 73 20 69 6e 20 61 lace values in a
5310: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 09 49 66 20 list.. *. *.If
5320: 27 66 69 72 73 74 27 20 69 73 20 7a 65 72 6f 20 'first' is zero
5330: 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 or negative, it
5340: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 66 69 refers to the fi
5350: 72 73 74 20 65 6c 65 6d 65 6e 74 2e 20 49 66 0a rst element. If.
5360: 20 2a 09 27 66 69 72 73 74 27 20 6f 75 74 73 69 *.'first' outsi
5370: 64 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 de the range of
5380: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 elements in the
5390: 6c 69 73 74 2c 20 6e 6f 20 65 6c 65 6d 65 6e 74 list, no element
53a0: 73 20 61 72 65 0a 20 2a 09 64 65 6c 65 74 65 64 s are. *.deleted
53b0: 2e 0a 20 2a 0a 20 2a 09 49 66 20 27 63 6f 75 6e .. *. *.If 'coun
53c0: 74 27 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 t' is zero or ne
53d0: 67 61 74 69 76 65 20 6e 6f 20 65 6c 65 6d 65 6e gative no elemen
53e0: 74 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 ts are deleted,
53f0: 61 6e 64 20 61 6e 79 20 6e 65 77 0a 20 2a 09 65 and any new. *.e
5400: 6c 65 6d 65 6e 74 73 20 61 72 65 20 69 6e 73 65 lements are inse
5410: 72 74 65 64 20 61 74 20 74 68 65 20 62 65 67 69 rted at the begi
5420: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 69 73 nning of the lis
5430: 74 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20 t.. *. * Value.
5440: 2a 0a 20 2a 09 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 *. *.TCL_OK. *.
5450: 2a 09 20 20 20 20 54 68 65 20 66 69 72 73 74 20 *. The first
5460: 27 6f 62 6a 63 27 20 76 61 6c 75 65 73 20 6f 66 'objc' values of
5470: 20 27 6f 62 6a 76 27 20 72 65 70 6c 61 63 65 64 'objv' replaced
5480: 20 27 63 6f 75 6e 74 27 20 65 6c 65 6d 65 6e 74 'count' element
5490: 73 20 69 6e 20 27 6c 69 73 74 50 74 72 27 0a 20 s in 'listPtr'.
54a0: 2a 09 20 20 20 20 73 74 61 72 74 69 6e 67 20 61 *. starting a
54b0: 74 20 27 66 69 72 73 74 27 2e 20 20 49 66 20 27 t 'first'. If '
54c0: 6f 62 6a 63 27 20 30 2c 20 6e 6f 20 6e 65 77 20 objc' 0, no new
54d0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 61 64 64 elements are add
54e0: 65 64 2e 0a 20 2a 0a 20 2a 09 54 43 4c 5f 45 52 ed.. *. *.TCL_ER
54f0: 52 4f 52 0a 20 2a 0a 20 2a 09 20 20 20 20 27 6c ROR. *. *. 'l
5500: 69 73 74 50 74 72 27 20 69 73 20 6e 6f 74 20 61 istPtr' is not a
5510: 20 76 61 6c 69 64 20 6c 69 73 74 2e 20 20 20 41 valid list. A
5520: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 n error message
5530: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 20 is left in the.
5540: 2a 09 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 *. interprete
5550: 72 27 73 20 72 65 73 75 6c 74 20 69 66 20 27 69 r's result if 'i
5560: 6e 74 65 72 70 27 20 69 73 20 6e 6f 74 20 4e 55 nterp' is not NU
5570: 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63 74 LL.. *. * Effect
5580: 0a 20 2a 0a 20 2a 09 49 66 20 27 6c 69 73 74 50 . *. *.If 'listP
5590: 74 72 27 20 69 73 20 6e 6f 74 20 6f 66 20 74 79 tr' is not of ty
55a0: 70 65 20 27 74 63 6c 4c 69 73 74 54 79 70 65 27 pe 'tclListType'
55b0: 2c 20 69 74 20 69 73 20 63 6f 6e 76 65 72 74 65 , it is converte
55c0: 64 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 20 d if possible..
55d0: 2a 0a 20 2a 09 54 68 65 20 27 72 65 66 43 6f 75 *. *.The 'refCou
55e0: 6e 74 27 20 6f 66 20 65 61 63 68 20 65 6c 65 6d nt' of each elem
55f0: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 ent appended to
5600: 74 68 65 20 6c 69 73 74 20 69 73 20 69 6e 63 72 the list is incr
5610: 65 6d 65 6e 74 65 64 2e 0a 20 2a 09 53 69 6d 69 emented.. *.Simi
5620: 6c 61 72 6c 79 2c 20 74 68 65 20 27 72 65 66 43 larly, the 'refC
5630: 6f 75 6e 74 27 20 66 6f 72 20 65 61 63 68 20 72 ount' for each r
5640: 65 70 6c 61 63 65 64 20 65 6c 65 6d 65 6e 74 20 eplaced element
5650: 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 2e 0a is decremented..
5660: 20 2a 0a 20 2a 09 49 66 20 27 6c 69 73 74 50 74 *. *.If 'listPt
5670: 72 27 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 r' is modified,
5680: 61 6e 79 20 70 72 65 76 69 6f 75 73 20 73 74 72 any previous str
5690: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 ing representati
56a0: 6f 6e 20 69 73 0a 20 2a 09 69 6e 76 61 6c 69 64 on is. *.invalid
56b0: 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ated.. *. *-----
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5700: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c -. */..int.Tcl_L
5710: 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 28 0a 20 istObjReplace(.
5720: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
5730: 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20 nterp,../* Used
5740: 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 for error report
5750: 69 6e 67 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e ing if not NULL.
5760: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
5770: 2a 6c 69 73 74 50 74 72 2c 09 09 2f 2a 20 4c 69 *listPtr,../* Li
5780: 73 74 20 6f 62 6a 65 63 74 20 77 68 6f 73 65 20 st object whose
5790: 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 70 6c elements to repl
57a0: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ace. */. int
57b0: 66 69 72 73 74 2c 09 09 09 2f 2a 20 49 6e 64 65 first,.../* Inde
57c0: 78 20 6f 66 20 66 69 72 73 74 20 65 6c 65 6d 65 x of first eleme
57d0: 6e 74 20 74 6f 20 72 65 70 6c 61 63 65 2e 20 2a nt to replace. *
57e0: 2f 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 2c /. int count,
57f0: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 .../* Number of
5800: 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 70 6c elements to repl
5810: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ace. */. int
5820: 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 objc,.../* Numbe
5830: 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 74 6f 20 r of objects to
5840: 69 6e 73 65 72 74 2e 20 2a 2f 0a 20 20 20 20 54 insert. */. T
5850: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
5860: 6a 76 5b 5d 29 09 2f 2a 20 41 6e 20 61 72 72 61 jv[])./* An arra
5870: 79 20 6f 66 20 6f 62 6a 63 20 70 6f 69 6e 74 65 y of objc pointe
5880: 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a 65 63 74 rs to Tcl object
5890: 73 20 74 6f 0a 09 09 09 09 20 2a 20 69 6e 73 65 s to..... * inse
58a0: 72 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4c 69 73 rt. */.{. Lis
58b0: 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b 0a 20 t *listRepPtr;.
58c0: 20 20 20 72 65 67 69 73 74 65 72 20 54 63 6c 5f register Tcl_
58d0: 4f 62 6a 20 2a 2a 65 6c 65 6d 50 74 72 73 3b 0a Obj **elemPtrs;.
58e0: 20 20 20 20 69 6e 74 20 6e 65 65 64 47 72 6f 77 int needGrow
58f0: 2c 20 6e 75 6d 45 6c 65 6d 73 2c 20 6e 75 6d 52 , numElems, numR
5900: 65 71 75 69 72 65 64 2c 20 6e 75 6d 41 66 74 65 equired, numAfte
5910: 72 4c 61 73 74 2c 20 73 74 61 72 74 2c 20 69 2c rLast, start, i,
5920: 20 6a 2c 20 69 73 53 68 61 72 65 64 3b 0a 0a 20 j, isShared;..
5930: 20 20 20 69 66 20 28 54 63 6c 5f 49 73 53 68 61 if (Tcl_IsSha
5940: 72 65 64 28 6c 69 73 74 50 74 72 29 29 20 7b 0a red(listPtr)) {.
5950: 09 54 63 6c 5f 50 61 6e 69 63 28 22 25 73 20 63 .Tcl_Panic("%s c
5960: 61 6c 6c 65 64 20 77 69 74 68 20 73 68 61 72 65 alled with share
5970: 64 20 6f 62 6a 65 63 74 22 2c 20 22 54 63 6c 5f d object", "Tcl_
5980: 4c 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 22 29 ListObjReplace")
5990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
59a0: 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 50 74 72 listPtr->typePtr
59b0: 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 79 70 65 != &tclListType
59c0: 29 20 7b 0a 09 69 66 20 28 6c 69 73 74 50 74 72 ) {..if (listPtr
59d0: 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c 45 6d ->bytes == tclEm
59e0: 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 7b 0a ptyStringRep) {.
59f0: 09 20 20 20 20 69 66 20 28 21 6f 62 6a 63 29 20 . if (!objc)
5a00: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f {...return TCL_O
5a10: 4b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 K;.. }.. T
5a20: 63 6c 5f 53 65 74 4c 69 73 74 4f 62 6a 28 6c 69 cl_SetListObj(li
5a30: 73 74 50 74 72 2c 20 6f 62 6a 63 2c 20 4e 55 4c stPtr, objc, NUL
5a40: 4c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 L);..} else {..
5a50: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 int result =
5a60: 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e 79 28 69 SetListFromAny(i
5a70: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 29 3b nterp, listPtr);
5a80: 0a 0a 09 20 20 20 20 69 66 20 28 72 65 73 75 6c ... if (resul
5a90: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 t != TCL_OK) {..
5aa0: 09 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a .return result;.
5ab0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
5ac0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e . /*. * N
5ad0: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 63 6f ote that when co
5ae0: 75 6e 74 20 3d 3d 20 30 20 61 6e 64 20 6f 62 6a unt == 0 and obj
5af0: 63 20 3d 3d 20 30 2c 20 74 68 69 73 20 72 6f 75 c == 0, this rou
5b00: 74 69 6e 65 20 69 73 20 6c 6f 67 69 63 61 6c 6c tine is logicall
5b10: 79 20 61 0a 20 20 20 20 20 2a 20 6e 6f 2d 6f 70 y a. * no-op
5b20: 2c 20 72 65 6d 6f 76 69 6e 67 20 61 6e 64 20 61 , removing and a
5b30: 64 64 69 6e 67 20 6e 6f 20 65 6c 65 6d 65 6e 74 dding no element
5b40: 73 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 48 s to the list. H
5b50: 6f 77 65 76 65 72 2c 20 62 79 20 66 6c 6f 77 69 owever, by flowi
5b60: 6e 67 0a 20 20 20 20 20 2a 20 74 68 72 6f 75 67 ng. * throug
5b70: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 h this routine a
5b80: 6e 79 77 61 79 2c 20 77 65 20 67 65 74 20 74 68 nyway, we get th
5b90: 65 20 69 6d 70 6f 72 74 61 6e 74 20 73 69 64 65 e important side
5ba0: 20 65 66 66 65 63 74 20 74 68 61 74 20 74 68 65 effect that the
5bb0: 0a 20 20 20 20 20 2a 20 72 65 73 75 6c 74 69 6e . * resultin
5bc0: 67 20 6c 69 73 74 50 74 72 20 69 73 20 61 20 6c g listPtr is a l
5bd0: 69 73 74 20 69 6e 20 63 61 6e 6f 6e 63 69 61 6c ist in canoncial
5be0: 20 66 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 69 form. This is i
5bf0: 6d 70 6f 72 74 61 6e 74 2e 0a 20 20 20 20 20 2a mportant.. *
5c00: 20 52 65 73 69 73 74 20 61 6e 79 20 74 65 6d 70 Resist any temp
5c10: 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 tation to optimi
5c20: 7a 65 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 ze this case..
5c30: 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 73 74 52 */.. listR
5c40: 65 70 50 74 72 20 3d 20 4c 69 73 74 52 65 70 50 epPtr = ListRepP
5c50: 74 72 28 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 tr(listPtr);.
5c60: 20 65 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73 elemPtrs = &lis
5c70: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 tRepPtr->element
5c80: 73 3b 0a 20 20 20 20 6e 75 6d 45 6c 65 6d 73 20 s;. numElems
5c90: 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c = listRepPtr->el
5ca0: 65 6d 43 6f 75 6e 74 3b 0a 0a 20 20 20 20 69 66 emCount;.. if
5cb0: 20 28 66 69 72 73 74 20 3c 20 30 29 20 7b 0a 09 (first < 0) {..
5cc0: 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d first = 0;. }
5cd0: 0a 20 20 20 20 69 66 20 28 66 69 72 73 74 20 3e . if (first >
5ce0: 3d 20 6e 75 6d 45 6c 65 6d 73 29 20 7b 0a 09 66 = numElems) {..f
5cf0: 69 72 73 74 20 3d 20 6e 75 6d 45 6c 65 6d 73 3b irst = numElems;
5d00: 09 2f 2a 20 53 6f 20 77 65 27 6c 6c 20 69 6e 73 ./* So we'll ins
5d10: 65 72 74 20 61 66 74 65 72 20 6c 61 73 74 20 65 ert after last e
5d20: 6c 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 7d lement. */. }
5d30: 0a 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3c . if (count <
5d40: 20 30 29 20 7b 0a 09 63 6f 75 6e 74 20 3d 20 30 0) {..count = 0
5d50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
5d60: 28 66 69 72 73 74 20 3e 20 49 4e 54 5f 4d 41 58 (first > INT_MAX
5d70: 20 2d 20 63 6f 75 6e 74 20 2f 2a 20 48 61 6e 64 - count /* Hand
5d80: 6c 65 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 le integer overf
5d90: 6c 6f 77 20 2a 2f 0a 09 20 20 20 20 7c 7c 20 6e low */.. || n
5da0: 75 6d 45 6c 65 6d 73 20 3c 20 66 69 72 73 74 2b umElems < first+
5db0: 63 6f 75 6e 74 29 20 7b 0a 0a 09 63 6f 75 6e 74 count) {...count
5dc0: 20 3d 20 6e 75 6d 45 6c 65 6d 73 20 2d 20 66 69 = numElems - fi
5dd0: 72 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rst;. }..
5de0: 69 66 20 28 6f 62 6a 63 20 3e 20 4c 49 53 54 5f if (objc > LIST_
5df0: 4d 41 58 20 2d 20 28 6e 75 6d 45 6c 65 6d 73 20 MAX - (numElems
5e00: 2d 20 63 6f 75 6e 74 29 29 20 7b 0a 09 69 66 20 - count)) {..if
5e10: 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 (interp != NULL)
5e20: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f {.. Tcl_SetO
5e30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
5e40: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a Tcl_ObjPrintf(.
5e50: 09 09 20 20 20 20 22 6d 61 78 20 6c 65 6e 67 74 .. "max lengt
5e60: 68 20 6f 66 20 61 20 54 63 6c 20 6c 69 73 74 20 h of a Tcl list
5e70: 28 25 64 20 65 6c 65 6d 65 6e 74 73 29 20 65 78 (%d elements) ex
5e80: 63 65 65 64 65 64 22 2c 0a 09 09 20 20 20 20 4c ceeded",... L
5e90: 49 53 54 5f 4d 41 58 29 29 3b 0a 09 7d 0a 09 72 IST_MAX));..}..r
5ea0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 53 68 61 . }. isSha
5ec0: 72 65 64 20 3d 20 28 6c 69 73 74 52 65 70 50 74 red = (listRepPt
5ed0: 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3e 20 31 29 r->refCount > 1)
5ee0: 3b 0a 20 20 20 20 6e 75 6d 52 65 71 75 69 72 65 ;. numRequire
5ef0: 64 20 3d 20 6e 75 6d 45 6c 65 6d 73 20 2d 20 63 d = numElems - c
5f00: 6f 75 6e 74 20 2b 20 6f 62 6a 63 3b 20 2f 2a 20 ount + objc; /*
5f10: 4b 6e 6f 77 6e 20 3c 3d 20 4c 49 53 54 5f 4d 41 Known <= LIST_MA
5f20: 58 20 2a 2f 0a 20 20 20 20 6e 65 65 64 47 72 6f X */. needGro
5f30: 77 20 3d 20 6e 75 6d 52 65 71 75 69 72 65 64 20 w = numRequired
5f40: 3e 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 6d 61 > listRepPtr->ma
5f50: 78 45 6c 65 6d 43 6f 75 6e 74 3b 0a 0a 20 20 20 xElemCount;..
5f60: 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 20 69 20 for (i = 0; i
5f70: 3c 20 6f 62 6a 63 3b 20 20 69 2b 2b 29 20 7b 0a < objc; i++) {.
5f80: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e .Tcl_IncrRefCoun
5f90: 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 t(objv[i]);.
5fa0: 7d 0a 0a 20 20 20 20 69 66 20 28 6e 65 65 64 47 }.. if (needG
5fb0: 72 6f 77 20 26 26 20 21 69 73 53 68 61 72 65 64 row && !isShared
5fc0: 29 20 7b 0a 09 2f 2a 20 54 72 79 20 74 6f 20 75 ) {../* Try to u
5fd0: 73 65 20 72 65 61 6c 6c 6f 63 20 2a 2f 0a 09 4c se realloc */..L
5fe0: 69 73 74 20 2a 6e 65 77 50 74 72 20 3d 20 4e 55 ist *newPtr = NU
5ff0: 4c 4c 3b 0a 09 69 6e 74 20 61 74 74 65 6d 70 74 LL;..int attempt
6000: 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75 69 72 = 2 * numRequir
6010: 65 64 3b 0a 09 69 66 20 28 61 74 74 65 6d 70 74 ed;..if (attempt
6020: 20 3c 3d 20 4c 49 53 54 5f 4d 41 58 29 20 7b 0a <= LIST_MAX) {.
6030: 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 61 74 . newPtr = at
6040: 74 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 28 6c temptckrealloc(l
6050: 69 73 74 52 65 70 50 74 72 2c 20 4c 49 53 54 5f istRepPtr, LIST_
6060: 53 49 5a 45 28 61 74 74 65 6d 70 74 29 29 3b 0a SIZE(attempt));.
6070: 09 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d .}..if (newPtr =
6080: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 61 = NULL) {.. a
6090: 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 71 75 ttempt = numRequ
60a0: 69 72 65 64 20 2b 20 31 20 2b 20 54 43 4c 5f 4d ired + 1 + TCL_M
60b0: 49 4e 5f 45 4c 45 4d 45 4e 54 5f 47 52 4f 57 54 IN_ELEMENT_GROWT
60c0: 48 3b 0a 09 20 20 20 20 69 66 20 28 61 74 74 65 H;.. if (atte
60d0: 6d 70 74 20 3e 20 4c 49 53 54 5f 4d 41 58 29 20 mpt > LIST_MAX)
60e0: 7b 0a 09 09 61 74 74 65 6d 70 74 20 3d 20 4c 49 {...attempt = LI
60f0: 53 54 5f 4d 41 58 3b 0a 09 20 20 20 20 7d 0a 09 ST_MAX;.. }..
6100: 20 20 20 20 6e 65 77 50 74 72 20 3d 20 61 74 74 newPtr = att
6110: 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 28 6c 69 emptckrealloc(li
6120: 73 74 52 65 70 50 74 72 2c 20 4c 49 53 54 5f 53 stRepPtr, LIST_S
6130: 49 5a 45 28 61 74 74 65 6d 70 74 29 29 3b 0a 09 IZE(attempt));..
6140: 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d 3d }..if (newPtr ==
6150: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 61 74 NULL) {.. at
6160: 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 71 75 69 tempt = numRequi
6170: 72 65 64 3b 0a 09 20 20 20 20 6e 65 77 50 74 72 red;.. newPtr
6180: 20 3d 20 61 74 74 65 6d 70 74 63 6b 72 65 61 6c = attemptckreal
6190: 6c 6f 63 28 6c 69 73 74 52 65 70 50 74 72 2c 20 loc(listRepPtr,
61a0: 4c 49 53 54 5f 53 49 5a 45 28 61 74 74 65 6d 70 LIST_SIZE(attemp
61b0: 74 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6e 65 77 t));..}..if (new
61c0: 50 74 72 29 20 7b 0a 09 20 20 20 20 6c 69 73 74 Ptr) {.. list
61d0: 52 65 70 50 74 72 20 3d 20 6e 65 77 50 74 72 3b RepPtr = newPtr;
61e0: 0a 09 20 20 20 20 6c 69 73 74 50 74 72 2d 3e 69 .. listPtr->i
61f0: 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 nternalRep.twoPt
6200: 72 56 61 6c 75 65 2e 70 74 72 31 20 3d 20 6c 69 rValue.ptr1 = li
6210: 73 74 52 65 70 50 74 72 3b 0a 09 20 20 20 20 65 stRepPtr;.. e
6220: 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73 74 52 lemPtrs = &listR
6230: 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 73 3b epPtr->elements;
6240: 0a 09 20 20 20 20 6c 69 73 74 52 65 70 50 74 72 .. listRepPtr
6250: 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74 20 3d ->maxElemCount =
6260: 20 61 74 74 65 6d 70 74 3b 0a 09 20 20 20 20 6e attempt;.. n
6270: 65 65 64 47 72 6f 77 20 3d 20 6e 75 6d 52 65 71 eedGrow = numReq
6280: 75 69 72 65 64 20 3e 20 6c 69 73 74 52 65 70 50 uired > listRepP
6290: 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74 tr->maxElemCount
62a0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 ;..}. }. i
62b0: 66 20 28 21 6e 65 65 64 47 72 6f 77 20 26 26 20 f (!needGrow &&
62c0: 21 69 73 53 68 61 72 65 64 29 20 7b 0a 09 69 6e !isShared) {..in
62d0: 74 20 73 68 69 66 74 3b 0a 0a 09 2f 2a 0a 09 20 t shift;.../*..
62e0: 2a 20 43 61 6e 20 75 73 65 20 74 68 65 20 63 75 * Can use the cu
62f0: 72 72 65 6e 74 20 4c 69 73 74 20 73 74 72 75 63 rrent List struc
6300: 74 2e 20 46 69 72 73 74 20 22 64 65 6c 65 74 65 t. First "delete
6310: 22 20 63 6f 75 6e 74 20 65 6c 65 6d 65 6e 74 73 " count elements
6320: 0a 09 20 2a 20 73 74 61 72 74 69 6e 67 20 61 74 .. * starting at
6330: 20 66 69 72 73 74 2e 0a 09 20 2a 2f 0a 0a 09 66 first... */...f
6340: 6f 72 20 28 6a 20 3d 20 66 69 72 73 74 3b 20 20 or (j = first;
6350: 6a 20 3c 20 66 69 72 73 74 20 2b 20 63 6f 75 6e j < first + coun
6360: 74 3b 20 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 t; j++) {..
6370: 54 63 6c 5f 4f 62 6a 20 2a 76 69 63 74 69 6d 50 Tcl_Obj *victimP
6380: 74 72 20 3d 20 65 6c 65 6d 50 74 72 73 5b 6a 5d tr = elemPtrs[j]
6390: 3b 0a 0a 09 20 20 20 20 54 63 6c 44 65 63 72 52 ;... TclDecrR
63a0: 65 66 43 6f 75 6e 74 28 76 69 63 74 69 6d 50 74 efCount(victimPt
63b0: 72 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 r);..}.../*.. *
63c0: 53 68 69 66 74 20 74 68 65 20 65 6c 65 6d 65 6e Shift the elemen
63d0: 74 73 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 ts after the las
63e0: 74 20 6f 6e 65 20 72 65 6d 6f 76 65 64 20 74 6f t one removed to
63f0: 20 74 68 65 69 72 20 6e 65 77 0a 09 20 2a 20 6c their new.. * l
6400: 6f 63 61 74 69 6f 6e 73 2e 0a 09 20 2a 2f 0a 0a ocations... */..
6410: 09 73 74 61 72 74 20 3d 20 66 69 72 73 74 20 2b .start = first +
6420: 20 63 6f 75 6e 74 3b 0a 09 6e 75 6d 41 66 74 65 count;..numAfte
6430: 72 4c 61 73 74 20 3d 20 6e 75 6d 45 6c 65 6d 73 rLast = numElems
6440: 20 2d 20 73 74 61 72 74 3b 0a 09 73 68 69 66 74 - start;..shift
6450: 20 3d 20 6f 62 6a 63 20 2d 20 63 6f 75 6e 74 3b = objc - count;
6460: 09 2f 2a 20 6e 75 6d 4e 65 77 45 6c 65 6d 73 20 ./* numNewElems
6470: 2d 20 6e 75 6d 44 65 6c 65 74 65 64 20 2a 2f 0a - numDeleted */.
6480: 09 69 66 20 28 28 6e 75 6d 41 66 74 65 72 4c 61 .if ((numAfterLa
6490: 73 74 20 3e 20 30 29 20 26 26 20 28 73 68 69 66 st > 0) && (shif
64a0: 74 20 21 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 t != 0)) {..
64b0: 54 63 6c 5f 4f 62 6a 20 2a 2a 73 72 63 20 3d 20 Tcl_Obj **src =
64c0: 65 6c 65 6d 50 74 72 73 20 2b 20 73 74 61 72 74 elemPtrs + start
64d0: 3b 0a 0a 09 20 20 20 20 6d 65 6d 6d 6f 76 65 28 ;... memmove(
64e0: 73 72 63 2b 73 68 69 66 74 2c 20 73 72 63 2c 20 src+shift, src,
64f0: 28 73 69 7a 65 5f 74 29 20 6e 75 6d 41 66 74 65 (size_t) numAfte
6500: 72 4c 61 73 74 20 2a 20 73 69 7a 65 6f 66 28 54 rLast * sizeof(T
6510: 63 6c 5f 4f 62 6a 2a 29 29 3b 0a 09 7d 0a 20 20 cl_Obj*));..}.
6520: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 } else {../*..
6530: 20 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 74 68 * Cannot use th
6540: 65 20 63 75 72 72 65 6e 74 20 4c 69 73 74 20 73 e current List s
6550: 74 72 75 63 74 3b 20 69 74 20 69 73 20 73 68 61 truct; it is sha
6560: 72 65 64 2c 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 red, too small,
6570: 6f 72 0a 09 20 2a 20 62 6f 74 68 2e 20 41 6c 6c or.. * both. All
6580: 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 72 75 ocate a new stru
6590: 63 74 20 61 6e 64 20 69 6e 73 65 72 74 20 65 6c ct and insert el
65a0: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 69 74 2e 0a ements into it..
65b0: 09 20 2a 2f 0a 0a 09 4c 69 73 74 20 2a 6f 6c 64 . */...List *old
65c0: 4c 69 73 74 52 65 70 50 74 72 20 3d 20 6c 69 73 ListRepPtr = lis
65d0: 74 52 65 70 50 74 72 3b 0a 09 54 63 6c 5f 4f 62 tRepPtr;..Tcl_Ob
65e0: 6a 20 2a 2a 6f 6c 64 50 74 72 73 20 3d 20 65 6c j **oldPtrs = el
65f0: 65 6d 50 74 72 73 3b 0a 09 69 6e 74 20 6e 65 77 emPtrs;..int new
6600: 4d 61 78 3b 0a 0a 09 69 66 20 28 6e 65 65 64 47 Max;...if (needG
6610: 72 6f 77 29 7b 0a 09 20 20 20 20 6e 65 77 4d 61 row){.. newMa
6620: 78 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75 69 x = 2 * numRequi
6630: 72 65 64 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 red;..} else {..
6640: 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 6c 69 73 newMax = lis
6650: 74 52 65 70 50 74 72 2d 3e 6d 61 78 45 6c 65 6d tRepPtr->maxElem
6660: 43 6f 75 6e 74 3b 0a 09 7d 0a 0a 09 6c 69 73 74 Count;..}...list
6670: 52 65 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74 RepPtr = Attempt
6680: 4e 65 77 4c 69 73 74 28 4e 55 4c 4c 2c 20 6e 65 NewList(NULL, ne
6690: 77 4d 61 78 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 wMax, NULL);..if
66a0: 20 28 6c 69 73 74 52 65 70 50 74 72 20 3d 3d 20 (listRepPtr ==
66b0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 75 6e 73 NULL) {.. uns
66c0: 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 20 igned int limit
66d0: 3d 20 4c 49 53 54 5f 4d 41 58 20 2d 20 6e 75 6d = LIST_MAX - num
66e0: 52 65 71 75 69 72 65 64 3b 0a 09 20 20 20 20 75 Required;.. u
66f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 65 78 74 72 nsigned int extr
6700: 61 20 3d 20 6e 75 6d 52 65 71 75 69 72 65 64 20 a = numRequired
6710: 2d 20 6e 75 6d 45 6c 65 6d 73 0a 09 09 20 20 20 - numElems...
6720: 20 2b 20 54 43 4c 5f 4d 49 4e 5f 45 4c 45 4d 45 + TCL_MIN_ELEME
6730: 4e 54 5f 47 52 4f 57 54 48 3b 0a 09 20 20 20 20 NT_GROWTH;..
6740: 69 6e 74 20 67 72 6f 77 74 68 20 3d 20 28 69 6e int growth = (in
6750: 74 29 20 28 28 65 78 74 72 61 20 3e 20 6c 69 6d t) ((extra > lim
6760: 69 74 29 20 3f 20 6c 69 6d 69 74 20 3a 20 65 78 it) ? limit : ex
6770: 74 72 61 29 3b 0a 0a 09 20 20 20 20 6c 69 73 74 tra);... list
6780: 52 65 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74 RepPtr = Attempt
6790: 4e 65 77 4c 69 73 74 28 4e 55 4c 4c 2c 20 6e 75 NewList(NULL, nu
67a0: 6d 52 65 71 75 69 72 65 64 20 2b 20 67 72 6f 77 mRequired + grow
67b0: 74 68 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 th, NULL);..
67c0: 69 66 20 28 6c 69 73 74 52 65 70 50 74 72 20 3d if (listRepPtr =
67d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 69 73 74 = NULL) {...list
67e0: 52 65 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74 RepPtr = Attempt
67f0: 4e 65 77 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 NewList(interp,
6800: 6e 75 6d 52 65 71 75 69 72 65 64 2c 20 4e 55 4c numRequired, NUL
6810: 4c 29 3b 0a 09 09 69 66 20 28 6c 69 73 74 52 65 L);...if (listRe
6820: 70 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a pPtr == NULL) {.
6830: 09 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 .. for (i = 0
6840: 3b 20 20 69 20 3c 20 6f 62 6a 63 3b 20 20 69 2b ; i < objc; i+
6850: 2b 29 20 7b 0a 09 09 09 2f 2a 20 53 65 65 20 62 +) {..../* See b
6860: 75 67 20 33 35 39 38 35 38 30 20 2a 2f 0a 23 69 ug 3598580 */.#i
6870: 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
6880: 49 4f 4e 20 3e 20 38 0a 09 09 09 54 63 6c 5f 44 ION > 8....Tcl_D
6890: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 ecrRefCount(objv
68a0: 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a 09 09 09 6f [i]);.#else....o
68b0: 62 6a 76 5b 69 5d 2d 3e 72 65 66 43 6f 75 6e 74 bjv[i]->refCount
68c0: 2d 2d 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 --;.#endif...
68d0: 20 7d 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 }... return
68e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 TCL_ERROR;...}..
68f0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 69 73 74 50 }..}...listP
6900: 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e tr->internalRep.
6910: 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 31 twoPtrValue.ptr1
6920: 20 3d 20 6c 69 73 74 52 65 70 50 74 72 3b 0a 09 = listRepPtr;..
6930: 6c 69 73 74 52 65 70 50 74 72 2d 3e 72 65 66 43 listRepPtr->refC
6940: 6f 75 6e 74 2b 2b 3b 0a 0a 09 65 6c 65 6d 50 74 ount++;...elemPt
6950: 72 73 20 3d 20 26 6c 69 73 74 52 65 70 50 74 72 rs = &listRepPtr
6960: 2d 3e 65 6c 65 6d 65 6e 74 73 3b 0a 0a 09 69 66 ->elements;...if
6970: 20 28 69 73 53 68 61 72 65 64 29 20 7b 0a 09 20 (isShared) {..
6980: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 /*.. * Th
6990: 65 20 6f 6c 64 20 73 74 72 75 63 74 20 77 69 6c e old struct wil
69a0: 6c 20 72 65 6d 61 69 6e 20 69 6e 20 70 6c 61 63 l remain in plac
69b0: 65 3b 20 6e 65 65 64 20 6e 65 77 20 72 65 66 43 e; need new refC
69c0: 6f 75 6e 74 73 20 66 6f 72 20 74 68 65 0a 09 20 ounts for the..
69d0: 20 20 20 20 2a 20 6e 65 77 20 4c 69 73 74 20 73 * new List s
69e0: 74 72 75 63 74 20 72 65 66 65 72 65 6e 63 65 73 truct references
69f0: 2e 20 43 6f 70 79 20 6f 76 65 72 20 6f 6e 6c 79 . Copy over only
6a00: 20 74 68 65 20 73 75 72 76 69 76 69 6e 67 0a 09 the surviving..
6a10: 20 20 20 20 20 2a 20 65 6c 65 6d 65 6e 74 73 2e * elements.
6a20: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
6a30: 66 6f 72 20 28 69 3d 30 3b 20 69 20 3c 20 66 69 for (i=0; i < fi
6a40: 72 73 74 3b 20 69 2b 2b 29 20 7b 0a 09 09 65 6c rst; i++) {...el
6a50: 65 6d 50 74 72 73 5b 69 5d 20 3d 20 6f 6c 64 50 emPtrs[i] = oldP
6a60: 74 72 73 5b 69 5d 3b 0a 09 09 54 63 6c 5f 49 6e trs[i];...Tcl_In
6a70: 63 72 52 65 66 43 6f 75 6e 74 28 65 6c 65 6d 50 crRefCount(elemP
6a80: 74 72 73 5b 69 5d 29 3b 0a 09 20 20 20 20 7d 0a trs[i]);.. }.
6a90: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 66 69 . for (i = fi
6aa0: 72 73 74 20 2b 20 63 6f 75 6e 74 2c 20 6a 20 3d rst + count, j =
6ab0: 20 66 69 72 73 74 20 2b 20 6f 62 6a 63 3b 0a 09 first + objc;..
6ac0: 09 20 20 20 20 6a 20 3c 20 6e 75 6d 52 65 71 75 . j < numRequ
6ad0: 69 72 65 64 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 20 ired; i++, j++)
6ae0: 7b 0a 09 09 65 6c 65 6d 50 74 72 73 5b 6a 5d 20 {...elemPtrs[j]
6af0: 3d 20 6f 6c 64 50 74 72 73 5b 69 5d 3b 0a 09 09 = oldPtrs[i];...
6b00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
6b10: 28 65 6c 65 6d 50 74 72 73 5b 6a 5d 29 3b 0a 09 (elemPtrs[j]);..
6b20: 20 20 20 20 7d 0a 0a 09 20 20 20 20 6f 6c 64 4c }... oldL
6b30: 69 73 74 52 65 70 50 74 72 2d 3e 72 65 66 43 6f istRepPtr->refCo
6b40: 75 6e 74 2d 2d 3b 0a 09 7d 20 65 6c 73 65 20 7b unt--;..} else {
6b50: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
6b60: 20 54 68 65 20 6f 6c 64 20 73 74 72 75 63 74 20 The old struct
6b70: 77 69 6c 6c 20 62 65 20 72 65 6d 6f 76 65 64 3b will be removed;
6b80: 20 75 73 65 20 69 74 73 20 69 6e 68 65 72 69 74 use its inherit
6b90: 65 64 20 72 65 66 43 6f 75 6e 74 73 2e 0a 09 20 ed refCounts...
6ba0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 */... if
6bb0: 28 66 69 72 73 74 20 3e 20 30 29 20 7b 0a 09 09 (first > 0) {...
6bc0: 6d 65 6d 63 70 79 28 65 6c 65 6d 50 74 72 73 2c memcpy(elemPtrs,
6bd0: 20 6f 6c 64 50 74 72 73 2c 20 28 73 69 7a 65 5f oldPtrs, (size_
6be0: 74 29 20 66 69 72 73 74 20 2a 20 73 69 7a 65 6f t) first * sizeo
6bf0: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 29 3b 0a 09 f(Tcl_Obj *));..
6c00: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 }... /*..
6c10: 20 20 20 20 20 2a 20 22 44 65 6c 65 74 65 22 20 * "Delete"
6c20: 63 6f 75 6e 74 20 65 6c 65 6d 65 6e 74 73 20 73 count elements s
6c30: 74 61 72 74 69 6e 67 20 61 74 20 66 69 72 73 74 tarting at first
6c40: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
6c50: 20 66 6f 72 20 28 6a 20 3d 20 66 69 72 73 74 3b for (j = first;
6c60: 20 20 6a 20 3c 20 66 69 72 73 74 20 2b 20 63 6f j < first + co
6c70: 75 6e 74 3b 20 20 6a 2b 2b 29 20 7b 0a 09 09 54 unt; j++) {...T
6c80: 63 6c 5f 4f 62 6a 20 2a 76 69 63 74 69 6d 50 74 cl_Obj *victimPt
6c90: 72 20 3d 20 6f 6c 64 50 74 72 73 5b 6a 5d 3b 0a r = oldPtrs[j];.
6ca0: 0a 09 09 54 63 6c 44 65 63 72 52 65 66 43 6f 75 ...TclDecrRefCou
6cb0: 6e 74 28 76 69 63 74 69 6d 50 74 72 29 3b 0a 09 nt(victimPtr);..
6cc0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 }... /*..
6cd0: 20 20 20 20 20 2a 20 43 6f 70 79 20 74 68 65 20 * Copy the
6ce0: 65 6c 65 6d 65 6e 74 73 20 61 66 74 65 72 20 74 elements after t
6cf0: 68 65 20 6c 61 73 74 20 6f 6e 65 20 72 65 6d 6f he last one remo
6d00: 76 65 64 2c 20 73 68 69 66 74 65 64 20 74 6f 20 ved, shifted to
6d10: 74 68 65 69 72 0a 09 20 20 20 20 20 2a 20 6e 65 their.. * ne
6d20: 77 20 6c 6f 63 61 74 69 6f 6e 73 2e 0a 09 20 20 w locations...
6d30: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 73 74 61 72 */... star
6d40: 74 20 3d 20 66 69 72 73 74 20 2b 20 63 6f 75 6e t = first + coun
6d50: 74 3b 0a 09 20 20 20 20 6e 75 6d 41 66 74 65 72 t;.. numAfter
6d60: 4c 61 73 74 20 3d 20 6e 75 6d 45 6c 65 6d 73 20 Last = numElems
6d70: 2d 20 73 74 61 72 74 3b 0a 09 20 20 20 20 69 66 - start;.. if
6d80: 20 28 6e 75 6d 41 66 74 65 72 4c 61 73 74 20 3e (numAfterLast >
6d90: 20 30 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 65 0) {...memcpy(e
6da0: 6c 65 6d 50 74 72 73 20 2b 20 66 69 72 73 74 20 lemPtrs + first
6db0: 2b 20 6f 62 6a 63 2c 20 6f 6c 64 50 74 72 73 20 + objc, oldPtrs
6dc0: 2b 20 73 74 61 72 74 2c 0a 09 09 09 28 73 69 7a + start,....(siz
6dd0: 65 5f 74 29 20 6e 75 6d 41 66 74 65 72 4c 61 73 e_t) numAfterLas
6de0: 74 20 2a 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f t * sizeof(Tcl_O
6df0: 62 6a 20 2a 29 29 3b 0a 09 20 20 20 20 7d 0a 0a bj *));.. }..
6e00: 09 20 20 20 20 63 6b 66 72 65 65 28 6f 6c 64 4c . ckfree(oldL
6e10: 69 73 74 52 65 70 50 74 72 29 3b 0a 09 7d 0a 20 istRepPtr);..}.
6e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
6e30: 20 20 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e * Insert the n
6e40: 65 77 20 65 6c 65 6d 65 6e 74 73 20 69 6e 74 6f ew elements into
6e50: 20 65 6c 65 6d 50 74 72 73 20 62 65 66 6f 72 65 elemPtrs before
6e60: 20 22 66 69 72 73 74 22 2e 0a 20 20 20 20 20 2a "first".. *
6e70: 2f 0a 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 2c /.. for (i=0,
6e80: 6a 3d 66 69 72 73 74 20 3b 20 69 3c 6f 62 6a 63 j=first ; i<objc
6e90: 20 3b 20 69 2b 2b 2c 6a 2b 2b 29 20 7b 0a 09 65 ; i++,j++) {..e
6ea0: 6c 65 6d 50 74 72 73 5b 6a 5d 20 3d 20 6f 62 6a lemPtrs[j] = obj
6eb0: 76 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 v[i];. }..
6ec0: 20 2f 2a 0a 20 20 20 20 20 2a 20 55 70 64 61 74 /*. * Updat
6ed0: 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 65 e the count of e
6ee0: 6c 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 2f lements.. */
6ef0: 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 50 74 72 .. listRepPtr
6f00: 2d 3e 65 6c 65 6d 43 6f 75 6e 74 20 3d 20 6e 75 ->elemCount = nu
6f10: 6d 52 65 71 75 69 72 65 64 3b 0a 0a 20 20 20 20 mRequired;..
6f20: 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 76 61 6c 69 /*. * Invali
6f30: 64 61 74 65 20 61 6e 64 20 66 72 65 65 20 61 6e date and free an
6f40: 79 20 6f 6c 64 20 73 74 72 69 6e 67 20 72 65 70 y old string rep
6f50: 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 69 6e 63 resentation sinc
6f60: 65 20 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 0a 20 e it no longer.
6f70: 20 20 20 20 2a 20 72 65 66 6c 65 63 74 73 20 74 * reflects t
6f80: 68 65 20 6c 69 73 74 27 73 20 69 6e 74 65 72 6e he list's intern
6f90: 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f al representatio
6fa0: 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 n.. */..
6fb0: 54 63 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72 TclInvalidateStr
6fc0: 69 6e 67 52 65 70 28 6c 69 73 74 50 74 72 29 3b ingRep(listPtr);
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6fe0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7030: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4c 69 6e ---. *. * TclLin
7040: 64 65 78 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a dexList --. *. *
7050: 09 49 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 .Implements the
7060: 27 6c 69 6e 64 65 78 27 20 63 6f 6d 6d 61 6e 64 'lindex' command
7070: 20 77 68 65 6e 20 6f 62 6a 63 3d 3d 33 2e 0a 20 when objc==3..
7080: 2a 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 65 64 *. *.Implemented
7090: 20 65 6e 74 69 72 65 6c 79 20 61 73 20 61 20 77 entirely as a w
70a0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 27 54 rapper around 'T
70b0: 63 6c 4c 69 6e 64 65 78 46 6c 61 74 27 2e 20 52 clLindexFlat'. R
70c0: 65 63 6f 6e 66 69 67 75 72 65 73 0a 20 2a 09 74 econfigures. *.t
70d0: 68 65 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 6d he argument form
70e0: 61 74 20 69 6e 74 6f 20 72 65 71 75 69 72 65 64 at into required
70f0: 20 66 6f 72 6d 20 77 68 69 6c 65 20 74 61 6b 69 form while taki
7100: 6e 67 20 63 61 72 65 20 74 6f 20 6d 61 6e 61 67 ng care to manag
7110: 65 0a 20 2a 09 73 68 69 6d 6d 65 72 69 6e 67 20 e. *.shimmering
7120: 73 6f 20 61 73 20 74 6f 20 74 65 6e 64 20 74 6f so as to tend to
7130: 20 6b 65 65 70 20 74 68 65 20 6d 6f 73 74 20 75 keep the most u
7140: 73 65 66 75 6c 20 69 6e 74 72 65 70 73 0a 20 2a seful intreps. *
7150: 09 61 6e 64 2f 6f 72 20 61 76 6f 69 64 20 74 68 .and/or avoid th
7160: 65 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 e most expensive
7170: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 20 2a conversions.. *
7180: 0a 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 . * Value. *. *.
7190: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 A pointer to the
71a0: 20 73 70 65 63 69 66 69 65 64 20 65 6c 65 6d 65 specified eleme
71b0: 6e 74 2c 20 77 69 74 68 20 69 74 73 20 27 72 65 nt, with its 're
71c0: 66 43 6f 75 6e 74 27 20 69 6e 63 72 65 6d 65 6e fCount' incremen
71d0: 74 65 64 2c 20 6f 72 0a 20 2a 09 4e 55 4c 4c 20 ted, or. *.NULL
71e0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 if an error occu
71f0: 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 4e 6f 74 65 rred.. *. * Note
7200: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7250: 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c /..Tcl_Obj *.Tcl
7260: 4c 69 6e 64 65 78 4c 69 73 74 28 0a 20 20 20 20 LindexList(.
7270: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7280: 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e 74 65 rp,../* Tcl inte
7290: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 rpreter. */.
72a0: 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 Tcl_Obj *listPtr
72b0: 2c 09 09 2f 2a 20 4c 69 73 74 20 62 65 69 6e 67 ,../* List being
72c0: 20 75 6e 70 61 63 6b 65 64 2e 20 2a 2f 0a 20 20 unpacked. */.
72d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 72 67 50 74 Tcl_Obj *argPt
72e0: 72 29 09 09 2f 2a 20 49 6e 64 65 78 20 6f 72 20 r)../* Index or
72f0: 69 6e 64 65 78 20 6c 69 73 74 2e 20 2a 2f 0a 7b index list. */.{
7300: 0a 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 3b .. int index;
7310: 09 09 09 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f .../* Index into
7320: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 the list. */.
7330: 20 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 64 65 78 Tcl_Obj *index
7340: 4c 69 73 74 43 6f 70 79 3b 0a 0a 20 20 20 20 2f ListCopy;.. /
7350: 2a 0a 20 20 20 20 20 2a 20 44 65 74 65 72 6d 69 *. * Determi
7360: 6e 65 20 77 68 65 74 68 65 72 20 61 72 67 50 74 ne whether argPt
7370: 72 20 64 65 73 69 67 6e 61 74 65 73 20 61 20 6c r designates a l
7380: 69 73 74 20 6f 72 20 61 20 73 69 6e 67 6c 65 20 ist or a single
7390: 69 6e 64 65 78 2e 20 57 65 20 68 61 76 65 0a 20 index. We have.
73a0: 20 20 20 20 2a 20 74 6f 20 62 65 20 63 61 72 65 * to be care
73b0: 66 75 6c 20 61 62 6f 75 74 20 74 68 65 20 6f 72 ful about the or
73c0: 64 65 72 20 6f 66 20 74 68 65 20 63 68 65 63 6b der of the check
73d0: 73 20 74 6f 20 61 76 6f 69 64 20 72 65 70 65 61 s to avoid repea
73e0: 74 65 64 0a 20 20 20 20 20 2a 20 73 68 69 6d 6d ted. * shimm
73f0: 65 72 69 6e 67 3b 20 73 65 65 20 54 49 50 23 32 ering; see TIP#2
7400: 32 20 61 6e 64 20 54 49 50 23 33 33 20 66 6f 72 2 and TIP#33 for
7410: 20 74 68 65 20 64 65 74 61 69 6c 73 2e 0a 20 20 the details..
7420: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61 */.. if (a
7430: 72 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21 rgPtr->typePtr !
7440: 3d 20 26 74 63 6c 4c 69 73 74 54 79 70 65 0a 09 = &tclListType..
7450: 20 20 20 20 26 26 20 54 63 6c 47 65 74 49 6e 74 && TclGetInt
7460: 46 6f 72 49 6e 64 65 78 4d 28 4e 55 4c 4c 20 2c ForIndexM(NULL ,
7470: 20 61 72 67 50 74 72 2c 20 30 2c 20 26 69 6e 64 argPtr, 0, &ind
7480: 65 78 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) == TCL_OK) {
7490: 0a 09 2f 2a 0a 09 20 2a 20 61 72 67 50 74 72 20 ../*.. * argPtr
74a0: 64 65 73 69 67 6e 61 74 65 73 20 61 20 73 69 6e designates a sin
74b0: 67 6c 65 20 69 6e 64 65 78 2e 0a 09 20 2a 2f 0a gle index... */.
74c0: 0a 09 72 65 74 75 72 6e 20 54 63 6c 4c 69 6e 64 ..return TclLind
74d0: 65 78 46 6c 61 74 28 69 6e 74 65 72 70 2c 20 6c exFlat(interp, l
74e0: 69 73 74 50 74 72 2c 20 31 2c 20 26 61 72 67 50 istPtr, 1, &argP
74f0: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
7500: 2f 2a 0a 20 20 20 20 20 2a 20 48 65 72 65 20 77 /*. * Here w
7510: 65 20 6d 61 6b 65 20 61 20 70 72 69 76 61 74 65 e make a private
7520: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 64 copy of the ind
7530: 65 78 20 6c 69 73 74 20 61 72 67 75 6d 65 6e 74 ex list argument
7540: 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 0a 20 20 to avoid any.
7550: 20 20 20 2a 20 73 68 69 6d 6d 65 72 69 6e 67 20 * shimmering
7560: 69 73 73 75 65 73 20 74 68 61 74 20 6d 69 67 68 issues that migh
7570: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 t invalidate the
7580: 20 69 6e 64 69 63 65 73 20 61 72 72 61 79 20 62 indices array b
7590: 65 6c 6f 77 20 77 68 69 6c 65 0a 20 20 20 20 20 elow while.
75a0: 2a 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 75 * we are still u
75b0: 73 69 6e 67 20 69 74 2e 20 54 68 69 73 20 69 73 sing it. This is
75c0: 20 70 72 6f 62 61 62 6c 79 20 75 6e 6e 65 63 65 probably unnece
75d0: 73 73 61 72 79 2e 20 49 74 20 64 6f 65 73 20 6e ssary. It does n
75e0: 6f 74 20 61 70 70 65 61 72 0a 20 20 20 20 20 2a ot appear. *
75f0: 20 74 68 61 74 20 61 6e 79 20 64 61 6d 61 67 69 that any damagi
7600: 6e 67 20 73 68 69 6d 6d 65 72 69 6e 67 20 69 73 ng shimmering is
7610: 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 6e possible, and n
7620: 6f 20 74 65 73 74 20 68 61 73 20 62 65 65 6e 20 o test has been
7630: 64 65 76 69 73 65 64 0a 20 20 20 20 20 2a 20 74 devised. * t
7640: 6f 20 73 68 6f 77 20 61 6e 79 20 65 72 72 6f 72 o show any error
7650: 20 77 68 65 6e 20 74 68 69 73 20 70 72 69 76 61 when this priva
7660: 74 65 20 63 6f 70 79 20 69 73 20 6e 6f 74 20 6d te copy is not m
7670: 61 64 65 2e 20 42 75 74 20 69 74 27 73 20 63 68 ade. But it's ch
7680: 65 61 70 2c 0a 20 20 20 20 20 2a 20 61 6e 64 20 eap,. * and
7690: 69 74 20 6f 66 66 65 72 73 20 73 6f 6d 65 20 66 it offers some f
76a0: 75 74 75 72 65 2d 70 72 6f 6f 66 69 6e 67 20 69 uture-proofing i
76b0: 6e 73 75 72 61 6e 63 65 20 69 6e 20 63 61 73 65 nsurance in case
76c0: 20 74 68 65 20 54 63 6c 4c 69 6e 64 65 78 46 6c the TclLindexFl
76d0: 61 74 0a 20 20 20 20 20 2a 20 69 6d 70 6c 65 6d at. * implem
76e0: 65 6e 74 61 74 69 6f 6e 20 63 68 61 6e 67 65 73 entation changes
76f0: 20 69 6e 20 73 6f 6d 65 20 75 6e 65 78 70 65 63 in some unexpec
7700: 74 65 64 20 77 61 79 2c 20 6f 72 20 73 6f 6d 65 ted way, or some
7710: 20 6e 65 77 20 66 6f 72 6d 20 6f 66 0a 20 20 20 new form of.
7720: 20 20 2a 20 74 72 61 63 65 20 6f 72 20 63 61 6c * trace or cal
7730: 6c 62 61 63 6b 20 70 65 72 6d 69 74 73 20 74 68 lback permits th
7740: 69 6e 67 73 20 74 6f 20 68 61 70 70 65 6e 20 74 ings to happen t
7750: 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a hat the current.
7760: 20 20 20 20 20 2a 20 69 6d 70 6c 65 6d 65 6e 74 * implement
7770: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 0a ation does not..
7780: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 64 */.. ind
7790: 65 78 4c 69 73 74 43 6f 70 79 20 3d 20 54 63 6c exListCopy = Tcl
77a0: 4c 69 73 74 4f 62 6a 43 6f 70 79 28 4e 55 4c 4c ListObjCopy(NULL
77b0: 2c 20 61 72 67 50 74 72 29 3b 0a 20 20 20 20 69 , argPtr);. i
77c0: 66 20 28 69 6e 64 65 78 4c 69 73 74 43 6f 70 79 f (indexListCopy
77d0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a == NULL) {../*.
77e0: 09 20 2a 20 61 72 67 50 74 72 20 64 65 73 69 67 . * argPtr desig
77f0: 6e 61 74 65 73 20 73 6f 6d 65 74 68 69 6e 67 20 nates something
7800: 74 68 61 74 20 69 73 20 6e 65 69 74 68 65 72 20 that is neither
7810: 61 6e 20 69 6e 64 65 78 20 6e 6f 72 20 61 0a 09 an index nor a..
7820: 20 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 6c * well-formed l
7830: 69 73 74 2e 20 52 65 70 6f 72 74 20 74 68 65 20 ist. Report the
7840: 65 72 72 6f 72 20 76 69 61 20 54 63 6c 4c 69 6e error via TclLin
7850: 64 65 78 46 6c 61 74 2e 0a 09 20 2a 2f 0a 0a 09 dexFlat... */...
7860: 72 65 74 75 72 6e 20 54 63 6c 4c 69 6e 64 65 78 return TclLindex
7870: 46 6c 61 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 Flat(interp, lis
7880: 74 50 74 72 2c 20 31 2c 20 26 61 72 67 50 74 72 tPtr, 1, &argPtr
7890: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a );. }.. {.
78a0: 09 69 6e 74 20 69 6e 64 65 78 43 6f 75 6e 74 20 .int indexCount
78b0: 3d 20 2d 31 3b 09 09 2f 2a 20 53 69 7a 65 20 6f = -1;../* Size o
78c0: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6c f the array of l
78d0: 69 73 74 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a ist indices. */.
78e0: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 69 6e 64 69 63 .Tcl_Obj **indic
78f0: 65 73 20 3d 20 4e 55 4c 4c 3b 20 09 2f 2a 20 41 es = NULL; ./* A
7900: 72 72 61 79 20 6f 66 20 6c 69 73 74 20 69 6e 64 rray of list ind
7910: 69 63 65 73 2e 20 2a 2f 0a 0a 09 54 63 6c 4c 69 ices. */...TclLi
7920: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
7930: 28 4e 55 4c 4c 2c 20 69 6e 64 65 78 4c 69 73 74 (NULL, indexList
7940: 43 6f 70 79 2c 20 26 69 6e 64 65 78 43 6f 75 6e Copy, &indexCoun
7950: 74 2c 20 26 69 6e 64 69 63 65 73 29 3b 0a 09 6c t, &indices);..l
7960: 69 73 74 50 74 72 20 3d 20 54 63 6c 4c 69 6e 64 istPtr = TclLind
7970: 65 78 46 6c 61 74 28 69 6e 74 65 72 70 2c 20 6c exFlat(interp, l
7980: 69 73 74 50 74 72 2c 20 69 6e 64 65 78 43 6f 75 istPtr, indexCou
7990: 6e 74 2c 20 69 6e 64 69 63 65 73 29 3b 0a 20 20 nt, indices);.
79a0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
79b0: 52 65 66 43 6f 75 6e 74 28 69 6e 64 65 78 4c 69 RefCount(indexLi
79c0: 73 74 43 6f 70 79 29 3b 0a 20 20 20 20 72 65 74 stCopy);. ret
79d0: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0c urn listPtr;.}..
79e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
7a30: 20 2a 20 20 54 63 6c 4c 69 6e 64 65 78 46 6c 61 * TclLindexFla
7a40: 74 20 2d 2d 0a 20 2a 0a 20 2a 20 09 54 68 65 20 t --. *. * .The
7a50: 63 6f 72 65 20 6f 66 20 74 68 65 20 27 6c 69 6e core of the 'lin
7a60: 64 65 78 27 20 63 6f 6d 6d 61 6e 64 2c 20 77 69 dex' command, wi
7a70: 74 68 20 61 6c 6c 20 69 6e 64 65 78 0a 20 2a 20 th all index. *
7a80: 09 61 72 67 75 6d 65 6e 74 73 20 70 72 65 73 65 .arguments prese
7a90: 6e 74 65 64 20 61 73 20 61 20 66 6c 61 74 20 6c nted as a flat l
7aa0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 20 56 61 6c 75 ist.. *. * Valu
7ab0: 65 0a 20 2a 0a 20 2a 09 41 20 70 6f 69 6e 74 65 e. *. *.A pointe
7ac0: 72 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 20 r to the object
7ad0: 65 78 74 72 61 63 74 65 64 2c 20 77 69 74 68 20 extracted, with
7ae0: 69 74 73 20 27 72 65 66 43 6f 75 6e 74 27 20 69 its 'refCount' i
7af0: 6e 63 72 65 6d 65 6e 74 65 64 2c 20 20 6f 72 0a ncremented, or.
7b00: 20 2a 09 4e 55 4c 4c 20 69 66 20 61 6e 20 65 72 *.NULL if an er
7b10: 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 20 54 ror occurred. T
7b20: 68 75 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 hus, the calling
7b30: 20 63 6f 64 65 20 77 69 6c 6c 20 75 73 75 61 6c code will usual
7b40: 6c 79 20 64 6f 0a 20 2a 09 73 6f 6d 65 74 68 69 ly do. *.somethi
7b50: 6e 67 20 6c 69 6b 65 3a 0a 20 2a 0a 20 2a 20 09 ng like:. *. * .
7b60: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
7b70: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 t(interp, result
7b80: 29 3b 0a 20 2a 20 09 09 54 63 6c 5f 44 65 63 72 );. * ..Tcl_Decr
7b90: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 29 RefCount(result)
7ba0: 3b 0a 20 2a 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;. *. *. *------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bf0: 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a . */..Tcl_Obj *.
7c00: 54 63 6c 4c 69 6e 64 65 78 46 6c 61 74 28 0a 20 TclLindexFlat(.
7c10: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
7c20: 6e 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 nterp,../* Tcl i
7c30: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 nterpreter. */.
7c40: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 Tcl_Obj *list
7c50: 50 74 72 2c 09 09 2f 2a 20 54 63 6c 20 6f 62 6a Ptr,../* Tcl obj
7c60: 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 ect representing
7c70: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 the list. */.
7c80: 20 20 69 6e 74 20 69 6e 64 65 78 43 6f 75 6e 74 int indexCount
7c90: 2c 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 69 ,../* Count of i
7ca0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 54 ndices. */. T
7cb0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 69 6e cl_Obj *const in
7cc0: 64 65 78 41 72 72 61 79 5b 5d 29 2f 2a 20 41 72 dexArray[])/* Ar
7cd0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 ray of pointers
7ce0: 74 6f 20 54 63 6c 20 6f 62 6a 65 63 74 73 20 74 to Tcl objects t
7cf0: 68 61 74 0a 09 09 09 09 20 2a 20 72 65 70 72 65 hat..... * repre
7d00: 73 65 6e 74 20 74 68 65 20 69 6e 64 69 63 65 73 sent the indices
7d10: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f in the list. */
7d20: 0a 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 .{. int i;..
7d30: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
7d40: 75 6e 74 28 6c 69 73 74 50 74 72 29 3b 0a 0a 20 unt(listPtr);..
7d50: 20 20 20 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c for (i=0 ; i<
7d60: 69 6e 64 65 78 43 6f 75 6e 74 20 26 26 20 6c 69 indexCount && li
7d70: 73 74 50 74 72 20 3b 20 69 2b 2b 29 20 7b 0a 09 stPtr ; i++) {..
7d80: 69 6e 74 20 69 6e 64 65 78 2c 20 6c 69 73 74 4c int index, listL
7d90: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 4f 62 6a en = 0;..Tcl_Obj
7da0: 20 2a 2a 65 6c 65 6d 50 74 72 73 20 3d 20 4e 55 **elemPtrs = NU
7db0: 4c 4c 2c 20 2a 73 75 62 6c 69 73 74 43 6f 70 79 LL, *sublistCopy
7dc0: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 48 65 72 65 20 ;.../*.. * Here
7dd0: 77 65 20 6d 61 6b 65 20 61 20 70 72 69 76 61 74 we make a privat
7de0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 75 e copy of the cu
7df0: 72 72 65 6e 74 20 73 75 62 6c 69 73 74 2c 20 73 rrent sublist, s
7e00: 6f 20 77 65 20 61 76 6f 69 64 20 61 6e 79 0a 09 o we avoid any..
7e10: 20 2a 20 73 68 69 6d 6d 65 72 69 6e 67 20 69 73 * shimmering is
7e20: 73 75 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 sues that might
7e30: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 65 invalidate the e
7e40: 6c 65 6d 50 74 72 20 61 72 72 61 79 20 62 65 6c lemPtr array bel
7e50: 6f 77 0a 09 20 2a 20 77 68 69 6c 65 20 77 65 20 ow.. * while we
7e60: 61 72 65 20 73 74 69 6c 6c 20 75 73 69 6e 67 20 are still using
7e70: 69 74 2e 20 53 65 65 20 74 65 73 74 20 6c 69 6e it. See test lin
7e80: 64 65 78 2d 38 2e 34 2e 0a 09 20 2a 2f 0a 0a 09 dex-8.4... */...
7e90: 73 75 62 6c 69 73 74 43 6f 70 79 20 3d 20 54 63 sublistCopy = Tc
7ea0: 6c 4c 69 73 74 4f 62 6a 43 6f 70 79 28 69 6e 74 lListObjCopy(int
7eb0: 65 72 70 2c 20 6c 69 73 74 50 74 72 29 3b 0a 09 erp, listPtr);..
7ec0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
7ed0: 28 6c 69 73 74 50 74 72 29 3b 0a 09 6c 69 73 74 (listPtr);..list
7ee0: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66 Ptr = NULL;...if
7ef0: 20 28 73 75 62 6c 69 73 74 43 6f 70 79 20 3d 3d (sublistCopy ==
7f00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
7f10: 0a 09 20 20 20 20 20 2a 20 54 68 65 20 73 75 62 .. * The sub
7f20: 6c 69 73 74 20 69 73 20 6e 6f 74 20 61 20 6c 69 list is not a li
7f30: 73 74 20 61 74 20 61 6c 6c 20 3d 3e 20 65 72 72 st at all => err
7f40: 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 or... */...
7f50: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 54 63 break;..}..Tc
7f60: 6c 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 lListObjGetEleme
7f70: 6e 74 73 28 4e 55 4c 4c 2c 20 73 75 62 6c 69 73 nts(NULL, sublis
7f80: 74 43 6f 70 79 2c 20 26 6c 69 73 74 4c 65 6e 2c tCopy, &listLen,
7f90: 20 26 65 6c 65 6d 50 74 72 73 29 3b 0a 0a 09 69 &elemPtrs);...i
7fa0: 66 20 28 54 63 6c 47 65 74 49 6e 74 46 6f 72 49 f (TclGetIntForI
7fb0: 6e 64 65 78 4d 28 69 6e 74 65 72 70 2c 20 69 6e ndexM(interp, in
7fc0: 64 65 78 41 72 72 61 79 5b 69 5d 2c 20 2f 2a 65 dexArray[i], /*e
7fd0: 6e 64 56 61 6c 75 65 2a 2f 20 6c 69 73 74 4c 65 ndValue*/ listLe
7fe0: 6e 2d 31 2c 0a 09 09 26 69 6e 64 65 78 29 20 3d n-1,...&index) =
7ff0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
8000: 20 69 66 20 28 69 6e 64 65 78 3c 30 20 7c 7c 20 if (index<0 ||
8010: 69 6e 64 65 78 3e 3d 6c 69 73 74 4c 65 6e 29 20 index>=listLen)
8020: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 6e 64 65 {.../*... * Inde
8030: 78 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 x is out of rang
8040: 65 2e 20 42 72 65 61 6b 20 6f 75 74 20 6f 66 20 e. Break out of
8050: 6c 6f 6f 70 20 77 69 74 68 20 65 6d 70 74 79 20 loop with empty
8060: 72 65 73 75 6c 74 2e 0a 09 09 20 2a 20 46 69 72 result.... * Fir
8070: 73 74 20 63 68 65 63 6b 20 72 65 6d 61 69 6e 69 st check remaini
8080: 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72 20 76 ng indices for v
8090: 61 6c 69 64 69 74 79 0a 09 09 20 2a 2f 0a 0a 09 alidity... */...
80a0: 09 77 68 69 6c 65 20 28 2b 2b 69 20 3c 20 69 6e .while (++i < in
80b0: 64 65 78 43 6f 75 6e 74 29 20 7b 0a 09 09 20 20 dexCount) {...
80c0: 20 20 69 66 20 28 54 63 6c 47 65 74 49 6e 74 46 if (TclGetIntF
80d0: 6f 72 49 6e 64 65 78 4d 28 69 6e 74 65 72 70 2c orIndexM(interp,
80e0: 20 69 6e 64 65 78 41 72 72 61 79 5b 69 5d 2c 20 indexArray[i],
80f0: 2d 31 2c 20 26 69 6e 64 65 78 29 0a 09 09 09 21 -1, &index)....!
8100: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 54 = TCL_OK) {....T
8110: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
8120: 73 75 62 6c 69 73 74 43 6f 70 79 29 3b 0a 09 09 sublistCopy);...
8130: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 09 .return NULL;...
8140: 20 20 20 20 7d 0a 09 09 7d 0a 09 09 6c 69 73 74 }...}...list
8150: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Ptr = Tcl_NewObj
8160: 28 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 ();.. } else
8170: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 45 78 74 72 {.../*... * Extr
8180: 61 63 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 act the pointer
8190: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 to the appropria
81a0: 74 65 20 65 6c 65 6d 65 6e 74 2e 0a 09 09 20 2a te element.... *
81b0: 2f 0a 0a 09 09 6c 69 73 74 50 74 72 20 3d 20 65 /....listPtr = e
81c0: 6c 65 6d 50 74 72 73 5b 69 6e 64 65 78 5d 3b 0a lemPtrs[index];.
81d0: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
81e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 IncrRefCount(lis
81f0: 74 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 tPtr);..}..Tcl_D
8200: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 75 62 6c ecrRefCount(subl
8210: 69 73 74 43 6f 70 79 29 3b 0a 20 20 20 20 7d 0a istCopy);. }.
8220: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74 . return list
8230: 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d Ptr;.}.../*. *--
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4c 73 ----. *. * TclLs
8290: 65 74 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09 etList --. *. *.
82a0: 54 68 65 20 63 6f 72 65 20 6f 66 20 5b 6c 73 65 The core of [lse
82b0: 74 5d 20 77 68 65 6e 20 6f 62 6a 63 20 3d 3d 20 t] when objc ==
82c0: 34 2e 20 4f 62 6a 76 5b 32 5d 20 6d 61 79 20 62 4. Objv[2] may b
82d0: 65 20 65 69 74 68 65 72 20 61 0a 20 2a 09 73 63 e either a. *.sc
82e0: 61 6c 61 72 20 69 6e 64 65 78 20 6f 72 20 61 20 alar index or a
82f0: 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 2e list of indices.
8300: 0a 20 2a 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 . *. *.Implement
8310: 65 64 20 65 6e 74 69 72 65 6c 79 20 61 73 20 61 ed entirely as a
8320: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 wrapper around
8330: 27 54 63 6c 4c 69 6e 64 65 78 46 6c 61 74 27 2c 'TclLindexFlat',
8340: 20 61 73 20 64 65 73 63 72 69 62 65 64 0a 20 2a as described. *
8350: 09 66 6f 72 20 27 54 63 6c 4c 69 6e 64 65 78 4c .for 'TclLindexL
8360: 69 73 74 27 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 ist'.. *. * Valu
8370: 65 0a 20 2a 0a 20 2a 09 54 68 65 20 6e 65 77 20 e. *. *.The new
8380: 6c 69 73 74 2c 20 77 69 74 68 20 74 68 65 20 27 list, with the '
8390: 72 65 66 43 6f 75 6e 74 27 20 6f 66 20 27 76 61 refCount' of 'va
83a0: 6c 75 50 74 72 27 20 69 6e 63 72 65 6d 65 6e 74 luPtr' increment
83b0: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 0a 20 ed, or NULL if.
83c0: 2a 09 74 68 65 72 65 20 77 61 73 20 61 6e 20 65 *.there was an e
83d0: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d rror.. *. *-----
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8420: 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a -. */..Tcl_Obj *
8430: 0a 54 63 6c 4c 73 65 74 4c 69 73 74 28 0a 20 20 .TclLsetList(.
8440: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
8450: 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e terp,../* Tcl in
8460: 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 terpreter. */.
8470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 Tcl_Obj *listP
8480: 74 72 2c 09 09 2f 2a 20 50 6f 69 6e 74 65 72 20 tr,../* Pointer
8490: 74 6f 20 74 68 65 20 6c 69 73 74 20 62 65 69 6e to the list bein
84a0: 67 20 6d 6f 64 69 66 69 65 64 2e 20 2a 2f 0a 20 g modified. */.
84b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 64 65 Tcl_Obj *inde
84c0: 78 41 72 67 50 74 72 2c 09 2f 2a 20 49 6e 64 65 xArgPtr,./* Inde
84d0: 78 20 6f 72 20 69 6e 64 65 78 2d 6c 69 73 74 20 x or index-list
84e0: 61 72 67 20 74 6f 20 27 6c 73 65 74 27 2e 20 2a arg to 'lset'. *
84f0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 /. Tcl_Obj *v
8500: 61 6c 75 65 50 74 72 29 09 09 2f 2a 20 56 61 6c aluePtr)../* Val
8510: 75 65 20 61 72 67 20 74 6f 20 27 6c 73 65 74 27 ue arg to 'lset'
8520: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 69 . */.{. int i
8530: 6e 64 65 78 43 6f 75 6e 74 20 3d 20 30 3b 09 09 ndexCount = 0;..
8540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 /* Number of ind
8550: 69 63 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 ices in the inde
8560: 78 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 54 x list. */. T
8570: 63 6c 5f 4f 62 6a 20 2a 2a 69 6e 64 69 63 65 73 cl_Obj **indices
8580: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 56 65 63 74 = NULL;./* Vect
8590: 6f 72 20 6f 66 20 69 6e 64 69 63 65 73 20 69 6e or of indices in
85a0: 20 74 68 65 20 69 6e 64 65 78 20 6c 69 73 74 2e the index list.
85b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
85c0: 2a 72 65 74 56 61 6c 75 65 50 74 72 3b 09 2f 2a *retValuePtr;./*
85d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 Pointer to the
85e0: 6c 69 73 74 20 74 6f 20 62 65 20 72 65 74 75 72 list to be retur
85f0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ned. */. int
8600: 69 6e 64 65 78 3b 09 09 09 2f 2a 20 43 75 72 72 index;.../* Curr
8610: 65 6e 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 ent index in the
8620: 20 6c 69 73 74 20 2d 20 64 69 73 63 61 72 64 65 list - discarde
8630: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 d. */. Tcl_Ob
8640: 6a 20 2a 69 6e 64 65 78 4c 69 73 74 43 6f 70 79 j *indexListCopy
8650: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
8660: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 Determine wheth
8670: 65 72 20 74 68 65 20 69 6e 64 65 78 20 61 72 67 er the index arg
8680: 20 64 65 73 69 67 6e 61 74 65 73 20 61 20 6c 69 designates a li
8690: 73 74 20 6f 72 20 61 20 73 69 6e 67 6c 65 20 69 st or a single i
86a0: 6e 64 65 78 2e 0a 20 20 20 20 20 2a 20 57 65 20 ndex.. * We
86b0: 68 61 76 65 20 74 6f 20 62 65 20 63 61 72 65 66 have to be caref
86c0: 75 6c 20 61 62 6f 75 74 20 74 68 65 20 6f 72 64 ul about the ord
86d0: 65 72 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73 er of the checks
86e0: 20 74 6f 20 61 76 6f 69 64 20 72 65 70 65 61 74 to avoid repeat
86f0: 65 64 0a 20 20 20 20 20 2a 20 73 68 69 6d 6d 65 ed. * shimme
8700: 72 69 6e 67 3b 20 73 65 65 20 54 49 50 20 23 32 ring; see TIP #2
8710: 32 20 61 6e 64 20 23 32 33 20 66 6f 72 20 64 65 2 and #23 for de
8720: 74 61 69 6c 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a tails.. */..
8730: 20 20 20 20 69 66 20 28 69 6e 64 65 78 41 72 67 if (indexArg
8740: 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 Ptr->typePtr !=
8750: 26 74 63 6c 4c 69 73 74 54 79 70 65 0a 09 20 20 &tclListType..
8760: 20 20 26 26 20 54 63 6c 47 65 74 49 6e 74 46 6f && TclGetIntFo
8770: 72 49 6e 64 65 78 4d 28 4e 55 4c 4c 2c 20 69 6e rIndexM(NULL, in
8780: 64 65 78 41 72 67 50 74 72 2c 20 30 2c 20 26 69 dexArgPtr, 0, &i
8790: 6e 64 65 78 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 ndex) == TCL_OK)
87a0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 69 6e 64 65 78 {../*.. * index
87b0: 41 72 67 50 74 72 20 64 65 73 69 67 6e 61 74 65 ArgPtr designate
87c0: 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 s a single index
87d0: 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 ... */...return
87e0: 54 63 6c 4c 73 65 74 46 6c 61 74 28 69 6e 74 65 TclLsetFlat(inte
87f0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 31 2c 20 rp, listPtr, 1,
8800: 26 69 6e 64 65 78 41 72 67 50 74 72 2c 20 76 61 &indexArgPtr, va
8810: 6c 75 65 50 74 72 29 3b 0a 0a 20 20 20 20 7d 0a luePtr);.. }.
8820: 0a 20 20 20 20 69 6e 64 65 78 4c 69 73 74 43 6f . indexListCo
8830: 70 79 20 3d 20 54 63 6c 4c 69 73 74 4f 62 6a 43 py = TclListObjC
8840: 6f 70 79 28 4e 55 4c 4c 2c 20 69 6e 64 65 78 41 opy(NULL, indexA
8850: 72 67 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 rgPtr);. if (
8860: 69 6e 64 65 78 4c 69 73 74 43 6f 70 79 20 3d 3d indexListCopy ==
8870: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
8880: 20 69 6e 64 65 78 41 72 67 50 74 72 20 64 65 73 indexArgPtr des
8890: 69 67 6e 61 74 65 73 20 73 6f 6d 65 74 68 69 6e ignates somethin
88a0: 67 20 74 68 61 74 20 69 73 20 6e 65 69 74 68 65 g that is neithe
88b0: 72 20 61 6e 20 69 6e 64 65 78 20 6e 6f 72 20 61 r an index nor a
88c0: 0a 09 20 2a 20 77 65 6c 6c 20 66 6f 72 6d 65 64 .. * well formed
88d0: 20 6c 69 73 74 2e 20 52 65 70 6f 72 74 20 74 68 list. Report th
88e0: 65 20 65 72 72 6f 72 20 76 69 61 20 54 63 6c 4c e error via TclL
88f0: 73 65 74 46 6c 61 74 2e 0a 09 20 2a 2f 0a 0a 09 setFlat... */...
8900: 72 65 74 75 72 6e 20 54 63 6c 4c 73 65 74 46 6c return TclLsetFl
8910: 61 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 at(interp, listP
8920: 74 72 2c 20 31 2c 20 26 69 6e 64 65 78 41 72 67 tr, 1, &indexArg
8930: 50 74 72 2c 20 76 61 6c 75 65 50 74 72 29 3b 0a Ptr, valuePtr);.
8940: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 4c 69 73 }. TclLis
8950: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
8960: 4e 55 4c 4c 2c 20 69 6e 64 65 78 41 72 67 50 74 NULL, indexArgPt
8970: 72 2c 20 26 69 6e 64 65 78 43 6f 75 6e 74 2c 20 r, &indexCount,
8980: 26 69 6e 64 69 63 65 73 29 3b 0a 0a 20 20 20 20 &indices);..
8990: 2f 2a 0a 20 20 20 20 20 2a 20 4c 65 74 20 54 63 /*. * Let Tc
89a0: 6c 4c 73 65 74 46 6c 61 74 20 68 61 6e 64 6c 65 lLsetFlat handle
89b0: 20 74 68 65 20 61 63 74 75 61 6c 20 6c 73 65 74 the actual lset
89c0: 27 74 69 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 'ting.. */..
89d0: 20 20 20 20 72 65 74 56 61 6c 75 65 50 74 72 20 retValuePtr
89e0: 3d 20 54 63 6c 4c 73 65 74 46 6c 61 74 28 69 6e = TclLsetFlat(in
89f0: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 69 terp, listPtr, i
8a00: 6e 64 65 78 43 6f 75 6e 74 2c 20 69 6e 64 69 63 ndexCount, indic
8a10: 65 73 2c 20 76 61 6c 75 65 50 74 72 29 3b 0a 0a es, valuePtr);..
8a20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
8a30: 6f 75 6e 74 28 69 6e 64 65 78 4c 69 73 74 43 6f ount(indexListCo
8a40: 70 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 py);. return
8a50: 72 65 74 56 61 6c 75 65 50 74 72 3b 0a 7d 0a 0c retValuePtr;.}..
8a60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
8ab0: 20 2a 20 54 63 6c 4c 73 65 74 46 6c 61 74 20 2d * TclLsetFlat -
8ac0: 2d 0a 20 2a 0a 20 2a 09 43 6f 72 65 20 65 6e 67 -. *. *.Core eng
8ad0: 69 6e 65 20 6f 66 20 74 68 65 20 27 6c 73 65 74 ine of the 'lset
8ae0: 27 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a ' command.. *. *
8af0: 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 54 68 65 Value. *. *.The
8b00: 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 0a resulting list.
8b10: 20 2a 0a 20 2a 09 20 20 20 20 54 68 65 20 27 72 *. *. The 'r
8b20: 65 66 43 6f 75 6e 74 27 20 6f 66 20 27 76 61 6c efCount' of 'val
8b30: 75 65 50 74 72 27 20 69 73 20 69 6e 63 72 65 6d uePtr' is increm
8b40: 65 6e 74 65 64 2e 20 20 49 66 20 27 6c 69 73 74 ented. If 'list
8b50: 50 74 72 27 20 77 61 73 20 6e 6f 74 0a 20 2a 09 Ptr' was not. *.
8b60: 20 20 20 20 64 75 70 6c 69 63 61 74 65 64 2c 20 duplicated,
8b70: 69 74 73 20 27 72 65 66 43 6f 75 6e 74 27 20 69 its 'refCount' i
8b80: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 20 20 s incremented.
8b90: 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f The reference co
8ba0: 75 6e 74 20 6f 66 0a 20 2a 09 20 20 20 20 61 6e unt of. *. an
8bb0: 20 75 6e 64 75 70 6c 69 63 61 74 65 64 20 6f 62 unduplicated ob
8bc0: 6a 65 63 74 20 69 73 20 74 68 65 72 65 66 6f 72 ject is therefor
8bd0: 65 20 32 20 28 6f 6e 65 20 66 6f 72 20 74 68 65 e 2 (one for the
8be0: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 returned pointe
8bf0: 72 0a 20 2a 09 20 20 20 20 61 6e 64 20 6f 6e 65 r. *. and one
8c00: 20 66 6f 72 20 74 68 65 20 76 61 72 69 61 62 6c for the variabl
8c10: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 69 74 29 e that holds it)
8c20: 2e 20 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 . The reference
8c30: 20 63 6f 75 6e 74 20 6f 66 20 61 0a 20 2a 09 20 count of a. *.
8c40: 20 20 20 64 75 70 6c 69 63 61 74 65 20 6f 62 6a duplicate obj
8c50: 65 63 74 20 69 73 20 31 2c 20 72 65 66 6c 65 63 ect is 1, reflec
8c60: 74 69 6e 67 20 74 68 61 74 20 72 65 73 75 6c 74 ting that result
8c70: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 is the only act
8c80: 69 76 65 0a 20 2a 09 20 20 20 20 72 65 66 65 72 ive. *. refer
8c90: 65 6e 63 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 ence. The caller
8ca0: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 is expected to
8cb0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 store the result
8cc0: 20 69 6e 20 74 68 65 0a 20 2a 09 20 20 20 20 76 in the. *. v
8cd0: 61 72 69 61 62 6c 65 20 61 6e 64 20 64 65 63 72 ariable and decr
8ce0: 65 6d 65 6e 74 20 69 74 73 20 72 65 66 65 72 65 ement its refere
8cf0: 6e 63 65 20 63 6f 75 6e 74 2e 20 28 49 4e 53 54 nce count. (INST
8d00: 5f 53 54 4f 52 45 5f 2a 20 64 6f 65 73 0a 20 2a _STORE_* does. *
8d10: 09 20 20 20 20 65 78 61 63 74 6c 79 20 74 68 69 . exactly thi
8d20: 73 2e 29 0a 20 2a 20 0a 20 2a 09 4e 55 4c 4c 0a s.). * . *.NULL.
8d30: 20 2a 09 0a 20 2a 09 20 20 20 20 41 6e 20 65 72 *.. *. An er
8d40: 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 20 49 ror occurred. I
8d50: 66 20 27 6c 69 73 74 50 74 72 27 20 77 61 73 20 f 'listPtr' was
8d60: 64 75 70 6c 69 63 61 74 65 64 2c 20 74 68 65 20 duplicated, the
8d70: 72 65 66 65 72 65 6e 63 65 0a 20 2a 09 20 20 20 reference. *.
8d80: 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 64 75 count on the du
8d90: 70 6c 69 63 61 74 65 20 69 73 20 64 65 63 72 65 plicate is decre
8da0: 6d 65 6e 74 65 64 20 73 6f 20 74 68 61 74 20 69 mented so that i
8db0: 74 20 69 73 20 30 2c 20 63 61 75 73 69 6e 67 20 t is 0, causing
8dc0: 61 6e 79 0a 20 2a 09 20 20 20 20 6d 65 6d 6f 72 any. *. memor
8dd0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 y allocated by t
8de0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 his function to
8df0: 62 65 20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a 0a be freed.. *. *.
8e00: 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a 20 2a 09 * Effect. *. *.
8e10: 4f 6e 20 65 6e 74 72 79 2c 20 74 68 65 20 72 65 On entry, the re
8e20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 ference count of
8e30: 20 27 6c 69 73 74 50 74 72 27 20 64 6f 65 73 20 'listPtr' does
8e40: 6e 6f 74 20 72 65 66 6c 65 63 74 20 61 6e 79 0a not reflect any.
8e50: 20 2a 09 72 65 66 65 72 65 6e 63 65 73 20 68 65 *.references he
8e60: 6c 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e ld on the stack.
8e70: 20 54 68 65 20 66 69 72 73 74 20 61 63 74 69 6f The first actio
8e80: 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 n of this functi
8e90: 6f 6e 20 69 73 20 74 6f 0a 20 2a 09 64 65 74 65 on is to. *.dete
8ea0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 27 6c rmine whether 'l
8eb0: 69 73 74 50 74 72 27 20 69 73 20 73 68 61 72 65 istPtr' is share
8ec0: 64 20 61 6e 64 20 74 6f 20 63 72 65 61 74 65 20 d and to create
8ed0: 61 20 64 75 70 6c 69 63 61 74 65 0a 20 2a 09 75 a duplicate. *.u
8ee0: 6e 73 68 61 72 65 64 20 63 6f 70 79 20 69 66 20 nshared copy if
8ef0: 69 74 20 69 73 2e 20 20 54 68 65 20 72 65 66 65 it is. The refe
8f00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 74 rence count of t
8f10: 68 65 20 64 75 70 6c 69 63 61 74 65 20 69 73 0a he duplicate is.
8f20: 20 2a 09 69 6e 63 72 65 6d 65 6e 74 65 64 2e 20 *.incremented.
8f30: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 At this point, t
8f40: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 he reference cou
8f50: 6e 74 20 69 73 20 31 20 69 6e 20 65 69 74 68 65 nt is 1 in eithe
8f60: 72 20 63 61 73 65 20 73 6f 0a 20 2a 09 74 68 61 r case so. *.tha
8f70: 74 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 t the object is
8f80: 63 6f 6e 73 69 64 65 72 65 64 20 75 6e 73 68 61 considered unsha
8f90: 72 65 64 2e 0a 20 2a 0a 20 2a 09 54 68 65 20 75 red.. *. *.The u
8fa0: 6e 73 68 61 72 65 64 20 6c 69 73 74 20 69 73 20 nshared list is
8fb0: 61 6c 74 65 72 65 64 20 64 69 72 65 63 74 6c 79 altered directly
8fc0: 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 to produce the
8fd0: 72 65 73 75 6c 74 2e 0a 20 2a 09 27 54 63 6c 4c result.. *.'TclL
8fe0: 73 65 74 46 6c 61 74 27 20 6d 61 69 6e 74 61 69 setFlat' maintai
8ff0: 6e 73 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 ns a linked list
9000: 20 6f 66 20 27 54 63 6c 5f 4f 62 6a 27 20 76 61 of 'Tcl_Obj' va
9010: 6c 75 65 73 20 77 68 6f 73 65 20 73 74 72 69 6e lues whose strin
9020: 67 0a 20 2a 09 72 65 70 72 65 73 65 6e 74 61 74 g. *.representat
9030: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 73 70 6f ions must be spo
9040: 69 6c 74 20 62 79 20 74 68 72 65 61 64 69 6e 67 ilt by threading
9050: 20 76 69 61 20 27 70 74 72 32 27 20 6f 66 20 74 via 'ptr2' of t
9060: 68 65 0a 20 2a 09 74 77 6f 2d 70 6f 69 6e 74 65 he. *.two-pointe
9070: 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 r internal repre
9080: 73 65 6e 74 61 74 69 6f 6e 2e 20 4f 6e 20 65 6e sentation. On en
9090: 74 72 79 20 74 6f 20 27 54 63 6c 4c 73 65 74 46 try to 'TclLsetF
90a0: 6c 61 74 27 2c 20 74 68 65 0a 20 2a 09 76 61 6c lat', the. *.val
90b0: 75 65 73 20 6f 66 20 27 70 74 72 32 27 20 61 72 ues of 'ptr2' ar
90c0: 65 20 69 6d 6d 61 74 65 72 69 61 6c 3b 20 6f 6e e immaterial; on
90d0: 20 65 78 69 74 2c 20 74 68 65 20 27 70 74 72 32 exit, the 'ptr2
90e0: 27 20 66 69 65 6c 64 20 6f 66 20 61 6e 79 0a 20 ' field of any.
90f0: 2a 09 54 63 6c 5f 4f 62 6a 20 74 68 61 74 20 68 *.Tcl_Obj that h
9100: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 as been modified
9110: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e is set to NULL.
9120: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
9170: 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 4c ..Tcl_Obj *.TclL
9180: 73 65 74 46 6c 61 74 28 0a 20 20 20 20 54 63 6c setFlat(. Tcl
9190: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
91a0: 09 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 ../* Tcl interpr
91b0: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c eter. */. Tcl
91c0: 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 2c 09 09 _Obj *listPtr,..
91d0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 /* Pointer to th
91e0: 65 20 6c 69 73 74 20 62 65 69 6e 67 20 6d 6f 64 e list being mod
91f0: 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e ified. */. in
9200: 74 20 69 6e 64 65 78 43 6f 75 6e 74 2c 09 09 2f t indexCount,../
9210: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 * Number of inde
9220: 78 20 61 72 67 73 2e 20 2a 2f 0a 20 20 20 20 54 x args. */. T
9230: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 69 6e cl_Obj *const in
9240: 64 65 78 41 72 72 61 79 5b 5d 2c 0a 09 09 09 09 dexArray[],.....
9250: 2f 2a 20 49 6e 64 65 78 20 61 72 67 73 2e 20 2a /* Index args. *
9260: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 /. Tcl_Obj *v
9270: 61 6c 75 65 50 74 72 29 09 09 2f 2a 20 56 61 6c aluePtr)../* Val
9280: 75 65 20 61 72 67 20 74 6f 20 27 6c 73 65 74 27 ue arg to 'lset'
9290: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 69 . */.{. int i
92a0: 6e 64 65 78 2c 20 72 65 73 75 6c 74 2c 20 6c 65 ndex, result, le
92b0: 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a n;. Tcl_Obj *
92c0: 73 75 62 4c 69 73 74 50 74 72 2c 20 2a 72 65 74 subListPtr, *ret
92d0: 56 61 6c 75 65 50 74 72 2c 20 2a 63 68 61 69 6e ValuePtr, *chain
92e0: 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 Ptr;.. /*.
92f0: 20 20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 * If there are
9300: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 73 69 6d no indices, sim
9310: 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 6e ply return the n
9320: 65 77 20 76 61 6c 75 65 2e 20 20 28 57 69 74 68 ew value. (With
9330: 6f 75 74 0a 20 20 20 20 20 2a 20 69 6e 64 69 63 out. * indic
9340: 65 73 2c 20 5b 6c 73 65 74 5d 20 69 73 20 61 20 es, [lset] is a
9350: 73 79 6e 6f 6e 79 6d 20 66 6f 72 20 5b 73 65 74 synonym for [set
9360: 5d 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 ].. */..
9370: 69 66 20 28 69 6e 64 65 78 43 6f 75 6e 74 20 3d if (indexCount =
9380: 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 49 6e 63 72 = 0) {..Tcl_Incr
9390: 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 50 74 RefCount(valuePt
93a0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 76 61 6c 75 r);..return valu
93b0: 65 50 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ePtr;. }..
93c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74 68 /*. * If th
93d0: 65 20 6c 69 73 74 20 69 73 20 73 68 61 72 65 64 e list is shared
93e0: 2c 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 77 65 , make a copy we
93f0: 20 63 61 6e 20 6d 6f 64 69 66 79 20 28 63 6f 70 can modify (cop
9400: 79 2d 6f 6e 2d 77 72 69 74 65 29 2e 20 20 57 65 y-on-write). We
9410: 0a 20 20 20 20 20 2a 20 75 73 65 20 54 63 6c 5f . * use Tcl_
9420: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 29 20 69 DuplicateObj() i
9430: 6e 73 74 65 61 64 20 6f 66 20 54 63 6c 4c 69 73 nstead of TclLis
9440: 74 4f 62 6a 43 6f 70 79 28 29 20 66 6f 72 20 61 tObjCopy() for a
9450: 20 66 65 77 20 72 65 61 73 6f 6e 73 3a 0a 20 20 few reasons:.
9460: 20 20 20 2a 20 31 29 20 77 65 20 68 61 76 65 20 * 1) we have
9470: 6e 6f 74 20 79 65 74 20 63 6f 6e 66 69 72 6d 65 not yet confirme
9480: 64 20 6c 69 73 74 50 74 72 20 69 73 20 61 63 74 d listPtr is act
9490: 75 61 6c 6c 79 20 61 20 6c 69 73 74 3b 20 32 29 ually a list; 2)
94a0: 20 57 65 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 We make a.
94b0: 2a 20 76 65 72 62 61 74 69 6d 20 63 6f 70 79 20 * verbatim copy
94c0: 6f 66 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 of any existing
94d0: 73 74 72 69 6e 67 20 72 65 70 2c 20 61 6e 64 20 string rep, and
94e0: 77 68 65 6e 20 77 65 20 63 6f 6d 62 69 6e 65 20 when we combine
94f0: 74 68 61 74 20 77 69 74 68 0a 20 20 20 20 20 2a that with. *
9500: 20 74 68 65 20 64 65 6c 61 79 65 64 20 69 6e 76 the delayed inv
9510: 61 6c 69 64 61 74 69 6f 6e 20 6f 66 20 73 74 72 alidation of str
9520: 69 6e 67 20 72 65 70 73 20 6f 66 20 6d 6f 64 69 ing reps of modi
9530: 66 69 65 64 20 54 63 6c 5f 4f 62 6a 27 73 0a 20 fied Tcl_Obj's.
9540: 20 20 20 20 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 * implemente
9550: 64 20 62 65 6c 6f 77 2c 20 74 68 65 20 6f 75 74 d below, the out
9560: 63 6f 6d 65 20 69 73 20 74 68 61 74 20 61 6e 79 come is that any
9570: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e error condition
9580: 20 74 68 61 74 20 63 61 75 73 65 73 0a 20 20 20 that causes.
9590: 20 20 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 * this routine
95a0: 20 74 6f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c to return NULL,
95b0: 20 77 69 6c 6c 20 6c 65 61 76 65 20 74 68 65 20 will leave the
95c0: 73 74 72 69 6e 67 20 72 65 70 20 6f 66 20 6c 69 string rep of li
95d0: 73 74 50 74 72 20 61 6e 64 0a 20 20 20 20 20 2a stPtr and. *
95e0: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 74 6f all elements to
95f0: 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 be unchanged..
9600: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 75 62 4c */.. subL
9610: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 49 73 53 istPtr = Tcl_IsS
9620: 68 61 72 65 64 28 6c 69 73 74 50 74 72 29 20 3f hared(listPtr) ?
9630: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
9640: 6a 28 6c 69 73 74 50 74 72 29 20 3a 20 6c 69 73 j(listPtr) : lis
9650: 74 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 tPtr;.. /*.
9660: 20 20 20 2a 20 41 6e 63 68 6f 72 20 74 68 65 20 * Anchor the
9670: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 linked list of T
9680: 63 6c 5f 4f 62 6a 27 73 20 77 68 6f 73 65 20 73 cl_Obj's whose s
9690: 74 72 69 6e 67 20 72 65 70 73 20 6d 75 73 74 20 tring reps must
96a0: 62 65 0a 20 20 20 20 20 2a 20 69 6e 76 61 6c 69 be. * invali
96b0: 64 61 74 65 64 20 69 66 20 74 68 65 20 6f 70 65 dated if the ope
96c0: 72 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2e ration succeeds.
96d0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 . */.. re
96e0: 74 56 61 6c 75 65 50 74 72 20 3d 20 73 75 62 4c tValuePtr = subL
96f0: 69 73 74 50 74 72 3b 0a 20 20 20 20 63 68 61 69 istPtr;. chai
9700: 6e 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 nPtr = NULL;.
9710: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b result = TCL_OK
9720: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
9730: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c Loop through al
9740: 6c 20 74 68 65 20 69 6e 64 65 78 20 61 72 67 75 l the index argu
9750: 6d 65 6e 74 73 2c 20 61 6e 64 20 66 6f 72 20 65 ments, and for e
9760: 61 63 68 20 6f 6e 65 20 64 69 76 65 20 69 6e 74 ach one dive int
9770: 6f 20 74 68 65 0a 20 20 20 20 20 2a 20 61 70 70 o the. * app
9780: 72 6f 70 72 69 61 74 65 20 73 75 62 6c 69 73 74 ropriate sublist
9790: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64 .. */.. d
97a0: 6f 20 7b 0a 09 69 6e 74 20 65 6c 65 6d 43 6f 75 o {..int elemCou
97b0: 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 70 61 nt;..Tcl_Obj *pa
97c0: 72 65 6e 74 4c 69 73 74 2c 20 2a 2a 65 6c 65 6d rentList, **elem
97d0: 50 74 72 73 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 Ptrs;.../*.. * C
97e0: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 6f 73 heck for the pos
97f0: 73 69 62 6c 65 20 65 72 72 6f 72 20 63 6f 6e 64 sible error cond
9800: 69 74 69 6f 6e 73 2e 2e 2e 0a 09 20 2a 2f 0a 0a itions..... */..
9810: 09 69 66 20 28 54 63 6c 4c 69 73 74 4f 62 6a 47 .if (TclListObjG
9820: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
9830: 70 2c 20 73 75 62 4c 69 73 74 50 74 72 2c 20 26 p, subListPtr, &
9840: 65 6c 65 6d 43 6f 75 6e 74 2c 20 26 65 6c 65 6d elemCount, &elem
9850: 50 74 72 73 29 0a 09 09 21 3d 20 54 43 4c 5f 4f Ptrs)...!= TCL_O
9860: 4b 29 20 7b 0a 09 20 20 20 20 2f 2a 20 2e 2e 2e K) {.. /* ...
9870: 74 68 65 20 73 75 62 6c 69 73 74 20 77 65 27 72 the sublist we'r
9880: 65 20 69 6e 64 65 78 69 6e 67 20 69 6e 74 6f 20 e indexing into
9890: 69 73 6e 27 74 20 61 20 6c 69 73 74 20 61 74 20 isn't a list at
98a0: 61 6c 6c 2e 20 2a 2f 0a 09 20 20 20 20 72 65 73 all. */.. res
98b0: 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b ult = TCL_ERROR;
98c0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a .. break;..}.
98d0: 0a 09 2f 2a 0a 09 20 2a 20 57 41 52 4e 49 4e 47 ../*.. * WARNING
98e0: 3a 20 74 68 65 20 6d 61 63 72 6f 20 54 63 6c 47 : the macro TclG
98f0: 65 74 49 6e 74 46 6f 72 49 6e 64 65 78 4d 20 69 etIntForIndexM i
9900: 73 20 6e 6f 74 20 73 61 66 65 20 66 6f 72 0a 09 s not safe for..
9910: 20 2a 20 70 6f 73 74 2d 69 6e 63 72 65 6d 65 6e * post-incremen
9920: 74 73 2c 20 61 76 6f 69 64 20 27 2a 69 6e 64 65 ts, avoid '*inde
9930: 78 41 72 72 61 79 2b 2b 27 20 68 65 72 65 2e 0a xArray++' here..
9940: 09 20 2a 2f 0a 0a 09 69 66 20 28 54 63 6c 47 65 . */...if (TclGe
9950: 74 49 6e 74 46 6f 72 49 6e 64 65 78 4d 28 69 6e tIntForIndexM(in
9960: 74 65 72 70 2c 20 2a 69 6e 64 65 78 41 72 72 61 terp, *indexArra
9970: 79 2c 20 65 6c 65 6d 43 6f 75 6e 74 20 2d 20 31 y, elemCount - 1
9980: 2c 20 26 69 6e 64 65 78 29 0a 09 09 21 3d 20 54 , &index)...!= T
9990: 43 4c 5f 4f 4b 29 20 20 7b 0a 09 20 20 20 20 2f CL_OK) {.. /
99a0: 2a 20 2e 2e 2e 74 68 65 20 69 6e 64 65 78 20 77 * ...the index w
99b0: 65 27 72 65 20 74 72 79 69 6e 67 20 74 6f 20 75 e're trying to u
99c0: 73 65 20 69 73 6e 27 74 20 61 6e 20 69 6e 64 65 se isn't an inde
99d0: 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 09 20 20 x at all. */..
99e0: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 result = TCL_E
99f0: 52 52 4f 52 3b 0a 09 20 20 20 20 69 6e 64 65 78 RROR;.. index
9a00: 41 72 72 61 79 2b 2b 3b 0a 09 20 20 20 20 62 72 Array++;.. br
9a10: 65 61 6b 3b 0a 09 7d 0a 09 69 6e 64 65 78 41 72 eak;..}..indexAr
9a20: 72 61 79 2b 2b 3b 0a 0a 09 69 66 20 28 69 6e 64 ray++;...if (ind
9a30: 65 78 20 3c 20 30 20 7c 7c 20 69 6e 64 65 78 20 ex < 0 || index
9a40: 3e 20 65 6c 65 6d 43 6f 75 6e 74 29 20 7b 0a 09 > elemCount) {..
9a50: 20 20 20 20 2f 2a 20 2e 2e 2e 74 68 65 20 69 6e /* ...the in
9a60: 64 65 78 20 70 6f 69 6e 74 73 20 6f 75 74 73 69 dex points outsi
9a70: 64 65 20 74 68 65 20 73 75 62 6c 69 73 74 2e 20 de the sublist.
9a80: 2a 2f 0a 09 20 20 20 20 69 66 20 28 69 6e 74 65 */.. if (inte
9a90: 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 rp != NULL) {...
9aa0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
9ab0: 28 69 6e 74 65 72 70 2c 0a 09 09 09 54 63 6c 5f (interp,....Tcl_
9ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 NewStringObj("li
9ad0: 73 74 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 st index out of
9ae0: 72 61 6e 67 65 22 2c 20 2d 31 29 29 3b 0a 09 09 range", -1));...
9af0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
9b00: 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 (interp, "TCL",
9b10: 22 4f 50 45 52 41 54 49 4f 4e 22 2c 20 22 4c 53 "OPERATION", "LS
9b20: 45 54 22 2c 0a 09 09 09 22 42 41 44 49 4e 44 45 ET",...."BADINDE
9b30: 58 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 X", NULL);..
9b40: 7d 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 }.. result =
9b50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
9b60: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 break;..}.../*..
9b70: 20 2a 20 4e 6f 20 65 72 72 6f 72 20 63 6f 6e 64 * No error cond
9b80: 69 74 69 6f 6e 73 2e 20 20 41 73 20 6c 6f 6e 67 itions. As long
9b90: 20 61 73 20 77 65 27 72 65 20 6e 6f 74 20 79 65 as we're not ye
9ba0: 74 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 69 6e t on the last in
9bb0: 64 65 78 2c 0a 09 20 2a 20 64 65 74 65 72 6d 69 dex,.. * determi
9bc0: 6e 65 20 74 68 65 20 6e 65 78 74 20 73 75 62 6c ne the next subl
9bd0: 69 73 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 ist for the next
9be0: 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 pass through th
9bf0: 65 20 6c 6f 6f 70 2c 20 61 6e 64 0a 09 20 2a 20 e loop, and.. *
9c00: 74 61 6b 65 20 73 74 65 70 73 20 74 6f 20 6d 61 take steps to ma
9c10: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 61 6e ke sure it is an
9c20: 20 75 6e 73 68 61 72 65 64 20 63 6f 70 79 2c 20 unshared copy,
9c30: 61 73 20 77 65 20 69 6e 74 65 6e 64 20 74 6f 0a as we intend to.
9c40: 09 20 2a 20 6d 6f 64 69 66 79 20 69 74 2e 0a 09 . * modify it...
9c50: 20 2a 2f 0a 0a 09 69 66 20 28 2d 2d 69 6e 64 65 */...if (--inde
9c60: 78 43 6f 75 6e 74 29 20 7b 0a 09 20 20 20 20 70 xCount) {.. p
9c70: 61 72 65 6e 74 4c 69 73 74 20 3d 20 73 75 62 4c arentList = subL
9c80: 69 73 74 50 74 72 3b 0a 09 20 20 20 20 69 66 20 istPtr;.. if
9c90: 28 69 6e 64 65 78 20 3d 3d 20 65 6c 65 6d 43 6f (index == elemCo
9ca0: 75 6e 74 29 20 7b 0a 09 09 73 75 62 4c 69 73 74 unt) {...subList
9cb0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Ptr = Tcl_NewObj
9cc0: 28 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 ();.. } else
9cd0: 7b 0a 09 09 73 75 62 4c 69 73 74 50 74 72 20 3d {...subListPtr =
9ce0: 20 65 6c 65 6d 50 74 72 73 5b 69 6e 64 65 78 5d elemPtrs[index]
9cf0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 ;.. }.. if
9d00: 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 73 (Tcl_IsShared(s
9d10: 75 62 4c 69 73 74 50 74 72 29 29 20 7b 0a 09 09 ubListPtr)) {...
9d20: 73 75 62 4c 69 73 74 50 74 72 20 3d 20 54 63 6c subListPtr = Tcl
9d30: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 75 _DuplicateObj(su
9d40: 62 4c 69 73 74 50 74 72 29 3b 0a 09 20 20 20 20 bListPtr);..
9d50: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 }... /*..
9d60: 20 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6f * Replace the o
9d70: 72 69 67 69 6e 61 6c 20 65 6c 65 6d 50 74 72 5b riginal elemPtr[
9d80: 69 6e 64 65 78 5d 20 69 6e 20 70 61 72 65 6e 74 index] in parent
9d90: 4c 69 73 74 20 77 69 74 68 20 61 20 63 6f 70 79 List with a copy
9da0: 0a 09 20 20 20 20 20 2a 20 77 65 20 6b 6e 6f 77 .. * we know
9db0: 20 74 6f 20 62 65 20 75 6e 73 68 61 72 65 64 2e to be unshared.
9dc0: 20 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c This call will
9dd0: 20 61 6c 73 6f 20 64 65 61 6c 20 77 69 74 68 20 also deal with
9de0: 74 68 65 0a 09 20 20 20 20 20 2a 20 73 69 74 75 the.. * situ
9df0: 61 74 69 6f 6e 20 77 68 65 72 65 20 70 61 72 65 ation where pare
9e00: 6e 74 4c 69 73 74 20 73 68 61 72 65 73 20 69 74 ntList shares it
9e10: 73 20 69 6e 74 72 65 70 20 77 69 74 68 20 6f 74 s intrep with ot
9e20: 68 65 72 0a 09 20 20 20 20 20 2a 20 54 63 6c 5f her.. * Tcl_
9e30: 4f 62 6a 27 73 2e 20 20 44 65 61 6c 69 6e 67 20 Obj's. Dealing
9e40: 77 69 74 68 20 74 68 65 20 73 68 61 72 65 64 20 with the shared
9e50: 69 6e 74 72 65 70 20 63 61 73 65 20 63 61 6e 20 intrep case can
9e60: 63 61 75 73 65 0a 09 20 20 20 20 20 2a 20 73 75 cause.. * su
9e70: 62 4c 69 73 74 50 74 72 20 74 6f 20 62 65 63 6f bListPtr to beco
9e80: 6d 65 20 73 68 61 72 65 64 20 61 67 61 69 6e 2c me shared again,
9e90: 20 73 6f 20 64 65 74 65 63 74 20 74 68 61 74 20 so detect that
9ea0: 63 61 73 65 20 61 6e 64 20 6d 61 6b 65 0a 09 20 case and make..
9eb0: 20 20 20 20 2a 20 61 6e 64 20 73 74 6f 72 65 20 * and store
9ec0: 61 6e 6f 74 68 65 72 20 63 6f 70 79 2e 0a 09 20 another copy...
9ed0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 */... if
9ee0: 28 69 6e 64 65 78 20 3d 3d 20 65 6c 65 6d 43 6f (index == elemCo
9ef0: 75 6e 74 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 unt) {...Tcl_Lis
9f00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
9f10: 74 28 4e 55 4c 4c 2c 20 70 61 72 65 6e 74 4c 69 t(NULL, parentLi
9f20: 73 74 2c 20 73 75 62 4c 69 73 74 50 74 72 29 3b st, subListPtr);
9f30: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
9f40: 09 54 63 6c 4c 69 73 74 4f 62 6a 53 65 74 45 6c .TclListObjSetEl
9f50: 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 70 61 72 65 ement(NULL, pare
9f60: 6e 74 4c 69 73 74 2c 20 69 6e 64 65 78 2c 20 73 ntList, index, s
9f70: 75 62 4c 69 73 74 50 74 72 29 3b 0a 09 20 20 20 ubListPtr);..
9f80: 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f }.. if (Tcl_
9f90: 49 73 53 68 61 72 65 64 28 73 75 62 4c 69 73 74 IsShared(subList
9fa0: 50 74 72 29 29 20 7b 0a 09 09 73 75 62 4c 69 73 Ptr)) {...subLis
9fb0: 74 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 tPtr = Tcl_Dupli
9fc0: 63 61 74 65 4f 62 6a 28 73 75 62 4c 69 73 74 50 cateObj(subListP
9fd0: 74 72 29 3b 0a 09 09 54 63 6c 4c 69 73 74 4f 62 tr);...TclListOb
9fe0: 6a 53 65 74 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c jSetElement(NULL
9ff0: 2c 20 70 61 72 65 6e 74 4c 69 73 74 2c 20 69 6e , parentList, in
a000: 64 65 78 2c 20 73 75 62 4c 69 73 74 50 74 72 29 dex, subListPtr)
a010: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f ;.. }... /
a020: 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 54 63 *.. * The Tc
a030: 6c 4c 69 73 74 4f 62 6a 53 65 74 45 6c 65 6d 65 lListObjSetEleme
a040: 6e 74 28 29 20 63 61 6c 6c 73 20 64 6f 20 6e 6f nt() calls do no
a050: 74 20 73 70 6f 69 6c 20 74 68 65 20 73 74 72 69 t spoil the stri
a060: 6e 67 20 72 65 70 20 6f 66 0a 09 20 20 20 20 20 ng rep of..
a070: 2a 20 70 61 72 65 6e 74 4c 69 73 74 2c 20 61 6e * parentList, an
a080: 64 20 74 68 61 74 27 73 20 66 69 6e 65 20 66 6f d that's fine fo
a090: 72 20 6e 6f 77 2c 20 73 69 6e 63 65 20 61 6c 6c r now, since all
a0a0: 20 77 65 27 76 65 20 64 6f 6e 65 20 73 6f 0a 09 we've done so..
a0b0: 20 20 20 20 20 2a 20 66 61 72 20 69 73 20 72 65 * far is re
a0c0: 70 6c 61 63 65 20 61 20 6c 69 73 74 20 65 6c 65 place a list ele
a0d0: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 75 6e 73 ment with an uns
a0e0: 68 61 72 65 64 20 63 6f 70 79 2e 20 20 54 68 65 hared copy. The
a0f0: 20 6c 69 73 74 0a 09 20 20 20 20 20 2a 20 76 61 list.. * va
a100: 6c 75 65 20 72 65 6d 61 69 6e 73 20 74 68 65 20 lue remains the
a110: 73 61 6d 65 2c 20 73 6f 20 74 68 65 20 73 74 72 same, so the str
a120: 69 6e 67 20 72 65 70 2e 20 69 73 20 73 74 69 6c ing rep. is stil
a130: 6c 20 76 61 6c 69 64 2c 20 61 6e 64 0a 09 20 20 l valid, and..
a140: 20 20 20 2a 20 75 6e 63 68 61 6e 67 65 64 2c 20 * unchanged,
a150: 77 68 69 63 68 20 69 73 20 67 6f 6f 64 20 62 65 which is good be
a160: 63 61 75 73 65 20 69 66 20 74 68 69 73 20 77 68 cause if this wh
a170: 6f 6c 65 20 72 6f 75 74 69 6e 65 20 72 65 74 75 ole routine retu
a180: 72 6e 73 0a 09 20 20 20 20 20 2a 20 4e 55 4c 4c rns.. * NULL
a190: 2c 20 77 65 27 64 20 6c 69 6b 65 20 74 6f 20 6c , we'd like to l
a1a0: 65 61 76 65 20 6e 6f 20 63 68 61 6e 67 65 20 74 eave no change t
a1b0: 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 o the value of t
a1c0: 68 65 20 6c 73 65 74 0a 09 20 20 20 20 20 2a 20 he lset.. *
a1d0: 76 61 72 69 61 62 6c 65 2e 20 20 4c 61 74 65 72 variable. Later
a1e0: 20 6f 6e 2c 20 77 68 65 6e 20 77 65 20 73 65 74 on, when we set
a1f0: 20 76 61 6c 75 65 50 74 72 20 69 6e 20 69 74 73 valuePtr in its
a200: 20 70 72 6f 70 65 72 20 70 6c 61 63 65 2c 0a 09 proper place,..
a210: 20 20 20 20 20 2a 20 74 68 65 6e 20 61 6c 6c 20 * then all
a220: 63 6f 6e 74 61 69 6e 69 6e 67 20 6c 69 73 74 73 containing lists
a230: 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 69 72 will have their
a240: 20 76 61 6c 75 65 73 20 63 68 61 6e 67 65 64 2c values changed,
a250: 20 61 6e 64 0a 09 20 20 20 20 20 2a 20 77 69 6c and.. * wil
a260: 6c 20 6e 65 65 64 20 74 68 65 69 72 20 73 74 72 l need their str
a270: 69 6e 67 20 72 65 70 73 20 73 70 6f 69 6c 65 64 ing reps spoiled
a280: 2e 20 20 57 65 20 6d 61 69 6e 74 61 69 6e 20 61 . We maintain a
a290: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 0a 09 20 20 list of all..
a2a0: 20 20 20 2a 20 74 68 6f 73 65 20 54 63 6c 5f 4f * those Tcl_O
a2b0: 62 6a 27 73 20 28 76 69 61 20 61 20 6c 69 74 74 bj's (via a litt
a2c0: 6c 65 20 69 6e 74 72 65 70 20 73 75 72 67 65 72 le intrep surger
a2d0: 79 29 20 73 6f 20 77 65 20 63 61 6e 20 73 70 6f y) so we can spo
a2e0: 69 6c 0a 09 20 20 20 20 20 2a 20 74 68 65 6d 20 il.. * them
a2f0: 61 74 20 74 68 61 74 20 74 69 6d 65 2e 0a 09 20 at that time...
a300: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 70 61 72 */... par
a310: 65 6e 74 4c 69 73 74 2d 3e 69 6e 74 65 72 6e 61 entList->interna
a320: 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 lRep.twoPtrValue
a330: 2e 70 74 72 32 20 3d 20 63 68 61 69 6e 50 74 72 .ptr2 = chainPtr
a340: 3b 0a 09 20 20 20 20 63 68 61 69 6e 50 74 72 20 ;.. chainPtr
a350: 3d 20 70 61 72 65 6e 74 4c 69 73 74 3b 0a 09 7d = parentList;..}
a360: 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 69 6e . } while (in
a370: 64 65 78 43 6f 75 6e 74 20 3e 20 30 29 3b 0a 0a dexCount > 0);..
a380: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 69 /*. * Ei
a390: 74 68 65 72 20 77 65 27 76 65 20 64 65 74 65 63 ther we've detec
a3a0: 74 65 64 20 61 6e 64 20 65 72 72 6f 72 20 63 6f ted and error co
a3b0: 6e 64 69 74 69 6f 6e 2c 20 61 6e 64 20 65 78 69 ndition, and exi
a3c0: 74 65 64 20 74 68 65 20 6c 6f 6f 70 20 77 69 74 ted the loop wit
a3d0: 68 0a 20 20 20 20 20 2a 20 72 65 73 75 6c 74 20 h. * result
a3e0: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 2c 20 6f 72 == TCL_ERROR, or
a3f0: 20 77 65 27 76 65 20 73 75 63 63 65 73 73 66 75 we've successfu
a400: 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 lly reached the
a410: 6c 61 73 74 20 69 6e 64 65 78 2c 20 61 6e 64 0a last index, and.
a420: 20 20 20 20 20 2a 20 77 65 27 72 65 20 72 65 61 * we're rea
a430: 64 79 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75 dy to store valu
a440: 65 50 74 72 2e 20 20 49 6e 20 65 69 74 68 65 72 ePtr. In either
a450: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 case, we need t
a460: 6f 20 63 6c 65 61 6e 20 75 70 20 6f 75 72 0a 20 o clean up our.
a470: 20 20 20 20 2a 20 73 74 72 69 6e 67 20 73 70 6f * string spo
a480: 69 6c 69 6e 67 20 6c 69 73 74 20 6f 66 20 54 63 iling list of Tc
a490: 6c 5f 4f 62 6a 27 73 2e 0a 20 20 20 20 20 2a 2f l_Obj's.. */
a4a0: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 63 68 61 .. while (cha
a4b0: 69 6e 50 74 72 29 20 7b 0a 09 54 63 6c 5f 4f 62 inPtr) {..Tcl_Ob
a4c0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 63 68 61 69 j *objPtr = chai
a4d0: 6e 50 74 72 3b 0a 0a 09 69 66 20 28 72 65 73 75 nPtr;...if (resu
a4e0: 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a lt == TCL_OK) {.
a4f0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
a500: 57 65 27 72 65 20 67 6f 69 6e 67 20 74 6f 20 73 We're going to s
a510: 74 6f 72 65 20 76 61 6c 75 65 50 74 72 2c 20 73 tore valuePtr, s
a520: 6f 20 73 70 6f 69 6c 20 73 74 72 69 6e 67 20 72 o spoil string r
a530: 65 70 73 20 6f 66 20 61 6c 6c 0a 09 20 20 20 20 eps of all..
a540: 20 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c 69 * containing li
a550: 73 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 sts... */...
a560: 20 20 20 20 54 63 6c 49 6e 76 61 6c 69 64 61 74 TclInvalidat
a570: 65 53 74 72 69 6e 67 52 65 70 28 6f 62 6a 50 74 eStringRep(objPt
a580: 72 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 r);..}.../*.. *
a590: 43 6c 65 61 72 20 61 77 61 79 20 6f 75 72 20 69 Clear away our i
a5a0: 6e 74 72 65 70 20 73 75 72 67 65 72 79 20 6d 65 ntrep surgery me
a5b0: 73 73 2e 0a 09 20 2a 2f 0a 0a 09 63 68 61 69 6e ss... */...chain
a5c0: 50 74 72 20 3d 20 6f 62 6a 50 74 72 2d 3e 69 6e Ptr = objPtr->in
a5d0: 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72 ternalRep.twoPtr
a5e0: 56 61 6c 75 65 2e 70 74 72 32 3b 0a 09 6f 62 6a Value.ptr2;..obj
a5f0: 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 Ptr->internalRep
a600: 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 .twoPtrValue.ptr
a610: 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 2 = NULL;. }.
a620: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 . if (result
a630: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a != TCL_OK) {../*
a640: 0a 09 20 2a 20 45 72 72 6f 72 20 72 65 74 75 72 .. * Error retur
a650: 6e 3b 20 6d 65 73 73 61 67 65 20 69 73 20 61 6c n; message is al
a660: 72 65 61 64 79 20 69 6e 20 69 6e 74 65 72 70 2e ready in interp.
a670: 20 43 6c 65 61 6e 20 75 70 20 61 6e 79 20 65 78 Clean up any ex
a680: 63 65 73 73 0a 09 20 2a 20 6d 65 6d 6f 72 79 2e cess.. * memory.
a690: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 72 65 74 56 .. */...if (retV
a6a0: 61 6c 75 65 50 74 72 20 21 3d 20 6c 69 73 74 50 aluePtr != listP
a6b0: 74 72 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 tr) {.. Tcl_D
a6c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 74 56 ecrRefCount(retV
a6d0: 61 6c 75 65 50 74 72 29 3b 0a 09 7d 0a 09 72 65 aluePtr);..}..re
a6e0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
a6f0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
a700: 53 74 6f 72 65 20 76 61 6c 75 65 50 74 72 20 69 Store valuePtr i
a710: 6e 20 70 72 6f 70 65 72 20 73 75 62 6c 69 73 74 n proper sublist
a720: 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 54 68 65 and return. The
a730: 20 2d 31 20 69 73 20 74 6f 20 61 76 6f 69 64 20 -1 is to avoid
a740: 61 0a 20 20 20 20 20 2a 20 63 6f 6d 70 69 6c 65 a. * compile
a750: 72 20 77 61 72 6e 69 6e 67 20 28 6e 6f 74 20 61 r warning (not a
a760: 20 70 72 6f 62 6c 65 6d 20 62 65 63 61 75 73 65 problem because
a770: 20 77 65 20 63 68 65 63 6b 65 64 20 74 68 61 74 we checked that
a780: 20 77 65 20 68 61 76 65 20 61 0a 20 20 20 20 20 we have a.
a790: 2a 20 70 72 6f 70 65 72 20 6c 69 73 74 20 2d 20 * proper list -
a7a0: 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 63 6f 6e or something con
a7b0: 76 65 72 74 69 62 6c 65 20 74 6f 20 6f 6e 65 20 vertible to one
a7c0: 2d 20 61 62 6f 76 65 29 2e 0a 20 20 20 20 20 2a - above).. *
a7d0: 2f 0a 0a 20 20 20 20 6c 65 6e 20 3d 20 2d 31 3b /.. len = -1;
a7e0: 0a 20 20 20 20 54 63 6c 4c 69 73 74 4f 62 6a 4c . TclListObjL
a7f0: 65 6e 67 74 68 28 4e 55 4c 4c 2c 20 73 75 62 4c ength(NULL, subL
a800: 69 73 74 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 20 istPtr, &len);.
a810: 20 20 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 if (index ==
a820: 6c 65 6e 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 len) {..Tcl_List
a830: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
a840: 28 4e 55 4c 4c 2c 20 73 75 62 4c 69 73 74 50 74 (NULL, subListPt
a850: 72 2c 20 76 61 6c 75 65 50 74 72 29 3b 0a 20 20 r, valuePtr);.
a860: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 4c } else {..TclL
a870: 69 73 74 4f 62 6a 53 65 74 45 6c 65 6d 65 6e 74 istObjSetElement
a880: 28 4e 55 4c 4c 2c 20 73 75 62 4c 69 73 74 50 74 (NULL, subListPt
a890: 72 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75 65 50 r, index, valueP
a8a0: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 tr);. }. T
a8b0: 63 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69 clInvalidateStri
a8c0: 6e 67 52 65 70 28 73 75 62 4c 69 73 74 50 74 72 ngRep(subListPtr
a8d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 );. Tcl_IncrR
a8e0: 65 66 43 6f 75 6e 74 28 72 65 74 56 61 6c 75 65 efCount(retValue
a8f0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
a900: 20 72 65 74 56 61 6c 75 65 50 74 72 3b 0a 7d 0a retValuePtr;.}.
a910: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
a960: 0a 20 2a 20 54 63 6c 4c 69 73 74 4f 62 6a 53 65 . * TclListObjSe
a970: 74 45 6c 65 6d 65 6e 74 20 2d 2d 0a 20 2a 0a 20 tElement --. *.
a980: 2a 09 53 65 74 20 61 20 73 69 6e 67 6c 65 20 65 *.Set a single e
a990: 6c 65 6d 65 6e 74 20 6f 66 20 61 20 6c 69 73 74 lement of a list
a9a0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 to a specified
a9b0: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 09 49 74 20 value.. *. *.It
a9c0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 27 73 20 is the caller's
a9d0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 responsibility t
a9e0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 o invalidate the
a9f0: 20 73 74 72 69 6e 67 0a 20 2a 09 72 65 70 72 65 string. *.repre
aa00: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 sentation of the
aa10: 20 27 6c 69 73 74 50 74 72 27 2e 0a 20 2a 0a 20 'listPtr'.. *.
aa20: 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 20 09 54 * Value. *. * .T
aa30: 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 20 20 20 20 CL_OK. *. *.
aa40: 53 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 09 54 Success.. *. *.T
aa50: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 09 20 CL_ERROR. *. *.
aa60: 20 20 20 27 6c 69 73 74 50 74 72 27 20 64 6f 65 'listPtr' doe
aa70: 73 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 s not refer to a
aa80: 20 6c 69 73 74 20 6f 62 6a 65 63 74 20 61 6e 64 list object and
aa90: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 cannot be conve
aaa0: 72 74 65 64 0a 20 2a 09 20 20 20 20 74 6f 20 6f rted. *. to o
aab0: 6e 65 2e 20 20 41 6e 20 65 72 72 6f 72 20 6d 65 ne. An error me
aac0: 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20 6c 65 ssage will be le
aad0: 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 ft in the interp
aae0: 72 65 74 65 72 20 72 65 73 75 6c 74 20 69 66 0a reter result if.
aaf0: 20 2a 09 20 20 20 20 69 6e 74 65 72 70 20 69 73 *. interp is
ab00: 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a not NULL.. *. *
ab10: 09 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a .TCL_ERROR. *. *
ab20: 09 20 20 20 20 41 6e 20 69 6e 64 65 78 20 64 65 . An index de
ab30: 73 69 67 6e 61 74 65 73 20 61 6e 20 65 6c 65 6d signates an elem
ab40: 65 6e 74 20 6f 75 74 73 69 64 65 20 74 68 65 20 ent outside the
ab50: 72 61 6e 67 65 20 5b 30 2e 2e 6c 69 73 74 4c 65 range [0..listLe
ab60: 6e 67 74 68 2d 31 5d 2c 0a 20 2a 09 20 20 20 20 ngth-1],. *.
ab70: 77 68 65 72 65 20 27 6c 69 73 74 4c 65 6e 67 74 where 'listLengt
ab80: 68 27 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20 h' is the count
ab90: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 of elements in t
aba0: 68 65 20 6c 69 73 74 20 6f 62 6a 65 63 74 0a 20 he list object.
abb0: 2a 09 20 20 20 20 64 65 73 69 67 6e 61 74 65 64 *. designated
abc0: 20 62 79 20 27 6c 69 73 74 50 74 72 27 2e 20 20 by 'listPtr'.
abd0: 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 An error message
abe0: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a is left in the.
abf0: 20 2a 09 20 20 20 20 69 6e 74 65 72 70 72 65 74 *. interpret
ac00: 65 72 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a er result.. *. *
ac10: 20 45 66 66 65 63 74 0a 20 2a 0a 20 2a 09 49 66 Effect. *. *.If
ac20: 20 27 6c 69 73 74 50 74 72 27 20 64 65 73 69 67 'listPtr' desig
ac30: 6e 61 74 65 73 20 61 20 73 68 61 72 65 64 20 6f nates a shared o
ac40: 62 6a 65 63 74 2c 20 27 54 63 6c 5f 50 61 6e 69 bject, 'Tcl_Pani
ac50: 63 27 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 c' is called. I
ac60: 66 0a 20 2a 09 27 6c 69 73 74 50 74 72 27 20 69 f. *.'listPtr' i
ac70: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 66 s not already of
ac80: 20 74 79 70 65 20 27 74 63 6c 4c 69 73 74 54 79 type 'tclListTy
ac90: 70 65 27 2c 20 69 74 20 69 73 20 63 6f 6e 76 65 pe', it is conve
aca0: 72 74 65 64 20 61 6e 64 20 74 68 65 0a 20 2a 09 rted and the. *.
acb0: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 internal represe
acc0: 6e 74 61 74 69 6f 6e 20 69 73 20 75 6e 73 68 61 ntation is unsha
acd0: 72 65 64 2e 20 54 68 65 20 27 72 65 66 43 6f 75 red. The 'refCou
ace0: 6e 74 27 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 nt' of the eleme
acf0: 6e 74 20 61 74 0a 20 2a 09 27 69 6e 64 65 78 27 nt at. *.'index'
ad00: 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 20 is decremented
ad10: 61 6e 64 20 72 65 70 6c 61 63 65 64 20 69 6e 20 and replaced in
ad20: 74 68 65 20 6c 69 73 74 20 77 69 74 68 20 74 68 the list with th
ad30: 65 20 27 76 61 6c 75 65 50 74 72 27 2c 0a 20 2a e 'valuePtr',. *
ad40: 09 77 68 6f 73 65 20 27 72 65 66 43 6f 75 6e 74 .whose 'refCount
ad50: 27 20 69 6e 20 74 75 72 6e 20 69 73 20 69 6e 63 ' in turn is inc
ad60: 72 65 6d 65 6e 74 65 64 2e 0a 20 2a 0a 20 2a 0a remented.. *. *.
ad70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
ad80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
adc0: 74 0a 54 63 6c 4c 69 73 74 4f 62 6a 53 65 74 45 t.TclListObjSetE
add0: 6c 65 6d 65 6e 74 28 0a 20 20 20 20 54 63 6c 5f lement(. Tcl_
ade0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
adf0: 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 ./* Tcl interpre
ae00: 74 65 72 3b 20 75 73 65 64 20 66 6f 72 20 65 72 ter; used for er
ae10: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 0a 09 09 ror reporting...
ae20: 09 09 20 2a 20 69 66 20 6e 6f 74 20 4e 55 4c 4c .. * if not NULL
ae30: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
ae40: 20 2a 6c 69 73 74 50 74 72 2c 09 09 2f 2a 20 4c *listPtr,../* L
ae50: 69 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 77 68 ist object in wh
ae60: 69 63 68 20 65 6c 65 6d 65 6e 74 20 73 68 6f 75 ich element shou
ae70: 6c 64 20 62 65 0a 09 09 09 09 20 2a 20 73 74 6f ld be..... * sto
ae80: 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 red. */. int
ae90: 69 6e 64 65 78 2c 09 09 09 2f 2a 20 49 6e 64 65 index,.../* Inde
aea0: 78 20 6f 66 20 65 6c 65 6d 65 6e 74 20 74 6f 20 x of element to
aeb0: 73 74 6f 72 65 2e 20 2a 2f 0a 20 20 20 20 54 63 store. */. Tc
aec0: 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 50 74 72 29 l_Obj *valuePtr)
aed0: 09 09 2f 2a 20 54 63 6c 20 6f 62 6a 65 63 74 20 ../* Tcl object
aee0: 74 6f 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 to store in the
aef0: 64 65 73 69 67 6e 61 74 65 64 20 6c 69 73 74 0a designated list.
af00: 09 09 09 09 20 2a 20 65 6c 65 6d 65 6e 74 2e 20 .... * element.
af10: 2a 2f 0a 7b 0a 20 20 20 20 4c 69 73 74 20 2a 6c */.{. List *l
af20: 69 73 74 52 65 70 50 74 72 3b 09 09 2f 2a 20 49 istRepPtr;../* I
af30: 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e nternal represen
af40: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 tation of the li
af50: 73 74 20 62 65 69 6e 67 0a 09 09 09 09 20 2a 20 st being..... *
af60: 6d 6f 64 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 modified. */.
af70: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 65 6c 65 6d 50 Tcl_Obj **elemP
af80: 74 72 73 3b 09 09 2f 2a 20 50 6f 69 6e 74 65 72 trs;../* Pointer
af90: 73 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 s to elements of
afa0: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 the list. */.
afb0: 20 20 69 6e 74 20 65 6c 65 6d 43 6f 75 6e 74 3b int elemCount;
afc0: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 ../* Number of e
afd0: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c lements in the l
afe0: 69 73 74 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a ist. */.. /*.
aff0: 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 74 68 * Ensure th
b000: 61 74 20 74 68 65 20 6c 69 73 74 50 74 72 20 70 at the listPtr p
b010: 61 72 61 6d 65 74 65 72 20 64 65 73 69 67 6e 61 arameter designa
b020: 74 65 73 20 61 6e 20 75 6e 73 68 61 72 65 64 20 tes an unshared
b030: 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 list.. */..
b040: 20 20 20 69 66 20 28 54 63 6c 5f 49 73 53 68 61 if (Tcl_IsSha
b050: 72 65 64 28 6c 69 73 74 50 74 72 29 29 20 7b 0a red(listPtr)) {.
b060: 09 54 63 6c 5f 50 61 6e 69 63 28 22 25 73 20 63 .Tcl_Panic("%s c
b070: 61 6c 6c 65 64 20 77 69 74 68 20 73 68 61 72 65 alled with share
b080: 64 20 6f 62 6a 65 63 74 22 2c 20 22 54 63 6c 4c d object", "TclL
b090: 69 73 74 4f 62 6a 53 65 74 45 6c 65 6d 65 6e 74 istObjSetElement
b0a0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ");. }. if
b0b0: 20 28 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 50 (listPtr->typeP
b0c0: 74 72 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 79 tr != &tclListTy
b0d0: 70 65 29 20 7b 0a 09 69 6e 74 20 72 65 73 75 6c pe) {..int resul
b0e0: 74 3b 0a 0a 09 69 66 20 28 6c 69 73 74 50 74 72 t;...if (listPtr
b0f0: 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c 45 6d ->bytes == tclEm
b100: 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 7b 0a ptyStringRep) {.
b110: 09 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 . if (interp
b120: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c != NULL) {...Tcl
b130: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
b140: 74 65 72 70 2c 0a 09 09 09 54 63 6c 5f 4e 65 77 terp,....Tcl_New
b150: 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 73 74 20 StringObj("list
b160: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e index out of ran
b170: 67 65 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c ge", -1));...Tcl
b180: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b190: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50 terp, "TCL", "OP
b1a0: 45 52 41 54 49 4f 4e 22 2c 20 22 4c 53 45 54 22 ERATION", "LSET"
b1b0: 2c 0a 09 09 09 22 42 41 44 49 4e 44 45 58 22 2c ,...."BADINDEX",
b1c0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 7d 0a 09 NULL);.. }..
b1d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b1e0: 52 52 4f 52 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 RROR;..}..result
b1f0: 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e = SetListFromAn
b200: 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 y(interp, listPt
b210: 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 r);..if (result
b220: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
b230: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b return result;
b240: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c ..}. }.. l
b250: 69 73 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74 istRepPtr = List
b260: 52 65 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b RepPtr(listPtr);
b270: 0a 20 20 20 20 65 6c 65 6d 43 6f 75 6e 74 20 3d . elemCount =
b280: 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 listRepPtr->ele
b290: 6d 43 6f 75 6e 74 3b 0a 0a 20 20 20 20 2f 2a 0a mCount;.. /*.
b2a0: 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 74 68 * Ensure th
b2b0: 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 at the index is
b2c0: 69 6e 20 62 6f 75 6e 64 73 2e 0a 20 20 20 20 20 in bounds..
b2d0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 69 6e 64 65 */.. if (inde
b2e0: 78 3c 30 20 7c 7c 20 69 6e 64 65 78 3e 3d 65 6c x<0 || index>=el
b2f0: 65 6d 43 6f 75 6e 74 29 20 7b 0a 09 69 66 20 28 emCount) {..if (
b300: 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 interp != NULL)
b310: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 {.. Tcl_SetOb
b320: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a jResult(interp,.
b330: 09 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
b340: 69 6e 67 4f 62 6a 28 22 6c 69 73 74 20 69 6e 64 ingObj("list ind
b350: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 ex out of range"
b360: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c , -1));.. Tcl
b370: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b380: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50 terp, "TCL", "OP
b390: 45 52 41 54 49 4f 4e 22 2c 20 22 4c 53 45 54 22 ERATION", "LSET"
b3a0: 2c 20 22 42 41 44 49 4e 44 45 58 22 2c 0a 09 09 , "BADINDEX",...
b3b0: 20 20 20 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 NULL);..}..r
b3c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b3d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
b3e0: 20 20 20 20 2a 20 49 66 20 74 68 65 20 69 6e 74 * If the int
b3f0: 65 72 6e 61 6c 20 72 65 70 20 69 73 20 73 68 61 ernal rep is sha
b400: 72 65 64 2c 20 72 65 70 6c 61 63 65 20 69 74 20 red, replace it
b410: 77 69 74 68 20 61 6e 20 75 6e 73 68 61 72 65 64 with an unshared
b420: 20 63 6f 70 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a copy.. */..
b430: 20 20 20 20 69 66 20 28 6c 69 73 74 52 65 70 50 if (listRepP
b440: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3e 20 31 tr->refCount > 1
b450: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 64 ) {..Tcl_Obj **d
b460: 73 74 2c 20 2a 2a 73 72 63 20 3d 20 26 6c 69 73 st, **src = &lis
b470: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 tRepPtr->element
b480: 73 3b 0a 09 4c 69 73 74 20 2a 6e 65 77 50 74 72 s;..List *newPtr
b490: 20 3d 20 41 74 74 65 6d 70 74 4e 65 77 4c 69 73 = AttemptNewLis
b4a0: 74 28 4e 55 4c 4c 2c 20 6c 69 73 74 52 65 70 50 t(NULL, listRepP
b4b0: 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74 tr->maxElemCount
b4c0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6e , NULL);...if (n
b4d0: 65 77 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b ewPtr == NULL) {
b4e0: 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 41 .. newPtr = A
b4f0: 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 69 6e ttemptNewList(in
b500: 74 65 72 70 2c 20 65 6c 65 6d 43 6f 75 6e 74 2c terp, elemCount,
b510: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 NULL);.. if
b520: 28 6e 65 77 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 (newPtr == NULL)
b530: 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
b540: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d ERROR;.. }..}
b550: 0a 09 6e 65 77 50 74 72 2d 3e 72 65 66 43 6f 75 ..newPtr->refCou
b560: 6e 74 2b 2b 3b 0a 09 6e 65 77 50 74 72 2d 3e 65 nt++;..newPtr->e
b570: 6c 65 6d 43 6f 75 6e 74 20 3d 20 65 6c 65 6d 43 lemCount = elemC
b580: 6f 75 6e 74 3b 0a 09 6e 65 77 50 74 72 2d 3e 63 ount;..newPtr->c
b590: 61 6e 6f 6e 69 63 61 6c 46 6c 61 67 20 3d 20 6c anonicalFlag = l
b5a0: 69 73 74 52 65 70 50 74 72 2d 3e 63 61 6e 6f 6e istRepPtr->canon
b5b0: 69 63 61 6c 46 6c 61 67 3b 0a 0a 09 64 73 74 20 icalFlag;...dst
b5c0: 3d 20 26 6e 65 77 50 74 72 2d 3e 65 6c 65 6d 65 = &newPtr->eleme
b5d0: 6e 74 73 3b 0a 09 77 68 69 6c 65 20 28 65 6c 65 nts;..while (ele
b5e0: 6d 43 6f 75 6e 74 2d 2d 29 20 7b 0a 09 20 20 20 mCount--) {..
b5f0: 20 2a 64 73 74 20 3d 20 2a 73 72 63 2b 2b 3b 0a *dst = *src++;.
b600: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
b610: 43 6f 75 6e 74 28 2a 64 73 74 2b 2b 29 3b 0a 09 Count(*dst++);..
b620: 7d 0a 0a 09 6c 69 73 74 52 65 70 50 74 72 2d 3e }...listRepPtr->
b630: 72 65 66 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 6c 69 refCount--;...li
b640: 73 74 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 stPtr->internalR
b650: 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 ep.twoPtrValue.p
b660: 74 72 31 20 3d 20 6c 69 73 74 52 65 70 50 74 72 tr1 = listRepPtr
b670: 20 3d 20 6e 65 77 50 74 72 3b 0a 20 20 20 20 7d = newPtr;. }
b680: 0a 20 20 20 20 65 6c 65 6d 50 74 72 73 20 3d 20 . elemPtrs =
b690: 26 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 &listRepPtr->ele
b6a0: 6d 65 6e 74 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 ments;.. /*.
b6b0: 20 20 20 20 2a 20 41 64 64 20 61 20 72 65 66 65 * Add a refe
b6c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 rence to the new
b6d0: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 2e 0a 20 list element..
b6e0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f */.. Tcl_
b6f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c IncrRefCount(val
b700: 75 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a uePtr);.. /*.
b710: 20 20 20 20 20 2a 20 52 65 6d 6f 76 65 20 61 20 * Remove a
b720: 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 reference from t
b730: 68 65 20 6f 6c 64 20 6c 69 73 74 20 65 6c 65 6d he old list elem
b740: 65 6e 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ent.. */..
b750: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
b760: 6e 74 28 65 6c 65 6d 50 74 72 73 5b 69 6e 64 65 nt(elemPtrs[inde
b770: 78 5d 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 x]);.. /*.
b780: 20 20 2a 20 53 74 61 73 68 20 74 68 65 20 6e 65 * Stash the ne
b790: 77 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 w object in the
b7a0: 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 list.. */..
b7b0: 20 20 20 65 6c 65 6d 50 74 72 73 5b 69 6e 64 65 elemPtrs[inde
b7c0: 78 5d 20 3d 20 76 61 6c 75 65 50 74 72 3b 0a 0a x] = valuePtr;..
b7d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
b7e0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b830: 2d 2d 0a 20 2a 0a 20 2a 20 46 72 65 65 4c 69 73 --. *. * FreeLis
b840: 74 49 6e 74 65 72 6e 61 6c 52 65 70 20 2d 2d 0a tInternalRep --.
b850: 20 2a 0a 20 2a 09 44 65 61 6c 6c 6f 63 61 74 65 *. *.Deallocate
b860: 20 74 68 65 20 73 74 6f 72 61 67 65 20 61 73 73 the storage ass
b870: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
b880: 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 internal repres
b890: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 20 2a entation of a. *
b8a0: 09 61 20 6c 69 73 74 20 6f 62 6a 65 63 74 2e 0a .a list object..
b8b0: 20 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a *. * Effect. *.
b8c0: 20 2a 09 54 68 65 20 73 74 6f 72 61 67 65 20 66 *.The storage f
b8d0: 6f 72 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 or the internal
b8e0: 27 4c 69 73 74 27 20 70 6f 69 6e 74 65 72 20 6f 'List' pointer o
b8f0: 66 20 27 6c 69 73 74 50 74 72 27 20 69 73 20 66 f 'listPtr' is f
b900: 72 65 65 64 2c 20 74 68 65 0a 20 2a 09 27 69 6e reed, the. *.'in
b910: 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72 ternalRep.twoPtr
b920: 56 61 6c 75 65 2e 70 74 72 31 27 20 6f 66 20 27 Value.ptr1' of '
b930: 6c 69 73 74 50 74 72 27 20 69 73 20 73 65 74 20 listPtr' is set
b940: 74 6f 20 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65 to NULL, and the
b950: 20 27 72 65 66 43 6f 75 6e 74 27 0a 20 2a 09 6f 'refCount'. *.o
b960: 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f f each element o
b970: 66 20 74 68 65 20 6c 69 73 74 20 69 73 20 64 65 f the list is de
b980: 63 72 65 6d 65 6e 74 65 64 2e 0a 20 2a 0a 20 2a cremented.. *. *
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
b9e0: 69 63 20 76 6f 69 64 0a 46 72 65 65 4c 69 73 74 ic void.FreeList
b9f0: 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a 20 20 20 InternalRep(.
ba00: 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 Tcl_Obj *listPt
ba10: 72 29 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a 65 r)../* List obje
ba20: 63 74 20 77 69 74 68 20 69 6e 74 65 72 6e 61 6c ct with internal
ba30: 20 72 65 70 20 74 6f 20 66 72 65 65 2e 20 2a 2f rep to free. */
ba40: 0a 7b 0a 20 20 20 20 4c 69 73 74 20 2a 6c 69 73 .{. List *lis
ba50: 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74 52 65 tRepPtr = ListRe
ba60: 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b 0a 0a pPtr(listPtr);..
ba70: 20 20 20 20 69 66 20 28 6c 69 73 74 52 65 70 50 if (listRepP
ba80: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d 20 3c tr->refCount-- <
ba90: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 = 1) {..Tcl_Obj
baa0: 2a 2a 65 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 **elemPtrs = &li
bab0: 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e stRepPtr->elemen
bac0: 74 73 3b 0a 09 69 6e 74 20 69 2c 20 6e 75 6d 45 ts;..int i, numE
bad0: 6c 65 6d 73 20 3d 20 6c 69 73 74 52 65 70 50 74 lems = listRepPt
bae0: 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 3b 0a 0a 09 r->elemCount;...
baf0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 20 69 20 3c for (i = 0; i <
bb00: 20 6e 75 6d 45 6c 65 6d 73 3b 20 20 69 2b 2b 29 numElems; i++)
bb10: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 {.. Tcl_Decr
bb20: 52 65 66 43 6f 75 6e 74 28 65 6c 65 6d 50 74 72 RefCount(elemPtr
bb30: 73 5b 69 5d 29 3b 0a 09 7d 0a 09 63 6b 66 72 65 s[i]);..}..ckfre
bb40: 65 28 6c 69 73 74 52 65 70 50 74 72 29 3b 0a 20 e(listRepPtr);.
bb50: 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73 74 50 74 }.. listPt
bb60: 72 2d 3e 74 79 70 65 50 74 72 20 3d 20 4e 55 4c r->typePtr = NUL
bb70: 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d L;.}.../*. *----
bb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbc0: 2d 2d 0a 20 2a 0a 20 2a 20 44 75 70 4c 69 73 74 --. *. * DupList
bbd0: 49 6e 74 65 72 6e 61 6c 52 65 70 20 2d 2d 0a 20 InternalRep --.
bbe0: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 *. *.Initialize
bbf0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 the internal rep
bc00: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 resentation of a
bc10: 20 6c 69 73 74 20 27 54 63 6c 5f 4f 62 6a 27 20 list 'Tcl_Obj'
bc20: 74 6f 20 73 68 61 72 65 20 74 68 65 0a 20 2a 09 to share the. *.
bc30: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 internal represe
bc40: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 ntation of an ex
bc50: 69 73 74 69 6e 67 20 6c 69 73 74 20 6f 62 6a 65 isting list obje
bc60: 63 74 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63 74 ct.. *. * Effect
bc70: 0a 20 2a 0a 20 2a 09 54 68 65 20 27 72 65 66 43 . *. *.The 'refC
bc80: 6f 75 6e 74 27 20 6f 66 20 74 68 65 20 4c 69 73 ount' of the Lis
bc90: 74 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 20 69 t internal rep i
bca0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 20 s incremented..
bcb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
bcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
bd00: 73 74 61 74 69 63 20 76 6f 69 64 0a 44 75 70 4c static void.DupL
bd10: 69 73 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a istInternalRep(.
bd20: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 72 63 Tcl_Obj *src
bd30: 50 74 72 2c 09 09 2f 2a 20 4f 62 6a 65 63 74 20 Ptr,../* Object
bd40: 77 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 72 65 with internal re
bd50: 70 20 74 6f 20 63 6f 70 79 2e 20 2a 2f 0a 20 20 p to copy. */.
bd60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 70 79 50 Tcl_Obj *copyP
bd70: 74 72 29 09 09 2f 2a 20 4f 62 6a 65 63 74 20 77 tr)../* Object w
bd80: 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 ith internal rep
bd90: 20 74 6f 20 73 65 74 2e 20 2a 2f 0a 7b 0a 20 20 to set. */.{.
bda0: 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50 List *listRepP
bdb0: 74 72 20 3d 20 4c 69 73 74 52 65 70 50 74 72 28 tr = ListRepPtr(
bdc0: 73 72 63 50 74 72 29 3b 0a 0a 20 20 20 20 4c 69 srcPtr);.. Li
bdd0: 73 74 53 65 74 49 6e 74 52 65 70 28 63 6f 70 79 stSetIntRep(copy
bde0: 50 74 72 2c 20 6c 69 73 74 52 65 70 50 74 72 29 Ptr, listRepPtr)
bdf0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be40: 2d 0a 20 2a 0a 20 2a 20 53 65 74 4c 69 73 74 46 -. *. * SetListF
be50: 72 6f 6d 41 6e 79 20 2d 2d 0a 20 2a 0a 20 2a 09 romAny --. *. *.
be60: 43 6f 6e 76 65 72 74 20 61 6e 79 20 6f 62 6a 65 Convert any obje
be70: 63 74 20 74 6f 20 61 20 6c 69 73 74 2e 0a 20 2a ct to a list.. *
be80: 0a 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 20 . * Value. *. *
be90: 20 20 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 TCL_OK. *. *.
bea0: 53 75 63 63 65 73 73 2e 20 20 54 68 65 20 69 6e Success. The in
beb0: 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 ternal represent
bec0: 61 74 69 6f 6e 20 6f 66 20 27 6f 62 6a 50 74 72 ation of 'objPtr
bed0: 27 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 ' is set, and th
bee0: 65 20 74 79 70 65 0a 20 2a 09 6f 66 20 27 6f 62 e type. *.of 'ob
bef0: 6a 50 74 72 27 20 69 73 20 27 74 63 6c 4c 69 73 jPtr' is 'tclLis
bf00: 74 54 79 70 65 27 2e 0a 20 2a 0a 20 2a 20 20 20 tType'.. *. *
bf10: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
bf20: 09 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 .An error occure
bf30: 64 20 64 75 72 69 6e 67 20 63 6f 6e 76 65 72 73 d during convers
bf40: 69 6f 6e 2e 20 41 6e 20 65 72 72 6f 72 20 6d 65 ion. An error me
bf50: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e ssage is left in
bf60: 20 74 68 65 0a 20 2a 09 69 6e 74 65 72 70 72 65 the. *.interpre
bf70: 74 65 72 27 73 20 72 65 73 75 6c 74 20 69 66 20 ter's result if
bf80: 27 69 6e 74 65 72 70 27 20 69 73 20 6e 6f 74 20 'interp' is not
bf90: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 0a 20 2a 2d 2d NULL.. *. *. *--
bfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfe0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
bff0: 20 69 6e 74 0a 53 65 74 4c 69 73 74 46 72 6f 6d int.SetListFrom
c000: 41 6e 79 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 Any(. Tcl_Int
c010: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
c020: 20 55 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 Used for error
c030: 72 65 70 6f 72 74 69 6e 67 20 69 66 20 6e 6f 74 reporting if not
c040: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 54 63 NULL. */. Tc
c050: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 29 09 09 l_Obj *objPtr)..
c060: 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f /* The object to
c070: 20 63 6f 6e 76 65 72 74 2e 20 2a 2f 0a 7b 0a 20 convert. */.{.
c080: 20 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 List *listRep
c090: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a Ptr;. Tcl_Obj
c0a0: 20 2a 2a 65 6c 65 6d 50 74 72 73 3b 0a 0a 20 20 **elemPtrs;..
c0b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 69 63 74 /*. * Dict
c0c0: 69 6f 6e 61 72 69 65 73 20 61 72 65 20 61 20 73 ionaries are a s
c0d0: 70 65 63 69 61 6c 20 63 61 73 65 3b 20 74 68 65 pecial case; the
c0e0: 79 20 68 61 76 65 20 61 20 73 74 72 69 6e 67 20 y have a string
c0f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 representation s
c100: 75 63 68 0a 20 20 20 20 20 2a 20 74 68 61 74 20 uch. * that
c110: 2a 61 6c 6c 2a 20 76 61 6c 69 64 20 64 69 63 74 *all* valid dict
c120: 69 6f 6e 61 72 69 65 73 20 61 72 65 20 76 61 6c ionaries are val
c130: 69 64 20 6c 69 73 74 73 2e 20 48 65 6e 63 65 20 id lists. Hence
c140: 77 65 20 63 61 6e 20 63 6f 6e 76 65 72 74 0a 20 we can convert.
c150: 20 20 20 20 2a 20 6d 6f 72 65 20 64 69 72 65 63 * more direc
c160: 74 6c 79 2e 20 4f 6e 6c 79 20 64 6f 20 74 68 69 tly. Only do thi
c170: 73 20 77 68 65 6e 20 74 68 65 72 65 27 73 20 6e s when there's n
c180: 6f 20 65 78 69 73 74 69 6e 67 20 73 74 72 69 6e o existing strin
c190: 67 20 72 65 70 3b 20 69 66 0a 20 20 20 20 20 2a g rep; if. *
c1a0: 20 74 68 65 72 65 20 69 73 2c 20 69 74 20 69 73 there is, it is
c1b0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 20 the string rep
c1c0: 74 68 61 74 27 73 20 61 75 74 68 6f 72 69 74 61 that's authorita
c1d0: 74 69 76 65 20 28 62 65 63 61 75 73 65 20 69 74 tive (because it
c1e0: 20 63 6f 75 6c 64 0a 20 20 20 20 20 2a 20 64 65 could. * de
c1f0: 73 63 72 69 62 65 20 64 75 70 6c 69 63 61 74 65 scribe duplicate
c200: 20 6b 65 79 73 29 2e 0a 20 20 20 20 20 2a 2f 0a keys).. */.
c210: 0a 20 20 20 20 69 66 20 28 6f 62 6a 50 74 72 2d . if (objPtr-
c220: 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 74 63 6c >typePtr == &tcl
c230: 44 69 63 74 54 79 70 65 20 26 26 20 21 6f 62 6a DictType && !obj
c240: 50 74 72 2d 3e 62 79 74 65 73 29 20 7b 0a 09 54 Ptr->bytes) {..T
c250: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 50 74 72 2c 20 cl_Obj *keyPtr,
c260: 2a 76 61 6c 75 65 50 74 72 3b 0a 09 54 63 6c 5f *valuePtr;..Tcl_
c270: 44 69 63 74 53 65 61 72 63 68 20 73 65 61 72 63 DictSearch searc
c280: 68 3b 0a 09 69 6e 74 20 64 6f 6e 65 2c 20 73 69 h;..int done, si
c290: 7a 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 72 65 ze;.../*.. * Cre
c2a0: 61 74 65 20 74 68 65 20 6e 65 77 20 6c 69 73 74 ate the new list
c2b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e representation.
c2c0: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 64 6f Note that we do
c2d0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 0a not need to do.
c2e0: 09 20 2a 20 61 6e 79 74 68 69 6e 67 20 77 69 74 . * anything wit
c2f0: 68 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 h the string rep
c300: 72 65 73 65 6e 74 61 74 69 6f 6e 20 61 73 20 74 resentation as t
c310: 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f he transformatio
c320: 6e 20 28 61 6e 64 0a 09 20 2a 20 74 68 65 20 72 n (and.. * the r
c330: 65 76 65 72 73 65 20 62 61 63 6b 20 74 6f 20 61 everse back to a
c340: 20 64 69 63 74 69 6f 6e 61 72 79 29 20 61 72 65 dictionary) are
c350: 20 62 6f 74 68 20 6f 72 64 65 72 2d 70 72 65 73 both order-pres
c360: 65 72 76 69 6e 67 2e 20 41 6c 73 6f 0a 09 20 2a erving. Also.. *
c370: 20 6e 6f 74 65 20 74 68 61 74 20 73 69 6e 63 65 note that since
c380: 20 77 65 20 6b 6e 6f 77 20 77 65 27 76 65 20 67 we know we've g
c390: 6f 74 20 61 20 76 61 6c 69 64 20 64 69 63 74 69 ot a valid dicti
c3a0: 6f 6e 61 72 79 20 28 62 79 0a 09 20 2a 20 72 65 onary (by.. * re
c3b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 20 77 65 presentation) we
c3c0: 20 61 6c 73 6f 20 6b 6e 6f 77 20 74 68 61 74 20 also know that
c3d0: 66 65 74 63 68 69 6e 67 20 74 68 65 20 73 69 7a fetching the siz
c3e0: 65 20 6f 66 20 74 68 65 0a 09 20 2a 20 64 69 63 e of the.. * dic
c3f0: 74 69 6f 6e 61 72 79 20 6f 72 20 69 74 65 72 61 tionary or itera
c400: 74 69 6e 67 20 6f 76 65 72 20 69 74 20 77 69 6c ting over it wil
c410: 6c 20 6e 6f 74 20 66 61 69 6c 2e 0a 09 20 2a 2f l not fail... */
c420: 0a 0a 09 54 63 6c 5f 44 69 63 74 4f 62 6a 53 69 ...Tcl_DictObjSi
c430: 7a 65 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c ze(NULL, objPtr,
c440: 20 26 73 69 7a 65 29 3b 0a 09 6c 69 73 74 52 65 &size);..listRe
c450: 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74 4e 65 pPtr = AttemptNe
c460: 77 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 73 69 wList(interp, si
c470: 7a 65 20 3e 20 30 20 3f 20 32 2a 73 69 7a 65 20 ze > 0 ? 2*size
c480: 3a 20 31 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 : 1, NULL);..if
c490: 28 21 6c 69 73 74 52 65 70 50 74 72 29 20 7b 0a (!listRepPtr) {.
c4a0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
c4b0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 6c 69 73 74 52 ERROR;..}..listR
c4c0: 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 epPtr->elemCount
c4d0: 20 3d 20 32 20 2a 20 73 69 7a 65 3b 0a 0a 09 2f = 2 * size;.../
c4e0: 2a 0a 09 20 2a 20 50 6f 70 75 6c 61 74 65 20 74 *.. * Populate t
c4f0: 68 65 20 6c 69 73 74 20 72 65 70 72 65 73 65 6e he list represen
c500: 74 61 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 65 tation... */...e
c510: 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73 74 52 lemPtrs = &listR
c520: 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 73 3b epPtr->elements;
c530: 0a 09 54 63 6c 5f 44 69 63 74 4f 62 6a 46 69 72 ..Tcl_DictObjFir
c540: 73 74 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c st(NULL, objPtr,
c550: 20 26 73 65 61 72 63 68 2c 20 26 6b 65 79 50 74 &search, &keyPt
c560: 72 2c 20 26 76 61 6c 75 65 50 74 72 2c 20 26 64 r, &valuePtr, &d
c570: 6f 6e 65 29 3b 0a 09 77 68 69 6c 65 20 28 21 64 one);..while (!d
c580: 6f 6e 65 29 20 7b 0a 09 20 20 20 20 2a 65 6c 65 one) {.. *ele
c590: 6d 50 74 72 73 2b 2b 20 3d 20 6b 65 79 50 74 72 mPtrs++ = keyPtr
c5a0: 3b 0a 09 20 20 20 20 2a 65 6c 65 6d 50 74 72 73 ;.. *elemPtrs
c5b0: 2b 2b 20 3d 20 76 61 6c 75 65 50 74 72 3b 0a 09 ++ = valuePtr;..
c5c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
c5d0: 6f 75 6e 74 28 6b 65 79 50 74 72 29 3b 0a 09 20 ount(keyPtr);..
c5e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
c5f0: 75 6e 74 28 76 61 6c 75 65 50 74 72 29 3b 0a 09 unt(valuePtr);..
c600: 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a 4e Tcl_DictObjN
c610: 65 78 74 28 26 73 65 61 72 63 68 2c 20 26 6b 65 ext(&search, &ke
c620: 79 50 74 72 2c 20 26 76 61 6c 75 65 50 74 72 2c yPtr, &valuePtr,
c630: 20 26 64 6f 6e 65 29 3b 0a 09 7d 0a 20 20 20 20 &done);..}.
c640: 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 65 73 } else {..int es
c650: 74 43 6f 75 6e 74 2c 20 6c 65 6e 67 74 68 3b 0a tCount, length;.
c660: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6d .const char *lim
c670: 69 74 2c 20 2a 6e 65 78 74 45 6c 65 6d 20 3d 20 it, *nextElem =
c680: 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f 6d TclGetStringFrom
c690: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 26 6c 65 6e Obj(objPtr, &len
c6a0: 67 74 68 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41 gth);.../*.. * A
c6b0: 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 73 llocate enough s
c6c0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 20 28 pace to hold a (
c6d0: 54 63 6c 5f 4f 62 6a 20 2a 29 20 66 6f 72 20 65 Tcl_Obj *) for e
c6e0: 61 63 68 0a 09 20 2a 20 28 70 6f 73 73 69 62 6c ach.. * (possibl
c6f0: 65 29 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 2e e) list element.
c700: 0a 09 20 2a 2f 0a 0a 09 65 73 74 43 6f 75 6e 74 .. */...estCount
c710: 20 3d 20 54 63 6c 4d 61 78 4c 69 73 74 4c 65 6e = TclMaxListLen
c720: 67 74 68 28 6e 65 78 74 45 6c 65 6d 2c 20 6c 65 gth(nextElem, le
c730: 6e 67 74 68 2c 20 26 6c 69 6d 69 74 29 3b 0a 09 ngth, &limit);..
c740: 65 73 74 43 6f 75 6e 74 20 2b 3d 20 28 65 73 74 estCount += (est
c750: 43 6f 75 6e 74 20 3d 3d 20 30 29 3b 09 2f 2a 20 Count == 0);./*
c760: 53 6d 61 6c 6c 65 73 74 20 6c 69 73 74 20 73 74 Smallest list st
c770: 72 75 63 74 20 68 6f 6c 64 73 20 31 0a 09 09 09 ruct holds 1....
c780: 09 09 20 2a 20 65 6c 65 6d 65 6e 74 2e 20 2a 2f .. * element. */
c790: 0a 09 6c 69 73 74 52 65 70 50 74 72 20 3d 20 41 ..listRepPtr = A
c7a0: 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 69 6e ttemptNewList(in
c7b0: 74 65 72 70 2c 20 65 73 74 43 6f 75 6e 74 2c 20 terp, estCount,
c7c0: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6c 69 73 74 NULL);..if (list
c7d0: 52 65 70 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 RepPtr == NULL)
c7e0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
c7f0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 65 6c 65 L_ERROR;..}..ele
c800: 6d 50 74 72 73 20 3d 20 26 6c 69 73 74 52 65 70 mPtrs = &listRep
c810: 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 73 3b 0a 0a Ptr->elements;..
c820: 09 2f 2a 0a 09 20 2a 20 45 61 63 68 20 69 74 65 ./*.. * Each ite
c830: 72 61 74 69 6f 6e 2c 20 70 61 72 73 65 20 61 6e ration, parse an
c840: 64 20 73 74 6f 72 65 20 61 20 6c 69 73 74 20 65 d store a list e
c850: 6c 65 6d 65 6e 74 2e 0a 09 20 2a 2f 0a 0a 09 77 lement... */...w
c860: 68 69 6c 65 20 28 6e 65 78 74 45 6c 65 6d 20 3c hile (nextElem <
c870: 20 6c 69 6d 69 74 29 20 7b 0a 09 20 20 20 20 63 limit) {.. c
c880: 6f 6e 73 74 20 63 68 61 72 20 2a 65 6c 65 6d 53 onst char *elemS
c890: 74 61 72 74 3b 0a 09 20 20 20 20 69 6e 74 20 65 tart;.. int e
c8a0: 6c 65 6d 53 69 7a 65 2c 20 6c 69 74 65 72 61 6c lemSize, literal
c8b0: 3b 0a 0a 09 20 20 20 20 69 66 20 28 54 43 4c 5f ;... if (TCL_
c8c0: 4f 4b 20 21 3d 20 54 63 6c 46 69 6e 64 45 6c 65 OK != TclFindEle
c8d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6e 65 78 ment(interp, nex
c8e0: 74 45 6c 65 6d 2c 20 6c 69 6d 69 74 20 2d 20 6e tElem, limit - n
c8f0: 65 78 74 45 6c 65 6d 2c 0a 09 09 20 20 20 20 26 extElem,... &
c900: 65 6c 65 6d 53 74 61 72 74 2c 20 26 6e 65 78 74 elemStart, &next
c910: 45 6c 65 6d 2c 20 26 65 6c 65 6d 53 69 7a 65 2c Elem, &elemSize,
c920: 20 26 6c 69 74 65 72 61 6c 29 29 20 7b 0a 09 09 &literal)) {...
c930: 77 68 69 6c 65 20 28 2d 2d 65 6c 65 6d 50 74 72 while (--elemPtr
c940: 73 20 3e 3d 20 26 6c 69 73 74 52 65 70 50 74 72 s >= &listRepPtr
c950: 2d 3e 65 6c 65 6d 65 6e 74 73 29 20 7b 0a 09 09 ->elements) {...
c960: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
c970: 6f 75 6e 74 28 2a 65 6c 65 6d 50 74 72 73 29 3b ount(*elemPtrs);
c980: 0a 09 09 7d 0a 09 09 63 6b 66 72 65 65 28 28 63 ...}...ckfree((c
c990: 68 61 72 20 2a 29 20 6c 69 73 74 52 65 70 50 74 har *) listRepPt
c9a0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c r);...return TCL
c9b0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
c9c0: 20 20 20 20 69 66 20 28 65 6c 65 6d 53 74 61 72 if (elemStar
c9d0: 74 20 3d 3d 20 6c 69 6d 69 74 29 20 7b 0a 09 09 t == limit) {...
c9e0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 0a 09 break;.. }...
c9f0: 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 72 65 70 /* TODO: rep
ca00: 6c 61 63 65 20 70 61 6e 69 63 20 77 69 74 68 20 lace panic with
ca10: 65 72 72 6f 72 20 6f 6e 20 61 6c 6c 6f 63 20 66 error on alloc f
ca20: 61 69 6c 75 72 65 3f 20 2a 2f 0a 09 20 20 20 20 ailure? */..
ca30: 69 66 20 28 6c 69 74 65 72 61 6c 29 20 7b 0a 09 if (literal) {..
ca40: 09 54 63 6c 4e 65 77 53 74 72 69 6e 67 4f 62 6a .TclNewStringObj
ca50: 28 2a 65 6c 65 6d 50 74 72 73 2c 20 65 6c 65 6d (*elemPtrs, elem
ca60: 53 74 61 72 74 2c 20 65 6c 65 6d 53 69 7a 65 29 Start, elemSize)
ca70: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
ca80: 09 09 54 63 6c 4e 65 77 4f 62 6a 28 2a 65 6c 65 ..TclNewObj(*ele
ca90: 6d 50 74 72 73 29 3b 0a 09 09 28 2a 65 6c 65 6d mPtrs);...(*elem
caa0: 50 74 72 73 29 2d 3e 62 79 74 65 73 20 3d 20 63 Ptrs)->bytes = c
cab0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
cac0: 29 20 65 6c 65 6d 53 69 7a 65 20 2b 20 31 29 3b ) elemSize + 1);
cad0: 0a 09 09 28 2a 65 6c 65 6d 50 74 72 73 29 2d 3e ...(*elemPtrs)->
cae0: 6c 65 6e 67 74 68 20 3d 20 54 63 6c 43 6f 70 79 length = TclCopy
caf0: 41 6e 64 43 6f 6c 6c 61 70 73 65 28 65 6c 65 6d AndCollapse(elem
cb00: 53 69 7a 65 2c 20 65 6c 65 6d 53 74 61 72 74 2c Size, elemStart,
cb10: 0a 09 09 09 28 2a 65 6c 65 6d 50 74 72 73 29 2d ....(*elemPtrs)-
cb20: 3e 62 79 74 65 73 29 3b 0a 09 20 20 20 20 7d 0a >bytes);.. }.
cb30: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
cb40: 66 43 6f 75 6e 74 28 2a 65 6c 65 6d 50 74 72 73 fCount(*elemPtrs
cb50: 2b 2b 29 3b 2f 2a 20 53 69 6e 63 65 20 6c 69 73 ++);/* Since lis
cb60: 74 20 6e 6f 77 20 68 6f 6c 64 73 20 72 65 66 20 t now holds ref
cb70: 74 6f 20 69 74 2e 20 2a 2f 0a 09 7d 0a 0a 20 09 to it. */..}.. .
cb80: 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d listRepPtr->elem
cb90: 43 6f 75 6e 74 20 3d 20 65 6c 65 6d 50 74 72 73 Count = elemPtrs
cba0: 20 2d 20 26 6c 69 73 74 52 65 70 50 74 72 2d 3e - &listRepPtr->
cbb0: 65 6c 65 6d 65 6e 74 73 3b 0a 20 20 20 20 7d 0a elements;. }.
cbc0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 . /*. * F
cbd0: 72 65 65 20 74 68 65 20 6f 6c 64 20 69 6e 74 65 ree the old inte
cbe0: 72 6e 61 6c 52 65 70 20 62 65 66 6f 72 65 20 73 rnalRep before s
cbf0: 65 74 74 69 6e 67 20 74 68 65 20 6e 65 77 20 6f etting the new o
cc00: 6e 65 2e 20 57 65 20 64 6f 20 74 68 69 73 20 61 ne. We do this a
cc10: 73 20 6c 61 74 65 0a 20 20 20 20 20 2a 20 61 73 s late. * as
cc20: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 6c 6c possible to all
cc30: 6f 77 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f ow the conversio
cc40: 6e 20 63 6f 64 65 2c 20 69 6e 20 70 61 72 74 69 n code, in parti
cc50: 63 75 6c 61 72 0a 20 20 20 20 20 2a 20 54 63 6c cular. * Tcl
cc60: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
cc70: 6a 2c 20 74 6f 20 75 73 65 20 74 68 61 74 20 6f j, to use that o
cc80: 6c 64 20 69 6e 74 65 72 6e 61 6c 52 65 70 2e 0a ld internalRep..
cc90: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c */.. Tcl
cca0: 46 72 65 65 49 6e 74 52 65 70 28 6f 62 6a 50 74 FreeIntRep(objPt
ccb0: 72 29 3b 0a 20 20 20 20 4c 69 73 74 53 65 74 49 r);. ListSetI
ccc0: 6e 74 52 65 70 28 6f 62 6a 50 74 72 2c 20 6c 69 ntRep(objPtr, li
ccd0: 73 74 52 65 70 50 74 72 29 3b 0a 20 20 20 20 72 stRepPtr);. r
cce0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
ccf0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
cd40: 0a 20 2a 20 55 70 64 61 74 65 53 74 72 69 6e 67 . * UpdateString
cd50: 4f 66 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09 OfList --. *. *.
cd60: 55 70 64 61 74 65 20 74 68 65 20 73 74 72 69 6e Update the strin
cd70: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e g representation
cd80: 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 62 6a 65 for a list obje
cd90: 63 74 2e 0a 20 2a 0a 20 2a 09 41 6e 79 20 70 72 ct.. *. *.Any pr
cda0: 65 76 69 6f 75 73 6c 79 2d 65 78 69 73 69 6e 67 eviously-exising
cdb0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e string represen
cdc0: 74 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e tation is not in
cdd0: 76 61 6c 69 64 61 74 65 64 2c 20 73 6f 0a 20 2a validated, so. *
cde0: 09 73 74 6f 72 61 67 65 20 69 73 20 6c 6f 73 74 .storage is lost
cdf0: 20 69 66 20 74 68 69 73 20 68 61 73 20 6e 6f 74 if this has not
ce00: 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 been taken care
ce10: 20 6f 66 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63 of.. *. * Effec
ce20: 74 0a 20 2a 0a 20 2a 09 54 68 65 20 73 74 72 69 t. *. *.The stri
ce30: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ng representatio
ce40: 6e 20 6f 66 20 27 6c 69 73 74 50 74 72 27 20 69 n of 'listPtr' i
ce50: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 65 73 s set to the res
ce60: 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 2e 0a 20 ulting string..
ce70: 2a 09 54 68 69 73 20 73 74 72 69 6e 67 20 77 69 *.This string wi
ce80: 6c 6c 20 62 65 20 65 6d 70 74 79 20 69 66 20 74 ll be empty if t
ce90: 68 65 20 6c 69 73 74 20 68 61 73 20 6e 6f 20 65 he list has no e
cea0: 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 61 lements. It is a
ceb0: 73 73 75 6d 65 64 0a 20 2a 09 74 68 61 74 20 74 ssumed. *.that t
cec0: 68 65 20 6c 69 73 74 20 69 6e 74 65 72 6e 61 6c he list internal
ced0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
cee0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 2a 0a is not NULL.. *.
cef0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
cf40: 61 74 69 63 20 76 6f 69 64 0a 55 70 64 61 74 65 atic void.Update
cf50: 53 74 72 69 6e 67 4f 66 4c 69 73 74 28 0a 20 20 StringOfList(.
cf60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 Tcl_Obj *listP
cf70: 74 72 29 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a tr)../* List obj
cf80: 65 63 74 20 77 69 74 68 20 73 74 72 69 6e 67 20 ect with string
cf90: 72 65 70 20 74 6f 20 75 70 64 61 74 65 2e 20 2a rep to update. *
cfa0: 2f 0a 7b 0a 23 20 20 20 64 65 66 69 6e 65 20 4c /.{.# define L
cfb0: 4f 43 41 4c 5f 53 49 5a 45 20 36 34 0a 20 20 20 OCAL_SIZE 64.
cfc0: 20 63 68 61 72 20 6c 6f 63 61 6c 46 6c 61 67 73 char localFlags
cfd0: 5b 4c 4f 43 41 4c 5f 53 49 5a 45 5d 2c 20 2a 66 [LOCAL_SIZE], *f
cfe0: 6c 61 67 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 lagPtr = NULL;.
cff0: 20 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 List *listRep
d000: 50 74 72 20 3d 20 4c 69 73 74 52 65 70 50 74 72 Ptr = ListRepPtr
d010: 28 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 69 (listPtr);. i
d020: 6e 74 20 6e 75 6d 45 6c 65 6d 73 20 3d 20 6c 69 nt numElems = li
d030: 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f stRepPtr->elemCo
d040: 75 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 unt;. int i,
d050: 6c 65 6e 67 74 68 2c 20 62 79 74 65 73 4e 65 65 length, bytesNee
d060: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e ded = 0;. con
d070: 73 74 20 63 68 61 72 20 2a 65 6c 65 6d 3b 0a 20 st char *elem;.
d080: 20 20 20 63 68 61 72 20 2a 64 73 74 3b 0a 20 20 char *dst;.
d090: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 65 6c 65 6d Tcl_Obj **elem
d0a0: 50 74 72 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 Ptrs;.. /*.
d0b0: 20 20 20 2a 20 4d 61 72 6b 20 74 68 65 20 6c 69 * Mark the li
d0c0: 73 74 20 61 73 20 62 65 69 6e 67 20 63 61 6e 6f st as being cano
d0d0: 6e 69 63 61 6c 3b 20 61 6c 74 68 6f 75 67 68 20 nical; although
d0e0: 69 74 20 77 69 6c 6c 20 6e 6f 77 20 68 61 76 65 it will now have
d0f0: 20 61 20 73 74 72 69 6e 67 0a 20 20 20 20 20 2a a string. *
d100: 20 72 65 70 2c 20 69 74 20 69 73 20 6f 6e 65 20 rep, it is one
d110: 77 65 20 64 65 72 69 76 65 64 20 74 68 72 6f 75 we derived throu
d120: 67 68 20 70 72 6f 70 65 72 20 22 63 61 6e 6f 6e gh proper "canon
d130: 69 63 61 6c 22 20 71 75 6f 74 69 6e 67 20 61 6e ical" quoting an
d140: 64 20 73 6f 0a 20 20 20 20 20 2a 20 69 74 27 73 d so. * it's
d150: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 72 65 known to be fre
d160: 65 20 66 72 6f 6d 20 6e 61 73 74 69 65 73 20 72 e from nasties r
d170: 65 6c 61 74 69 6e 67 20 74 6f 20 5b 63 6f 6e 63 elating to [conc
d180: 61 74 5d 20 61 6e 64 20 5b 65 76 61 6c 5d 2e 0a at] and [eval]..
d190: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 73 */.. lis
d1a0: 74 52 65 70 50 74 72 2d 3e 63 61 6e 6f 6e 69 63 tRepPtr->canonic
d1b0: 61 6c 46 6c 61 67 20 3d 20 31 3b 0a 0a 20 20 20 alFlag = 1;..
d1c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 48 61 6e 64 6c /*. * Handl
d1d0: 65 20 65 6d 70 74 79 20 6c 69 73 74 20 63 61 73 e empty list cas
d1e0: 65 20 66 69 72 73 74 2c 20 73 6f 20 72 65 73 74 e first, so rest
d1f0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 20 of the routine
d200: 69 73 20 73 69 6d 70 6c 65 72 2e 0a 20 20 20 20 is simpler..
d210: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6e 75 6d */.. if (num
d220: 45 6c 65 6d 73 20 3d 3d 20 30 29 20 7b 0a 09 6c Elems == 0) {..l
d230: 69 73 74 50 74 72 2d 3e 62 79 74 65 73 20 3d 20 istPtr->bytes =
d240: 74 63 6c 45 6d 70 74 79 53 74 72 69 6e 67 52 65 tclEmptyStringRe
d250: 70 3b 0a 09 6c 69 73 74 50 74 72 2d 3e 6c 65 6e p;..listPtr->len
d260: 67 74 68 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e gth = 0;..return
d270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
d280: 20 20 20 20 20 2a 20 50 61 73 73 20 31 3a 20 65 * Pass 1: e
d290: 73 74 69 6d 61 74 65 20 73 70 61 63 65 2c 20 67 stimate space, g
d2a0: 61 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 20 ather flags..
d2b0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6e 75 */.. if (nu
d2c0: 6d 45 6c 65 6d 73 20 3c 3d 20 4c 4f 43 41 4c 5f mElems <= LOCAL_
d2d0: 53 49 5a 45 29 20 7b 0a 09 66 6c 61 67 50 74 72 SIZE) {..flagPtr
d2e0: 20 3d 20 6c 6f 63 61 6c 46 6c 61 67 73 3b 0a 20 = localFlags;.
d2f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a } else {../*.
d300: 09 20 2a 20 57 65 20 6b 6e 6f 77 20 6e 75 6d 45 . * We know numE
d310: 6c 65 6d 73 20 3c 3d 20 4c 49 53 54 5f 4d 41 58 lems <= LIST_MAX
d320: 2c 20 73 6f 20 74 68 69 73 20 69 73 20 73 61 66 , so this is saf
d330: 65 2e 0a 09 20 2a 2f 0a 0a 09 66 6c 61 67 50 74 e... */...flagPt
d340: 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 6e 75 6d 45 r = ckalloc(numE
d350: 6c 65 6d 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 lems);. }.
d360: 20 65 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73 elemPtrs = &lis
d370: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 tRepPtr->element
d380: 73 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 s;. for (i =
d390: 30 3b 20 69 20 3c 20 6e 75 6d 45 6c 65 6d 73 3b 0; i < numElems;
d3a0: 20 69 2b 2b 29 20 7b 0a 09 66 6c 61 67 50 74 72 i++) {..flagPtr
d3b0: 5b 69 5d 20 3d 20 28 69 20 3f 20 54 43 4c 5f 44 [i] = (i ? TCL_D
d3c0: 4f 4e 54 5f 51 55 4f 54 45 5f 48 41 53 48 20 3a ONT_QUOTE_HASH :
d3d0: 20 30 29 3b 0a 09 65 6c 65 6d 20 3d 20 54 63 6c 0);..elem = Tcl
d3e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
d3f0: 28 65 6c 65 6d 50 74 72 73 5b 69 5d 2c 20 26 6c (elemPtrs[i], &l
d400: 65 6e 67 74 68 29 3b 0a 09 62 79 74 65 73 4e 65 ength);..bytesNe
d410: 65 64 65 64 20 2b 3d 20 54 63 6c 53 63 61 6e 45 eded += TclScanE
d420: 6c 65 6d 65 6e 74 28 65 6c 65 6d 2c 20 6c 65 6e lement(elem, len
d430: 67 74 68 2c 20 66 6c 61 67 50 74 72 2b 69 29 3b gth, flagPtr+i);
d440: 0a 09 69 66 20 28 62 79 74 65 73 4e 65 65 64 65 ..if (bytesNeede
d450: 64 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 54 63 d < 0) {.. Tc
d460: 6c 5f 50 61 6e 69 63 28 22 6d 61 78 20 73 69 7a l_Panic("max siz
d470: 65 20 66 6f 72 20 61 20 54 63 6c 20 76 61 6c 75 e for a Tcl valu
d480: 65 20 28 25 64 20 62 79 74 65 73 29 20 65 78 63 e (%d bytes) exc
d490: 65 65 64 65 64 22 2c 20 49 4e 54 5f 4d 41 58 29 eeded", INT_MAX)
d4a0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 ;..}. }. i
d4b0: 66 20 28 62 79 74 65 73 4e 65 65 64 65 64 20 3e f (bytesNeeded >
d4c0: 20 49 4e 54 5f 4d 41 58 20 2d 20 6e 75 6d 45 6c INT_MAX - numEl
d4d0: 65 6d 73 20 2b 20 31 29 20 7b 0a 09 54 63 6c 5f ems + 1) {..Tcl_
d4e0: 50 61 6e 69 63 28 22 6d 61 78 20 73 69 7a 65 20 Panic("max size
d4f0: 66 6f 72 20 61 20 54 63 6c 20 76 61 6c 75 65 20 for a Tcl value
d500: 28 25 64 20 62 79 74 65 73 29 20 65 78 63 65 65 (%d bytes) excee
d510: 64 65 64 22 2c 20 49 4e 54 5f 4d 41 58 29 3b 0a ded", INT_MAX);.
d520: 20 20 20 20 7d 0a 20 20 20 20 62 79 74 65 73 4e }. bytesN
d530: 65 65 64 65 64 20 2b 3d 20 6e 75 6d 45 6c 65 6d eeded += numElem
d540: 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 s;.. /*.
d550: 2a 20 50 61 73 73 20 32 3a 20 63 6f 70 79 20 69 * Pass 2: copy i
d560: 6e 74 6f 20 73 74 72 69 6e 67 20 72 65 70 20 62 nto string rep b
d570: 75 66 66 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a uffer.. */..
d580: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
d590: 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 used to set the
d5a0: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 68 string length h
d5b0: 65 72 65 2c 20 72 65 6c 79 69 6e 67 20 6f 6e 20 ere, relying on
d5c0: 61 20 70 72 65 73 75 6d 65 64 0a 20 20 20 20 20 a presumed.
d5d0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 * guarantee that
d5e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
d5f0: 79 74 65 73 20 54 63 6c 53 63 61 6e 45 6c 65 6d ytes TclScanElem
d600: 65 6e 74 28 29 20 63 61 6c 6c 73 20 72 65 70 6f ent() calls repo
d610: 72 74 65 64 0a 20 20 20 20 20 2a 20 74 6f 20 62 rted. * to b
d620: 65 20 6e 65 65 64 65 64 20 77 61 73 20 61 20 70 e needed was a p
d630: 72 65 63 69 73 65 20 63 6f 75 6e 74 20 61 6e 64 recise count and
d640: 20 6e 6f 74 20 61 6e 20 6f 76 65 72 2d 65 73 74 not an over-est
d650: 69 6d 61 74 65 2c 20 73 6f 20 6c 6f 6e 67 0a 20 imate, so long.
d660: 20 20 20 20 2a 20 61 73 20 74 68 65 20 73 61 6d * as the sam
d670: 65 20 66 6c 61 67 20 76 61 6c 75 65 73 20 77 65 e flag values we
d680: 72 65 20 70 61 73 73 65 64 20 74 6f 20 54 63 6c re passed to Tcl
d690: 43 6f 6e 76 65 72 74 45 6c 65 6d 65 6e 74 28 29 ConvertElement()
d6a0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 .. *. *
d6b0: 54 68 65 6e 20 77 65 20 73 61 77 20 5b 33 35 61 Then we saw [35a
d6c0: 38 66 31 63 30 34 61 5d 2c 20 77 68 65 72 65 20 8f1c04a], where
d6d0: 61 20 62 75 67 20 69 6e 20 54 63 6c 53 63 61 6e a bug in TclScan
d6e0: 45 6c 65 6d 65 6e 74 28 29 20 63 61 75 73 65 64 Element() caused
d6f0: 0a 20 20 20 20 20 2a 20 74 68 61 74 20 67 75 61 . * that gua
d700: 72 61 6e 74 65 65 20 74 6f 20 66 61 69 6c 2e 20 rantee to fail.
d710: 52 61 74 68 65 72 20 74 68 61 6e 20 74 72 75 73 Rather than trus
d720: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d t there are no m
d730: 6f 72 65 20 62 75 67 73 2c 0a 20 20 20 20 20 2a ore bugs,. *
d740: 20 77 65 20 73 65 74 20 74 68 65 20 6c 65 6e 67 we set the leng
d750: 74 68 20 61 66 74 65 72 20 74 68 65 20 6c 6f 6f th after the loo
d760: 70 20 62 61 73 65 64 20 6f 6e 20 77 68 61 74 20 p based on what
d770: 77 61 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 was actually wri
d780: 74 74 65 6e 2c 0a 20 20 20 20 20 2a 20 61 6e 20 tten,. * an
d790: 6e 6f 74 20 6f 6e 20 77 68 61 74 20 77 61 73 20 not on what was
d7a0: 70 72 65 64 69 63 74 65 64 2e 0a 20 20 20 20 20 predicted..
d7b0: 2a 0a 20 20 20 20 6c 69 73 74 50 74 72 2d 3e 6c *. listPtr->l
d7c0: 65 6e 67 74 68 20 3d 20 62 79 74 65 73 4e 65 65 ength = bytesNee
d7d0: 64 65 64 20 2d 20 31 3b 0a 20 20 20 20 20 2a 0a ded - 1;. *.
d7e0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 73 */.. lis
d7f0: 74 50 74 72 2d 3e 62 79 74 65 73 20 3d 20 63 6b tPtr->bytes = ck
d800: 61 6c 6c 6f 63 28 62 79 74 65 73 4e 65 65 64 65 alloc(bytesNeede
d810: 64 29 3b 0a 20 20 20 20 64 73 74 20 3d 20 6c 69 d);. dst = li
d820: 73 74 50 74 72 2d 3e 62 79 74 65 73 3b 0a 20 20 stPtr->bytes;.
d830: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 for (i = 0; i
d840: 3c 20 6e 75 6d 45 6c 65 6d 73 3b 20 69 2b 2b 29 < numElems; i++)
d850: 20 7b 0a 09 66 6c 61 67 50 74 72 5b 69 5d 20 7c {..flagPtr[i] |
d860: 3d 20 28 69 20 3f 20 54 43 4c 5f 44 4f 4e 54 5f = (i ? TCL_DONT_
d870: 51 55 4f 54 45 5f 48 41 53 48 20 3a 20 30 29 3b QUOTE_HASH : 0);
d880: 0a 09 65 6c 65 6d 20 3d 20 54 63 6c 47 65 74 53 ..elem = TclGetS
d890: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 65 6c 65 tringFromObj(ele
d8a0: 6d 50 74 72 73 5b 69 5d 2c 20 26 6c 65 6e 67 74 mPtrs[i], &lengt
d8b0: 68 29 3b 0a 09 64 73 74 20 2b 3d 20 54 63 6c 43 h);..dst += TclC
d8c0: 6f 6e 76 65 72 74 45 6c 65 6d 65 6e 74 28 65 6c onvertElement(el
d8d0: 65 6d 2c 20 6c 65 6e 67 74 68 2c 20 64 73 74 2c em, length, dst,
d8e0: 20 66 6c 61 67 50 74 72 5b 69 5d 29 3b 0a 09 2a flagPtr[i]);..*
d8f0: 64 73 74 2b 2b 20 3d 20 27 20 27 3b 0a 20 20 20 dst++ = ' ';.
d900: 20 7d 0a 20 20 20 20 64 73 74 5b 2d 31 5d 20 3d }. dst[-1] =
d910: 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 48 '\0';.. /* H
d920: 65 72 65 20 69 73 20 74 68 65 20 73 61 66 65 20 ere is the safe
d930: 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 73 setting of the s
d940: 74 72 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f tring length. */
d950: 0a 20 20 20 20 6c 69 73 74 50 74 72 2d 3e 6c 65 . listPtr->le
d960: 6e 67 74 68 20 3d 20 64 73 74 20 2d 20 31 20 2d ngth = dst - 1 -
d970: 20 6c 69 73 74 50 74 72 2d 3e 62 79 74 65 73 3b listPtr->bytes;
d980: 0a 0a 20 20 20 20 69 66 20 28 66 6c 61 67 50 74 .. if (flagPt
d990: 72 20 21 3d 20 6c 6f 63 61 6c 46 6c 61 67 73 29 r != localFlags)
d9a0: 20 7b 0a 09 63 6b 66 72 65 65 28 66 6c 61 67 50 {..ckfree(flagP
d9b0: 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f tr);. }.}.../
d9c0: 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 *. * Local Varia
d9d0: 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 bles:. * mode: c
d9e0: 0a 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 . * c-basic-offs
d9f0: 65 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f et: 4. * fill-co
da00: 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a lumn: 78. * End:
da10: 0a 20 2a 2f 0a . */.