Attachment "alternative.patch" to
ticket [536831ffff]
added by
dgp
2003-03-13 09:08:13.
0000: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 Index: generic/t
0010: 63 6c 42 61 73 69 63 2e 63 0a 3d 3d 3d 3d 3d 3d clBasic.c.======
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 =============.RC
0060: 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 S file: /cvsroot
0070: 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 /tcl/tcl/generic
0080: 2f 74 63 6c 42 61 73 69 63 2e 63 2c 76 0a 72 65 /tclBasic.c,v.re
0090: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f trieving revisio
00a0: 6e 20 31 2e 37 36 0a 64 69 66 66 20 2d 75 20 2d n 1.76.diff -u -
00b0: 72 31 2e 37 36 20 74 63 6c 42 61 73 69 63 2e 63 r1.76 tclBasic.c
00c0: 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c .--- generic/tcl
00d0: 42 61 73 69 63 2e 63 09 35 20 4d 61 72 20 32 30 Basic.c.5 Mar 20
00e0: 30 33 20 32 32 3a 33 31 3a 32 32 20 2d 30 30 30 03 22:31:22 -000
00f0: 30 09 31 2e 37 36 0a 2b 2b 2b 20 67 65 6e 65 72 0.1.76.+++ gener
0100: 69 63 2f 74 63 6c 42 61 73 69 63 2e 63 09 31 33 ic/tclBasic.c.13
0110: 20 4d 61 72 20 32 30 30 33 20 30 31 3a 35 32 3a Mar 2003 01:52:
0120: 34 32 20 2d 30 30 30 30 0a 40 40 20 2d 33 33 34 42 -0000.@@ -334
0130: 37 2c 36 20 2b 33 33 34 37 2c 31 30 20 40 40 0a 7,6 +3347,10 @@.
0140: 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 09 int count;.
0150: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 ../* Number of t
0160: 6f 6b 65 6e 73 20 74 6f 20 63 6f 6e 73 69 64 65 okens to conside
0170: 72 20 61 74 20 74 6f 6b 65 6e 50 74 72 2e 0a 20 r at tokenPtr..
0180: 09 09 09 09 20 2a 20 4d 75 73 74 20 62 65 20 61 .... * Must be a
0190: 74 20 6c 65 61 73 74 20 31 2e 20 2a 2f 0a 20 7b t least 1. */. {
01a0: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c .+ return Tcl
01b0: 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 65 SubstTokens(inte
01c0: 72 70 2c 20 74 6f 6b 65 6e 50 74 72 2c 20 63 6f rp, tokenPtr, co
01d0: 75 6e 74 2c 20 2f 2a 20 6e 75 6d 4c 65 66 74 50 unt, /* numLeftP
01e0: 74 72 20 2a 2f 20 4e 55 4c 4c 29 3b 0a 2b 0a 2b tr */ NULL);.+.+
01f0: 23 69 66 20 30 0a 2b 0a 20 20 20 20 20 54 63 6c #if 0.+. Tcl
0200: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 2c _Obj *resultPtr,
0210: 20 2a 69 6e 64 65 78 50 74 72 2c 20 2a 76 61 6c *indexPtr, *val
0220: 75 65 50 74 72 3b 0a 20 20 20 20 20 63 68 61 72 uePtr;. char
0230: 20 62 75 66 66 65 72 5b 54 43 4c 5f 55 54 46 5f buffer[TCL_UTF_
0240: 4d 41 58 5d 3b 0a 20 23 69 66 64 65 66 20 54 43 MAX];. #ifdef TC
0250: 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 40 40 20 2d L_MEM_DEBUG.@@ -
0260: 33 34 38 34 2c 36 20 2b 33 34 38 38 2c 37 20 40 3484,6 +3488,7 @
0270: 40 0a 20 09 54 63 6c 5f 44 65 63 72 52 65 66 43 @. .Tcl_DecrRefC
0280: 6f 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b ount(resultPtr);
0290: 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 72 65 74 . }. ret
02a0: 75 72 6e 20 63 6f 64 65 3b 0a 2b 23 65 6e 64 69 urn code;.+#endi
02b0: 66 0a 20 7d 0a 20 0a 20 0a 49 6e 64 65 78 3a 20 f. }. . .Index:
02c0: 67 65 6e 65 72 69 63 2f 74 63 6c 43 6d 64 4d 5a generic/tclCmdMZ
02d0: 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .c.=============
02e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
02f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0300: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0310: 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a ======.RCS file:
0320: 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 /cvsroot/tcl/tc
0330: 6c 2f 67 65 6e 65 72 69 63 2f 74 63 6c 43 6d 64 l/generic/tclCmd
0340: 4d 5a 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e MZ.c,v.retrievin
0350: 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 38 32 0a g revision 1.82.
0360: 64 69 66 66 20 2d 75 20 2d 72 31 2e 38 32 20 74 diff -u -r1.82 t
0370: 63 6c 43 6d 64 4d 5a 2e 63 0a 2d 2d 2d 20 67 65 clCmdMZ.c.--- ge
0380: 6e 65 72 69 63 2f 74 63 6c 43 6d 64 4d 5a 2e 63 neric/tclCmdMZ.c
0390: 09 32 37 20 46 65 62 20 32 30 30 33 20 30 30 3a .27 Feb 2003 00:
03a0: 35 34 3a 33 36 20 2d 30 30 30 30 09 31 2e 38 32 54:36 -0000.1.82
03b0: 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c .+++ generic/tcl
03c0: 43 6d 64 4d 5a 2e 63 09 31 33 20 4d 61 72 20 32 CmdMZ.c.13 Mar 2
03d0: 30 30 33 20 30 31 3a 35 32 3a 34 33 20 2d 30 30 003 01:52:43 -00
03e0: 30 30 0a 40 40 20 2d 32 34 38 37 2c 36 20 2b 32 00.@@ -2487,6 +2
03f0: 34 38 37 2c 37 20 40 40 0a 20 20 20 20 20 72 65 487,7 @@. re
0400: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 7d 0a turn TCL_OK;. }.
0410: 20 0c 0a 2b 23 69 66 20 30 0a 20 2f 2a 0a 20 20 ..+#if 0. /*.
0420: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 40 40 20 2d -------. *.@@ -
0470: 32 36 34 30 2c 36 20 2b 32 36 34 31 2c 37 20 40 2640,6 +2641,7 @
0480: 40 0a 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55 @. return NU
0490: 4c 4c 3b 0a 20 7d 0a 20 0c 0a 2b 23 65 6e 64 69 LL;. }. ..+#endi
04a0: 66 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d f. /*. *-------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
04f0: 20 20 2a 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 *.Index: gener
0500: 69 63 2f 74 63 6c 49 6e 74 2e 68 0a 3d 3d 3d 3d ic/tclInt.h.====
0510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
0550: 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f RCS file: /cvsro
0560: 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 ot/tcl/tcl/gener
0570: 69 63 2f 74 63 6c 49 6e 74 2e 68 2c 76 0a 72 65 ic/tclInt.h,v.re
0580: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f trieving revisio
0590: 6e 20 31 2e 31 31 39 0a 64 69 66 66 20 2d 75 20 n 1.119.diff -u
05a0: 2d 72 31 2e 31 31 39 20 74 63 6c 49 6e 74 2e 68 -r1.119 tclInt.h
05b0: 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c .--- generic/tcl
05c0: 49 6e 74 2e 68 09 35 20 4d 61 72 20 32 30 30 33 Int.h.5 Mar 2003
05d0: 20 32 32 3a 33 31 3a 32 34 20 2d 30 30 30 30 09 22:31:24 -0000.
05e0: 31 2e 31 31 39 0a 2b 2b 2b 20 67 65 6e 65 72 69 1.119.+++ generi
05f0: 63 2f 74 63 6c 49 6e 74 2e 68 09 31 33 20 4d 61 c/tclInt.h.13 Ma
0600: 72 20 32 30 30 33 20 30 31 3a 35 32 3a 34 33 20 r 2003 01:52:43
0610: 2d 30 30 30 30 0a 40 40 20 2d 31 38 30 32 2c 37 -0000.@@ -1802,7
0620: 20 2b 31 38 30 32 2c 31 30 20 40 40 0a 20 45 58 +1802,10 @@. EX
0630: 54 45 52 4e 20 56 4f 49 44 20 20 20 20 20 20 20 TERN VOID
0640: 20 20 20 20 20 20 54 63 6c 52 65 6d 65 6d 62 65 TclRemembe
0650: 72 4a 6f 69 6e 61 62 6c 65 54 68 72 65 61 64 20 rJoinableThread
0660: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c _ANSI_ARGS_((Tcl
0670: 5f 54 68 72 65 61 64 49 64 20 69 64 29 29 3b 0a _ThreadId id));.
0680: 20 45 58 54 45 52 4e 20 76 6f 69 64 09 09 54 63 EXTERN void..Tc
0690: 6c 52 65 6d 65 6d 62 65 72 4d 75 74 65 78 20 5f lRememberMutex _
06a0: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f ANSI_ARGS_((Tcl_
06b0: 4d 75 74 65 78 20 2a 6d 75 74 65 78 29 29 3b 0a Mutex *mutex));.
06c0: 20 45 58 54 45 52 4e 20 56 4f 49 44 20 20 20 20 EXTERN VOID
06d0: 20 20 20 20 20 20 20 20 20 54 63 6c 53 69 67 6e TclSign
06e0: 61 6c 45 78 69 74 54 68 72 65 61 64 20 5f 41 4e alExitThread _AN
06f0: 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 54 68 SI_ARGS_((Tcl_Th
0700: 72 65 61 64 49 64 20 69 64 2c 0a 2d 09 09 09 20 readId id,.-...
0710: 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 29 29 int result))
0720: 3b 0a 2b 09 09 09 20 20 20 20 69 6e 74 20 72 65 ;.+... int re
0730: 73 75 6c 74 29 29 3b 0a 2b 45 58 54 45 52 4e 20 sult));.+EXTERN
0740: 69 6e 74 09 09 54 63 6c 53 75 62 73 74 54 6f 6b int..TclSubstTok
0750: 65 6e 73 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 ens _ANSI_ARGS_(
0760: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
0770: 65 72 70 2c 0a 2b 09 09 09 20 20 20 20 54 63 6c erp,.+... Tcl
0780: 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 _Token *tokenPtr
0790: 2c 20 69 6e 74 20 63 6f 75 6e 74 2c 0a 2b 09 09 , int count,.+..
07a0: 09 20 20 20 20 69 6e 74 20 2a 74 6f 6b 65 6e 73 . int *tokens
07b0: 4c 65 66 74 50 74 72 29 29 3b 0a 20 45 58 54 45 LeftPtr));. EXTE
07c0: 52 4e 20 76 6f 69 64 09 09 54 63 6c 54 72 61 6e RN void..TclTran
07d0: 73 66 65 72 52 65 73 75 6c 74 20 5f 41 4e 53 49 sferResult _ANSI
07e0: 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 _ARGS_((Tcl_Inte
07f0: 72 70 20 2a 73 6f 75 72 63 65 49 6e 74 65 72 70 rp *sourceInterp
0800: 2c 0a 20 09 09 09 20 20 20 20 69 6e 74 20 72 65 ,. ... int re
0810: 73 75 6c 74 2c 20 54 63 6c 5f 49 6e 74 65 72 70 sult, Tcl_Interp
0820: 20 2a 74 61 72 67 65 74 49 6e 74 65 72 70 29 29 *targetInterp))
0830: 3b 0a 20 45 58 54 45 52 4e 20 54 63 6c 5f 4f 62 ;. EXTERN Tcl_Ob
0840: 6a 2a 20 20 20 20 20 20 20 20 20 54 63 6c 70 4e j* TclpN
0850: 61 74 69 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65 ativeToNormalize
0860: 64 20 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 d .Index: generi
0870: 63 2f 74 63 6c 50 61 72 73 65 2e 63 0a 3d 3d 3d c/tclParse.c.===
0880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
08a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
08b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
08c0: 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 .RCS file: /cvsr
08d0: 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 oot/tcl/tcl/gene
08e0: 72 69 63 2f 74 63 6c 50 61 72 73 65 2e 63 2c 76 ric/tclParse.c,v
08f0: 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65 76 69 .retrieving revi
0900: 73 69 6f 6e 20 31 2e 32 35 0a 64 69 66 66 20 2d sion 1.25.diff -
0910: 75 20 2d 72 31 2e 32 35 20 74 63 6c 50 61 72 73 u -r1.25 tclPars
0920: 65 2e 63 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f e.c.--- generic/
0930: 74 63 6c 50 61 72 73 65 2e 63 09 31 36 20 46 65 tclParse.c.16 Fe
0940: 62 20 32 30 30 33 20 30 31 3a 33 36 3a 33 32 20 b 2003 01:36:32
0950: 2d 30 30 30 30 09 31 2e 32 35 0a 2b 2b 2b 20 67 -0000.1.25.+++ g
0960: 65 6e 65 72 69 63 2f 74 63 6c 50 61 72 73 65 2e eneric/tclParse.
0970: 63 09 31 33 20 4d 61 72 20 32 30 30 33 20 30 31 c.13 Mar 2003 01
0980: 3a 35 32 3a 34 33 20 2d 30 30 30 30 0a 40 40 20 :52:43 -0000.@@
0990: 2d 31 37 39 2c 37 20 2b 31 37 39 2c 37 20 40 40 -179,7 +179,7 @@
09a0: 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 61 . static int..Pa
09b0: 72 73 65 43 6f 6d 6d 65 6e 74 20 5f 41 4e 53 49 rseComment _ANSI
09c0: 5f 41 52 47 53 5f 28 28 43 4f 4e 53 54 20 63 68 _ARGS_((CONST ch
09d0: 61 72 20 2a 73 72 63 2c 20 69 6e 74 20 6e 75 6d ar *src, int num
09e0: 42 79 74 65 73 2c 0a 20 09 09 09 20 20 20 20 54 Bytes,. ... T
09f0: 63 6c 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50 cl_Parse *parseP
0a00: 74 72 29 29 3b 0a 20 73 74 61 74 69 63 20 69 6e tr));. static in
0a10: 74 09 09 50 61 72 73 65 54 6f 6b 65 6e 73 20 5f t..ParseTokens _
0a20: 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 4f 4e 53 ANSI_ARGS_((CONS
0a30: 54 20 63 68 61 72 20 2a 73 72 63 2c 20 69 6e 74 T char *src, int
0a40: 20 6e 75 6d 42 79 74 65 73 2c 0a 2d 09 09 09 20 numBytes,.-...
0a50: 20 20 20 69 6e 74 20 6d 61 73 6b 2c 20 54 63 6c int mask, Tcl
0a60: 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50 74 72 _Parse *parsePtr
0a70: 29 29 3b 0a 2b 09 09 09 20 20 20 20 69 6e 74 20 ));.+... int
0a80: 6d 61 73 6b 2c 20 69 6e 74 20 66 6c 61 67 73 2c mask, int flags,
0a90: 20 54 63 6c 5f 50 61 72 73 65 20 2a 70 61 72 73 Tcl_Parse *pars
0aa0: 65 50 74 72 29 29 3b 0a 20 0a 20 2f 2a 0a 20 20 ePtr));. . /*.
0ab0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 0a 40 40 20 2d 33 34 33 2c -------.@@ -343,
0b00: 37 20 2b 33 34 33 2c 37 20 40 40 0a 20 09 20 20 7 +343,7 @@. .
0b10: 20 20 20 2a 2f 0a 20 0a 20 09 20 20 20 20 69 66 */. . . if
0b20: 20 28 50 61 72 73 65 54 6f 6b 65 6e 73 28 73 72 (ParseTokens(sr
0b30: 63 2c 20 6e 75 6d 42 79 74 65 73 2c 20 54 59 50 c, numBytes, TYP
0b40: 45 5f 53 50 41 43 45 7c 74 65 72 6d 69 6e 61 74 E_SPACE|terminat
0b50: 6f 72 73 2c 0a 2d 09 09 20 20 20 20 70 61 72 73 ors,.-.. pars
0b60: 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ePtr) != TCL_OK)
0b70: 20 7b 0a 2b 09 09 20 20 20 20 54 43 4c 5f 53 55 {.+.. TCL_SU
0b80: 42 53 54 5f 41 4c 4c 2c 20 70 61 72 73 65 50 74 BST_ALL, parsePt
0b90: 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a r) != TCL_OK) {.
0ba0: 20 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 ..goto error;.
0bb0: 09 20 20 20 20 7d 0a 20 09 20 20 20 20 73 72 63 . }. . src
0bc0: 20 3d 20 70 61 72 73 65 50 74 72 2d 3e 74 65 72 = parsePtr->ter
0bd0: 6d 3b 20 6e 75 6d 42 79 74 65 73 20 3d 20 70 61 m; numBytes = pa
0be0: 72 73 65 50 74 72 2d 3e 65 6e 64 20 2d 20 73 72 rsePtr->end - sr
0bf0: 63 3b 0a 40 40 20 2d 37 38 35 2c 39 20 2b 37 38 c;.@@ -785,9 +78
0c00: 35 2c 31 33 20 40 40 0a 20 20 2a 2f 0a 20 0a 20 5,13 @@. */. .
0c10: 73 74 61 74 69 63 20 69 6e 74 0a 2d 50 61 72 73 static int.-Pars
0c20: 65 54 6f 6b 65 6e 73 28 73 72 63 2c 20 6e 75 6d eTokens(src, num
0c30: 42 79 74 65 73 2c 20 6d 61 73 6b 2c 20 70 61 72 Bytes, mask, par
0c40: 73 65 50 74 72 29 0a 2b 50 61 72 73 65 54 6f 6b sePtr).+ParseTok
0c50: 65 6e 73 28 73 72 63 2c 20 6e 75 6d 42 79 74 65 ens(src, numByte
0c60: 73 2c 20 6d 61 73 6b 2c 20 66 6c 61 67 73 2c 20 s, mask, flags,
0c70: 70 61 72 73 65 50 74 72 29 0a 20 20 20 20 20 72 parsePtr). r
0c80: 65 67 69 73 74 65 72 20 43 4f 4e 53 54 20 63 68 egister CONST ch
0c90: 61 72 20 2a 73 72 63 3b 09 2f 2a 20 46 69 72 73 ar *src;./* Firs
0ca0: 74 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 70 t character to p
0cb0: 61 72 73 65 2e 20 2a 2f 0a 20 20 20 20 20 72 65 arse. */. re
0cc0: 67 69 73 74 65 72 20 69 6e 74 20 6e 75 6d 42 79 gister int numBy
0cd0: 74 65 73 3b 09 2f 2a 20 4d 61 78 20 6e 75 6d 62 tes;./* Max numb
0ce0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 73 er of bytes to s
0cf0: 63 61 6e 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e 74 can. */.+ int
0d00: 20 66 6c 61 67 73 3b 09 09 09 2f 2a 20 4f 52 2d flags;.../* OR-
0d10: 65 64 20 62 69 74 73 20 69 6e 64 69 63 61 74 69 ed bits indicati
0d20: 6e 67 20 77 68 61 74 20 73 75 62 73 74 69 74 75 ng what substitu
0d30: 74 69 6f 6e 73 0a 2b 09 09 09 09 20 20 20 74 6f tions.+.... to
0d40: 20 70 65 72 66 6f 72 6d 3a 20 54 43 4c 5f 53 55 perform: TCL_SU
0d50: 42 53 54 5f 43 4f 4d 4d 41 4e 44 53 2c 0a 2b 09 BST_COMMANDS,.+.
0d60: 09 09 09 20 20 20 54 43 4c 5f 53 55 42 53 54 5f ... TCL_SUBST_
0d70: 56 41 52 49 41 42 4c 45 53 2c 20 61 6e 64 20 0a VARIABLES, and .
0d80: 2b 09 09 09 09 20 20 20 54 43 4c 5f 53 55 42 53 +.... TCL_SUBS
0d90: 54 5f 42 41 43 4b 53 4c 41 53 48 45 53 20 2a 2f T_BACKSLASHES */
0da0: 0a 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 09 . int mask;.
0db0: 09 09 2f 2a 20 53 70 65 63 69 66 69 65 73 20 77 ../* Specifies w
0dc0: 68 65 6e 20 74 6f 20 73 74 6f 70 20 70 61 72 73 hen to stop pars
0dd0: 69 6e 67 2e 20 20 54 68 65 0a 20 09 09 09 09 20 ing. The. ....
0de0: 2a 20 70 61 72 73 65 20 73 74 6f 70 73 20 61 74 * parse stops at
0df0: 20 74 68 65 20 66 69 72 73 74 20 75 6e 71 75 6f the first unquo
0e00: 74 65 64 0a 20 09 09 09 09 20 2a 20 63 68 61 72 ted. .... * char
0e10: 61 63 74 65 72 20 77 68 6f 73 65 20 43 48 41 52 acter whose CHAR
0e20: 5f 54 59 50 45 20 63 6f 6e 74 61 69 6e 73 0a 40 _TYPE contains.@
0e30: 40 20 2d 37 39 38 2c 36 20 2b 38 30 32 2c 39 20 @ -798,6 +802,9
0e40: 40 40 0a 20 7b 0a 20 20 20 20 20 63 68 61 72 20 @@. {. char
0e50: 74 79 70 65 3b 20 0a 20 20 20 20 20 69 6e 74 20 type; . int
0e60: 6f 72 69 67 69 6e 61 6c 54 6f 6b 65 6e 73 2c 20 originalTokens,
0e70: 76 61 72 54 6f 6b 65 6e 3b 0a 2b 20 20 20 20 69 varToken;.+ i
0e80: 6e 74 20 6e 6f 53 75 62 73 74 43 6d 64 73 20 3d nt noSubstCmds =
0e90: 20 21 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 53 !(flags & TCL_S
0ea0: 55 42 53 54 5f 43 4f 4d 4d 41 4e 44 53 29 3b 0a UBST_COMMANDS);.
0eb0: 2b 20 20 20 20 69 6e 74 20 6e 6f 53 75 62 73 74 + int noSubst
0ec0: 56 61 72 73 20 3d 20 21 28 66 6c 61 67 73 20 26 Vars = !(flags &
0ed0: 20 54 43 4c 5f 53 55 42 53 54 5f 56 41 52 49 41 TCL_SUBST_VARIA
0ee0: 42 4c 45 53 29 3b 0a 2b 20 20 20 20 69 6e 74 20 BLES);.+ int
0ef0: 6e 6f 53 75 62 73 74 42 53 20 3d 20 21 28 66 6c noSubstBS = !(fl
0f00: 61 67 73 20 26 20 54 43 4c 5f 53 55 42 53 54 5f ags & TCL_SUBST_
0f10: 42 41 43 4b 53 4c 41 53 48 45 53 29 3b 0a 20 20 BACKSLASHES);.
0f20: 20 20 20 54 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f Tcl_Token *to
0f30: 6b 65 6e 50 74 72 3b 0a 20 20 20 20 20 54 63 6c kenPtr;. Tcl
0f40: 5f 50 61 72 73 65 20 6e 65 73 74 65 64 3b 0a 20 _Parse nested;.
0f50: 0a 40 40 20 2d 38 33 31 2c 36 20 2b 38 33 38 2c .@@ -831,6 +838,
0f60: 31 33 20 40 40 0a 20 09 20 20 20 20 74 6f 6b 65 13 @@. . toke
0f70: 6e 50 74 72 2d 3e 73 69 7a 65 20 3d 20 73 72 63 nPtr->size = src
0f80: 20 2d 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 - tokenPtr->sta
0f90: 72 74 3b 0a 20 09 20 20 20 20 70 61 72 73 65 50 rt;. . parseP
0fa0: 74 72 2d 3e 6e 75 6d 54 6f 6b 65 6e 73 2b 2b 3b tr->numTokens++;
0fb0: 0a 20 09 7d 20 65 6c 73 65 20 69 66 20 28 2a 73 . .} else if (*s
0fc0: 72 63 20 3d 3d 20 27 24 27 29 20 7b 0a 2b 09 20 rc == '$') {.+.
0fd0: 20 20 20 69 66 20 28 6e 6f 53 75 62 73 74 56 61 if (noSubstVa
0fe0: 72 73 29 20 7b 0a 2b 09 09 74 6f 6b 65 6e 50 74 rs) {.+..tokenPt
0ff0: 72 2d 3e 74 79 70 65 20 3d 20 54 43 4c 5f 54 4f r->type = TCL_TO
1000: 4b 45 4e 5f 54 45 58 54 3b 0a 2b 09 09 74 6f 6b KEN_TEXT;.+..tok
1010: 65 6e 50 74 72 2d 3e 73 69 7a 65 20 3d 20 31 3b enPtr->size = 1;
1020: 0a 2b 09 09 70 61 72 73 65 50 74 72 2d 3e 6e 75 .+..parsePtr->nu
1030: 6d 54 6f 6b 65 6e 73 2b 2b 3b 0a 2b 09 09 73 72 mTokens++;.+..sr
1040: 63 2b 2b 3b 20 6e 75 6d 42 79 74 65 73 2d 2d 3b c++; numBytes--;
1050: 0a 2b 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 2b 09 .+..continue;.+.
1060: 20 20 20 20 7d 0a 20 09 20 20 20 20 2f 2a 0a 20 }. . /*.
1070: 09 20 20 20 20 20 2a 20 54 68 69 73 20 69 73 20 . * This is
1080: 61 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 a variable refer
1090: 65 6e 63 65 2e 20 20 43 61 6c 6c 20 54 63 6c 5f ence. Call Tcl_
10a0: 50 61 72 73 65 56 61 72 4e 61 6d 65 20 74 6f 20 ParseVarName to
10b0: 64 6f 0a 20 09 20 20 20 20 20 2a 20 61 6c 6c 20 do. . * all
10c0: 74 68 65 20 64 69 72 74 79 20 77 6f 72 6b 20 6f the dirty work o
10d0: 66 20 70 61 72 73 69 6e 67 20 74 68 65 20 6e 61 f parsing the na
10e0: 6d 65 2e 0a 40 40 20 2d 38 34 34 2c 36 20 2b 38 me..@@ -844,6 +8
10f0: 35 38 2c 31 33 20 40 40 0a 20 09 20 20 20 20 73 58,13 @@. . s
1100: 72 63 20 2b 3d 20 70 61 72 73 65 50 74 72 2d 3e rc += parsePtr->
1110: 74 6f 6b 65 6e 50 74 72 5b 76 61 72 54 6f 6b 65 tokenPtr[varToke
1120: 6e 5d 2e 73 69 7a 65 3b 0a 20 09 20 20 20 20 6e n].size;. . n
1130: 75 6d 42 79 74 65 73 20 2d 3d 20 70 61 72 73 65 umBytes -= parse
1140: 50 74 72 2d 3e 74 6f 6b 65 6e 50 74 72 5b 76 61 Ptr->tokenPtr[va
1150: 72 54 6f 6b 65 6e 5d 2e 73 69 7a 65 3b 0a 20 09 rToken].size;. .
1160: 7d 20 65 6c 73 65 20 69 66 20 28 2a 73 72 63 20 } else if (*src
1170: 3d 3d 20 27 5b 27 29 20 7b 0a 2b 09 20 20 20 20 == '[') {.+.
1180: 69 66 20 28 6e 6f 53 75 62 73 74 43 6d 64 73 29 if (noSubstCmds)
1190: 20 7b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e {.+..tokenPtr->
11a0: 74 79 70 65 20 3d 20 54 43 4c 5f 54 4f 4b 45 4e type = TCL_TOKEN
11b0: 5f 54 45 58 54 3b 0a 2b 09 09 74 6f 6b 65 6e 50 _TEXT;.+..tokenP
11c0: 74 72 2d 3e 73 69 7a 65 20 3d 20 31 3b 0a 2b 09 tr->size = 1;.+.
11d0: 09 70 61 72 73 65 50 74 72 2d 3e 6e 75 6d 54 6f .parsePtr->numTo
11e0: 6b 65 6e 73 2b 2b 3b 0a 2b 09 09 73 72 63 2b 2b kens++;.+..src++
11f0: 3b 20 6e 75 6d 42 79 74 65 73 2d 2d 3b 0a 2b 09 ; numBytes--;.+.
1200: 09 63 6f 6e 74 69 6e 75 65 3b 0a 2b 09 20 20 20 .continue;.+.
1210: 20 7d 0a 20 09 20 20 20 20 2f 2a 0a 20 09 20 20 }. . /*. .
1220: 20 20 20 2a 20 43 6f 6d 6d 61 6e 64 20 73 75 62 * Command sub
1230: 73 74 69 74 75 74 69 6f 6e 2e 20 20 43 61 6c 6c stitution. Call
1240: 20 54 63 6c 5f 50 61 72 73 65 43 6f 6d 6d 61 6e Tcl_ParseComman
1250: 64 20 72 65 63 75 72 73 69 76 65 6c 79 0a 20 09 d recursively. .
1260: 20 20 20 20 20 2a 20 28 61 6e 64 20 72 65 70 65 * (and repe
1270: 61 74 65 64 6c 79 29 20 74 6f 20 70 61 72 73 65 atedly) to parse
1280: 20 74 68 65 20 6e 65 73 74 65 64 20 63 6f 6d 6d the nested comm
1290: 61 6e 64 28 73 29 2c 20 74 68 65 6e 0a 40 40 20 and(s), then.@@
12a0: 2d 38 39 36 2c 36 20 2b 39 31 37 2c 31 33 20 40 -896,6 +917,13 @
12b0: 40 0a 20 09 20 20 20 20 74 6f 6b 65 6e 50 74 72 @. . tokenPtr
12c0: 2d 3e 73 69 7a 65 20 3d 20 73 72 63 20 2d 20 74 ->size = src - t
12d0: 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 3b 0a okenPtr->start;.
12e0: 20 09 20 20 20 20 70 61 72 73 65 50 74 72 2d 3e . parsePtr->
12f0: 6e 75 6d 54 6f 6b 65 6e 73 2b 2b 3b 0a 20 09 7d numTokens++;. .}
1300: 20 65 6c 73 65 20 69 66 20 28 2a 73 72 63 20 3d else if (*src =
1310: 3d 20 27 5c 5c 27 29 20 7b 0a 2b 09 20 20 20 20 = '\\') {.+.
1320: 69 66 20 28 6e 6f 53 75 62 73 74 42 53 29 20 7b if (noSubstBS) {
1330: 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 .+..tokenPtr->ty
1340: 70 65 20 3d 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 pe = TCL_TOKEN_T
1350: 45 58 54 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 EXT;.+..tokenPtr
1360: 2d 3e 73 69 7a 65 20 3d 20 31 3b 0a 2b 09 09 70 ->size = 1;.+..p
1370: 61 72 73 65 50 74 72 2d 3e 6e 75 6d 54 6f 6b 65 arsePtr->numToke
1380: 6e 73 2b 2b 3b 0a 2b 09 09 73 72 63 2b 2b 3b 20 ns++;.+..src++;
1390: 6e 75 6d 42 79 74 65 73 2d 2d 3b 0a 2b 09 09 63 numBytes--;.+..c
13a0: 6f 6e 74 69 6e 75 65 3b 0a 2b 09 20 20 20 20 7d ontinue;.+. }
13b0: 0a 20 09 20 20 20 20 2f 2a 0a 20 09 20 20 20 20 . . /*. .
13c0: 20 2a 20 42 61 63 6b 73 6c 61 73 68 20 73 75 62 * Backslash sub
13d0: 73 74 69 74 75 74 69 6f 6e 2e 0a 20 09 20 20 20 stitution.. .
13e0: 20 20 2a 2f 0a 40 40 20 2d 31 32 31 30 2c 38 20 */.@@ -1210,8
13f0: 2b 31 32 33 38 2c 38 20 40 40 0a 20 09 20 20 20 +1238,8 @@. .
1400: 20 20 2a 20 73 69 6e 63 65 20 69 74 20 63 6f 75 * since it cou
1410: 6c 64 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 6e ld contain any n
1420: 75 6d 62 65 72 20 6f 66 20 73 75 62 73 74 69 74 umber of substit
1430: 75 74 69 6f 6e 73 2e 0a 20 09 20 20 20 20 20 2a utions.. . *
1440: 2f 0a 20 0a 2d 09 20 20 20 20 69 66 20 28 50 61 /. .-. if (Pa
1450: 72 73 65 54 6f 6b 65 6e 73 28 73 72 63 2b 31 2c rseTokens(src+1,
1460: 20 6e 75 6d 42 79 74 65 73 2d 31 2c 20 54 59 50 numBytes-1, TYP
1470: 45 5f 43 4c 4f 53 45 5f 50 41 52 45 4e 2c 20 70 E_CLOSE_PAREN, p
1480: 61 72 73 65 50 74 72 29 0a 2d 09 09 20 20 20 20 arsePtr).-..
1490: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 20 != TCL_OK) {.+.
14a0: 20 20 20 69 66 20 28 54 43 4c 5f 4f 4b 20 21 3d if (TCL_OK !=
14b0: 20 50 61 72 73 65 54 6f 6b 65 6e 73 28 73 72 63 ParseTokens(src
14c0: 2b 31 2c 20 6e 75 6d 42 79 74 65 73 2d 31 2c 20 +1, numBytes-1,
14d0: 54 59 50 45 5f 43 4c 4f 53 45 5f 50 41 52 45 4e TYPE_CLOSE_PAREN
14e0: 2c 0a 2b 09 09 20 20 20 20 54 43 4c 5f 53 55 42 ,.+.. TCL_SUB
14f0: 53 54 5f 41 4c 4c 2c 20 70 61 72 73 65 50 74 72 ST_ALL, parsePtr
1500: 29 29 20 7b 0a 20 09 09 67 6f 74 6f 20 65 72 72 )) {. ..goto err
1510: 6f 72 3b 0a 20 09 20 20 20 20 7d 0a 20 09 20 20 or;. . }. .
1520: 20 20 69 66 20 28 28 70 61 72 73 65 50 74 72 2d if ((parsePtr-
1530: 3e 74 65 72 6d 20 3d 3d 20 28 73 72 63 20 2b 20 >term == (src +
1540: 6e 75 6d 42 79 74 65 73 29 29 20 0a 40 40 20 2d numBytes)) .@@ -
1550: 31 33 30 32 2c 37 20 2b 31 33 33 30 2c 37 20 40 1302,7 +1330,7 @
1560: 40 0a 20 09 72 65 74 75 72 6e 20 22 24 22 3b 0a @. .return "$";.
1570: 20 20 20 20 20 7d 0a 20 0a 2d 20 20 20 20 63 6f }. .- co
1580: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 54 6f 6b de = Tcl_EvalTok
1590: 65 6e 73 53 74 61 6e 64 61 72 64 28 69 6e 74 65 ensStandard(inte
15a0: 72 70 2c 20 70 61 72 73 65 2e 74 6f 6b 65 6e 50 rp, parse.tokenP
15b0: 74 72 2c 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b tr, parse.numTok
15c0: 65 6e 73 29 3b 0a 2b 20 20 20 20 63 6f 64 65 20 ens);.+ code
15d0: 3d 20 54 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 = TclSubstTokens
15e0: 28 69 6e 74 65 72 70 2c 20 70 61 72 73 65 2e 74 (interp, parse.t
15f0: 6f 6b 65 6e 50 74 72 2c 20 70 61 72 73 65 2e 6e okenPtr, parse.n
1600: 75 6d 54 6f 6b 65 6e 73 2c 20 4e 55 4c 4c 29 3b umTokens, NULL);
1610: 0a 20 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 . if (code !
1620: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 20 09 72 65 = TCL_OK) {. .re
1630: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 turn NULL;.
1640: 7d 0a 40 40 20 2d 31 36 30 36 2c 37 20 2b 31 36 }.@@ -1606,7 +16
1650: 33 34 2c 38 20 40 40 0a 20 09 70 61 72 73 65 50 34,8 @@. .parseP
1660: 74 72 2d 3e 65 72 72 6f 72 54 79 70 65 20 3d 20 tr->errorType =
1670: 54 43 4c 5f 50 41 52 53 45 5f 53 55 43 43 45 53 TCL_PARSE_SUCCES
1680: 53 3b 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 0a S;. }. .
1690: 2d 20 20 20 20 69 66 20 28 50 61 72 73 65 54 6f - if (ParseTo
16a0: 6b 65 6e 73 28 73 74 72 69 6e 67 2b 31 2c 20 6e kens(string+1, n
16b0: 75 6d 42 79 74 65 73 2d 31 2c 20 54 59 50 45 5f umBytes-1, TYPE_
16c0: 51 55 4f 54 45 2c 20 70 61 72 73 65 50 74 72 29 QUOTE, parsePtr)
16d0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 20 != TCL_OK) {.+
16e0: 20 20 20 69 66 20 28 54 43 4c 5f 4f 4b 20 21 3d if (TCL_OK !=
16f0: 20 50 61 72 73 65 54 6f 6b 65 6e 73 28 73 74 72 ParseTokens(str
1700: 69 6e 67 2b 31 2c 20 6e 75 6d 42 79 74 65 73 2d ing+1, numBytes-
1710: 31 2c 20 54 59 50 45 5f 51 55 4f 54 45 2c 0a 2b 1, TYPE_QUOTE,.+
1720: 09 20 20 20 20 54 43 4c 5f 53 55 42 53 54 5f 41 . TCL_SUBST_A
1730: 4c 4c 2c 20 70 61 72 73 65 50 74 72 29 29 20 7b LL, parsePtr)) {
1740: 0a 20 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 . .goto error;.
1750: 20 20 20 20 7d 0a 20 20 20 20 20 69 66 20 28 2a }. if (*
1760: 70 61 72 73 65 50 74 72 2d 3e 74 65 72 6d 20 21 parsePtr->term !
1770: 3d 20 27 22 27 29 20 7b 0a 40 40 20 2d 31 36 32 = '"') {.@@ -162
1780: 38 2c 36 20 2b 31 36 35 37 2c 34 31 39 20 40 40 8,6 +1657,419 @@
1790: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c . return TCL
17a0: 5f 45 52 52 4f 52 3b 0a 20 7d 0a 20 0a 2b 2f 2a _ERROR;. }. .+/*
17b0: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .+ *------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 2b ----------.+ *.+
1800: 20 2a 20 54 63 6c 5f 53 75 62 73 74 4f 62 6a 20 * Tcl_SubstObj
1810: 2d 2d 0a 2b 20 2a 0a 2b 20 2a 20 20 20 20 20 20 --.+ *.+ *
1820: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 This function pe
1830: 72 66 6f 72 6d 73 20 74 68 65 20 73 75 62 73 74 rforms the subst
1840: 69 74 75 74 69 6f 6e 73 20 73 70 65 63 69 66 69 itutions specifi
1850: 65 64 20 6f 6e 20 74 68 65 0a 2b 20 2a 20 20 20 ed on the.+ *
1860: 20 20 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 given string
1870: 61 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 as described in
1880: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
1890: 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2b tation for the.+
18a0: 20 2a 20 20 20 20 20 20 22 73 75 62 73 74 22 20 * "subst"
18b0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 20 20 Tcl command.
18c0: 20 20 20 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 .+ *.+ * Resu
18d0: 6c 74 73 3a 0a 2b 20 2a 20 20 20 20 20 20 41 20 lts:.+ * A
18e0: 54 63 6c 5f 4f 62 6a 2a 20 63 6f 6e 74 61 69 6e Tcl_Obj* contain
18f0: 69 6e 67 20 74 68 65 20 73 75 62 73 74 69 74 75 ing the substitu
1900: 74 65 64 20 73 74 72 69 6e 67 2c 20 6f 72 20 4e ted string, or N
1910: 55 4c 4c 20 74 6f 0a 2b 20 2a 20 20 20 20 20 20 ULL to.+ *
1920: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6e indicate that an
1930: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e error occurred.
1940: 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 .+ *.+ * Side ef
1950: 66 65 63 74 73 3a 0a 2b 20 2a 20 20 20 20 20 20 fects:.+ *
1960: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 See the user doc
1970: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2b 20 2a 0a umentation..+ *.
1980: 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d + *-------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a 2b ---------.+ */.+
19d0: 0a 2b 54 63 6c 5f 4f 62 6a 20 2a 0a 2b 54 63 6c .+Tcl_Obj *.+Tcl
19e0: 5f 53 75 62 73 74 4f 62 6a 28 69 6e 74 65 72 70 _SubstObj(interp
19f0: 2c 20 6f 62 6a 50 74 72 2c 20 66 6c 61 67 73 29 , objPtr, flags)
1a00: 0a 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .+ Tcl_Interp
1a10: 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 49 6e 74 *interp;./* Int
1a20: 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 erpreter in whic
1a30: 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f h substitution o
1a40: 63 63 75 72 73 20 2a 2f 0a 2b 20 20 20 20 54 63 ccurs */.+ Tc
1a50: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 09 2f l_Obj *objPtr;./
1a60: 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20 62 * The value to b
1a70: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f e substituted */
1a80: 0a 2b 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b .+ int flags;
1a90: 09 09 2f 2a 20 57 68 61 74 20 73 75 62 73 74 69 ../* What substi
1aa0: 74 75 74 69 6f 6e 73 20 74 6f 20 64 6f 20 2a 2f tutions to do */
1ab0: 0a 2b 7b 0a 2b 20 20 20 20 69 6e 74 20 6c 65 6e .+{.+ int len
1ac0: 67 74 68 2c 20 74 6f 6b 65 6e 73 4c 65 66 74 2c gth, tokensLeft,
1ad0: 20 63 6f 64 65 3b 0a 2b 20 20 20 20 54 63 6c 5f code;.+ Tcl_
1ae0: 50 61 72 73 65 20 70 61 72 73 65 3b 0a 2b 20 20 Parse parse;.+
1af0: 20 20 54 63 6c 5f 54 6f 6b 65 6e 20 2a 65 6e 64 Tcl_Token *end
1b00: 54 6f 6b 65 6e 50 74 72 3b 0a 2b 20 20 20 20 54 TokenPtr;.+ T
1b10: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 3b 0a cl_Obj *result;.
1b20: 2b 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 65 72 + Tcl_Obj *er
1b30: 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 20 rMsg = NULL;.+
1b40: 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 70 20 CONST char *p
1b50: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
1b60: 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 26 romObj(objPtr, &
1b70: 6c 65 6e 67 74 68 29 3b 0a 2b 0a 2b 20 20 20 20 length);.+.+
1b80: 70 61 72 73 65 2e 74 6f 6b 65 6e 50 74 72 20 3d parse.tokenPtr =
1b90: 20 70 61 72 73 65 2e 73 74 61 74 69 63 54 6f 6b parse.staticTok
1ba0: 65 6e 73 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e ens;.+ parse.
1bb0: 6e 75 6d 54 6f 6b 65 6e 73 20 3d 20 30 3b 0a 2b numTokens = 0;.+
1bc0: 20 20 20 20 70 61 72 73 65 2e 74 6f 6b 65 6e 73 parse.tokens
1bd0: 41 76 61 69 6c 61 62 6c 65 20 3d 20 4e 55 4d 5f Available = NUM_
1be0: 53 54 41 54 49 43 5f 54 4f 4b 45 4e 53 3b 0a 2b STATIC_TOKENS;.+
1bf0: 20 20 20 20 70 61 72 73 65 2e 73 74 72 69 6e 67 parse.string
1c00: 20 3d 20 70 3b 0a 2b 20 20 20 20 70 61 72 73 65 = p;.+ parse
1c10: 2e 65 6e 64 20 3d 20 70 20 2b 20 6c 65 6e 67 74 .end = p + lengt
1c20: 68 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e 74 65 h;.+ parse.te
1c30: 72 6d 20 3d 20 70 61 72 73 65 2e 65 6e 64 3b 0a rm = parse.end;.
1c40: 2b 20 20 20 20 70 61 72 73 65 2e 69 6e 74 65 72 + parse.inter
1c50: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 2b 20 20 20 p = interp;.+
1c60: 20 70 61 72 73 65 2e 69 6e 63 6f 6d 70 6c 65 74 parse.incomplet
1c70: 65 20 3d 20 30 3b 0a 2b 20 20 20 20 70 61 72 73 e = 0;.+ pars
1c80: 65 2e 65 72 72 6f 72 54 79 70 65 20 3d 20 54 43 e.errorType = TC
1c90: 4c 5f 50 41 52 53 45 5f 53 55 43 43 45 53 53 3b L_PARSE_SUCCESS;
1ca0: 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 .+.+ /*.+
1cb0: 20 2a 20 46 69 72 73 74 20 70 61 72 73 65 20 74 * First parse t
1cc0: 68 65 20 73 74 72 69 6e 67 20 72 65 70 20 6f 66 he string rep of
1cd0: 20 6f 62 6a 50 74 72 2c 20 61 73 20 69 66 20 69 objPtr, as if i
1ce0: 74 20 77 65 72 65 20 65 6e 63 6c 6f 73 65 64 0a t were enclosed.
1cf0: 2b 20 20 20 20 20 2a 20 61 73 20 61 20 22 2d 71 + * as a "-q
1d00: 75 6f 74 65 64 20 77 6f 72 64 20 69 6e 20 61 20 uoted word in a
1d10: 6e 6f 72 6d 61 6c 20 54 63 6c 20 63 6f 6d 6d 61 normal Tcl comma
1d20: 6e 64 2e 20 20 48 6f 6e 6f 72 20 66 6c 61 67 73 nd. Honor flags
1d30: 20 74 68 61 74 0a 2b 20 20 20 20 20 2a 20 73 65 that.+ * se
1d40: 6c 65 63 74 69 76 65 6c 79 20 69 6e 68 69 62 69 lectively inhibi
1d50: 74 20 74 79 70 65 73 20 6f 66 20 73 75 62 73 74 t types of subst
1d60: 69 74 75 74 69 6f 6e 2e 0a 2b 20 20 20 20 20 2a itution..+ *
1d70: 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28 54 43 4c /.+.+ if (TCL
1d80: 5f 4f 4b 20 21 3d 20 50 61 72 73 65 54 6f 6b 65 _OK != ParseToke
1d90: 6e 73 28 70 2c 20 6c 65 6e 67 74 68 2c 20 2f 2a ns(p, length, /*
1da0: 20 6d 61 73 6b 20 2a 2f 20 30 2c 20 66 6c 61 67 mask */ 0, flag
1db0: 73 2c 20 26 70 61 72 73 65 29 29 20 7b 0a 2b 0a s, &parse)) {.+.
1dc0: 2b 09 2f 2a 0a 2b 09 20 2a 20 54 68 65 72 65 20 +./*.+. * There
1dd0: 77 61 73 20 61 20 70 61 72 73 65 20 65 72 72 6f was a parse erro
1de0: 72 2e 20 20 53 61 76 65 20 74 68 65 20 65 72 72 r. Save the err
1df0: 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 0a 2b or message for.+
1e00: 09 20 2a 20 70 6f 73 73 69 62 6c 65 20 72 65 70 . * possible rep
1e10: 6f 72 74 69 6e 67 20 6c 61 74 65 72 2e 0a 2b 09 orting later..+.
1e20: 20 2a 2f 0a 2b 0a 2b 09 65 72 72 4d 73 67 20 3d */.+.+.errMsg =
1e30: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c Tcl_GetObjResul
1e40: 74 28 69 6e 74 65 72 70 29 3b 0a 2b 09 54 63 6c t(interp);.+.Tcl
1e50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 65 72 _IncrRefCount(er
1e60: 72 4d 73 67 29 3b 0a 2b 0a 2b 09 2f 2a 0a 2b 09 rMsg);.+.+./*.+.
1e70: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 * We need to re
1e80: 2d 70 61 72 73 65 20 74 6f 20 67 65 74 20 74 68 -parse to get th
1e90: 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 e portion of the
1ea0: 20 73 74 72 69 6e 67 20 77 65 20 63 61 6e 0a 2b string we can.+
1eb0: 09 20 2a 20 5b 73 75 62 73 74 5d 20 62 65 66 6f . * [subst] befo
1ec0: 72 65 20 74 68 65 20 70 61 72 73 65 20 65 72 72 re the parse err
1ed0: 6f 72 2e 20 20 53 61 64 6c 79 2c 20 61 6c 6c 20 or. Sadly, all
1ee0: 74 68 65 20 54 63 6c 5f 54 6f 6b 65 6e 27 73 0a the Tcl_Token's.
1ef0: 2b 09 20 2a 20 63 72 65 61 74 65 64 20 62 79 20 +. * created by
1f00: 74 68 65 20 66 69 72 73 74 20 70 61 72 73 65 20 the first parse
1f10: 61 74 74 65 6d 70 74 20 61 72 65 20 67 6f 6e 65 attempt are gone
1f20: 2c 20 66 72 65 65 64 20 61 63 63 6f 72 64 69 6e , freed accordin
1f30: 67 20 74 6f 20 74 68 65 0a 2b 09 20 2a 20 70 75 g to the.+. * pu
1f40: 62 6c 69 63 20 73 70 65 63 20 66 6f 72 20 74 68 blic spec for th
1f50: 65 20 54 63 6c 5f 50 61 72 73 65 2a 20 72 6f 75 e Tcl_Parse* rou
1f60: 74 69 6e 65 73 2e 20 20 54 68 65 20 6f 6e 6c 79 tines. The only
1f70: 20 63 6c 75 65 20 77 65 20 68 61 76 65 0a 2b 09 clue we have.+.
1f80: 20 2a 20 69 73 20 70 61 72 73 65 2e 74 65 72 6d * is parse.term
1f90: 2c 20 77 68 69 63 68 20 70 6f 69 6e 74 73 20 74 , which points t
1fa0: 6f 20 65 69 74 68 65 72 20 74 68 65 20 75 6e 6d o either the unm
1fb0: 61 74 63 68 65 64 20 6f 70 65 6e 65 72 2c 20 6f atched opener, o
1fc0: 72 0a 2b 09 20 2a 20 74 6f 20 63 68 61 72 61 63 r.+. * to charac
1fd0: 74 65 72 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 ters that follow
1fe0: 20 61 20 63 6c 6f 73 65 20 62 72 61 63 65 20 6f a close brace o
1ff0: 72 20 63 6c 6f 73 65 20 71 75 6f 74 65 2e 0a 2b r close quote..+
2000: 09 20 2a 0a 2b 09 20 2a 20 43 61 6c 6c 20 50 61 . *.+. * Call Pa
2010: 72 73 65 54 6f 6b 65 6e 73 20 61 67 61 69 6e 2c rseTokens again,
2020: 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 74 68 65 20 working on the
2030: 73 74 72 69 6e 67 20 75 70 20 74 6f 20 70 61 72 string up to par
2040: 73 65 2e 74 65 72 6d 2e 0a 2b 09 20 2a 20 4b 65 se.term..+. * Ke
2050: 65 70 20 72 65 70 65 61 74 69 6e 67 20 75 6e 74 ep repeating unt
2060: 69 6c 20 77 65 20 67 65 74 20 61 20 67 6f 6f 64 il we get a good
2070: 20 70 61 72 73 65 20 6f 6e 20 61 20 70 72 65 66 parse on a pref
2080: 69 78 2e 0a 2b 09 20 2a 2f 0a 2b 0a 2b 09 64 6f ix..+. */.+.+.do
2090: 20 7b 0a 2b 09 20 20 20 20 70 61 72 73 65 2e 6e {.+. parse.n
20a0: 75 6d 54 6f 6b 65 6e 73 20 3d 20 30 3b 0a 2b 09 umTokens = 0;.+.
20b0: 20 20 20 20 70 61 72 73 65 2e 74 6f 6b 65 6e 73 parse.tokens
20c0: 41 76 61 69 6c 61 62 6c 65 20 3d 20 4e 55 4d 5f Available = NUM_
20d0: 53 54 41 54 49 43 5f 54 4f 4b 45 4e 53 3b 0a 2b STATIC_TOKENS;.+
20e0: 09 20 20 20 20 70 61 72 73 65 2e 65 6e 64 20 3d . parse.end =
20f0: 20 70 61 72 73 65 2e 74 65 72 6d 3b 0a 2b 09 20 parse.term;.+.
2100: 20 20 20 70 61 72 73 65 2e 69 6e 63 6f 6d 70 6c parse.incompl
2110: 65 74 65 20 3d 20 30 3b 0a 2b 09 20 20 20 20 70 ete = 0;.+. p
2120: 61 72 73 65 2e 65 72 72 6f 72 54 79 70 65 20 3d arse.errorType =
2130: 20 54 43 4c 5f 50 41 52 53 45 5f 53 55 43 43 45 TCL_PARSE_SUCCE
2140: 53 53 3b 0a 2b 09 7d 20 77 68 69 6c 65 20 28 54 SS;.+.} while (T
2150: 43 4c 5f 4f 4b 20 21 3d 20 50 61 72 73 65 54 6f CL_OK != ParseTo
2160: 6b 65 6e 73 28 70 2c 20 70 61 72 73 65 2e 65 6e kens(p, parse.en
2170: 64 20 2d 20 70 2c 20 30 2c 20 66 6c 61 67 73 2c d - p, 0, flags,
2180: 20 26 70 61 72 73 65 29 29 3b 0a 2b 0a 2b 09 2f &parse));.+.+./
2190: 2a 20 54 68 65 20 67 6f 6f 64 20 70 61 72 73 65 * The good parse
21a0: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 will have to be
21b0: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7b 2c 20 followed by {,
21c0: 28 2c 20 6f 72 20 5b 2e 20 2a 2f 0a 2b 09 73 77 (, or [. */.+.sw
21d0: 69 74 63 68 20 28 2a 70 61 72 73 65 2e 74 65 72 itch (*parse.ter
21e0: 6d 29 20 7b 0a 2b 09 20 20 20 20 63 61 73 65 20 m) {.+. case
21f0: 27 7b 27 3a 0a 2b 09 09 2f 2a 0a 2b 09 09 20 2a '{':.+../*.+.. *
2200: 20 50 61 72 73 65 20 65 72 72 6f 72 20 77 61 73 Parse error was
2210: 20 61 20 6d 69 73 73 69 6e 67 20 7d 20 69 6e 20 a missing } in
2220: 61 20 24 7b 76 61 72 6e 61 6d 65 7d 20 76 61 72 a ${varname} var
2230: 69 61 62 6c 65 0a 2b 09 09 20 2a 20 73 75 62 73 iable.+.. * subs
2240: 74 69 74 75 74 69 6f 6e 20 61 74 20 74 68 65 20 titution at the
2250: 74 6f 70 6c 65 76 65 6c 2e 20 20 57 65 20 77 69 toplevel. We wi
2260: 6c 6c 20 73 75 62 73 74 20 65 76 65 72 79 74 68 ll subst everyth
2270: 69 6e 67 0a 2b 09 09 20 2a 20 75 70 20 74 6f 20 ing.+.. * up to
2280: 74 68 61 74 20 62 72 6f 6b 65 6e 20 76 61 72 69 that broken vari
2290: 61 62 6c 65 20 73 75 62 73 74 69 74 75 74 69 6f able substitutio
22a0: 6e 20 62 65 66 6f 72 65 20 72 65 70 6f 72 74 69 n before reporti
22b0: 6e 67 0a 2b 09 09 20 2a 20 74 68 65 20 70 61 72 ng.+.. * the par
22c0: 73 65 20 65 72 72 6f 72 2e 20 20 53 75 62 73 74 se error. Subst
22d0: 69 74 75 74 69 6e 67 20 74 68 65 20 6c 65 66 74 ituting the left
22e0: 6f 76 65 72 20 27 24 27 20 77 69 6c 6c 0a 2b 09 over '$' will.+.
22f0: 09 20 2a 20 68 61 76 65 20 6e 6f 20 73 69 64 65 . * have no side
2300: 2d 65 66 66 65 63 74 73 2c 20 73 6f 20 74 68 65 -effects, so the
2310: 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 current token s
2320: 74 72 65 61 6d 20 69 73 20 66 69 6e 65 2e 0a 2b tream is fine..+
2330: 09 09 20 2a 2f 0a 2b 09 09 62 72 65 61 6b 3b 0a .. */.+..break;.
2340: 2b 09 20 20 20 20 63 61 73 65 20 27 28 27 3a 0a +. case '(':.
2350: 2b 09 09 2f 2a 0a 2b 09 09 20 2a 20 50 61 72 73 +../*.+.. * Pars
2360: 65 20 65 72 72 6f 72 20 77 61 73 20 64 75 72 69 e error was duri
2370: 6e 67 20 74 68 65 20 70 61 72 73 69 6e 67 20 6f ng the parsing o
2380: 66 20 74 68 65 20 69 6e 64 65 78 20 70 61 72 74 f the index part
2390: 20 6f 66 0a 2b 09 09 20 2a 20 61 6e 20 61 72 72 of.+.. * an arr
23a0: 61 79 20 76 61 72 69 61 62 6c 65 20 73 75 62 73 ay variable subs
23b0: 74 69 74 75 74 69 6f 6e 20 61 74 20 74 68 65 20 titution at the
23c0: 74 6f 70 6c 65 76 65 6c 2e 20 20 0a 2b 09 09 20 toplevel. .+..
23d0: 2a 2f 0a 2b 09 09 69 66 20 28 2a 28 70 61 72 73 */.+..if (*(pars
23e0: 65 2e 74 65 72 6d 20 2d 20 31 29 20 3d 3d 20 27 e.term - 1) == '
23f0: 24 27 29 20 7b 0a 2b 09 09 20 20 20 20 2f 2a 0a $') {.+.. /*.
2400: 2b 09 09 20 20 20 20 20 2a 20 53 70 65 63 69 61 +.. * Specia
2410: 6c 20 63 61 73 65 20 77 68 65 72 65 20 72 65 6d l case where rem
2420: 6f 76 69 6e 67 20 74 68 65 20 61 72 72 61 79 20 oving the array
2430: 69 6e 64 65 78 20 6c 65 66 74 0a 2b 09 09 20 20 index left.+..
2440: 20 20 20 2a 20 75 73 20 77 69 74 68 20 6a 75 73 * us with jus
2450: 74 20 61 20 64 6f 6c 6c 61 72 20 73 69 67 6e 20 t a dollar sign
2460: 28 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 (array variable
2470: 77 69 74 68 0a 2b 09 09 20 20 20 20 20 2a 20 6e with.+.. * n
2480: 61 6d 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 ame the empty st
2490: 72 69 6e 67 20 61 73 20 69 74 73 20 6e 61 6d 65 ring as its name
24a0: 29 2c 20 69 6e 73 74 65 61 64 20 6f 66 0a 2b 09 ), instead of.+.
24b0: 09 20 20 20 20 20 2a 20 77 69 74 68 20 61 20 73 . * with a s
24c0: 63 61 6c 61 72 20 76 61 72 69 61 62 6c 65 20 72 calar variable r
24d0: 65 66 65 72 65 6e 63 65 2e 20 20 0a 2b 09 09 20 eference. .+..
24e0: 20 20 20 20 2a 0a 2b 09 09 20 20 20 20 20 2a 20 *.+.. *
24f0: 41 73 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f As in the previo
2500: 75 73 20 63 61 73 65 2c 20 65 78 69 73 74 69 6e us case, existin
2510: 67 20 74 6f 6b 65 6e 20 73 74 72 65 61 6d 20 69 g token stream i
2520: 73 20 4f 4b 2e 0a 2b 09 09 20 20 20 20 20 2a 2f s OK..+.. */
2530: 0a 2b 09 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 09 .+..} else {.+..
2540: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e /* The curren
2550: 74 20 70 61 72 73 65 20 69 6e 63 6c 75 64 65 73 t parse includes
2560: 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 70 61 a successful pa
2570: 72 73 65 20 6f 66 20 61 0a 2b 09 09 20 20 20 20 rse of a.+..
2580: 2a 20 73 63 61 6c 61 72 20 76 61 72 69 61 62 6c * scalar variabl
2590: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 77 e substitution w
25a0: 68 65 72 65 20 74 68 65 72 65 20 73 68 6f 75 6c here there shoul
25b0: 64 20 68 61 76 65 0a 2b 09 09 20 20 20 20 2a 20 d have.+.. *
25c0: 62 65 65 6e 20 61 6e 20 61 72 72 61 79 20 76 61 been an array va
25d0: 72 69 61 62 6c 65 20 73 75 62 73 74 69 74 75 74 riable substitut
25e0: 69 6f 6e 2e 20 20 57 65 20 72 65 6d 6f 76 65 20 ion. We remove
25f0: 74 68 61 74 0a 2b 09 09 20 20 20 20 2a 20 6d 69 that.+.. * mi
2600: 73 74 61 6b 65 6e 20 70 61 72 74 20 6f 66 20 74 staken part of t
2610: 68 65 20 70 61 72 73 65 20 62 65 66 6f 72 65 20 he parse before
2620: 6d 6f 76 69 6e 67 20 6f 6e 2e 20 20 41 20 73 63 moving on. A sc
2630: 61 6c 61 72 0a 2b 09 09 20 20 20 20 2a 20 76 61 alar.+.. * va
2640: 72 69 61 62 6c 65 20 73 75 62 73 74 69 74 75 74 riable substitut
2650: 69 6f 6e 20 69 73 20 74 77 6f 20 74 6f 6b 65 6e ion is two token
2660: 73 2e 0a 2b 09 09 20 20 20 20 2a 2f 0a 2b 09 09 s..+.. */.+..
2670: 20 20 20 20 54 63 6c 5f 54 6f 6b 65 6e 20 2a 76 Tcl_Token *v
2680: 61 72 54 6f 6b 65 6e 50 74 72 20 3d 0a 2b 09 09 arTokenPtr =.+..
2690: 09 20 20 20 20 70 61 72 73 65 2e 74 6f 6b 65 6e . parse.token
26a0: 50 74 72 20 2b 20 70 61 72 73 65 2e 6e 75 6d 54 Ptr + parse.numT
26b0: 6f 6b 65 6e 73 20 2d 20 32 3b 0a 2b 0a 2b 09 09 okens - 2;.+.+..
26c0: 20 20 20 20 69 66 20 28 76 61 72 54 6f 6b 65 6e if (varToken
26d0: 50 74 72 2d 3e 74 79 70 65 20 21 3d 20 54 43 4c Ptr->type != TCL
26e0: 5f 54 4f 4b 45 4e 5f 56 41 52 49 41 42 4c 45 29 _TOKEN_VARIABLE)
26f0: 20 7b 0a 2b 09 09 09 54 63 6c 5f 50 61 6e 69 63 {.+...Tcl_Panic
2700: 28 22 54 63 6c 5f 53 75 62 73 74 4f 62 6a 3a 20 ("Tcl_SubstObj:
2710: 70 72 6f 67 72 61 6d 6d 69 6e 67 20 65 72 72 6f programming erro
2720: 72 22 29 3b 0a 2b 09 09 20 20 20 20 7d 0a 2b 09 r");.+.. }.+.
2730: 09 20 20 20 20 69 66 20 28 76 61 72 54 6f 6b 65 . if (varToke
2740: 6e 50 74 72 5b 31 5d 2e 74 79 70 65 20 21 3d 20 nPtr[1].type !=
2750: 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 58 54 29 20 TCL_TOKEN_TEXT)
2760: 7b 0a 2b 09 09 09 54 63 6c 5f 50 61 6e 69 63 28 {.+...Tcl_Panic(
2770: 22 54 63 6c 5f 53 75 62 73 74 4f 62 6a 3a 20 70 "Tcl_SubstObj: p
2780: 72 6f 67 72 61 6d 6d 69 6e 67 20 65 72 72 6f 72 rogramming error
2790: 22 29 3b 0a 2b 09 09 20 20 20 20 7d 0a 2b 09 09 ");.+.. }.+..
27a0: 20 20 20 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b parse.numTok
27b0: 65 6e 73 20 2d 3d 20 32 3b 0a 2b 09 09 7d 0a 2b ens -= 2;.+..}.+
27c0: 09 09 62 72 65 61 6b 3b 0a 2b 09 20 20 20 20 63 ..break;.+. c
27d0: 61 73 65 20 27 5b 27 3a 0a 2b 09 09 2f 2a 0a 2b ase '[':.+../*.+
27e0: 09 09 20 2a 20 50 61 72 73 65 20 65 72 72 6f 72 .. * Parse error
27f0: 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e 67 occurred during
2800: 20 70 61 72 73 69 6e 67 20 6f 66 20 61 20 74 6f parsing of a to
2810: 70 6c 65 76 65 6c 0a 2b 09 09 20 2a 20 63 6f 6d plevel.+.. * com
2820: 6d 61 6e 64 20 73 75 62 73 74 69 74 75 74 69 6f mand substitutio
2830: 6e 2e 20 20 0a 2b 09 09 20 2a 2f 0a 2b 0a 2b 09 n. .+.. */.+.+.
2840: 09 70 61 72 73 65 2e 65 6e 64 20 3d 20 70 20 2b .parse.end = p +
2850: 20 6c 65 6e 67 74 68 3b 0a 2b 09 09 70 20 3d 20 length;.+..p =
2860: 70 61 72 73 65 2e 74 65 72 6d 20 2b 20 31 3b 0a parse.term + 1;.
2870: 2b 09 09 6c 65 6e 67 74 68 20 3d 20 70 61 72 73 +..length = pars
2880: 65 2e 65 6e 64 20 2d 20 70 3b 0a 2b 09 09 69 66 e.end - p;.+..if
2890: 20 28 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b (length == 0) {
28a0: 0a 2b 09 09 20 20 20 20 2f 2a 0a 2b 09 09 20 20 .+.. /*.+..
28b0: 20 20 20 2a 20 4e 6f 20 63 6f 6d 6d 61 6e 64 73 * No commands
28c0: 2c 20 6a 75 73 74 20 61 6e 20 75 6e 6d 61 74 63 , just an unmatc
28d0: 68 65 64 20 5b 2e 20 20 0a 2b 09 09 20 20 20 20 hed [. .+..
28e0: 20 2a 20 41 73 20 69 6e 20 70 72 65 76 69 6f 75 * As in previou
28f0: 73 20 63 61 73 65 73 2c 20 65 78 69 73 74 69 6e s cases, existin
2900: 67 20 74 6f 6b 65 6e 20 73 74 72 65 61 6d 20 69 g token stream i
2910: 73 20 4f 4b 2e 0a 2b 09 09 20 20 20 20 20 2a 2f s OK..+.. */
2920: 0a 2b 09 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 09 .+..} else {.+..
2930: 20 20 20 20 2f 2a 20 0a 2b 09 09 20 20 20 20 20 /* .+..
2940: 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 61 64 64 * We want to add
2950: 20 74 68 65 20 70 61 72 73 69 6e 67 20 6f 66 20 the parsing of
2960: 61 73 20 6d 61 6e 79 20 63 6f 6d 6d 61 6e 64 73 as many commands
2970: 20 61 73 20 77 65 0a 2b 09 09 20 20 20 20 20 2a as we.+.. *
2980: 20 63 61 6e 20 77 69 74 68 69 6e 20 74 68 61 74 can within that
2990: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 75 6e substitution un
29a0: 74 69 6c 20 77 65 20 72 65 61 63 68 20 74 68 65 til we reach the
29b0: 0a 2b 09 09 20 20 20 20 20 2a 20 61 63 74 75 61 .+.. * actua
29c0: 6c 20 70 61 72 73 65 20 65 72 72 6f 72 2e 20 20 l parse error.
29d0: 57 65 27 6c 6c 20 64 6f 20 61 64 64 69 74 69 6f We'll do additio
29e0: 6e 61 6c 20 70 61 72 73 69 6e 67 20 74 6f 0a 2b nal parsing to.+
29f0: 09 09 20 20 20 20 20 2a 20 64 65 74 65 72 6d 69 .. * determi
2a00: 6e 65 20 77 68 61 74 20 6c 65 6e 67 74 68 20 74 ne what length t
2a10: 6f 20 63 6c 61 69 6d 20 66 6f 72 20 74 68 65 20 o claim for the
2a20: 66 69 6e 61 6c 0a 2b 09 09 20 20 20 20 20 2a 20 final.+.. *
2a30: 54 43 4c 5f 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 4e TCL_TOKEN_COMMAN
2a40: 44 20 74 6f 6b 65 6e 2e 0a 2b 09 09 20 20 20 20 D token..+..
2a50: 20 2a 2f 0a 2b 09 09 20 20 20 20 54 63 6c 5f 54 */.+.. Tcl_T
2a60: 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 3b 0a oken *tokenPtr;.
2a70: 2b 09 09 20 20 20 20 54 63 6c 5f 50 61 72 73 65 +.. Tcl_Parse
2a80: 20 6e 65 73 74 65 64 3b 0a 2b 09 09 20 20 20 20 nested;.+..
2a90: 43 4f 4e 53 54 20 63 68 61 72 20 2a 6c 61 73 74 CONST char *last
2aa0: 54 65 72 6d 20 3d 20 70 61 72 73 65 2e 74 65 72 Term = parse.ter
2ab0: 6d 3b 0a 2b 0a 2b 09 09 20 20 20 20 77 68 69 6c m;.+.+.. whil
2ac0: 65 20 28 54 43 4c 5f 4f 4b 20 3d 3d 20 0a 2b 09 e (TCL_OK == .+.
2ad0: 09 09 20 20 20 20 54 63 6c 5f 50 61 72 73 65 43 .. Tcl_ParseC
2ae0: 6f 6d 6d 61 6e 64 28 4e 55 4c 4c 2c 20 70 2c 20 ommand(NULL, p,
2af0: 6c 65 6e 67 74 68 2c 20 30 2c 20 26 6e 65 73 74 length, 0, &nest
2b00: 65 64 29 29 20 7b 0a 2b 09 09 09 54 63 6c 5f 46 ed)) {.+...Tcl_F
2b10: 72 65 65 50 61 72 73 65 28 26 6e 65 73 74 65 64 reeParse(&nested
2b20: 29 3b 0a 2b 09 09 09 70 20 3d 20 6e 65 73 74 65 );.+...p = neste
2b30: 64 2e 74 65 72 6d 20 2b 20 28 6e 65 73 74 65 64 d.term + (nested
2b40: 2e 74 65 72 6d 20 3c 20 6e 65 73 74 65 64 2e 65 .term < nested.e
2b50: 6e 64 29 3b 0a 2b 09 09 09 6c 65 6e 67 74 68 20 nd);.+...length
2b60: 3d 20 6e 65 73 74 65 64 2e 65 6e 64 20 2d 20 70 = nested.end - p
2b70: 3b 0a 2b 09 09 09 69 66 20 28 6c 65 6e 67 74 68 ;.+...if (length
2b80: 20 3d 3d 20 30 29 20 7b 0a 2b 09 09 09 20 20 20 == 0) {.+...
2b90: 20 2f 2a 0a 2b 09 09 09 20 20 20 20 20 2a 20 49 /*.+... * I
2ba0: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 f we run out of
2bb0: 73 74 72 69 6e 67 2c 20 62 6c 61 6d 65 20 74 68 string, blame th
2bc0: 65 20 6d 69 73 73 69 6e 67 0a 2b 09 09 09 20 20 e missing.+...
2bd0: 20 20 20 2a 20 63 6c 6f 73 65 20 62 72 61 63 6b * close brack
2be0: 65 74 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 63 et on the last c
2bf0: 6f 6d 6d 61 6e 64 2c 20 61 6e 64 20 64 6f 0a 2b ommand, and do.+
2c00: 09 09 09 20 20 20 20 20 2a 20 6e 6f 74 20 65 76 ... * not ev
2c10: 61 6c 75 61 74 65 20 69 74 20 64 75 72 69 6e 67 aluate it during
2c20: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 2e 0a 2b substitution..+
2c30: 09 09 09 20 20 20 20 20 2a 2f 0a 2b 09 09 09 20 ... */.+...
2c40: 20 20 20 62 72 65 61 6b 3b 0a 2b 09 09 09 7d 0a break;.+...}.
2c50: 2b 09 09 09 6c 61 73 74 54 65 72 6d 20 3d 20 6e +...lastTerm = n
2c60: 65 73 74 65 64 2e 74 65 72 6d 3b 0a 2b 09 09 20 ested.term;.+..
2c70: 20 20 20 7d 0a 2b 0a 2b 09 09 20 20 20 20 69 66 }.+.+.. if
2c80: 20 28 6c 61 73 74 54 65 72 6d 20 3d 3d 20 70 61 (lastTerm == pa
2c90: 72 73 65 2e 74 65 72 6d 29 20 7b 0a 2b 09 09 09 rse.term) {.+...
2ca0: 2f 2a 0a 2b 09 09 09 20 2a 20 50 61 72 73 65 20 /*.+... * Parse
2cb0: 65 72 72 6f 72 20 69 6e 20 66 69 72 73 74 20 63 error in first c
2cc0: 6f 6d 6d 61 6e 64 2e 20 20 4e 6f 20 63 6f 6d 6d ommand. No comm
2cd0: 61 6e 64 73 0a 2b 09 09 09 20 2a 20 74 6f 20 73 ands.+... * to s
2ce0: 75 62 73 74 2c 20 61 64 64 20 6e 6f 20 6d 6f 72 ubst, add no mor
2cf0: 65 20 74 6f 6b 65 6e 73 2e 0a 2b 09 09 09 20 2a e tokens..+... *
2d00: 2f 0a 2b 09 09 09 62 72 65 61 6b 3b 0a 2b 09 09 /.+...break;.+..
2d10: 20 20 20 20 7d 0a 2b 0a 2b 09 09 20 20 20 20 2f }.+.+.. /
2d20: 2a 0a 2b 09 09 20 20 20 20 20 2a 20 43 72 65 61 *.+.. * Crea
2d30: 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 73 75 62 te a command sub
2d40: 73 74 69 74 75 74 69 6f 6e 20 74 6f 6b 65 6e 20 stitution token
2d50: 66 6f 72 20 77 68 61 74 65 76 65 72 0a 2b 09 09 for whatever.+..
2d60: 20 20 20 20 20 2a 20 63 6f 6d 6d 61 6e 64 73 20 * commands
2d70: 67 6f 74 20 70 61 72 73 65 64 2e 0a 2b 09 09 20 got parsed..+..
2d80: 20 20 20 20 2a 2f 0a 2b 0a 2b 09 09 20 20 20 20 */.+.+..
2d90: 69 66 20 28 70 61 72 73 65 2e 6e 75 6d 54 6f 6b if (parse.numTok
2da0: 65 6e 73 20 3d 3d 20 70 61 72 73 65 2e 74 6f 6b ens == parse.tok
2db0: 65 6e 73 41 76 61 69 6c 61 62 6c 65 29 20 7b 0a ensAvailable) {.
2dc0: 2b 09 09 09 54 63 6c 45 78 70 61 6e 64 54 6f 6b +...TclExpandTok
2dd0: 65 6e 41 72 72 61 79 28 26 70 61 72 73 65 29 3b enArray(&parse);
2de0: 0a 2b 09 09 20 20 20 20 7d 0a 2b 09 09 20 20 20 .+.. }.+..
2df0: 20 74 6f 6b 65 6e 50 74 72 20 3d 20 26 70 61 72 tokenPtr = &par
2e00: 73 65 2e 74 6f 6b 65 6e 50 74 72 5b 70 61 72 73 se.tokenPtr[pars
2e10: 65 2e 6e 75 6d 54 6f 6b 65 6e 73 5d 3b 0a 2b 09 e.numTokens];.+.
2e20: 09 20 20 20 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 . tokenPtr->s
2e30: 74 61 72 74 20 3d 20 70 61 72 73 65 2e 74 65 72 tart = parse.ter
2e40: 6d 3b 0a 2b 09 09 20 20 20 20 74 6f 6b 65 6e 50 m;.+.. tokenP
2e50: 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 tr->numComponent
2e60: 73 20 3d 20 30 3b 0a 2b 09 09 20 20 20 20 74 6f s = 0;.+.. to
2e70: 6b 65 6e 50 74 72 2d 3e 74 79 70 65 20 3d 20 54 kenPtr->type = T
2e80: 43 4c 5f 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 4e 44 CL_TOKEN_COMMAND
2e90: 3b 0a 2b 09 09 20 20 20 20 74 6f 6b 65 6e 50 74 ;.+.. tokenPt
2ea0: 72 2d 3e 73 69 7a 65 20 3d 20 6c 61 73 74 54 65 r->size = lastTe
2eb0: 72 6d 20 2d 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 rm - tokenPtr->s
2ec0: 74 61 72 74 20 2b 20 31 3b 0a 2b 09 09 20 20 20 tart + 1;.+..
2ed0: 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 parse.numTokens
2ee0: 2b 2b 3b 0a 2b 09 09 7d 0a 2b 09 09 62 72 65 61 ++;.+..}.+..brea
2ef0: 6b 3b 0a 2b 0a 2b 09 20 20 20 20 64 65 66 61 75 k;.+.+. defau
2f00: 6c 74 3a 0a 2b 09 09 54 63 6c 5f 50 61 6e 69 63 lt:.+..Tcl_Panic
2f10: 28 22 62 61 64 20 70 61 72 73 65 20 69 6e 20 54 ("bad parse in T
2f20: 63 6c 5f 53 75 62 73 74 4f 62 6a 3a 20 25 63 22 cl_SubstObj: %c"
2f30: 2c 20 70 5b 6c 65 6e 67 74 68 5d 29 3b 0a 2b 09 , p[length]);.+.
2f40: 7d 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 }.+ }.+.+
2f50: 2f 2a 20 4e 65 78 74 2c 20 73 75 62 73 74 69 74 /* Next, substit
2f60: 75 74 65 20 74 68 65 20 70 61 72 73 65 64 20 74 ute the parsed t
2f70: 6f 6b 65 6e 73 20 6a 75 73 74 20 61 73 20 69 6e okens just as in
2f80: 20 6e 6f 72 6d 61 6c 20 54 63 6c 20 65 76 61 6c normal Tcl eval
2f90: 75 61 74 69 6f 6e 20 2a 2f 0a 2b 20 20 20 20 65 uation */.+ e
2fa0: 6e 64 54 6f 6b 65 6e 50 74 72 20 3d 20 70 61 72 ndTokenPtr = par
2fb0: 73 65 2e 74 6f 6b 65 6e 50 74 72 20 2b 20 70 61 se.tokenPtr + pa
2fc0: 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 3b 0a 2b rse.numTokens;.+
2fd0: 20 20 20 20 74 6f 6b 65 6e 73 4c 65 66 74 20 3d tokensLeft =
2fe0: 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 parse.numTokens
2ff0: 3b 0a 2b 20 20 20 20 63 6f 64 65 20 3d 20 54 63 ;.+ code = Tc
3000: 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 lSubstTokens(int
3010: 65 72 70 2c 20 65 6e 64 54 6f 6b 65 6e 50 74 72 erp, endTokenPtr
3020: 20 2d 20 74 6f 6b 65 6e 73 4c 65 66 74 2c 20 74 - tokensLeft, t
3030: 6f 6b 65 6e 73 4c 65 66 74 2c 0a 2b 09 20 20 20 okensLeft,.+.
3040: 20 26 74 6f 6b 65 6e 73 4c 65 66 74 29 3b 0a 2b &tokensLeft);.+
3050: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
3060: 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 54 63 6c 5f TCL_OK) {.+.Tcl_
3070: 46 72 65 65 50 61 72 73 65 28 26 70 61 72 73 65 FreeParse(&parse
3080: 29 3b 0a 2b 09 69 66 20 28 65 72 72 4d 73 67 20 );.+.if (errMsg
3090: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20 != NULL) {.+.
30a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
30b0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 4d 73 67 t(interp, errMsg
30c0: 29 3b 0a 2b 09 20 20 20 20 54 63 6c 5f 44 65 63 );.+. Tcl_Dec
30d0: 72 52 65 66 43 6f 75 6e 74 28 65 72 72 4d 73 67 rRefCount(errMsg
30e0: 29 3b 0a 2b 09 20 20 20 20 72 65 74 75 72 6e 20 );.+. return
30f0: 4e 55 4c 4c 3b 0a 2b 09 7d 0a 2b 09 72 65 74 75 NULL;.+.}.+.retu
3100: 72 6e 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 rn Tcl_GetObjRes
3110: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 2b 20 20 ult(interp);.+
3120: 20 20 7d 0a 2b 20 20 20 20 72 65 73 75 6c 74 20 }.+ result
3130: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a = Tcl_NewObj();.
3140: 2b 20 20 20 20 77 68 69 6c 65 20 28 31 29 20 7b + while (1) {
3150: 0a 2b 09 73 77 69 74 63 68 20 28 63 6f 64 65 29 .+.switch (code)
3160: 20 7b 0a 2b 09 20 20 20 20 63 61 73 65 20 54 43 {.+. case TC
3170: 4c 5f 45 52 52 4f 52 3a 0a 2b 09 09 54 63 6c 5f L_ERROR:.+..Tcl_
3180: 46 72 65 65 50 61 72 73 65 28 26 70 61 72 73 65 FreeParse(&parse
3190: 29 3b 0a 2b 09 09 54 63 6c 5f 44 65 63 72 52 65 );.+..Tcl_DecrRe
31a0: 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 29 3b 0a fCount(result);.
31b0: 2b 09 09 69 66 20 28 65 72 72 4d 73 67 20 21 3d +..if (errMsg !=
31c0: 20 4e 55 4c 4c 29 20 7b 0a 2b 09 09 20 20 20 20 NULL) {.+..
31d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
31e0: 28 65 72 72 4d 73 67 29 3b 0a 2b 09 09 7d 0a 2b (errMsg);.+..}.+
31f0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 2b ..return NULL;.+
3200: 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f 42 52 . case TCL_BR
3210: 45 41 4b 3a 0a 2b 09 09 74 6f 6b 65 6e 73 4c 65 EAK:.+..tokensLe
3220: 66 74 20 3d 20 30 3b 09 09 2f 2a 20 48 61 6c 74 ft = 0;../* Halt
3230: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f substitution */
3240: 0a 2b 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a .+. default:.
3250: 2b 09 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a +..Tcl_AppendObj
3260: 54 6f 4f 62 6a 28 72 65 73 75 6c 74 2c 20 54 63 ToObj(result, Tc
3270: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3280: 6e 74 65 72 70 29 29 3b 0a 2b 09 7d 0a 2b 0a 2b nterp));.+.}.+.+
3290: 09 69 66 20 28 74 6f 6b 65 6e 73 4c 65 66 74 20 .if (tokensLeft
32a0: 3d 3d 20 30 29 20 7b 0a 2b 09 20 20 20 20 54 63 == 0) {.+. Tc
32b0: 6c 5f 46 72 65 65 50 61 72 73 65 28 26 70 61 72 l_FreeParse(&par
32c0: 73 65 29 3b 0a 2b 09 20 20 20 20 69 66 20 28 65 se);.+. if (e
32d0: 72 72 4d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b rrMsg != NULL) {
32e0: 0a 2b 09 09 69 66 20 28 63 6f 64 65 20 21 3d 20 .+..if (code !=
32f0: 54 43 4c 5f 42 52 45 41 4b 29 20 7b 0a 2b 09 09 TCL_BREAK) {.+..
3300: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
3310: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 sult(interp, err
3320: 4d 73 67 29 3b 0a 2b 09 09 20 20 20 20 54 63 6c Msg);.+.. Tcl
3330: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 65 72 _DecrRefCount(er
3340: 72 4d 73 67 29 3b 0a 2b 09 09 20 20 20 20 72 65 rMsg);.+.. re
3350: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 2b 09 09 7d 0a turn NULL;.+..}.
3360: 2b 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f +..Tcl_DecrRefCo
3370: 75 6e 74 28 65 72 72 4d 73 67 29 3b 0a 2b 09 20 unt(errMsg);.+.
3380: 20 20 20 7d 0a 2b 09 20 20 20 20 72 65 74 75 72 }.+. retur
3390: 6e 20 72 65 73 75 6c 74 3b 0a 2b 09 7d 0a 2b 0a n result;.+.}.+.
33a0: 2b 09 63 6f 64 65 20 3d 20 54 63 6c 53 75 62 73 +.code = TclSubs
33b0: 74 54 6f 6b 65 6e 73 28 69 6e 74 65 72 70 2c 20 tTokens(interp,
33c0: 65 6e 64 54 6f 6b 65 6e 50 74 72 20 2d 20 74 6f endTokenPtr - to
33d0: 6b 65 6e 73 4c 65 66 74 2c 20 74 6f 6b 65 6e 73 kensLeft, tokens
33e0: 4c 65 66 74 2c 0a 2b 09 09 26 74 6f 6b 65 6e 73 Left,.+..&tokens
33f0: 4c 65 66 74 29 3b 0a 2b 20 20 20 20 7d 0a 2b 7d Left);.+ }.+}
3400: 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .+/*.+ *--------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b --------------.+
3450: 20 2a 0a 2b 20 2a 20 54 63 6c 53 75 62 73 74 54 *.+ * TclSubstT
3460: 6f 6b 65 6e 73 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a okens --.+ *.+ *
3470: 09 41 63 63 65 70 74 73 20 61 6e 20 61 72 72 61 .Accepts an arra
3480: 79 20 6f 66 20 63 6f 75 6e 74 20 54 63 6c 5f 54 y of count Tcl_T
3490: 6f 6b 65 6e 27 73 2c 20 61 6e 64 20 63 72 65 61 oken's, and crea
34a0: 74 65 73 20 61 20 72 65 73 75 6c 74 0a 2b 20 2a tes a result.+ *
34b0: 09 76 61 6c 75 65 20 69 6e 20 74 68 65 20 69 6e .value in the in
34c0: 74 65 72 70 20 66 72 6f 6d 20 63 6f 6e 63 61 74 terp from concat
34d0: 65 6e 61 74 69 6e 67 20 74 68 65 20 72 65 73 75 enating the resu
34e0: 6c 74 73 20 6f 66 20 0a 2b 20 2a 09 70 65 72 66 lts of .+ *.perf
34f0: 6f 72 6d 69 6e 67 20 54 63 6c 20 73 75 62 73 74 orming Tcl subst
3500: 69 74 75 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 itution on each
3510: 54 63 6c 5f 54 6f 6b 65 6e 2e 20 20 53 75 62 73 Tcl_Token. Subs
3520: 74 69 74 75 74 69 6f 6e 0a 2b 20 2a 09 69 73 20 titution.+ *.is
3530: 69 6e 74 65 72 72 75 70 74 65 64 20 69 66 20 61 interrupted if a
3540: 6e 79 20 6e 6f 6e 2d 54 43 4c 5f 4f 4b 20 63 6f ny non-TCL_OK co
3550: 6d 70 6c 65 74 69 6f 6e 20 63 6f 64 65 20 61 72 mpletion code ar
3560: 69 73 65 73 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65 ises..+ *.+ * Re
3570: 73 75 6c 74 73 3a 0a 2b 20 2a 20 09 54 68 65 20 sults:.+ * .The
3580: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 return value is
3590: 61 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 63 a standard Tcl c
35a0: 6f 6d 70 6c 65 74 69 6f 6e 20 63 6f 64 65 2e 20 ompletion code.
35b0: 20 54 68 65 0a 2b 20 2a 20 09 72 65 73 75 6c 74 The.+ * .result
35c0: 20 69 6e 20 69 6e 74 65 72 70 20 69 73 20 74 68 in interp is th
35d0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76 61 e substituted va
35e0: 6c 75 65 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 lue, or an error
35f0: 20 6d 65 73 73 61 67 65 0a 2b 20 2a 20 09 69 66 message.+ * .if
3600: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 TCL_ERROR is re
3610: 74 75 72 6e 65 64 2e 20 20 49 66 20 74 6f 6b 65 turned. If toke
3620: 6e 73 4c 65 66 74 50 74 72 20 69 73 20 6e 6f 74 nsLeftPtr is not
3630: 20 4e 55 4c 4c 2c 20 74 68 65 6e 0a 2b 20 2a 20 NULL, then.+ *
3640: 09 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e .it points to an
3650: 20 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e int where the n
3660: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 umber of tokens
3670: 72 65 6d 61 69 6e 69 6e 67 20 74 6f 0a 2b 20 2a remaining to.+ *
3680: 20 09 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 .be processed i
3690: 73 20 77 72 69 74 74 65 6e 2e 0a 2b 20 2a 0a 2b s written..+ *.+
36a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
36b0: 0a 2b 20 2a 20 09 43 61 6e 20 62 65 20 61 6e 79 .+ * .Can be any
36c0: 74 68 69 6e 67 2c 20 64 65 70 65 6e 64 69 6e 67 thing, depending
36d0: 20 6f 6e 20 74 68 65 20 74 79 70 65 73 20 6f 66 on the types of
36e0: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 64 6f substitution do
36f0: 6e 65 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d ne..+ *.+ *-----
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3740: 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 69 6e 74 0a 2b 54 -.+ */.+.+int.+T
3750: 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e clSubstTokens(in
3760: 74 65 72 70 2c 20 74 6f 6b 65 6e 50 74 72 2c 20 terp, tokenPtr,
3770: 63 6f 75 6e 74 2c 20 74 6f 6b 65 6e 73 4c 65 66 count, tokensLef
3780: 74 50 74 72 29 0a 2b 20 20 20 20 54 63 6c 5f 49 tPtr).+ Tcl_I
3790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 nterp *interp;
37a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 70 /* Interp
37b0: 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 reter in which t
37c0: 6f 20 6c 6f 6f 6b 75 70 0a 2b 20 20 20 20 20 20 o lookup.+
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
37e0: 20 20 20 20 20 20 20 20 20 20 20 2a 20 76 61 72 * var
37f0: 69 61 62 6c 65 73 2c 20 65 78 65 63 75 74 65 20 iables, execute
3800: 6e 65 73 74 65 64 20 63 6f 6d 6d 61 6e 64 73 2c nested commands,
3810: 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .+
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3830: 20 20 20 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 * and report
3840: 65 72 72 6f 72 73 2e 20 2a 2f 0a 2b 20 20 20 20 errors. */.+
3850: 54 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e Tcl_Token *token
3860: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 Ptr; /* P
3870: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 ointer to first
3880: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 in an array of t
3890: 6f 6b 65 6e 73 0a 2b 20 20 20 20 20 20 20 20 20 okens.+
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
38b0: 20 20 20 20 20 20 20 20 2a 20 74 6f 20 65 76 61 * to eva
38c0: 6c 75 61 74 65 20 61 6e 64 20 63 6f 6e 63 61 74 luate and concat
38d0: 65 6e 61 74 65 2e 20 2a 2f 0a 2b 20 20 20 20 69 enate. */.+ i
38e0: 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 nt count;
38f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
3900: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 74 mber of tokens t
3910: 6f 20 63 6f 6e 73 69 64 65 72 20 61 74 20 74 6f o consider at to
3920: 6b 65 6e 50 74 72 2e 0a 2b 20 20 20 20 20 20 20 kenPtr..+
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3940: 20 20 20 20 20 20 20 20 20 20 2a 20 4d 75 73 74 * Must
3950: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 2e 20 be at least 1.
3960: 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 2a 74 6f 6b */.+ int *tok
3970: 65 6e 73 4c 65 66 74 50 74 72 3b 09 09 2f 2a 20 ensLeftPtr;../*
3980: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 6f 69 If not NULL, poi
3990: 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 77 68 nts to memory wh
39a0: 65 72 65 20 61 6e 0a 2b 09 09 09 09 20 2a 20 69 ere an.+.... * i
39b0: 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 nteger represent
39c0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f ing the number o
39d0: 66 20 74 6f 6b 65 6e 73 0a 2b 09 09 09 09 20 2a f tokens.+.... *
39e0: 20 6c 65 66 74 20 74 6f 20 62 65 20 73 75 62 73 left to be subs
39f0: 74 69 74 75 74 65 64 20 77 69 6c 6c 20 62 65 20 tituted will be
3a00: 77 72 69 74 74 65 6e 20 2a 2f 0a 2b 7b 0a 2b 20 written */.+{.+
3a10: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
3a20: 6c 74 3b 0a 2b 20 20 20 20 69 6e 74 20 63 6f 64 lt;.+ int cod
3a30: 65 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 2b 0a 2b 20 e = TCL_OK;.+.+
3a40: 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 45 61 /*.+ * Ea
3a50: 63 68 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 ch pass through
3a60: 74 68 69 73 20 6c 6f 6f 70 20 77 69 6c 6c 20 73 this loop will s
3a70: 75 62 73 74 69 74 75 74 65 20 6f 6e 65 20 74 6f ubstitute one to
3a80: 6b 65 6e 2c 20 61 6e 64 20 69 74 73 0a 2b 20 20 ken, and its.+
3a90: 20 20 20 2a 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c * components,
3aa0: 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20 6f 6e if any. The on
3ab0: 6c 79 20 74 68 69 6e 67 20 74 72 69 63 6b 79 20 ly thing tricky
3ac0: 68 65 72 65 20 69 73 20 74 68 61 74 20 77 65 20 here is that we
3ad0: 67 6f 20 74 6f 0a 2b 20 20 20 20 20 2a 20 73 6f go to.+ * so
3ae0: 6d 65 20 65 66 66 6f 72 74 20 74 6f 20 70 61 73 me effort to pas
3af0: 73 20 54 63 6c 5f 4f 62 6a 27 73 20 74 68 72 6f s Tcl_Obj's thro
3b00: 75 67 68 20 75 6e 74 6f 75 63 68 65 64 2c 20 74 ugh untouched, t
3b10: 6f 20 61 76 6f 69 64 20 73 74 72 69 6e 67 0a 2b o avoid string.+
3b20: 20 20 20 20 20 2a 20 63 6f 70 79 69 6e 67 20 61 * copying a
3b30: 6e 64 20 54 63 6c 5f 4f 62 6a 20 63 72 65 61 74 nd Tcl_Obj creat
3b40: 69 6f 6e 20 69 66 20 70 6f 73 73 69 62 6c 65 2c ion if possible,
3b50: 20 74 6f 20 61 69 64 20 70 65 72 66 6f 72 6d 61 to aid performa
3b60: 6e 63 65 20 61 6e 64 0a 2b 20 20 20 20 20 2a 20 nce and.+ *
3b70: 6c 69 6d 69 74 20 73 68 69 6d 6d 65 72 69 6e 67 limit shimmering
3b80: 2e 0a 2b 20 20 20 20 20 2a 0a 2b 20 20 20 20 20 ..+ *.+
3b90: 2a 20 46 75 72 74 68 65 72 20 6f 70 74 69 6d 69 * Further optimi
3ba0: 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 zation opportuni
3bb0: 74 69 65 73 20 6d 69 67 68 74 20 62 65 20 74 6f ties might be to
3bc0: 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 0a 2b check for the.+
3bd0: 20 20 20 20 20 2a 20 65 71 75 69 76 61 6c 65 6e * equivalen
3be0: 74 20 6f 66 20 54 63 6c 5f 53 65 74 4f 62 6a 52 t of Tcl_SetObjR
3bf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
3c00: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3c10: 6e 74 65 72 70 29 29 0a 2b 20 20 20 20 20 2a 20 nterp)).+ *
3c20: 61 6e 64 20 6f 6d 69 74 20 74 68 65 6d 2e 0a 2b and omit them..+
3c30: 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 72 */.+.+ r
3c40: 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 esult = NULL;.+
3c50: 20 20 20 66 6f 72 20 28 20 3b 20 28 63 6f 75 6e for ( ; (coun
3c60: 74 20 3e 20 30 29 20 26 26 20 28 63 6f 64 65 20 t > 0) && (code
3c70: 3d 3d 20 54 43 4c 5f 4f 4b 29 3b 20 63 6f 75 6e == TCL_OK); coun
3c80: 74 2d 2d 2c 20 74 6f 6b 65 6e 50 74 72 2b 2b 29 t--, tokenPtr++)
3c90: 20 7b 0a 2b 09 54 63 6c 5f 4f 62 6a 20 2a 61 70 {.+.Tcl_Obj *ap
3ca0: 70 65 6e 64 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a pendObj = NULL;.
3cb0: 2b 09 43 4f 4e 53 54 20 63 68 61 72 20 2a 61 70 +.CONST char *ap
3cc0: 70 65 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 69 pend = NULL;.+.i
3cd0: 6e 74 20 61 70 70 65 6e 64 42 79 74 65 4c 65 6e nt appendByteLen
3ce0: 67 74 68 20 3d 20 30 3b 0a 2b 0a 2b 09 73 77 69 gth = 0;.+.+.swi
3cf0: 74 63 68 20 28 74 6f 6b 65 6e 50 74 72 2d 3e 74 tch (tokenPtr->t
3d00: 79 70 65 29 20 7b 0a 2b 09 20 20 20 20 63 61 73 ype) {.+. cas
3d10: 65 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 58 54 e TCL_TOKEN_TEXT
3d20: 3a 0a 2b 09 09 61 70 70 65 6e 64 20 3d 20 74 6f :.+..append = to
3d30: 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 3b 0a 2b kenPtr->start;.+
3d40: 09 09 61 70 70 65 6e 64 42 79 74 65 4c 65 6e 67 ..appendByteLeng
3d50: 74 68 20 3d 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 th = tokenPtr->s
3d60: 69 7a 65 3b 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b ize;.+..break;.+
3d70: 0a 2b 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f .+. case TCL_
3d80: 54 4f 4b 45 4e 5f 42 53 3a 20 7b 0a 2b 09 09 63 TOKEN_BS: {.+..c
3d90: 68 61 72 20 75 74 66 43 68 61 72 42 79 74 65 73 har utfCharBytes
3da0: 5b 54 43 4c 5f 55 54 46 5f 4d 41 58 5d 3b 0a 2b [TCL_UTF_MAX];.+
3db0: 09 09 61 70 70 65 6e 64 42 79 74 65 4c 65 6e 67 ..appendByteLeng
3dc0: 74 68 20 3d 20 54 63 6c 5f 55 74 66 42 61 63 6b th = Tcl_UtfBack
3dd0: 73 6c 61 73 68 28 74 6f 6b 65 6e 50 74 72 2d 3e slash(tokenPtr->
3de0: 73 74 61 72 74 2c 0a 2b 09 09 09 28 69 6e 74 20 start,.+...(int
3df0: 2a 29 20 4e 55 4c 4c 2c 20 75 74 66 43 68 61 72 *) NULL, utfChar
3e00: 42 79 74 65 73 29 3b 0a 2b 09 09 61 70 70 65 6e Bytes);.+..appen
3e10: 64 20 3d 20 75 74 66 43 68 61 72 42 79 74 65 73 d = utfCharBytes
3e20: 3b 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b 09 20 20 ;.+..break;.+.
3e30: 20 20 7d 0a 2b 0a 2b 09 20 20 20 20 63 61 73 65 }.+.+. case
3e40: 20 54 43 4c 5f 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 TCL_TOKEN_COMMA
3e50: 4e 44 3a 0a 2b 09 09 63 6f 64 65 20 3d 20 54 63 ND:.+..code = Tc
3e60: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
3e70: 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 tokenPtr->start
3e80: 2b 31 2c 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 +1, tokenPtr->si
3e90: 7a 65 2d 32 2c 0a 2b 09 09 09 30 29 3b 0a 2b 09 ze-2,.+...0);.+.
3ea0: 09 61 70 70 65 6e 64 4f 62 6a 20 3d 20 54 63 6c .appendObj = Tcl
3eb0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
3ec0: 74 65 72 70 29 3b 0a 2b 09 09 62 72 65 61 6b 3b terp);.+..break;
3ed0: 0a 2b 0a 2b 09 20 20 20 20 63 61 73 65 20 54 43 .+.+. case TC
3ee0: 4c 5f 54 4f 4b 45 4e 5f 56 41 52 49 41 42 4c 45 L_TOKEN_VARIABLE
3ef0: 3a 20 7b 0a 2b 09 09 54 63 6c 5f 4f 62 6a 20 2a : {.+..Tcl_Obj *
3f00: 61 72 72 61 79 49 6e 64 65 78 20 3d 20 4e 55 4c arrayIndex = NUL
3f10: 4c 3b 0a 2b 09 09 54 63 6c 5f 4f 62 6a 20 2a 76 L;.+..Tcl_Obj *v
3f20: 61 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 2b arName = NULL;.+
3f30: 09 09 69 66 20 28 74 6f 6b 65 6e 50 74 72 2d 3e ..if (tokenPtr->
3f40: 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 20 3e 20 numComponents >
3f50: 31 29 20 7b 0a 2b 09 09 20 20 20 20 2f 2a 20 53 1) {.+.. /* S
3f60: 75 62 73 74 20 74 68 65 20 69 6e 64 65 78 20 70 ubst the index p
3f70: 61 72 74 20 6f 66 20 61 6e 20 61 72 72 61 79 20 art of an array
3f80: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e variable referen
3f90: 63 65 20 2a 2f 0a 2b 09 09 20 20 20 20 63 6f 64 ce */.+.. cod
3fa0: 65 20 3d 20 54 63 6c 53 75 62 73 74 54 6f 6b 65 e = TclSubstToke
3fb0: 6e 73 28 69 6e 74 65 72 70 2c 20 74 6f 6b 65 6e ns(interp, token
3fc0: 50 74 72 2b 32 2c 0a 2b 09 09 09 20 20 20 20 74 Ptr+2,.+... t
3fd0: 6f 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 okenPtr->numComp
3fe0: 6f 6e 65 6e 74 73 20 2d 20 31 2c 20 4e 55 4c 4c onents - 1, NULL
3ff0: 29 3b 0a 2b 09 09 20 20 20 20 61 72 72 61 79 49 );.+.. arrayI
4000: 6e 64 65 78 20 3d 20 54 63 6c 5f 47 65 74 4f 62 ndex = Tcl_GetOb
4010: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b jResult(interp);
4020: 0a 2b 09 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 .+.. Tcl_Incr
4030: 52 65 66 43 6f 75 6e 74 28 61 72 72 61 79 49 6e RefCount(arrayIn
4040: 64 65 78 29 3b 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 dex);.+..}.+.+..
4050: 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f if (code == TCL_
4060: 4f 4b 29 20 7b 0a 2b 09 09 20 20 20 20 76 61 72 OK) {.+.. var
4070: 4e 61 6d 65 20 3d 20 54 63 6c 5f 4e 65 77 53 74 Name = Tcl_NewSt
4080: 72 69 6e 67 4f 62 6a 28 74 6f 6b 65 6e 50 74 72 ringObj(tokenPtr
4090: 5b 31 5d 2e 73 74 61 72 74 2c 0a 2b 09 09 09 20 [1].start,.+...
40a0: 20 20 20 74 6f 6b 65 6e 50 74 72 5b 31 5d 2e 73 tokenPtr[1].s
40b0: 69 7a 65 29 3b 0a 2b 09 09 20 20 20 20 61 70 70 ize);.+.. app
40c0: 65 6e 64 4f 62 6a 20 3d 20 54 63 6c 5f 4f 62 6a endObj = Tcl_Obj
40d0: 47 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 GetVar2(interp,
40e0: 76 61 72 4e 61 6d 65 2c 20 61 72 72 61 79 49 6e varName, arrayIn
40f0: 64 65 78 2c 0a 2b 09 09 09 20 20 20 20 54 43 4c dex,.+... TCL
4100: 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b _LEAVE_ERR_MSG);
4110: 0a 2b 09 09 20 20 20 20 54 63 6c 5f 44 65 63 72 .+.. Tcl_Decr
4120: 52 65 66 43 6f 75 6e 74 28 76 61 72 4e 61 6d 65 RefCount(varName
4130: 29 3b 0a 2b 09 09 20 20 20 20 69 66 20 28 61 70 );.+.. if (ap
4140: 70 65 6e 64 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 pendObj == NULL)
4150: 20 7b 0a 2b 09 09 09 63 6f 64 65 20 3d 20 54 43 {.+...code = TC
4160: 4c 5f 45 52 52 4f 52 3b 0a 2b 09 09 20 20 20 20 L_ERROR;.+..
4170: 7d 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 73 77 69 74 }.+..}.+.+..swit
4180: 63 68 20 28 63 6f 64 65 29 20 7b 0a 2b 09 09 20 ch (code) {.+..
4190: 20 20 20 63 61 73 65 20 54 43 4c 5f 4f 4b 3a 09 case TCL_OK:.
41a0: 2f 2a 20 47 6f 74 20 76 61 6c 75 65 20 2a 2f 0a /* Got value */.
41b0: 2b 09 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f +.. case TCL_
41c0: 45 52 52 4f 52 3a 09 2f 2a 20 41 6c 72 65 61 64 ERROR:./* Alread
41d0: 79 20 68 61 76 65 20 65 72 72 6f 72 20 6d 65 73 y have error mes
41e0: 73 61 67 65 20 2a 2f 0a 2b 09 09 20 20 20 20 63 sage */.+.. c
41f0: 61 73 65 20 54 43 4c 5f 42 52 45 41 4b 3a 09 2f ase TCL_BREAK:./
4200: 2a 20 57 69 6c 6c 20 6e 6f 74 20 73 75 62 73 74 * Will not subst
4210: 69 74 75 74 65 20 61 6e 79 77 61 79 20 2a 2f 0a itute anyway */.
4220: 2b 09 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f +.. case TCL_
4230: 43 4f 4e 54 49 4e 55 45 3a 09 2f 2a 20 57 69 6c CONTINUE:./* Wil
4240: 6c 20 6e 6f 74 20 73 75 62 73 74 69 74 75 74 65 l not substitute
4250: 20 61 6e 79 77 61 79 20 2a 2f 0a 2b 09 09 09 62 anyway */.+...b
4260: 72 65 61 6b 3b 0a 2b 09 09 20 20 20 20 64 65 66 reak;.+.. def
4270: 61 75 6c 74 3a 0a 2b 09 09 09 2f 2a 20 41 6c 6c ault:.+.../* All
4280: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 63 6f other return co
4290: 64 65 73 2c 20 77 65 20 77 69 6c 6c 20 73 75 62 des, we will sub
42a0: 73 74 20 74 68 65 0a 2b 09 09 09 20 2a 20 72 65 st the.+... * re
42b0: 73 75 6c 74 20 66 72 6f 6d 20 74 68 65 20 63 6f sult from the co
42c0: 64 65 2d 74 68 72 6f 77 69 6e 67 20 65 76 61 6c de-throwing eval
42d0: 75 61 74 69 6f 6e 20 2a 2f 0a 2b 09 09 09 61 70 uation */.+...ap
42e0: 70 65 6e 64 4f 62 6a 20 3d 20 54 63 6c 5f 47 65 pendObj = Tcl_Ge
42f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
4300: 70 29 3b 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 69 66 p);.+..}.+.+..if
4310: 20 28 61 72 72 61 79 49 6e 64 65 78 20 21 3d 20 (arrayIndex !=
4320: 4e 55 4c 4c 29 20 7b 0a 2b 09 09 20 20 20 20 54 NULL) {.+.. T
4330: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4340: 61 72 72 61 79 49 6e 64 65 78 29 3b 0a 2b 09 09 arrayIndex);.+..
4350: 7d 0a 2b 09 09 63 6f 75 6e 74 20 2d 3d 20 74 6f }.+..count -= to
4360: 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f kenPtr->numCompo
4370: 6e 65 6e 74 73 3b 0a 2b 09 09 74 6f 6b 65 6e 50 nents;.+..tokenP
4380: 74 72 20 2b 3d 20 74 6f 6b 65 6e 50 74 72 2d 3e tr += tokenPtr->
4390: 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 3b 0a 2b numComponents;.+
43a0: 09 09 62 72 65 61 6b 3b 0a 2b 09 20 20 20 20 7d ..break;.+. }
43b0: 0a 2b 0a 2b 09 20 20 20 20 64 65 66 61 75 6c 74 .+.+. default
43c0: 3a 0a 2b 09 09 54 63 6c 5f 50 61 6e 69 63 28 22 :.+..Tcl_Panic("
43d0: 75 6e 65 78 70 65 63 74 65 64 20 74 6f 6b 65 6e unexpected token
43e0: 20 74 79 70 65 20 69 6e 20 54 63 6c 53 75 62 73 type in TclSubs
43f0: 74 54 6f 6b 65 6e 73 3a 20 25 64 22 2c 0a 2b 09 tTokens: %d",.+.
4400: 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 65 ..tokenPtr->type
4410: 29 3b 0a 2b 09 7d 0a 2b 0a 2b 09 69 66 20 28 28 );.+.}.+.+.if ((
4420: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 42 52 45 41 code == TCL_BREA
4430: 4b 29 20 7c 7c 20 28 63 6f 64 65 20 3d 3d 20 54 K) || (code == T
4440: 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 29 20 7b 0a CL_CONTINUE)) {.
4450: 2b 09 20 20 20 20 2f 2a 20 49 6e 68 69 62 69 74 +. /* Inhibit
4460: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f substitution */
4470: 0a 2b 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b .+. continue;
4480: 0a 2b 09 7d 0a 2b 0a 2b 09 69 66 20 28 72 65 73 .+.}.+.+.if (res
4490: 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 2b ult == NULL) {.+
44a0: 09 20 20 20 20 2f 2a 20 0a 2b 09 20 20 20 20 20 . /* .+.
44b0: 2a 20 46 69 72 73 74 20 70 61 73 73 20 74 68 72 * First pass thr
44c0: 6f 75 67 68 2e 20 20 49 66 20 77 65 20 68 61 76 ough. If we hav
44d0: 65 20 61 20 54 63 6c 5f 4f 62 6a 2c 20 6a 75 73 e a Tcl_Obj, jus
44e0: 74 20 75 73 65 20 69 74 2e 0a 2b 09 20 20 20 20 t use it..+.
44f0: 20 2a 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 * If not, creat
4500: 65 20 6f 6e 65 20 66 72 6f 6d 20 6f 75 72 20 73 e one from our s
4510: 74 72 69 6e 67 2e 20 0a 2b 09 20 20 20 20 20 2a tring. .+. *
4520: 2f 0a 2b 0a 2b 09 20 20 20 20 69 66 20 28 61 70 /.+.+. if (ap
4530: 70 65 6e 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 pendObj != NULL)
4540: 20 7b 0a 2b 09 09 72 65 73 75 6c 74 20 3d 20 61 {.+..result = a
4550: 70 70 65 6e 64 4f 62 6a 3b 0a 2b 09 20 20 20 20 ppendObj;.+.
4560: 7d 20 65 6c 73 65 20 7b 0a 2b 09 09 72 65 73 75 } else {.+..resu
4570: 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 lt = Tcl_NewStri
4580: 6e 67 4f 62 6a 28 61 70 70 65 6e 64 2c 20 61 70 ngObj(append, ap
4590: 70 65 6e 64 42 79 74 65 4c 65 6e 67 74 68 29 3b pendByteLength);
45a0: 3b 0a 2b 09 20 20 20 20 7d 0a 2b 09 20 20 20 20 ;.+. }.+.
45b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
45c0: 28 72 65 73 75 6c 74 29 3b 0a 2b 09 7d 20 65 6c (result);.+.} el
45d0: 73 65 20 7b 0a 2b 09 20 20 20 20 2f 2a 20 53 75 se {.+. /* Su
45e0: 62 73 65 71 75 65 6e 74 20 70 61 73 73 65 73 2e bsequent passes.
45f0: 20 20 41 70 70 65 6e 64 20 74 6f 20 72 65 73 75 Append to resu
4600: 6c 74 2e 20 2a 2f 0a 2b 09 20 20 20 20 69 66 20 lt. */.+. if
4610: 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 72 65 (Tcl_IsShared(re
4620: 73 75 6c 74 29 29 20 7b 0a 2b 09 09 54 63 6c 5f sult)) {.+..Tcl_
4630: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 DecrRefCount(res
4640: 75 6c 74 29 3b 0a 2b 09 09 72 65 73 75 6c 74 20 ult);.+..result
4650: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4660: 62 6a 28 72 65 73 75 6c 74 29 3b 0a 2b 09 09 54 bj(result);.+..T
4670: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
4680: 72 65 73 75 6c 74 29 3b 0a 2b 09 20 20 20 20 7d result);.+. }
4690: 0a 2b 09 20 20 20 20 69 66 20 28 61 70 70 65 6e .+. if (appen
46a0: 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a dObj != NULL) {.
46b0: 2b 09 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a +..Tcl_AppendObj
46c0: 54 6f 4f 62 6a 28 72 65 73 75 6c 74 2c 20 61 70 ToObj(result, ap
46d0: 70 65 6e 64 4f 62 6a 29 3b 0a 2b 09 20 20 20 20 pendObj);.+.
46e0: 7d 20 65 6c 73 65 20 7b 0a 2b 09 09 54 63 6c 5f } else {.+..Tcl_
46f0: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 AppendToObj(resu
4700: 6c 74 2c 20 61 70 70 65 6e 64 2c 20 61 70 70 65 lt, append, appe
4710: 6e 64 42 79 74 65 4c 65 6e 67 74 68 29 3b 0a 2b ndByteLength);.+
4720: 09 20 20 20 20 7d 0a 2b 09 7d 0a 2b 20 20 20 20 . }.+.}.+
4730: 7d 0a 2b 0a 2b 20 20 20 20 69 66 20 28 63 6f 64 }.+.+ if (cod
4740: 65 20 21 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 e != TCL_ERROR)
4750: 7b 09 2f 2a 20 4b 65 65 70 20 65 72 72 6f 72 20 {./* Keep error
4760: 6d 65 73 73 61 67 65 20 69 6e 20 72 65 73 75 6c message in resul
4770: 74 21 20 2a 2f 0a 2b 09 69 66 20 28 72 65 73 75 t! */.+.if (resu
4780: 6c 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 lt != NULL) {.+.
4790: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
47a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 sult(interp, res
47b0: 75 6c 74 29 3b 0a 2b 09 7d 20 65 6c 73 65 20 7b ult);.+.} else {
47c0: 0a 2b 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 .+. Tcl_Reset
47d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
47e0: 2b 09 7d 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 +.}.+ }.+
47f0: 69 66 20 28 74 6f 6b 65 6e 73 4c 65 66 74 50 74 if (tokensLeftPt
4800: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 2a r != NULL) {.+.*
4810: 74 6f 6b 65 6e 73 4c 65 66 74 50 74 72 20 3d 20 tokensLeftPtr =
4820: 63 6f 75 6e 74 3b 0a 2b 20 20 20 20 7d 0a 2b 20 count;.+ }.+
4830: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d if (result !=
4840: 20 4e 55 4c 4c 29 20 7b 0a 2b 09 54 63 6c 5f 44 NULL) {.+.Tcl_D
4850: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ecrRefCount(resu
4860: 6c 74 29 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 lt);.+ }.+
4870: 20 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 2b 7d return code;.+}
4880: 0a 2b 0c 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d .+.. /*. *-----
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 0a 20 20 2a 0a -. *.