Attachment "tclDictObj.c" to
ticket [654893ffff]
added by
dkf
2003-02-17 21:01:38.
0000: 2f 2a 20 0d 0a 20 2a 20 74 63 6c 44 69 63 74 4f /* .. * tclDictO
0010: 62 6a 2e 63 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 bj.c --.. *.. *.
0020: 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 This file contai
0030: 6e 73 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 ns procedures th
0040: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 at implement the
0050: 20 54 63 6c 20 64 69 63 74 20 6f 62 6a 65 63 74 Tcl dict object
0060: 0d 0a 20 2a 09 74 79 70 65 20 61 6e 64 20 69 74 .. *.type and it
0070: 73 20 61 63 63 65 73 73 6f 72 20 63 6f 6d 6d 61 s accessor comma
0080: 6e 64 2e 0d 0a 20 2a 0d 0a 20 2a 20 43 6f 70 79 nd... *.. * Copy
0090: 72 69 67 68 74 20 28 63 29 20 32 30 30 32 20 62 right (c) 2002 b
00a0: 79 20 44 6f 6e 61 6c 20 4b 2e 20 46 65 6c 6c 6f y Donal K. Fello
00b0: 77 73 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 65 65 20 ws... *.. * See
00c0: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 the file "licens
00d0: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 e.terms" for inf
00e0: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 ormation on usag
00f0: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 e and redistribu
0100: 74 69 6f 6e 0d 0a 20 2a 20 6f 66 20 74 68 69 73 tion.. * of this
0110: 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 file, and for a
0120: 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 DISCLAIMER OF A
0130: 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0d 0a LL WARRANTIES...
0140: 20 2a 0d 0a 20 2a 20 52 43 53 3a 20 40 28 23 29 *.. * RCS: @(#)
0150: 20 24 49 64 24 0d 0a 20 2a 2f 0d 0a 0d 0a 23 69 $Id$.. */....#i
0160: 6e 63 6c 75 64 65 20 22 74 63 6c 49 6e 74 2e 68 nclude "tclInt.h
0170: 22 0d 0a 0d 0a 23 69 66 20 30 0d 0a 2f 2a 0d 0a "....#if 0../*..
0180: 20 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 * Declarations
0190: 74 6f 20 67 6f 20 74 6f 20 74 63 6c 2e 68 0d 0a to go to tcl.h..
01a0: 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 */..typedef str
01b0: 75 63 74 20 7b 0d 0a 20 20 20 20 54 63 6c 5f 48 uct {.. Tcl_H
01c0: 61 73 68 53 65 61 72 63 68 20 73 65 61 72 63 68 ashSearch search
01d0: 3b 0d 0a 20 20 20 20 69 6e 74 20 65 70 6f 63 68 ;.. int epoch
01e0: 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
01f0: 6f 62 6a 50 74 72 3b 0d 0a 20 20 20 20 44 69 63 objPtr;.. Dic
0200: 74 20 2a 64 69 63 74 69 6f 6e 61 72 79 50 74 72 t *dictionaryPtr
0210: 3b 0d 0a 7d 20 54 63 6c 5f 44 69 63 74 53 65 61 ;..} Tcl_DictSea
0220: 72 63 68 3b 0d 0a 2f 2a 0d 0a 20 2a 20 50 72 6f rch;../*.. * Pro
0230: 74 6f 74 79 70 65 73 20 74 6f 20 62 65 20 6d 6f totypes to be mo
0240: 76 65 64 20 74 6f 20 74 63 6c 2e 64 65 63 6c 73 ved to tcl.decls
0250: 2e 2e 2e 0d 0a 20 2a 2f 0d 0a 69 6e 74 20 54 63 ..... */..int Tc
0260: 6c 5f 44 69 63 74 4f 62 6a 50 75 74 28 54 63 6c l_DictObjPut(Tcl
0270: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0280: 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 Tcl_Obj *dictPt
0290: 72 2c 0d 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 r,...Tcl_Obj *ke
02a0: 79 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 76 yPtr, Tcl_Obj *v
02b0: 61 6c 75 65 50 74 72 29 3b 0d 0a 69 6e 74 20 54 aluePtr);..int T
02c0: 63 6c 5f 44 69 63 74 4f 62 6a 47 65 74 28 54 63 cl_DictObjGet(Tc
02d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
02e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 , Tcl_Obj *dictP
02f0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 tr, Tcl_Obj *key
0300: 50 74 72 2c 0d 0a 09 54 63 6c 5f 4f 62 6a 20 2a Ptr,...Tcl_Obj *
0310: 2a 76 61 6c 75 65 50 74 72 50 74 72 29 3b 0d 0a *valuePtrPtr);..
0320: 69 6e 74 20 54 63 6c 5f 44 69 63 74 4f 62 6a 52 int Tcl_DictObjR
0330: 65 6d 6f 76 65 28 54 63 6c 5f 49 6e 74 65 72 70 emove(Tcl_Interp
0340: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 *interp, Tcl_Ob
0350: 6a 20 2a 64 69 63 74 50 74 72 2c 20 54 63 6c 5f j *dictPtr, Tcl_
0360: 4f 62 6a 20 2a 6b 65 79 50 74 72 29 3b 0d 0a 69 Obj *keyPtr);..i
0370: 6e 74 20 54 63 6c 5f 44 69 63 74 4f 62 6a 53 69 nt Tcl_DictObjSi
0380: 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ze(Tcl_Interp *i
0390: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
03a0: 64 69 63 74 50 74 72 2c 20 69 6e 74 20 2a 73 69 dictPtr, int *si
03b0: 7a 65 50 74 72 29 3b 0d 0a 69 6e 74 20 54 63 6c zePtr);..int Tcl
03c0: 5f 44 69 63 74 4f 62 6a 46 69 72 73 74 28 54 63 _DictObjFirst(Tc
03d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
03e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 , Tcl_Obj *dictP
03f0: 74 72 2c 0d 0a 09 54 63 6c 5f 44 69 63 74 53 65 tr,...Tcl_DictSe
0400: 61 72 63 68 20 2a 73 65 61 72 63 68 50 74 72 2c arch *searchPtr,
0410: 0d 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6b 65 79 ...Tcl_Obj **key
0420: 50 74 72 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 PtrPtr, Tcl_Obj
0430: 2a 2a 76 61 6c 75 65 50 74 72 50 74 72 2c 20 69 **valuePtrPtr, i
0440: 6e 74 20 2a 64 6f 6e 65 50 74 72 29 3b 0d 0a 76 nt *donePtr);..v
0450: 6f 69 64 20 54 63 6c 5f 44 69 63 74 4f 62 6a 4e oid Tcl_DictObjN
0460: 65 78 74 28 54 63 6c 5f 44 69 63 74 53 65 61 72 ext(Tcl_DictSear
0470: 63 68 20 2a 73 65 61 72 63 68 50 74 72 2c 0d 0a ch *searchPtr,..
0480: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6b 65 79 50 74 .Tcl_Obj **keyPt
0490: 72 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a rPtr, Tcl_Obj **
04a0: 76 61 6c 75 65 50 74 72 50 74 72 2c 20 69 6e 74 valuePtrPtr, int
04b0: 20 2a 64 6f 6e 65 50 74 72 29 3b 0d 0a 76 6f 69 *donePtr);..voi
04c0: 64 20 54 63 6c 5f 44 69 63 74 4f 62 6a 44 6f 6e d Tcl_DictObjDon
04d0: 65 28 54 63 6c 5f 44 69 63 74 53 65 61 72 63 68 e(Tcl_DictSearch
04e0: 20 2a 73 65 61 72 63 68 50 74 72 29 3b 0d 0a 69 *searchPtr);..i
04f0: 6e 74 20 54 63 6c 5f 44 69 63 74 4f 62 6a 50 75 nt Tcl_DictObjPu
0500: 74 4b 65 79 4c 69 73 74 28 54 63 6c 5f 49 6e 74 tKeyList(Tcl_Int
0510: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c erp *interp, Tcl
0520: 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 2c 0d 0a _Obj *dictPtr,..
0530: 09 69 6e 74 20 6b 65 79 63 2c 20 54 63 6c 5f 4f .int keyc, Tcl_O
0540: 62 6a 20 2a 43 4f 4e 53 54 20 2a 6b 65 79 76 2c bj *CONST *keyv,
0550: 20 54 63 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 50 Tcl_Obj *valueP
0560: 74 72 29 3b 0d 0a 69 6e 74 20 54 63 6c 5f 44 69 tr);..int Tcl_Di
0570: 63 74 4f 62 6a 52 65 6d 6f 76 65 4b 65 79 4c 69 ctObjRemoveKeyLi
0580: 73 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 st(Tcl_Interp *i
0590: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
05a0: 64 69 63 74 50 74 72 2c 0d 0a 09 69 6e 74 20 6b dictPtr,...int k
05b0: 65 79 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f eyc, Tcl_Obj *CO
05c0: 4e 53 54 20 2a 6b 65 79 76 29 3b 0d 0a 54 63 6c NST *keyv);..Tcl
05d0: 5f 4f 62 6a 20 2a 54 63 6c 5f 4e 65 77 44 69 63 _Obj *Tcl_NewDic
05e0: 74 4f 62 6a 28 76 6f 69 64 29 3b 0d 0a 54 63 6c tObj(void);..Tcl
05f0: 5f 4f 62 6a 20 2a 54 63 6c 5f 44 62 4e 65 77 44 _Obj *Tcl_DbNewD
0600: 69 63 74 4f 62 6a 28 43 4f 4e 53 54 20 63 68 61 ictObj(CONST cha
0610: 72 20 2a 66 69 6c 65 2c 20 69 6e 74 20 6c 69 6e r *file, int lin
0620: 65 29 3b 0d 0a 2f 2a 0d 0a 20 2a 20 50 72 6f 74 e);../*.. * Prot
0630: 6f 74 79 70 65 73 20 74 6f 20 62 65 20 6d 6f 76 otypes to be mov
0640: 65 64 20 74 6f 20 74 63 6c 49 6e 74 2e 68 0d 0a ed to tclInt.h..
0650: 20 2a 2f 0d 0a 69 6e 74 20 54 63 6c 5f 44 69 63 */..int Tcl_Dic
0660: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
0670: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
0680: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0690: 70 2c 0d 0a 09 69 6e 74 20 6f 62 6a 63 2c 20 54 p,...int objc, T
06a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f cl_Obj *CONST *o
06b0: 62 6a 76 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0c bjv);..#endif...
06c0: 0d 0a 2f 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 2f 0d 0a 0d 0a ----------*/....
0710: 2f 2a 0d 0a 20 2a 20 50 72 6f 74 6f 74 79 70 65 /*.. * Prototype
0720: 73 20 66 6f 72 20 70 72 6f 63 65 64 75 72 65 73 s for procedures
0730: 20 64 65 66 69 6e 65 64 20 6c 61 74 65 72 20 69 defined later i
0740: 6e 20 74 68 69 73 20 66 69 6c 65 3a 0d 0a 20 2a n this file:.. *
0750: 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 09 /....static int.
0760: 09 44 69 63 74 41 70 70 65 6e 64 43 6d 64 20 5f .DictAppendCmd _
0770: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f ANSI_ARGS_((Tcl_
0780: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d Interp *interp,.
0790: 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 6a 63 .... int objc
07a0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
07b0: 20 2a 6f 62 6a 76 29 29 3b 0d 0a 73 74 61 74 69 *objv));..stati
07c0: 63 20 69 6e 74 09 09 44 69 63 74 43 72 65 61 74 c int..DictCreat
07d0: 65 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f eCmd _ANSI_ARGS_
07e0: 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e ((Tcl_Interp *in
07f0: 74 65 72 70 2c 0d 0a 09 09 09 20 20 20 20 69 6e terp,..... in
0800: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0810: 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 29 29 3b 0d *CONST *objv));.
0820: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 44 69 63 .static int..Dic
0830: 74 45 78 69 73 74 73 43 6d 64 20 5f 41 4e 53 49 tExistsCmd _ANSI
0840: 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 _ARGS_((Tcl_Inte
0850: 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 09 09 09 rp *interp,.....
0860: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 int objc, Tc
0870: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 l_Obj *CONST *ob
0880: 6a 76 29 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e jv));..static in
0890: 74 09 09 44 69 63 74 46 69 6c 74 65 72 43 6d 64 t..DictFilterCmd
08a0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 _ANSI_ARGS_((Tc
08b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
08c0: 2c 0d 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 ,..... int ob
08d0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e jc, Tcl_Obj *CON
08e0: 53 54 20 2a 6f 62 6a 76 29 29 3b 0d 0a 73 74 61 ST *objv));..sta
08f0: 74 69 63 20 69 6e 74 09 09 44 69 63 74 46 6f 72 tic int..DictFor
0900: 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 Cmd _ANSI_ARGS_(
0910: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
0920: 65 72 70 2c 0d 0a 09 09 09 20 20 20 20 69 6e 74 erp,..... int
0930: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
0940: 43 4f 4e 53 54 20 2a 6f 62 6a 76 29 29 3b 0d 0a CONST *objv));..
0950: 73 74 61 74 69 63 20 69 6e 74 09 09 44 69 63 74 static int..Dict
0960: 47 65 74 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 GetCmd _ANSI_ARG
0970: 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a S_((Tcl_Interp *
0980: 69 6e 74 65 72 70 2c 0d 0a 09 09 09 20 20 20 20 interp,.....
0990: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
09a0: 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 29 29 j *CONST *objv))
09b0: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 09 09 44 ;..static int..D
09c0: 69 63 74 49 6e 63 72 43 6d 64 20 5f 41 4e 53 49 ictIncrCmd _ANSI
09d0: 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 _ARGS_((Tcl_Inte
09e0: 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 09 09 09 rp *interp,.....
09f0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 int objc, Tc
0a00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 l_Obj *CONST *ob
0a10: 6a 76 29 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e jv));..static in
0a20: 74 09 09 44 69 63 74 49 6e 66 6f 43 6d 64 20 5f t..DictInfoCmd _
0a30: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f ANSI_ARGS_((Tcl_
0a40: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d Interp *interp,.
0a50: 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 6a 63 .... int objc
0a60: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
0a70: 20 2a 6f 62 6a 76 29 29 3b 0d 0a 73 74 61 74 69 *objv));..stati
0a80: 63 20 69 6e 74 09 09 44 69 63 74 4b 65 79 73 43 c int..DictKeysC
0a90: 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 md _ANSI_ARGS_((
0aa0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0ab0: 72 70 2c 0d 0a 09 09 09 20 20 20 20 69 6e 74 20 rp,..... int
0ac0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 objc, Tcl_Obj *C
0ad0: 4f 4e 53 54 20 2a 6f 62 6a 76 29 29 3b 0d 0a 73 ONST *objv));..s
0ae0: 74 61 74 69 63 20 69 6e 74 09 09 44 69 63 74 4c tatic int..DictL
0af0: 61 70 70 65 6e 64 43 6d 64 20 5f 41 4e 53 49 5f appendCmd _ANSI_
0b00: 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 ARGS_((Tcl_Inter
0b10: 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 09 09 09 20 p *interp,.....
0b20: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c int objc, Tcl
0b30: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a _Obj *CONST *obj
0b40: 76 29 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 v));..static int
0b50: 09 09 44 69 63 74 52 65 6d 6f 76 65 43 6d 64 20 ..DictRemoveCmd
0b60: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c _ANSI_ARGS_((Tcl
0b70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0b80: 0d 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 6a ..... int obj
0b90: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 c, Tcl_Obj *CONS
0ba0: 54 20 2a 6f 62 6a 76 29 29 3b 0d 0a 73 74 61 74 T *objv));..stat
0bb0: 69 63 20 69 6e 74 09 09 44 69 63 74 52 65 70 6c ic int..DictRepl
0bc0: 61 63 65 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 aceCmd _ANSI_ARG
0bd0: 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a S_((Tcl_Interp *
0be0: 69 6e 74 65 72 70 2c 0d 0a 09 09 09 20 20 20 20 interp,.....
0bf0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
0c00: 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 29 29 j *CONST *objv))
0c10: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 09 09 44 ;..static int..D
0c20: 69 63 74 53 65 74 43 6d 64 20 5f 41 4e 53 49 5f ictSetCmd _ANSI_
0c30: 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 ARGS_((Tcl_Inter
0c40: 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 09 09 09 20 p *interp,.....
0c50: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c int objc, Tcl
0c60: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a _Obj *CONST *obj
0c70: 76 29 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 v));..static int
0c80: 09 09 44 69 63 74 53 69 7a 65 43 6d 64 20 5f 41 ..DictSizeCmd _A
0c90: 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 NSI_ARGS_((Tcl_I
0ca0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a nterp *interp,..
0cb0: 09 09 09 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c ... int objc,
0cc0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
0cd0: 2a 6f 62 6a 76 29 29 3b 0d 0a 73 74 61 74 69 63 *objv));..static
0ce0: 20 69 6e 74 09 09 44 69 63 74 55 6e 73 65 74 43 int..DictUnsetC
0cf0: 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 md _ANSI_ARGS_((
0d00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0d10: 72 70 2c 0d 0a 09 09 09 20 20 20 20 69 6e 74 20 rp,..... int
0d20: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 objc, Tcl_Obj *C
0d30: 4f 4e 53 54 20 2a 6f 62 6a 76 29 29 3b 0d 0a 73 ONST *objv));..s
0d40: 74 61 74 69 63 20 69 6e 74 09 09 44 69 63 74 56 tatic int..DictV
0d50: 61 6c 75 65 73 43 6d 64 20 5f 41 4e 53 49 5f 41 aluesCmd _ANSI_A
0d60: 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 RGS_((Tcl_Interp
0d70: 20 2a 69 6e 74 65 72 70 2c 0d 0a 09 09 09 20 20 *interp,.....
0d80: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f int objc, Tcl_
0d90: 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 Obj *CONST *objv
0da0: 29 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 ));..static void
0db0: 09 09 44 75 70 44 69 63 74 49 6e 74 65 72 6e 61 ..DupDictInterna
0dc0: 6c 52 65 70 20 5f 41 4e 53 49 5f 41 52 47 53 5f lRep _ANSI_ARGS_
0dd0: 28 28 54 63 6c 5f 4f 62 6a 20 2a 73 72 63 50 74 ((Tcl_Obj *srcPt
0de0: 72 2c 0d 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f r,..... Tcl_O
0df0: 62 6a 20 2a 63 6f 70 79 50 74 72 29 29 3b 0d 0a bj *copyPtr));..
0e00: 73 74 61 74 69 63 20 76 6f 69 64 09 09 46 72 65 static void..Fre
0e10: 65 44 69 63 74 49 6e 74 65 72 6e 61 6c 52 65 70 eDictInternalRep
0e20: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 _ANSI_ARGS_((Tc
0e30: 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 29 29 l_Obj *dictPtr))
0e40: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 09 09 53 ;..static int..S
0e50: 65 74 44 69 63 74 46 72 6f 6d 41 6e 79 20 5f 41 etDictFromAny _A
0e60: 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 NSI_ARGS_((Tcl_I
0e70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a nterp *interp,..
0e80: 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ... Tcl_Obj *
0e90: 6f 62 6a 50 74 72 29 29 3b 0d 0a 73 74 61 74 69 objPtr));..stati
0ea0: 63 20 76 6f 69 64 09 09 55 70 64 61 74 65 53 74 c void..UpdateSt
0eb0: 72 69 6e 67 4f 66 44 69 63 74 20 5f 41 4e 53 49 ringOfDict _ANSI
0ec0: 5f 41 52 47 53 5f 28 28 54 63 6c 5f 4f 62 6a 20 _ARGS_((Tcl_Obj
0ed0: 2a 64 69 63 74 50 74 72 29 29 3b 0d 0a 73 74 61 *dictPtr));..sta
0ee0: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 09 54 72 tic Tcl_Obj *.Tr
0ef0: 61 63 65 44 69 63 74 50 61 74 68 20 5f 41 4e 53 aceDictPath _ANS
0f00: 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 I_ARGS_((Tcl_Int
0f10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 09 09 erp *interp,....
0f20: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 6f . Tcl_Obj *ro
0f30: 6f 74 50 74 72 2c 20 69 6e 74 20 6b 65 79 63 2c otPtr, int keyc,
0f40: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
0f50: 6b 65 79 76 5b 5d 2c 0d 0a 09 09 09 20 20 20 20 keyv[],.....
0f60: 69 6e 74 20 77 69 6c 6c 55 70 64 61 74 65 29 29 int willUpdate))
0f70: 3b 0d 0a 73 74 72 75 63 74 20 44 69 63 74 3b 0d ;..struct Dict;.
0f80: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 44 65 .static void..De
0f90: 6c 65 74 65 44 69 63 74 20 5f 41 4e 53 49 5f 41 leteDict _ANSI_A
0fa0: 52 47 53 5f 28 28 73 74 72 75 63 74 20 44 69 63 RGS_((struct Dic
0fb0: 74 20 2a 64 69 63 74 29 29 3b 0d 0a 0d 0a 2f 2a t *dict));..../*
0fc0: 0d 0a 20 2a 20 49 6e 74 65 72 6e 61 6c 20 72 65 .. * Internal re
0fd0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 presentation of
0fe0: 61 20 64 69 63 74 69 6f 6e 61 72 79 2e 0d 0a 20 a dictionary...
0ff0: 2a 0d 0a 20 2a 20 54 68 65 20 69 6e 74 65 72 6e *.. * The intern
1000: 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f al representatio
1010: 6e 20 6f 66 20 61 20 64 69 63 74 69 6f 6e 61 72 n of a dictionar
1020: 79 20 6f 62 6a 65 63 74 20 69 73 20 61 20 68 61 y object is a ha
1030: 73 68 20 74 61 62 6c 65 0d 0a 20 2a 20 28 77 69 sh table.. * (wi
1040: 74 68 20 54 63 6c 5f 4f 62 6a 73 20 66 6f 72 20 th Tcl_Objs for
1050: 62 6f 74 68 20 6b 65 79 73 20 61 6e 64 20 76 61 both keys and va
1060: 6c 75 65 73 29 2c 20 61 20 72 65 66 65 72 65 6e lues), a referen
1070: 63 65 20 63 6f 75 6e 74 20 61 6e 64 0d 0a 20 2a ce count and.. *
1080: 20 65 70 6f 63 68 20 6e 75 6d 62 65 72 20 66 6f epoch number fo
1090: 72 20 64 65 74 65 63 74 69 6e 67 20 63 6f 6e 63 r detecting conc
10a0: 75 72 72 65 6e 74 20 6d 6f 64 69 66 69 63 61 74 urrent modificat
10b0: 69 6f 6e 73 20 6f 66 20 74 68 65 0d 0a 20 2a 20 ions of the.. *
10c0: 64 69 63 74 69 6f 6e 61 72 79 2c 20 61 6e 64 20 dictionary, and
10d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
10e0: 20 70 61 72 65 6e 74 20 6f 62 6a 65 63 74 20 28 parent object (
10f0: 75 73 65 64 20 77 68 65 6e 0d 0a 20 2a 20 69 6e used when.. * in
1100: 76 61 6c 69 64 61 74 69 6e 67 20 73 74 72 69 6e validating strin
1110: 67 20 72 65 70 73 20 6f 66 20 70 61 74 68 65 64 g reps of pathed
1120: 20 64 69 63 74 69 6f 6e 61 72 79 20 74 72 65 65 dictionary tree
1130: 73 29 20 77 68 69 63 68 20 69 73 20 4e 55 4c 4c s) which is NULL
1140: 0d 0a 20 2a 20 69 6e 20 6e 6f 72 6d 61 6c 20 75 .. * in normal u
1150: 73 65 2e 20 20 54 68 65 20 66 61 63 74 20 74 68 se. The fact th
1160: 61 74 20 68 61 73 68 20 74 61 62 6c 65 73 20 6b at hash tables k
1170: 6e 6f 77 20 28 77 69 74 68 20 61 70 70 72 6f 70 now (with approp
1180: 72 69 61 74 65 0d 0a 20 2a 20 69 6e 69 74 69 61 riate.. * initia
1190: 6c 69 73 61 74 69 6f 6e 29 20 61 6c 72 65 61 64 lisation) alread
11a0: 79 20 61 62 6f 75 74 20 6f 62 6a 65 63 74 73 20 y about objects
11b0: 6d 61 6b 65 73 20 6b 65 79 20 6d 61 6e 61 67 65 makes key manage
11c0: 6d 65 6e 74 20 2f 73 6f 2f 0d 0a 20 2a 20 6d 75 ment /so/.. * mu
11d0: 63 68 20 65 61 73 69 65 72 21 0d 0a 20 2a 0d 0a ch easier!.. *..
11e0: 20 2a 20 52 65 66 65 72 65 6e 63 65 20 63 6f 75 * Reference cou
11f0: 6e 74 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 nts are used to
1200: 65 6e 61 62 6c 65 20 73 61 66 65 20 69 74 65 72 enable safe iter
1210: 61 74 69 6f 6e 20 61 63 72 6f 73 73 20 68 61 73 ation across has
1220: 68 65 73 0d 0a 20 2a 20 77 68 69 6c 65 20 61 6c hes.. * while al
1230: 6c 6f 77 69 6e 67 20 74 68 65 20 74 79 70 65 20 lowing the type
1240: 6f 66 20 74 68 65 20 63 6f 6e 74 61 69 6e 69 6e of the containin
1250: 67 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 6d g object to be m
1260: 6f 64 69 66 69 65 64 2e 0d 0a 20 2a 2f 0d 0a 0d odified... */...
1270: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
1280: 44 69 63 74 20 7b 0d 0a 20 20 20 20 54 63 6c 5f Dict {.. Tcl_
1290: 48 61 73 68 54 61 62 6c 65 20 74 61 62 6c 65 3b HashTable table;
12a0: 0d 0a 20 20 20 20 69 6e 74 20 65 70 6f 63 68 3b .. int epoch;
12b0: 0d 0a 20 20 20 20 69 6e 74 20 72 65 66 63 6f 75 .. int refcou
12c0: 6e 74 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a nt;.. Tcl_Obj
12d0: 20 2a 63 68 61 69 6e 3b 0d 0a 7d 20 44 69 63 74 *chain;..} Dict
12e0: 3b 0d 0a 0d 0a 2f 2a 0d 0a 20 2a 20 54 68 65 20 ;..../*.. * The
12f0: 73 74 72 75 63 74 75 72 65 20 62 65 6c 6f 77 20 structure below
1300: 64 65 66 69 6e 65 73 20 74 68 65 20 64 69 63 74 defines the dict
1310: 69 6f 6e 61 72 79 20 6f 62 6a 65 63 74 20 74 79 ionary object ty
1320: 70 65 20 62 79 20 6d 65 61 6e 73 20 6f 66 0d 0a pe by means of..
1330: 20 2a 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 * procedures th
1340: 61 74 20 63 61 6e 20 62 65 20 69 6e 76 6f 6b 65 at can be invoke
1350: 64 20 62 79 20 67 65 6e 65 72 69 63 20 6f 62 6a d by generic obj
1360: 65 63 74 20 63 6f 64 65 2e 0d 0a 20 2a 2f 0d 0a ect code... */..
1370: 0d 0a 54 63 6c 5f 4f 62 6a 54 79 70 65 20 74 63 ..Tcl_ObjType tc
1380: 6c 44 69 63 74 54 79 70 65 20 3d 20 7b 0d 0a 20 lDictType = {..
1390: 20 20 20 22 68 61 73 68 44 69 63 74 69 6f 6e 61 "hashDictiona
13a0: 72 79 22 2c 0d 0a 20 20 20 20 46 72 65 65 44 69 ry",.. FreeDi
13b0: 63 74 49 6e 74 65 72 6e 61 6c 52 65 70 2c 09 09 ctInternalRep,..
13c0: 2f 2a 20 66 72 65 65 49 6e 74 52 65 70 50 72 6f /* freeIntRepPro
13d0: 63 20 2a 2f 0d 0a 20 20 20 20 44 75 70 44 69 63 c */.. DupDic
13e0: 74 49 6e 74 65 72 6e 61 6c 52 65 70 2c 09 09 20 tInternalRep,..
13f0: 20 20 20 20 20 20 20 2f 2a 20 64 75 70 49 6e 74 /* dupInt
1400: 52 65 70 50 72 6f 63 20 2a 2f 0d 0a 20 20 20 20 RepProc */..
1410: 55 70 64 61 74 65 53 74 72 69 6e 67 4f 66 44 69 UpdateStringOfDi
1420: 63 74 2c 09 09 09 2f 2a 20 75 70 64 61 74 65 53 ct,.../* updateS
1430: 74 72 69 6e 67 50 72 6f 63 20 2a 2f 0d 0a 20 20 tringProc */..
1440: 20 20 53 65 74 44 69 63 74 46 72 6f 6d 41 6e 79 SetDictFromAny
1450: 09 09 09 2f 2a 20 73 65 74 46 72 6f 6d 41 6e 79 .../* setFromAny
1460: 50 72 6f 63 20 2a 2f 0d 0a 7d 3b 0d 0a 0c 0d 0a Proc */..};.....
1470: 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*.. *----------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a ------------.. *
14c0: 0d 0a 20 2a 20 44 75 70 44 69 63 74 49 6e 74 65 .. * DupDictInte
14d0: 72 6e 61 6c 52 65 70 20 2d 2d 0d 0a 20 2a 0d 0a rnalRep --.. *..
14e0: 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 *.Initialize th
14f0: 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 e internal repre
1500: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 64 sentation of a d
1510: 69 63 74 69 6f 6e 61 72 79 20 54 63 6c 5f 4f 62 ictionary Tcl_Ob
1520: 6a 0d 0a 20 2a 09 74 6f 20 61 20 63 6f 70 79 20 j.. *.to a copy
1530: 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 of the internal
1540: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f representation o
1550: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 0d 0a 20 f an existing..
1560: 2a 09 64 69 63 74 69 6f 6e 61 72 79 20 6f 62 6a *.dictionary obj
1570: 65 63 74 2e 20 0d 0a 20 2a 0d 0a 20 2a 20 52 65 ect. .. *.. * Re
1580: 73 75 6c 74 73 3a 0d 0a 20 2a 09 4e 6f 6e 65 2e sults:.. *.None.
1590: 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 .. *.. * Side ef
15a0: 66 65 63 74 73 3a 0d 0a 20 2a 09 22 73 72 63 50 fects:.. *."srcP
15b0: 74 72 22 73 20 64 69 63 74 69 6f 6e 61 72 79 20 tr"s dictionary
15c0: 69 6e 74 65 72 6e 61 6c 20 72 65 70 20 70 6f 69 internal rep poi
15d0: 6e 74 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 nter should not
15e0: 62 65 20 4e 55 4c 4c 20 61 6e 64 0d 0a 20 2a 09 be NULL and.. *.
15f0: 77 65 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 we assume it is
1600: 6e 6f 74 20 4e 55 4c 4c 2e 20 57 65 20 73 65 74 not NULL. We set
1610: 20 22 63 6f 70 79 50 74 72 22 73 20 69 6e 74 65 "copyPtr"s inte
1620: 72 6e 61 6c 20 72 65 70 20 74 6f 20 61 0d 0a 20 rnal rep to a..
1630: 2a 09 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e *.pointer to a n
1640: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 64 ewly allocated d
1650: 69 63 74 69 6f 6e 61 72 79 20 72 65 70 20 74 68 ictionary rep th
1660: 61 74 2c 20 69 6e 20 74 75 72 6e 2c 20 70 6f 69 at, in turn, poi
1670: 6e 74 73 0d 0a 20 2a 09 74 6f 20 22 73 72 63 50 nts.. *.to "srcP
1680: 74 72 22 73 20 6b 65 79 20 61 6e 64 20 76 61 6c tr"s key and val
1690: 75 65 20 6f 62 6a 65 63 74 73 2e 20 54 68 6f 73 ue objects. Thos
16a0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 6e 6f e objects are no
16b0: 74 0d 0a 20 2a 09 61 63 74 75 61 6c 6c 79 20 63 t.. *.actually c
16c0: 6f 70 69 65 64 20 62 75 74 20 61 72 65 20 73 68 opied but are sh
16d0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 22 73 72 ared between "sr
16e0: 63 50 74 72 22 20 61 6e 64 20 22 63 6f 70 79 50 cPtr" and "copyP
16f0: 74 72 22 2e 0d 0a 20 2a 09 54 68 65 20 72 65 66 tr"... *.The ref
1700: 20 63 6f 75 6e 74 20 6f 66 20 65 61 63 68 20 6b count of each k
1710: 65 79 20 61 6e 64 20 76 61 6c 75 65 20 6f 62 6a ey and value obj
1720: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 ect is increment
1730: 65 64 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d ed... *.. *-----
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 -.. */....static
1790: 20 76 6f 69 64 0d 0a 44 75 70 44 69 63 74 49 6e void..DupDictIn
17a0: 74 65 72 6e 61 6c 52 65 70 28 73 72 63 50 74 72 ternalRep(srcPtr
17b0: 2c 20 63 6f 70 79 50 74 72 29 0d 0a 20 20 20 20 , copyPtr)..
17c0: 54 63 6c 5f 4f 62 6a 20 2a 73 72 63 50 74 72 2c Tcl_Obj *srcPtr,
17d0: 20 2a 63 6f 70 79 50 74 72 3b 0d 0a 7b 0d 0a 20 *copyPtr;..{..
17e0: 20 20 20 44 69 63 74 20 2a 6f 6c 64 44 69 63 74 Dict *oldDict
17f0: 20 3d 20 28 44 69 63 74 20 2a 29 20 73 72 63 50 = (Dict *) srcP
1800: 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e tr->internalRep.
1810: 6f 74 68 65 72 56 61 6c 75 65 50 74 72 3b 0d 0a otherValuePtr;..
1820: 20 20 20 20 44 69 63 74 20 2a 6e 65 77 44 69 63 Dict *newDic
1830: 74 20 3d 20 28 44 69 63 74 20 2a 29 20 63 6b 61 t = (Dict *) cka
1840: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 69 63 74 lloc(sizeof(Dict
1850: 29 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 48 61 73 ));.. Tcl_Has
1860: 68 45 6e 74 72 79 20 2a 68 50 74 72 2c 20 2a 6e hEntry *hPtr, *n
1870: 65 77 48 50 74 72 3b 0d 0a 20 20 20 20 54 63 6c ewHPtr;.. Tcl
1880: 5f 48 61 73 68 53 65 61 72 63 68 20 73 65 61 72 _HashSearch sear
1890: 63 68 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ch;.. Tcl_Obj
18a0: 20 2a 6b 65 79 50 74 72 2c 20 2a 76 61 6c 75 65 *keyPtr, *value
18b0: 50 74 72 3b 0d 0a 20 20 20 20 69 6e 74 20 69 73 Ptr;.. int is
18c0: 4e 65 77 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a New;.... /*..
18d0: 20 20 20 20 20 2a 20 43 6f 70 79 20 76 61 6c 75 * Copy valu
18e0: 65 73 20 61 63 72 6f 73 73 20 66 72 6f 6d 20 74 es across from t
18f0: 68 65 20 6f 6c 64 20 68 61 73 68 20 74 61 62 6c he old hash tabl
1900: 65 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a 20 20 20 e... */..
1910: 20 54 63 6c 5f 49 6e 69 74 4f 62 6a 48 61 73 68 Tcl_InitObjHash
1920: 54 61 62 6c 65 28 26 6e 65 77 44 69 63 74 2d 3e Table(&newDict->
1930: 74 61 62 6c 65 29 3b 0d 0a 20 20 20 20 66 6f 72 table);.. for
1940: 20 28 68 50 74 72 3d 54 63 6c 5f 46 69 72 73 74 (hPtr=Tcl_First
1950: 48 61 73 68 45 6e 74 72 79 28 26 6f 6c 64 44 69 HashEntry(&oldDi
1960: 63 74 2d 3e 74 61 62 6c 65 2c 26 73 65 61 72 63 ct->table,&searc
1970: 68 29 3b 20 68 50 74 72 21 3d 4e 55 4c 4c 3b 0d h); hPtr!=NULL;.
1980: 0a 09 20 20 20 20 68 50 74 72 3d 54 63 6c 5f 4e .. hPtr=Tcl_N
1990: 65 78 74 48 61 73 68 45 6e 74 72 79 28 26 73 65 extHashEntry(&se
19a0: 61 72 63 68 29 29 20 7b 0d 0a 09 6b 65 79 50 74 arch)) {...keyPt
19b0: 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 r = (Tcl_Obj *)
19c0: 54 63 6c 5f 47 65 74 48 61 73 68 4b 65 79 28 26 Tcl_GetHashKey(&
19d0: 6f 6c 64 44 69 63 74 2d 3e 74 61 62 6c 65 2c 20 oldDict->table,
19e0: 68 50 74 72 29 3b 0d 0a 09 76 61 6c 75 65 50 74 hPtr);...valuePt
19f0: 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 r = (Tcl_Obj *)
1a00: 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 Tcl_GetHashValue
1a10: 28 68 50 74 72 29 3b 0d 0a 09 6e 65 77 48 50 74 (hPtr);...newHPt
1a20: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 r = Tcl_CreateHa
1a30: 73 68 45 6e 74 72 79 28 26 6e 65 77 44 69 63 74 shEntry(&newDict
1a40: 2d 3e 74 61 62 6c 65 2c 20 28 63 68 61 72 20 2a ->table, (char *
1a50: 29 6b 65 79 50 74 72 2c 20 26 69 73 4e 65 77 29 )keyPtr, &isNew)
1a60: 3b 0d 0a 09 54 63 6c 5f 53 65 74 48 61 73 68 56 ;...Tcl_SetHashV
1a70: 61 6c 75 65 28 6e 65 77 48 50 74 72 2c 20 28 43 alue(newHPtr, (C
1a80: 6c 69 65 6e 74 44 61 74 61 29 76 61 6c 75 65 50 lientData)valueP
1a90: 74 72 29 3b 0d 0a 09 54 63 6c 5f 49 6e 63 72 52 tr);...Tcl_IncrR
1aa0: 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 50 74 72 efCount(valuePtr
1ab0: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 );.. }....
1ac0: 20 2f 2a 0d 0a 20 20 20 20 20 2a 20 49 6e 69 74 /*.. * Init
1ad0: 69 61 6c 69 73 65 20 6f 74 68 65 72 20 66 69 65 ialise other fie
1ae0: 6c 64 73 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a 20 lds... */..
1af0: 20 20 20 6e 65 77 44 69 63 74 2d 3e 65 70 6f 63 newDict->epoc
1b00: 68 20 3d 20 30 3b 0d 0a 20 20 20 20 6e 65 77 44 h = 0;.. newD
1b10: 69 63 74 2d 3e 63 68 61 69 6e 20 3d 20 4e 55 4c ict->chain = NUL
1b20: 4c 3b 0d 0a 20 20 20 20 6e 65 77 44 69 63 74 2d L;.. newDict-
1b30: 3e 72 65 66 63 6f 75 6e 74 20 3d 20 31 3b 0d 0a >refcount = 1;..
1b40: 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 2a .. /*.. *
1b50: 20 53 74 6f 72 65 20 69 6e 20 74 68 65 20 6f 62 Store in the ob
1b60: 6a 65 63 74 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a ject... */..
1b70: 20 20 20 20 63 6f 70 79 50 74 72 2d 3e 69 6e 74 copyPtr->int
1b80: 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 61 ernalRep.otherVa
1b90: 6c 75 65 50 74 72 20 3d 20 28 56 4f 49 44 20 2a luePtr = (VOID *
1ba0: 29 20 6e 65 77 44 69 63 74 3b 0d 0a 20 20 20 20 ) newDict;..
1bb0: 63 6f 70 79 50 74 72 2d 3e 74 79 70 65 50 74 72 copyPtr->typePtr
1bc0: 20 3d 20 26 74 63 6c 44 69 63 74 54 79 70 65 3b = &tclDictType;
1bd0: 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d ..}...../*.. *--
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c20: 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 46 72 65 ----.. *.. * Fre
1c30: 65 44 69 63 74 49 6e 74 65 72 6e 61 6c 52 65 70 eDictInternalRep
1c40: 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 44 65 61 6c --.. *.. *.Deal
1c50: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 6f 72 61 locate the stora
1c60: 67 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ge associated wi
1c70: 74 68 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 th a dictionary
1c80: 6f 62 6a 65 63 74 27 73 0d 0a 20 2a 09 69 6e 74 object's.. *.int
1c90: 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 ernal representa
1ca0: 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 tion... *.. * Re
1cb0: 73 75 6c 74 73 3a 0d 0a 20 2a 09 4e 6f 6e 65 0d sults:.. *.None.
1cc0: 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 . *.. * Side eff
1cd0: 65 63 74 73 3a 0d 0a 20 2a 09 46 72 65 65 73 20 ects:.. *.Frees
1ce0: 74 68 65 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 the memory holdi
1cf0: 6e 67 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 ng the dictionar
1d00: 79 27 73 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 y's internal has
1d10: 68 20 74 61 62 6c 65 2e 0d 0a 20 2a 09 44 65 63 h table... *.Dec
1d20: 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 rements the refe
1d30: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 61 rence count of a
1d40: 6c 6c 20 6b 65 79 20 61 6e 64 20 76 61 6c 75 65 ll key and value
1d50: 20 6f 62 6a 65 63 74 73 2c 0d 0a 20 2a 09 77 68 objects,.. *.wh
1d60: 69 63 68 20 6d 61 79 20 66 72 65 65 20 74 68 65 ich may free the
1d70: 6d 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d m... *.. *------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1dc0: 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 .. */....static
1dd0: 76 6f 69 64 0d 0a 46 72 65 65 44 69 63 74 49 6e void..FreeDictIn
1de0: 74 65 72 6e 61 6c 52 65 70 28 64 69 63 74 50 74 ternalRep(dictPt
1df0: 72 29 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 r).. Tcl_Obj
1e00: 2a 64 69 63 74 50 74 72 3b 0d 0a 7b 0d 0a 20 20 *dictPtr;..{..
1e10: 20 20 44 69 63 74 20 2a 64 69 63 74 20 3d 20 28 Dict *dict = (
1e20: 44 69 63 74 20 2a 29 20 64 69 63 74 50 74 72 2d Dict *) dictPtr-
1e30: 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 >internalRep.oth
1e40: 65 72 56 61 6c 75 65 50 74 72 3b 0d 0a 0d 0a 20 erValuePtr;....
1e50: 20 20 20 2d 2d 64 69 63 74 2d 3e 72 65 66 63 6f --dict->refco
1e60: 75 6e 74 3b 0d 0a 20 20 20 20 69 66 20 28 64 69 unt;.. if (di
1e70: 63 74 2d 3e 72 65 66 63 6f 75 6e 74 20 3d 3d 20 ct->refcount ==
1e80: 30 29 20 7b 0d 0a 09 44 65 6c 65 74 65 44 69 63 0) {...DeleteDic
1e90: 74 28 64 69 63 74 29 3b 0d 0a 20 20 20 20 7d 0d t(dict);.. }.
1ea0: 0a 0d 0a 20 20 20 20 64 69 63 74 50 74 72 2d 3e ... dictPtr->
1eb0: 69 6e 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 internalRep.othe
1ec0: 72 56 61 6c 75 65 50 74 72 20 3d 20 4e 55 4c 4c rValuePtr = NULL
1ed0: 3b 09 2f 2a 20 42 65 6c 74 20 61 6e 64 20 62 72 ;./* Belt and br
1ee0: 61 63 65 73 21 20 2a 2f 0d 0a 7d 0d 0a 0c 0d 0a aces! */..}.....
1ef0: 73 74 61 74 69 63 20 76 6f 69 64 0d 0a 44 65 6c static void..Del
1f00: 65 74 65 44 69 63 74 28 64 69 63 74 29 0d 0a 20 eteDict(dict)..
1f10: 20 20 20 44 69 63 74 20 2a 64 69 63 74 3b 0d 0a Dict *dict;..
1f20: 7b 0d 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 {.. Tcl_HashE
1f30: 6e 74 72 79 20 2a 68 50 74 72 3b 0d 0a 20 20 20 ntry *hPtr;..
1f40: 20 54 63 6c 5f 48 61 73 68 53 65 61 72 63 68 20 Tcl_HashSearch
1f50: 73 65 61 72 63 68 3b 0d 0a 20 20 20 20 54 63 6c search;.. Tcl
1f60: 5f 4f 62 6a 20 2a 76 61 6c 75 65 50 74 72 3b 0d _Obj *valuePtr;.
1f70: 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 ... /*..
1f80: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 76 61 6c * Delete the val
1f90: 75 65 73 20 6f 75 72 73 65 6c 76 65 73 2c 20 62 ues ourselves, b
1fa0: 65 63 61 75 73 65 20 68 61 73 68 65 73 20 6b 6e ecause hashes kn
1fb0: 6f 77 20 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 ow nothing about
1fc0: 0d 0a 20 20 20 20 20 2a 20 74 68 65 69 72 20 63 .. * their c
1fd0: 6f 6e 74 65 6e 74 73 20 28 62 75 74 20 64 6f 20 ontents (but do
1fe0: 6b 6e 6f 77 20 61 62 6f 75 74 20 74 68 65 20 6b know about the k
1ff0: 65 79 20 74 79 70 65 2c 20 73 6f 20 74 68 61 74 ey type, so that
2000: 20 64 6f 65 73 6e 27 74 0d 0a 20 20 20 20 20 2a doesn't.. *
2010: 20 6e 65 65 64 20 65 78 70 6c 69 63 69 74 20 61 need explicit a
2020: 74 74 65 6e 74 69 6f 6e 2e 29 0d 0a 20 20 20 20 ttention.)..
2030: 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 20 28 68 50 */.. for (hP
2040: 74 72 3d 54 63 6c 5f 46 69 72 73 74 48 61 73 68 tr=Tcl_FirstHash
2050: 45 6e 74 72 79 28 26 64 69 63 74 2d 3e 74 61 62 Entry(&dict->tab
2060: 6c 65 2c 26 73 65 61 72 63 68 29 3b 20 68 50 74 le,&search); hPt
2070: 72 21 3d 4e 55 4c 4c 3b 0d 0a 09 20 20 20 20 68 r!=NULL;... h
2080: 50 74 72 3d 54 63 6c 5f 4e 65 78 74 48 61 73 68 Ptr=Tcl_NextHash
2090: 45 6e 74 72 79 28 26 73 65 61 72 63 68 29 29 20 Entry(&search))
20a0: 7b 0d 0a 09 76 61 6c 75 65 50 74 72 20 3d 20 28 {...valuePtr = (
20b0: 54 63 6c 5f 4f 62 6a 20 2a 29 20 54 63 6c 5f 47 Tcl_Obj *) Tcl_G
20c0: 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 etHashValue(hPtr
20d0: 29 3b 0d 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 );...Tcl_DecrRef
20e0: 43 6f 75 6e 74 28 76 61 6c 75 65 50 74 72 29 3b Count(valuePtr);
20f0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c .. }.. Tcl
2100: 5f 44 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 _DeleteHashTable
2110: 28 26 64 69 63 74 2d 3e 74 61 62 6c 65 29 3b 0d (&dict->table);.
2120: 0a 20 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 . ckfree((cha
2130: 72 20 2a 29 20 64 69 63 74 29 3b 0d 0a 7d 0d 0a r *) dict);..}..
2140: 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .../*.. *-------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d ---------------.
2190: 0a 20 2a 0d 0a 20 2a 20 55 70 64 61 74 65 53 74 . *.. * UpdateSt
21a0: 72 69 6e 67 4f 66 44 69 63 74 20 2d 2d 0d 0a 20 ringOfDict --..
21b0: 2a 0d 0a 20 2a 09 55 70 64 61 74 65 20 74 68 65 *.. *.Update the
21c0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e string represen
21d0: 74 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 63 tation for a dic
21e0: 74 69 6f 6e 61 72 79 20 6f 62 6a 65 63 74 2e 0d tionary object..
21f0: 0a 20 2a 09 4e 6f 74 65 3a 20 54 68 69 73 20 70 . *.Note: This p
2200: 72 6f 63 65 64 75 72 65 20 64 6f 65 73 20 6e 6f rocedure does no
2210: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 t invalidate an
2220: 65 78 69 73 74 69 6e 67 20 6f 6c 64 20 73 74 72 existing old str
2230: 69 6e 67 0d 0a 20 2a 09 72 65 70 20 73 6f 20 73 ing.. *.rep so s
2240: 74 6f 72 61 67 65 20 77 69 6c 6c 20 62 65 20 6c torage will be l
2250: 6f 73 74 20 69 66 20 74 68 69 73 20 68 61 73 20 ost if this has
2260: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e not already been
2270: 20 64 6f 6e 65 2e 0d 0a 20 2a 09 54 68 69 73 20 done... *.This
2280: 63 6f 64 65 20 69 73 20 62 61 73 65 64 20 6f 6e code is based on
2290: 20 55 70 64 61 74 65 53 74 72 69 6e 67 4f 66 4c UpdateStringOfL
22a0: 69 73 74 20 69 6e 20 74 63 6c 4c 69 73 74 4f 62 ist in tclListOb
22b0: 6a 2e 63 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 j.c.. *.. * Resu
22c0: 6c 74 73 3a 0d 0a 20 2a 09 4e 6f 6e 65 2e 0d 0a lts:.. *.None...
22d0: 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 65 *.. * Side effe
22e0: 63 74 73 3a 0d 0a 20 2a 09 54 68 65 20 6f 62 6a cts:.. *.The obj
22f0: 65 63 74 27 73 20 73 74 72 69 6e 67 20 69 73 20 ect's string is
2300: 73 65 74 20 74 6f 20 61 20 76 61 6c 69 64 20 73 set to a valid s
2310: 74 72 69 6e 67 20 74 68 61 74 20 72 65 73 75 6c tring that resul
2320: 74 73 20 66 72 6f 6d 0d 0a 20 2a 09 74 68 65 20 ts from.. *.the
2330: 64 69 63 74 2d 74 6f 2d 73 74 72 69 6e 67 20 63 dict-to-string c
2340: 6f 6e 76 65 72 73 69 6f 6e 2e 20 54 68 69 73 20 onversion. This
2350: 73 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 65 string will be e
2360: 6d 70 74 79 20 69 66 20 74 68 65 0d 0a 20 2a 09 mpty if the.. *.
2370: 64 69 63 74 69 6f 6e 61 72 79 20 68 61 73 20 6e dictionary has n
2380: 6f 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 o key/value pair
2390: 73 2e 20 54 68 65 20 64 69 63 74 69 6f 6e 61 72 s. The dictionar
23a0: 79 20 69 6e 74 65 72 6e 61 6c 0d 0a 20 2a 09 72 y internal.. *.r
23b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 68 epresentation sh
23c0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 4e 55 4c 4c ould not be NULL
23d0: 20 61 6e 64 20 77 65 20 61 73 73 75 6d 65 20 69 and we assume i
23e0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0d 0a t is not NULL...
23f0: 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.. *----------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a ------------.. *
2440: 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 /....static void
2450: 0d 0a 55 70 64 61 74 65 53 74 72 69 6e 67 4f 66 ..UpdateStringOf
2460: 44 69 63 74 28 64 69 63 74 50 74 72 29 0d 0a 20 Dict(dictPtr)..
2470: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 Tcl_Obj *dict
2480: 50 74 72 3b 0d 0a 7b 0d 0a 23 64 65 66 69 6e 65 Ptr;..{..#define
2490: 20 4c 4f 43 41 4c 5f 53 49 5a 45 20 32 30 0d 0a LOCAL_SIZE 20..
24a0: 20 20 20 20 69 6e 74 20 6c 6f 63 61 6c 46 6c 61 int localFla
24b0: 67 73 5b 4c 4f 43 41 4c 5f 53 49 5a 45 5d 2c 20 gs[LOCAL_SIZE],
24c0: 2a 66 6c 61 67 50 74 72 3b 0d 0a 20 20 20 20 44 *flagPtr;.. D
24d0: 69 63 74 20 2a 64 69 63 74 20 3d 20 28 44 69 63 ict *dict = (Dic
24e0: 74 20 2a 29 20 64 69 63 74 50 74 72 2d 3e 69 6e t *) dictPtr->in
24f0: 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 ternalRep.otherV
2500: 61 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 54 63 aluePtr;.. Tc
2510: 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 l_HashEntry *hPt
2520: 72 3b 0d 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 r;.. Tcl_Hash
2530: 53 65 61 72 63 68 20 73 65 61 72 63 68 3b 0d 0a Search search;..
2540: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 Tcl_Obj *key
2550: 50 74 72 2c 20 2a 76 61 6c 75 65 50 74 72 3b 0d Ptr, *valuePtr;.
2560: 0a 20 20 20 20 69 6e 74 20 6e 75 6d 45 6c 65 6d . int numElem
2570: 73 2c 20 69 2c 20 6c 65 6e 67 74 68 3b 0d 0a 20 s, i, length;..
2580: 20 20 20 63 68 61 72 20 2a 65 6c 65 6d 2c 20 2a char *elem, *
2590: 64 73 74 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a dst;.... /*..
25a0: 20 20 20 20 20 2a 20 54 68 69 73 20 66 69 65 6c * This fiel
25b0: 64 20 69 73 20 74 68 65 20 6d 6f 73 74 20 75 73 d is the most us
25c0: 65 66 75 6c 20 6f 6e 65 20 69 6e 20 74 68 65 20 eful one in the
25d0: 77 68 6f 6c 65 20 68 61 73 68 20 73 74 72 75 63 whole hash struc
25e0: 74 75 72 65 2c 0d 0a 20 20 20 20 20 2a 20 61 6e ture,.. * an
25f0: 64 20 69 74 20 69 73 20 6e 6f 74 20 65 78 70 6f d it is not expo
2600: 73 65 64 20 62 79 20 61 6e 79 20 41 50 49 20 66 sed by any API f
2610: 75 6e 63 74 69 6f 6e 2e 2e 2e 0d 0a 20 20 20 20 unction.....
2620: 20 2a 2f 0d 0a 20 20 20 20 6e 75 6d 45 6c 65 6d */.. numElem
2630: 73 20 3d 20 64 69 63 74 2d 3e 74 61 62 6c 65 2e s = dict->table.
2640: 6e 75 6d 45 6e 74 72 69 65 73 20 2a 20 32 3b 0d numEntries * 2;.
2650: 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 ... /*..
2660: 2a 20 50 61 73 73 20 31 3a 20 65 73 74 69 6d 61 * Pass 1: estima
2670: 74 65 20 73 70 61 63 65 2c 20 67 61 74 68 65 72 te space, gather
2680: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 2a 2f flags... */
2690: 0d 0a 0d 0a 20 20 20 20 69 66 20 28 6e 75 6d 45 .... if (numE
26a0: 6c 65 6d 73 20 3c 3d 20 4c 4f 43 41 4c 5f 53 49 lems <= LOCAL_SI
26b0: 5a 45 29 20 7b 0d 0a 09 66 6c 61 67 50 74 72 20 ZE) {...flagPtr
26c0: 3d 20 6c 6f 63 61 6c 46 6c 61 67 73 3b 0d 0a 20 = localFlags;..
26d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 09 66 6c } else {...fl
26e0: 61 67 50 74 72 20 3d 20 28 69 6e 74 20 2a 29 20 agPtr = (int *)
26f0: 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 ckalloc((unsigne
2700: 64 29 20 6e 75 6d 45 6c 65 6d 73 2a 73 69 7a 65 d) numElems*size
2710: 6f 66 28 69 6e 74 29 29 3b 0d 0a 20 20 20 20 7d of(int));.. }
2720: 0d 0a 20 20 20 20 64 69 63 74 50 74 72 2d 3e 6c .. dictPtr->l
2730: 65 6e 67 74 68 20 3d 20 31 3b 0d 0a 20 20 20 20 ength = 1;..
2740: 66 6f 72 20 28 69 3d 30 2c 68 50 74 72 3d 54 63 for (i=0,hPtr=Tc
2750: 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74 72 79 l_FirstHashEntry
2760: 28 26 64 69 63 74 2d 3e 74 61 62 6c 65 2c 26 73 (&dict->table,&s
2770: 65 61 72 63 68 29 20 3b 20 69 3c 6e 75 6d 45 6c earch) ; i<numEl
2780: 65 6d 73 20 3b 0d 0a 09 20 20 20 20 69 2b 3d 32 ems ;... i+=2
2790: 2c 68 50 74 72 3d 54 63 6c 5f 4e 65 78 74 48 61 ,hPtr=Tcl_NextHa
27a0: 73 68 45 6e 74 72 79 28 26 73 65 61 72 63 68 29 shEntry(&search)
27b0: 29 20 7b 0d 0a 09 2f 2a 0d 0a 09 20 2a 20 41 73 ) {.../*... * As
27c0: 73 75 6d 65 20 74 68 61 74 20 68 50 74 72 20 69 sume that hPtr i
27d0: 73 20 6e 65 76 65 72 20 4e 55 4c 4c 20 73 69 6e s never NULL sin
27e0: 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 6e ce we know the n
27f0: 75 6d 62 65 72 20 6f 66 0d 0a 09 20 2a 20 61 72 umber of... * ar
2800: 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 6c 72 ray elements alr
2810: 65 61 64 79 2e 0d 0a 09 20 2a 2f 0d 0a 0d 0a 09 eady.... */.....
2820: 6b 65 79 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 keyPtr = (Tcl_Ob
2830: 6a 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 j *) Tcl_GetHash
2840: 4b 65 79 28 26 64 69 63 74 2d 3e 74 61 62 6c 65 Key(&dict->table
2850: 2c 20 68 50 74 72 29 3b 0d 0a 09 65 6c 65 6d 20 , hPtr);...elem
2860: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
2870: 72 6f 6d 4f 62 6a 28 6b 65 79 50 74 72 2c 20 26 romObj(keyPtr, &
2880: 6c 65 6e 67 74 68 29 3b 0d 0a 09 64 69 63 74 50 length);...dictP
2890: 74 72 2d 3e 6c 65 6e 67 74 68 20 2b 3d 20 54 63 tr->length += Tc
28a0: 6c 5f 53 63 61 6e 43 6f 75 6e 74 65 64 45 6c 65 l_ScanCountedEle
28b0: 6d 65 6e 74 28 65 6c 65 6d 2c 20 6c 65 6e 67 74 ment(elem, lengt
28c0: 68 2c 0d 0a 09 09 26 66 6c 61 67 50 74 72 5b 69 h,....&flagPtr[i
28d0: 5d 29 20 2b 20 31 3b 0d 0a 0d 0a 09 76 61 6c 75 ]) + 1;.....valu
28e0: 65 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 ePtr = (Tcl_Obj
28f0: 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 *) Tcl_GetHashVa
2900: 6c 75 65 28 68 50 74 72 29 3b 0d 0a 09 65 6c 65 lue(hPtr);...ele
2910: 6d 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e m = Tcl_GetStrin
2920: 67 46 72 6f 6d 4f 62 6a 28 76 61 6c 75 65 50 74 gFromObj(valuePt
2930: 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0d 0a 09 64 r, &length);...d
2940: 69 63 74 50 74 72 2d 3e 6c 65 6e 67 74 68 20 2b ictPtr->length +
2950: 3d 20 54 63 6c 5f 53 63 61 6e 43 6f 75 6e 74 65 = Tcl_ScanCounte
2960: 64 45 6c 65 6d 65 6e 74 28 65 6c 65 6d 2c 20 6c dElement(elem, l
2970: 65 6e 67 74 68 2c 0d 0a 09 09 26 66 6c 61 67 50 ength,....&flagP
2980: 74 72 5b 69 2b 31 5d 29 20 2b 20 31 3b 0d 0a 20 tr[i+1]) + 1;..
2990: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a }.... /*..
29a0: 20 20 20 20 20 2a 20 50 61 73 73 20 32 3a 20 63 * Pass 2: c
29b0: 6f 70 79 20 69 6e 74 6f 20 73 74 72 69 6e 67 20 opy into string
29c0: 72 65 70 20 62 75 66 66 65 72 2e 0d 0a 20 20 20 rep buffer...
29d0: 20 20 2a 2f 0d 0a 0d 0a 20 20 20 20 64 69 63 74 */.... dict
29e0: 50 74 72 2d 3e 62 79 74 65 73 20 3d 20 63 6b 61 Ptr->bytes = cka
29f0: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 lloc((unsigned)
2a00: 64 69 63 74 50 74 72 2d 3e 6c 65 6e 67 74 68 29 dictPtr->length)
2a10: 3b 0d 0a 20 20 20 20 64 73 74 20 3d 20 64 69 63 ;.. dst = dic
2a20: 74 50 74 72 2d 3e 62 79 74 65 73 3b 0d 0a 20 20 tPtr->bytes;..
2a30: 20 20 66 6f 72 20 28 69 3d 30 2c 68 50 74 72 3d for (i=0,hPtr=
2a40: 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74 Tcl_FirstHashEnt
2a50: 72 79 28 26 64 69 63 74 2d 3e 74 61 62 6c 65 2c ry(&dict->table,
2a60: 26 73 65 61 72 63 68 29 20 3b 20 69 3c 6e 75 6d &search) ; i<num
2a70: 45 6c 65 6d 73 20 3b 0d 0a 09 20 20 20 20 69 2b Elems ;... i+
2a80: 3d 32 2c 68 50 74 72 3d 54 63 6c 5f 4e 65 78 74 =2,hPtr=Tcl_Next
2a90: 48 61 73 68 45 6e 74 72 79 28 26 73 65 61 72 63 HashEntry(&searc
2aa0: 68 29 29 20 7b 0d 0a 09 6b 65 79 50 74 72 20 3d h)) {...keyPtr =
2ab0: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 54 63 6c (Tcl_Obj *) Tcl
2ac0: 5f 47 65 74 48 61 73 68 4b 65 79 28 26 64 69 63 _GetHashKey(&dic
2ad0: 74 2d 3e 74 61 62 6c 65 2c 20 68 50 74 72 29 3b t->table, hPtr);
2ae0: 0d 0a 09 65 6c 65 6d 20 3d 20 54 63 6c 5f 47 65 ...elem = Tcl_Ge
2af0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6b tStringFromObj(k
2b00: 65 79 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b eyPtr, &length);
2b10: 0d 0a 09 64 73 74 20 2b 3d 20 54 63 6c 5f 43 6f ...dst += Tcl_Co
2b20: 6e 76 65 72 74 43 6f 75 6e 74 65 64 45 6c 65 6d nvertCountedElem
2b30: 65 6e 74 28 65 6c 65 6d 2c 20 6c 65 6e 67 74 68 ent(elem, length
2b40: 2c 20 64 73 74 2c 20 66 6c 61 67 50 74 72 5b 69 , dst, flagPtr[i
2b50: 5d 29 3b 0d 0a 09 2a 28 64 73 74 2b 2b 29 20 3d ]);...*(dst++) =
2b60: 20 27 20 27 3b 0d 0a 0d 0a 09 76 61 6c 75 65 50 ' ';.....valueP
2b70: 74 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 tr = (Tcl_Obj *)
2b80: 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 Tcl_GetHashValu
2b90: 65 28 68 50 74 72 29 3b 0d 0a 09 65 6c 65 6d 20 e(hPtr);...elem
2ba0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
2bb0: 72 6f 6d 4f 62 6a 28 76 61 6c 75 65 50 74 72 2c romObj(valuePtr,
2bc0: 20 26 6c 65 6e 67 74 68 29 3b 0d 0a 09 64 73 74 &length);...dst
2bd0: 20 2b 3d 20 54 63 6c 5f 43 6f 6e 76 65 72 74 43 += Tcl_ConvertC
2be0: 6f 75 6e 74 65 64 45 6c 65 6d 65 6e 74 28 65 6c ountedElement(el
2bf0: 65 6d 2c 20 6c 65 6e 67 74 68 2c 20 64 73 74 2c em, length, dst,
2c00: 20 66 6c 61 67 50 74 72 5b 69 2b 31 5d 29 3b 0d flagPtr[i+1]);.
2c10: 0a 09 2a 28 64 73 74 2b 2b 29 20 3d 20 27 20 27 ..*(dst++) = ' '
2c20: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 ;.. }.. if
2c30: 20 28 66 6c 61 67 50 74 72 20 21 3d 20 6c 6f 63 (flagPtr != loc
2c40: 61 6c 46 6c 61 67 73 29 20 7b 0d 0a 09 63 6b 66 alFlags) {...ckf
2c50: 72 65 65 28 28 63 68 61 72 20 2a 29 20 66 6c 61 ree((char *) fla
2c60: 67 50 74 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 gPtr);.. }..
2c70: 20 20 20 69 66 20 28 64 73 74 20 3d 3d 20 64 69 if (dst == di
2c80: 63 74 50 74 72 2d 3e 62 79 74 65 73 29 20 7b 0d ctPtr->bytes) {.
2c90: 0a 09 2a 64 73 74 20 3d 20 30 3b 0d 0a 20 20 20 ..*dst = 0;..
2ca0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 09 2a 28 2d 2d } else {...*(--
2cb0: 64 73 74 29 20 3d 20 30 3b 0d 0a 20 20 20 20 7d dst) = 0;.. }
2cc0: 0d 0a 20 20 20 20 64 69 63 74 50 74 72 2d 3e 6c .. dictPtr->l
2cd0: 65 6e 67 74 68 20 3d 20 64 73 74 20 2d 20 64 69 ength = dst - di
2ce0: 63 74 50 74 72 2d 3e 62 79 74 65 73 3b 0d 0a 7d ctPtr->bytes;..}
2cf0: 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d ...../*.. *-----
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d40: 2d 0d 0a 20 2a 0d 0a 20 2a 20 53 65 74 44 69 63 -.. *.. * SetDic
2d50: 74 46 72 6f 6d 41 6e 79 20 2d 2d 0d 0a 20 2a 0d tFromAny --.. *.
2d60: 0a 20 2a 09 43 6f 6e 76 65 72 74 20 61 20 6e 6f . *.Convert a no
2d70: 6e 2d 64 69 63 74 69 6f 6e 61 72 79 20 6f 62 6a n-dictionary obj
2d80: 65 63 74 20 69 6e 74 6f 20 61 20 64 69 63 74 69 ect into a dicti
2d90: 6f 6e 61 72 79 20 6f 62 6a 65 63 74 2e 20 20 54 onary object. T
2da0: 68 69 73 0d 0a 20 2a 09 63 6f 64 65 20 69 73 20 his.. *.code is
2db0: 76 65 72 79 20 63 6c 6f 73 65 6c 79 20 72 65 6c very closely rel
2dc0: 61 74 65 64 20 74 6f 20 53 65 74 4c 69 73 74 46 ated to SetListF
2dd0: 72 6f 6d 41 6e 79 20 69 6e 20 74 63 6c 4c 69 73 romAny in tclLis
2de0: 74 4f 62 6a 2e 63 0d 0a 20 2a 09 62 75 74 20 64 tObj.c.. *.but d
2df0: 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 oes not actually
2e00: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 guarantee that
2e10: 61 20 64 69 63 74 69 6f 6e 61 72 79 20 6f 62 6a a dictionary obj
2e20: 65 63 74 20 77 69 6c 6c 0d 0a 20 2a 09 68 61 76 ect will.. *.hav
2e30: 65 20 61 20 73 74 72 69 6e 67 20 72 65 70 20 28 e a string rep (
2e40: 61 73 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 66 as conversions f
2e50: 72 6f 6d 20 6c 69 73 74 73 20 61 72 65 20 68 61 rom lists are ha
2e60: 6e 64 6c 65 64 20 77 69 74 68 20 61 0d 0a 20 2a ndled with a.. *
2e70: 09 73 70 65 63 69 61 6c 20 63 61 73 65 2e 29 0d .special case.).
2e80: 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 6c 74 73 3a . *.. * Results:
2e90: 0d 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 .. *.A standard
2ea0: 54 63 6c 20 72 65 73 75 6c 74 2e 0d 0a 20 2a 0d Tcl result... *.
2eb0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2ec0: 3a 0d 0a 20 2a 09 49 66 20 74 68 65 20 73 74 72 :.. *.If the str
2ed0: 69 6e 67 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 ing can be conve
2ee0: 72 74 65 64 2c 20 69 74 20 6c 6f 73 65 73 20 61 rted, it loses a
2ef0: 6e 79 20 6f 6c 64 20 69 6e 74 65 72 6e 61 6c 0d ny old internal.
2f00: 0a 20 2a 09 72 65 70 72 65 73 65 6e 74 61 74 69 . *.representati
2f10: 6f 6e 20 74 68 61 74 20 69 74 20 68 61 64 20 61 on that it had a
2f20: 6e 64 20 67 61 69 6e 73 20 61 20 64 69 63 74 69 nd gains a dicti
2f30: 6f 6e 61 72 79 27 73 20 69 6e 74 65 72 6e 61 6c onary's internal
2f40: 52 65 70 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d Rep... *.. *----
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f90: 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69 --.. */....stati
2fa0: 63 20 69 6e 74 0d 0a 53 65 74 44 69 63 74 46 72 c int..SetDictFr
2fb0: 6f 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20 6f 62 omAny(interp, ob
2fc0: 6a 50 74 72 29 0d 0a 20 20 20 20 54 63 6c 5f 49 jPtr).. Tcl_I
2fd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0d 0a nterp *interp;..
2fe0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
2ff0: 50 74 72 3b 0d 0a 7b 0d 0a 20 20 20 20 54 63 6c Ptr;..{.. Tcl
3000: 5f 4f 62 6a 54 79 70 65 20 2a 6f 6c 64 54 79 70 _ObjType *oldTyp
3010: 65 50 74 72 20 3d 20 6f 62 6a 50 74 72 2d 3e 74 ePtr = objPtr->t
3020: 79 70 65 50 74 72 3b 0d 0a 20 20 20 20 63 68 61 ypePtr;.. cha
3030: 72 20 2a 73 74 72 69 6e 67 2c 20 2a 73 3b 0d 0a r *string, *s;..
3040: 20 20 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a CONST char *
3050: 65 6c 65 6d 53 74 61 72 74 2c 20 2a 6e 65 78 74 elemStart, *next
3060: 45 6c 65 6d 3b 0d 0a 20 20 20 20 69 6e 74 20 6c Elem;.. int l
3070: 65 6e 52 65 6d 61 69 6e 2c 20 6c 65 6e 67 74 68 enRemain, length
3080: 2c 20 65 6c 65 6d 53 69 7a 65 2c 20 68 61 73 42 , elemSize, hasB
3090: 72 61 63 65 2c 20 72 65 73 75 6c 74 2c 20 69 73 race, result, is
30a0: 4e 65 77 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a New;.. char *
30b0: 6c 69 6d 69 74 3b 09 09 2f 2a 20 50 6f 69 6e 74 limit;../* Point
30c0: 73 20 6a 75 73 74 20 61 66 74 65 72 20 73 74 72 s just after str
30d0: 69 6e 67 27 73 20 6c 61 73 74 20 62 79 74 65 2e ing's last byte.
30e0: 20 2a 2f 0d 0a 20 20 20 20 72 65 67 69 73 74 65 */.. registe
30f0: 72 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 70 3b r CONST char *p;
3100: 0d 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 .. register T
3110: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 50 74 72 2c 20 cl_Obj *keyPtr,
3120: 2a 76 61 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 *valuePtr;..
3130: 44 69 63 74 20 2a 64 69 63 74 3b 0d 0a 20 20 20 Dict *dict;..
3140: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a Tcl_HashEntry *
3150: 68 50 74 72 3b 0d 0a 20 20 20 20 54 63 6c 5f 48 hPtr;.. Tcl_H
3160: 61 73 68 53 65 61 72 63 68 20 73 65 61 72 63 68 ashSearch search
3170: 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 ;.... /*..
3180: 20 20 2a 20 53 69 6e 63 65 20 6c 69 73 74 73 20 * Since lists
3190: 61 6e 64 20 64 69 63 74 69 6f 6e 61 72 69 65 73 and dictionaries
31a0: 20 68 61 76 65 20 76 65 72 79 20 63 6c 6f 73 65 have very close
31b0: 6c 79 2d 72 65 6c 61 74 65 64 20 73 74 72 69 6e ly-related strin
31c0: 67 0d 0a 20 20 20 20 20 2a 20 72 65 70 72 65 73 g.. * repres
31d0: 65 6e 74 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 entations (i.e.
31e0: 74 68 65 20 73 61 6d 65 20 70 61 72 73 69 6e 67 the same parsing
31f0: 20 63 6f 64 65 29 20 77 65 20 63 61 6e 20 73 61 code) we can sa
3200: 66 65 6c 79 0d 0a 20 20 20 20 20 2a 20 73 70 65 fely.. * spe
3210: 63 69 61 6c 2d 63 61 73 65 20 74 68 65 20 63 6f cial-case the co
3220: 6e 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 6c 69 nversion from li
3230: 73 74 73 20 74 6f 20 64 69 63 74 69 6f 6e 61 72 sts to dictionar
3240: 69 65 73 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a 0d ies... */...
3250: 0a 20 20 20 20 69 66 20 28 6f 6c 64 54 79 70 65 . if (oldType
3260: 50 74 72 20 3d 3d 20 26 74 63 6c 4c 69 73 74 54 Ptr == &tclListT
3270: 79 70 65 29 20 7b 0d 0a 09 69 6e 74 20 6f 62 6a ype) {...int obj
3280: 63 2c 20 69 3b 0d 0a 09 54 63 6c 5f 4f 62 6a 20 c, i;...Tcl_Obj
3290: 2a 2a 6f 62 6a 76 3b 0d 0a 0d 0a 09 69 66 20 28 **objv;.....if (
32a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
32b0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f ements(interp, o
32c0: 62 6a 50 74 72 2c 20 26 6f 62 6a 63 2c 20 26 6f bjPtr, &objc, &o
32d0: 62 6a 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 bjv) != TCL_OK)
32e0: 7b 0d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 {... return T
32f0: 43 4c 5f 45 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 09 CL_ERROR;...}...
3300: 69 66 20 28 6f 62 6a 63 20 26 20 31 29 20 7b 0d if (objc & 1) {.
3310: 0a 09 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 .. if (interp
3320: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 09 54 != NULL) {....T
3330: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
3340: 69 6e 74 65 72 70 2c 0d 0a 09 09 09 54 63 6c 5f interp,.....Tcl_
3350: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 NewStringObj("mi
3360: 73 73 69 6e 67 20 76 61 6c 75 65 20 74 6f 20 67 ssing value to g
3370: 6f 20 77 69 74 68 20 6b 65 79 22 2c 20 2d 31 29 o with key", -1)
3380: 29 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 20 20 20 );... }...
3390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
33a0: 52 3b 0d 0a 09 7d 0d 0a 0d 0a 09 2f 2a 0d 0a 09 R;...}...../*...
33b0: 20 2a 20 42 75 69 6c 64 20 74 68 65 20 68 61 73 * Build the has
33c0: 68 20 6f 66 20 6b 65 79 2f 76 61 6c 75 65 20 70 h of key/value p
33d0: 61 69 72 73 2e 0d 0a 09 20 2a 2f 0d 0a 09 64 69 airs.... */...di
33e0: 63 74 20 3d 20 28 44 69 63 74 20 2a 29 20 63 6b ct = (Dict *) ck
33f0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 69 63 alloc(sizeof(Dic
3400: 74 29 29 3b 0d 0a 09 54 63 6c 5f 49 6e 69 74 4f t));...Tcl_InitO
3410: 62 6a 48 61 73 68 54 61 62 6c 65 28 26 64 69 63 bjHashTable(&dic
3420: 74 2d 3e 74 61 62 6c 65 29 3b 0d 0a 09 66 6f 72 t->table);...for
3430: 20 28 69 3d 30 20 3b 20 69 3c 6f 62 6a 63 20 3b (i=0 ; i<objc ;
3440: 20 69 2b 3d 32 29 20 7b 0d 0a 09 20 20 20 20 2f i+=2) {... /
3450: 2a 0d 0a 09 20 20 20 20 20 2a 20 53 74 6f 72 65 *... * Store
3460: 20 6b 65 79 20 61 6e 64 20 76 61 6c 75 65 20 69 key and value i
3470: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 n the hash table
3480: 20 77 65 27 72 65 20 62 75 69 6c 64 69 6e 67 2e we're building.
3490: 0d 0a 09 20 20 20 20 20 2a 2f 0d 0a 0d 0a 09 20 ... */.....
34a0: 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 43 72 hPtr = Tcl_Cr
34b0: 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 26 64 eateHashEntry(&d
34c0: 69 63 74 2d 3e 74 61 62 6c 65 2c 20 28 63 68 61 ict->table, (cha
34d0: 72 20 2a 29 6f 62 6a 76 5b 69 5d 2c 20 26 69 73 r *)objv[i], &is
34e0: 4e 65 77 29 3b 0d 0a 09 20 20 20 20 69 66 20 28 New);... if (
34f0: 21 69 73 4e 65 77 29 20 7b 0d 0a 09 09 54 63 6c !isNew) {....Tcl
3500: 5f 4f 62 6a 20 2a 64 69 73 63 61 72 64 65 64 56 _Obj *discardedV
3510: 61 6c 75 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 alue = (Tcl_Obj
3520: 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 *) Tcl_GetHashVa
3530: 6c 75 65 28 68 50 74 72 29 3b 0d 0a 09 09 54 63 lue(hPtr);....Tc
3540: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 l_DecrRefCount(d
3550: 69 73 63 61 72 64 65 64 56 61 6c 75 65 29 3b 0d iscardedValue);.
3560: 0a 09 20 20 20 20 7d 0d 0a 09 20 20 20 20 54 63 .. }... Tc
3570: 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 l_SetHashValue(h
3580: 50 74 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Ptr, (ClientData
3590: 29 20 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0d 0a 09 ) objv[i+1]);...
35a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
35b0: 6f 75 6e 74 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b ount(objv[i+1]);
35c0: 20 2f 2a 20 73 69 6e 63 65 20 68 61 73 68 20 6e /* since hash n
35d0: 6f 77 20 68 6f 6c 64 73 20 72 65 66 20 74 6f 20 ow holds ref to
35e0: 69 74 20 2a 2f 0d 0a 09 7d 0d 0a 0d 0a 09 2f 2a it */...}...../*
35f0: 0d 0a 09 20 2a 20 53 68 61 72 65 20 74 79 70 65 ... * Share type
3600: 2d 73 65 74 74 69 6e 67 20 63 6f 64 65 20 77 69 -setting code wi
3610: 74 68 20 74 68 65 20 73 74 72 69 6e 67 2d 63 6f th the string-co
3620: 6e 76 65 72 73 69 6f 6e 20 63 61 73 65 2e 0d 0a nversion case...
3630: 09 20 2a 2f 0d 0a 09 67 6f 74 6f 20 69 6e 73 74 . */...goto inst
3640: 61 6c 6c 48 61 73 68 3b 0d 0a 20 20 20 20 7d 0d allHash;.. }.
3650: 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 ... /*..
3660: 2a 20 47 65 74 20 74 68 65 20 73 74 72 69 6e 67 * Get the string
3670: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e representation.
3680: 20 4d 61 6b 65 20 69 74 20 75 70 2d 74 6f 2d 64 Make it up-to-d
3690: 61 74 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 ate if necessary
36a0: 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a 0d 0a 20 20 ... */....
36b0: 20 20 73 74 72 69 6e 67 20 3d 20 54 63 6c 5f 47 string = Tcl_G
36c0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
36d0: 6f 62 6a 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 objPtr, &length)
36e0: 3b 0d 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 28 ;.. limit = (
36f0: 73 74 72 69 6e 67 20 2b 20 6c 65 6e 67 74 68 29 string + length)
3700: 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 ;.... /*..
3710: 20 20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e * Allocate a n
3720: 65 77 20 48 61 73 68 54 61 62 6c 65 20 74 68 61 ew HashTable tha
3730: 74 20 68 61 73 20 6f 62 6a 65 63 74 73 20 66 6f t has objects fo
3740: 72 20 6b 65 79 73 20 61 6e 64 20 6f 62 6a 65 63 r keys and objec
3750: 74 73 0d 0a 20 20 20 20 20 2a 20 66 6f 72 20 76 ts.. * for v
3760: 61 6c 75 65 73 2e 0d 0a 20 20 20 20 20 2a 2f 0d alues... */.
3770: 0a 0d 0a 20 20 20 20 64 69 63 74 20 3d 20 28 44 ... dict = (D
3780: 69 63 74 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 ict *) ckalloc(s
3790: 69 7a 65 6f 66 28 44 69 63 74 29 29 3b 0d 0a 20 izeof(Dict));..
37a0: 20 20 20 54 63 6c 5f 49 6e 69 74 4f 62 6a 48 61 Tcl_InitObjHa
37b0: 73 68 54 61 62 6c 65 28 26 64 69 63 74 2d 3e 74 shTable(&dict->t
37c0: 61 62 6c 65 29 3b 0d 0a 20 20 20 20 66 6f 72 20 able);.. for
37d0: 28 70 20 3d 20 73 74 72 69 6e 67 2c 20 6c 65 6e (p = string, len
37e0: 52 65 6d 61 69 6e 20 3d 20 6c 65 6e 67 74 68 3b Remain = length;
37f0: 0d 0a 09 20 20 20 20 6c 65 6e 52 65 6d 61 69 6e ... lenRemain
3800: 20 3e 20 30 3b 0d 0a 09 20 20 20 20 70 20 3d 20 > 0;... p =
3810: 6e 65 78 74 45 6c 65 6d 2c 20 6c 65 6e 52 65 6d nextElem, lenRem
3820: 61 69 6e 20 3d 20 28 6c 69 6d 69 74 20 2d 20 6e ain = (limit - n
3830: 65 78 74 45 6c 65 6d 29 29 20 7b 0d 0a 09 72 65 extElem)) {...re
3840: 73 75 6c 74 20 3d 20 54 63 6c 46 69 6e 64 45 6c sult = TclFindEl
3850: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c ement(interp, p,
3860: 20 6c 65 6e 52 65 6d 61 69 6e 2c 0d 0a 09 09 26 lenRemain,....&
3870: 65 6c 65 6d 53 74 61 72 74 2c 20 26 6e 65 78 74 elemStart, &next
3880: 45 6c 65 6d 2c 20 26 65 6c 65 6d 53 69 7a 65 2c Elem, &elemSize,
3890: 20 26 68 61 73 42 72 61 63 65 29 3b 0d 0a 09 69 &hasBrace);...i
38a0: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c f (result != TCL
38b0: 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 67 6f 74 _OK) {... got
38c0: 6f 20 65 72 72 6f 72 45 78 69 74 3b 0d 0a 09 7d o errorExit;...}
38d0: 0d 0a 09 69 66 20 28 65 6c 65 6d 53 74 61 72 74 ...if (elemStart
38e0: 20 3e 3d 20 6c 69 6d 69 74 29 20 7b 0d 0a 09 20 >= limit) {...
38f0: 20 20 20 62 72 65 61 6b 3b 0d 0a 09 7d 0d 0a 0d break;...}...
3900: 0a 09 2f 2a 0d 0a 09 20 2a 20 41 6c 6c 6f 63 61 ../*... * Alloca
3910: 74 65 20 61 20 54 63 6c 20 6f 62 6a 65 63 74 20 te a Tcl object
3920: 66 6f 72 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 for the element
3930: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 and initialize i
3940: 74 20 66 72 6f 6d 20 74 68 65 0d 0a 09 20 2a 20 t from the... *
3950: 22 65 6c 65 6d 53 69 7a 65 22 20 62 79 74 65 73 "elemSize" bytes
3960: 20 73 74 61 72 74 69 6e 67 20 61 74 20 22 65 6c starting at "el
3970: 65 6d 53 74 61 72 74 22 2e 0d 0a 09 20 2a 2f 0d emStart".... */.
3980: 0a 0d 0a 09 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 ....s = ckalloc(
3990: 28 75 6e 73 69 67 6e 65 64 29 20 65 6c 65 6d 53 (unsigned) elemS
39a0: 69 7a 65 20 2b 20 31 29 3b 0d 0a 09 69 66 20 28 ize + 1);...if (
39b0: 68 61 73 42 72 61 63 65 29 20 7b 0d 0a 09 20 20 hasBrace) {...
39c0: 20 20 6d 65 6d 63 70 79 28 28 56 4f 49 44 20 2a memcpy((VOID *
39d0: 29 20 73 2c 20 28 56 4f 49 44 20 2a 29 20 65 6c ) s, (VOID *) el
39e0: 65 6d 53 74 61 72 74 2c 20 20 28 73 69 7a 65 5f emStart, (size_
39f0: 74 29 20 65 6c 65 6d 53 69 7a 65 29 3b 0d 0a 09 t) elemSize);...
3a00: 20 20 20 20 73 5b 65 6c 65 6d 53 69 7a 65 5d 20 s[elemSize]
3a10: 3d 20 30 3b 0d 0a 09 7d 20 65 6c 73 65 20 7b 0d = 0;...} else {.
3a20: 0a 09 20 20 20 20 65 6c 65 6d 53 69 7a 65 20 3d .. elemSize =
3a30: 20 54 63 6c 43 6f 70 79 41 6e 64 43 6f 6c 6c 61 TclCopyAndColla
3a40: 70 73 65 28 65 6c 65 6d 53 69 7a 65 2c 20 65 6c pse(elemSize, el
3a50: 65 6d 53 74 61 72 74 2c 20 73 29 3b 0d 0a 09 7d emStart, s);...}
3a60: 0d 0a 09 0d 0a 09 54 63 6c 4e 65 77 4f 62 6a 28 ......TclNewObj(
3a70: 6b 65 79 50 74 72 29 3b 0d 0a 20 20 20 20 20 20 keyPtr);..
3a80: 20 20 6b 65 79 50 74 72 2d 3e 62 79 74 65 73 20 keyPtr->bytes
3a90: 20 3d 20 73 3b 0d 0a 20 20 20 20 20 20 20 20 6b = s;.. k
3aa0: 65 79 50 74 72 2d 3e 6c 65 6e 67 74 68 20 3d 20 eyPtr->length =
3ab0: 65 6c 65 6d 53 69 7a 65 3b 0d 0a 0d 0a 09 70 20 elemSize;.....p
3ac0: 3d 20 6e 65 78 74 45 6c 65 6d 3b 0d 0a 09 6c 65 = nextElem;...le
3ad0: 6e 52 65 6d 61 69 6e 20 3d 20 28 6c 69 6d 69 74 nRemain = (limit
3ae0: 20 2d 20 6e 65 78 74 45 6c 65 6d 29 3b 0d 0a 09 - nextElem);...
3af0: 69 66 20 28 6c 65 6e 52 65 6d 61 69 6e 20 3c 3d if (lenRemain <=
3b00: 20 30 29 20 7b 0d 0a 09 20 20 20 20 67 6f 74 6f 0) {... goto
3b10: 20 6d 69 73 73 69 6e 67 4b 65 79 3b 0d 0a 09 7d missingKey;...}
3b20: 0d 0a 0d 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 .....result = Tc
3b30: 6c 46 69 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 lFindElement(int
3b40: 65 72 70 2c 20 70 2c 20 6c 65 6e 52 65 6d 61 69 erp, p, lenRemai
3b50: 6e 2c 0d 0a 09 09 26 65 6c 65 6d 53 74 61 72 74 n,....&elemStart
3b60: 2c 20 26 6e 65 78 74 45 6c 65 6d 2c 20 26 65 6c , &nextElem, &el
3b70: 65 6d 53 69 7a 65 2c 20 26 68 61 73 42 72 61 63 emSize, &hasBrac
3b80: 65 29 3b 0d 0a 09 69 66 20 28 72 65 73 75 6c 74 e);...if (result
3b90: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 != TCL_OK) {...
3ba0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3bb0: 6f 75 6e 74 28 6b 65 79 50 74 72 29 3b 0d 0a 09 ount(keyPtr);...
3bc0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 45 78 goto errorEx
3bd0: 69 74 3b 0d 0a 09 7d 0d 0a 09 69 66 20 28 65 6c it;...}...if (el
3be0: 65 6d 53 74 61 72 74 20 3e 3d 20 6c 69 6d 69 74 emStart >= limit
3bf0: 29 20 7b 0d 0a 09 20 20 20 20 67 6f 74 6f 20 6d ) {... goto m
3c00: 69 73 73 69 6e 67 4b 65 79 3b 0d 0a 09 7d 0d 0a issingKey;...}..
3c10: 0d 0a 09 2f 2a 0d 0a 09 20 2a 20 41 6c 6c 6f 63 .../*... * Alloc
3c20: 61 74 65 20 61 20 54 63 6c 20 6f 62 6a 65 63 74 ate a Tcl object
3c30: 20 66 6f 72 20 74 68 65 20 65 6c 65 6d 65 6e 74 for the element
3c40: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 and initialize
3c50: 69 74 20 66 72 6f 6d 20 74 68 65 0d 0a 09 20 2a it from the... *
3c60: 20 22 65 6c 65 6d 53 69 7a 65 22 20 62 79 74 65 "elemSize" byte
3c70: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 22 65 s starting at "e
3c80: 6c 65 6d 53 74 61 72 74 22 2e 0d 0a 09 20 2a 2f lemStart".... */
3c90: 0d 0a 0d 0a 09 73 20 3d 20 63 6b 61 6c 6c 6f 63 .....s = ckalloc
3ca0: 28 28 75 6e 73 69 67 6e 65 64 29 20 65 6c 65 6d ((unsigned) elem
3cb0: 53 69 7a 65 20 2b 20 31 29 3b 0d 0a 09 69 66 20 Size + 1);...if
3cc0: 28 68 61 73 42 72 61 63 65 29 20 7b 0d 0a 09 20 (hasBrace) {...
3cd0: 20 20 20 6d 65 6d 63 70 79 28 28 56 4f 49 44 20 memcpy((VOID
3ce0: 2a 29 20 73 2c 20 28 56 4f 49 44 20 2a 29 20 65 *) s, (VOID *) e
3cf0: 6c 65 6d 53 74 61 72 74 2c 20 20 28 73 69 7a 65 lemStart, (size
3d00: 5f 74 29 20 65 6c 65 6d 53 69 7a 65 29 3b 0d 0a _t) elemSize);..
3d10: 09 20 20 20 20 73 5b 65 6c 65 6d 53 69 7a 65 5d . s[elemSize]
3d20: 20 3d 20 30 3b 0d 0a 09 7d 20 65 6c 73 65 20 7b = 0;...} else {
3d30: 0d 0a 09 20 20 20 20 65 6c 65 6d 53 69 7a 65 20 ... elemSize
3d40: 3d 20 54 63 6c 43 6f 70 79 41 6e 64 43 6f 6c 6c = TclCopyAndColl
3d50: 61 70 73 65 28 65 6c 65 6d 53 69 7a 65 2c 20 65 apse(elemSize, e
3d60: 6c 65 6d 53 74 61 72 74 2c 20 73 29 3b 0d 0a 09 lemStart, s);...
3d70: 7d 0d 0a 0d 0a 09 54 63 6c 4e 65 77 4f 62 6a 28 }.....TclNewObj(
3d80: 76 61 6c 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 valuePtr);..
3d90: 20 20 20 20 76 61 6c 75 65 50 74 72 2d 3e 62 79 valuePtr->by
3da0: 74 65 73 20 20 3d 20 73 3b 0d 0a 20 20 20 20 20 tes = s;..
3db0: 20 20 20 76 61 6c 75 65 50 74 72 2d 3e 6c 65 6e valuePtr->len
3dc0: 67 74 68 20 3d 20 65 6c 65 6d 53 69 7a 65 3b 0d gth = elemSize;.
3dd0: 0a 0d 0a 09 2f 2a 0d 0a 09 20 2a 20 53 74 6f 72 ..../*... * Stor
3de0: 65 20 6b 65 79 20 61 6e 64 20 76 61 6c 75 65 20 e key and value
3df0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c in the hash tabl
3e00: 65 20 77 65 27 72 65 20 62 75 69 6c 64 69 6e 67 e we're building
3e10: 2e 0d 0a 09 20 2a 2f 0d 0a 09 68 50 74 72 20 3d .... */...hPtr =
3e20: 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 45 Tcl_CreateHashE
3e30: 6e 74 72 79 28 26 64 69 63 74 2d 3e 74 61 62 6c ntry(&dict->tabl
3e40: 65 2c 20 28 63 68 61 72 20 2a 29 6b 65 79 50 74 e, (char *)keyPt
3e50: 72 2c 20 26 69 73 4e 65 77 29 3b 0d 0a 09 69 66 r, &isNew);...if
3e60: 20 28 21 69 73 4e 65 77 29 20 7b 0d 0a 09 20 20 (!isNew) {...
3e70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 73 63 61 Tcl_Obj *disca
3e80: 72 64 65 64 56 61 6c 75 65 20 3d 20 28 54 63 6c rdedValue = (Tcl
3e90: 5f 4f 62 6a 20 2a 29 20 54 63 6c 5f 47 65 74 48 _Obj *) Tcl_GetH
3ea0: 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0d ashValue(hPtr);.
3eb0: 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 .. Tcl_DecrRe
3ec0: 66 43 6f 75 6e 74 28 6b 65 79 50 74 72 29 3b 0d fCount(keyPtr);.
3ed0: 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 .. Tcl_DecrRe
3ee0: 66 43 6f 75 6e 74 28 64 69 73 63 61 72 64 65 64 fCount(discarded
3ef0: 56 61 6c 75 65 29 3b 0d 0a 09 7d 0d 0a 09 54 63 Value);...}...Tc
3f00: 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 l_SetHashValue(h
3f10: 50 74 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Ptr, (ClientData
3f20: 29 20 76 61 6c 75 65 50 74 72 29 3b 0d 0a 09 54 ) valuePtr);...T
3f30: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
3f40: 76 61 6c 75 65 50 74 72 29 3b 20 2f 2a 20 73 69 valuePtr); /* si
3f50: 6e 63 65 20 68 61 73 68 20 6e 6f 77 20 68 6f 6c nce hash now hol
3f60: 64 73 20 72 65 66 20 74 6f 20 69 74 20 2a 2f 0d ds ref to it */.
3f70: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 69 6e 73 74 61 . }.... insta
3f80: 6c 6c 48 61 73 68 3a 0d 0a 20 20 20 20 2f 2a 0d llHash:.. /*.
3f90: 0a 20 20 20 20 20 2a 20 46 72 65 65 20 74 68 65 . * Free the
3fa0: 20 6f 6c 64 20 69 6e 74 65 72 6e 61 6c 52 65 70 old internalRep
3fb0: 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 before setting
3fc0: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 57 65 20 the new one. We
3fd0: 64 6f 20 74 68 69 73 20 61 73 0d 0a 20 20 20 20 do this as..
3fe0: 20 2a 20 6c 61 74 65 20 61 73 20 70 6f 73 73 69 * late as possi
3ff0: 62 6c 65 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 ble to allow the
4000: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 6f 64 65 conversion code
4010: 2c 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 0d , in particular.
4020: 0a 20 20 20 20 20 2a 20 54 63 6c 5f 47 65 74 53 . * Tcl_GetS
4030: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 2c 20 74 6f tringFromObj, to
4040: 20 75 73 65 20 74 68 61 74 20 6f 6c 64 20 69 6e use that old in
4050: 74 65 72 6e 61 6c 52 65 70 2e 0d 0a 20 20 20 20 ternalRep...
4060: 20 2a 2f 0d 0a 0d 0a 20 20 20 20 69 66 20 28 28 */.... if ((
4070: 6f 6c 64 54 79 70 65 50 74 72 20 21 3d 20 4e 55 oldTypePtr != NU
4080: 4c 4c 29 20 26 26 20 28 6f 6c 64 54 79 70 65 50 LL) && (oldTypeP
4090: 74 72 2d 3e 66 72 65 65 49 6e 74 52 65 70 50 72 tr->freeIntRepPr
40a0: 6f 63 20 21 3d 20 4e 55 4c 4c 29 29 20 7b 0d 0a oc != NULL)) {..
40b0: 09 6f 6c 64 54 79 70 65 50 74 72 2d 3e 66 72 65 .oldTypePtr->fre
40c0: 65 49 6e 74 52 65 70 50 72 6f 63 28 6f 62 6a 50 eIntRepProc(objP
40d0: 74 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 tr);.. }....
40e0: 20 20 20 64 69 63 74 2d 3e 65 70 6f 63 68 20 3d dict->epoch =
40f0: 20 30 3b 0d 0a 20 20 20 20 64 69 63 74 2d 3e 63 0;.. dict->c
4100: 68 61 69 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 hain = NULL;..
4110: 20 20 64 69 63 74 2d 3e 72 65 66 63 6f 75 6e 74 dict->refcount
4120: 20 3d 20 31 3b 0d 0a 20 20 20 20 6f 62 6a 50 74 = 1;.. objPt
4130: 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e 6f r->internalRep.o
4140: 74 68 65 72 56 61 6c 75 65 50 74 72 20 3d 20 28 therValuePtr = (
4150: 56 4f 49 44 20 2a 29 20 64 69 63 74 3b 0d 0a 20 VOID *) dict;..
4160: 20 20 20 6f 62 6a 50 74 72 2d 3e 74 79 70 65 50 objPtr->typeP
4170: 74 72 20 3d 20 26 74 63 6c 44 69 63 74 54 79 70 tr = &tclDictTyp
4180: 65 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 e;.. return T
4190: 43 4c 5f 4f 4b 3b 0d 0a 0d 0a 20 6d 69 73 73 69 CL_OK;.... missi
41a0: 6e 67 4b 65 79 3a 0d 0a 20 20 20 20 69 66 20 28 ngKey:.. if (
41b0: 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 interp != NULL)
41c0: 7b 0d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {...Tcl_SetObjRe
41d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0d 0a 09 09 sult(interp,....
41e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
41f0: 28 22 6d 69 73 73 69 6e 67 20 76 61 6c 75 65 20 ("missing value
4200: 74 6f 20 67 6f 20 77 69 74 68 20 6b 65 79 22 2c to go with key",
4210: 20 2d 31 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 -1));.. }..
4220: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
4230: 75 6e 74 28 6b 65 79 50 74 72 29 3b 0d 0a 20 20 unt(keyPtr);..
4240: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 result = TCL_E
4250: 52 52 4f 52 3b 0d 0a 20 65 72 72 6f 72 45 78 69 RROR;.. errorExi
4260: 74 3a 0d 0a 20 20 20 20 66 6f 72 20 28 68 50 74 t:.. for (hPt
4270: 72 3d 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 r=Tcl_FirstHashE
4280: 6e 74 72 79 28 26 64 69 63 74 2d 3e 74 61 62 6c ntry(&dict->tabl
4290: 65 2c 26 73 65 61 72 63 68 29 3b 0d 0a 09 20 20 e,&search);...
42a0: 20 68 50 74 72 21 3d 4e 55 4c 4c 20 3b 20 68 50 hPtr!=NULL ; hP
42b0: 74 72 3d 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 tr=Tcl_NextHashE
42c0: 6e 74 72 79 28 26 73 65 61 72 63 68 29 29 20 7b ntry(&search)) {
42d0: 0d 0a 09 76 61 6c 75 65 50 74 72 20 3d 20 28 54 ...valuePtr = (T
42e0: 63 6c 5f 4f 62 6a 20 2a 29 20 54 63 6c 5f 47 65 cl_Obj *) Tcl_Ge
42f0: 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 tHashValue(hPtr)
4300: 3b 0d 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 ;...Tcl_DecrRefC
4310: 6f 75 6e 74 28 76 61 6c 75 65 50 74 72 29 3b 0d ount(valuePtr);.
4320: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
4330: 44 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28 DeleteHashTable(
4340: 26 64 69 63 74 2d 3e 74 61 62 6c 65 29 3b 0d 0a &dict->table);..
4350: 20 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 ckfree((char
4360: 20 2a 29 20 64 69 63 74 29 3b 0d 0a 20 20 20 20 *) dict);..
4370: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a return result;..
4380: 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d }...../*.. *----
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43d0: 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 54 72 61 63 65 --.. *.. * Trace
43e0: 44 69 63 74 50 61 74 68 20 2d 2d 0d 0a 20 2a 0d DictPath --.. *.
43f0: 0a 20 2a 09 54 72 61 63 65 20 74 68 72 6f 75 67 . *.Trace throug
4400: 68 20 61 20 74 72 65 65 20 6f 66 20 64 69 63 74 h a tree of dict
4410: 69 6f 6e 61 72 69 65 73 20 75 73 69 6e 67 20 74 ionaries using t
4420: 68 65 20 61 72 72 61 79 20 6f 66 20 6b 65 79 73 he array of keys
4430: 0d 0a 20 2a 09 67 69 76 65 6e 2e 20 49 66 20 74 .. *.given. If t
4440: 68 65 20 77 69 6c 6c 55 70 64 61 74 65 20 66 6c he willUpdate fl
4450: 61 67 20 69 73 20 73 65 74 2c 20 61 20 62 61 63 ag is set, a bac
4460: 6b 77 61 72 64 2d 70 6f 69 6e 74 69 6e 67 20 63 kward-pointing c
4470: 68 61 69 6e 0d 0a 20 2a 09 6f 66 20 64 69 63 74 hain.. *.of dict
4480: 69 6f 6e 61 72 69 65 73 20 69 73 20 61 6c 73 6f ionaries is also
4490: 20 62 75 69 6c 74 20 28 69 6e 20 74 68 65 20 44 built (in the D
44a0: 69 63 74 27 73 20 63 68 61 69 6e 20 66 69 65 6c ict's chain fiel
44b0: 64 29 20 61 6e 64 0d 0a 20 2a 09 74 68 65 20 63 d) and.. *.the c
44c0: 68 61 69 6e 65 64 20 64 69 63 74 69 6f 6e 61 72 hained dictionar
44d0: 69 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 74 ies are made int
44e0: 6f 20 75 6e 73 68 61 72 65 64 20 64 69 63 74 69 o unshared dicti
44f0: 6f 6e 61 72 69 65 73 20 28 69 66 0d 0a 20 2a 09 onaries (if.. *.
4500: 74 68 65 79 20 61 72 65 6e 27 74 20 61 6c 72 65 they aren't alre
4510: 61 64 79 2e 29 0d 0a 20 2a 0d 0a 20 2a 20 52 65 ady.).. *.. * Re
4520: 73 75 6c 74 73 3a 0d 0a 20 2a 09 54 68 65 20 6f sults:.. *.The o
4530: 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 bject at the end
4540: 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6f 72 of the path, or
4550: 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 77 NULL if there w
4560: 61 73 20 61 6e 20 65 72 72 6f 72 2e 0d 0a 20 2a as an error... *
4570: 09 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 .Note that this
4580: 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66 it is an error f
4590: 6f 72 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 or an intermedia
45a0: 74 65 20 64 69 63 74 69 6f 6e 61 72 79 20 6f 6e te dictionary on
45b0: 0d 0a 20 2a 09 74 68 65 20 70 61 74 68 20 74 6f .. *.the path to
45c0: 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 2a 0d not exist... *.
45d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
45e0: 3a 0d 0a 20 2a 09 49 66 20 74 68 65 20 77 69 6c :.. *.If the wil
45f0: 6c 55 70 64 61 74 65 20 66 6c 61 67 20 69 73 20 lUpdate flag is
4600: 66 61 6c 73 65 2c 20 74 68 65 72 65 20 61 72 65 false, there are
4610: 20 6e 6f 20 73 69 64 65 20 65 66 66 65 63 74 73 no side effects
4620: 20 28 6f 74 68 65 72 0d 0a 20 2a 09 74 68 61 6e (other.. *.than
4630: 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 76 65 potential conve
4640: 72 73 69 6f 6e 20 6f 66 20 6f 62 6a 65 63 74 73 rsion of objects
4650: 20 74 6f 20 64 69 63 74 69 6f 6e 61 72 69 65 73 to dictionaries
4660: 2e 29 20 20 49 66 20 74 68 65 0d 0a 20 2a 09 77 .) If the.. *.w
4670: 69 6c 6c 55 70 64 61 74 65 20 66 6c 61 67 20 69 illUpdate flag i
4680: 73 20 74 72 75 65 2c 20 74 68 65 20 66 6f 6c 6c s true, the foll
4690: 6f 77 69 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c owing additional
46a0: 20 73 69 64 65 20 65 66 66 65 63 74 73 0d 0a 20 side effects..
46b0: 2a 09 6f 63 63 75 72 2e 20 20 53 68 61 72 65 64 *.occur. Shared
46c0: 20 64 69 63 74 69 6f 6e 61 72 69 65 73 20 61 6c dictionaries al
46d0: 6f 6e 67 20 74 68 65 20 70 61 74 68 20 61 72 65 ong the path are
46e0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0d converted into.
46f0: 0a 20 2a 09 75 6e 73 68 61 72 65 64 20 6f 62 6a . *.unshared obj
4700: 65 63 74 73 2c 20 61 6e 64 20 61 20 62 61 63 6b ects, and a back
4710: 77 61 72 64 2d 70 6f 69 6e 74 69 6e 67 20 63 68 ward-pointing ch
4720: 61 69 6e 20 69 73 20 62 75 69 6c 74 20 75 73 69 ain is built usi
4730: 6e 67 0d 0a 20 2a 09 74 68 65 20 63 68 61 69 6e ng.. *.the chain
4740: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 64 fields of the d
4750: 69 63 74 69 6f 6e 61 72 69 65 73 20 28 66 6f 72 ictionaries (for
4760: 20 65 61 73 79 20 69 6e 76 61 6c 69 64 61 74 69 easy invalidati
4770: 6f 6e 20 6f 66 0d 0a 20 2a 09 73 74 72 69 6e 67 on of.. *.string
4780: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 representations
4790: 2e 29 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d .).. *.. *------
47a0: 2d 2d 2d 2d 2d 2d 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: 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 .. */....static
47f0: 54 63 6c 5f 4f 62 6a 20 2a 0d 0a 54 72 61 63 65 Tcl_Obj *..Trace
4800: 44 69 63 74 50 61 74 68 28 69 6e 74 65 72 70 2c DictPath(interp,
4810: 20 64 69 63 74 50 74 72 2c 20 6b 65 79 63 2c 20 dictPtr, keyc,
4820: 6b 65 79 76 2c 20 77 69 6c 6c 55 70 64 61 74 65 keyv, willUpdate
4830: 29 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ).. Tcl_Inter
4840: 70 20 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 p *interp;..
4850: 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 Tcl_Obj *dictPtr
4860: 2c 20 2a 43 4f 4e 53 54 20 6b 65 79 76 5b 5d 3b , *CONST keyv[];
4870: 0d 0a 20 20 20 20 69 6e 74 20 6b 65 79 63 2c 20 .. int keyc,
4880: 77 69 6c 6c 55 70 64 61 74 65 3b 0d 0a 7b 0d 0a willUpdate;..{..
4890: 20 20 20 20 44 69 63 74 20 2a 64 69 63 74 2c 20 Dict *dict,
48a0: 2a 6e 65 77 44 69 63 74 3b 0d 0a 20 20 20 20 69 *newDict;.. i
48b0: 6e 74 20 69 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 nt i;.... if
48c0: 28 64 69 63 74 50 74 72 2d 3e 74 79 70 65 50 74 (dictPtr->typePt
48d0: 72 20 21 3d 20 26 74 63 6c 44 69 63 74 54 79 70 r != &tclDictTyp
48e0: 65 29 20 7b 0d 0a 09 69 66 20 28 53 65 74 44 69 e) {...if (SetDi
48f0: 63 74 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72 70 ctFromAny(interp
4900: 2c 20 64 69 63 74 50 74 72 29 20 21 3d 20 54 43 , dictPtr) != TC
4910: 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 72 65 L_OK) {... re
4920: 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a 09 7d 0d 0a turn NULL;...}..
4930: 20 20 20 20 7d 0d 0a 20 20 20 20 64 69 63 74 20 }.. dict
4940: 3d 20 28 44 69 63 74 20 2a 29 20 64 69 63 74 50 = (Dict *) dictP
4950: 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e tr->internalRep.
4960: 6f 74 68 65 72 56 61 6c 75 65 50 74 72 3b 0d 0a otherValuePtr;..
4970: 20 20 20 20 69 66 20 28 77 69 6c 6c 55 70 64 61 if (willUpda
4980: 74 65 29 20 7b 0d 0a 09 64 69 63 74 2d 3e 63 68 te) {...dict->ch
4990: 61 69 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 20 ain = NULL;..
49a0: 20 7d 0d 0a 0d 0a 20 20 20 20 66 6f 72 20 28 69 }.... for (i
49b0: 3d 30 20 3b 20 69 3c 6b 65 79 63 20 3b 20 69 2b =0 ; i<keyc ; i+
49c0: 2b 29 20 7b 0d 0a 09 54 63 6c 5f 48 61 73 68 45 +) {...Tcl_HashE
49d0: 6e 74 72 79 20 2a 68 50 74 72 20 3d 20 54 63 6c ntry *hPtr = Tcl
49e0: 5f 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 _FindHashEntry(&
49f0: 64 69 63 74 2d 3e 74 61 62 6c 65 2c 20 28 63 68 dict->table, (ch
4a00: 61 72 20 2a 29 6b 65 79 76 5b 69 5d 29 3b 0d 0a ar *)keyv[i]);..
4a10: 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 4f 62 6a .Tcl_Obj *tmpObj
4a20: 3b 0d 0a 0d 0a 09 69 66 20 28 68 50 74 72 20 3d ;.....if (hPtr =
4a30: 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 20 20 20 20 = NULL) {...
4a40: 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 if (interp != NU
4a50: 4c 4c 29 20 7b 0d 0a 09 09 54 63 6c 5f 52 65 73 LL) {....Tcl_Res
4a60: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
4a70: 3b 0d 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 53 ;....Tcl_AppendS
4a80: 74 72 69 6e 67 73 54 6f 4f 62 6a 28 54 63 6c 5f tringsToObj(Tcl_
4a90: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
4aa0: 65 72 70 29 2c 0d 0a 09 09 09 22 6b 65 79 20 5c erp),....."key \
4ab0: 22 22 2c 20 54 63 6c 47 65 74 53 74 72 69 6e 67 "", TclGetString
4ac0: 28 6b 65 79 76 5b 69 5d 29 2c 0d 0a 09 09 09 22 (keyv[i]),....."
4ad0: 5c 22 20 6e 6f 74 20 6b 6e 6f 77 6e 20 69 6e 20 \" not known in
4ae0: 64 69 63 74 69 6f 6e 61 72 79 22 2c 20 4e 55 4c dictionary", NUL
4af0: 4c 29 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 20 20 L);... }...
4b00: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a return NULL;..
4b10: 09 7d 0d 0a 0d 0a 09 74 6d 70 4f 62 6a 20 3d 20 .}.....tmpObj =
4b20: 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 54 63 6c 5f (Tcl_Obj *) Tcl_
4b30: 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 GetHashValue(hPt
4b40: 72 29 3b 0d 0a 09 69 66 20 28 74 6d 70 4f 62 6a r);...if (tmpObj
4b50: 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26 74 63 ->typePtr != &tc
4b60: 6c 44 69 63 74 54 79 70 65 29 20 7b 0d 0a 09 20 lDictType) {...
4b70: 20 20 20 69 66 20 28 53 65 74 44 69 63 74 46 72 if (SetDictFr
4b80: 6f 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20 74 6d omAny(interp, tm
4b90: 70 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 pObj) != TCL_OK)
4ba0: 20 7b 0d 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c {....return NUL
4bb0: 4c 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 7d 0d 0a L;... }...}..
4bc0: 09 6e 65 77 44 69 63 74 20 3d 20 28 44 69 63 74 .newDict = (Dict
4bd0: 20 2a 29 20 74 6d 70 4f 62 6a 2d 3e 69 6e 74 65 *) tmpObj->inte
4be0: 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 61 6c rnalRep.otherVal
4bf0: 75 65 50 74 72 3b 0d 0a 09 69 66 20 28 77 69 6c uePtr;...if (wil
4c00: 6c 55 70 64 61 74 65 29 20 7b 0d 0a 09 20 20 20 lUpdate) {...
4c10: 20 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 if (Tcl_IsShare
4c20: 64 28 74 6d 70 4f 62 6a 29 29 20 7b 0d 0a 09 09 d(tmpObj)) {....
4c30: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4c40: 28 74 6d 70 4f 62 6a 29 3b 0d 0a 09 09 74 6d 70 (tmpObj);....tmp
4c50: 4f 62 6a 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Obj = Tcl_Duplic
4c60: 61 74 65 4f 62 6a 28 74 6d 70 4f 62 6a 29 3b 0d ateObj(tmpObj);.
4c70: 0a 09 09 54 63 6c 5f 53 65 74 48 61 73 68 56 61 ...Tcl_SetHashVa
4c80: 6c 75 65 28 68 50 74 72 2c 20 28 43 6c 69 65 6e lue(hPtr, (Clien
4c90: 74 44 61 74 61 29 20 74 6d 70 4f 62 6a 29 3b 0d tData) tmpObj);.
4ca0: 0a 09 09 64 69 63 74 2d 3e 65 70 6f 63 68 2b 2b ...dict->epoch++
4cb0: 3b 0d 0a 09 09 6e 65 77 44 69 63 74 20 3d 20 28 ;....newDict = (
4cc0: 44 69 63 74 20 2a 29 20 74 6d 70 4f 62 6a 2d 3e Dict *) tmpObj->
4cd0: 69 6e 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 internalRep.othe
4ce0: 72 56 61 6c 75 65 50 74 72 3b 0d 0a 09 20 20 20 rValuePtr;...
4cf0: 20 7d 0d 0a 0d 0a 09 20 20 20 20 6e 65 77 44 69 }..... newDi
4d00: 63 74 2d 3e 63 68 61 69 6e 20 3d 20 64 69 63 74 ct->chain = dict
4d10: 50 74 72 3b 0d 0a 09 7d 0d 0a 09 64 69 63 74 20 Ptr;...}...dict
4d20: 3d 20 6e 65 77 44 69 63 74 3b 0d 0a 09 64 69 63 = newDict;...dic
4d30: 74 50 74 72 20 3d 20 74 6d 70 4f 62 6a 3b 0d 0a tPtr = tmpObj;..
4d40: 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 }.. retur
4d50: 6e 20 64 69 63 74 50 74 72 3b 0d 0a 7d 0d 0a 73 n dictPtr;..}..s
4d60: 74 61 74 69 63 20 76 6f 69 64 0d 0a 49 6e 76 61 tatic void..Inva
4d70: 6c 69 64 61 74 65 44 69 63 74 43 68 61 69 6e 28 lidateDictChain(
4d80: 64 69 63 74 4f 62 6a 29 0d 0a 20 20 20 20 54 63 dictObj).. Tc
4d90: 6c 5f 4f 62 6a 20 2a 64 69 63 74 4f 62 6a 3b 0d l_Obj *dictObj;.
4da0: 0a 7b 0d 0a 20 20 20 20 44 69 63 74 20 2a 64 69 .{.. Dict *di
4db0: 63 74 20 3d 20 28 44 69 63 74 20 2a 29 20 64 69 ct = (Dict *) di
4dc0: 63 74 4f 62 6a 2d 3e 69 6e 74 65 72 6e 61 6c 52 ctObj->internalR
4dd0: 65 70 2e 6f 74 68 65 72 56 61 6c 75 65 50 74 72 ep.otherValuePtr
4de0: 3b 0d 0a 0d 0a 20 20 20 20 64 6f 20 7b 0d 0a 09 ;.... do {...
4df0: 69 66 20 28 64 69 63 74 4f 62 6a 2d 3e 62 79 74 if (dictObj->byt
4e00: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 es != NULL) {...
4e10: 20 20 20 20 54 63 6c 5f 49 6e 76 61 6c 69 64 61 Tcl_Invalida
4e20: 74 65 53 74 72 69 6e 67 52 65 70 28 64 69 63 74 teStringRep(dict
4e30: 4f 62 6a 29 3b 0d 0a 09 7d 0d 0a 09 64 69 63 74 Obj);...}...dict
4e40: 2d 3e 65 70 6f 63 68 2b 2b 3b 0d 0a 09 69 66 20 ->epoch++;...if
4e50: 28 28 64 69 63 74 4f 62 6a 20 3d 20 64 69 63 74 ((dictObj = dict
4e60: 2d 3e 63 68 61 69 6e 29 20 3d 3d 20 4e 55 4c 4c ->chain) == NULL
4e70: 29 20 7b 0d 0a 09 20 20 20 20 62 72 65 61 6b 3b ) {... break;
4e80: 0d 0a 09 7d 0d 0a 09 64 69 63 74 2d 3e 63 68 61 ...}...dict->cha
4e90: 69 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a 09 64 69 63 in = NULL;...dic
4ea0: 74 20 3d 20 28 44 69 63 74 20 2a 29 20 64 69 63 t = (Dict *) dic
4eb0: 74 4f 62 6a 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 tObj->internalRe
4ec0: 70 2e 6f 74 68 65 72 56 61 6c 75 65 50 74 72 3b p.otherValuePtr;
4ed0: 0d 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 64 .. } while (d
4ee0: 69 63 74 20 21 3d 20 4e 55 4c 4c 29 3b 0d 0a 7d ict != NULL);..}
4ef0: 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d ...../*.. *-----
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f40: 2d 0d 0a 20 2a 0d 0a 20 2a 20 54 63 6c 5f 44 69 -.. *.. * Tcl_Di
4f50: 63 74 4f 62 6a 50 75 74 20 2d 2d 0d 0a 20 2a 0d ctObjPut --.. *.
4f60: 0a 20 2a 09 41 64 64 20 61 20 6b 65 79 2c 76 61 . *.Add a key,va
4f70: 6c 75 65 20 70 61 69 72 20 74 6f 20 61 20 64 69 lue pair to a di
4f80: 63 74 69 6f 6e 61 72 79 2c 20 6f 72 20 75 70 64 ctionary, or upd
4f90: 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f ate the value fo
4fa0: 72 20 61 0d 0a 20 2a 09 6b 65 79 20 69 66 20 74 r a.. *.key if t
4fb0: 68 61 74 20 6b 65 79 20 61 6c 72 65 61 64 79 20 hat key already
4fc0: 68 61 73 20 61 20 6d 61 70 70 69 6e 67 20 69 6e has a mapping in
4fd0: 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 2e the dictionary.
4fe0: 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 6c 74 73 .. *.. * Results
4ff0: 3a 0d 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 :.. *.A standard
5000: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0d 0a 20 2a Tcl result... *
5010: 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 .. * Side effect
5020: 73 3a 0d 0a 20 2a 09 54 68 65 20 6f 62 6a 65 63 s:.. *.The objec
5030: 74 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 t pointed to by
5040: 64 69 63 74 50 74 72 20 69 73 20 63 6f 6e 76 65 dictPtr is conve
5050: 72 74 65 64 20 74 6f 20 61 20 64 69 63 74 69 6f rted to a dictio
5060: 6e 61 72 79 20 69 66 0d 0a 20 2a 09 69 74 20 69 nary if.. *.it i
5070: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e s not already on
5080: 65 2c 20 61 6e 64 20 61 6e 79 20 73 74 72 69 6e e, and any strin
5090: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e g representation
50a0: 20 74 68 61 74 20 69 74 20 68 61 73 0d 0a 20 2a that it has.. *
50b0: 09 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 2e .is invalidated.
50c0: 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .. *.. *--------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a --------------..
5110: 20 2a 2f 0d 0a 0d 0a 69 6e 74 0d 0a 54 63 6c 5f */....int..Tcl_
5120: 44 69 63 74 4f 62 6a 50 75 74 28 69 6e 74 65 72 DictObjPut(inter
5130: 70 2c 20 64 69 63 74 50 74 72 2c 20 6b 65 79 50 p, dictPtr, keyP
5140: 74 72 2c 20 76 61 6c 75 65 50 74 72 29 0d 0a 20 tr, valuePtr)..
5150: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
5160: 6e 74 65 72 70 3b 0d 0a 20 20 20 20 54 63 6c 5f nterp;.. Tcl_
5170: 4f 62 6a 20 2a 64 69 63 74 50 74 72 2c 20 2a 6b Obj *dictPtr, *k
5180: 65 79 50 74 72 2c 20 2a 76 61 6c 75 65 50 74 72 eyPtr, *valuePtr
5190: 3b 0d 0a 7b 0d 0a 20 20 20 20 44 69 63 74 20 2a ;..{.. Dict *
51a0: 64 69 63 74 3b 0d 0a 20 20 20 20 54 63 6c 5f 48 dict;.. Tcl_H
51b0: 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0d ashEntry *hPtr;.
51c0: 0a 20 20 20 20 69 6e 74 20 69 73 4e 65 77 3b 0d . int isNew;.
51d0: 0a 0d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 ... if (Tcl_I
51e0: 73 53 68 61 72 65 64 28 64 69 63 74 50 74 72 29 sShared(dictPtr)
51f0: 29 20 7b 0d 0a 09 70 61 6e 69 63 28 22 54 63 6c ) {...panic("Tcl
5200: 5f 44 69 63 74 4f 62 6a 50 75 74 20 63 61 6c 6c _DictObjPut call
5210: 65 64 20 77 69 74 68 20 73 68 61 72 65 64 20 6f ed with shared o
5220: 62 6a 65 63 74 22 29 3b 0d 0a 20 20 20 20 7d 0d bject");.. }.
5230: 0a 0d 0a 20 20 20 20 69 66 20 28 64 69 63 74 50 ... if (dictP
5240: 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26 tr->typePtr != &
5250: 74 63 6c 44 69 63 74 54 79 70 65 29 20 7b 0d 0a tclDictType) {..
5260: 09 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 53 65 .int result = Se
5270: 74 44 69 63 74 46 72 6f 6d 41 6e 79 28 69 6e 74 tDictFromAny(int
5280: 65 72 70 2c 20 64 69 63 74 50 74 72 29 3b 0d 0a erp, dictPtr);..
5290: 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 .if (result != T
52a0: 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 72 CL_OK) {... r
52b0: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 09 eturn result;...
52c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 }.. }....
52d0: 69 66 20 28 64 69 63 74 50 74 72 2d 3e 62 79 74 if (dictPtr->byt
52e0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 es != NULL) {...
52f0: 54 63 6c 5f 49 6e 76 61 6c 69 64 61 74 65 53 74 Tcl_InvalidateSt
5300: 72 69 6e 67 52 65 70 28 64 69 63 74 50 74 72 29 ringRep(dictPtr)
5310: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 64 69 ;.. }.. di
5320: 63 74 20 3d 20 28 44 69 63 74 20 2a 29 20 64 69 ct = (Dict *) di
5330: 63 74 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 ctPtr->internalR
5340: 65 70 2e 6f 74 68 65 72 56 61 6c 75 65 50 74 72 ep.otherValuePtr
5350: 3b 0d 0a 20 20 20 20 68 50 74 72 20 3d 20 54 63 ;.. hPtr = Tc
5360: 6c 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 l_CreateHashEntr
5370: 79 28 26 64 69 63 74 2d 3e 74 61 62 6c 65 2c 20 y(&dict->table,
5380: 28 63 68 61 72 20 2a 29 6b 65 79 50 74 72 2c 20 (char *)keyPtr,
5390: 26 69 73 4e 65 77 29 3b 0d 0a 20 20 20 20 54 63 &isNew);.. Tc
53a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 l_IncrRefCount(v
53b0: 61 6c 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 69 aluePtr);.. i
53c0: 66 20 28 21 69 73 4e 65 77 29 20 7b 0d 0a 09 54 f (!isNew) {...T
53d0: 63 6c 5f 4f 62 6a 20 2a 6f 6c 64 56 61 6c 75 65 cl_Obj *oldValue
53e0: 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a Ptr = (Tcl_Obj *
53f0: 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c ) Tcl_GetHashVal
5400: 75 65 28 68 50 74 72 29 3b 0d 0a 09 54 63 6c 5f ue(hPtr);...Tcl_
5410: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 6c 64 DecrRefCount(old
5420: 56 61 6c 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 ValuePtr);..
5430: 7d 0d 0a 20 20 20 20 54 63 6c 5f 53 65 74 48 61 }.. Tcl_SetHa
5440: 73 68 56 61 6c 75 65 28 68 50 74 72 2c 20 76 61 shValue(hPtr, va
5450: 6c 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 64 69 luePtr);.. di
5460: 63 74 2d 3e 65 70 6f 63 68 2b 2b 3b 0d 0a 20 20 ct->epoch++;..
5470: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
5480: 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d ..}...../*.. *--
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 54 63 6c ----.. *.. * Tcl
54e0: 5f 44 69 63 74 4f 62 6a 47 65 74 20 2d 2d 0d 0a _DictObjGet --..
54f0: 20 2a 0d 0a 20 2a 09 47 69 76 65 6e 20 61 20 6b *.. *.Given a k
5500: 65 79 2c 20 67 65 74 20 69 74 73 20 76 61 6c 75 ey, get its valu
5510: 65 20 66 72 6f 6d 20 74 68 65 20 64 69 63 74 69 e from the dicti
5520: 6f 6e 61 72 79 20 28 6f 72 20 4e 55 4c 4c 20 69 onary (or NULL i
5530: 66 20 6b 65 79 0d 0a 20 2a 09 69 73 20 6e 6f 74 f key.. *.is not
5540: 20 66 6f 75 6e 64 20 69 6e 20 64 69 63 74 69 6f found in dictio
5550: 6e 61 72 79 2e 29 0d 0a 20 2a 0d 0a 20 2a 20 52 nary.).. *.. * R
5560: 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 esults:.. *.A st
5570: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
5580: 74 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 t. The variable
5590: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 76 pointed to by v
55a0: 61 6c 75 65 50 74 72 50 74 72 0d 0a 20 2a 09 69 aluePtrPtr.. *.i
55b0: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 s updated with t
55c0: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 he value for the
55d0: 20 6b 65 79 2e 20 20 4e 6f 74 65 20 74 68 61 74 key. Note that
55e0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 0d 0a 20 it is not an..
55f0: 2a 09 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 *.error for the
5600: 6b 65 79 20 74 6f 20 68 61 76 65 20 6e 6f 20 6d key to have no m
5610: 61 70 70 69 6e 67 20 69 6e 20 74 68 65 20 64 69 apping in the di
5620: 63 74 69 6f 6e 61 72 79 2e 0d 0a 20 2a 0d 0a 20 ctionary... *..
5630: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0d * Side effects:.
5640: 0a 20 2a 09 54 68 65 20 6f 62 6a 65 63 74 20 70 . *.The object p
5650: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 64 69 63 ointed to by dic
5660: 74 50 74 72 20 69 73 20 63 6f 6e 76 65 72 74 65 tPtr is converte
5670: 64 20 74 6f 20 61 20 64 69 63 74 69 6f 6e 61 72 d to a dictionar
5680: 79 20 69 66 0d 0a 20 2a 09 69 74 20 69 73 20 6e y if.. *.it is n
5690: 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e 65 2e 0d ot already one..
56a0: 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.. *---------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0d 0a 20 -------------..
56f0: 2a 2f 0d 0a 0d 0a 69 6e 74 0d 0a 54 63 6c 5f 44 */....int..Tcl_D
5700: 69 63 74 4f 62 6a 47 65 74 28 69 6e 74 65 72 70 ictObjGet(interp
5710: 2c 20 64 69 63 74 50 74 72 2c 20 6b 65 79 50 74 , dictPtr, keyPt
5720: 72 2c 20 76 61 6c 75 65 50 74 72 50 74 72 29 0d r, valuePtrPtr).
5730: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
5740: 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 54 63 *interp;.. Tc
5750: 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 2c 20 l_Obj *dictPtr,
5760: 2a 6b 65 79 50 74 72 2c 20 2a 2a 76 61 6c 75 65 *keyPtr, **value
5770: 50 74 72 50 74 72 3b 0d 0a 7b 0d 0a 20 20 20 20 PtrPtr;..{..
5780: 44 69 63 74 20 2a 64 69 63 74 3b 0d 0a 20 20 20 Dict *dict;..
5790: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a Tcl_HashEntry *
57a0: 68 50 74 72 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 hPtr;.... if
57b0: 28 64 69 63 74 50 74 72 2d 3e 74 79 70 65 50 74 (dictPtr->typePt
57c0: 72 20 21 3d 20 26 74 63 6c 44 69 63 74 54 79 70 r != &tclDictTyp
57d0: 65 29 20 7b 0d 0a 09 69 6e 74 20 72 65 73 75 6c e) {...int resul
57e0: 74 20 3d 20 53 65 74 44 69 63 74 46 72 6f 6d 41 t = SetDictFromA
57f0: 6e 79 28 69 6e 74 65 72 70 2c 20 64 69 63 74 50 ny(interp, dictP
5800: 74 72 29 3b 0d 0a 09 69 66 20 28 72 65 73 75 6c tr);...if (resul
5810: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a t != TCL_OK) {..
5820: 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 . return resu
5830: 6c 74 3b 0d 0a 09 7d 0d 0a 20 20 20 20 7d 0d 0a lt;...}.. }..
5840: 0d 0a 20 20 20 20 64 69 63 74 20 3d 20 28 44 69 .. dict = (Di
5850: 63 74 20 2a 29 20 64 69 63 74 50 74 72 2d 3e 69 ct *) dictPtr->i
5860: 6e 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 nternalRep.other
5870: 56 61 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 68 ValuePtr;.. h
5880: 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61 Ptr = Tcl_FindHa
5890: 73 68 45 6e 74 72 79 28 26 64 69 63 74 2d 3e 74 shEntry(&dict->t
58a0: 61 62 6c 65 2c 20 28 63 68 61 72 20 2a 29 6b 65 able, (char *)ke
58b0: 79 50 74 72 29 3b 0d 0a 20 20 20 20 69 66 20 28 yPtr);.. if (
58c0: 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d hPtr == NULL) {.
58d0: 0a 09 2a 76 61 6c 75 65 50 74 72 50 74 72 20 3d ..*valuePtrPtr =
58e0: 20 4e 55 4c 4c 3b 0d 0a 20 20 20 20 7d 20 65 6c NULL;.. } el
58f0: 73 65 20 7b 0d 0a 09 2a 76 61 6c 75 65 50 74 72 se {...*valuePtr
5900: 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a Ptr = (Tcl_Obj *
5910: 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c ) Tcl_GetHashVal
5920: 75 65 28 68 50 74 72 29 3b 0d 0a 20 20 20 20 7d ue(hPtr);.. }
5930: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5940: 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a _OK;..}...../*..
5950: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a --------.. *.. *
59a0: 20 54 63 6c 5f 44 69 63 74 4f 62 6a 52 65 6d 6f Tcl_DictObjRemo
59b0: 76 65 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 52 65 ve --.. *.. *.Re
59c0: 6d 6f 76 65 20 74 68 65 20 6b 65 79 2c 76 61 6c move the key,val
59d0: 75 65 20 70 61 69 72 20 77 69 74 68 20 74 68 65 ue pair with the
59e0: 20 67 69 76 65 6e 20 6b 65 79 20 66 72 6f 6d 20 given key from
59f0: 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 3b 0d the dictionary;.
5a00: 0a 20 2a 09 74 68 65 20 6b 65 79 20 64 6f 65 73 . *.the key does
5a10: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 not need to be
5a20: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 present in the d
5a30: 69 63 74 69 6f 6e 61 72 79 2e 0d 0a 20 2a 0d 0a ictionary... *..
5a40: 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 * Results:.. *.
5a50: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
5a60: 65 73 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 esult... *.. * S
5a70: 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a ide effects:.. *
5a80: 09 54 68 65 20 6f 62 6a 65 63 74 20 70 6f 69 6e .The object poin
5a90: 74 65 64 20 74 6f 20 62 79 20 64 69 63 74 50 74 ted to by dictPt
5aa0: 72 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 r is converted t
5ab0: 6f 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 69 o a dictionary i
5ac0: 66 0d 0a 20 2a 09 69 74 20 69 73 20 6e 6f 74 20 f.. *.it is not
5ad0: 61 6c 72 65 61 64 79 20 6f 6e 65 2c 20 61 6e 64 already one, and
5ae0: 20 61 6e 79 20 73 74 72 69 6e 67 20 72 65 70 72 any string repr
5af0: 65 73 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 esentation that
5b00: 69 74 20 68 61 73 0d 0a 20 2a 09 69 73 20 69 6e it has.. *.is in
5b10: 76 61 6c 69 64 61 74 65 64 2e 0d 0a 20 2a 0d 0a validated... *..
5b20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d --------.. */...
5b70: 0a 69 6e 74 0d 0a 54 63 6c 5f 44 69 63 74 4f 62 .int..Tcl_DictOb
5b80: 6a 52 65 6d 6f 76 65 28 69 6e 74 65 72 70 2c 20 jRemove(interp,
5b90: 64 69 63 74 50 74 72 2c 20 6b 65 79 50 74 72 29 dictPtr, keyPtr)
5ba0: 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .. Tcl_Interp
5bb0: 20 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 54 *interp;.. T
5bc0: 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 2c cl_Obj *dictPtr,
5bd0: 20 2a 6b 65 79 50 74 72 3b 0d 0a 7b 0d 0a 20 20 *keyPtr;..{..
5be0: 20 20 44 69 63 74 20 2a 64 69 63 74 3b 0d 0a 20 Dict *dict;..
5bf0: 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 Tcl_HashEntry
5c00: 20 2a 68 50 74 72 3b 0d 0a 0d 0a 20 20 20 20 69 *hPtr;.... i
5c10: 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 f (Tcl_IsShared(
5c20: 64 69 63 74 50 74 72 29 29 20 7b 0d 0a 09 70 61 dictPtr)) {...pa
5c30: 6e 69 63 28 22 54 63 6c 5f 44 69 63 74 4f 62 6a nic("Tcl_DictObj
5c40: 52 65 6d 6f 76 65 20 63 61 6c 6c 65 64 20 77 69 Remove called wi
5c50: 74 68 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 th shared object
5c60: 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 ");.. }....
5c70: 20 20 69 66 20 28 64 69 63 74 50 74 72 2d 3e 74 if (dictPtr->t
5c80: 79 70 65 50 74 72 20 21 3d 20 26 74 63 6c 44 69 ypePtr != &tclDi
5c90: 63 74 54 79 70 65 29 20 7b 0d 0a 09 69 6e 74 20 ctType) {...int
5ca0: 72 65 73 75 6c 74 20 3d 20 53 65 74 44 69 63 74 result = SetDict
5cb0: 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20 FromAny(interp,
5cc0: 64 69 63 74 50 74 72 29 3b 0d 0a 09 69 66 20 28 dictPtr);...if (
5cd0: 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b result != TCL_OK
5ce0: 29 20 7b 0d 0a 09 20 20 20 20 72 65 74 75 72 6e ) {... return
5cf0: 20 72 65 73 75 6c 74 3b 0d 0a 09 7d 0d 0a 20 20 result;...}..
5d00: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 28 64 }.... if (d
5d10: 69 63 74 50 74 72 2d 3e 62 79 74 65 73 20 21 3d ictPtr->bytes !=
5d20: 20 4e 55 4c 4c 29 20 7b 0d 0a 09 54 63 6c 5f 49 NULL) {...Tcl_I
5d30: 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 52 nvalidateStringR
5d40: 65 70 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 20 ep(dictPtr);..
5d50: 20 20 7d 0d 0a 20 20 20 20 64 69 63 74 20 3d 20 }.. dict =
5d60: 28 44 69 63 74 20 2a 29 20 64 69 63 74 50 74 72 (Dict *) dictPtr
5d70: 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e 6f 74 ->internalRep.ot
5d80: 68 65 72 56 61 6c 75 65 50 74 72 3b 0d 0a 20 20 herValuePtr;..
5d90: 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e hPtr = Tcl_Fin
5da0: 64 48 61 73 68 45 6e 74 72 79 28 26 64 69 63 74 dHashEntry(&dict
5db0: 2d 3e 74 61 62 6c 65 2c 20 28 63 68 61 72 20 2a ->table, (char *
5dc0: 29 6b 65 79 50 74 72 29 3b 0d 0a 20 20 20 20 69 )keyPtr);.. i
5dd0: 66 20 28 68 50 74 72 20 21 3d 20 4e 55 4c 4c 29 f (hPtr != NULL)
5de0: 20 7b 0d 0a 09 54 63 6c 5f 4f 62 6a 20 2a 76 61 {...Tcl_Obj *va
5df0: 6c 75 65 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 luePtr = (Tcl_Ob
5e00: 6a 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 j *) Tcl_GetHash
5e10: 56 61 6c 75 65 28 68 50 74 72 29 3b 0d 0a 0d 0a Value(hPtr);....
5e20: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
5e30: 74 28 76 61 6c 75 65 50 74 72 29 3b 0d 0a 09 54 t(valuePtr);...T
5e40: 63 6c 5f 44 65 6c 65 74 65 48 61 73 68 45 6e 74 cl_DeleteHashEnt
5e50: 72 79 28 68 50 74 72 29 3b 0d 0a 09 64 69 63 74 ry(hPtr);...dict
5e60: 2d 3e 65 70 6f 63 68 2b 2b 3b 0d 0a 20 20 20 20 ->epoch++;..
5e70: 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }.. return TC
5e80: 4c 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d L_OK;..}...../*.
5e90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 ---------.. *..
5ee0: 2a 20 54 63 6c 5f 44 69 63 74 4f 62 6a 53 69 7a * Tcl_DictObjSiz
5ef0: 65 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 48 6f 77 e --.. *.. *.How
5f00: 20 6d 61 6e 79 20 6b 65 79 2c 76 61 6c 75 65 20 many key,value
5f10: 70 61 69 72 73 20 61 72 65 20 74 68 65 72 65 20 pairs are there
5f20: 69 6e 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 in the dictionar
5f30: 79 3f 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 6c y?.. *.. * Resul
5f40: 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 6e 64 61 ts:.. *.A standa
5f50: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 20 rd Tcl result.
5f60: 55 70 64 61 74 65 73 20 74 68 65 20 76 61 72 69 Updates the vari
5f70: 61 62 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 able pointed to
5f80: 62 79 0d 0a 20 2a 09 73 69 7a 65 50 74 72 20 77 by.. *.sizePtr w
5f90: 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f ith the number o
5fa0: 66 20 6b 65 79 2c 76 61 6c 75 65 20 70 61 69 72 f key,value pair
5fb0: 73 20 69 6e 20 74 68 65 20 64 69 63 74 69 6f 6e s in the diction
5fc0: 61 72 79 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 ary... *.. * Sid
5fd0: 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 54 e effects:.. *.T
5fe0: 68 65 20 64 69 63 74 50 74 72 20 6f 62 6a 65 63 he dictPtr objec
5ff0: 74 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 t is converted t
6000: 6f 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 74 o a dictionary t
6010: 79 70 65 20 69 66 20 69 74 20 69 73 0d 0a 20 2a ype if it is.. *
6020: 09 6e 6f 74 20 61 20 64 69 63 74 69 6f 6e 61 72 .not a dictionar
6030: 79 20 61 6c 72 65 61 64 79 2e 0d 0a 20 2a 0d 0a y already... *..
6040: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d --------.. */...
6090: 0a 69 6e 74 0d 0a 54 63 6c 5f 44 69 63 74 4f 62 .int..Tcl_DictOb
60a0: 6a 53 69 7a 65 28 69 6e 74 65 72 70 2c 20 64 69 jSize(interp, di
60b0: 63 74 50 74 72 2c 20 73 69 7a 65 50 74 72 29 0d ctPtr, sizePtr).
60c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
60d0: 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 54 63 *interp;.. Tc
60e0: 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 3b 0d l_Obj *dictPtr;.
60f0: 0a 20 20 20 20 69 6e 74 20 2a 73 69 7a 65 50 74 . int *sizePt
6100: 72 3b 0d 0a 7b 0d 0a 20 20 20 20 44 69 63 74 20 r;..{.. Dict
6110: 2a 64 69 63 74 3b 0d 0a 0d 0a 20 20 20 20 69 66 *dict;.... if
6120: 20 28 64 69 63 74 50 74 72 2d 3e 74 79 70 65 50 (dictPtr->typeP
6130: 74 72 20 21 3d 20 26 74 63 6c 44 69 63 74 54 79 tr != &tclDictTy
6140: 70 65 29 20 7b 0d 0a 09 69 6e 74 20 72 65 73 75 pe) {...int resu
6150: 6c 74 20 3d 20 53 65 74 44 69 63 74 46 72 6f 6d lt = SetDictFrom
6160: 41 6e 79 28 69 6e 74 65 72 70 2c 20 64 69 63 74 Any(interp, dict
6170: 50 74 72 29 3b 0d 0a 09 69 66 20 28 72 65 73 75 Ptr);...if (resu
6180: 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d lt != TCL_OK) {.
6190: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 .. return res
61a0: 75 6c 74 3b 0d 0a 09 7d 0d 0a 20 20 20 20 7d 0d ult;...}.. }.
61b0: 0a 0d 0a 20 20 20 20 64 69 63 74 20 3d 20 28 44 ... dict = (D
61c0: 69 63 74 20 2a 29 20 64 69 63 74 50 74 72 2d 3e ict *) dictPtr->
61d0: 69 6e 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 internalRep.othe
61e0: 72 56 61 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 rValuePtr;..
61f0: 2a 73 69 7a 65 50 74 72 20 3d 20 64 69 63 74 2d *sizePtr = dict-
6200: 3e 74 61 62 6c 65 2e 6e 75 6d 45 6e 74 72 69 65 >table.numEntrie
6210: 73 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 s;.. return T
6220: 43 4c 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a CL_OK;..}...../*
6230: 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *------------
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a ----------.. *..
6280: 20 2a 20 54 63 6c 5f 44 69 63 74 4f 62 6a 46 69 * Tcl_DictObjFi
6290: 72 73 74 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 53 rst --.. *.. *.S
62a0: 74 61 72 74 20 61 20 74 72 61 76 65 72 73 61 6c tart a traversal
62b0: 20 6f 66 20 74 68 65 20 64 69 63 74 69 6f 6e 61 of the dictiona
62c0: 72 79 2e 20 20 43 61 6c 6c 65 72 20 6d 75 73 74 ry. Caller must
62d0: 20 73 75 70 70 6c 79 20 74 68 65 0d 0a 20 2a 09 supply the.. *.
62e0: 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 2c 20 search context,
62f0: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 72 65 74 pointers for ret
6300: 75 72 6e 69 6e 67 20 6b 65 79 20 61 6e 64 20 76 urning key and v
6310: 61 6c 75 65 2c 20 61 6e 64 20 61 0d 0a 20 2a 09 alue, and a.. *.
6320: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 77 pointer to allow
6330: 20 69 6e 64 69 63 61 74 69 6f 6e 20 6f 66 20 77 indication of w
6340: 68 65 74 68 65 72 20 74 68 65 20 64 69 63 74 69 hether the dicti
6350: 6f 6e 61 72 79 20 68 61 73 20 62 65 65 6e 0d 0a onary has been..
6360: 20 2a 09 74 72 61 76 65 72 73 65 64 20 28 69 2e *.traversed (i.
6370: 65 2e 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 e. the dictionar
6380: 79 20 69 73 20 65 6d 70 74 79 2e 29 20 54 68 65 y is empty.) The
6390: 20 6f 72 64 65 72 20 6f 66 20 74 72 61 76 65 72 order of traver
63a0: 73 61 6c 0d 0a 20 2a 09 69 73 20 75 6e 64 65 66 sal.. *.is undef
63b0: 69 6e 65 64 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 ined... *.. * Re
63c0: 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 sults:.. *.A sta
63d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
63e0: 2e 20 20 55 70 64 61 74 65 73 20 74 68 65 20 76 . Updates the v
63f0: 61 72 69 61 62 6c 65 73 20 70 6f 69 6e 74 65 64 ariables pointed
6400: 20 74 6f 20 62 79 0d 0a 20 2a 09 6b 65 79 50 74 to by.. *.keyPt
6410: 72 50 74 72 2c 20 76 61 6c 75 65 50 74 72 50 74 rPtr, valuePtrPt
6420: 72 20 61 6e 64 20 64 6f 6e 65 50 74 72 2e 20 20 r and donePtr.
6430: 45 69 74 68 65 72 20 6f 66 20 6b 65 79 50 74 72 Either of keyPtr
6440: 50 74 72 20 61 6e 64 0d 0a 20 2a 09 76 61 6c 75 Ptr and.. *.valu
6450: 65 50 74 72 50 74 72 20 6d 61 79 20 62 65 20 4e ePtrPtr may be N
6460: 55 4c 4c 2c 20 69 6e 20 77 68 69 63 68 20 63 61 ULL, in which ca
6470: 73 65 20 74 68 65 20 6b 65 79 2f 76 61 6c 75 65 se the key/value
6480: 20 69 73 20 6e 6f 74 20 6d 61 64 65 0d 0a 20 2a is not made.. *
6490: 09 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 .available to th
64a0: 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 2a 0d 0a 20 e caller... *..
64b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0d * Side effects:.
64c0: 0a 20 2a 09 54 68 65 20 64 69 63 74 50 74 72 20 . *.The dictPtr
64d0: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 76 65 72 object is conver
64e0: 74 65 64 20 74 6f 20 61 20 64 69 63 74 69 6f 6e ted to a diction
64f0: 61 72 79 20 74 79 70 65 20 69 66 20 69 74 20 69 ary type if it i
6500: 73 0d 0a 20 2a 09 6e 6f 74 20 61 20 64 69 63 74 s.. *.not a dict
6510: 69 6f 6e 61 72 79 20 61 6c 72 65 61 64 79 2e 20 ionary already.
6520: 20 54 68 65 20 73 65 61 72 63 68 20 63 6f 6e 74 The search cont
6530: 65 78 74 20 69 73 20 69 6e 69 74 69 61 6c 69 73 ext is initialis
6540: 65 64 20 69 66 0d 0a 20 2a 09 74 68 65 20 73 65 ed if.. *.the se
6550: 61 72 63 68 20 68 61 73 20 6e 6f 74 20 66 69 6e arch has not fin
6560: 69 73 68 65 64 2e 20 20 54 68 65 20 64 69 63 74 ished. The dict
6570: 69 6f 6e 61 72 79 27 73 20 69 6e 74 65 72 6e 61 ionary's interna
6580: 6c 20 72 65 70 20 69 73 0d 0a 20 2a 09 54 63 6c l rep is.. *.Tcl
6590: 5f 50 72 65 73 65 72 76 65 28 29 64 20 69 66 20 _Preserve()d if
65a0: 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 20 68 the dictionary h
65b0: 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 as at least one
65c0: 65 6c 65 6d 65 6e 74 2e 0d 0a 20 2a 0d 0a 20 2a element... *.. *
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6610: 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 69 ------.. */....i
6620: 6e 74 0d 0a 54 63 6c 5f 44 69 63 74 4f 62 6a 46 nt..Tcl_DictObjF
6630: 69 72 73 74 28 69 6e 74 65 72 70 2c 20 64 69 63 irst(interp, dic
6640: 74 50 74 72 2c 20 73 65 61 72 63 68 50 74 72 2c tPtr, searchPtr,
6650: 20 6b 65 79 50 74 72 50 74 72 2c 20 76 61 6c 75 keyPtrPtr, valu
6660: 65 50 74 72 50 74 72 2c 20 64 6f 6e 65 50 74 72 ePtrPtr, donePtr
6670: 29 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ).. Tcl_Inter
6680: 70 20 2a 69 6e 74 65 72 70 3b 09 09 09 2f 2a 20 p *interp;.../*
6690: 46 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 For error messag
66a0: 65 73 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e es, or NULL if n
66b0: 6f 0d 0a 09 09 09 09 09 20 2a 20 65 72 72 6f 72 o....... * error
66c0: 20 6d 65 73 73 61 67 65 73 20 64 65 73 69 72 65 messages desire
66d0: 64 2e 20 2a 2f 0d 0a 20 20 20 20 54 63 6c 5f 4f d. */.. Tcl_O
66e0: 62 6a 20 2a 64 69 63 74 50 74 72 3b 09 09 09 2f bj *dictPtr;.../
66f0: 2a 20 44 69 63 74 69 6f 6e 61 72 79 20 74 6f 20 * Dictionary to
6700: 74 72 61 76 65 72 73 65 2e 20 2a 2f 0d 0a 20 20 traverse. */..
6710: 20 20 54 63 6c 5f 44 69 63 74 53 65 61 72 63 68 Tcl_DictSearch
6720: 20 2a 73 65 61 72 63 68 50 74 72 3b 09 09 2f 2a *searchPtr;../*
6730: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 69 Pointer to a di
6740: 63 74 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78 ct search contex
6750: 74 2e 20 2a 2f 0d 0a 20 20 20 20 54 63 6c 5f 4f t. */.. Tcl_O
6760: 62 6a 20 2a 2a 6b 65 79 50 74 72 50 74 72 3b 09 bj **keyPtrPtr;.
6770: 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 ./* Pointer to a
6780: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 68 61 76 variable to hav
6790: 65 20 74 68 65 0d 0a 09 09 09 09 09 20 2a 20 66 e the....... * f
67a0: 69 72 73 74 20 6b 65 79 20 77 72 69 74 74 65 6e irst key written
67b0: 20 69 6e 74 6f 2c 20 6f 72 20 4e 55 4c 4c 2e 20 into, or NULL.
67c0: 2a 2f 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */.. Tcl_Obj
67d0: 2a 2a 76 61 6c 75 65 50 74 72 50 74 72 3b 09 09 **valuePtrPtr;..
67e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 /* Pointer to a
67f0: 76 61 72 69 61 62 6c 65 20 74 6f 20 68 61 76 65 variable to have
6800: 20 74 68 65 0d 0a 09 09 09 09 09 20 2a 20 66 69 the....... * fi
6810: 72 73 74 20 76 61 6c 75 65 20 77 72 69 74 74 65 rst value writte
6820: 6e 20 69 6e 74 6f 2c 20 6f 72 20 4e 55 4c 4c 2e n into, or NULL.
6830: 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 2a 64 6f 6e */.. int *don
6840: 65 50 74 72 3b 09 09 09 2f 2a 20 50 6f 69 6e 74 ePtr;.../* Point
6850: 65 72 20 74 6f 20 61 20 76 61 72 69 61 62 6c 65 er to a variable
6860: 20 77 68 69 63 68 20 77 69 6c 6c 0d 0a 09 09 09 which will.....
6870: 09 09 20 2a 20 68 61 76 65 20 61 20 31 20 77 72 .. * have a 1 wr
6880: 69 74 74 65 6e 20 69 6e 74 6f 20 77 68 65 6e 20 itten into when
6890: 74 68 65 72 65 0d 0a 09 09 09 09 09 20 2a 20 61 there....... * a
68a0: 72 65 20 6e 6f 20 66 75 72 74 68 65 72 20 76 61 re no further va
68b0: 6c 75 65 73 20 69 6e 20 74 68 65 0d 0a 09 09 09 lues in the.....
68c0: 09 09 20 2a 20 64 69 63 74 69 6f 6e 61 72 79 2c .. * dictionary,
68d0: 20 6f 72 20 61 20 30 20 6f 74 68 65 72 77 69 73 or a 0 otherwis
68e0: 65 2e 20 2a 2f 0d 0a 7b 0d 0a 20 20 20 20 44 69 e. */..{.. Di
68f0: 63 74 20 2a 64 69 63 74 3b 0d 0a 20 20 20 20 54 ct *dict;.. T
6900: 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 cl_HashEntry *hP
6910: 74 72 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 64 tr;.... if (d
6920: 69 63 74 50 74 72 2d 3e 74 79 70 65 50 74 72 20 ictPtr->typePtr
6930: 21 3d 20 26 74 63 6c 44 69 63 74 54 79 70 65 29 != &tclDictType)
6940: 20 7b 0d 0a 09 69 6e 74 20 72 65 73 75 6c 74 20 {...int result
6950: 3d 20 53 65 74 44 69 63 74 46 72 6f 6d 41 6e 79 = SetDictFromAny
6960: 28 69 6e 74 65 72 70 2c 20 64 69 63 74 50 74 72 (interp, dictPtr
6970: 29 3b 0d 0a 09 69 66 20 28 72 65 73 75 6c 74 20 );...if (result
6980: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 != TCL_OK) {...
6990: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
69a0: 3b 0d 0a 09 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a ;...}.. }....
69b0: 20 20 20 20 64 69 63 74 20 3d 20 28 44 69 63 74 dict = (Dict
69c0: 20 2a 29 20 64 69 63 74 50 74 72 2d 3e 69 6e 74 *) dictPtr->int
69d0: 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 61 ernalRep.otherVa
69e0: 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 68 50 74 luePtr;.. hPt
69f0: 72 20 3d 20 54 63 6c 5f 46 69 72 73 74 48 61 73 r = Tcl_FirstHas
6a00: 68 45 6e 74 72 79 28 26 64 69 63 74 2d 3e 74 61 hEntry(&dict->ta
6a10: 62 6c 65 2c 20 26 73 65 61 72 63 68 50 74 72 2d ble, &searchPtr-
6a20: 3e 73 65 61 72 63 68 29 3b 0d 0a 20 20 20 20 69 >search);.. i
6a30: 66 20 28 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 f (hPtr == NULL)
6a40: 20 7b 0d 0a 09 2a 64 6f 6e 65 50 74 72 20 3d 20 {...*donePtr =
6a50: 31 3b 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 1;.. } else {
6a60: 0d 0a 09 2a 64 6f 6e 65 50 74 72 20 3d 20 30 3b ...*donePtr = 0;
6a70: 0d 0a 09 73 65 61 72 63 68 50 74 72 2d 3e 64 69 ...searchPtr->di
6a80: 63 74 69 6f 6e 61 72 79 50 74 72 20 3d 20 28 54 ctionaryPtr = (T
6a90: 63 6c 5f 44 69 63 74 29 20 64 69 63 74 3b 0d 0a cl_Dict) dict;..
6aa0: 09 73 65 61 72 63 68 50 74 72 2d 3e 65 70 6f 63 .searchPtr->epoc
6ab0: 68 20 3d 20 64 69 63 74 2d 3e 65 70 6f 63 68 3b h = dict->epoch;
6ac0: 0d 0a 09 73 65 61 72 63 68 50 74 72 2d 3e 6f 62 ...searchPtr->ob
6ad0: 6a 50 74 72 20 3d 20 64 69 63 74 50 74 72 3b 0d jPtr = dictPtr;.
6ae0: 0a 09 64 69 63 74 2d 3e 72 65 66 63 6f 75 6e 74 ..dict->refcount
6af0: 2b 2b 3b 0d 0a 09 69 66 20 28 6b 65 79 50 74 72 ++;...if (keyPtr
6b00: 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a Ptr != NULL) {..
6b10: 09 20 20 20 20 2a 6b 65 79 50 74 72 50 74 72 20 . *keyPtrPtr
6b20: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 54 63 = (Tcl_Obj *) Tc
6b30: 6c 5f 47 65 74 48 61 73 68 4b 65 79 28 26 64 69 l_GetHashKey(&di
6b40: 63 74 2d 3e 74 61 62 6c 65 2c 20 68 50 74 72 29 ct->table, hPtr)
6b50: 3b 0d 0a 09 7d 0d 0a 09 69 66 20 28 76 61 6c 75 ;...}...if (valu
6b60: 65 50 74 72 50 74 72 20 21 3d 20 4e 55 4c 4c 29 ePtrPtr != NULL)
6b70: 20 7b 0d 0a 09 20 20 20 20 2a 76 61 6c 75 65 50 {... *valueP
6b80: 74 72 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 6a trPtr = (Tcl_Obj
6b90: 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 *) Tcl_GetHashV
6ba0: 61 6c 75 65 28 68 50 74 72 29 3b 0d 0a 09 7d 0d alue(hPtr);...}.
6bb0: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 . }.. retu
6bc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c rn TCL_OK;..}...
6bd0: 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ../*.. *--------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a --------------..
6c20: 20 2a 0d 0a 20 2a 20 54 63 6c 5f 44 69 63 74 4f *.. * Tcl_DictO
6c30: 62 6a 4e 65 78 74 20 2d 2d 0d 0a 20 2a 0d 0a 20 bjNext --.. *..
6c40: 2a 09 43 6f 6e 74 69 6e 75 65 20 61 20 74 72 61 *.Continue a tra
6c50: 76 65 72 73 61 6c 20 6f 66 20 61 20 64 69 63 74 versal of a dict
6c60: 69 6f 6e 61 72 79 20 70 72 65 76 69 6f 75 73 6c ionary previousl
6c70: 79 20 73 74 61 72 74 65 64 20 77 69 74 68 0d 0a y started with..
6c80: 20 2a 09 54 63 6c 5f 44 69 63 74 4f 62 6a 46 69 *.Tcl_DictObjFi
6c90: 72 73 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 rst. This funct
6ca0: 69 6f 6e 20 69 73 20 73 61 66 65 20 61 67 61 69 ion is safe agai
6cb0: 6e 73 74 20 63 6f 6e 63 75 72 72 65 6e 74 0d 0a nst concurrent..
6cc0: 20 2a 09 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 *.modification
6cd0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e of the underlyin
6ce0: 67 20 6f 62 6a 65 63 74 20 28 69 6e 63 6c 75 64 g object (includ
6cf0: 69 6e 67 20 74 79 70 65 0d 0a 20 2a 09 73 68 69 ing type.. *.shi
6d00: 6d 6d 65 72 69 6e 67 29 2c 20 74 72 65 61 74 69 mmering), treati
6d10: 6e 67 20 73 75 63 68 20 73 69 74 75 61 74 69 6f ng such situatio
6d20: 6e 73 20 61 73 20 69 66 20 74 68 65 20 73 65 61 ns as if the sea
6d30: 72 63 68 20 68 61 73 0d 0a 20 2a 09 74 65 72 6d rch has.. *.term
6d40: 69 6e 61 74 65 64 2c 20 74 68 6f 75 67 68 20 69 inated, though i
6d50: 74 20 69 73 20 75 70 20 74 6f 20 74 68 65 20 63 t is up to the c
6d60: 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 aller to ensure
6d70: 74 68 61 74 20 74 68 65 0d 0a 20 2a 09 6f 62 6a that the.. *.obj
6d80: 65 63 74 20 69 74 73 65 6c 66 20 69 73 20 6e 6f ect itself is no
6d90: 74 20 64 69 73 70 6f 73 65 64 20 75 6e 74 69 6c t disposed until
6da0: 20 74 68 65 20 73 65 61 72 63 68 20 68 61 73 20 the search has
6db0: 66 69 6e 69 73 68 65 64 2e 0d 0a 20 2a 09 49 74 finished... *.It
6dc0: 20 69 73 20 5f 6e 6f 74 5f 20 73 61 66 65 20 61 is _not_ safe a
6dd0: 67 61 69 6e 73 74 20 6d 6f 64 69 66 69 63 61 74 gainst modificat
6de0: 69 6f 6e 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 ions from other
6df0: 74 68 72 65 61 64 73 2e 0d 0a 20 2a 0d 0a 20 2a threads... *.. *
6e00: 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 55 70 Results:.. *.Up
6e10: 64 61 74 65 73 20 74 68 65 20 76 61 72 69 61 62 dates the variab
6e20: 6c 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 les pointed to b
6e30: 79 20 6b 65 79 50 74 72 50 74 72 2c 20 76 61 6c y keyPtrPtr, val
6e40: 75 65 50 74 72 50 74 72 20 61 6e 64 0d 0a 20 2a uePtrPtr and.. *
6e50: 09 64 6f 6e 65 50 74 72 2e 20 20 45 69 74 68 65 .donePtr. Eithe
6e60: 72 20 6f 66 20 6b 65 79 50 74 72 50 74 72 20 61 r of keyPtrPtr a
6e70: 6e 64 20 76 61 6c 75 65 50 74 72 50 74 72 20 6d nd valuePtrPtr m
6e80: 61 79 20 62 65 20 4e 55 4c 4c 2c 20 69 6e 0d 0a ay be NULL, in..
6e90: 20 2a 09 77 68 69 63 68 20 63 61 73 65 20 74 68 *.which case th
6ea0: 65 20 6b 65 79 2f 76 61 6c 75 65 20 69 73 20 6e e key/value is n
6eb0: 6f 74 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c ot made availabl
6ec0: 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e e to the caller.
6ed0: 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 .. *.. * Side ef
6ee0: 66 65 63 74 73 3a 0d 0a 20 2a 09 52 65 6d 6f 76 fects:.. *.Remov
6ef0: 65 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 es a reference t
6f00: 6f 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 o the dictionary
6f10: 27 73 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 20 's internal rep
6f20: 69 66 20 74 68 65 0d 0a 20 2a 09 73 65 61 72 63 if the.. *.searc
6f30: 68 20 74 65 72 6d 69 6e 61 74 65 73 2e 0d 0a 20 h terminates...
6f40: 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.. *-----------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f -----------.. */
6f90: 0d 0a 0d 0a 76 6f 69 64 0d 0a 54 63 6c 5f 44 69 ....void..Tcl_Di
6fa0: 63 74 4f 62 6a 4e 65 78 74 28 73 65 61 72 63 68 ctObjNext(search
6fb0: 50 74 72 2c 20 6b 65 79 50 74 72 50 74 72 2c 20 Ptr, keyPtrPtr,
6fc0: 76 61 6c 75 65 50 74 72 50 74 72 2c 20 64 6f 6e valuePtrPtr, don
6fd0: 65 50 74 72 29 0d 0a 20 20 20 20 54 63 6c 5f 44 ePtr).. Tcl_D
6fe0: 69 63 74 53 65 61 72 63 68 20 2a 73 65 61 72 63 ictSearch *searc
6ff0: 68 50 74 72 3b 09 09 2f 2a 20 50 6f 69 6e 74 65 hPtr;../* Pointe
7000: 72 20 74 6f 20 61 20 68 61 73 68 20 73 65 61 72 r to a hash sear
7010: 63 68 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0d 0a ch context. */..
7020: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6b 65 Tcl_Obj **ke
7030: 79 50 74 72 50 74 72 3b 09 09 2f 2a 20 50 6f 69 yPtrPtr;../* Poi
7040: 6e 74 65 72 20 74 6f 20 61 20 76 61 72 69 61 62 nter to a variab
7050: 6c 65 20 74 6f 20 68 61 76 65 20 74 68 65 0d 0a le to have the..
7060: 09 09 09 09 09 20 2a 20 66 69 72 73 74 20 6b 65 ..... * first ke
7070: 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 2c 20 y written into,
7080: 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0d 0a 20 20 20 or NULL. */..
7090: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 76 61 6c 75 65 Tcl_Obj **value
70a0: 50 74 72 50 74 72 3b 09 09 2f 2a 20 50 6f 69 6e PtrPtr;../* Poin
70b0: 74 65 72 20 74 6f 20 61 20 76 61 72 69 61 62 6c ter to a variabl
70c0: 65 20 74 6f 20 68 61 76 65 20 74 68 65 0d 0a 09 e to have the...
70d0: 09 09 09 09 20 2a 20 66 69 72 73 74 20 76 61 6c .... * first val
70e0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 2c ue written into,
70f0: 20 6f 72 20 4e 55 4c 4c 2e 2a 2f 0d 0a 20 20 20 or NULL.*/..
7100: 20 69 6e 74 20 2a 64 6f 6e 65 50 74 72 3b 09 09 int *donePtr;..
7110: 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 ./* Pointer to a
7120: 20 76 61 72 69 61 62 6c 65 20 77 68 69 63 68 20 variable which
7130: 77 69 6c 6c 0d 0a 09 09 09 09 09 20 2a 20 68 61 will....... * ha
7140: 76 65 20 61 20 31 20 77 72 69 74 74 65 6e 20 69 ve a 1 written i
7150: 6e 74 6f 20 77 68 65 6e 20 74 68 65 72 65 0d 0a nto when there..
7160: 09 09 09 09 09 20 2a 20 61 72 65 20 6e 6f 20 66 ..... * are no f
7170: 75 72 74 68 65 72 20 76 61 6c 75 65 73 20 69 6e urther values in
7180: 20 74 68 65 0d 0a 09 09 09 09 09 20 2a 20 64 69 the....... * di
7190: 63 74 69 6f 6e 61 72 79 2c 20 6f 72 20 61 20 30 ctionary, or a 0
71a0: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0d 0a otherwise. */..
71b0: 7b 0d 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 {.. Tcl_HashE
71c0: 6e 74 72 79 20 2a 68 50 74 72 3b 0d 0a 0d 0a 20 ntry *hPtr;....
71d0: 20 20 20 2f 2a 0d 0a 20 20 20 20 20 2a 20 42 61 /*.. * Ba
71e0: 69 6c 20 6f 75 74 20 69 66 20 74 68 65 20 64 69 il out if the di
71f0: 63 74 69 6f 6e 61 72 79 20 68 61 73 20 68 61 64 ctionary has had
7200: 20 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 61 64 any elements ad
7210: 64 65 64 2c 20 6d 6f 64 69 66 69 65 64 0d 0a 20 ded, modified..
7220: 20 20 20 20 2a 20 6f 72 20 72 65 6d 6f 76 65 64 * or removed
7230: 2e 20 20 54 68 69 73 20 2a 73 68 6f 75 6c 64 6e . This *shouldn
7240: 27 74 2a 20 68 61 70 70 65 6e 2c 20 62 75 74 2e 't* happen, but.
7250: 2e 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a 20 20 20 .... */..
7260: 20 69 66 20 28 28 28 44 69 63 74 20 2a 29 73 65 if (((Dict *)se
7270: 61 72 63 68 50 74 72 2d 3e 64 69 63 74 69 6f 6e archPtr->diction
7280: 61 72 79 50 74 72 29 2d 3e 65 70 6f 63 68 20 21 aryPtr)->epoch !
7290: 3d 20 73 65 61 72 63 68 50 74 72 2d 3e 65 70 6f = searchPtr->epo
72a0: 63 68 29 20 7b 0d 0a 09 70 61 6e 69 63 28 22 63 ch) {...panic("c
72b0: 6f 6e 63 75 72 72 65 6e 74 20 64 69 63 74 69 6f oncurrent dictio
72c0: 6e 61 72 79 20 6d 6f 64 69 66 69 63 61 74 69 6f nary modificatio
72d0: 6e 20 61 6e 64 20 73 65 61 72 63 68 22 29 3b 0d n and search");.
72e0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 68 50 . }.... hP
72f0: 74 72 20 3d 20 54 63 6c 5f 4e 65 78 74 48 61 73 tr = Tcl_NextHas
7300: 68 45 6e 74 72 79 28 26 73 65 61 72 63 68 50 74 hEntry(&searchPt
7310: 72 2d 3e 73 65 61 72 63 68 29 3b 0d 0a 20 20 20 r->search);..
7320: 20 69 66 20 28 68 50 74 72 20 3d 3d 20 4e 55 4c if (hPtr == NUL
7330: 4c 29 20 7b 0d 0a 09 54 63 6c 5f 44 69 63 74 4f L) {...Tcl_DictO
7340: 62 6a 44 6f 6e 65 28 73 65 61 72 63 68 50 74 72 bjDone(searchPtr
7350: 29 3b 0d 0a 09 2a 64 6f 6e 65 50 74 72 20 3d 20 );...*donePtr =
7360: 31 3b 0d 0a 09 72 65 74 75 72 6e 3b 0d 0a 20 20 1;...return;..
7370: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2a 64 6f 6e 65 }.... *done
7380: 50 74 72 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 Ptr = 0;.. if
7390: 20 28 6b 65 79 50 74 72 50 74 72 20 21 3d 20 4e (keyPtrPtr != N
73a0: 55 4c 4c 29 20 7b 0d 0a 09 2a 6b 65 79 50 74 72 ULL) {...*keyPtr
73b0: 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a Ptr = (Tcl_Obj *
73c0: 29 20 54 63 6c 5f 47 65 74 48 61 73 68 4b 65 79 ) Tcl_GetHashKey
73d0: 28 0d 0a 09 09 26 28 28 44 69 63 74 20 2a 29 73 (....&((Dict *)s
73e0: 65 61 72 63 68 50 74 72 2d 3e 64 69 63 74 69 6f earchPtr->dictio
73f0: 6e 61 72 79 50 74 72 29 2d 3e 74 61 62 6c 65 2c naryPtr)->table,
7400: 20 68 50 74 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a hPtr);.. }..
7410: 20 20 20 20 69 66 20 28 76 61 6c 75 65 50 74 72 if (valuePtr
7420: 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a Ptr != NULL) {..
7430: 09 2a 76 61 6c 75 65 50 74 72 50 74 72 20 3d 20 .*valuePtrPtr =
7440: 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 54 63 6c 5f (Tcl_Obj *) Tcl_
7450: 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 GetHashValue(hPt
7460: 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 7d 0d 0a 0c r);.. }..}...
7470: 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ../*.. *--------
7480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a --------------..
74c0: 20 2a 0d 0a 20 2a 20 54 63 6c 5f 44 69 63 74 4f *.. * Tcl_DictO
74d0: 62 6a 44 6f 6e 65 20 2d 2d 0d 0a 20 2a 0d 0a 20 bjDone --.. *..
74e0: 2a 09 43 61 6c 6c 20 74 68 69 73 20 69 66 20 79 *.Call this if y
74f0: 6f 75 20 77 61 6e 74 20 74 6f 20 73 74 6f 70 20 ou want to stop
7500: 61 20 73 65 61 72 63 68 20 62 65 66 6f 72 65 20 a search before
7510: 79 6f 75 20 72 65 61 63 68 20 74 68 65 0d 0a 20 you reach the..
7520: 2a 09 65 6e 64 20 6f 66 20 74 68 65 20 64 69 63 *.end of the dic
7530: 74 69 6f 6e 61 72 79 20 28 65 2e 67 2e 20 62 65 tionary (e.g. be
7540: 63 61 75 73 65 20 6f 66 20 61 62 6e 6f 72 6d 61 cause of abnorma
7550: 6c 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6f 66 l termination of
7560: 0d 0a 20 2a 09 74 68 65 20 73 65 61 72 63 68 2e .. *.the search.
7570: 29 20 20 49 74 20 73 68 6f 75 6c 64 20 6e 6f 74 ) It should not
7580: 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 be used if the
7590: 73 65 61 72 63 68 20 72 65 61 63 68 65 73 20 69 search reaches i
75a0: 74 73 0d 0a 20 2a 09 6e 61 74 75 72 61 6c 20 65 ts.. *.natural e
75b0: 6e 64 20 28 69 2e 65 2e 20 69 66 20 65 69 74 68 nd (i.e. if eith
75c0: 65 72 20 54 63 6c 5f 44 69 63 74 4f 62 6a 46 69 er Tcl_DictObjFi
75d0: 72 73 74 20 6f 72 20 54 63 6c 5f 44 69 63 74 4f rst or Tcl_DictO
75e0: 62 6a 4e 65 78 74 0d 0a 20 2a 09 73 65 74 73 20 bjNext.. *.sets
75f0: 69 74 73 20 64 6f 6e 65 50 74 72 20 76 61 72 69 its donePtr vari
7600: 61 62 6c 65 20 74 6f 20 31 2e 29 0d 0a 20 2a 0d able to 1.).. *.
7610: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a . * Results:.. *
7620: 09 4e 6f 6e 65 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 .None... *.. * S
7630: 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a ide effects:.. *
7640: 09 52 65 6d 6f 76 65 73 20 61 20 72 65 66 65 72 .Removes a refer
7650: 65 6e 63 65 20 74 6f 20 74 68 65 20 64 69 63 74 ence to the dict
7660: 69 6f 6e 61 72 79 27 73 20 69 6e 74 65 72 6e 61 ionary's interna
7670: 6c 20 72 65 70 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d l rep... *.. *--
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76c0: 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 76 6f 69 ----.. */....voi
76d0: 64 0d 0a 54 63 6c 5f 44 69 63 74 4f 62 6a 44 6f d..Tcl_DictObjDo
76e0: 6e 65 28 73 65 61 72 63 68 50 74 72 29 0d 0a 20 ne(searchPtr)..
76f0: 20 20 20 54 63 6c 5f 44 69 63 74 53 65 61 72 63 Tcl_DictSearc
7700: 68 20 2a 73 65 61 72 63 68 50 74 72 3b 09 09 2f h *searchPtr;../
7710: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 * Pointer to a h
7720: 61 73 68 20 73 65 61 72 63 68 20 63 6f 6e 74 65 ash search conte
7730: 78 74 2e 20 2a 2f 0d 0a 7b 0d 0a 20 20 20 20 44 xt. */..{.. D
7740: 69 63 74 20 2a 64 69 63 74 3b 0d 0a 0d 0a 20 20 ict *dict;....
7750: 20 20 69 66 20 28 73 65 61 72 63 68 50 74 72 2d if (searchPtr-
7760: 3e 65 70 6f 63 68 20 21 3d 20 2d 31 29 20 7b 0d >epoch != -1) {.
7770: 0a 09 73 65 61 72 63 68 50 74 72 2d 3e 65 70 6f ..searchPtr->epo
7780: 63 68 20 3d 20 2d 31 3b 0d 0a 09 64 69 63 74 20 ch = -1;...dict
7790: 3d 20 28 44 69 63 74 20 2a 29 20 73 65 61 72 63 = (Dict *) searc
77a0: 68 50 74 72 2d 3e 64 69 63 74 69 6f 6e 61 72 79 hPtr->dictionary
77b0: 50 74 72 3b 0d 0a 09 64 69 63 74 2d 3e 72 65 66 Ptr;...dict->ref
77c0: 63 6f 75 6e 74 2d 2d 3b 0d 0a 09 69 66 20 28 64 count--;...if (d
77d0: 69 63 74 2d 3e 72 65 66 63 6f 75 6e 74 20 3d 3d ict->refcount ==
77e0: 20 30 29 20 7b 0d 0a 09 20 20 20 20 44 65 6c 65 0) {... Dele
77f0: 74 65 44 69 63 74 28 64 69 63 74 29 3b 0d 0a 09 teDict(dict);...
7800: 7d 0d 0a 20 20 20 20 7d 0d 0a 7d 0d 0a 0c 0d 0a }.. }..}.....
7810: 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*.. *----------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a ------------.. *
7860: 0d 0a 20 2a 20 54 63 6c 5f 44 69 63 74 4f 62 6a .. * Tcl_DictObj
7870: 52 65 6d 6f 76 65 4b 65 79 4c 69 73 74 20 2d 2d RemoveKeyList --
7880: 0d 0a 20 2a 0d 0a 20 2a 09 41 64 64 20 61 20 6b .. *.. *.Add a k
7890: 65 79 2e 2e 2e 6b 65 79 2c 76 61 6c 75 65 20 70 ey...key,value p
78a0: 61 69 72 20 74 6f 20 61 20 64 69 63 74 69 6f 6e air to a diction
78b0: 61 72 79 20 74 72 65 65 2e 20 20 54 68 65 20 6d ary tree. The m
78c0: 61 69 6e 0d 0a 20 2a 09 64 69 63 74 69 6f 6e 61 ain.. *.dictiona
78d0: 72 79 20 76 61 6c 75 65 20 6d 75 73 74 20 6e 6f ry value must no
78e0: 74 20 62 65 20 73 68 61 72 65 64 2c 20 74 68 6f t be shared, tho
78f0: 75 67 68 20 73 75 62 2d 64 69 63 74 69 6f 6e 61 ugh sub-dictiona
7900: 72 69 65 73 20 6d 61 79 0d 0a 20 2a 09 62 65 2e ries may.. *.be.
7910: 20 20 41 6c 6c 20 69 6e 74 65 72 6d 65 64 69 61 All intermedia
7920: 74 65 20 64 69 63 74 69 6f 6e 61 72 69 65 73 20 te dictionaries
7930: 6f 6e 20 74 68 65 20 70 61 74 68 20 6d 75 73 74 on the path must
7940: 20 65 78 69 73 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 exist... *.. *
7950: 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 Results:.. *.A s
7960: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
7970: 6c 74 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 69 lt. Note that i
7980: 6e 20 74 68 65 20 65 72 72 6f 72 20 63 61 73 65 n the error case
7990: 2c 20 61 20 6d 65 73 73 61 67 65 0d 0a 20 2a 09 , a message.. *.
79a0: 69 73 20 6c 65 66 74 20 69 6e 20 69 6e 74 65 72 is left in inter
79b0: 70 20 75 6e 6c 65 73 73 20 74 68 61 74 20 69 73 p unless that is
79c0: 20 4e 55 4c 4c 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 NULL... *.. * S
79d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a ide effects:.. *
79e0: 09 49 66 20 74 68 65 20 64 69 63 74 69 6f 6e 61 .If the dictiona
79f0: 72 79 20 61 6e 64 20 61 6e 79 20 6f 66 20 69 74 ry and any of it
7a00: 73 20 73 75 62 2d 64 69 63 74 69 6f 6e 61 72 69 s sub-dictionari
7a10: 65 73 20 6f 6e 20 74 68 65 0d 0a 20 2a 09 70 61 es on the.. *.pa
7a20: 74 68 20 68 61 76 65 20 73 74 72 69 6e 67 20 72 th have string r
7a30: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2c 20 epresentations,
7a40: 74 68 65 73 65 20 61 72 65 20 69 6e 76 61 6c 69 these are invali
7a50: 64 61 74 65 64 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d dated... *.. *--
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7aa0: 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 69 6e 74 ----.. */....int
7ab0: 0d 0a 54 63 6c 5f 44 69 63 74 4f 62 6a 50 75 74 ..Tcl_DictObjPut
7ac0: 4b 65 79 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 KeyList(interp,
7ad0: 64 69 63 74 50 74 72 2c 20 6b 65 79 63 2c 20 6b dictPtr, keyc, k
7ae0: 65 79 76 2c 20 76 61 6c 75 65 50 74 72 29 0d 0a eyv, valuePtr)..
7af0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
7b00: 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 interp;.. int
7b10: 20 6b 65 79 63 3b 0d 0a 20 20 20 20 54 63 6c 5f keyc;.. Tcl_
7b20: 4f 62 6a 20 2a 64 69 63 74 50 74 72 2c 20 2a 43 Obj *dictPtr, *C
7b30: 4f 4e 53 54 20 6b 65 79 76 5b 5d 2c 20 2a 76 61 ONST keyv[], *va
7b40: 6c 75 65 50 74 72 3b 0d 0a 7b 0d 0a 20 20 20 20 luePtr;..{..
7b50: 44 69 63 74 20 2a 64 69 63 74 3b 0d 0a 20 20 20 Dict *dict;..
7b60: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a Tcl_HashEntry *
7b70: 68 50 74 72 3b 0d 0a 20 20 20 20 69 6e 74 20 69 hPtr;.. int i
7b80: 73 4e 65 77 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 sNew;.... if
7b90: 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 64 69 (Tcl_IsShared(di
7ba0: 63 74 50 74 72 29 29 20 7b 0d 0a 09 70 61 6e 69 ctPtr)) {...pani
7bb0: 63 28 22 54 63 6c 5f 44 69 63 74 4f 62 6a 50 75 c("Tcl_DictObjPu
7bc0: 74 4b 65 79 4c 69 73 74 20 63 61 6c 6c 65 64 20 tKeyList called
7bd0: 77 69 74 68 20 73 68 61 72 65 64 20 6f 62 6a 65 with shared obje
7be0: 63 74 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ct");.. }..
7bf0: 20 20 69 66 20 28 6b 65 79 63 20 3c 20 31 29 20 if (keyc < 1)
7c00: 7b 0d 0a 09 70 61 6e 69 63 28 22 54 63 6c 5f 44 {...panic("Tcl_D
7c10: 69 63 74 4f 62 6a 50 75 74 4b 65 79 4c 69 73 74 ictObjPutKeyList
7c20: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 6d 70 called with emp
7c30: 74 79 20 6b 65 79 20 6c 69 73 74 22 29 3b 0d 0a ty key list");..
7c40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 69 63 }.... dic
7c50: 74 50 74 72 20 3d 20 54 72 61 63 65 44 69 63 74 tPtr = TraceDict
7c60: 50 61 74 68 28 69 6e 74 65 72 70 2c 20 64 69 63 Path(interp, dic
7c70: 74 50 74 72 2c 20 6b 65 79 63 2d 31 2c 20 6b 65 tPtr, keyc-1, ke
7c80: 79 76 2c 20 2f 2a 77 69 6c 6c 55 70 64 61 74 65 yv, /*willUpdate
7c90: 2a 2f 20 31 29 3b 0d 0a 20 20 20 20 69 66 20 28 */ 1);.. if (
7ca0: 64 69 63 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 dictPtr == NULL)
7cb0: 20 7b 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
7cc0: 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d ERROR;.. }...
7cd0: 0a 20 20 20 20 64 69 63 74 20 3d 20 28 44 69 63 . dict = (Dic
7ce0: 74 20 2a 29 20 64 69 63 74 50 74 72 2d 3e 69 6e t *) dictPtr->in
7cf0: 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 ternalRep.otherV
7d00: 61 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 68 50 aluePtr;.. hP
7d10: 74 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 tr = Tcl_CreateH
7d20: 61 73 68 45 6e 74 72 79 28 26 64 69 63 74 2d 3e ashEntry(&dict->
7d30: 74 61 62 6c 65 2c 20 28 63 68 61 72 20 2a 29 6b table, (char *)k
7d40: 65 79 76 5b 6b 65 79 63 2d 31 5d 2c 20 26 69 73 eyv[keyc-1], &is
7d50: 4e 65 77 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 49 New);.. Tcl_I
7d60: 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 ncrRefCount(valu
7d70: 65 50 74 72 29 3b 0d 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
7d80: 21 69 73 4e 65 77 29 20 7b 0d 0a 09 54 63 6c 5f !isNew) {...Tcl_
7d90: 4f 62 6a 20 2a 6f 6c 64 56 61 6c 75 65 50 74 72 Obj *oldValuePtr
7da0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 54 = (Tcl_Obj *) T
7db0: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 cl_GetHashValue(
7dc0: 68 50 74 72 29 3b 0d 0a 09 54 63 6c 5f 44 65 63 hPtr);...Tcl_Dec
7dd0: 72 52 65 66 43 6f 75 6e 74 28 6f 6c 64 56 61 6c rRefCount(oldVal
7de0: 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a uePtr);.. }..
7df0: 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73 68 56 Tcl_SetHashV
7e00: 61 6c 75 65 28 68 50 74 72 2c 20 76 61 6c 75 65 alue(hPtr, value
7e10: 50 74 72 29 3b 0d 0a 20 20 20 20 49 6e 76 61 6c Ptr);.. Inval
7e20: 69 64 61 74 65 44 69 63 74 43 68 61 69 6e 28 64 idateDictChain(d
7e30: 69 63 74 50 74 72 29 3b 0d 0a 0d 0a 20 20 20 20 ictPtr);....
7e40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0d 0a return TCL_OK;..
7e50: 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d }...../*.. *----
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ea0: 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 54 63 6c 5f 44 --.. *.. * Tcl_D
7eb0: 69 63 74 4f 62 6a 52 65 6d 6f 76 65 4b 65 79 4c ictObjRemoveKeyL
7ec0: 69 73 74 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 52 ist --.. *.. *.R
7ed0: 65 6d 6f 76 65 20 61 20 6b 65 79 2e 2e 2e 6b 65 emove a key...ke
7ee0: 79 2c 76 61 6c 75 65 20 70 61 69 72 20 66 72 6f y,value pair fro
7ef0: 6d 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 74 m a dictionary t
7f00: 72 65 65 20 28 74 68 65 20 76 61 6c 75 65 0d 0a ree (the value..
7f10: 20 2a 09 72 65 6d 6f 76 65 64 20 69 73 20 69 6d *.removed is im
7f20: 70 6c 69 63 69 74 20 69 6e 20 74 68 65 20 6b 65 plicit in the ke
7f30: 79 20 70 61 74 68 2e 29 20 20 54 68 65 20 6d 61 y path.) The ma
7f40: 69 6e 20 64 69 63 74 69 6f 6e 61 72 79 20 76 61 in dictionary va
7f50: 6c 75 65 0d 0a 20 2a 09 6d 75 73 74 20 6e 6f 74 lue.. *.must not
7f60: 20 62 65 20 73 68 61 72 65 64 2c 20 74 68 6f 75 be shared, thou
7f70: 67 68 20 73 75 62 2d 64 69 63 74 69 6f 6e 61 72 gh sub-dictionar
7f80: 69 65 73 20 6d 61 79 20 62 65 2e 20 20 49 74 20 ies may be. It
7f90: 69 73 20 6e 6f 74 0d 0a 20 2a 09 61 6e 20 65 72 is not.. *.an er
7fa0: 72 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 ror if there is
7fb0: 6e 6f 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 no value associa
7fc0: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 ted with the giv
7fd0: 65 6e 20 6b 65 79 20 6c 69 73 74 2c 0d 0a 20 2a en key list,.. *
7fe0: 09 62 75 74 20 61 6c 6c 20 69 6e 74 65 72 6d 65 .but all interme
7ff0: 64 69 61 74 65 20 64 69 63 74 69 6f 6e 61 72 69 diate dictionari
8000: 65 73 20 6f 6e 20 74 68 65 20 6b 65 79 20 70 61 es on the key pa
8010: 74 68 20 6d 75 73 74 20 65 78 69 73 74 2e 0d 0a th must exist...
8020: 20 2a 0d 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0d *.. * Results:.
8030: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
8040: 63 6c 20 72 65 73 75 6c 74 2e 20 20 4e 6f 74 65 cl result. Note
8050: 20 74 68 61 74 20 69 6e 20 74 68 65 20 65 72 72 that in the err
8060: 6f 72 20 63 61 73 65 2c 20 61 20 6d 65 73 73 61 or case, a messa
8070: 67 65 0d 0a 20 2a 09 69 73 20 6c 65 66 74 20 69 ge.. *.is left i
8080: 6e 20 69 6e 74 65 72 70 20 75 6e 6c 65 73 73 20 n interp unless
8090: 74 68 61 74 20 69 73 20 4e 55 4c 4c 2e 0d 0a 20 that is NULL...
80a0: 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *.. * Side effec
80b0: 74 73 3a 0d 0a 20 2a 09 49 66 20 74 68 65 20 64 ts:.. *.If the d
80c0: 69 63 74 69 6f 6e 61 72 79 20 61 6e 64 20 61 6e ictionary and an
80d0: 79 20 6f 66 20 69 74 73 20 73 75 62 2d 64 69 63 y of its sub-dic
80e0: 74 69 6f 6e 61 72 69 65 73 20 6f 6e 20 74 68 65 tionaries on the
80f0: 20 6b 65 79 0d 0a 20 2a 09 70 61 74 68 20 68 61 key.. *.path ha
8100: 76 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 ve string repres
8110: 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 65 73 65 entations, these
8120: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 are invalidated
8130: 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ... *.. *-------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d ---------------.
8180: 0a 20 2a 2f 0d 0a 0d 0a 69 6e 74 0d 0a 54 63 6c . */....int..Tcl
8190: 5f 44 69 63 74 4f 62 6a 52 65 6d 6f 76 65 4b 65 _DictObjRemoveKe
81a0: 79 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 64 69 yList(interp, di
81b0: 63 74 50 74 72 2c 20 6b 65 79 63 2c 20 6b 65 79 ctPtr, keyc, key
81c0: 76 29 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 v).. Tcl_Inte
81d0: 72 70 20 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 rp *interp;..
81e0: 20 69 6e 74 20 6b 65 79 63 3b 0d 0a 20 20 20 20 int keyc;..
81f0: 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 Tcl_Obj *dictPtr
8200: 2c 20 2a 43 4f 4e 53 54 20 6b 65 79 76 5b 5d 3b , *CONST keyv[];
8210: 0d 0a 7b 0d 0a 20 20 20 20 44 69 63 74 20 2a 64 ..{.. Dict *d
8220: 69 63 74 3b 0d 0a 20 20 20 20 54 63 6c 5f 48 61 ict;.. Tcl_Ha
8230: 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0d 0a shEntry *hPtr;..
8240: 0d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 73 .. if (Tcl_Is
8250: 53 68 61 72 65 64 28 64 69 63 74 50 74 72 29 29 Shared(dictPtr))
8260: 20 7b 0d 0a 09 70 61 6e 69 63 28 22 54 63 6c 5f {...panic("Tcl_
8270: 44 69 63 74 4f 62 6a 52 65 6d 6f 76 65 4b 65 79 DictObjRemoveKey
8280: 4c 69 73 74 20 63 61 6c 6c 65 64 20 77 69 74 68 List called with
8290: 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 22 29 shared object")
82a0: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 ;.. }.. if
82b0: 20 28 6b 65 79 63 20 3c 20 31 29 20 7b 0d 0a 09 (keyc < 1) {...
82c0: 70 61 6e 69 63 28 22 54 63 6c 5f 44 69 63 74 4f panic("Tcl_DictO
82d0: 62 6a 52 65 6d 6f 76 65 4b 65 79 4c 69 73 74 20 bjRemoveKeyList
82e0: 63 61 6c 6c 65 64 20 77 69 74 68 20 65 6d 70 74 called with empt
82f0: 79 20 6b 65 79 20 6c 69 73 74 22 29 3b 0d 0a 20 y key list");..
8300: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 69 63 74 }.... dict
8310: 50 74 72 20 3d 20 54 72 61 63 65 44 69 63 74 50 Ptr = TraceDictP
8320: 61 74 68 28 69 6e 74 65 72 70 2c 20 64 69 63 74 ath(interp, dict
8330: 50 74 72 2c 20 6b 65 79 63 2d 31 2c 20 6b 65 79 Ptr, keyc-1, key
8340: 76 2c 20 2f 2a 77 69 6c 6c 55 70 64 61 74 65 2a v, /*willUpdate*
8350: 2f 20 31 29 3b 0d 0a 20 20 20 20 69 66 20 28 64 / 1);.. if (d
8360: 69 63 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 ictPtr == NULL)
8370: 7b 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
8380: 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a RROR;.. }....
8390: 20 20 20 20 64 69 63 74 20 3d 20 28 44 69 63 74 dict = (Dict
83a0: 20 2a 29 20 64 69 63 74 50 74 72 2d 3e 69 6e 74 *) dictPtr->int
83b0: 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 61 ernalRep.otherVa
83c0: 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 68 50 74 luePtr;.. hPt
83d0: 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 r = Tcl_FindHash
83e0: 45 6e 74 72 79 28 26 64 69 63 74 2d 3e 74 61 62 Entry(&dict->tab
83f0: 6c 65 2c 20 28 63 68 61 72 20 2a 29 6b 65 79 76 le, (char *)keyv
8400: 5b 6b 65 79 63 2d 31 5d 29 3b 0d 0a 20 20 20 20 [keyc-1]);..
8410: 69 66 20 28 68 50 74 72 20 21 3d 20 4e 55 4c 4c if (hPtr != NULL
8420: 29 20 7b 0d 0a 09 54 63 6c 5f 44 65 6c 65 74 65 ) {...Tcl_Delete
8430: 48 61 73 68 45 6e 74 72 79 28 68 50 74 72 29 3b HashEntry(hPtr);
8440: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 49 6e 76 .. }.. Inv
8450: 61 6c 69 64 61 74 65 44 69 63 74 43 68 61 69 6e alidateDictChain
8460: 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 20 20 20 (dictPtr);..
8470: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0d 0a return TCL_OK;..
8480: 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d }...../*.. *----
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84d0: 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 54 63 6c 5f 4e --.. *.. * Tcl_N
84e0: 65 77 4c 69 73 74 4f 62 6a 20 2d 2d 0d 0a 20 2a ewListObj --.. *
84f0: 0d 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 .. *.This proced
8500: 75 72 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 ure is normally
8510: 63 61 6c 6c 65 64 20 77 68 65 6e 20 6e 6f 74 20 called when not
8520: 64 65 62 75 67 67 69 6e 67 3a 20 69 2e 65 2e 2c debugging: i.e.,
8530: 20 77 68 65 6e 0d 0a 20 2a 09 54 43 4c 5f 4d 45 when.. *.TCL_ME
8540: 4d 5f 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 M_DEBUG is not d
8550: 65 66 69 6e 65 64 2e 20 49 74 20 63 72 65 61 74 efined. It creat
8560: 65 73 20 61 20 6e 65 77 20 64 69 63 74 20 6f 62 es a new dict ob
8570: 6a 65 63 74 0d 0a 20 2a 09 77 69 74 68 6f 75 74 ject.. *.without
8580: 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 0d 0a 20 any content...
8590: 2a 0d 0a 20 2a 09 57 68 65 6e 20 54 43 4c 5f 4d *.. *.When TCL_M
85a0: 45 4d 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 EM_DEBUG is defi
85b0: 6e 65 64 2c 20 74 68 69 73 20 70 72 6f 63 65 64 ned, this proced
85c0: 75 72 65 20 6a 75 73 74 20 72 65 74 75 72 6e 73 ure just returns
85d0: 20 74 68 65 0d 0a 20 2a 09 72 65 73 75 6c 74 20 the.. *.result
85e0: 6f 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 64 of calling the d
85f0: 65 62 75 67 67 69 6e 67 20 76 65 72 73 69 6f 6e ebugging version
8600: 20 54 63 6c 5f 44 62 4e 65 77 44 69 63 74 4f 62 Tcl_DbNewDictOb
8610: 6a 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 6c j... *.. * Resul
8620: 74 73 3a 0d 0a 20 2a 09 41 20 6e 65 77 20 64 69 ts:.. *.A new di
8630: 63 74 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 ct object is ret
8640: 75 72 6e 65 64 3b 20 69 74 20 68 61 73 20 6e 6f urned; it has no
8650: 20 6b 65 79 73 20 64 65 66 69 6e 65 64 20 69 6e keys defined in
8660: 20 69 74 2e 0d 0a 20 2a 09 54 68 65 20 6e 65 77 it... *.The new
8670: 20 6f 62 6a 65 63 74 27 73 20 73 74 72 69 6e 67 object's string
8680: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
8690: 69 73 20 6c 65 66 74 20 4e 55 4c 4c 2c 20 61 6e is left NULL, an
86a0: 64 20 74 68 65 0d 0a 20 2a 09 72 65 66 20 63 6f d the.. *.ref co
86b0: 75 6e 74 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 unt of the objec
86c0: 74 20 69 73 20 30 2e 0d 0a 20 2a 0d 0a 20 2a 20 t is 0... *.. *
86d0: 53 69 64 65 20 45 66 66 65 63 74 73 3a 0d 0a 20 Side Effects:..
86e0: 2a 09 4e 6f 6e 65 2e 0d 0a 20 2a 0d 0a 20 2a 2d *.None... *.. *-
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 54 63 -----.. */....Tc
8740: 6c 5f 4f 62 6a 20 2a 0d 0a 54 63 6c 5f 4e 65 77 l_Obj *..Tcl_New
8750: 44 69 63 74 4f 62 6a 28 29 0d 0a 7b 0d 0a 23 69 DictObj()..{..#i
8760: 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 fdef TCL_MEM_DEB
8770: 55 47 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 UG.. return T
8780: 63 6c 5f 44 62 4e 65 77 44 69 63 74 4f 62 6a 28 cl_DbNewDictObj(
8790: 22 75 6e 6b 6e 6f 77 6e 22 2c 20 30 29 3b 0d 0a "unknown", 0);..
87a0: 23 65 6c 73 65 20 2f 2a 20 21 54 43 4c 5f 4d 45 #else /* !TCL_ME
87b0: 4d 5f 44 45 42 55 47 20 2a 2f 0d 0a 20 20 20 20 M_DEBUG */..
87c0: 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 Tcl_Obj *dictPtr
87d0: 3b 0d 0a 20 20 20 20 44 69 63 74 20 2a 64 69 63 ;.. Dict *dic
87e0: 74 3b 0d 0a 0d 0a 20 20 20 20 54 63 6c 4e 65 77 t;.... TclNew
87f0: 4f 62 6a 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 Obj(dictPtr);..
8800: 20 20 20 54 63 6c 5f 49 6e 76 61 6c 69 64 61 74 Tcl_Invalidat
8810: 65 53 74 72 69 6e 67 52 65 70 28 64 69 63 74 50 eStringRep(dictP
8820: 74 72 29 3b 0d 0a 20 20 20 20 64 69 63 74 20 3d tr);.. dict =
8830: 20 28 44 69 63 74 20 2a 29 20 63 6b 61 6c 6c 6f (Dict *) ckallo
8840: 63 28 73 69 7a 65 6f 66 28 44 69 63 74 29 29 3b c(sizeof(Dict));
8850: 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 69 74 4f 62 .. Tcl_InitOb
8860: 6a 48 61 73 68 54 61 62 6c 65 28 26 64 69 63 74 jHashTable(&dict
8870: 2d 3e 74 61 62 6c 65 29 3b 0d 0a 20 20 20 20 64 ->table);.. d
8880: 69 63 74 2d 3e 65 70 6f 63 68 20 3d 20 30 3b 0d ict->epoch = 0;.
8890: 0a 20 20 20 20 64 69 63 74 2d 3e 63 68 61 69 6e . dict->chain
88a0: 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 20 20 64 69 = NULL;.. di
88b0: 63 74 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 ctPtr->internalR
88c0: 65 70 2e 6f 74 68 65 72 56 61 6c 75 65 50 74 72 ep.otherValuePtr
88d0: 20 3d 20 28 56 4f 49 44 20 2a 29 20 64 69 63 74 = (VOID *) dict
88e0: 3b 0d 0a 20 20 20 20 64 69 63 74 50 74 72 2d 3e ;.. dictPtr->
88f0: 74 79 70 65 50 74 72 20 3d 20 26 74 63 6c 44 69 typePtr = &tclDi
8900: 63 74 54 79 70 65 3b 0d 0a 20 20 20 20 72 65 74 ctType;.. ret
8910: 75 72 6e 20 64 69 63 74 50 74 72 3b 0d 0a 23 65 urn dictPtr;..#e
8920: 6e 64 69 66 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a ndif..}...../*..
8930: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a --------.. *.. *
8980: 20 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74 4f 62 Tcl_DbNewListOb
8990: 6a 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 54 68 69 j --.. *.. *.Thi
89a0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 6e s procedure is n
89b0: 6f 72 6d 61 6c 6c 79 20 63 61 6c 6c 65 64 20 77 ormally called w
89c0: 68 65 6e 20 64 65 62 75 67 67 69 6e 67 3a 20 69 hen debugging: i
89d0: 2e 65 2e 2c 20 77 68 65 6e 0d 0a 20 2a 09 54 43 .e., when.. *.TC
89e0: 4c 5f 4d 45 4d 5f 44 45 42 55 47 20 69 73 20 64 L_MEM_DEBUG is d
89f0: 65 66 69 6e 65 64 2e 20 49 74 20 63 72 65 61 74 efined. It creat
8a00: 65 73 20 6e 65 77 20 64 69 63 74 20 6f 62 6a 65 es new dict obje
8a10: 63 74 73 2e 20 49 74 20 69 73 20 74 68 65 0d 0a cts. It is the..
8a20: 20 2a 09 73 61 6d 65 20 61 73 20 74 68 65 20 54 *.same as the T
8a30: 63 6c 5f 4e 65 77 44 69 63 74 4f 62 6a 20 70 72 cl_NewDictObj pr
8a40: 6f 63 65 64 75 72 65 20 61 62 6f 76 65 20 65 78 ocedure above ex
8a50: 63 65 70 74 20 74 68 61 74 20 69 74 20 63 61 6c cept that it cal
8a60: 6c 73 0d 0a 20 2a 09 54 63 6c 5f 44 62 43 6b 61 ls.. *.Tcl_DbCka
8a70: 6c 6c 6f 63 20 64 69 72 65 63 74 6c 79 20 77 69 lloc directly wi
8a80: 74 68 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 th the file name
8a90: 20 61 6e 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 and line number
8aa0: 20 66 72 6f 6d 20 69 74 73 0d 0a 20 2a 09 63 61 from its.. *.ca
8ab0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 69 6d 70 6c ller. This simpl
8ac0: 69 66 69 65 73 20 64 65 62 75 67 67 69 6e 67 20 ifies debugging
8ad0: 73 69 6e 63 65 20 74 68 65 6e 20 74 68 65 20 5b since then the [
8ae0: 6d 65 6d 6f 72 79 20 61 63 74 69 76 65 5d 0d 0a memory active]..
8af0: 20 2a 09 63 6f 6d 6d 61 6e 64 09 77 69 6c 6c 20 *.command.will
8b00: 72 65 70 6f 72 74 20 74 68 65 20 63 6f 72 72 65 report the corre
8b10: 63 74 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 ct file name and
8b20: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 line number whe
8b30: 6e 0d 0a 20 2a 09 72 65 70 6f 72 74 69 6e 67 20 n.. *.reporting
8b40: 6f 62 6a 65 63 74 73 20 74 68 61 74 20 68 61 76 objects that hav
8b50: 65 6e 27 74 20 62 65 65 6e 20 66 72 65 65 64 2e en't been freed.
8b60: 0d 0a 20 2a 0d 0a 20 2a 09 57 68 65 6e 20 54 43 .. *.. *.When TC
8b70: 4c 5f 4d 45 4d 5f 44 45 42 55 47 20 69 73 20 6e L_MEM_DEBUG is n
8b80: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 ot defined, this
8b90: 20 70 72 6f 63 65 64 75 72 65 20 6a 75 73 74 20 procedure just
8ba0: 72 65 74 75 72 6e 73 20 74 68 65 0d 0a 20 2a 09 returns the.. *.
8bb0: 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c 69 6e result of callin
8bc0: 67 20 54 63 6c 5f 4e 65 77 44 69 63 74 4f 62 6a g Tcl_NewDictObj
8bd0: 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 6c 74 ... *.. * Result
8be0: 73 3a 0d 0a 20 2a 09 41 20 6e 65 77 20 64 69 63 s:.. *.A new dic
8bf0: 74 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 t object is retu
8c00: 72 6e 65 64 3b 20 69 74 20 68 61 73 20 6e 6f 20 rned; it has no
8c10: 6b 65 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 keys defined in
8c20: 69 74 2e 0d 0a 20 2a 09 54 68 65 20 6e 65 77 20 it... *.The new
8c30: 6f 62 6a 65 63 74 27 73 20 73 74 72 69 6e 67 20 object's string
8c40: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 representation i
8c50: 73 20 6c 65 66 74 20 4e 55 4c 4c 2c 20 61 6e 64 s left NULL, and
8c60: 20 74 68 65 0d 0a 20 2a 09 72 65 66 20 63 6f 75 the.. *.ref cou
8c70: 6e 74 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 nt of the object
8c80: 20 69 73 20 30 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 is 0... *.. * S
8c90: 69 64 65 20 45 66 66 65 63 74 73 3a 0d 0a 20 2a ide Effects:.. *
8ca0: 09 4e 6f 6e 65 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d .None... *.. *--
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cf0: 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 54 63 6c ----.. */....Tcl
8d00: 5f 4f 62 6a 20 2a 0d 0a 54 63 6c 5f 44 62 4e 65 _Obj *..Tcl_DbNe
8d10: 77 44 69 63 74 4f 62 6a 28 66 69 6c 65 2c 20 6c wDictObj(file, l
8d20: 69 6e 65 29 0d 0a 20 20 20 20 43 4f 4e 53 54 20 ine).. CONST
8d30: 63 68 61 72 20 2a 66 69 6c 65 3b 0d 0a 20 20 20 char *file;..
8d40: 20 69 6e 74 20 6c 69 6e 65 3b 0d 0a 7b 0d 0a 23 int line;..{..#
8d50: 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 ifdef TCL_MEM_DE
8d60: 42 55 47 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a BUG.. Tcl_Obj
8d70: 20 2a 64 69 63 74 50 74 72 3b 0d 0a 20 20 20 20 *dictPtr;..
8d80: 44 69 63 74 20 2a 64 69 63 74 3b 0d 0a 20 20 20 Dict *dict;..
8d90: 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a Tcl_HashTable *
8da0: 68 61 73 68 50 74 72 3b 0d 0a 0d 0a 20 20 20 20 hashPtr;....
8db0: 54 63 6c 44 62 4e 65 77 4f 62 6a 28 64 69 63 74 TclDbNewObj(dict
8dc0: 50 74 72 2c 20 66 69 6c 65 2c 20 6c 69 6e 65 29 Ptr, file, line)
8dd0: 3b 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 76 61 6c ;.. Tcl_Inval
8de0: 69 64 61 74 65 53 74 72 69 6e 67 52 65 70 28 64 idateStringRep(d
8df0: 69 63 74 50 74 72 29 3b 0d 0a 20 20 20 20 64 69 ictPtr);.. di
8e00: 63 74 20 3d 20 28 44 69 63 74 20 2a 29 20 63 6b ct = (Dict *) ck
8e10: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 69 63 alloc(sizeof(Dic
8e20: 74 29 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 49 6e t));.. Tcl_In
8e30: 69 74 4f 62 6a 48 61 73 68 54 61 62 6c 65 28 26 itObjHashTable(&
8e40: 64 69 63 74 2d 3e 74 61 62 6c 65 29 3b 0d 0a 20 dict->table);..
8e50: 20 20 20 64 69 63 74 2d 3e 65 70 6f 63 68 20 3d dict->epoch =
8e60: 20 30 3b 0d 0a 20 20 20 20 64 69 63 74 2d 3e 63 0;.. dict->c
8e70: 68 61 69 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 hain = NULL;..
8e80: 20 20 64 69 63 74 50 74 72 2d 3e 69 6e 74 65 72 dictPtr->inter
8e90: 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 61 6c 75 nalRep.otherValu
8ea0: 65 50 74 72 20 3d 20 28 56 4f 49 44 20 2a 29 20 ePtr = (VOID *)
8eb0: 64 69 63 74 3b 0d 0a 20 20 20 20 64 69 63 74 50 dict;.. dictP
8ec0: 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 20 26 74 tr->typePtr = &t
8ed0: 63 6c 44 69 63 74 54 79 70 65 3b 0d 0a 20 20 20 clDictType;..
8ee0: 20 72 65 74 75 72 6e 20 64 69 63 74 50 74 72 3b return dictPtr;
8ef0: 0d 0a 23 65 6c 73 65 20 2f 2a 20 21 54 43 4c 5f ..#else /* !TCL_
8f00: 4d 45 4d 5f 44 45 42 55 47 20 2a 2f 0d 0a 20 20 MEM_DEBUG */..
8f10: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 return Tcl_New
8f20: 44 69 63 74 4f 62 6a 28 29 3b 0d 0a 23 65 6e 64 DictObj();..#end
8f30: 69 66 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 2a 2a 2a 2a if..}...../*****
8f40: 20 53 54 41 52 54 20 4f 46 20 46 55 4e 43 54 49 START OF FUNCTI
8f50: 4f 4e 53 20 49 4d 50 4c 45 4d 45 4e 54 49 4e 47 ONS IMPLEMENTING
8f60: 20 54 43 4c 20 43 4f 4d 4d 41 4e 44 53 20 2a 2a TCL COMMANDS **
8f70: 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 20 2a 2d 2d ***/..../*.. *--
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 44 69 63 ----.. *.. * Dic
8fd0: 74 43 72 65 61 74 65 43 6d 64 20 2d 2d 0d 0a 20 tCreateCmd --..
8fe0: 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *.. *.This funct
8ff0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 ion implements t
9000: 68 65 20 22 64 69 63 74 20 63 72 65 61 74 65 22 he "dict create"
9010: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 Tcl command...
9020: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 *.See the user d
9030: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
9040: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
9050: 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 it does, and..
9060: 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 *.TIP#??? for th
9070: 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 e formal specifi
9080: 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 cation... *.. *
9090: 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 Results:.. *.A s
90a0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
90b0: 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 lt... *.. * Side
90c0: 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 effects:.. *.Se
90d0: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
90e0: 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 entation... *..
90f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a -------.. */....
9140: 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 static int..Dict
9150: 43 72 65 61 74 65 43 6d 64 28 69 6e 74 65 72 70 CreateCmd(interp
9160: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 , objc, objv)..
9170: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
9180: 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 20 nterp;.. int
9190: 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f objc;.. Tcl_O
91a0: 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b bj *CONST *objv;
91b0: 0d 0a 7b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ..{.. Tcl_Obj
91c0: 20 2a 64 69 63 74 4f 62 6a 3b 0d 0a 20 20 20 20 *dictObj;..
91d0: 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 20 20 2f 2a int i;.... /*
91e0: 0d 0a 20 20 20 20 20 2a 20 4d 75 73 74 20 68 61 .. * Must ha
91f0: 76 65 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 ve an even numbe
9200: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 3b 20 r of arguments;
9210: 6e 6f 74 65 20 74 68 61 74 20 6e 75 6d 62 65 72 note that number
9220: 20 6f 66 0d 0a 20 20 20 20 20 2a 20 70 72 65 63 of.. * prec
9230: 65 64 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 eding arguments
9240: 28 69 2e 65 2e 20 22 64 69 63 74 20 63 72 65 61 (i.e. "dict crea
9250: 74 65 22 20 69 73 20 61 6c 73 6f 20 65 76 65 6e te" is also even
9260: 2c 20 77 68 69 63 68 0d 0a 20 20 20 20 20 2a 20 , which.. *
9270: 6d 61 6b 65 73 20 74 68 69 73 20 6d 75 63 68 20 makes this much
9280: 65 61 73 69 65 72 2e 29 0d 0a 20 20 20 20 20 2a easier.).. *
9290: 2f 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 /.. if (objc
92a0: 26 20 31 29 20 7b 0d 0a 09 54 63 6c 5f 57 72 6f & 1) {...Tcl_Wro
92b0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
92c0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 6b 65 79 , 2, objv, "?key
92d0: 20 76 61 6c 75 65 20 2e 2e 2e 3f 22 29 3b 0d 0a value ...?");..
92e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
92f0: 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 R;.. }....
9300: 20 64 69 63 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e dictObj = Tcl_N
9310: 65 77 44 69 63 74 4f 62 6a 28 29 3b 0d 0a 20 20 ewDictObj();..
9320: 20 20 66 6f 72 20 28 69 3d 32 20 3b 20 69 3c 6f for (i=2 ; i<o
9330: 62 6a 63 20 3b 20 69 2b 3d 32 29 20 7b 0d 0a 09 bjc ; i+=2) {...
9340: 2f 2a 0d 0a 09 20 2a 20 54 68 65 20 6e 65 78 74 /*... * The next
9350: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 73 73 75 command is assu
9360: 6d 65 64 20 74 6f 20 6e 65 76 65 72 20 66 61 69 med to never fai
9370: 6c 2e 2e 2e 0d 0a 09 20 2a 2f 0d 0a 09 54 63 6c l...... */...Tcl
9380: 5f 44 69 63 74 4f 62 6a 50 75 74 28 69 6e 74 65 _DictObjPut(inte
9390: 72 70 2c 20 64 69 63 74 4f 62 6a 2c 20 6f 62 6a rp, dictObj, obj
93a0: 76 5b 69 5d 2c 20 6f 62 6a 76 5b 69 2b 31 5d 29 v[i], objv[i+1])
93b0: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 ;.. }.. Tc
93c0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
93d0: 6e 74 65 72 70 2c 20 64 69 63 74 4f 62 6a 29 3b nterp, dictObj);
93e0: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
93f0: 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a _OK;..}...../*..
9400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a --------.. *.. *
9450: 20 44 69 63 74 47 65 74 43 6d 64 20 2d 2d 0d 0a DictGetCmd --..
9460: 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 *.. *.This func
9470: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 tion implements
9480: 74 68 65 20 22 64 69 63 74 20 67 65 74 22 20 54 the "dict get" T
9490: 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 2a 09 cl command... *.
94a0: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 See the user doc
94b0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
94c0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
94d0: 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 2a 09 t does, and.. *.
94e0: 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 65 20 TIP#??? for the
94f0: 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 63 61 formal specifica
9500: 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 tion... *.. * Re
9510: 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 sults:.. *.A sta
9520: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
9530: 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 ... *.. * Side e
9540: 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 65 20 ffects:.. *.See
9550: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
9560: 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 2d tation... *.. *-
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95b0: 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 -----.. */....st
95c0: 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 47 65 atic int..DictGe
95d0: 74 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a tCmd(interp, obj
95e0: 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 20 54 63 c, objv).. Tc
95f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
9600: 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b ;.. int objc;
9610: 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 .. Tcl_Obj *C
9620: 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d 0a ONST *objv;..{..
9630: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 Tcl_Obj *dic
9640: 74 50 74 72 2c 20 2a 76 61 6c 75 65 50 74 72 20 tPtr, *valuePtr
9650: 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 20 20 69 6e 74 = NULL;.. int
9660: 20 72 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 20 20 result;....
9670: 69 66 20 28 6f 62 6a 63 20 3c 20 33 29 20 7b 0d if (objc < 3) {.
9680: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
9690: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 gs(interp, 2, ob
96a0: 6a 76 2c 20 22 64 69 63 74 69 6f 6e 61 72 79 20 jv, "dictionary
96b0: 3f 6b 65 79 20 6b 65 79 20 2e 2e 2e 3f 22 29 3b ?key key ...?");
96c0: 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
96d0: 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 ROR;.. }....
96e0: 20 20 20 2f 2a 0d 0a 20 20 20 20 20 2a 20 54 65 /*.. * Te
96f0: 73 74 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 st for the speci
9700: 61 6c 20 63 61 73 65 20 6f 66 20 6e 6f 20 6b 65 al case of no ke
9710: 79 73 2c 20 77 68 69 63 68 20 72 65 74 75 72 6e ys, which return
9720: 73 20 61 20 2a 6c 69 73 74 2a 20 6f 66 0d 0a 20 s a *list* of..
9730: 20 20 20 20 2a 20 61 6c 6c 20 6b 65 79 2c 76 61 * all key,va
9740: 6c 75 65 20 70 61 69 72 73 2e 20 20 57 65 20 70 lue pairs. We p
9750: 72 6f 64 75 63 65 20 61 20 63 6f 70 79 20 68 65 roduce a copy he
9760: 72 65 20 62 65 63 61 75 73 65 20 74 68 61 74 20 re because that
9770: 6d 61 6b 65 73 0d 0a 20 20 20 20 20 2a 20 73 75 makes.. * su
9780: 62 73 65 71 75 65 6e 74 20 6c 69 73 74 20 68 61 bsequent list ha
9790: 6e 64 6c 69 6e 67 20 6d 6f 72 65 20 65 66 66 69 ndling more effi
97a0: 63 69 65 6e 74 2e 0d 0a 20 20 20 20 20 2a 2f 0d cient... */.
97b0: 0a 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ... if (objc
97c0: 3d 3d 20 33 29 20 7b 0d 0a 09 54 63 6c 5f 4f 62 == 3) {...Tcl_Ob
97d0: 6a 20 2a 6b 65 79 50 74 72 2c 20 2a 6c 69 73 74 j *keyPtr, *list
97e0: 50 74 72 3b 0d 0a 09 54 63 6c 5f 44 69 63 74 53 Ptr;...Tcl_DictS
97f0: 65 61 72 63 68 20 73 65 61 72 63 68 3b 0d 0a 09 earch search;...
9800: 69 6e 74 20 64 6f 6e 65 3b 0d 0a 0d 0a 09 72 65 int done;.....re
9810: 73 75 6c 74 20 3d 20 54 63 6c 5f 44 69 63 74 4f sult = Tcl_DictO
9820: 62 6a 46 69 72 73 74 28 69 6e 74 65 72 70 2c 20 bjFirst(interp,
9830: 6f 62 6a 76 5b 32 5d 2c 20 26 73 65 61 72 63 68 objv[2], &search
9840: 2c 0d 0a 09 09 26 6b 65 79 50 74 72 2c 20 26 76 ,....&keyPtr, &v
9850: 61 6c 75 65 50 74 72 2c 20 26 64 6f 6e 65 29 3b aluePtr, &done);
9860: 0d 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d ...if (result !=
9870: 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 TCL_OK) {...
9880: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d return result;.
9890: 0a 09 7d 0d 0a 09 6c 69 73 74 50 74 72 20 3d 20 ..}...listPtr =
98a0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
98b0: 2c 20 4e 55 4c 4c 29 3b 0d 0a 09 77 68 69 6c 65 , NULL);...while
98c0: 20 28 21 64 6f 6e 65 29 20 7b 0d 0a 09 20 20 20 (!done) {...
98d0: 20 2f 2a 0d 0a 09 20 20 20 20 20 2a 20 41 73 73 /*... * Ass
98e0: 75 6d 65 20 74 68 65 73 65 20 77 6f 6e 27 74 20 ume these won't
98f0: 66 61 69 6c 20 61 73 20 77 65 20 68 61 76 65 20 fail as we have
9900: 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 72 6f 6c complete control
9910: 0d 0a 09 20 20 20 20 20 2a 20 6f 76 65 72 20 74 ... * over t
9920: 68 65 20 74 79 70 65 73 20 6f 66 20 74 68 69 6e he types of thin
9930: 67 73 20 68 65 72 65 2e 0d 0a 09 20 20 20 20 20 gs here....
9940: 2a 2f 0d 0a 0d 0a 09 20 20 20 20 54 63 6c 5f 4c */..... Tcl_L
9950: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
9960: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
9970: 50 74 72 2c 20 6b 65 79 50 74 72 29 3b 0d 0a 09 Ptr, keyPtr);...
9980: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
9990: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
99a0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 76 61 erp, listPtr, va
99b0: 6c 75 65 50 74 72 29 3b 0d 0a 0d 0a 09 20 20 20 luePtr);.....
99c0: 20 54 63 6c 5f 44 69 63 74 4f 62 6a 4e 65 78 74 Tcl_DictObjNext
99d0: 28 26 73 65 61 72 63 68 2c 20 26 6b 65 79 50 74 (&search, &keyPt
99e0: 72 2c 20 26 76 61 6c 75 65 50 74 72 2c 20 26 64 r, &valuePtr, &d
99f0: 6f 6e 65 29 3b 0d 0a 09 7d 0d 0a 09 54 63 6c 5f one);...}...Tcl_
9a00: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
9a10: 65 72 70 2c 20 6c 69 73 74 50 74 72 29 3b 0d 0a erp, listPtr);..
9a20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0d .return TCL_OK;.
9a30: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a . }.... /*
9a40: 0d 0a 20 20 20 20 20 2a 20 4c 6f 6f 70 20 74 68 .. * Loop th
9a50: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f rough the list o
9a60: 66 20 6b 65 79 73 2c 20 6c 6f 6f 6b 69 6e 67 20 f keys, looking
9a70: 75 70 20 74 68 65 20 6b 65 79 20 61 74 20 74 68 up the key at th
9a80: 65 0d 0a 20 20 20 20 20 2a 20 63 75 72 72 65 6e e.. * curren
9a90: 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 63 t index in the c
9aa0: 75 72 72 65 6e 74 20 64 69 63 74 69 6f 6e 61 72 urrent dictionar
9ab0: 79 20 65 61 63 68 20 74 69 6d 65 2e 20 20 4f 6e y each time. On
9ac0: 63 65 20 77 65 27 76 65 0d 0a 20 20 20 20 20 2a ce we've.. *
9ad0: 20 64 6f 6e 65 20 74 68 65 20 6c 6f 6f 6b 75 70 done the lookup
9ae0: 2c 20 77 65 20 73 65 74 20 74 68 65 20 63 75 72 , we set the cur
9af0: 72 65 6e 74 20 64 69 63 74 69 6f 6e 61 72 79 20 rent dictionary
9b00: 74 6f 20 62 65 20 74 68 65 20 76 61 6c 75 65 0d to be the value.
9b10: 0a 20 20 20 20 20 2a 20 77 65 20 6c 6f 6f 6b 65 . * we looke
9b20: 64 20 75 70 20 28 69 6e 20 63 61 73 65 20 74 68 d up (in case th
9b30: 65 20 76 61 6c 75 65 20 77 61 73 20 6e 6f 74 20 e value was not
9b40: 74 68 65 20 6c 61 73 74 20 6f 6e 65 20 61 6e 64 the last one and
9b50: 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 2a 20 we are.. *
9b60: 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 going through a
9b70: 63 68 61 69 6e 20 6f 66 20 73 65 61 72 63 68 65 chain of searche
9b80: 73 2e 29 20 20 4e 6f 74 65 20 74 68 61 74 20 74 s.) Note that t
9b90: 68 69 73 20 6c 6f 6f 70 20 61 6c 77 61 79 73 0d his loop always.
9ba0: 0a 20 20 20 20 20 2a 20 65 78 65 63 75 74 65 73 . * executes
9bb0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d at least once..
9bc0: 0a 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 64 69 . */.. di
9bd0: 63 74 50 74 72 20 3d 20 54 72 61 63 65 44 69 63 ctPtr = TraceDic
9be0: 74 50 61 74 68 28 69 6e 74 65 72 70 2c 20 6f 62 tPath(interp, ob
9bf0: 6a 76 5b 32 5d 2c 20 6f 62 6a 63 2d 34 2c 20 6f jv[2], objc-4, o
9c00: 62 6a 76 2b 33 2c 20 2f 2a 77 69 6c 6c 55 70 64 bjv+3, /*willUpd
9c10: 61 74 65 2a 2f 20 30 29 3b 0d 0a 20 20 20 20 69 ate*/ 0);.. i
9c20: 66 20 28 64 69 63 74 50 74 72 20 3d 3d 20 4e 55 f (dictPtr == NU
9c30: 4c 4c 29 20 7b 0d 0a 09 72 65 74 75 72 6e 20 54 LL) {...return T
9c40: 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d CL_ERROR;.. }
9c50: 0d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 .. result = T
9c60: 63 6c 5f 44 69 63 74 4f 62 6a 47 65 74 28 69 6e cl_DictObjGet(in
9c70: 74 65 72 70 2c 20 64 69 63 74 50 74 72 2c 20 6f terp, dictPtr, o
9c80: 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 76 61 bjv[objc-1], &va
9c90: 6c 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 69 66 luePtr);.. if
9ca0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
9cb0: 4f 4b 29 20 7b 0d 0a 09 72 65 74 75 72 6e 20 72 OK) {...return r
9cc0: 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 esult;.. }..
9cd0: 20 20 20 69 66 20 28 76 61 6c 75 65 50 74 72 20 if (valuePtr
9ce0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 54 63 6c == NULL) {...Tcl
9cf0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
9d00: 65 72 70 29 3b 0d 0a 09 54 63 6c 5f 41 70 70 65 erp);...Tcl_Appe
9d10: 6e 64 53 74 72 69 6e 67 73 54 6f 4f 62 6a 28 54 ndStringsToObj(T
9d20: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
9d30: 69 6e 74 65 72 70 29 2c 0d 0a 09 09 22 6b 65 79 interp),...."key
9d40: 20 5c 22 22 2c 20 54 63 6c 47 65 74 53 74 72 69 \"", TclGetStri
9d50: 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 29 ng(objv[objc-1])
9d60: 2c 0d 0a 09 09 22 5c 22 20 6e 6f 74 20 6b 6e 6f ,...."\" not kno
9d70: 77 6e 20 69 6e 20 64 69 63 74 69 6f 6e 61 72 79 wn in dictionary
9d80: 22 2c 20 4e 55 4c 4c 29 3b 0d 0a 09 72 65 74 75 ", NULL);...retu
9d90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 rn TCL_ERROR;..
9da0: 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
9db0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
9dc0: 70 2c 20 76 61 6c 75 65 50 74 72 29 3b 0d 0a 20 p, valuePtr);..
9dd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
9de0: 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d ;..}...../*.. *-
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e30: 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 44 69 -----.. *.. * Di
9e40: 63 74 52 65 70 6c 61 63 65 43 6d 64 20 2d 2d 0d ctReplaceCmd --.
9e50: 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e . *.. *.This fun
9e60: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 ction implements
9e70: 20 74 68 65 20 22 64 69 63 74 20 72 65 70 6c 61 the "dict repla
9e80: 63 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e ce" Tcl command.
9e90: 0d 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 .. *.See the use
9ea0: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
9eb0: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 for details on w
9ec0: 68 61 74 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 hat it does, and
9ed0: 0d 0a 20 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 .. *.TIP#??? for
9ee0: 20 74 68 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 the formal spec
9ef0: 69 66 69 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a ification... *..
9f00: 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 * Results:.. *.
9f10: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
9f20: 65 73 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 esult... *.. * S
9f30: 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a ide effects:.. *
9f40: 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f .See the user do
9f50: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a cumentation... *
9f60: 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d ----------.. */.
9fb0: 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 ...static int..D
9fc0: 69 63 74 52 65 70 6c 61 63 65 43 6d 64 28 69 6e ictReplaceCmd(in
9fd0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
9fe0: 29 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ).. Tcl_Inter
9ff0: 70 20 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 p *interp;..
a000: 69 6e 74 20 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 int objc;.. T
a010: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f cl_Obj *CONST *o
a020: 62 6a 76 3b 0d 0a 7b 0d 0a 20 20 20 20 54 63 6c bjv;..{.. Tcl
a030: 5f 4f 62 6a 20 2a 64 69 63 74 50 74 72 3b 0d 0a _Obj *dictPtr;..
a040: 20 20 20 20 69 6e 74 20 69 2c 20 72 65 73 75 6c int i, resul
a050: 74 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 28 6f t;.... if ((o
a060: 62 6a 63 20 3c 20 33 29 20 7c 7c 20 21 28 6f 62 bjc < 3) || !(ob
a070: 6a 63 20 26 20 31 29 29 20 7b 0d 0a 09 54 63 6c jc & 1)) {...Tcl
a080: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
a090: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
a0a0: 64 69 63 74 69 6f 6e 61 72 79 20 3f 6b 65 79 20 dictionary ?key
a0b0: 76 61 6c 75 65 20 2e 2e 2e 3f 22 29 3b 0d 0a 09 value ...?");...
a0c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a0d0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
a0e0: 64 69 63 74 50 74 72 20 3d 20 6f 62 6a 76 5b 32 dictPtr = objv[2
a0f0: 5d 3b 0d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f ];.. if (Tcl_
a100: 49 73 53 68 61 72 65 64 28 64 69 63 74 50 74 72 IsShared(dictPtr
a110: 29 29 20 7b 0d 0a 09 64 69 63 74 50 74 72 20 3d )) {...dictPtr =
a120: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
a130: 6a 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 20 20 j(dictPtr);..
a140: 20 7d 0d 0a 20 20 20 20 66 6f 72 20 28 69 3d 33 }.. for (i=3
a150: 20 3b 20 69 3c 6f 62 6a 63 20 3b 20 69 2b 3d 32 ; i<objc ; i+=2
a160: 29 20 7b 0d 0a 09 72 65 73 75 6c 74 20 3d 20 54 ) {...result = T
a170: 63 6c 5f 44 69 63 74 4f 62 6a 50 75 74 28 69 6e cl_DictObjPut(in
a180: 74 65 72 70 2c 20 64 69 63 74 50 74 72 2c 20 6f terp, dictPtr, o
a190: 62 6a 76 5b 69 5d 2c 20 6f 62 6a 76 5b 69 2b 31 bjv[i], objv[i+1
a1a0: 5d 29 3b 0d 0a 09 69 66 20 28 72 65 73 75 6c 74 ]);...if (result
a1b0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 != TCL_OK) {...
a1c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
a1d0: 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 20 20 20 20 7d RROR;...}.. }
a1e0: 0d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
a1f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 Result(interp, d
a200: 69 63 74 50 74 72 29 3b 0d 0a 20 20 20 20 72 65 ictPtr);.. re
a210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0d 0a 7d 0d turn TCL_OK;..}.
a220: 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d ..../*.. *------
a230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a270: 0d 0a 20 2a 0d 0a 20 2a 20 44 69 63 74 52 65 6d .. *.. * DictRem
a280: 6f 76 65 43 6d 64 20 2d 2d 0d 0a 20 2a 0d 0a 20 oveCmd --.. *..
a290: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
a2a0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 22 implements the "
a2b0: 64 69 63 74 20 72 65 6d 6f 76 65 22 20 54 63 6c dict remove" Tcl
a2c0: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 2a 09 53 65 command... *.Se
a2d0: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
a2e0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
a2f0: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
a300: 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 2a 09 54 49 does, and.. *.TI
a310: 50 23 3f 3f 3f 20 66 6f 72 20 74 68 65 20 66 6f P#??? for the fo
a320: 72 6d 61 6c 20 73 70 65 63 69 66 69 63 61 74 69 rmal specificati
a330: 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 on... *.. * Resu
a340: 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 6e 64 lts:.. *.A stand
a350: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0d ard Tcl result..
a360: 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 . *.. * Side eff
a370: 65 63 74 73 3a 0d 0a 20 2a 09 53 65 65 20 74 68 ects:.. *.See th
a380: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
a390: 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d tion... *.. *---
a3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3e0: 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 ---.. */....stat
a3f0: 69 63 20 69 6e 74 0d 0a 44 69 63 74 52 65 6d 6f ic int..DictRemo
a400: 76 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 veCmd(interp, ob
a410: 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 20 54 jc, objv).. T
a420: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
a430: 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 p;.. int objc
a440: 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
a450: 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d CONST *objv;..{.
a460: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 . Tcl_Obj *di
a470: 63 74 50 74 72 3b 0d 0a 20 20 20 20 69 6e 74 20 ctPtr;.. int
a480: 69 2c 20 72 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 i, result;....
a490: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 29 20 if (objc < 3)
a4a0: 7b 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
a4b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
a4c0: 6f 62 6a 76 2c 20 22 64 69 63 74 69 6f 6e 61 72 objv, "dictionar
a4d0: 79 20 3f 6b 65 79 20 2e 2e 2e 3f 22 29 3b 0d 0a y ?key ...?");..
a4e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
a4f0: 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 R;.. }....
a500: 20 64 69 63 74 50 74 72 20 3d 20 6f 62 6a 76 5b dictPtr = objv[
a510: 32 5d 3b 0d 0a 20 20 20 20 69 66 20 28 54 63 6c 2];.. if (Tcl
a520: 5f 49 73 53 68 61 72 65 64 28 64 69 63 74 50 74 _IsShared(dictPt
a530: 72 29 29 20 7b 0d 0a 09 64 69 63 74 50 74 72 20 r)) {...dictPtr
a540: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
a550: 62 6a 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 20 bj(dictPtr);..
a560: 20 20 7d 0d 0a 20 20 20 20 66 6f 72 20 28 69 3d }.. for (i=
a570: 33 20 3b 20 69 3c 6f 62 6a 63 20 3b 20 69 2b 2b 3 ; i<objc ; i++
a580: 29 20 7b 0d 0a 09 72 65 73 75 6c 74 20 3d 20 54 ) {...result = T
a590: 63 6c 5f 44 69 63 74 4f 62 6a 52 65 6d 6f 76 65 cl_DictObjRemove
a5a0: 28 69 6e 74 65 72 70 2c 20 64 69 63 74 50 74 72 (interp, dictPtr
a5b0: 2c 20 6f 62 6a 76 5b 69 5d 29 3b 0d 0a 09 69 66 , objv[i]);...if
a5c0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
a5d0: 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 72 65 74 75 OK) {... retu
a5e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 09 rn TCL_ERROR;...
a5f0: 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 }.. }.. Tc
a600: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
a610: 6e 74 65 72 70 2c 20 64 69 63 74 50 74 72 29 3b nterp, dictPtr);
a620: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
a630: 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a _OK;..}...../*..
a640: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a --------.. *.. *
a690: 20 44 69 63 74 4b 65 79 73 43 6d 64 20 2d 2d 0d DictKeysCmd --.
a6a0: 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e . *.. *.This fun
a6b0: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 ction implements
a6c0: 20 74 68 65 20 22 64 69 63 74 20 6b 65 79 73 22 the "dict keys"
a6d0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 Tcl command...
a6e0: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 *.See the user d
a6f0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
a700: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
a710: 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 it does, and..
a720: 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 *.TIP#??? for th
a730: 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 e formal specifi
a740: 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 cation... *.. *
a750: 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 Results:.. *.A s
a760: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
a770: 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 lt... *.. * Side
a780: 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 effects:.. *.Se
a790: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
a7a0: 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 entation... *..
a7b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7f0: 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a -------.. */....
a800: 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 static int..Dict
a810: 4b 65 79 73 43 6d 64 28 69 6e 74 65 72 70 2c 20 KeysCmd(interp,
a820: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 objc, objv)..
a830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
a840: 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 erp;.. int ob
a850: 6a 63 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a jc;.. Tcl_Obj
a860: 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a *CONST *objv;..
a870: 7b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {.. Tcl_Obj *
a880: 6b 65 79 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 keyPtr, *listPtr
a890: 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 69 63 74 53 ;.. Tcl_DictS
a8a0: 65 61 72 63 68 20 73 65 61 72 63 68 3b 0d 0a 20 earch search;..
a8b0: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 2c 20 64 int result, d
a8c0: 6f 6e 65 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a one;.. char *
a8d0: 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0d pattern = NULL;.
a8e0: 0a 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 21 ... if (objc!
a8f0: 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 29 20 7b =3 && objc!=4) {
a900: 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ...Tcl_WrongNumA
a910: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f rgs(interp, 2, o
a920: 62 6a 76 2c 20 22 64 69 63 74 69 6f 6e 61 72 79 bjv, "dictionary
a930: 20 3f 70 61 74 74 65 72 6e 3f 22 29 3b 0d 0a 09 ?pattern?");...
a940: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a950: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
a960: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 44 69 63 result = Tcl_Dic
a970: 74 4f 62 6a 46 69 72 73 74 28 69 6e 74 65 72 70 tObjFirst(interp
a980: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 73 65 61 72 , objv[2], &sear
a990: 63 68 2c 20 26 6b 65 79 50 74 72 2c 20 4e 55 4c ch, &keyPtr, NUL
a9a0: 4c 2c 20 26 64 6f 6e 65 29 3b 0d 0a 20 20 20 20 L, &done);..
a9b0: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 if (result != TC
a9c0: 4c 5f 4f 4b 29 20 7b 0d 0a 09 72 65 74 75 72 6e L_OK) {...return
a9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 TCL_ERROR;..
a9e0: 20 7d 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 }.. if (objc
a9f0: 20 3d 3d 20 34 29 20 7b 0d 0a 09 70 61 74 74 65 == 4) {...patte
aa00: 72 6e 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e rn = TclGetStrin
aa10: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0d 0a 20 20 20 g(objv[3]);..
aa20: 20 7d 0d 0a 20 20 20 20 6c 69 73 74 50 74 72 20 }.. listPtr
aa30: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
aa40: 28 30 2c 20 4e 55 4c 4c 29 3b 0d 0a 20 20 20 20 (0, NULL);..
aa50: 66 6f 72 20 28 3b 20 21 64 6f 6e 65 20 3b 20 54 for (; !done ; T
aa60: 63 6c 5f 44 69 63 74 4f 62 6a 4e 65 78 74 28 26 cl_DictObjNext(&
aa70: 73 65 61 72 63 68 2c 20 26 6b 65 79 50 74 72 2c search, &keyPtr,
aa80: 20 4e 55 4c 4c 2c 20 26 64 6f 6e 65 29 29 20 7b NULL, &done)) {
aa90: 0d 0a 09 69 66 20 28 70 61 74 74 65 72 6e 3d 3d ...if (pattern==
aaa0: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 53 74 72 69 NULL || Tcl_Stri
aab0: 6e 67 4d 61 74 63 68 28 54 63 6c 47 65 74 53 74 ngMatch(TclGetSt
aac0: 72 69 6e 67 28 6b 65 79 50 74 72 29 2c 20 70 61 ring(keyPtr), pa
aad0: 74 74 65 72 6e 29 29 20 7b 0d 0a 09 20 20 20 20 ttern)) {...
aae0: 2f 2a 0d 0a 09 20 20 20 20 20 2a 20 41 73 73 75 /*... * Assu
aaf0: 6d 65 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f me this operatio
ab00: 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 n always succeed
ab10: 73 2e 0d 0a 09 20 20 20 20 20 2a 2f 0d 0a 09 20 s.... */...
ab20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
ab30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ab40: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 6b 65 79 rp, listPtr, key
ab50: 50 74 72 29 3b 0d 0a 09 7d 0d 0a 20 20 20 20 7d Ptr);...}.. }
ab60: 0d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
ab70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c Result(interp, l
ab80: 69 73 74 50 74 72 29 3b 0d 0a 20 20 20 20 72 65 istPtr);.. re
ab90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0d 0a 7d 0d turn TCL_OK;..}.
aba0: 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d ..../*.. *------
abb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 0d 0a 20 2a 0d 0a 20 2a 20 44 69 63 74 56 61 6c .. *.. * DictVal
ac00: 75 65 73 43 6d 64 20 2d 2d 0d 0a 20 2a 0d 0a 20 uesCmd --.. *..
ac10: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
ac20: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 22 implements the "
ac30: 64 69 63 74 20 76 61 6c 75 65 73 22 20 54 63 6c dict values" Tcl
ac40: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 2a 09 53 65 command... *.Se
ac50: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
ac60: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
ac70: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
ac80: 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 2a 09 54 49 does, and.. *.TI
ac90: 50 23 3f 3f 3f 20 66 6f 72 20 74 68 65 20 66 6f P#??? for the fo
aca0: 72 6d 61 6c 20 73 70 65 63 69 66 69 63 61 74 69 rmal specificati
acb0: 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 on... *.. * Resu
acc0: 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 6e 64 lts:.. *.A stand
acd0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0d ard Tcl result..
ace0: 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 . *.. * Side eff
acf0: 65 63 74 73 3a 0d 0a 20 2a 09 53 65 65 20 74 68 ects:.. *.See th
ad00: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
ad10: 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d tion... *.. *---
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad60: 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 ---.. */....stat
ad70: 69 63 20 69 6e 74 0d 0a 44 69 63 74 56 61 6c 75 ic int..DictValu
ad80: 65 73 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 esCmd(interp, ob
ad90: 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 20 54 jc, objv).. T
ada0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
adb0: 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 p;.. int objc
adc0: 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
add0: 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d CONST *objv;..{.
ade0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 61 . Tcl_Obj *va
adf0: 6c 75 65 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 luePtr, *listPtr
ae00: 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 69 63 74 53 ;.. Tcl_DictS
ae10: 65 61 72 63 68 20 73 65 61 72 63 68 3b 0d 0a 20 earch search;..
ae20: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 2c 20 64 int result, d
ae30: 6f 6e 65 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a one;.. char *
ae40: 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0d pattern = NULL;.
ae50: 0a 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 21 ... if (objc!
ae60: 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 29 20 7b =3 && objc!=4) {
ae70: 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ...Tcl_WrongNumA
ae80: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f rgs(interp, 2, o
ae90: 62 6a 76 2c 20 22 64 69 63 74 69 6f 6e 61 72 79 bjv, "dictionary
aea0: 20 3f 70 61 74 74 65 72 6e 3f 22 29 3b 0d 0a 09 ?pattern?");...
aeb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
aec0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
aed0: 72 65 73 75 6c 74 3d 20 54 63 6c 5f 44 69 63 74 result= Tcl_Dict
aee0: 4f 62 6a 46 69 72 73 74 28 69 6e 74 65 72 70 2c ObjFirst(interp,
aef0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 73 65 61 72 63 objv[2], &searc
af00: 68 2c 20 4e 55 4c 4c 2c 20 26 76 61 6c 75 65 50 h, NULL, &valueP
af10: 74 72 2c 20 26 64 6f 6e 65 29 3b 0d 0a 20 20 20 tr, &done);..
af20: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 if (result != T
af30: 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 72 65 74 75 72 CL_OK) {...retur
af40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 n TCL_ERROR;..
af50: 20 20 7d 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a }.. if (obj
af60: 63 20 3d 3d 20 34 29 20 7b 0d 0a 09 70 61 74 74 c == 4) {...patt
af70: 65 72 6e 20 3d 20 54 63 6c 47 65 74 53 74 72 69 ern = TclGetStri
af80: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0d 0a 20 20 ng(objv[3]);..
af90: 20 20 7d 0d 0a 20 20 20 20 6c 69 73 74 50 74 72 }.. listPtr
afa0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
afb0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0d 0a 20 20 20 j(0, NULL);..
afc0: 20 66 6f 72 20 28 3b 20 21 64 6f 6e 65 20 3b 20 for (; !done ;
afd0: 54 63 6c 5f 44 69 63 74 4f 62 6a 4e 65 78 74 28 Tcl_DictObjNext(
afe0: 26 73 65 61 72 63 68 2c 20 4e 55 4c 4c 2c 20 26 &search, NULL, &
aff0: 76 61 6c 75 65 50 74 72 2c 20 26 64 6f 6e 65 29 valuePtr, &done)
b000: 29 20 7b 0d 0a 09 69 66 20 28 70 61 74 74 65 72 ) {...if (patter
b010: 6e 3d 3d 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 53 n==NULL || Tcl_S
b020: 74 72 69 6e 67 4d 61 74 63 68 28 54 63 6c 47 65 tringMatch(TclGe
b030: 74 53 74 72 69 6e 67 28 76 61 6c 75 65 50 74 72 tString(valuePtr
b040: 29 2c 70 61 74 74 65 72 6e 29 29 20 7b 0d 0a 09 ),pattern)) {...
b050: 20 20 20 20 2f 2a 0d 0a 09 20 20 20 20 20 2a 20 /*... *
b060: 41 73 73 75 6d 65 20 74 68 69 73 20 6f 70 65 72 Assume this oper
b070: 61 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 ation always suc
b080: 63 65 65 64 73 2e 0d 0a 09 20 20 20 20 20 2a 2f ceeds.... */
b090: 0d 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ... Tcl_ListO
b0a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
b0b0: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
b0c0: 20 76 61 6c 75 65 50 74 72 29 3b 0d 0a 09 7d 0d valuePtr);...}.
b0d0: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
b0e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
b0f0: 65 72 70 2c 20 6c 69 73 74 50 74 72 29 3b 0d 0a erp, listPtr);..
b100: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
b110: 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a K;..}...../*.. *
b120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b160: 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 44 ------.. *.. * D
b170: 69 63 74 53 69 7a 65 43 6d 64 20 2d 2d 0d 0a 20 ictSizeCmd --..
b180: 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *.. *.This funct
b190: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 ion implements t
b1a0: 68 65 20 22 64 69 63 74 20 73 69 7a 65 22 20 54 he "dict size" T
b1b0: 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 2a 09 cl command... *.
b1c0: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 See the user doc
b1d0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
b1e0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
b1f0: 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 2a 09 t does, and.. *.
b200: 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 65 20 TIP#??? for the
b210: 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 63 61 formal specifica
b220: 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 tion... *.. * Re
b230: 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 sults:.. *.A sta
b240: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
b250: 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 ... *.. * Side e
b260: 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 65 20 ffects:.. *.See
b270: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
b280: 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 2d tation... *.. *-
b290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2d0: 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 -----.. */....st
b2e0: 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 53 69 atic int..DictSi
b2f0: 7a 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 zeCmd(interp, ob
b300: 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 20 54 jc, objv).. T
b310: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
b320: 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 p;.. int objc
b330: 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
b340: 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d CONST *objv;..{.
b350: 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 2c . int result,
b360: 20 73 69 7a 65 3b 0d 0a 0d 0a 20 20 20 20 69 66 size;.... if
b370: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0d 0a (objc != 3) {..
b380: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
b390: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a s(interp, 2, obj
b3a0: 76 2c 20 22 64 69 63 74 69 6f 6e 61 72 79 22 29 v, "dictionary")
b3b0: 3b 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
b3c0: 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 RROR;.. }..
b3d0: 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 44 result = Tcl_D
b3e0: 69 63 74 4f 62 6a 53 69 7a 65 28 69 6e 74 65 72 ictObjSize(inter
b3f0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 73 69 7a p, objv[2], &siz
b400: 65 29 3b 0d 0a 20 20 20 20 69 66 20 28 72 65 73 e);.. if (res
b410: 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ult == TCL_OK) {
b420: 0d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
b430: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
b440: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 NewIntObj(size))
b450: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 ;.. }.. re
b460: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 7d 0d turn result;..}.
b470: 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d ..../*.. *------
b480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4c0: 0d 0a 20 2a 0d 0a 20 2a 20 44 69 63 74 45 78 69 .. *.. * DictExi
b4d0: 73 74 73 43 6d 64 20 2d 2d 0d 0a 20 2a 0d 0a 20 stsCmd --.. *..
b4e0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
b4f0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 22 implements the "
b500: 64 69 63 74 20 65 78 69 73 74 73 22 20 54 63 6c dict exists" Tcl
b510: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 2a 09 53 65 command... *.Se
b520: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
b530: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
b540: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
b550: 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 2a 09 54 49 does, and.. *.TI
b560: 50 23 3f 3f 3f 20 66 6f 72 20 74 68 65 20 66 6f P#??? for the fo
b570: 72 6d 61 6c 20 73 70 65 63 69 66 69 63 61 74 69 rmal specificati
b580: 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 65 73 75 on... *.. * Resu
b590: 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 61 6e 64 lts:.. *.A stand
b5a0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0d ard Tcl result..
b5b0: 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 65 66 66 . *.. * Side eff
b5c0: 65 63 74 73 3a 0d 0a 20 2a 09 53 65 65 20 74 68 ects:.. *.See th
b5d0: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
b5e0: 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d tion... *.. *---
b5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b630: 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 74 61 74 ---.. */....stat
b640: 69 63 20 69 6e 74 0d 0a 44 69 63 74 45 78 69 73 ic int..DictExis
b650: 74 73 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 tsCmd(interp, ob
b660: 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 20 54 jc, objv).. T
b670: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
b680: 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 p;.. int objc
b690: 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
b6a0: 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d CONST *objv;..{.
b6b0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 . Tcl_Obj *di
b6c0: 63 74 50 74 72 2c 20 2a 76 61 6c 75 65 50 74 72 ctPtr, *valuePtr
b6d0: 3b 0d 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c ;.. int resul
b6e0: 74 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 6f 62 t;.... if (ob
b6f0: 6a 63 20 3c 20 34 29 20 7b 0d 0a 09 54 63 6c 5f jc < 4) {...Tcl_
b700: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
b710: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 64 erp, 2, objv, "d
b720: 69 63 74 69 6f 6e 61 72 79 20 6b 65 79 20 3f 6b ictionary key ?k
b730: 65 79 20 2e 2e 2e 3f 22 29 3b 0d 0a 09 72 65 74 ey ...?");...ret
b740: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a urn TCL_ERROR;..
b750: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 69 63 }.... dic
b760: 74 50 74 72 20 3d 20 54 72 61 63 65 44 69 63 74 tPtr = TraceDict
b770: 50 61 74 68 28 69 6e 74 65 72 70 2c 20 6f 62 6a Path(interp, obj
b780: 76 5b 32 5d 2c 20 6f 62 6a 63 2d 34 2c 20 6f 62 v[2], objc-4, ob
b790: 6a 76 2b 33 2c 20 2f 2a 77 69 6c 6c 55 70 64 61 jv+3, /*willUpda
b7a0: 74 65 2a 2f 20 30 29 3b 0d 0a 20 20 20 20 69 66 te*/ 0);.. if
b7b0: 20 28 64 69 63 74 50 74 72 20 3d 3d 20 4e 55 4c (dictPtr == NUL
b7c0: 4c 29 20 7b 0d 0a 09 72 65 74 75 72 6e 20 54 43 L) {...return TC
b7d0: 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d L_ERROR;.. }.
b7e0: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 . result = Tc
b7f0: 6c 5f 44 69 63 74 4f 62 6a 47 65 74 28 69 6e 74 l_DictObjGet(int
b800: 65 72 70 2c 20 64 69 63 74 50 74 72 2c 20 6f 62 erp, dictPtr, ob
b810: 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 76 61 6c jv[objc-1], &val
b820: 75 65 50 74 72 29 3b 0d 0a 20 20 20 20 69 66 20 uePtr);.. if
b830: 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f (result != TCL_O
b840: 4b 29 20 7b 0d 0a 09 72 65 74 75 72 6e 20 72 65 K) {...return re
b850: 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 sult;.. }..
b860: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
b870: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
b880: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 76 61 6c ewBooleanObj(val
b890: 75 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 29 3b uePtr != NULL));
b8a0: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b8b0: 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a _OK;..}...../*..
b8c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
b8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a --------.. *.. *
b910: 20 44 69 63 74 49 6e 66 6f 43 6d 64 20 2d 2d 0d DictInfoCmd --.
b920: 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e . *.. *.This fun
b930: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 ction implements
b940: 20 74 68 65 20 22 64 69 63 74 20 69 6e 66 6f 22 the "dict info"
b950: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 Tcl command...
b960: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 *.See the user d
b970: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
b980: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
b990: 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 it does, and..
b9a0: 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 *.TIP#??? for th
b9b0: 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 e formal specifi
b9c0: 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 cation... *.. *
b9d0: 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 Results:.. *.A s
b9e0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
b9f0: 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 lt... *.. * Side
ba00: 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 effects:.. *.Se
ba10: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
ba20: 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 entation... *..
ba30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
ba40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ba50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ba60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ba70: 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a -------.. */....
ba80: 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 static int..Dict
ba90: 49 6e 66 6f 43 6d 64 28 69 6e 74 65 72 70 2c 20 InfoCmd(interp,
baa0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 objc, objv)..
bab0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
bac0: 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 erp;.. int ob
bad0: 6a 63 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a jc;.. Tcl_Obj
bae0: 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a *CONST *objv;..
baf0: 7b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {.. Tcl_Obj *
bb00: 64 69 63 74 50 74 72 3b 0d 0a 20 20 20 20 44 69 dictPtr;.. Di
bb10: 63 74 20 2a 64 69 63 74 3b 0d 0a 0d 0a 20 20 20 ct *dict;....
bb20: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 if (objc != 3)
bb30: 7b 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
bb40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
bb50: 6f 62 6a 76 2c 20 22 64 69 63 74 69 6f 6e 61 72 objv, "dictionar
bb60: 79 22 29 3b 0d 0a 09 72 65 74 75 72 6e 20 54 43 y");...return TC
bb70: 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d L_ERROR;.. }.
bb80: 0a 0d 0a 20 20 20 20 64 69 63 74 50 74 72 20 3d ... dictPtr =
bb90: 20 6f 62 6a 76 5b 32 5d 3b 0d 0a 20 20 20 20 69 objv[2];.. i
bba0: 66 20 28 64 69 63 74 50 74 72 2d 3e 74 79 70 65 f (dictPtr->type
bbb0: 50 74 72 20 21 3d 20 26 74 63 6c 44 69 63 74 54 Ptr != &tclDictT
bbc0: 79 70 65 29 20 7b 0d 0a 09 69 6e 74 20 72 65 73 ype) {...int res
bbd0: 75 6c 74 20 3d 20 53 65 74 44 69 63 74 46 72 6f ult = SetDictFro
bbe0: 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20 64 69 63 mAny(interp, dic
bbf0: 74 50 74 72 29 3b 0d 0a 09 69 66 20 28 72 65 73 tPtr);...if (res
bc00: 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ult != TCL_OK) {
bc10: 0d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 ... return re
bc20: 73 75 6c 74 3b 0d 0a 09 7d 0d 0a 20 20 20 20 7d sult;...}.. }
bc30: 0d 0a 20 20 20 20 64 69 63 74 20 3d 20 28 44 69 .. dict = (Di
bc40: 63 74 20 2a 29 64 69 63 74 50 74 72 2d 3e 69 6e ct *)dictPtr->in
bc50: 74 65 72 6e 61 6c 52 65 70 2e 6f 74 68 65 72 56 ternalRep.otherV
bc60: 61 6c 75 65 50 74 72 3b 0d 0a 20 20 20 20 54 63 aluePtr;.. Tc
bc70: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
bc80: 6e 74 65 72 70 2c 0d 0a 09 20 20 20 20 54 63 6c nterp,... Tcl
bc90: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
bca0: 6c 5f 48 61 73 68 53 74 61 74 73 28 26 64 69 63 l_HashStats(&dic
bcb0: 74 2d 3e 74 61 62 6c 65 29 2c 20 2d 31 29 29 3b t->table), -1));
bcc0: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bcd0: 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a _OK;..}...../*..
bce0: 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
bd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a --------.. *.. *
bd30: 20 44 69 63 74 49 6e 63 72 43 6d 64 20 2d 2d 0d DictIncrCmd --.
bd40: 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e . *.. *.This fun
bd50: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 ction implements
bd60: 20 74 68 65 20 22 64 69 63 74 20 69 6e 63 72 22 the "dict incr"
bd70: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 Tcl command...
bd80: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 *.See the user d
bd90: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
bda0: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
bdb0: 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 it does, and..
bdc0: 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 *.TIP#??? for th
bdd0: 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 e formal specifi
bde0: 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 cation... *.. *
bdf0: 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 Results:.. *.A s
be00: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
be10: 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 lt... *.. * Side
be20: 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 effects:.. *.Se
be30: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
be40: 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 entation... *..
be50: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
be60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be90: 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a -------.. */....
bea0: 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 static int..Dict
beb0: 49 6e 63 72 43 6d 64 28 69 6e 74 65 72 70 2c 20 IncrCmd(interp,
bec0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 objc, objv)..
bed0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
bee0: 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 erp;.. int ob
bef0: 6a 63 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a jc;.. Tcl_Obj
bf00: 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a *CONST *objv;..
bf10: 7b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {.. Tcl_Obj *
bf20: 64 69 63 74 50 74 72 2c 20 2a 76 61 6c 75 65 50 dictPtr, *valueP
bf30: 74 72 2c 20 2a 72 65 73 75 6c 74 50 74 72 3b 0d tr, *resultPtr;.
bf40: 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 2c . int result,
bf50: 20 69 6e 63 72 56 61 6c 75 65 3b 0d 0a 0d 0a 20 incrValue;....
bf60: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 34 20 if (objc < 4
bf70: 7c 7c 20 6f 62 6a 63 20 3e 20 35 29 20 7b 0d 0a || objc > 5) {..
bf80: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
bf90: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a s(interp, 2, obj
bfa0: 76 2c 20 22 76 61 72 4e 61 6d 65 20 6b 65 79 20 v, "varName key
bfb0: 3f 69 6e 63 72 65 6d 65 6e 74 3f 22 29 3b 0d 0a ?increment?");..
bfc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
bfd0: 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 R;.. }....
bfe0: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 35 29 20 if (objc == 5)
bff0: 7b 0d 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c {...result = Tcl
c000: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
c010: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 nterp, objv[4],
c020: 26 69 6e 63 72 56 61 6c 75 65 29 3b 0d 0a 09 69 &incrValue);...i
c030: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c f (result != TCL
c040: 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 72 65 74 _OK) {... ret
c050: 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 09 7d 0d urn result;...}.
c060: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 09 . } else {...
c070: 69 6e 63 72 56 61 6c 75 65 20 3d 20 31 3b 0d 0a incrValue = 1;..
c080: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 69 63 }.... dic
c090: 74 50 74 72 20 3d 20 54 63 6c 5f 4f 62 6a 47 65 tPtr = Tcl_ObjGe
c0a0: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 tVar2(interp, ob
c0b0: 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 30 29 3b jv[2], NULL, 0);
c0c0: 0d 0a 20 20 20 20 69 66 20 28 64 69 63 74 50 74 .. if (dictPt
c0d0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 64 r == NULL) {...d
c0e0: 69 63 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 ictPtr = Tcl_New
c0f0: 44 69 63 74 4f 62 6a 28 29 3b 0d 0a 09 54 63 6c DictObj();...Tcl
c100: 5f 44 69 63 74 4f 62 6a 50 75 74 28 69 6e 74 65 _DictObjPut(inte
c110: 72 70 2c 20 64 69 63 74 50 74 72 2c 20 6f 62 6a rp, dictPtr, obj
c120: 76 5b 33 5d 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 v[3], Tcl_NewInt
c130: 4f 62 6a 28 69 6e 63 72 56 61 6c 75 65 29 29 3b Obj(incrValue));
c140: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a .. } else {..
c150: 09 69 6e 74 20 69 56 61 6c 75 65 3b 0d 0a 09 54 .int iValue;...T
c160: 63 6c 5f 57 69 64 65 49 6e 74 20 77 56 61 6c 75 cl_WideInt wValu
c170: 65 3b 0d 0a 0d 0a 09 69 66 20 28 54 63 6c 5f 49 e;.....if (Tcl_I
c180: 73 53 68 61 72 65 64 28 64 69 63 74 50 74 72 29 sShared(dictPtr)
c190: 29 20 7b 0d 0a 09 20 20 20 20 64 69 63 74 50 74 ) {... dictPt
c1a0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
c1b0: 65 4f 62 6a 28 64 69 63 74 50 74 72 29 3b 0d 0a eObj(dictPtr);..
c1c0: 09 7d 0d 0a 0d 0a 09 69 66 20 28 54 63 6c 5f 44 .}.....if (Tcl_D
c1d0: 69 63 74 4f 62 6a 47 65 74 28 69 6e 74 65 72 70 ictObjGet(interp
c1e0: 2c 20 64 69 63 74 50 74 72 2c 20 6f 62 6a 76 5b , dictPtr, objv[
c1f0: 33 5d 2c 20 26 76 61 6c 75 65 50 74 72 29 20 21 3], &valuePtr) !
c200: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 20 = TCL_OK) {...
c210: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
c220: 4f 52 3b 0d 0a 09 7d 0d 0a 09 69 66 20 28 76 61 OR;...}...if (va
c230: 6c 75 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 luePtr == NULL)
c240: 7b 0d 0a 09 20 20 20 20 76 61 6c 75 65 50 74 72 {... valuePtr
c250: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a = Tcl_NewIntObj
c260: 28 69 6e 63 72 56 61 6c 75 65 29 3b 0d 0a 09 7d (incrValue);...}
c270: 20 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65 50 else if (valueP
c280: 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 tr->typePtr == &
c290: 74 63 6c 57 69 64 65 49 6e 74 54 79 70 65 29 20 tclWideIntType)
c2a0: 7b 0d 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 57 {... Tcl_GetW
c2b0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 4e 55 ideIntFromObj(NU
c2c0: 4c 4c 2c 20 76 61 6c 75 65 50 74 72 2c 20 26 77 LL, valuePtr, &w
c2d0: 56 61 6c 75 65 29 3b 0d 0a 09 20 20 20 20 69 66 Value);... if
c2e0: 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 76 (Tcl_IsShared(v
c2f0: 61 6c 75 65 50 74 72 29 29 20 7b 0d 0a 09 09 76 aluePtr)) {....v
c300: 61 6c 75 65 50 74 72 20 3d 20 54 63 6c 5f 4e 65 aluePtr = Tcl_Ne
c310: 77 57 69 64 65 49 6e 74 4f 62 6a 28 77 56 61 6c wWideIntObj(wVal
c320: 75 65 20 2b 20 69 6e 63 72 56 61 6c 75 65 29 3b ue + incrValue);
c330: 0d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d ... } else {.
c340: 0a 09 09 54 63 6c 5f 53 65 74 57 69 64 65 49 6e ...Tcl_SetWideIn
c350: 74 4f 62 6a 28 76 61 6c 75 65 50 74 72 2c 20 77 tObj(valuePtr, w
c360: 56 61 6c 75 65 20 2b 20 69 6e 63 72 56 61 6c 75 Value + incrValu
c370: 65 29 3b 0d 0a 09 09 69 66 20 28 64 69 63 74 50 e);....if (dictP
c380: 74 72 2d 3e 62 79 74 65 73 20 21 3d 20 4e 55 4c tr->bytes != NUL
c390: 4c 29 20 7b 0d 0a 09 09 20 20 20 20 54 63 6c 5f L) {.... Tcl_
c3a0: 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 InvalidateString
c3b0: 52 65 70 28 64 69 63 74 50 74 72 29 3b 0d 0a 09 Rep(dictPtr);...
c3c0: 09 7d 0d 0a 09 09 67 6f 74 6f 20 76 61 6c 75 65 .}....goto value
c3d0: 41 6c 72 65 61 64 79 49 6e 44 69 63 74 69 6f 6e AlreadyInDiction
c3e0: 61 72 79 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 7d ary;... }...}
c3f0: 20 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65 50 else if (valueP
c400: 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 tr->typePtr == &
c410: 74 63 6c 49 6e 74 54 79 70 65 29 20 7b 0d 0a 09 tclIntType) {...
c420: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 Tcl_GetIntFr
c430: 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 76 61 6c 75 omObj(NULL, valu
c440: 65 50 74 72 2c 20 26 69 56 61 6c 75 65 29 3b 0d ePtr, &iValue);.
c450: 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 49 73 .. if (Tcl_Is
c460: 53 68 61 72 65 64 28 76 61 6c 75 65 50 74 72 29 Shared(valuePtr)
c470: 29 20 7b 0d 0a 09 09 76 61 6c 75 65 50 74 72 20 ) {....valuePtr
c480: 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 = Tcl_NewIntObj(
c490: 69 56 61 6c 75 65 20 2b 20 69 6e 63 72 56 61 6c iValue + incrVal
c4a0: 75 65 29 3b 0d 0a 09 20 20 20 20 7d 20 65 6c 73 ue);... } els
c4b0: 65 20 7b 0d 0a 09 09 54 63 6c 5f 53 65 74 49 6e e {....Tcl_SetIn
c4c0: 74 4f 62 6a 28 76 61 6c 75 65 50 74 72 2c 20 69 tObj(valuePtr, i
c4d0: 56 61 6c 75 65 20 2b 20 69 6e 63 72 56 61 6c 75 Value + incrValu
c4e0: 65 29 3b 0d 0a 09 09 69 66 20 28 64 69 63 74 50 e);....if (dictP
c4f0: 74 72 2d 3e 62 79 74 65 73 20 21 3d 20 4e 55 4c tr->bytes != NUL
c500: 4c 29 20 7b 0d 0a 09 09 20 20 20 20 54 63 6c 5f L) {.... Tcl_
c510: 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 InvalidateString
c520: 52 65 70 28 64 69 63 74 50 74 72 29 3b 0d 0a 09 Rep(dictPtr);...
c530: 09 7d 0d 0a 09 09 67 6f 74 6f 20 76 61 6c 75 65 .}....goto value
c540: 41 6c 72 65 61 64 79 49 6e 44 69 63 74 69 6f 6e AlreadyInDiction
c550: 61 72 79 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 7d ary;... }...}
c560: 20 65 6c 73 65 20 7b 0d 0a 09 20 20 20 20 72 65 else {... re
c570: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 sult = Tcl_GetWi
c580: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 deIntFromObj(int
c590: 65 72 70 2c 20 76 61 6c 75 65 50 74 72 2c 20 26 erp, valuePtr, &
c5a0: 77 56 61 6c 75 65 29 3b 0d 0a 09 20 20 20 20 69 wValue);... i
c5b0: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c f (result != TCL
c5c0: 5f 4f 4b 29 20 7b 0d 0a 09 09 72 65 74 75 72 6e _OK) {....return
c5d0: 20 72 65 73 75 6c 74 3b 0d 0a 09 20 20 20 20 7d result;... }
c5e0: 0d 0a 09 20 20 20 20 2f 2a 0d 0a 09 20 20 20 20 ... /*...
c5f0: 20 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 * Determine if
c600: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 67 we should have g
c610: 6f 74 20 61 20 73 74 61 6e 64 61 72 64 20 69 6e ot a standard in
c620: 74 20 69 6e 73 74 65 61 64 2e 0d 0a 09 20 20 20 t instead....
c630: 20 20 2a 2f 0d 0a 09 20 20 20 20 69 66 20 28 54 */... if (T
c640: 63 6c 5f 49 73 53 68 61 72 65 64 28 76 61 6c 75 cl_IsShared(valu
c650: 65 50 74 72 29 29 20 7b 0d 0a 09 09 69 66 20 28 ePtr)) {....if (
c660: 77 56 61 6c 75 65 20 3e 3d 20 49 4e 54 5f 4d 49 wValue >= INT_MI
c670: 4e 20 26 26 20 77 56 61 6c 75 65 20 3c 3d 20 49 N && wValue <= I
c680: 4e 54 5f 4d 41 58 29 20 7b 0d 0a 09 09 20 20 20 NT_MAX) {....
c690: 20 2f 2a 0d 0a 09 09 20 20 20 20 20 2a 20 43 6f /*.... * Co
c6a0: 6e 76 65 72 74 20 74 68 65 20 74 79 70 65 2e 2e nvert the type..
c6b0: 2e 0d 0a 09 09 20 20 20 20 20 2a 2f 0d 0a 09 09 ..... */....
c6c0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 Tcl_GetIntFr
c6d0: 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 76 61 6c 75 omObj(NULL, valu
c6e0: 65 50 74 72 2c 20 26 69 56 61 6c 75 65 29 3b 0d ePtr, &iValue);.
c6f0: 0a 09 09 20 20 20 20 76 61 6c 75 65 50 74 72 20 ... valuePtr
c700: 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 = Tcl_NewIntObj(
c710: 69 56 61 6c 75 65 20 2b 20 69 6e 63 72 56 61 6c iValue + incrVal
c720: 75 65 29 3b 0d 0a 09 09 7d 20 65 6c 73 65 20 7b ue);....} else {
c730: 0d 0a 09 09 20 20 20 20 76 61 6c 75 65 50 74 72 .... valuePtr
c740: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e = Tcl_NewWideIn
c750: 74 4f 62 6a 28 77 56 61 6c 75 65 20 2b 20 69 6e tObj(wValue + in
c760: 63 72 56 61 6c 75 65 29 3b 0d 0a 09 09 7d 0d 0a crValue);....}..
c770: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 09 . } else {...
c780: 09 69 66 20 28 77 56 61 6c 75 65 20 3e 3d 20 49 .if (wValue >= I
c790: 4e 54 5f 4d 49 4e 20 26 26 20 77 56 61 6c 75 65 NT_MIN && wValue
c7a0: 20 3c 3d 20 49 4e 54 5f 4d 41 58 29 20 7b 0d 0a <= INT_MAX) {..
c7b0: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 .. Tcl_SetInt
c7c0: 4f 62 6a 28 76 61 6c 75 65 50 74 72 2c 0d 0a 09 Obj(valuePtr,...
c7d0: 09 09 20 20 20 20 54 63 6c 5f 57 69 64 65 41 73 .. Tcl_WideAs
c7e0: 4c 6f 6e 67 28 77 56 61 6c 75 65 29 20 2b 20 69 Long(wValue) + i
c7f0: 6e 63 72 56 61 6c 75 65 29 3b 0d 0a 09 09 7d 20 ncrValue);....}
c800: 65 6c 73 65 20 7b 0d 0a 09 09 20 20 20 20 54 63 else {.... Tc
c810: 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 l_SetWideIntObj(
c820: 76 61 6c 75 65 50 74 72 2c 20 77 56 61 6c 75 65 valuePtr, wValue
c830: 20 2b 20 69 6e 63 72 56 61 6c 75 65 29 3b 0d 0a + incrValue);..
c840: 09 09 7d 0d 0a 09 09 69 66 20 28 64 69 63 74 50 ..}....if (dictP
c850: 74 72 2d 3e 62 79 74 65 73 20 21 3d 20 4e 55 4c tr->bytes != NUL
c860: 4c 29 20 7b 0d 0a 09 09 20 20 20 20 54 63 6c 5f L) {.... Tcl_
c870: 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 InvalidateString
c880: 52 65 70 28 64 69 63 74 50 74 72 29 3b 0d 0a 09 Rep(dictPtr);...
c890: 09 7d 0d 0a 09 09 67 6f 74 6f 20 76 61 6c 75 65 .}....goto value
c8a0: 41 6c 72 65 61 64 79 49 6e 44 69 63 74 69 6f 6e AlreadyInDiction
c8b0: 61 72 79 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 7d ary;... }...}
c8c0: 0d 0a 09 69 66 20 28 54 63 6c 5f 44 69 63 74 4f ...if (Tcl_DictO
c8d0: 62 6a 50 75 74 28 69 6e 74 65 72 70 2c 20 64 69 bjPut(interp, di
c8e0: 63 74 50 74 72 2c 20 6f 62 6a 76 5b 33 5d 2c 20 ctPtr, objv[3],
c8f0: 76 61 6c 75 65 50 74 72 29 20 21 3d 20 54 43 4c valuePtr) != TCL
c900: 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 54 63 6c _OK) {... Tcl
c910: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 76 61 _DecrRefCount(va
c920: 6c 75 65 50 74 72 29 3b 0d 0a 09 20 20 20 20 72 luePtr);... r
c930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
c940: 0d 0a 09 7d 0d 0a 09 76 61 6c 75 65 41 6c 72 65 ...}...valueAlre
c950: 61 64 79 49 6e 44 69 63 74 69 6f 6e 61 72 79 3a adyInDictionary:
c960: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 73 .. }.. res
c970: 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f 4f 62 6a ultPtr = Tcl_Obj
c980: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 SetVar2(interp,
c990: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 64 objv[2], NULL, d
c9a0: 69 63 74 50 74 72 2c 0d 0a 09 20 20 20 20 54 43 ictPtr,... TC
c9b0: 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 L_LEAVE_ERR_MSG)
c9c0: 3b 0d 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c ;.. if (resul
c9d0: 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d tPtr == NULL) {.
c9e0: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
c9f0: 6e 74 28 64 69 63 74 50 74 72 29 3b 0d 0a 09 72 nt(dictPtr);...r
ca00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
ca10: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c .. }.. Tcl
ca20: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
ca30: 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29 terp, resultPtr)
ca40: 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
ca50: 4c 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d L_OK;..}...../*.
ca60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 ---------.. *..
cab0: 2a 20 44 69 63 74 4c 61 70 70 65 6e 64 43 6d 64 * DictLappendCmd
cac0: 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 --.. *.. *.This
cad0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d function implem
cae0: 65 6e 74 73 20 74 68 65 20 22 64 69 63 74 20 6c ents the "dict l
caf0: 61 70 70 65 6e 64 22 20 54 63 6c 20 63 6f 6d 6d append" Tcl comm
cb00: 61 6e 64 2e 0d 0a 20 2a 09 53 65 65 20 74 68 65 and... *.See the
cb10: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 user documentat
cb20: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
cb30: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2c on what it does,
cb40: 20 61 6e 64 0d 0a 20 2a 09 54 49 50 23 3f 3f 3f and.. *.TIP#???
cb50: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 6c 20 for the formal
cb60: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2e 0d 0a specification...
cb70: 20 2a 0d 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0d *.. * Results:.
cb80: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
cb90: 63 6c 20 72 65 73 75 6c 74 2e 0d 0a 20 2a 0d 0a cl result... *..
cba0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
cbb0: 0d 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 .. *.See the use
cbc0: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e r documentation.
cbd0: 0d 0a 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .. *.. *--------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a --------------..
cc20: 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e */....static in
cc30: 74 0d 0a 44 69 63 74 4c 61 70 70 65 6e 64 43 6d t..DictLappendCm
cc40: 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 d(interp, objc,
cc50: 6f 62 6a 76 29 0d 0a 20 20 20 20 54 63 6c 5f 49 objv).. Tcl_I
cc60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0d 0a nterp *interp;..
cc70: 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0d 0a 20 int objc;..
cc80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 Tcl_Obj *CONS
cc90: 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d 0a 20 20 20 T *objv;..{..
cca0: 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 63 74 50 74 Tcl_Obj *dictPt
ccb0: 72 2c 20 2a 76 61 6c 75 65 50 74 72 2c 20 2a 72 r, *valuePtr, *r
ccc0: 65 73 75 6c 74 50 74 72 3b 0d 0a 20 20 20 20 69 esultPtr;.. i
ccd0: 6e 74 20 69 2c 20 61 6c 6c 6f 63 61 74 65 64 44 nt i, allocatedD
cce0: 69 63 74 20 3d 20 30 2c 20 61 6c 6c 6f 63 61 74 ict = 0, allocat
ccf0: 65 64 56 61 6c 75 65 20 3d 20 30 3b 0d 0a 0d 0a edValue = 0;....
cd00: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 34 if (objc < 4
cd10: 29 20 7b 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
cd20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
cd30: 2c 20 6f 62 6a 76 2c 20 22 76 61 72 4e 61 6d 65 , objv, "varName
cd40: 20 6b 65 79 20 3f 76 61 6c 75 65 20 2e 2e 2e 3f key ?value ...?
cd50: 22 29 3b 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
cd60: 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a _ERROR;.. }..
cd70: 0d 0a 20 20 20 20 64 69 63 74 50 74 72 20 3d 20 .. dictPtr =
cd80: 54 63 6c 5f 4f 62 6a 47 65 74 56 61 72 32 28 69 Tcl_ObjGetVar2(i
cd90: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
cda0: 4e 55 4c 4c 2c 20 30 29 3b 0d 0a 20 20 20 20 69 NULL, 0);.. i
cdb0: 66 20 28 64 69 63 74 50 74 72 20 3d 3d 20 4e 55 f (dictPtr == NU
cdc0: 4c 4c 29 20 7b 0d 0a 09 61 6c 6c 6f 63 61 74 65 LL) {...allocate
cdd0: 64 44 69 63 74 20 3d 20 31 3b 0d 0a 09 64 69 63 dDict = 1;...dic
cde0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 44 69 tPtr = Tcl_NewDi
cdf0: 63 74 4f 62 6a 28 29 3b 0d 0a 20 20 20 20 7d 20 ctObj();.. }
ce00: 65 6c 73 65 20 69 66 20 28 54 63 6c 5f 49 73 53 else if (Tcl_IsS
ce10: 68 61 72 65 64 28 64 69 63 74 50 74 72 29 29 20 hared(dictPtr))
ce20: 7b 0d 0a 09 61 6c 6c 6f 63 61 74 65 64 44 69 63 {...allocatedDic
ce30: 74 20 3d 20 31 3b 0d 0a 09 64 69 63 74 50 74 72 t = 1;...dictPtr
ce40: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
ce50: 4f 62 6a 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 Obj(dictPtr);..
ce60: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 28 }.... if (
ce70: 54 63 6c 5f 44 69 63 74 4f 62 6a 47 65 74 28 69 Tcl_DictObjGet(i
ce80: 6e 74 65 72 70 2c 20 64 69 63 74 50 74 72 2c 20 nterp, dictPtr,
ce90: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 50 objv[3], &valueP
cea0: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b tr) != TCL_OK) {
ceb0: 0d 0a 09 69 66 20 28 61 6c 6c 6f 63 61 74 65 64 ...if (allocated
cec0: 44 69 63 74 29 20 7b 0d 0a 09 20 20 20 20 54 63 Dict) {... Tc
ced0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 l_DecrRefCount(d
cee0: 69 63 74 50 74 72 29 3b 0d 0a 09 7d 0d 0a 09 72 ictPtr);...}...r
cef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cf00: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 .. }.... i
cf10: 66 20 28 76 61 6c 75 65 50 74 72 20 3d 3d 20 4e f (valuePtr == N
cf20: 55 4c 4c 29 20 7b 0d 0a 09 76 61 6c 75 65 50 74 ULL) {...valuePt
cf30: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
cf40: 62 6a 28 6f 62 6a 63 2d 34 2c 20 6f 62 6a 76 2b bj(objc-4, objv+
cf50: 34 29 3b 0d 0a 09 61 6c 6c 6f 63 61 74 65 64 56 4);...allocatedV
cf60: 61 6c 75 65 20 3d 20 31 3b 0d 0a 20 20 20 20 7d alue = 1;.. }
cf70: 20 65 6c 73 65 20 7b 0d 0a 09 69 66 20 28 54 63 else {...if (Tc
cf80: 6c 5f 49 73 53 68 61 72 65 64 28 76 61 6c 75 65 l_IsShared(value
cf90: 50 74 72 29 29 20 7b 0d 0a 09 20 20 20 20 61 6c Ptr)) {... al
cfa0: 6c 6f 63 61 74 65 64 56 61 6c 75 65 20 3d 20 31 locatedValue = 1
cfb0: 3b 0d 0a 09 20 20 20 20 76 61 6c 75 65 50 74 72 ;... valuePtr
cfc0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
cfd0: 4f 62 6a 28 76 61 6c 75 65 50 74 72 29 3b 0d 0a Obj(valuePtr);..
cfe0: 09 7d 0d 0a 0d 0a 09 66 6f 72 20 28 69 3d 34 20 .}.....for (i=4
cff0: 3b 20 69 3c 6f 62 6a 63 20 3b 20 69 2b 2b 29 20 ; i<objc ; i++)
d000: 7b 0d 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f {... if (Tcl_
d010: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
d020: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 76 61 6c ment(interp, val
d030: 75 65 50 74 72 2c 0d 0a 09 09 20 20 20 20 6f 62 uePtr,.... ob
d040: 6a 76 5b 69 5d 29 20 21 3d 20 54 43 4c 5f 4f 4b jv[i]) != TCL_OK
d050: 29 20 7b 0d 0a 09 09 69 66 20 28 61 6c 6c 6f 63 ) {....if (alloc
d060: 61 74 65 64 56 61 6c 75 65 29 20 7b 0d 0a 09 09 atedValue) {....
d070: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
d080: 6f 75 6e 74 28 76 61 6c 75 65 50 74 72 29 3b 0d ount(valuePtr);.
d090: 0a 09 09 7d 0d 0a 09 09 69 66 20 28 61 6c 6c 6f ...}....if (allo
d0a0: 63 61 74 65 64 44 69 63 74 29 20 7b 0d 0a 09 09 catedDict) {....
d0b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
d0c0: 6f 75 6e 74 28 64 69 63 74 50 74 72 29 3b 0d 0a ount(dictPtr);..
d0d0: 09 09 7d 0d 0a 09 09 72 65 74 75 72 6e 20 54 43 ..}....return TC
d0e0: 4c 5f 45 52 52 4f 52 3b 0d 0a 09 20 20 20 20 7d L_ERROR;... }
d0f0: 0d 0a 09 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 ...}.. }....
d100: 20 20 20 69 66 20 28 61 6c 6c 6f 63 61 74 65 64 if (allocated
d110: 56 61 6c 75 65 29 20 7b 0d 0a 09 54 63 6c 5f 44 Value) {...Tcl_D
d120: 69 63 74 4f 62 6a 50 75 74 28 69 6e 74 65 72 70 ictObjPut(interp
d130: 2c 20 64 69 63 74 50 74 72 2c 20 6f 62 6a 76 5b , dictPtr, objv[
d140: 33 5d 2c 20 76 61 6c 75 65 50 74 72 29 3b 0d 0a 3], valuePtr);..
d150: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 } else if (d
d160: 69 63 74 50 74 72 2d 3e 62 79 74 65 73 20 21 3d ictPtr->bytes !=
d170: 20 4e 55 4c 4c 29 20 7b 0d 0a 09 54 63 6c 5f 49 NULL) {...Tcl_I
d180: 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 52 nvalidateStringR
d190: 65 70 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 20 ep(dictPtr);..
d1a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 73 75 6c }.... resul
d1b0: 74 50 74 72 20 3d 20 54 63 6c 5f 4f 62 6a 53 65 tPtr = Tcl_ObjSe
d1c0: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 tVar2(interp, ob
d1d0: 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 64 69 63 jv[2], NULL, dic
d1e0: 74 50 74 72 2c 0d 0a 09 20 20 20 20 54 43 4c 5f tPtr,... TCL_
d1f0: 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0d LEAVE_ERR_MSG);.
d200: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 50 . if (resultP
d210: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 tr == NULL) {...
d220: 69 66 20 28 61 6c 6c 6f 63 61 74 65 64 44 69 63 if (allocatedDic
d230: 74 29 20 7b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 t) {... Tcl_D
d240: 65 63 72 52 65 66 43 6f 75 6e 74 28 64 69 63 74 ecrRefCount(dict
d250: 50 74 72 29 3b 0d 0a 09 7d 0d 0a 09 72 65 74 75 Ptr);...}...retu
d260: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 rn TCL_ERROR;..
d270: 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
d280: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
d290: 70 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0d 0a p, resultPtr);..
d2a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
d2b0: 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a K;..}...../*.. *
d2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d300: 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 44 ------.. *.. * D
d310: 69 63 74 41 70 70 65 6e 64 43 6d 64 20 2d 2d 0d ictAppendCmd --.
d320: 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e . *.. *.This fun
d330: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 ction implements
d340: 20 74 68 65 20 22 64 69 63 74 20 61 70 70 65 6e the "dict appen
d350: 64 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d d" Tcl command..
d360: 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 . *.See the user
d370: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
d380: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
d390: 61 74 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d at it does, and.
d3a0: 0a 20 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 . *.TIP#??? for
d3b0: 74 68 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 the formal speci
d3c0: 66 69 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 fication... *..
d3d0: 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 * Results:.. *.A
d3e0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
d3f0: 73 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 sult... *.. * Si
d400: 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 de effects:.. *.
d410: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 See the user doc
d420: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d umentation... *.
d430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
d440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a ---------.. */..
d480: 0d 0a 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 ..static int..Di
d490: 63 74 41 70 70 65 6e 64 43 6d 64 28 69 6e 74 65 ctAppendCmd(inte
d4a0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d rp, objc, objv).
d4b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
d4c0: 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 6e *interp;.. in
d4d0: 74 20 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 63 6c t objc;.. Tcl
d4e0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a _Obj *CONST *obj
d4f0: 76 3b 0d 0a 7b 0d 0a 20 20 20 20 54 63 6c 5f 4f v;..{.. Tcl_O
d500: 62 6a 20 2a 64 69 63 74 50 74 72 2c 20 2a 76 61 bj *dictPtr, *va
d510: 6c 75 65 50 74 72 2c 20 2a 72 65 73 75 6c 74 50 luePtr, *resultP
d520: 74 72 3b 0d 0a 20 20 20 20 69 6e 74 20 69 2c 20 tr;.. int i,
d530: 61 6c 6c 6f 63 61 74 65 64 44 69 63 74 20 3d 20 allocatedDict =
d540: 30 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 6f 62 0;.... if (ob
d550: 6a 63 20 3c 20 34 29 20 7b 0d 0a 09 54 63 6c 5f jc < 4) {...Tcl_
d560: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
d570: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 76 erp, 2, objv, "v
d580: 61 72 4e 61 6d 65 20 6b 65 79 20 3f 76 61 6c 75 arName key ?valu
d590: 65 20 2e 2e 2e 3f 22 29 3b 0d 0a 09 72 65 74 75 e ...?");...retu
d5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 rn TCL_ERROR;..
d5b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 69 63 74 }.... dict
d5c0: 50 74 72 20 3d 20 54 63 6c 5f 4f 62 6a 47 65 74 Ptr = Tcl_ObjGet
d5d0: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a Var2(interp, obj
d5e0: 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0d v[2], NULL, 0);.
d5f0: 0a 20 20 20 20 69 66 20 28 64 69 63 74 50 74 72 . if (dictPtr
d600: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 61 6c == NULL) {...al
d610: 6c 6f 63 61 74 65 64 44 69 63 74 20 3d 20 31 3b locatedDict = 1;
d620: 0d 0a 09 64 69 63 74 50 74 72 20 3d 20 54 63 6c ...dictPtr = Tcl
d630: 5f 4e 65 77 44 69 63 74 4f 62 6a 28 29 3b 0d 0a _NewDictObj();..
d640: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 54 } else if (T
d650: 63 6c 5f 49 73 53 68 61 72 65 64 28 64 69 63 74 cl_IsShared(dict
d660: 50 74 72 29 29 20 7b 0d 0a 09 61 6c 6c 6f 63 61 Ptr)) {...alloca
d670: 74 65 64 44 69 63 74 20 3d 20 31 3b 0d 0a 09 64 tedDict = 1;...d
d680: 69 63 74 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 ictPtr = Tcl_Dup
d690: 6c 69 63 61 74 65 4f 62 6a 28 64 69 63 74 50 74 licateObj(dictPt
d6a0: 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 r);.. }....
d6b0: 20 20 69 66 20 28 54 63 6c 5f 44 69 63 74 4f 62 if (Tcl_DictOb
d6c0: 6a 47 65 74 28 69 6e 74 65 72 70 2c 20 64 69 63 jGet(interp, dic
d6d0: 74 50 74 72 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 tPtr, objv[3], &
d6e0: 76 61 6c 75 65 50 74 72 29 20 21 3d 20 54 43 4c valuePtr) != TCL
d6f0: 5f 4f 4b 29 20 7b 0d 0a 09 69 66 20 28 61 6c 6c _OK) {...if (all
d700: 6f 63 61 74 65 64 44 69 63 74 29 20 7b 0d 0a 09 ocatedDict) {...
d710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
d720: 6f 75 6e 74 28 64 69 63 74 50 74 72 29 3b 0d 0a ount(dictPtr);..
d730: 09 7d 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f .}...return TCL_
d740: 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d ERROR;.. }...
d750: 0a 20 20 20 20 69 66 20 28 76 61 6c 75 65 50 74 . if (valuePt
d760: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 54 r == NULL) {...T
d770: 63 6c 4e 65 77 4f 62 6a 28 76 61 6c 75 65 50 74 clNewObj(valuePt
d780: 72 29 3b 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 r);.. } else
d790: 7b 0d 0a 09 69 66 20 28 54 63 6c 5f 49 73 53 68 {...if (Tcl_IsSh
d7a0: 61 72 65 64 28 76 61 6c 75 65 50 74 72 29 29 20 ared(valuePtr))
d7b0: 7b 0d 0a 09 20 20 20 20 76 61 6c 75 65 50 74 72 {... valuePtr
d7c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
d7d0: 4f 62 6a 28 76 61 6c 75 65 50 74 72 29 3b 0d 0a Obj(valuePtr);..
d7e0: 09 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 .}.. }....
d7f0: 20 66 6f 72 20 28 69 3d 34 20 3b 20 69 3c 6f 62 for (i=4 ; i<ob
d800: 6a 63 20 3b 20 69 2b 2b 29 20 7b 0d 0a 09 54 63 jc ; i++) {...Tc
d810: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a l_AppendObjToObj
d820: 28 76 61 6c 75 65 50 74 72 2c 20 6f 62 6a 76 5b (valuePtr, objv[
d830: 69 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 i]);.. }....
d840: 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a 50 75 Tcl_DictObjPu
d850: 74 28 69 6e 74 65 72 70 2c 20 64 69 63 74 50 74 t(interp, dictPt
d860: 72 2c 20 6f 62 6a 76 5b 33 5d 2c 20 76 61 6c 75 r, objv[3], valu
d870: 65 50 74 72 29 3b 0d 0a 0d 0a 20 20 20 20 72 65 ePtr);.... re
d880: 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f 4f 62 sultPtr = Tcl_Ob
d890: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c jSetVar2(interp,
d8a0: 20 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 objv[2], NULL,
d8b0: 64 69 63 74 50 74 72 2c 0d 0a 09 20 20 20 20 54 dictPtr,... T
d8c0: 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 CL_LEAVE_ERR_MSG
d8d0: 29 3b 0d 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
d8e0: 6c 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltPtr == NULL) {
d8f0: 0d 0a 09 69 66 20 28 61 6c 6c 6f 63 61 74 65 64 ...if (allocated
d900: 44 69 63 74 29 20 7b 0d 0a 09 20 20 20 20 54 63 Dict) {... Tc
d910: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 l_DecrRefCount(d
d920: 69 63 74 50 74 72 29 3b 0d 0a 09 7d 0d 0a 09 72 ictPtr);...}...r
d930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
d940: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 6c .. }.. Tcl
d950: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
d960: 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29 terp, resultPtr)
d970: 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
d980: 4c 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d L_OK;..}...../*.
d990: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
d9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 ---------.. *..
d9e0: 2a 20 44 69 63 74 46 6f 72 43 6d 64 20 2d 2d 0d * DictForCmd --.
d9f0: 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e . *.. *.This fun
da00: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 ction implements
da10: 20 74 68 65 20 22 64 69 63 74 20 66 6f 72 22 20 the "dict for"
da20: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 2a Tcl command... *
da30: 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f .See the user do
da40: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 cumentation for
da50: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 details on what
da60: 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a 20 2a it does, and.. *
da70: 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 68 65 .TIP#??? for the
da80: 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 69 63 formal specific
da90: 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a 20 52 ation... *.. * R
daa0: 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 73 74 esults:.. *.A st
dab0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
dac0: 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 65 20 t... *.. * Side
dad0: 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 65 65 effects:.. *.See
dae0: 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 the user docume
daf0: 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a ntation... *.. *
db00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db40: 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d 0a 73 ------.. */....s
db50: 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 74 46 tatic int..DictF
db60: 6f 72 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 orCmd(interp, ob
db70: 6a 63 2c 20 6f 62 6a 76 29 0d 0a 20 20 20 20 54 jc, objv).. T
db80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
db90: 70 3b 0d 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 p;.. int objc
dba0: 3b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
dbb0: 43 4f 4e 53 54 20 2a 6f 62 6a 76 3b 0d 0a 7b 0d CONST *objv;..{.
dbc0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 . Tcl_Obj *di
dbd0: 63 74 4f 62 6a 2c 20 2a 73 63 72 69 70 74 4f 62 ctObj, *scriptOb
dbe0: 6a 2c 20 2a 6b 65 79 56 61 72 4f 62 6a 2c 20 2a j, *keyVarObj, *
dbf0: 76 61 6c 75 65 56 61 72 4f 62 6a 3b 0d 0a 20 20 valueVarObj;..
dc00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 76 61 72 76 Tcl_Obj **varv
dc10: 2c 20 2a 6b 65 79 4f 62 6a 2c 20 2a 76 61 6c 75 , *keyObj, *valu
dc20: 65 4f 62 6a 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 eObj;.. Tcl_D
dc30: 69 63 74 53 65 61 72 63 68 20 73 65 61 72 63 68 ictSearch search
dc40: 3b 0d 0a 20 20 20 20 69 6e 74 20 76 61 72 63 2c ;.. int varc,
dc50: 20 64 6f 6e 65 2c 20 72 65 73 75 6c 74 3b 0d 0a done, result;..
dc60: 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
dc70: 3d 20 35 29 20 7b 0d 0a 09 54 63 6c 5f 57 72 6f = 5) {...Tcl_Wro
dc80: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
dc90: 2c 20 32 2c 20 6f 62 6a 76 2c 0d 0a 09 09 22 7b , 2, objv,...."{
dca0: 6b 65 79 56 61 72 20 76 61 6c 75 65 56 61 72 7d keyVar valueVar}
dcb0: 20 64 69 63 74 69 6f 6e 61 72 79 20 73 63 72 69 dictionary scri
dcc0: 70 74 22 29 3b 0d 0a 09 72 65 74 75 72 6e 20 54 pt");...return T
dcd0: 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d CL_ERROR;.. }
dce0: 0d 0a 0d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f .... if (Tcl_
dcf0: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
dd00: 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b ts(interp, objv[
dd10: 32 5d 2c 20 26 76 61 72 63 2c 20 26 76 61 72 76 2], &varc, &varv
dd20: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a ) != TCL_OK) {..
dd30: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
dd40: 52 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 R;.. }.. i
dd50: 66 20 28 76 61 72 63 20 21 3d 20 32 29 20 7b 0d f (varc != 2) {.
dd60: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c ..Tcl_ResetResul
dd70: 74 28 69 6e 74 65 72 70 29 3b 0d 0a 09 54 63 6c t(interp);...Tcl
dd80: 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 73 54 6f _AppendStringsTo
dd90: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
dda0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 0d 0a 09 sult(interp),...
ddb0: 09 22 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 ."must have exac
ddc0: 74 6c 79 20 74 77 6f 20 76 61 72 69 61 62 6c 65 tly two variable
ddd0: 20 6e 61 6d 65 73 22 2c 20 4e 55 4c 4c 29 3b 0d names", NULL);.
dde0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
ddf0: 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 OR;.. }..
de00: 6b 65 79 56 61 72 4f 62 6a 20 3d 20 76 61 72 76 keyVarObj = varv
de10: 5b 30 5d 3b 0d 0a 20 20 20 20 76 61 6c 75 65 56 [0];.. valueV
de20: 61 72 4f 62 6a 20 3d 20 76 61 72 76 5b 31 5d 3b arObj = varv[1];
de30: 0d 0a 20 20 20 20 64 69 63 74 4f 62 6a 20 3d 20 .. dictObj =
de40: 6f 62 6a 76 5b 33 5d 3b 0d 0a 20 20 20 20 73 63 objv[3];.. sc
de50: 72 69 70 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b 34 riptObj = objv[4
de60: 5d 3b 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 ];.. /*..
de70: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 * Make sure tha
de80: 74 20 74 68 65 73 65 20 6f 62 6a 65 63 74 73 20 t these objects
de90: 28 77 68 69 63 68 20 77 65 20 6e 65 65 64 20 74 (which we need t
dea0: 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 62 6f hroughout the bo
deb0: 64 79 0d 0a 20 20 20 20 20 2a 20 6f 66 20 74 68 dy.. * of th
dec0: 65 20 6c 6f 6f 70 29 20 64 6f 6e 27 74 20 76 61 e loop) don't va
ded0: 6e 69 73 68 2e 20 20 4e 6f 74 65 20 74 68 61 74 nish. Note that
dee0: 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20 74 68 we also care th
def0: 61 74 20 74 68 65 0d 0a 20 20 20 20 20 2a 20 64 at the.. * d
df00: 69 63 74 4f 62 6a 20 72 65 6d 61 69 6e 73 20 61 ictObj remains a
df10: 20 64 69 63 74 69 6f 6e 61 72 79 2c 20 77 68 69 dictionary, whi
df20: 63 68 20 72 65 71 75 69 72 65 73 20 73 6c 69 67 ch requires slig
df30: 68 74 6c 79 20 6d 6f 72 65 0d 0a 20 20 20 20 20 htly more..
df40: 2a 20 65 6c 61 62 6f 72 61 74 65 20 70 72 65 63 * elaborate prec
df50: 61 75 74 69 6f 6e 73 2e 20 20 54 68 61 74 20 77 autions. That w
df60: 65 20 61 63 68 69 65 76 65 20 62 79 20 6d 61 6b e achieve by mak
df70: 69 6e 67 20 73 75 72 65 20 74 68 61 74 20 74 68 ing sure that th
df80: 65 0d 0a 20 20 20 20 20 2a 20 74 79 70 65 20 69 e.. * type i
df90: 73 20 73 74 61 74 69 63 20 74 68 72 6f 75 67 68 s static through
dfa0: 6f 75 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 out and that the
dfb0: 20 68 61 73 68 20 69 73 20 74 68 65 20 73 61 6d hash is the sam
dfc0: 65 20 68 61 73 68 0d 0a 20 20 20 20 20 2a 20 74 e hash.. * t
dfd0: 68 72 6f 75 67 68 6f 75 74 3b 20 74 61 6b 69 6e hroughout; takin
dfe0: 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 g a copy of the
dff0: 77 68 6f 6c 65 20 74 68 69 6e 67 20 77 6f 75 6c whole thing woul
e000: 64 20 62 65 20 65 61 73 69 65 72 2c 0d 0a 20 20 d be easier,..
e010: 20 20 20 2a 20 62 75 74 20 6d 75 63 68 20 6c 65 * but much le
e020: 73 73 20 65 66 66 69 63 69 65 6e 74 2e 0d 0a 20 ss efficient...
e030: 20 20 20 20 2a 2f 0d 0a 20 20 20 20 54 63 6c 5f */.. Tcl_
e040: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6b 65 79 IncrRefCount(key
e050: 56 61 72 4f 62 6a 29 3b 0d 0a 20 20 20 20 54 63 VarObj);.. Tc
e060: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 l_IncrRefCount(v
e070: 61 6c 75 65 56 61 72 4f 62 6a 29 3b 0d 0a 20 20 alueVarObj);..
e080: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
e090: 6e 74 28 64 69 63 74 4f 62 6a 29 3b 0d 0a 20 20 nt(dictObj);..
e0a0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
e0b0: 6e 74 28 73 63 72 69 70 74 4f 62 6a 29 3b 0d 0a nt(scriptObj);..
e0c0: 0d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 .. result = T
e0d0: 63 6c 5f 44 69 63 74 4f 62 6a 46 69 72 73 74 28 cl_DictObjFirst(
e0e0: 69 6e 74 65 72 70 2c 20 64 69 63 74 4f 62 6a 2c interp, dictObj,
e0f0: 0d 0a 09 20 20 20 20 26 73 65 61 72 63 68 2c 20 ... &search,
e100: 26 6b 65 79 4f 62 6a 2c 20 26 76 61 6c 75 65 4f &keyObj, &valueO
e110: 62 6a 2c 20 26 64 6f 6e 65 29 3b 0d 0a 20 20 20 bj, &done);..
e120: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 if (result != T
e130: 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 54 63 6c 5f 44 CL_OK) {...Tcl_D
e140: 65 63 72 52 65 66 43 6f 75 6e 74 28 6b 65 79 56 ecrRefCount(keyV
e150: 61 72 4f 62 6a 29 3b 0d 0a 09 54 63 6c 5f 44 65 arObj);...Tcl_De
e160: 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 crRefCount(value
e170: 56 61 72 4f 62 6a 29 3b 0d 0a 09 54 63 6c 5f 44 VarObj);...Tcl_D
e180: 65 63 72 52 65 66 43 6f 75 6e 74 28 64 69 63 74 ecrRefCount(dict
e190: 4f 62 6a 29 3b 0d 0a 09 54 63 6c 5f 44 65 63 72 Obj);...Tcl_Decr
e1a0: 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 74 4f RefCount(scriptO
e1b0: 62 6a 29 3b 0d 0a 09 72 65 74 75 72 6e 20 54 43 bj);...return TC
e1c0: 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d L_ERROR;.. }.
e1d0: 0a 0d 0a 20 20 20 20 77 68 69 6c 65 20 28 21 64 ... while (!d
e1e0: 6f 6e 65 29 20 7b 0d 0a 09 2f 2a 0d 0a 09 20 2a one) {.../*... *
e1f0: 20 53 74 6f 70 20 74 68 65 20 76 61 6c 75 65 20 Stop the value
e200: 66 72 6f 6d 20 67 65 74 74 69 6e 67 20 68 69 74 from getting hit
e210: 20 69 6e 20 61 6e 79 20 77 61 79 20 62 79 20 61 in any way by a
e220: 6e 79 20 74 72 61 63 65 73 20 6f 6e 0d 0a 09 20 ny traces on...
e230: 2a 20 74 68 65 20 6b 65 79 20 76 61 72 69 61 62 * the key variab
e240: 6c 65 2e 0d 0a 09 20 2a 2f 0d 0a 09 54 63 6c 5f le.... */...Tcl_
e250: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c IncrRefCount(val
e260: 75 65 4f 62 6a 29 3b 0d 0a 09 69 66 20 28 54 63 ueObj);...if (Tc
e270: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 l_ObjSetVar2(int
e280: 65 72 70 2c 20 6b 65 79 56 61 72 4f 62 6a 2c 20 erp, keyVarObj,
e290: 4e 55 4c 4c 2c 20 6b 65 79 4f 62 6a 2c 0d 0a 09 NULL, keyObj,...
e2a0: 09 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d .TCL_LEAVE_ERR_M
e2b0: 53 47 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a SG) == NULL) {..
e2c0: 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 . Tcl_ResetRe
e2d0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0d 0a 09 sult(interp);...
e2e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 53 74 Tcl_AppendSt
e2f0: 72 69 6e 67 73 54 6f 4f 62 6a 28 54 63 6c 5f 47 ringsToObj(Tcl_G
e300: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
e310: 72 70 29 2c 0d 0a 09 09 20 20 20 20 22 63 6f 75 rp),.... "cou
e320: 6c 64 6e 27 74 20 73 65 74 20 6b 65 79 20 76 61 ldn't set key va
e330: 72 69 61 62 6c 65 3a 20 5c 22 22 2c 0d 0a 09 09 riable: \"",....
e340: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e Tcl_GetStrin
e350: 67 28 6b 65 79 56 61 72 4f 62 6a 29 2c 20 22 5c g(keyVarObj), "\
e360: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c "", (char *) NUL
e370: 4c 29 3b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 65 L);... Tcl_De
e380: 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 crRefCount(value
e390: 4f 62 6a 29 3b 0d 0a 09 65 72 72 6f 72 45 78 69 Obj);...errorExi
e3a0: 74 3a 0d 0a 09 20 20 20 20 54 63 6c 5f 44 69 63 t:... Tcl_Dic
e3b0: 74 4f 62 6a 44 6f 6e 65 28 26 73 65 61 72 63 68 tObjDone(&search
e3c0: 29 3b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 );... Tcl_Dec
e3d0: 72 52 65 66 43 6f 75 6e 74 28 6b 65 79 56 61 72 rRefCount(keyVar
e3e0: 4f 62 6a 29 3b 0d 0a 09 20 20 20 20 54 63 6c 5f Obj);... Tcl_
e3f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c DecrRefCount(val
e400: 75 65 56 61 72 4f 62 6a 29 3b 0d 0a 09 20 20 20 ueVarObj);...
e410: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
e420: 74 28 64 69 63 74 4f 62 6a 29 3b 0d 0a 09 20 20 t(dictObj);...
e430: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
e440: 6e 74 28 73 63 72 69 70 74 4f 62 6a 29 3b 0d 0a nt(scriptObj);..
e450: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
e460: 45 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 09 54 63 6c ERROR;...}...Tcl
e470: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 76 61 _DecrRefCount(va
e480: 6c 75 65 4f 62 6a 29 3b 0d 0a 09 69 66 20 28 54 lueObj);...if (T
e490: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e cl_ObjSetVar2(in
e4a0: 74 65 72 70 2c 20 76 61 6c 75 65 56 61 72 4f 62 terp, valueVarOb
e4b0: 6a 2c 20 4e 55 4c 4c 2c 20 76 61 6c 75 65 4f 62 j, NULL, valueOb
e4c0: 6a 2c 0d 0a 09 09 54 43 4c 5f 4c 45 41 56 45 5f j,....TCL_LEAVE_
e4d0: 45 52 52 5f 4d 53 47 29 20 3d 3d 20 4e 55 4c 4c ERR_MSG) == NULL
e4e0: 29 20 7b 0d 0a 09 20 20 20 20 54 63 6c 5f 52 65 ) {... Tcl_Re
e4f0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
e500: 29 3b 0d 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 );... Tcl_App
e510: 65 6e 64 53 74 72 69 6e 67 73 54 6f 4f 62 6a 28 endStringsToObj(
e520: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_GetObjResult
e530: 28 69 6e 74 65 72 70 29 2c 0d 0a 09 09 20 20 20 (interp),....
e540: 20 22 63 6f 75 6c 64 6e 27 74 20 73 65 74 20 76 "couldn't set v
e550: 61 6c 75 65 20 76 61 72 69 61 62 6c 65 3a 20 5c alue variable: \
e560: 22 22 2c 0d 0a 09 09 20 20 20 20 54 63 6c 5f 47 "",.... Tcl_G
e570: 65 74 53 74 72 69 6e 67 28 6b 65 79 56 61 72 4f etString(keyVarO
e580: 62 6a 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 bj), "\"", (char
e590: 20 2a 29 20 4e 55 4c 4c 29 3b 0d 0a 09 20 20 20 *) NULL);...
e5a0: 20 67 6f 74 6f 20 65 72 72 6f 72 45 78 69 74 3b goto errorExit;
e5b0: 0d 0a 09 7d 0d 0a 0d 0a 09 72 65 73 75 6c 74 20 ...}.....result
e5c0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
e5d0: 69 6e 74 65 72 70 2c 20 73 63 72 69 70 74 4f 62 interp, scriptOb
e5e0: 6a 2c 20 30 29 3b 0d 0a 09 69 66 20 28 72 65 73 j, 0);...if (res
e5f0: 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ult != TCL_OK) {
e600: 0d 0a 09 20 20 20 20 69 66 20 28 72 65 73 75 6c ... if (resul
e610: 74 20 3d 3d 20 54 43 4c 5f 43 4f 4e 54 49 4e 55 t == TCL_CONTINU
e620: 45 29 20 7b 0d 0a 09 09 72 65 73 75 6c 74 20 3d E) {....result =
e630: 20 54 43 4c 5f 4f 4b 3b 0d 0a 09 20 20 20 20 7d TCL_OK;... }
e640: 20 65 6c 73 65 20 69 66 20 28 72 65 73 75 6c 74 else if (result
e650: 20 3d 3d 20 54 43 4c 5f 42 52 45 41 4b 29 20 7b == TCL_BREAK) {
e660: 0d 0a 09 09 72 65 73 75 6c 74 20 3d 20 54 43 4c ....result = TCL
e670: 5f 4f 4b 3b 0d 0a 09 09 54 63 6c 5f 44 69 63 74 _OK;....Tcl_Dict
e680: 4f 62 6a 44 6f 6e 65 28 26 73 65 61 72 63 68 29 ObjDone(&search)
e690: 3b 0d 0a 09 09 62 72 65 61 6b 3b 0d 0a 09 20 20 ;....break;...
e6a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 73 } else if (res
e6b0: 75 6c 74 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 ult == TCL_ERROR
e6c0: 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ) {..
e6d0: 20 20 20 20 20 63 68 61 72 20 6d 73 67 5b 33 32 char msg[32
e6e0: 20 2b 20 54 43 4c 5f 49 4e 54 45 47 45 52 5f 53 + TCL_INTEGER_S
e6f0: 50 41 43 45 5d 3b 0d 0a 0d 0a 09 09 73 70 72 69 PACE];......spri
e700: 6e 74 66 28 6d 73 67 2c 20 22 5c 6e 20 20 20 20 ntf(msg, "\n
e710: 28 5c 22 64 69 63 74 20 66 6f 72 5c 22 20 62 6f (\"dict for\" bo
e720: 64 79 20 6c 69 6e 65 20 25 64 29 22 2c 0d 0a 09 dy line %d)",...
e730: 09 09 69 6e 74 65 72 70 2d 3e 65 72 72 6f 72 4c ..interp->errorL
e740: 69 6e 65 29 3b 0d 0a 09 09 54 63 6c 5f 41 64 64 ine);....Tcl_Add
e750: 4f 62 6a 45 72 72 6f 72 49 6e 66 6f 28 69 6e 74 ObjErrorInfo(int
e760: 65 72 70 2c 20 6d 73 67 2c 20 2d 31 29 3b 0d 0a erp, msg, -1);..
e770: 09 09 54 63 6c 5f 44 69 63 74 4f 62 6a 44 6f 6e ..Tcl_DictObjDon
e780: 65 28 26 73 65 61 72 63 68 29 3b 0d 0a 09 09 62 e(&search);....b
e790: 72 65 61 6b 3b 0d 0a 09 20 20 20 20 7d 20 65 6c reak;... } el
e7a0: 73 65 20 7b 0d 0a 09 09 54 63 6c 5f 44 69 63 74 se {....Tcl_Dict
e7b0: 4f 62 6a 44 6f 6e 65 28 26 73 65 61 72 63 68 29 ObjDone(&search)
e7c0: 3b 0d 0a 09 09 62 72 65 61 6b 3b 0d 0a 09 20 20 ;....break;...
e7d0: 20 20 7d 0d 0a 09 7d 0d 0a 0d 0a 09 54 63 6c 5f }...}.....Tcl_
e7e0: 44 69 63 74 4f 62 6a 4e 65 78 74 28 26 73 65 61 DictObjNext(&sea
e7f0: 72 63 68 2c 20 26 6b 65 79 4f 62 6a 2c 20 26 76 rch, &keyObj, &v
e800: 61 6c 75 65 4f 62 6a 2c 20 26 64 6f 6e 65 29 3b alueObj, &done);
e810: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f .. }.... /
e820: 2a 0d 0a 20 20 20 20 20 2a 20 53 74 6f 70 20 68 *.. * Stop h
e830: 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e olding a referen
e840: 63 65 20 74 6f 20 74 68 65 73 65 20 6f 62 6a 65 ce to these obje
e850: 63 74 73 2e 0d 0a 20 20 20 20 20 2a 2f 0d 0a 20 cts... */..
e860: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
e870: 75 6e 74 28 6b 65 79 56 61 72 4f 62 6a 29 3b 0d unt(keyVarObj);.
e880: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
e890: 43 6f 75 6e 74 28 76 61 6c 75 65 56 61 72 4f 62 Count(valueVarOb
e8a0: 6a 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 65 63 j);.. Tcl_Dec
e8b0: 72 52 65 66 43 6f 75 6e 74 28 64 69 63 74 4f 62 rRefCount(dictOb
e8c0: 6a 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 65 63 j);.. Tcl_Dec
e8d0: 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 74 rRefCount(script
e8e0: 4f 62 6a 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 Obj);.... if
e8f0: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f (result == TCL_O
e900: 4b 29 20 7b 0d 0a 09 54 63 6c 5f 52 65 73 65 74 K) {...Tcl_Reset
e910: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0d Result(interp);.
e920: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 . }.. retu
e930: 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 7d 0d 0a 0c rn result;..}...
e940: 0d 0a 2f 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ../*.. *--------
e950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a --------------..
e990: 20 2a 0d 0a 20 2a 20 44 69 63 74 53 65 74 43 6d *.. * DictSetCm
e9a0: 64 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 54 68 69 d --.. *.. *.Thi
e9b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 s function imple
e9c0: 6d 65 6e 74 73 20 74 68 65 20 22 64 69 63 74 20 ments the "dict
e9d0: 73 65 74 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 set" Tcl command
e9e0: 2e 0d 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 ... *.See the us
e9f0: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e er documentation
ea00: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 for details on
ea10: 77 68 61 74 20 69 74 20 64 6f 65 73 2c 20 61 6e what it does, an
ea20: 64 0d 0a 20 2a 09 54 49 50 23 3f 3f 3f 20 66 6f d.. *.TIP#??? fo
ea30: 72 20 74 68 65 20 66 6f 72 6d 61 6c 20 73 70 65 r the formal spe
ea40: 63 69 66 69 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d cification... *.
ea50: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a . * Results:.. *
ea60: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
ea70: 72 65 73 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 result... *.. *
ea80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 Side effects:..
ea90: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 *.See the user d
eaa0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 ocumentation...
eab0: 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.. *-----------
eac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ead0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f -----------.. */
eb00: 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 0d 0a ....static int..
eb10: 44 69 63 74 53 65 74 43 6d 64 28 69 6e 74 65 72 DictSetCmd(inter
eb20: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d 0a p, objc, objv)..
eb30: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
eb40: 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 interp;.. int
eb50: 20 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 63 6c 5f objc;.. Tcl_
eb60: 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 Obj *CONST *objv
eb70: 3b 0d 0a 7b 0d 0a 20 20 20 20 54 63 6c 5f 4f 62 ;..{.. Tcl_Ob
eb80: 6a 20 2a 64 69 63 74 50 74 72 2c 20 2a 72 65 73 j *dictPtr, *res
eb90: 75 6c 74 50 74 72 3b 0d 0a 20 20 20 20 69 6e 74 ultPtr;.. int
eba0: 20 72 65 73 75 6c 74 2c 20 61 6c 6c 6f 63 61 74 result, allocat
ebb0: 65 64 44 69 63 74 20 3d 20 30 3b 0d 0a 0d 0a 20 edDict = 0;....
ebc0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 35 29 if (objc < 5)
ebd0: 20 7b 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 {...Tcl_WrongNu
ebe0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c mArgs(interp, 2,
ebf0: 20 6f 62 6a 76 2c 20 22 76 61 72 4e 61 6d 65 20 objv, "varName
ec00: 6b 65 79 20 3f 6b 65 79 20 2e 2e 2e 3f 20 76 61 key ?key ...? va
ec10: 6c 75 65 22 29 3b 0d 0a 09 72 65 74 75 72 6e 20 lue");...return
ec20: 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 TCL_ERROR;..
ec30: 7d 0d 0a 0d 0a 20 20 20 20 64 69 63 74 50 74 72 }.... dictPtr
ec40: 20 3d 20 54 63 6c 5f 4f 62 6a 47 65 74 56 61 72 = Tcl_ObjGetVar
ec50: 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 2(interp, objv[2
ec60: 5d 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0d 0a 20 20 ], NULL, 0);..
ec70: 20 20 69 66 20 28 64 69 63 74 50 74 72 20 3d 3d if (dictPtr ==
ec80: 20 4e 55 4c 4c 29 20 7b 0d 0a 09 61 6c 6c 6f 63 NULL) {...alloc
ec90: 61 74 65 64 44 69 63 74 20 3d 20 31 3b 0d 0a 09 atedDict = 1;...
eca0: 64 69 63 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 dictPtr = Tcl_Ne
ecb0: 77 44 69 63 74 4f 62 6a 28 29 3b 0d 0a 20 20 20 wDictObj();..
ecc0: 20 7d 20 65 6c 73 65 20 69 66 20 28 54 63 6c 5f } else if (Tcl_
ecd0: 49 73 53 68 61 72 65 64 28 64 69 63 74 50 74 72 IsShared(dictPtr
ece0: 29 29 20 7b 0d 0a 09 61 6c 6c 6f 63 61 74 65 64 )) {...allocated
ecf0: 44 69 63 74 20 3d 20 31 3b 0d 0a 09 64 69 63 74 Dict = 1;...dict
ed00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
ed10: 61 74 65 4f 62 6a 28 64 69 63 74 50 74 72 29 3b ateObj(dictPtr);
ed20: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 .. }.... r
ed30: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 44 69 63 74 esult = Tcl_Dict
ed40: 4f 62 6a 50 75 74 4b 65 79 4c 69 73 74 28 69 6e ObjPutKeyList(in
ed50: 74 65 72 70 2c 20 64 69 63 74 50 74 72 2c 20 6f terp, dictPtr, o
ed60: 62 6a 63 2d 34 2c 20 6f 62 6a 76 2b 33 2c 0d 0a bjc-4, objv+3,..
ed70: 09 20 20 20 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 . objv[objc-1
ed80: 5d 29 3b 0d 0a 20 20 20 20 69 66 20 28 72 65 73 ]);.. if (res
ed90: 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ult != TCL_OK) {
eda0: 0d 0a 09 69 66 20 28 61 6c 6c 6f 63 61 74 65 64 ...if (allocated
edb0: 44 69 63 74 29 20 7b 0d 0a 09 20 20 20 20 54 63 Dict) {... Tc
edc0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 l_DecrRefCount(d
edd0: 69 63 74 50 74 72 29 3b 0d 0a 09 7d 0d 0a 09 72 ictPtr);...}...r
ede0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
edf0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 .. }.... r
ee00: 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f 4f esultPtr = Tcl_O
ee10: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 bjSetVar2(interp
ee20: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c , objv[2], NULL,
ee30: 20 64 69 63 74 50 74 72 2c 0d 0a 09 20 20 20 20 dictPtr,...
ee40: 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 TCL_LEAVE_ERR_MS
ee50: 47 29 3b 0d 0a 20 20 20 20 69 66 20 28 72 65 73 G);.. if (res
ee60: 75 6c 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 ultPtr == NULL)
ee70: 7b 0d 0a 09 69 66 20 28 61 6c 6c 6f 63 61 74 65 {...if (allocate
ee80: 64 44 69 63 74 29 20 7b 0d 0a 09 20 20 20 20 54 dDict) {... T
ee90: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
eea0: 64 69 63 74 50 74 72 29 3b 0d 0a 09 7d 0d 0a 09 dictPtr);...}...
eeb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
eec0: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 54 63 ;.. }.. Tc
eed0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
eee0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 nterp, resultPtr
eef0: 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
ef00: 43 4c 5f 4f 4b 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a CL_OK;..}...../*
ef10: 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *------------
ef20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a ----------.. *..
ef60: 20 2a 20 44 69 63 74 55 6e 73 65 74 43 6d 64 20 * DictUnsetCmd
ef70: 2d 2d 0d 0a 20 2a 0d 0a 20 2a 09 54 68 69 73 20 --.. *.. *.This
ef80: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 function impleme
ef90: 6e 74 73 20 74 68 65 20 22 64 69 63 74 20 75 6e nts the "dict un
efa0: 73 65 74 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 set" Tcl command
efb0: 2e 0d 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 ... *.See the us
efc0: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e er documentation
efd0: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 for details on
efe0: 77 68 61 74 20 69 74 20 64 6f 65 73 2c 20 61 6e what it does, an
eff0: 64 0d 0a 20 2a 09 54 49 50 23 3f 3f 3f 20 66 6f d.. *.TIP#??? fo
f000: 72 20 74 68 65 20 66 6f 72 6d 61 6c 20 73 70 65 r the formal spe
f010: 63 69 66 69 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d cification... *.
f020: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a . * Results:.. *
f030: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
f040: 72 65 73 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 result... *.. *
f050: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 Side effects:..
f060: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 *.See the user d
f070: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 ocumentation...
f080: 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.. *-----------
f090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f -----------.. */
f0d0: 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 0d 0a ....static int..
f0e0: 44 69 63 74 55 6e 73 65 74 43 6d 64 28 69 6e 74 DictUnsetCmd(int
f0f0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 erp, objc, objv)
f100: 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .. Tcl_Interp
f110: 20 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 *interp;.. i
f120: 6e 74 20 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 63 nt objc;.. Tc
f130: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 l_Obj *CONST *ob
f140: 6a 76 3b 0d 0a 7b 0d 0a 20 20 20 20 54 63 6c 5f jv;..{.. Tcl_
f150: 4f 62 6a 20 2a 64 69 63 74 50 74 72 2c 20 2a 72 Obj *dictPtr, *r
f160: 65 73 75 6c 74 50 74 72 3b 0d 0a 20 20 20 20 69 esultPtr;.. i
f170: 6e 74 20 72 65 73 75 6c 74 2c 20 61 6c 6c 6f 63 nt result, alloc
f180: 61 74 65 64 44 69 63 74 20 3d 20 30 3b 0d 0a 0d atedDict = 0;...
f190: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
f1a0: 34 29 20 7b 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4) {...Tcl_Wrong
f1b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
f1c0: 32 2c 20 6f 62 6a 76 2c 20 22 76 61 72 4e 61 6d 2, objv, "varNam
f1d0: 65 20 6b 65 79 20 3f 6b 65 79 20 2e 2e 2e 3f 22 e key ?key ...?"
f1e0: 29 3b 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
f1f0: 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d ERROR;.. }...
f200: 0a 20 20 20 20 64 69 63 74 50 74 72 20 3d 20 54 . dictPtr = T
f210: 63 6c 5f 4f 62 6a 47 65 74 56 61 72 32 28 69 6e cl_ObjGetVar2(in
f220: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 4e terp, objv[2], N
f230: 55 4c 4c 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 ULL, 0);.. if
f240: 20 28 64 69 63 74 50 74 72 20 3d 3d 20 4e 55 4c (dictPtr == NUL
f250: 4c 29 20 7b 0d 0a 09 61 6c 6c 6f 63 61 74 65 64 L) {...allocated
f260: 44 69 63 74 20 3d 20 31 3b 0d 0a 09 64 69 63 74 Dict = 1;...dict
f270: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 44 69 63 Ptr = Tcl_NewDic
f280: 74 4f 62 6a 28 29 3b 0d 0a 20 20 20 20 7d 20 65 tObj();.. } e
f290: 6c 73 65 20 69 66 20 28 54 63 6c 5f 49 73 53 68 lse if (Tcl_IsSh
f2a0: 61 72 65 64 28 64 69 63 74 50 74 72 29 29 20 7b ared(dictPtr)) {
f2b0: 0d 0a 09 61 6c 6c 6f 63 61 74 65 64 44 69 63 74 ...allocatedDict
f2c0: 20 3d 20 31 3b 0d 0a 09 64 69 63 74 50 74 72 20 = 1;...dictPtr
f2d0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
f2e0: 62 6a 28 64 69 63 74 50 74 72 29 3b 0d 0a 20 20 bj(dictPtr);..
f2f0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 73 75 6c }.... resul
f300: 74 20 3d 20 54 63 6c 5f 44 69 63 74 4f 62 6a 52 t = Tcl_DictObjR
f310: 65 6d 6f 76 65 4b 65 79 4c 69 73 74 28 69 6e 74 emoveKeyList(int
f320: 65 72 70 2c 20 64 69 63 74 50 74 72 2c 20 6f 62 erp, dictPtr, ob
f330: 6a 63 2d 33 2c 20 6f 62 6a 76 2b 33 29 3b 0d 0a jc-3, objv+3);..
f340: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 if (result !
f350: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 69 66 = TCL_OK) {...if
f360: 20 28 61 6c 6c 6f 63 61 74 65 64 44 69 63 74 29 (allocatedDict)
f370: 20 7b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 {... Tcl_Dec
f380: 72 52 65 66 43 6f 75 6e 74 28 64 69 63 74 50 74 rRefCount(dictPt
f390: 72 29 3b 0d 0a 09 7d 0d 0a 09 72 65 74 75 72 6e r);...}...return
f3a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 TCL_ERROR;..
f3b0: 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 73 75 6c 74 }.... result
f3c0: 50 74 72 20 3d 20 54 63 6c 5f 4f 62 6a 53 65 74 Ptr = Tcl_ObjSet
f3d0: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a Var2(interp, obj
f3e0: 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 64 69 63 74 v[2], NULL, dict
f3f0: 50 74 72 2c 0d 0a 09 20 20 20 20 54 43 4c 5f 4c Ptr,... TCL_L
f400: 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0d 0a EAVE_ERR_MSG);..
f410: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 50 74 if (resultPt
f420: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 69 r == NULL) {...i
f430: 66 20 28 61 6c 6c 6f 63 61 74 65 64 44 69 63 74 f (allocatedDict
f440: 29 20 7b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 65 ) {... Tcl_De
f450: 63 72 52 65 66 43 6f 75 6e 74 28 64 69 63 74 50 crRefCount(dictP
f460: 74 72 29 3b 0d 0a 09 7d 0d 0a 09 72 65 74 75 72 tr);...}...retur
f470: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 n TCL_ERROR;..
f480: 20 20 7d 0d 0a 20 20 20 20 54 63 6c 5f 53 65 74 }.. Tcl_Set
f490: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
f4a0: 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0d 0a 20 , resultPtr);..
f4b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
f4c0: 3b 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d ;..}...../*.. *-
f4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f510: 2d 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 44 69 -----.. *.. * Di
f520: 63 74 46 69 6c 74 65 72 43 6d 64 20 2d 2d 0d 0a ctFilterCmd --..
f530: 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 *.. *.This func
f540: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 tion implements
f550: 74 68 65 20 22 64 69 63 74 20 66 69 6c 74 65 72 the "dict filter
f560: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a " Tcl command...
f570: 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 *.See the user
f580: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f documentation fo
f590: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 r details on wha
f5a0: 74 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 0d 0a t it does, and..
f5b0: 20 2a 09 54 49 50 23 3f 3f 3f 20 66 6f 72 20 74 *.TIP#??? for t
f5c0: 68 65 20 66 6f 72 6d 61 6c 20 73 70 65 63 69 66 he formal specif
f5d0: 69 63 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a 20 2a ication... *.. *
f5e0: 20 52 65 73 75 6c 74 73 3a 0d 0a 20 2a 09 41 20 Results:.. *.A
f5f0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
f600: 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a 20 53 69 64 ult... *.. * Sid
f610: 65 20 65 66 66 65 63 74 73 3a 0d 0a 20 2a 09 53 e effects:.. *.S
f620: 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 ee the user docu
f630: 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 2a 0d 0a mentation... *..
f640: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a 2f 0d 0a 0d --------.. */...
f690: 0a 73 74 61 74 69 63 20 69 6e 74 0d 0a 44 69 63 .static int..Dic
f6a0: 74 46 69 6c 74 65 72 43 6d 64 28 69 6e 74 65 72 tFilterCmd(inter
f6b0: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0d 0a p, objc, objv)..
f6c0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
f6d0: 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 6e 74 interp;.. int
f6e0: 20 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 63 6c 5f objc;.. Tcl_
f6f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 6a 76 Obj *CONST *objv
f700: 3b 0d 0a 7b 0d 0a 20 20 20 20 73 74 61 74 69 63 ;..{.. static
f710: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 66 69 6c CONST char *fil
f720: 74 65 72 73 5b 5d 20 3d 20 7b 0d 0a 09 22 6b 65 ters[] = {..."ke
f730: 79 22 2c 20 22 73 63 72 69 70 74 22 2c 20 22 76 y", "script", "v
f740: 61 6c 75 65 22 2c 20 4e 55 4c 4c 0d 0a 20 20 20 alue", NULL..
f750: 20 7d 3b 0d 0a 20 20 20 20 65 6e 75 6d 20 46 69 };.. enum Fi
f760: 6c 74 65 72 54 79 70 65 73 20 7b 0d 0a 09 46 49 lterTypes {...FI
f770: 4c 54 45 52 5f 4b 45 59 53 2c 20 46 49 4c 54 45 LTER_KEYS, FILTE
f780: 52 5f 53 43 52 49 50 54 2c 20 46 49 4c 54 45 52 R_SCRIPT, FILTER
f790: 5f 56 41 4c 55 45 53 0d 0a 20 20 20 20 7d 3b 0d _VALUES.. };.
f7a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 . Tcl_Obj *di
f7b0: 63 74 4f 62 6a 2c 20 2a 73 63 72 69 70 74 4f 62 ctObj, *scriptOb
f7c0: 6a 2c 20 2a 6b 65 79 56 61 72 4f 62 6a 2c 20 2a j, *keyVarObj, *
f7d0: 76 61 6c 75 65 56 61 72 4f 62 6a 3b 0d 0a 20 20 valueVarObj;..
f7e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 76 61 72 76 Tcl_Obj **varv
f7f0: 2c 20 2a 6b 65 79 4f 62 6a 2c 20 2a 76 61 6c 75 , *keyObj, *valu
f800: 65 4f 62 6a 2c 20 2a 72 65 73 75 6c 74 4f 62 6a eObj, *resultObj
f810: 2c 20 2a 62 6f 6f 6c 4f 62 6a 3b 0d 0a 20 20 20 , *boolObj;..
f820: 20 54 63 6c 5f 44 69 63 74 53 65 61 72 63 68 20 Tcl_DictSearch
f830: 73 65 61 72 63 68 3b 0d 0a 20 20 20 20 69 6e 74 search;.. int
f840: 20 69 6e 64 65 78 2c 20 76 61 72 63 2c 20 64 6f index, varc, do
f850: 6e 65 2c 20 72 65 73 75 6c 74 2c 20 73 61 74 69 ne, result, sati
f860: 73 66 69 65 64 3b 0d 0a 20 20 20 20 63 68 61 72 sfied;.. char
f870: 20 2a 70 61 74 74 65 72 6e 3b 0d 0a 20 20 20 20 *pattern;..
f880: 63 68 61 72 20 6d 73 67 5b 33 32 20 2b 20 54 43 char msg[32 + TC
f890: 4c 5f 49 4e 54 45 47 45 52 5f 53 50 41 43 45 5d L_INTEGER_SPACE]
f8a0: 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 6f 62 6a ;.... if (obj
f8b0: 63 20 3c 20 34 29 20 7b 0d 0a 09 54 63 6c 5f 57 c < 4) {...Tcl_W
f8c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
f8d0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 64 69 rp, 2, objv, "di
f8e0: 63 74 69 6f 6e 61 72 79 20 66 69 6c 74 65 72 54 ctionary filterT
f8f0: 79 70 65 20 2e 2e 2e 22 29 3b 0d 0a 09 72 65 74 ype ...");...ret
f900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a urn TCL_ERROR;..
f910: 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 20 28 54 }.. if (T
f920: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
f930: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
f940: 33 5d 2c 20 66 69 6c 74 65 72 73 2c 20 22 66 69 3], filters, "fi
f950: 6c 74 65 72 54 79 70 65 22 2c 0d 0a 09 20 20 20 lterType",...
f960: 20 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 0, &index) !=
f970: 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 72 65 74 75 TCL_OK) {...retu
f980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 rn TCL_ERROR;..
f990: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 77 69 74 }.... swit
f9a0: 63 68 20 28 28 65 6e 75 6d 20 46 69 6c 74 65 72 ch ((enum Filter
f9b0: 54 79 70 65 73 29 20 69 6e 64 65 78 29 20 7b 0d Types) index) {.
f9c0: 0a 20 20 20 20 63 61 73 65 20 46 49 4c 54 45 52 . case FILTER
f9d0: 5f 4b 45 59 53 3a 0d 0a 09 69 66 20 28 6f 62 6a _KEYS:...if (obj
f9e0: 63 20 21 3d 20 35 29 20 7b 0d 0a 09 20 20 20 20 c != 5) {...
f9f0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
fa00: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
fa10: 2c 20 22 64 69 63 74 69 6f 6e 61 72 79 20 6b 65 , "dictionary ke
fa20: 79 20 67 6c 6f 62 50 61 74 74 65 72 6e 22 29 3b y globPattern");
fa30: 0d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
fa40: 4c 5f 45 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 0d 0a L_ERROR;...}....
fa50: 09 2f 2a 0d 0a 09 20 2a 20 43 72 65 61 74 65 20 ./*... * Create
fa60: 61 20 64 69 63 74 69 6f 6e 61 72 79 20 77 68 6f a dictionary who
fa70: 73 65 20 6b 65 79 73 20 61 6c 6c 20 6d 61 74 63 se keys all matc
fa80: 68 20 61 20 63 65 72 74 61 69 6e 20 70 61 74 74 h a certain patt
fa90: 65 72 6e 2e 0d 0a 09 20 2a 2f 0d 0a 09 69 66 20 ern.... */...if
faa0: 28 54 63 6c 5f 44 69 63 74 4f 62 6a 46 69 72 73 (Tcl_DictObjFirs
fab0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 t(interp, objv[2
fac0: 5d 2c 20 26 73 65 61 72 63 68 2c 0d 0a 09 09 26 ], &search,....&
fad0: 6b 65 79 4f 62 6a 2c 20 26 76 61 6c 75 65 4f 62 keyObj, &valueOb
fae0: 6a 2c 20 26 64 6f 6e 65 29 20 21 3d 20 54 43 4c j, &done) != TCL
faf0: 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 72 65 74 _OK) {... ret
fb00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a urn TCL_ERROR;..
fb10: 09 7d 0d 0a 09 70 61 74 74 65 72 6e 20 3d 20 54 .}...pattern = T
fb20: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
fb30: 5b 34 5d 29 3b 0d 0a 09 72 65 73 75 6c 74 4f 62 [4]);...resultOb
fb40: 6a 20 3d 20 54 63 6c 5f 4e 65 77 44 69 63 74 4f j = Tcl_NewDictO
fb50: 62 6a 28 29 3b 0d 0a 09 77 68 69 6c 65 20 28 21 bj();...while (!
fb60: 64 6f 6e 65 29 20 7b 0d 0a 09 20 20 20 20 69 66 done) {... if
fb70: 20 28 54 63 6c 5f 53 74 72 69 6e 67 4d 61 74 63 (Tcl_StringMatc
fb80: 68 28 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6b h(TclGetString(k
fb90: 65 79 4f 62 6a 29 2c 20 70 61 74 74 65 72 6e 29 eyObj), pattern)
fba0: 29 20 7b 0d 0a 09 09 54 63 6c 5f 44 69 63 74 4f ) {....Tcl_DictO
fbb0: 62 6a 50 75 74 28 69 6e 74 65 72 70 2c 20 72 65 bjPut(interp, re
fbc0: 73 75 6c 74 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c sultObj, keyObj,
fbd0: 20 76 61 6c 75 65 4f 62 6a 29 3b 0d 0a 09 20 20 valueObj);...
fbe0: 20 20 7d 0d 0a 09 20 20 20 20 54 63 6c 5f 44 69 }... Tcl_Di
fbf0: 63 74 4f 62 6a 4e 65 78 74 28 26 73 65 61 72 63 ctObjNext(&searc
fc00: 68 2c 20 26 6b 65 79 4f 62 6a 2c 20 26 76 61 6c h, &keyObj, &val
fc10: 75 65 4f 62 6a 2c 20 26 64 6f 6e 65 29 3b 0d 0a ueObj, &done);..
fc20: 09 7d 0d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 .}...Tcl_SetObjR
fc30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 esult(interp, re
fc40: 73 75 6c 74 4f 62 6a 29 3b 0d 0a 09 72 65 74 75 sultObj);...retu
fc50: 72 6e 20 54 43 4c 5f 4f 4b 3b 0d 0a 0d 0a 20 20 rn TCL_OK;....
fc60: 20 20 63 61 73 65 20 46 49 4c 54 45 52 5f 56 41 case FILTER_VA
fc70: 4c 55 45 53 3a 0d 0a 09 69 66 20 28 6f 62 6a 63 LUES:...if (objc
fc80: 20 21 3d 20 35 29 20 7b 0d 0a 09 20 20 20 20 54 != 5) {... T
fc90: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
fca0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c interp, 2, objv,
fcb0: 20 22 64 69 63 74 69 6f 6e 61 72 79 20 76 61 6c "dictionary val
fcc0: 75 65 20 67 6c 6f 62 50 61 74 74 65 72 6e 22 29 ue globPattern")
fcd0: 3b 0d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
fce0: 43 4c 5f 45 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 0d CL_ERROR;...}...
fcf0: 0a 09 2f 2a 0d 0a 09 20 2a 20 43 72 65 61 74 65 ../*... * Create
fd00: 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 77 68 a dictionary wh
fd10: 6f 73 65 20 76 61 6c 75 65 73 20 61 6c 6c 20 6d ose values all m
fd20: 61 74 63 68 20 61 20 63 65 72 74 61 69 6e 20 70 atch a certain p
fd30: 61 74 74 65 72 6e 2e 0d 0a 09 20 2a 2f 0d 0a 09 attern.... */...
fd40: 69 66 20 28 54 63 6c 5f 44 69 63 74 4f 62 6a 46 if (Tcl_DictObjF
fd50: 69 72 73 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a irst(interp, obj
fd60: 76 5b 32 5d 2c 20 26 73 65 61 72 63 68 2c 0d 0a v[2], &search,..
fd70: 09 09 26 6b 65 79 4f 62 6a 2c 20 26 76 61 6c 75 ..&keyObj, &valu
fd80: 65 4f 62 6a 2c 20 26 64 6f 6e 65 29 20 21 3d 20 eObj, &done) !=
fd90: 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 TCL_OK) {...
fda0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
fdb0: 3b 0d 0a 09 7d 0d 0a 09 70 61 74 74 65 72 6e 20 ;...}...pattern
fdc0: 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f = TclGetString(o
fdd0: 62 6a 76 5b 34 5d 29 3b 0d 0a 09 72 65 73 75 6c bjv[4]);...resul
fde0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 44 69 tObj = Tcl_NewDi
fdf0: 63 74 4f 62 6a 28 29 3b 0d 0a 09 77 68 69 6c 65 ctObj();...while
fe00: 20 28 21 64 6f 6e 65 29 20 7b 0d 0a 09 20 20 20 (!done) {...
fe10: 20 69 66 20 28 54 63 6c 5f 53 74 72 69 6e 67 4d if (Tcl_StringM
fe20: 61 74 63 68 28 54 63 6c 47 65 74 53 74 72 69 6e atch(TclGetStrin
fe30: 67 28 76 61 6c 75 65 4f 62 6a 29 2c 20 70 61 74 g(valueObj), pat
fe40: 74 65 72 6e 29 29 20 7b 0d 0a 09 09 54 63 6c 5f tern)) {....Tcl_
fe50: 44 69 63 74 4f 62 6a 50 75 74 28 69 6e 74 65 72 DictObjPut(inter
fe60: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 6b 65 p, resultObj, ke
fe70: 79 4f 62 6a 2c 20 76 61 6c 75 65 4f 62 6a 29 3b yObj, valueObj);
fe80: 0d 0a 09 20 20 20 20 7d 0d 0a 09 20 20 20 20 54 ... }... T
fe90: 63 6c 5f 44 69 63 74 4f 62 6a 4e 65 78 74 28 26 cl_DictObjNext(&
fea0: 73 65 61 72 63 68 2c 20 26 6b 65 79 4f 62 6a 2c search, &keyObj,
feb0: 20 26 76 61 6c 75 65 4f 62 6a 2c 20 26 64 6f 6e &valueObj, &don
fec0: 65 29 3b 0d 0a 09 7d 0d 0a 09 54 63 6c 5f 53 65 e);...}...Tcl_Se
fed0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
fee0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0d 0a p, resultObj);..
fef0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0d .return TCL_OK;.
ff00: 0a 0d 0a 20 20 20 20 63 61 73 65 20 46 49 4c 54 ... case FILT
ff10: 45 52 5f 53 43 52 49 50 54 3a 0d 0a 09 69 66 20 ER_SCRIPT:...if
ff20: 28 6f 62 6a 63 20 21 3d 20 36 29 20 7b 0d 0a 09 (objc != 6) {...
ff30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d Tcl_WrongNum
ff40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
ff50: 6f 62 6a 76 2c 0d 0a 09 09 20 20 20 20 22 64 69 objv,.... "di
ff60: 63 74 69 6f 6e 61 72 79 20 73 63 72 69 70 74 20 ctionary script
ff70: 7b 6b 65 79 56 61 72 20 76 61 6c 75 65 56 61 72 {keyVar valueVar
ff80: 7d 20 66 69 6c 74 65 72 53 63 72 69 70 74 22 29 } filterScript")
ff90: 3b 0d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
ffa0: 43 4c 5f 45 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 0d CL_ERROR;...}...
ffb0: 0a 09 2f 2a 0d 0a 09 20 2a 20 43 72 65 61 74 65 ../*... * Create
ffc0: 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 77 68 a dictionary wh
ffd0: 6f 73 65 20 6b 65 79 2c 76 61 6c 75 65 20 70 61 ose key,value pa
ffe0: 69 72 73 20 61 6c 6c 20 73 61 74 69 73 66 79 20 irs all satisfy
fff0: 61 0d 0a 09 20 2a 20 73 63 72 69 70 74 20 28 69 a... * script (i
10000 2e 65 2e 20 67 65 74 20 61 20 74 72 75 65 20 62 .e. get a true b
10010 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 66 72 oolean result fr
10020 6f 6d 20 69 74 73 0d 0a 09 20 2a 20 65 76 61 6c om its... * eval
10030 75 61 74 69 6f 6e 2e 29 20 20 4d 61 73 73 69 76 uation.) Massiv
10040 65 20 63 6f 70 79 69 6e 67 20 66 72 6f 6d 20 74 e copying from t
10050 68 65 20 22 64 69 63 74 20 66 6f 72 22 0d 0a 09 he "dict for"...
10060 20 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f * implementatio
10070 6e 20 68 61 73 20 6f 63 63 75 72 72 65 64 21 0d n has occurred!.
10080 0a 09 20 2a 2f 0d 0a 0d 0a 09 69 66 20 28 54 63 .. */.....if (Tc
10090 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
100a0 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a ents(interp, obj
100b0 76 5b 34 5d 2c 20 26 76 61 72 63 2c 20 26 76 61 v[4], &varc, &va
100c0 72 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b rv) != TCL_OK) {
100d0 0d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
100e0 4c 5f 45 52 52 4f 52 3b 0d 0a 09 7d 0d 0a 09 69 L_ERROR;...}...i
100f0 66 20 28 76 61 72 63 20 21 3d 20 32 29 20 7b 0d f (varc != 2) {.
10100 0a 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 .. Tcl_ResetR
10110 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0d 0a esult(interp);..
10120 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 53 . Tcl_AppendS
10130 74 72 69 6e 67 73 54 6f 4f 62 6a 28 54 63 6c 5f tringsToObj(Tcl_
10140 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
10150 65 72 70 29 2c 0d 0a 09 09 20 20 20 20 22 6d 75 erp),.... "mu
10160 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 st have exactly
10170 74 77 6f 20 76 61 72 69 61 62 6c 65 20 6e 61 6d two variable nam
10180 65 73 22 2c 20 4e 55 4c 4c 29 3b 0d 0a 09 20 20 es", NULL);...
10190 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
101a0 4f 52 3b 0d 0a 09 7d 0d 0a 09 6b 65 79 56 61 72 OR;...}...keyVar
101b0 4f 62 6a 20 3d 20 76 61 72 76 5b 30 5d 3b 0d 0a Obj = varv[0];..
101c0 09 76 61 6c 75 65 56 61 72 4f 62 6a 20 3d 20 76 .valueVarObj = v
101d0 61 72 76 5b 31 5d 3b 0d 0a 09 64 69 63 74 4f 62 arv[1];...dictOb
101e0 6a 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0d 0a 09 73 j = objv[2];...s
101f0 63 72 69 70 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b criptObj = objv[
10200 35 5d 3b 0d 0a 09 2f 2a 0d 0a 09 20 2a 20 4d 61 5];.../*... * Ma
10210 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
10220 73 65 20 6f 62 6a 65 63 74 73 20 28 77 68 69 63 se objects (whic
10230 68 20 77 65 20 6e 65 65 64 20 74 68 72 6f 75 67 h we need throug
10240 68 6f 75 74 20 74 68 65 0d 0a 09 20 2a 20 62 6f hout the... * bo
10250 64 79 20 6f 66 20 74 68 65 20 6c 6f 6f 70 29 20 dy of the loop)
10260 64 6f 6e 27 74 20 76 61 6e 69 73 68 2e 20 20 4e don't vanish. N
10270 6f 74 65 20 74 68 61 74 20 77 65 20 61 6c 73 6f ote that we also
10280 20 63 61 72 65 0d 0a 09 20 2a 20 74 68 61 74 20 care... * that
10290 74 68 65 20 64 69 63 74 4f 62 6a 20 72 65 6d 61 the dictObj rema
102a0 69 6e 73 20 61 20 64 69 63 74 69 6f 6e 61 72 79 ins a dictionary
102b0 2c 20 77 68 69 63 68 20 72 65 71 75 69 72 65 73 , which requires
102c0 0d 0a 09 20 2a 20 73 6c 69 67 68 74 6c 79 20 6d ... * slightly m
102d0 6f 72 65 20 65 6c 61 62 6f 72 61 74 65 20 70 72 ore elaborate pr
102e0 65 63 61 75 74 69 6f 6e 73 2e 20 20 54 68 61 74 ecautions. That
102f0 20 77 65 20 61 63 68 69 65 76 65 20 62 79 0d 0a we achieve by..
10300 09 20 2a 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 . * making sure
10310 74 68 61 74 20 74 68 65 20 74 79 70 65 20 69 73 that the type is
10320 20 73 74 61 74 69 63 20 74 68 72 6f 75 67 68 6f static througho
10330 75 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 0d ut and that the.
10340 0a 09 20 2a 20 68 61 73 68 20 69 73 20 74 68 65 .. * hash is the
10350 20 73 61 6d 65 20 68 61 73 68 20 74 68 72 6f 75 same hash throu
10360 67 68 6f 75 74 3b 20 74 61 6b 69 6e 67 20 61 20 ghout; taking a
10370 63 6f 70 79 20 6f 66 20 74 68 65 0d 0a 09 20 2a copy of the... *
10380 20 77 68 6f 6c 65 20 74 68 69 6e 67 20 77 6f 75 whole thing wou
10390 6c 64 20 62 65 20 65 61 73 69 65 72 2c 20 62 75 ld be easier, bu
103a0 74 20 6d 75 63 68 20 6c 65 73 73 20 65 66 66 69 t much less effi
103b0 63 69 65 6e 74 2e 0d 0a 09 20 2a 2f 0d 0a 09 54 cient.... */...T
103c0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
103d0 6b 65 79 56 61 72 4f 62 6a 29 3b 0d 0a 09 54 63 keyVarObj);...Tc
103e0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 l_IncrRefCount(v
103f0 61 6c 75 65 56 61 72 4f 62 6a 29 3b 0d 0a 09 54 alueVarObj);...T
10400 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
10410 64 69 63 74 4f 62 6a 29 3b 0d 0a 09 54 63 6c 5f dictObj);...Tcl_
10420 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 IncrRefCount(scr
10430 69 70 74 4f 62 6a 29 3b 0d 0a 0d 0a 09 72 65 73 iptObj);.....res
10440 75 6c 74 20 3d 20 54 63 6c 5f 44 69 63 74 4f 62 ult = Tcl_DictOb
10450 6a 46 69 72 73 74 28 69 6e 74 65 72 70 2c 20 64 jFirst(interp, d
10460 69 63 74 4f 62 6a 2c 0d 0a 09 09 26 73 65 61 72 ictObj,....&sear
10470 63 68 2c 20 26 6b 65 79 4f 62 6a 2c 20 26 76 61 ch, &keyObj, &va
10480 6c 75 65 4f 62 6a 2c 20 26 64 6f 6e 65 29 3b 0d lueObj, &done);.
10490 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 ..if (result !=
104a0 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 TCL_OK) {...
104b0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
104c0 28 6b 65 79 56 61 72 4f 62 6a 29 3b 0d 0a 09 20 (keyVarObj);...
104d0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
104e0 75 6e 74 28 76 61 6c 75 65 56 61 72 4f 62 6a 29 unt(valueVarObj)
104f0 3b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 ;... Tcl_Decr
10500 52 65 66 43 6f 75 6e 74 28 64 69 63 74 4f 62 6a RefCount(dictObj
10510 29 3b 0d 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 );... Tcl_Dec
10520 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 74 rRefCount(script
10530 4f 62 6a 29 3b 0d 0a 09 20 20 20 20 72 65 74 75 Obj);... retu
10540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 09 rn TCL_ERROR;...
10550 7d 0d 0a 0d 0a 09 72 65 73 75 6c 74 4f 62 6a 20 }.....resultObj
10560 3d 20 54 63 6c 5f 4e 65 77 44 69 63 74 4f 62 6a = Tcl_NewDictObj
10570 28 29 3b 0d 0a 0d 0a 09 77 68 69 6c 65 20 28 21 ();.....while (!
10580 64 6f 6e 65 29 20 7b 0d 0a 09 20 20 20 20 2f 2a done) {... /*
10590 0d 0a 09 20 20 20 20 20 2a 20 53 74 6f 70 20 74 ... * Stop t
105a0 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 67 65 he value from ge
105b0 74 74 69 6e 67 20 68 69 74 20 69 6e 20 61 6e 79 tting hit in any
105c0 20 77 61 79 20 62 79 20 61 6e 79 0d 0a 09 20 20 way by any...
105d0 20 20 20 2a 20 74 72 61 63 65 73 20 6f 6e 20 74 * traces on t
105e0 68 65 20 6b 65 79 20 76 61 72 69 61 62 6c 65 2e he key variable.
105f0 0d 0a 09 20 20 20 20 20 2a 2f 0d 0a 09 20 20 20 ... */...
10600 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
10610 74 28 6b 65 79 4f 62 6a 29 3b 0d 0a 09 20 20 20 t(keyObj);...
10620 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
10630 74 28 76 61 6c 75 65 4f 62 6a 29 3b 0d 0a 09 20 t(valueObj);...
10640 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 53 65 if (Tcl_ObjSe
10650 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6b 65 tVar2(interp, ke
10660 79 56 61 72 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 6b yVarObj, NULL, k
10670 65 79 4f 62 6a 2c 0d 0a 09 09 20 20 20 20 54 43 eyObj,.... TC
10680 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 L_LEAVE_ERR_MSG)
10690 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 09 09 54 == NULL) {....T
106a0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
106b0 6e 74 65 72 70 29 3b 0d 0a 09 09 54 63 6c 5f 41 nterp);....Tcl_A
106c0 70 70 65 6e 64 53 74 72 69 6e 67 73 54 6f 4f 62 ppendStringsToOb
106d0 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 j(Tcl_GetObjResu
106e0 6c 74 28 69 6e 74 65 72 70 29 2c 0d 0a 09 09 09 lt(interp),.....
106f0 22 63 6f 75 6c 64 6e 27 74 20 73 65 74 20 6b 65 "couldn't set ke
10700 79 20 76 61 72 69 61 62 6c 65 3a 20 5c 22 22 2c y variable: \"",
10710 0d 0a 09 09 09 54 63 6c 5f 47 65 74 53 74 72 69 .....Tcl_GetStri
10720 6e 67 28 6b 65 79 56 61 72 4f 62 6a 29 2c 20 22 ng(keyVarObj), "
10730 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 \"", (char *) NU
10740 4c 4c 29 3b 0d 0a 09 09 72 65 73 75 6c 74 20 3d LL);....result =
10750 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 09 09 67 TCL_ERROR;....g
10760 6f 74 6f 20 61 62 6e 6f 72 6d 61 6c 52 65 73 75 oto abnormalResu
10770 6c 74 3b 0d 0a 09 20 20 20 20 7d 0d 0a 09 20 20 lt;... }...
10780 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 53 65 74 if (Tcl_ObjSet
10790 56 61 72 32 28 69 6e 74 65 72 70 2c 20 76 61 6c Var2(interp, val
107a0 75 65 56 61 72 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 ueVarObj, NULL,
107b0 76 61 6c 75 65 4f 62 6a 2c 0d 0a 09 09 20 20 20 valueObj,....
107c0 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d TCL_LEAVE_ERR_M
107d0 53 47 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0d 0a SG) == NULL) {..
107e0 09 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c ..Tcl_ResetResul
107f0 74 28 69 6e 74 65 72 70 29 3b 0d 0a 09 09 54 63 t(interp);....Tc
10800 6c 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 73 54 l_AppendStringsT
10810 6f 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 oObj(Tcl_GetObjR
10820 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 0d 0a esult(interp),..
10830 09 09 09 22 63 6f 75 6c 64 6e 27 74 20 73 65 74 ..."couldn't set
10840 20 76 61 6c 75 65 20 76 61 72 69 61 62 6c 65 3a value variable:
10850 20 5c 22 22 2c 0d 0a 09 09 09 54 63 6c 5f 47 65 \"",.....Tcl_Ge
10860 74 53 74 72 69 6e 67 28 6b 65 79 56 61 72 4f 62 tString(keyVarOb
10870 6a 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 j), "\"", (char
10880 2a 29 20 4e 55 4c 4c 29 3b 0d 0a 09 09 67 6f 74 *) NULL);....got
10890 6f 20 61 62 6e 6f 72 6d 61 6c 52 65 73 75 6c 74 o abnormalResult
108a0 3b 0d 0a 09 20 20 20 20 7d 0d 0a 0d 0a 09 20 20 ;... }.....
108b0 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 45 result = Tcl_E
108c0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
108d0 20 73 63 72 69 70 74 4f 62 6a 2c 20 30 29 3b 0d scriptObj, 0);.
108e0 0a 09 20 20 20 20 73 77 69 74 63 68 20 28 72 65 .. switch (re
108f0 73 75 6c 74 29 20 7b 0d 0a 09 20 20 20 20 63 61 sult) {... ca
10900 73 65 20 54 43 4c 5f 4f 4b 3a 0d 0a 09 09 62 6f se TCL_OK:....bo
10910 6f 6c 4f 62 6a 20 3d 20 54 63 6c 5f 47 65 74 4f olObj = Tcl_GetO
10920 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
10930 3b 0d 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65 66 ;....Tcl_IncrRef
10940 43 6f 75 6e 74 28 62 6f 6f 6c 4f 62 6a 29 3b 0d Count(boolObj);.
10950 0a 09 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ...Tcl_ResetResu
10960 6c 74 28 69 6e 74 65 72 70 29 3b 0d 0a 09 09 69 lt(interp);....i
10970 66 20 28 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 f (Tcl_GetBoolea
10980 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
10990 20 62 6f 6f 6c 4f 62 6a 2c 0d 0a 09 09 09 26 73 boolObj,.....&s
109a0 61 74 69 73 66 69 65 64 29 20 21 3d 20 54 43 4c atisfied) != TCL
109b0 5f 4f 4b 29 20 7b 0d 0a 09 09 20 20 20 20 54 63 _OK) {.... Tc
109c0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 62 l_DecrRefCount(b
109d0 6f 6f 6c 4f 62 6a 29 3b 0d 0a 09 09 20 20 20 20 oolObj);....
109e0 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 result = TCL_ERR
109f0 4f 52 3b 0d 0a 09 09 20 20 20 20 67 6f 74 6f 20 OR;.... goto
10a00 61 62 6e 6f 72 6d 61 6c 52 65 73 75 6c 74 3b 0d abnormalResult;.
10a10 0a 09 09 7d 0d 0a 09 09 54 63 6c 5f 44 65 63 72 ...}....Tcl_Decr
10a20 52 65 66 43 6f 75 6e 74 28 62 6f 6f 6c 4f 62 6a RefCount(boolObj
10a30 29 3b 0d 0a 09 09 69 66 20 28 73 61 74 69 73 66 );....if (satisf
10a40 69 65 64 29 20 7b 0d 0a 09 09 20 20 20 20 54 63 ied) {.... Tc
10a50 6c 5f 44 69 63 74 4f 62 6a 50 75 74 28 69 6e 74 l_DictObjPut(int
10a60 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
10a70 6b 65 79 4f 62 6a 2c 20 76 61 6c 75 65 4f 62 6a keyObj, valueObj
10a80 29 3b 0d 0a 09 09 7d 0d 0a 09 20 20 20 20 63 61 );....}... ca
10a90 73 65 20 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 3a se TCL_CONTINUE:
10aa0 0d 0a 09 09 72 65 73 75 6c 74 20 3d 20 54 43 4c ....result = TCL
10ab0 5f 4f 4b 3b 0d 0a 09 09 62 72 65 61 6b 3b 0d 0a _OK;....break;..
10ac0 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f 42 52 . case TCL_BR
10ad0 45 41 4b 3a 0d 0a 09 09 2f 2a 0d 0a 09 09 20 2a EAK:..../*.... *
10ae0 20 46 6f 72 63 65 20 6c 6f 6f 70 20 74 65 72 6d Force loop term
10af0 69 6e 61 74 69 6f 6e 2e 20 20 48 61 73 20 74 6f ination. Has to
10b00 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 61 20 be done with a
10b10 6a 75 6d 70 0d 0a 09 09 20 2a 20 73 6f 20 77 65 jump.... * so we
10b20 20 72 65 6d 6f 76 65 20 72 65 66 65 72 65 6e 63 remove referenc
10b30 65 73 20 74 6f 20 74 68 65 20 64 69 63 74 69 6f es to the dictio
10b40 6e 61 72 79 20 63 6f 72 72 65 63 74 6c 79 2e 0d nary correctly..
10b50 0a 09 09 20 2a 2f 0d 0a 09 09 54 63 6c 5f 52 65 ... */....Tcl_Re
10b60 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
10b70 29 3b 0d 0a 09 09 54 63 6c 5f 44 69 63 74 4f 62 );....Tcl_DictOb
10b80 6a 44 6f 6e 65 28 26 73 65 61 72 63 68 29 3b 0d jDone(&search);.
10b90 0a 09 09 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f ...result = TCL_
10ba0 4f 4b 3b 0d 0a 09 09 67 6f 74 6f 20 6e 6f 72 6d OK;....goto norm
10bb0 61 6c 52 65 73 75 6c 74 3b 0d 0a 09 20 20 20 20 alResult;...
10bc0 63 61 73 65 20 54 43 4c 5f 45 52 52 4f 52 3a 0d case TCL_ERROR:.
10bd0 0a 09 09 73 70 72 69 6e 74 66 28 6d 73 67 2c 20 ...sprintf(msg,
10be0 22 5c 6e 20 20 20 20 28 5c 22 64 69 63 74 20 66 "\n (\"dict f
10bf0 69 6c 74 65 72 5c 22 20 73 63 72 69 70 74 20 6c ilter\" script l
10c00 69 6e 65 20 25 64 29 22 2c 0d 0a 09 09 09 69 6e ine %d)",.....in
10c10 74 65 72 70 2d 3e 65 72 72 6f 72 4c 69 6e 65 29 terp->errorLine)
10c20 3b 0d 0a 09 09 54 63 6c 5f 41 64 64 4f 62 6a 45 ;....Tcl_AddObjE
10c30 72 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c rrorInfo(interp,
10c40 20 6d 73 67 2c 20 2d 31 29 3b 0d 0a 09 20 20 20 msg, -1);...
10c50 20 64 65 66 61 75 6c 74 3a 0d 0a 09 09 67 6f 74 default:....got
10c60 6f 20 61 62 6e 6f 72 6d 61 6c 52 65 73 75 6c 74 o abnormalResult
10c70 3b 0d 0a 09 20 20 20 20 7d 0d 0a 0d 0a 09 20 20 ;... }.....
10c80 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
10c90 6e 74 28 6b 65 79 4f 62 6a 29 3b 0d 0a 09 20 20 nt(keyObj);...
10ca0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
10cb0 6e 74 28 76 61 6c 75 65 4f 62 6a 29 3b 0d 0a 0d nt(valueObj);...
10cc0 0a 09 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 .. Tcl_DictOb
10cd0 6a 4e 65 78 74 28 26 73 65 61 72 63 68 2c 20 26 jNext(&search, &
10ce0 6b 65 79 4f 62 6a 2c 20 26 76 61 6c 75 65 4f 62 keyObj, &valueOb
10cf0 6a 2c 20 26 64 6f 6e 65 29 3b 0d 0a 09 7d 0d 0a j, &done);...}..
10d00 0d 0a 20 20 20 20 6e 6f 72 6d 61 6c 52 65 73 75 .. normalResu
10d10 6c 74 3a 0d 0a 09 2f 2a 0d 0a 09 20 2a 20 53 74 lt:.../*... * St
10d20 6f 70 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 op holding a ref
10d30 65 72 65 6e 63 65 20 74 6f 20 74 68 65 73 65 20 erence to these
10d40 6f 62 6a 65 63 74 73 2e 0d 0a 09 20 2a 2f 0d 0a objects.... */..
10d50 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
10d60 74 28 6b 65 79 56 61 72 4f 62 6a 29 3b 0d 0a 09 t(keyVarObj);...
10d70 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
10d80 28 76 61 6c 75 65 56 61 72 4f 62 6a 29 3b 0d 0a (valueVarObj);..
10d90 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
10da0 74 28 64 69 63 74 4f 62 6a 29 3b 0d 0a 09 54 63 t(dictObj);...Tc
10db0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
10dc0 63 72 69 70 74 4f 62 6a 29 3b 0d 0a 0d 0a 09 69 criptObj);.....i
10dd0 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c f (result == TCL
10de0 5f 4f 4b 29 20 7b 0d 0a 09 20 20 20 20 54 63 6c _OK) {... Tcl
10df0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
10e00 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 terp, resultObj)
10e10 3b 0d 0a 09 7d 20 65 6c 73 65 20 7b 0d 0a 09 20 ;...} else {...
10e20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
10e30 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0d unt(resultObj);.
10e40 0a 09 7d 0d 0a 09 72 65 74 75 72 6e 20 72 65 73 ..}...return res
10e50 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 ult;.. }..
10e60 20 70 61 6e 69 63 28 22 75 6e 65 78 70 65 63 74 panic("unexpect
10e70 65 64 20 66 61 6c 6c 74 68 72 6f 75 67 68 22 29 ed fallthrough")
10e80 3b 0d 0a 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f ;.. /* Contro
10e90 6c 20 6e 65 76 65 72 20 72 65 61 63 68 65 73 20 l never reaches
10ea0 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0d 0a this point. */..
10eb0 0d 0a 20 20 61 62 6e 6f 72 6d 61 6c 52 65 73 75 .. abnormalResu
10ec0 6c 74 3a 0d 0a 20 20 20 20 54 63 6c 5f 44 69 63 lt:.. Tcl_Dic
10ed0 74 4f 62 6a 44 6f 6e 65 28 26 73 65 61 72 63 68 tObjDone(&search
10ee0 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 );.. Tcl_Decr
10ef0 52 65 66 43 6f 75 6e 74 28 6b 65 79 4f 62 6a 29 RefCount(keyObj)
10f00 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 ;.. Tcl_DecrR
10f10 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 4f 62 6a efCount(valueObj
10f20 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 );.. Tcl_Decr
10f30 52 65 66 43 6f 75 6e 74 28 6b 65 79 56 61 72 4f RefCount(keyVarO
10f40 62 6a 29 3b 0d 0a 20 20 20 20 54 63 6c 5f 44 65 bj);.. Tcl_De
10f50 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 crRefCount(value
10f60 56 61 72 4f 62 6a 29 3b 0d 0a 20 20 20 20 54 63 VarObj);.. Tc
10f70 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 l_DecrRefCount(d
10f80 69 63 74 4f 62 6a 29 3b 0d 0a 20 20 20 20 54 63 ictObj);.. Tc
10f90 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
10fa0 63 72 69 70 74 4f 62 6a 29 3b 0d 0a 20 20 20 20 criptObj);..
10fb0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
10fc0 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0d 0a 20 20 (resultObj);..
10fd0 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b return result;
10fe0 0d 0a 7d 0d 0a 0c 0d 0a 2f 2a 0d 0a 20 2a 2d 2d ..}...../*.. *--
10ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11030 2d 2d 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 54 63 6c ----.. *.. * Tcl
11040 5f 44 69 63 74 4f 62 6a 43 6d 64 20 2d 2d 0d 0a _DictObjCmd --..
11050 20 2a 0d 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 *.. *.This func
11060 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
11070 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
11080 64 69 63 74 22 20 54 63 6c 20 63 6f 6d 6d 61 6e dict" Tcl comman
11090 64 2e 0d 0a 20 2a 09 53 65 65 20 74 68 65 20 75 d... *.See the u
110a0 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f ser documentatio
110b0 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e n for details on
110c0 20 77 68 61 74 20 69 74 20 64 6f 65 73 2c 20 61 what it does, a
110d0 6e 64 0d 0a 20 2a 09 54 49 50 23 3f 3f 3f 20 66 nd.. *.TIP#??? f
110e0 6f 72 20 74 68 65 20 66 6f 72 6d 61 6c 20 73 70 or the formal sp
110f0 65 63 69 66 69 63 61 74 69 6f 6e 2e 0d 0a 20 2a ecification... *
11100 0d 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 20 .. * Results:..
11110 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
11120 20 72 65 73 75 6c 74 2e 0d 0a 20 2a 0d 0a 20 2a result... *.. *
11130 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a Side effects:..
11140 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 *.See the user
11150 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a documentation...
11160 20 2a 0d 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.. *----------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 2a ------------.. *
111b0 2f 0d 0a 0d 0a 69 6e 74 0d 0a 54 63 6c 5f 44 69 /....int..Tcl_Di
111c0 63 74 4f 62 6a 43 6d 64 28 2f 2a 69 67 6e 6f 72 ctObjCmd(/*ignor
111d0 65 64 2a 2f 20 63 6c 69 65 6e 74 44 61 74 61 2c ed*/ clientData,
111e0 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f interp, objc, o
111f0 62 6a 76 29 0d 0a 20 20 20 20 43 6c 69 65 6e 74 bjv).. Client
11200 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b Data clientData;
11210 0d 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .. Tcl_Interp
11220 20 2a 69 6e 74 65 72 70 3b 0d 0a 20 20 20 20 69 *interp;.. i
11230 6e 74 20 6f 62 6a 63 3b 0d 0a 20 20 20 20 54 63 nt objc;.. Tc
11240 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 2a 6f 62 l_Obj *CONST *ob
11250 6a 76 3b 0d 0a 7b 0d 0a 20 20 20 20 73 74 61 74 jv;..{.. stat
11260 69 63 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 73 ic CONST char *s
11270 75 62 63 6f 6d 6d 61 6e 64 73 5b 5d 20 3d 20 7b ubcommands[] = {
11280 0d 0a 09 22 61 70 70 65 6e 64 22 2c 20 22 63 72 ..."append", "cr
11290 65 61 74 65 22 2c 20 22 65 78 69 73 74 73 22 2c eate", "exists",
112a0 20 22 66 69 6c 74 65 72 22 2c 20 22 66 6f 72 22 "filter", "for"
112b0 2c 0d 0a 09 22 67 65 74 22 2c 20 22 69 6e 63 72 ,..."get", "incr
112c0 22 2c 20 22 69 6e 66 6f 22 2c 20 22 6b 65 79 73 ", "info", "keys
112d0 22 2c 20 22 6c 61 70 70 65 6e 64 22 2c 20 22 72 ", "lappend", "r
112e0 65 6d 6f 76 65 22 2c 0d 0a 09 22 72 65 70 6c 61 emove",..."repla
112f0 63 65 22 2c 20 22 73 65 74 22 2c 20 22 73 69 7a ce", "set", "siz
11300 65 22 2c 20 22 75 6e 73 65 74 22 2c 20 22 76 61 e", "unset", "va
11310 6c 75 65 73 22 2c 20 4e 55 4c 4c 0d 0a 20 20 20 lues", NULL..
11320 20 7d 3b 0d 0a 20 20 20 20 65 6e 75 6d 20 44 69 };.. enum Di
11330 63 74 53 75 62 63 6f 6d 6d 61 6e 64 73 20 7b 0d ctSubcommands {.
11340 0a 09 44 49 43 54 5f 41 50 50 45 4e 44 2c 20 44 ..DICT_APPEND, D
11350 49 43 54 5f 43 52 45 41 54 45 2c 20 44 49 43 54 ICT_CREATE, DICT
11360 5f 45 58 49 53 54 53 2c 20 44 49 43 54 5f 46 49 _EXISTS, DICT_FI
11370 4c 54 45 52 2c 20 44 49 43 54 5f 46 4f 52 2c 0d LTER, DICT_FOR,.
11380 0a 09 44 49 43 54 5f 47 45 54 2c 20 44 49 43 54 ..DICT_GET, DICT
11390 5f 49 4e 43 52 2c 20 44 49 43 54 5f 49 4e 46 4f _INCR, DICT_INFO
113a0 2c 20 44 49 43 54 5f 4b 45 59 53 2c 20 44 49 43 , DICT_KEYS, DIC
113b0 54 5f 4c 41 50 50 45 4e 44 2c 20 44 49 43 54 5f T_LAPPEND, DICT_
113c0 52 45 4d 4f 56 45 2c 0d 0a 09 44 49 43 54 5f 52 REMOVE,...DICT_R
113d0 45 50 4c 41 43 45 2c 20 44 49 43 54 5f 53 45 54 EPLACE, DICT_SET
113e0 2c 20 44 49 43 54 5f 53 49 5a 45 2c 20 44 49 43 , DICT_SIZE, DIC
113f0 54 5f 55 4e 53 45 54 2c 20 44 49 43 54 5f 56 41 T_UNSET, DICT_VA
11400 4c 55 45 53 0d 0a 20 20 20 20 7d 3b 0d 0a 20 20 LUES.. };..
11410 20 20 69 6e 74 20 69 6e 64 65 78 3b 0d 0a 0d 0a int index;....
11420 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
11430 29 20 7b 0d 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
11440 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
11450 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d , objv, "subcomm
11460 61 6e 64 20 3f 61 72 67 20 2e 2e 2e 3f 22 29 3b and ?arg ...?");
11470 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
11480 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 ROR;.. }..
11490 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
114a0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
114b0 20 6f 62 6a 76 5b 31 5d 2c 20 73 75 62 63 6f 6d objv[1], subcom
114c0 6d 61 6e 64 73 2c 20 22 73 75 62 63 6f 6d 6d 61 mands, "subcomma
114d0 6e 64 22 2c 0d 0a 09 20 20 20 20 30 2c 20 26 69 nd",... 0, &i
114e0 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ndex) != TCL_OK)
114f0 20 7b 0d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
11500 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 20 ERROR;.. }..
11510 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
11520 20 44 69 63 74 53 75 62 63 6f 6d 6d 61 6e 64 73 DictSubcommands
11530 29 20 69 6e 64 65 78 29 20 7b 0d 0a 20 20 20 20 ) index) {..
11540 63 61 73 65 20 44 49 43 54 5f 41 50 50 45 4e 44 case DICT_APPEND
11550 3a 09 72 65 74 75 72 6e 20 44 69 63 74 41 70 70 :.return DictApp
11560 65 6e 64 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f endCmd(interp, o
11570 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 20 bjc, objv);..
11580 20 63 61 73 65 20 44 49 43 54 5f 43 52 45 41 54 case DICT_CREAT
11590 45 3a 09 72 65 74 75 72 6e 20 44 69 63 74 43 72 E:.return DictCr
115a0 65 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 eateCmd(interp,
115b0 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 objc, objv);..
115c0 20 20 63 61 73 65 20 44 49 43 54 5f 45 58 49 53 case DICT_EXIS
115d0 54 53 3a 09 72 65 74 75 72 6e 20 44 69 63 74 45 TS:.return DictE
115e0 78 69 73 74 73 43 6d 64 28 69 6e 74 65 72 70 2c xistsCmd(interp,
115f0 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 objc, objv);..
11600 20 20 20 63 61 73 65 20 44 49 43 54 5f 46 49 4c case DICT_FIL
11610 54 45 52 3a 09 72 65 74 75 72 6e 20 44 69 63 74 TER:.return Dict
11620 46 69 6c 74 65 72 43 6d 64 28 69 6e 74 65 72 70 FilterCmd(interp
11630 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a , objc, objv);..
11640 20 20 20 20 63 61 73 65 20 44 49 43 54 5f 46 4f case DICT_FO
11650 52 3a 09 72 65 74 75 72 6e 20 44 69 63 74 46 6f R:.return DictFo
11660 72 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a rCmd(interp, obj
11670 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 20 20 63 c, objv);.. c
11680 61 73 65 20 44 49 43 54 5f 47 45 54 3a 09 72 65 ase DICT_GET:.re
11690 74 75 72 6e 20 44 69 63 74 47 65 74 43 6d 64 28 turn DictGetCmd(
116a0 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
116b0 6a 76 29 3b 0d 0a 20 20 20 20 63 61 73 65 20 44 jv);.. case D
116c0 49 43 54 5f 49 4e 43 52 3a 09 72 65 74 75 72 6e ICT_INCR:.return
116d0 20 44 69 63 74 49 6e 63 72 43 6d 64 28 69 6e 74 DictIncrCmd(int
116e0 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 erp, objc, objv)
116f0 3b 0d 0a 20 20 20 20 63 61 73 65 20 44 49 43 54 ;.. case DICT
11700 5f 49 4e 46 4f 3a 09 72 65 74 75 72 6e 20 44 69 _INFO:.return Di
11710 63 74 49 6e 66 6f 43 6d 64 28 69 6e 74 65 72 70 ctInfoCmd(interp
11720 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a , objc, objv);..
11730 20 20 20 20 63 61 73 65 20 44 49 43 54 5f 4b 45 case DICT_KE
11740 59 53 3a 09 72 65 74 75 72 6e 20 44 69 63 74 4b YS:.return DictK
11750 65 79 73 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f eysCmd(interp, o
11760 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 20 bjc, objv);..
11770 20 63 61 73 65 20 44 49 43 54 5f 4c 41 50 50 45 case DICT_LAPPE
11780 4e 44 3a 09 72 65 74 75 72 6e 20 44 69 63 74 4c ND:.return DictL
11790 61 70 70 65 6e 64 43 6d 64 28 69 6e 74 65 72 70 appendCmd(interp
117a0 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a , objc, objv);..
117b0 20 20 20 20 63 61 73 65 20 44 49 43 54 5f 52 45 case DICT_RE
117c0 4d 4f 56 45 3a 09 72 65 74 75 72 6e 20 44 69 63 MOVE:.return Dic
117d0 74 52 65 6d 6f 76 65 43 6d 64 28 69 6e 74 65 72 tRemoveCmd(inter
117e0 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d p, objc, objv);.
117f0 0a 20 20 20 20 63 61 73 65 20 44 49 43 54 5f 52 . case DICT_R
11800 45 50 4c 41 43 45 3a 09 72 65 74 75 72 6e 20 44 EPLACE:.return D
11810 69 63 74 52 65 70 6c 61 63 65 43 6d 64 28 69 6e ictReplaceCmd(in
11820 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
11830 29 3b 0d 0a 20 20 20 20 63 61 73 65 20 44 49 43 );.. case DIC
11840 54 5f 53 45 54 3a 09 72 65 74 75 72 6e 20 44 69 T_SET:.return Di
11850 63 74 53 65 74 43 6d 64 28 69 6e 74 65 72 70 2c ctSetCmd(interp,
11860 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 objc, objv);..
11870 20 20 20 63 61 73 65 20 44 49 43 54 5f 53 49 5a case DICT_SIZ
11880 45 3a 09 72 65 74 75 72 6e 20 44 69 63 74 53 69 E:.return DictSi
11890 7a 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 zeCmd(interp, ob
118a0 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 20 20 jc, objv);..
118b0 63 61 73 65 20 44 49 43 54 5f 55 4e 53 45 54 3a case DICT_UNSET:
118c0 09 72 65 74 75 72 6e 20 44 69 63 74 55 6e 73 65 .return DictUnse
118d0 74 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a tCmd(interp, obj
118e0 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 20 20 63 c, objv);.. c
118f0 61 73 65 20 44 49 43 54 5f 56 41 4c 55 45 53 3a ase DICT_VALUES:
11900 09 72 65 74 75 72 6e 20 44 69 63 74 56 61 6c 75 .return DictValu
11910 65 73 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 esCmd(interp, ob
11920 6a 63 2c 20 6f 62 6a 76 29 3b 0d 0a 20 20 20 20 jc, objv);..
11930 7d 0d 0a 20 20 20 20 70 61 6e 69 63 28 22 75 6e }.. panic("un
11940 65 78 70 65 63 74 65 64 20 66 61 6c 6c 74 68 72 expected fallthr
11950 6f 75 67 68 21 22 29 3b 0d 0a 7d 0d 0a ough!");..}..