Attachment "subst.patch" to
ticket [536831ffff]
added by
dgp
2003-03-08 03:42:53.
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 37 20 ic/tclBasic.c.7
0110: 4d 61 72 20 32 30 30 33 20 32 30 3a 32 31 3a 33 Mar 2003 20:21:3
0120: 33 20 2d 30 30 30 30 0a 40 40 20 2d 33 33 34 37 3 -0000.@@ -3347
0130: 2c 36 20 2b 33 33 34 37 2c 31 30 20 40 40 0a 20 ,6 +3347,10 @@.
0140: 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 09 09 int count;..
0150: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 6f ./* Number of to
0160: 6b 65 6e 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 kens to consider
0170: 20 61 74 20 74 6f 6b 65 6e 50 74 72 2e 0a 20 09 at tokenPtr.. .
0180: 09 09 09 20 2a 20 4d 75 73 74 20 62 65 20 61 74 ... * Must be at
0190: 20 6c 65 61 73 74 20 31 2e 20 2a 2f 0a 20 7b 0a least 1. */. {.
01a0: 2b 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 53 + return TclS
01b0: 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 65 72 ubstTokens(inter
01c0: 70 2c 20 74 6f 6b 65 6e 50 74 72 2c 20 63 6f 75 p, tokenPtr, cou
01d0: 6e 74 2c 20 2f 2a 20 6e 75 6d 4c 65 66 74 50 74 nt, /* numLeftPt
01e0: 72 20 2a 2f 20 4e 55 4c 4c 29 3b 0a 2b 0a 2b 23 r */ NULL);.+.+#
01f0: 69 66 20 30 0a 2b 0a 20 20 20 20 20 54 63 6c 5f if 0.+. Tcl_
0200: 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 2c 20 Obj *resultPtr,
0210: 2a 69 6e 64 65 78 50 74 72 2c 20 2a 76 61 6c 75 *indexPtr, *valu
0220: 65 50 74 72 3b 0a 20 20 20 20 20 63 68 61 72 20 ePtr;. char
0230: 62 75 66 66 65 72 5b 54 43 4c 5f 55 54 46 5f 4d buffer[TCL_UTF_M
0240: 41 58 5d 3b 0a 20 23 69 66 64 65 66 20 54 43 4c AX];. #ifdef TCL
0250: 5f 4d 45 4d 5f 44 45 42 55 47 0a 40 40 20 2d 33 _MEM_DEBUG.@@ -3
0260: 34 38 34 2c 36 20 2b 33 34 38 38 2c 37 20 40 40 484,6 +3488,7 @@
0270: 0a 20 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f . .Tcl_DecrRefCo
0280: 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a unt(resultPtr);.
0290: 20 20 20 20 20 7d 0a 20 20 20 20 20 72 65 74 75 }. retu
02a0: 72 6e 20 63 6f 64 65 3b 0a 2b 23 65 6e 64 69 66 rn code;.+#endif
02b0: 0a 20 7d 0a 20 0a 20 0a 49 6e 64 65 78 3a 20 67 . }. . .Index: g
02c0: 65 6e 65 72 69 63 2f 74 63 6c 43 6d 64 4d 5a 2e eneric/tclCmdMZ.
02d0: 63 0a 3d 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 0a 52 43 53 20 66 69 6c 65 3a 20 =====.RCS file:
0320: 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c /cvsroot/tcl/tcl
0330: 2f 67 65 6e 65 72 69 63 2f 74 63 6c 43 6d 64 4d /generic/tclCmdM
0340: 5a 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 Z.c,v.retrieving
0350: 20 72 65 76 69 73 69 6f 6e 20 31 2e 38 32 0a 64 revision 1.82.d
0360: 69 66 66 20 2d 75 20 2d 72 31 2e 38 32 20 74 63 iff -u -r1.82 tc
0370: 6c 43 6d 64 4d 5a 2e 63 0a 2d 2d 2d 20 67 65 6e lCmdMZ.c.--- gen
0380: 65 72 69 63 2f 74 63 6c 43 6d 64 4d 5a 2e 63 09 eric/tclCmdMZ.c.
0390: 32 37 20 46 65 62 20 32 30 30 33 20 30 30 3a 35 27 Feb 2003 00:5
03a0: 34 3a 33 36 20 2d 30 30 30 30 09 31 2e 38 32 0a 4:36 -0000.1.82.
03b0: 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 +++ generic/tclC
03c0: 6d 64 4d 5a 2e 63 09 37 20 4d 61 72 20 32 30 30 mdMZ.c.7 Mar 200
03d0: 33 20 32 30 3a 32 31 3a 33 33 20 2d 30 30 30 30 3 20:21:33 -0000
03e0: 0a 40 40 20 2d 32 34 38 37 2c 36 20 2b 32 34 38 .@@ -2487,6 +248
03f0: 37 2c 37 20 40 40 0a 20 20 20 20 20 72 65 74 75 7,7 @@. retu
0400: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 7d 0a 20 0c rn TCL_OK;. }. .
0410: 0a 2b 23 69 66 20 30 0a 20 2f 2a 0a 20 20 2a 2d .+#if 0. /*. *-
0420: 2d 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 0a 20 20 2a 0a 40 40 20 2d 32 36 -----. *.@@ -26
0470: 34 30 2c 36 20 2b 32 36 34 31 2c 37 20 40 40 0a 40,6 +2641,7 @@.
0480: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c return NULL
0490: 3b 0a 20 7d 0a 20 0c 0a 2b 23 65 6e 64 69 66 0a ;. }. ..+#endif.
04a0: 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *---------
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 0a 20 20 -------------.
04f0: 2a 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 *.Index: generic
0500: 2f 74 63 6c 49 6e 74 2e 68 0a 3d 3d 3d 3d 3d 3d /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 0a 52 43 =============.RC
0550: 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 S file: /cvsroot
0560: 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 /tcl/tcl/generic
0570: 2f 74 63 6c 49 6e 74 2e 68 2c 76 0a 72 65 74 72 /tclInt.h,v.retr
0580: 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 ieving revision
0590: 31 2e 31 31 39 0a 64 69 66 66 20 2d 75 20 2d 72 1.119.diff -u -r
05a0: 31 2e 31 31 39 20 74 63 6c 49 6e 74 2e 68 0a 2d 1.119 tclInt.h.-
05b0: 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 49 6e -- generic/tclIn
05c0: 74 2e 68 09 35 20 4d 61 72 20 32 30 30 33 20 32 t.h.5 Mar 2003 2
05d0: 32 3a 33 31 3a 32 34 20 2d 30 30 30 30 09 31 2e 2:31:24 -0000.1.
05e0: 31 31 39 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 119.+++ generic/
05f0: 74 63 6c 49 6e 74 2e 68 09 37 20 4d 61 72 20 32 tclInt.h.7 Mar 2
0600: 30 30 33 20 32 30 3a 32 31 3a 33 33 20 2d 30 30 003 20:21:33 -00
0610: 30 30 0a 40 40 20 2d 31 38 30 32 2c 37 20 2b 31 00.@@ -1802,7 +1
0620: 38 30 32 2c 31 30 20 40 40 0a 20 45 58 54 45 52 802,10 @@. EXTER
0630: 4e 20 56 4f 49 44 20 20 20 20 20 20 20 20 20 20 N VOID
0640: 20 20 20 54 63 6c 52 65 6d 65 6d 62 65 72 4a 6f TclRememberJo
0650: 69 6e 61 62 6c 65 54 68 72 65 61 64 20 5f 41 4e inableThread _AN
0660: 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 54 68 SI_ARGS_((Tcl_Th
0670: 72 65 61 64 49 64 20 69 64 29 29 3b 0a 20 45 58 readId id));. EX
0680: 54 45 52 4e 20 76 6f 69 64 09 09 54 63 6c 52 65 TERN void..TclRe
0690: 6d 65 6d 62 65 72 4d 75 74 65 78 20 5f 41 4e 53 memberMutex _ANS
06a0: 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 4d 75 74 I_ARGS_((Tcl_Mut
06b0: 65 78 20 2a 6d 75 74 65 78 29 29 3b 0a 20 45 58 ex *mutex));. EX
06c0: 54 45 52 4e 20 56 4f 49 44 20 20 20 20 20 20 20 TERN VOID
06d0: 20 20 20 20 20 20 54 63 6c 53 69 67 6e 61 6c 45 TclSignalE
06e0: 78 69 74 54 68 72 65 61 64 20 5f 41 4e 53 49 5f xitThread _ANSI_
06f0: 41 52 47 53 5f 28 28 54 63 6c 5f 54 68 72 65 61 ARGS_((Tcl_Threa
0700: 64 49 64 20 69 64 2c 0a 2d 09 09 09 20 20 20 20 dId id,.-...
0710: 20 69 6e 74 20 72 65 73 75 6c 74 29 29 3b 0a 2b int result));.+
0720: 09 09 09 20 20 20 20 69 6e 74 20 72 65 73 75 6c ... int resul
0730: 74 29 29 3b 0a 2b 45 58 54 45 52 4e 20 69 6e 74 t));.+EXTERN int
0740: 09 09 54 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 ..TclSubstTokens
0750: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 _ANSI_ARGS_((Tc
0760: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0770: 2c 0a 2b 09 09 09 20 20 20 20 54 63 6c 5f 54 6f ,.+... Tcl_To
0780: 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 2c 20 69 ken *tokenPtr, i
0790: 6e 74 20 63 6f 75 6e 74 2c 0a 2b 09 09 09 20 20 nt count,.+...
07a0: 20 20 69 6e 74 20 2a 74 6f 6b 65 6e 73 4c 65 66 int *tokensLef
07b0: 74 50 74 72 29 29 3b 0a 20 45 58 54 45 52 4e 20 tPtr));. EXTERN
07c0: 76 6f 69 64 09 09 54 63 6c 54 72 61 6e 73 66 65 void..TclTransfe
07d0: 72 52 65 73 75 6c 74 20 5f 41 4e 53 49 5f 41 52 rResult _ANSI_AR
07e0: 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 GS_((Tcl_Interp
07f0: 2a 73 6f 75 72 63 65 49 6e 74 65 72 70 2c 0a 20 *sourceInterp,.
0800: 09 09 09 20 20 20 20 69 6e 74 20 72 65 73 75 6c ... int resul
0810: 74 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 74 t, Tcl_Interp *t
0820: 61 72 67 65 74 49 6e 74 65 72 70 29 29 3b 0a 20 argetInterp));.
0830: 45 58 54 45 52 4e 20 54 63 6c 5f 4f 62 6a 2a 20 EXTERN Tcl_Obj*
0840: 20 20 20 20 20 20 20 20 54 63 6c 70 4e 61 74 69 TclpNati
0850: 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65 64 20 0a veToNormalized .
0860: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 Index: generic/t
0870: 63 6c 50 61 72 73 65 2e 63 0a 3d 3d 3d 3d 3d 3d clParse.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 0a 52 43 =============.RC
08c0: 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 S file: /cvsroot
08d0: 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 /tcl/tcl/generic
08e0: 2f 74 63 6c 50 61 72 73 65 2e 63 2c 76 0a 72 65 /tclParse.c,v.re
08f0: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f trieving revisio
0900: 6e 20 31 2e 32 35 0a 64 69 66 66 20 2d 75 20 2d n 1.25.diff -u -
0910: 72 31 2e 32 35 20 74 63 6c 50 61 72 73 65 2e 63 r1.25 tclParse.c
0920: 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c .--- generic/tcl
0930: 50 61 72 73 65 2e 63 09 31 36 20 46 65 62 20 32 Parse.c.16 Feb 2
0940: 30 30 33 20 30 31 3a 33 36 3a 33 32 20 2d 30 30 003 01:36:32 -00
0950: 30 30 09 31 2e 32 35 0a 2b 2b 2b 20 67 65 6e 65 00.1.25.+++ gene
0960: 72 69 63 2f 74 63 6c 50 61 72 73 65 2e 63 09 37 ric/tclParse.c.7
0970: 20 4d 61 72 20 32 30 30 33 20 32 30 3a 32 31 3a Mar 2003 20:21:
0980: 33 34 20 2d 30 30 30 30 0a 40 40 20 2d 31 37 39 34 -0000.@@ -179
0990: 2c 37 20 2b 31 37 39 2c 37 20 40 40 0a 20 73 74 ,7 +179,7 @@. st
09a0: 61 74 69 63 20 69 6e 74 09 09 50 61 72 73 65 43 atic int..ParseC
09b0: 6f 6d 6d 65 6e 74 20 5f 41 4e 53 49 5f 41 52 47 omment _ANSI_ARG
09c0: 53 5f 28 28 43 4f 4e 53 54 20 63 68 61 72 20 2a S_((CONST char *
09d0: 73 72 63 2c 20 69 6e 74 20 6e 75 6d 42 79 74 65 src, int numByte
09e0: 73 2c 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 50 s,. ... Tcl_P
09f0: 61 72 73 65 20 2a 70 61 72 73 65 50 74 72 29 29 arse *parsePtr))
0a00: 3b 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 ;. static int..P
0a10: 61 72 73 65 54 6f 6b 65 6e 73 20 5f 41 4e 53 49 arseTokens _ANSI
0a20: 5f 41 52 47 53 5f 28 28 43 4f 4e 53 54 20 63 68 _ARGS_((CONST ch
0a30: 61 72 20 2a 73 72 63 2c 20 69 6e 74 20 6e 75 6d ar *src, int num
0a40: 42 79 74 65 73 2c 0a 2d 09 09 09 20 20 20 20 69 Bytes,.-... i
0a50: 6e 74 20 6d 61 73 6b 2c 20 54 63 6c 5f 50 61 72 nt mask, Tcl_Par
0a60: 73 65 20 2a 70 61 72 73 65 50 74 72 29 29 3b 0a se *parsePtr));.
0a70: 2b 09 09 09 20 20 20 20 69 6e 74 20 6d 61 73 6b +... int mask
0a80: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 54 63 6c , int flags, Tcl
0a90: 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50 74 72 _Parse *parsePtr
0aa0: 29 29 3b 0a 20 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d ));. . /*. *---
0ab0: 2d 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 0a 40 40 20 2d 33 34 33 2c 37 20 2b 33 ---.@@ -343,7 +3
0b00: 34 33 2c 37 20 40 40 0a 20 09 20 20 20 20 20 2a 43,7 @@. . *
0b10: 2f 0a 20 0a 20 09 20 20 20 20 69 66 20 28 50 61 /. . . if (Pa
0b20: 72 73 65 54 6f 6b 65 6e 73 28 73 72 63 2c 20 6e rseTokens(src, n
0b30: 75 6d 42 79 74 65 73 2c 20 54 59 50 45 5f 53 50 umBytes, TYPE_SP
0b40: 41 43 45 7c 74 65 72 6d 69 6e 61 74 6f 72 73 2c ACE|terminators,
0b50: 0a 2d 09 09 20 20 20 20 70 61 72 73 65 50 74 72 .-.. parsePtr
0b60: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b ) != TCL_OK) {.+
0b70: 09 09 20 20 20 20 54 43 4c 5f 53 55 42 53 54 5f .. TCL_SUBST_
0b80: 41 4c 4c 2c 20 70 61 72 73 65 50 74 72 29 20 21 ALL, parsePtr) !
0b90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 20 09 09 67 = TCL_OK) {. ..g
0ba0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 09 20 20 20 oto error;. .
0bb0: 20 7d 0a 20 09 20 20 20 20 73 72 63 20 3d 20 70 }. . src = p
0bc0: 61 72 73 65 50 74 72 2d 3e 74 65 72 6d 3b 20 6e arsePtr->term; n
0bd0: 75 6d 42 79 74 65 73 20 3d 20 70 61 72 73 65 50 umBytes = parseP
0be0: 74 72 2d 3e 65 6e 64 20 2d 20 73 72 63 3b 0a 40 tr->end - src;.@
0bf0: 40 20 2d 37 38 35 2c 39 20 2b 37 38 35 2c 31 33 @ -785,9 +785,13
0c00: 20 40 40 0a 20 20 2a 2f 0a 20 0a 20 73 74 61 74 @@. */. . stat
0c10: 69 63 20 69 6e 74 0a 2d 50 61 72 73 65 54 6f 6b ic int.-ParseTok
0c20: 65 6e 73 28 73 72 63 2c 20 6e 75 6d 42 79 74 65 ens(src, numByte
0c30: 73 2c 20 6d 61 73 6b 2c 20 70 61 72 73 65 50 74 s, mask, parsePt
0c40: 72 29 0a 2b 50 61 72 73 65 54 6f 6b 65 6e 73 28 r).+ParseTokens(
0c50: 73 72 63 2c 20 6e 75 6d 42 79 74 65 73 2c 20 6d src, numBytes, m
0c60: 61 73 6b 2c 20 66 6c 61 67 73 2c 20 70 61 72 73 ask, flags, pars
0c70: 65 50 74 72 29 0a 20 20 20 20 20 72 65 67 69 73 ePtr). regis
0c80: 74 65 72 20 43 4f 4e 53 54 20 63 68 61 72 20 2a ter CONST char *
0c90: 73 72 63 3b 09 2f 2a 20 46 69 72 73 74 20 63 68 src;./* First ch
0ca0: 61 72 61 63 74 65 72 20 74 6f 20 70 61 72 73 65 aracter to parse
0cb0: 2e 20 2a 2f 0a 20 20 20 20 20 72 65 67 69 73 74 . */. regist
0cc0: 65 72 20 69 6e 74 20 6e 75 6d 42 79 74 65 73 3b er int numBytes;
0cd0: 09 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f ./* Max number o
0ce0: 66 20 62 79 74 65 73 20 74 6f 20 73 63 61 6e 2e f bytes to scan.
0cf0: 20 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 66 6c 61 */.+ int fla
0d00: 67 73 3b 09 09 09 2f 2a 20 4f 52 2d 65 64 20 62 gs;.../* OR-ed b
0d10: 69 74 73 20 69 6e 64 69 63 61 74 69 6e 67 20 77 its indicating w
0d20: 68 61 74 20 73 75 62 73 74 69 74 75 74 69 6f 6e hat substitution
0d30: 73 0a 2b 09 09 09 09 20 20 20 74 6f 20 70 65 72 s.+.... to per
0d40: 66 6f 72 6d 3a 20 54 43 4c 5f 53 55 42 53 54 5f form: TCL_SUBST_
0d50: 43 4f 4d 4d 41 4e 44 53 2c 0a 2b 09 09 09 09 20 COMMANDS,.+....
0d60: 20 20 54 43 4c 5f 53 55 42 53 54 5f 56 41 52 49 TCL_SUBST_VARI
0d70: 41 42 4c 45 53 2c 20 61 6e 64 20 0a 2b 09 09 09 ABLES, and .+...
0d80: 09 20 20 20 54 43 4c 5f 53 55 42 53 54 5f 42 41 . TCL_SUBST_BA
0d90: 43 4b 53 4c 41 53 48 45 53 20 2a 2f 0a 20 20 20 CKSLASHES */.
0da0: 20 20 69 6e 74 20 6d 61 73 6b 3b 09 09 09 2f 2a int mask;.../*
0db0: 20 53 70 65 63 69 66 69 65 73 20 77 68 65 6e 20 Specifies when
0dc0: 74 6f 20 73 74 6f 70 20 70 61 72 73 69 6e 67 2e to stop parsing.
0dd0: 20 20 54 68 65 0a 20 09 09 09 09 20 2a 20 70 61 The. .... * pa
0de0: 72 73 65 20 73 74 6f 70 73 20 61 74 20 74 68 65 rse stops at the
0df0: 20 66 69 72 73 74 20 75 6e 71 75 6f 74 65 64 0a first unquoted.
0e00: 20 09 09 09 09 20 2a 20 63 68 61 72 61 63 74 65 .... * characte
0e10: 72 20 77 68 6f 73 65 20 43 48 41 52 5f 54 59 50 r whose CHAR_TYP
0e20: 45 20 63 6f 6e 74 61 69 6e 73 0a 40 40 20 2d 37 E contains.@@ -7
0e30: 39 38 2c 36 20 2b 38 30 32 2c 39 20 40 40 0a 20 98,6 +802,9 @@.
0e40: 7b 0a 20 20 20 20 20 63 68 61 72 20 74 79 70 65 {. char type
0e50: 3b 20 0a 20 20 20 20 20 69 6e 74 20 6f 72 69 67 ; . int orig
0e60: 69 6e 61 6c 54 6f 6b 65 6e 73 2c 20 76 61 72 54 inalTokens, varT
0e70: 6f 6b 65 6e 3b 0a 2b 20 20 20 20 69 6e 74 20 6e oken;.+ int n
0e80: 6f 53 75 62 73 74 43 6d 64 73 20 3d 20 21 28 66 oSubstCmds = !(f
0e90: 6c 61 67 73 20 26 20 54 43 4c 5f 53 55 42 53 54 lags & TCL_SUBST
0ea0: 5f 43 4f 4d 4d 41 4e 44 53 29 3b 0a 2b 20 20 20 _COMMANDS);.+
0eb0: 20 69 6e 74 20 6e 6f 53 75 62 73 74 56 61 72 73 int noSubstVars
0ec0: 20 3d 20 21 28 66 6c 61 67 73 20 26 20 54 43 4c = !(flags & TCL
0ed0: 5f 53 55 42 53 54 5f 56 41 52 49 41 42 4c 45 53 _SUBST_VARIABLES
0ee0: 29 3b 0a 2b 20 20 20 20 69 6e 74 20 6e 6f 53 75 );.+ int noSu
0ef0: 62 73 74 42 53 20 3d 20 21 28 66 6c 61 67 73 20 bstBS = !(flags
0f00: 26 20 54 43 4c 5f 53 55 42 53 54 5f 42 41 43 4b & TCL_SUBST_BACK
0f10: 53 4c 41 53 48 45 53 29 3b 0a 20 20 20 20 20 54 SLASHES);. T
0f20: 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 cl_Token *tokenP
0f30: 74 72 3b 0a 20 20 20 20 20 54 63 6c 5f 50 61 72 tr;. Tcl_Par
0f40: 73 65 20 6e 65 73 74 65 64 3b 0a 20 0a 40 40 20 se nested;. .@@
0f50: 2d 38 33 31 2c 36 20 2b 38 33 38 2c 31 33 20 40 -831,6 +838,13 @
0f60: 40 0a 20 09 20 20 20 20 74 6f 6b 65 6e 50 74 72 @. . tokenPtr
0f70: 2d 3e 73 69 7a 65 20 3d 20 73 72 63 20 2d 20 74 ->size = src - t
0f80: 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 3b 0a okenPtr->start;.
0f90: 20 09 20 20 20 20 70 61 72 73 65 50 74 72 2d 3e . parsePtr->
0fa0: 6e 75 6d 54 6f 6b 65 6e 73 2b 2b 3b 0a 20 09 7d numTokens++;. .}
0fb0: 20 65 6c 73 65 20 69 66 20 28 2a 73 72 63 20 3d else if (*src =
0fc0: 3d 20 27 24 27 29 20 7b 0a 2b 09 20 20 20 20 69 = '$') {.+. i
0fd0: 66 20 28 6e 6f 53 75 62 73 74 56 61 72 73 29 20 f (noSubstVars)
0fe0: 7b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 {.+..tokenPtr->t
0ff0: 79 70 65 20 3d 20 54 43 4c 5f 54 4f 4b 45 4e 5f ype = TCL_TOKEN_
1000: 54 45 58 54 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 TEXT;.+..tokenPt
1010: 72 2d 3e 73 69 7a 65 20 3d 20 31 3b 0a 2b 09 09 r->size = 1;.+..
1020: 70 61 72 73 65 50 74 72 2d 3e 6e 75 6d 54 6f 6b parsePtr->numTok
1030: 65 6e 73 2b 2b 3b 0a 2b 09 09 73 72 63 2b 2b 3b ens++;.+..src++;
1040: 20 6e 75 6d 42 79 74 65 73 2d 2d 3b 0a 2b 09 09 numBytes--;.+..
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 2b 09 20 20 20 20 continue;.+.
1060: 7d 0a 20 09 20 20 20 20 2f 2a 0a 20 09 20 20 20 }. . /*. .
1070: 20 20 2a 20 54 68 69 73 20 69 73 20 61 20 76 61 * This is a va
1080: 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 riable reference
1090: 2e 20 20 43 61 6c 6c 20 54 63 6c 5f 50 61 72 73 . Call Tcl_Pars
10a0: 65 56 61 72 4e 61 6d 65 20 74 6f 20 64 6f 0a 20 eVarName to do.
10b0: 09 20 20 20 20 20 2a 20 61 6c 6c 20 74 68 65 20 . * all the
10c0: 64 69 72 74 79 20 77 6f 72 6b 20 6f 66 20 70 61 dirty work of pa
10d0: 72 73 69 6e 67 20 74 68 65 20 6e 61 6d 65 2e 0a rsing the name..
10e0: 40 40 20 2d 38 34 34 2c 36 20 2b 38 35 38 2c 31 @@ -844,6 +858,1
10f0: 33 20 40 40 0a 20 09 20 20 20 20 73 72 63 20 2b 3 @@. . src +
1100: 3d 20 70 61 72 73 65 50 74 72 2d 3e 74 6f 6b 65 = parsePtr->toke
1110: 6e 50 74 72 5b 76 61 72 54 6f 6b 65 6e 5d 2e 73 nPtr[varToken].s
1120: 69 7a 65 3b 0a 20 09 20 20 20 20 6e 75 6d 42 79 ize;. . numBy
1130: 74 65 73 20 2d 3d 20 70 61 72 73 65 50 74 72 2d tes -= parsePtr-
1140: 3e 74 6f 6b 65 6e 50 74 72 5b 76 61 72 54 6f 6b >tokenPtr[varTok
1150: 65 6e 5d 2e 73 69 7a 65 3b 0a 20 09 7d 20 65 6c en].size;. .} el
1160: 73 65 20 69 66 20 28 2a 73 72 63 20 3d 3d 20 27 se if (*src == '
1170: 5b 27 29 20 7b 0a 2b 09 20 20 20 20 69 66 20 28 [') {.+. if (
1180: 6e 6f 53 75 62 73 74 43 6d 64 73 29 20 7b 0a 2b noSubstCmds) {.+
1190: 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 65 ..tokenPtr->type
11a0: 20 3d 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 58 = TCL_TOKEN_TEX
11b0: 54 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e T;.+..tokenPtr->
11c0: 73 69 7a 65 20 3d 20 31 3b 0a 2b 09 09 70 61 72 size = 1;.+..par
11d0: 73 65 50 74 72 2d 3e 6e 75 6d 54 6f 6b 65 6e 73 sePtr->numTokens
11e0: 2b 2b 3b 0a 2b 09 09 73 72 63 2b 2b 3b 20 6e 75 ++;.+..src++; nu
11f0: 6d 42 79 74 65 73 2d 2d 3b 0a 2b 09 09 63 6f 6e mBytes--;.+..con
1200: 74 69 6e 75 65 3b 0a 2b 09 20 20 20 20 7d 0a 20 tinue;.+. }.
1210: 09 20 20 20 20 2f 2a 0a 20 09 20 20 20 20 20 2a . /*. . *
1220: 20 43 6f 6d 6d 61 6e 64 20 73 75 62 73 74 69 74 Command substit
1230: 75 74 69 6f 6e 2e 20 20 43 61 6c 6c 20 54 63 6c ution. Call Tcl
1240: 5f 50 61 72 73 65 43 6f 6d 6d 61 6e 64 20 72 65 _ParseCommand re
1250: 63 75 72 73 69 76 65 6c 79 0a 20 09 20 20 20 20 cursively. .
1260: 20 2a 20 28 61 6e 64 20 72 65 70 65 61 74 65 64 * (and repeated
1270: 6c 79 29 20 74 6f 20 70 61 72 73 65 20 74 68 65 ly) to parse the
1280: 20 6e 65 73 74 65 64 20 63 6f 6d 6d 61 6e 64 28 nested command(
1290: 73 29 2c 20 74 68 65 6e 0a 40 40 20 2d 38 39 36 s), then.@@ -896
12a0: 2c 36 20 2b 39 31 37 2c 31 33 20 40 40 0a 20 09 ,6 +917,13 @@. .
12b0: 20 20 20 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 tokenPtr->si
12c0: 7a 65 20 3d 20 73 72 63 20 2d 20 74 6f 6b 65 6e ze = src - token
12d0: 50 74 72 2d 3e 73 74 61 72 74 3b 0a 20 09 20 20 Ptr->start;. .
12e0: 20 20 70 61 72 73 65 50 74 72 2d 3e 6e 75 6d 54 parsePtr->numT
12f0: 6f 6b 65 6e 73 2b 2b 3b 0a 20 09 7d 20 65 6c 73 okens++;. .} els
1300: 65 20 69 66 20 28 2a 73 72 63 20 3d 3d 20 27 5c e if (*src == '\
1310: 5c 27 29 20 7b 0a 2b 09 20 20 20 20 69 66 20 28 \') {.+. if (
1320: 6e 6f 53 75 62 73 74 42 53 29 20 7b 0a 2b 09 09 noSubstBS) {.+..
1330: 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 65 20 3d tokenPtr->type =
1340: 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 58 54 3b TCL_TOKEN_TEXT;
1350: 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 .+..tokenPtr->si
1360: 7a 65 20 3d 20 31 3b 0a 2b 09 09 70 61 72 73 65 ze = 1;.+..parse
1370: 50 74 72 2d 3e 6e 75 6d 54 6f 6b 65 6e 73 2b 2b Ptr->numTokens++
1380: 3b 0a 2b 09 09 73 72 63 2b 2b 3b 20 6e 75 6d 42 ;.+..src++; numB
1390: 79 74 65 73 2d 2d 3b 0a 2b 09 09 63 6f 6e 74 69 ytes--;.+..conti
13a0: 6e 75 65 3b 0a 2b 09 20 20 20 20 7d 0a 20 09 20 nue;.+. }. .
13b0: 20 20 20 2f 2a 0a 20 09 20 20 20 20 20 2a 20 42 /*. . * B
13c0: 61 63 6b 73 6c 61 73 68 20 73 75 62 73 74 69 74 ackslash substit
13d0: 75 74 69 6f 6e 2e 0a 20 09 20 20 20 20 20 2a 2f ution.. . */
13e0: 0a 40 40 20 2d 31 32 31 30 2c 38 20 2b 31 32 33 .@@ -1210,8 +123
13f0: 38 2c 38 20 40 40 0a 20 09 20 20 20 20 20 2a 20 8,8 @@. . *
1400: 73 69 6e 63 65 20 69 74 20 63 6f 75 6c 64 20 63 since it could c
1410: 6f 6e 74 61 69 6e 20 61 6e 79 20 6e 75 6d 62 65 ontain any numbe
1420: 72 20 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f r of substitutio
1430: 6e 73 2e 0a 20 09 20 20 20 20 20 2a 2f 0a 20 0a ns.. . */. .
1440: 2d 09 20 20 20 20 69 66 20 28 50 61 72 73 65 54 -. if (ParseT
1450: 6f 6b 65 6e 73 28 73 72 63 2b 31 2c 20 6e 75 6d okens(src+1, num
1460: 42 79 74 65 73 2d 31 2c 20 54 59 50 45 5f 43 4c Bytes-1, TYPE_CL
1470: 4f 53 45 5f 50 41 52 45 4e 2c 20 70 61 72 73 65 OSE_PAREN, parse
1480: 50 74 72 29 0a 2d 09 09 20 20 20 20 21 3d 20 54 Ptr).-.. != T
1490: 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 20 20 20 20 69 CL_OK) {.+. i
14a0: 66 20 28 54 43 4c 5f 4f 4b 20 21 3d 20 50 61 72 f (TCL_OK != Par
14b0: 73 65 54 6f 6b 65 6e 73 28 73 72 63 2b 31 2c 20 seTokens(src+1,
14c0: 6e 75 6d 42 79 74 65 73 2d 31 2c 20 54 59 50 45 numBytes-1, TYPE
14d0: 5f 43 4c 4f 53 45 5f 50 41 52 45 4e 2c 0a 2b 09 _CLOSE_PAREN,.+.
14e0: 09 20 20 20 20 54 43 4c 5f 53 55 42 53 54 5f 41 . TCL_SUBST_A
14f0: 4c 4c 2c 20 70 61 72 73 65 50 74 72 29 29 20 7b LL, parsePtr)) {
1500: 0a 20 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a . ..goto error;.
1510: 20 09 20 20 20 20 7d 0a 20 09 20 20 20 20 69 66 . }. . if
1520: 20 28 28 70 61 72 73 65 50 74 72 2d 3e 74 65 72 ((parsePtr->ter
1530: 6d 20 3d 3d 20 28 73 72 63 20 2b 20 6e 75 6d 42 m == (src + numB
1540: 79 74 65 73 29 29 20 0a 40 40 20 2d 31 33 30 32 ytes)) .@@ -1302
1550: 2c 37 20 2b 31 33 33 30 2c 37 20 40 40 0a 20 09 ,7 +1330,7 @@. .
1560: 72 65 74 75 72 6e 20 22 24 22 3b 0a 20 20 20 20 return "$";.
1570: 20 7d 0a 20 0a 2d 20 20 20 20 63 6f 64 65 20 3d }. .- code =
1580: 20 54 63 6c 5f 45 76 61 6c 54 6f 6b 65 6e 73 53 Tcl_EvalTokensS
1590: 74 61 6e 64 61 72 64 28 69 6e 74 65 72 70 2c 20 tandard(interp,
15a0: 70 61 72 73 65 2e 74 6f 6b 65 6e 50 74 72 2c 20 parse.tokenPtr,
15b0: 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 29 parse.numTokens)
15c0: 3b 0a 2b 20 20 20 20 63 6f 64 65 20 3d 20 54 63 ;.+ code = Tc
15d0: 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 lSubstTokens(int
15e0: 65 72 70 2c 20 70 61 72 73 65 2e 74 6f 6b 65 6e erp, parse.token
15f0: 50 74 72 2c 20 70 61 72 73 65 2e 6e 75 6d 54 6f Ptr, parse.numTo
1600: 6b 65 6e 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 kens, NULL);.
1610: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
1620: 4c 5f 4f 4b 29 20 7b 0a 20 09 72 65 74 75 72 6e L_OK) {. .return
1630: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 7d 0a 40 40 NULL;. }.@@
1640: 20 2d 31 36 30 36 2c 37 20 2b 31 36 33 34 2c 38 -1606,7 +1634,8
1650: 20 40 40 0a 20 09 70 61 72 73 65 50 74 72 2d 3e @@. .parsePtr->
1660: 65 72 72 6f 72 54 79 70 65 20 3d 20 54 43 4c 5f errorType = TCL_
1670: 50 41 52 53 45 5f 53 55 43 43 45 53 53 3b 0a 20 PARSE_SUCCESS;.
1680: 20 20 20 20 7d 0a 20 20 20 20 20 0a 2d 20 20 20 }. .-
1690: 20 69 66 20 28 50 61 72 73 65 54 6f 6b 65 6e 73 if (ParseTokens
16a0: 28 73 74 72 69 6e 67 2b 31 2c 20 6e 75 6d 42 79 (string+1, numBy
16b0: 74 65 73 2d 31 2c 20 54 59 50 45 5f 51 55 4f 54 tes-1, TYPE_QUOT
16c0: 45 2c 20 70 61 72 73 65 50 74 72 29 20 21 3d 20 E, parsePtr) !=
16d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 20 20 20 20 69 TCL_OK) {.+ i
16e0: 66 20 28 54 43 4c 5f 4f 4b 20 21 3d 20 50 61 72 f (TCL_OK != Par
16f0: 73 65 54 6f 6b 65 6e 73 28 73 74 72 69 6e 67 2b seTokens(string+
1700: 31 2c 20 6e 75 6d 42 79 74 65 73 2d 31 2c 20 54 1, numBytes-1, T
1710: 59 50 45 5f 51 55 4f 54 45 2c 0a 2b 09 20 20 20 YPE_QUOTE,.+.
1720: 20 54 43 4c 5f 53 55 42 53 54 5f 41 4c 4c 2c 20 TCL_SUBST_ALL,
1730: 70 61 72 73 65 50 74 72 29 29 20 7b 0a 20 09 67 parsePtr)) {. .g
1740: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 oto error;.
1750: 7d 0a 20 20 20 20 20 69 66 20 28 2a 70 61 72 73 }. if (*pars
1760: 65 50 74 72 2d 3e 74 65 72 6d 20 21 3d 20 27 22 ePtr->term != '"
1770: 27 29 20 7b 0a 40 40 20 2d 31 36 32 38 2c 36 20 ') {.@@ -1628,6
1780: 2b 31 36 35 37 2c 32 36 31 20 40 40 0a 20 20 20 +1657,261 @@.
1790: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
17a0: 4f 52 3b 0a 20 7d 0a 20 0a 2b 2f 2a 0a 2b 20 2a OR;. }. .+/*.+ *
17b0: 2d 2d 2d 2d 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 0a 2b 20 2a 0a 2b 20 2a 20 54 ------.+ *.+ * T
1800: 63 6c 5f 53 75 62 73 74 4f 62 6a 20 2d 2d 0a 2b cl_SubstObj --.+
1810: 20 2a 0a 2b 20 2a 20 20 20 20 20 20 54 68 69 73 *.+ * This
1820: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 function perfor
1830: 6d 73 20 74 68 65 20 73 75 62 73 74 69 74 75 74 ms the substitut
1840: 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 6f ions specified o
1850: 6e 20 74 68 65 0a 2b 20 2a 20 20 20 20 20 20 67 n the.+ * g
1860: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 64 iven string as d
1870: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 escribed in the
1880: 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 user documentati
1890: 6f 6e 20 66 6f 72 20 74 68 65 0a 2b 20 2a 20 20 on for the.+ *
18a0: 20 20 20 20 22 73 75 62 73 74 22 20 54 63 6c 20 "subst" Tcl
18b0: 63 6f 6d 6d 61 6e 64 2e 20 20 20 20 20 20 20 0a command. .
18c0: 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c 74 73 3a + *.+ * Results:
18d0: 0a 2b 20 2a 20 20 20 20 20 20 41 20 54 63 6c 5f .+ * A Tcl_
18e0: 4f 62 6a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 Obj* containing
18f0: 74 68 65 20 73 75 62 73 74 69 74 75 74 65 64 20 the substituted
1900: 73 74 72 69 6e 67 2c 20 6f 72 20 4e 55 4c 4c 20 string, or NULL
1910: 74 6f 0a 2b 20 2a 20 20 20 20 20 20 69 6e 64 69 to.+ * indi
1920: 63 61 74 65 20 74 68 61 74 20 61 6e 20 65 72 72 cate that an err
1930: 6f 72 20 6f 63 63 75 72 72 65 64 2e 0a 2b 20 2a or occurred..+ *
1940: 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 .+ * Side effect
1950: 73 3a 0a 2b 20 2a 20 20 20 20 20 20 53 65 65 20 s:.+ * See
1960: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
1970: 74 61 74 69 6f 6e 2e 0a 2b 20 2a 0a 2b 20 2a 2d tation..+ *.+ *-
1980: 2d 2d 2d 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 0a 2b 20 2a 2f 0a 2b 0a 2b 54 63 -----.+ */.+.+Tc
19d0: 6c 5f 4f 62 6a 20 2a 0a 2b 54 63 6c 5f 53 75 62 l_Obj *.+Tcl_Sub
19e0: 73 74 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 stObj(interp, ob
19f0: 6a 50 74 72 2c 20 66 6c 61 67 73 29 0a 2b 20 20 jPtr, flags).+
1a00: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
1a10: 74 65 72 70 3b 09 2f 2a 20 49 6e 74 65 72 70 72 terp;./* Interpr
1a20: 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 73 75 eter in which su
1a30: 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 bstitution occur
1a40: 73 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f 4f 62 s */.+ Tcl_Ob
1a50: 6a 20 2a 6f 62 6a 50 74 72 3b 09 2f 2a 20 54 68 j *objPtr;./* Th
1a60: 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 73 75 e value to be su
1a70: 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 2b 20 20 bstituted */.+
1a80: 20 20 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a int flags;../*
1a90: 20 57 68 61 74 20 73 75 62 73 74 69 74 75 74 69 What substituti
1aa0: 6f 6e 73 20 74 6f 20 64 6f 20 2a 2f 0a 2b 7b 0a ons to do */.+{.
1ab0: 2b 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 2c + int length,
1ac0: 20 74 6f 6b 65 6e 73 4c 65 66 74 2c 20 63 6f 64 tokensLeft, cod
1ad0: 65 3b 0a 2b 20 20 20 20 54 63 6c 5f 50 61 72 73 e;.+ Tcl_Pars
1ae0: 65 20 70 61 72 73 65 3b 0a 2b 20 20 20 20 54 63 e parse;.+ Tc
1af0: 6c 5f 54 6f 6b 65 6e 20 2a 65 6e 64 54 6f 6b 65 l_Token *endToke
1b00: 6e 50 74 72 3b 0a 2b 20 20 20 20 54 63 6c 5f 4f nPtr;.+ Tcl_O
1b10: 62 6a 20 2a 72 65 73 75 6c 74 3b 0a 2b 20 20 20 bj *result;.+
1b20: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 70 20 3d CONST char *p =
1b30: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
1b40: 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 26 6c omObj(objPtr, &l
1b50: 65 6e 67 74 68 29 3b 0a 2b 0a 2b 20 20 20 20 70 ength);.+.+ p
1b60: 61 72 73 65 2e 74 6f 6b 65 6e 50 74 72 20 3d 20 arse.tokenPtr =
1b70: 70 61 72 73 65 2e 73 74 61 74 69 63 54 6f 6b 65 parse.staticToke
1b80: 6e 73 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e 6e ns;.+ parse.n
1b90: 75 6d 54 6f 6b 65 6e 73 20 3d 20 30 3b 0a 2b 20 umTokens = 0;.+
1ba0: 20 20 20 70 61 72 73 65 2e 74 6f 6b 65 6e 73 41 parse.tokensA
1bb0: 76 61 69 6c 61 62 6c 65 20 3d 20 4e 55 4d 5f 53 vailable = NUM_S
1bc0: 54 41 54 49 43 5f 54 4f 4b 45 4e 53 3b 0a 2b 20 TATIC_TOKENS;.+
1bd0: 20 20 20 70 61 72 73 65 2e 73 74 72 69 6e 67 20 parse.string
1be0: 3d 20 70 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e = p;.+ parse.
1bf0: 65 6e 64 20 3d 20 70 20 2b 20 6c 65 6e 67 74 68 end = p + length
1c00: 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e 74 65 72 ;.+ parse.ter
1c10: 6d 20 3d 20 70 61 72 73 65 2e 65 6e 64 3b 0a 2b m = parse.end;.+
1c20: 20 20 20 20 70 61 72 73 65 2e 69 6e 74 65 72 70 parse.interp
1c30: 20 3d 20 69 6e 74 65 72 70 3b 0a 2b 20 20 20 20 = interp;.+
1c40: 70 61 72 73 65 2e 69 6e 63 6f 6d 70 6c 65 74 65 parse.incomplete
1c50: 20 3d 20 30 3b 0a 2b 20 20 20 20 70 61 72 73 65 = 0;.+ parse
1c60: 2e 65 72 72 6f 72 54 79 70 65 20 3d 20 54 43 4c .errorType = TCL
1c70: 5f 50 41 52 53 45 5f 53 55 43 43 45 53 53 3b 0a _PARSE_SUCCESS;.
1c80: 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 +.+ /*.+
1c90: 2a 20 46 69 72 73 74 20 70 61 72 73 65 20 74 68 * First parse th
1ca0: 65 20 73 74 72 69 6e 67 20 72 65 70 20 6f 66 20 e string rep of
1cb0: 6f 62 6a 50 74 72 2c 20 61 73 20 69 66 20 69 74 objPtr, as if it
1cc0: 20 77 65 72 65 20 65 6e 63 6c 6f 73 65 64 0a 2b were enclosed.+
1cd0: 20 20 20 20 20 2a 20 61 73 20 61 20 22 2d 71 75 * as a "-qu
1ce0: 6f 74 65 64 20 77 6f 72 64 20 69 6e 20 61 20 6e oted word in a n
1cf0: 6f 72 6d 61 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e ormal Tcl comman
1d00: 64 2e 20 20 50 61 72 73 65 20 65 72 72 6f 72 73 d. Parse errors
1d10: 0a 2b 20 20 20 20 20 2a 20 63 61 75 73 65 20 69 .+ * cause i
1d20: 6d 6d 65 64 69 61 74 65 20 65 72 72 6f 72 20 72 mmediate error r
1d30: 65 70 6f 72 74 69 6e 67 2e 20 20 48 6f 6e 6f 72 eporting. Honor
1d40: 20 66 6c 61 67 73 20 74 68 61 74 20 73 65 6c 65 flags that sele
1d50: 63 74 69 76 65 6c 79 0a 2b 20 20 20 20 20 2a 20 ctively.+ *
1d60: 69 6e 68 69 62 69 74 20 74 79 70 65 73 20 6f 66 inhibit types of
1d70: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 2e 0a 2b substitution..+
1d80: 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69 */.+.+ i
1d90: 66 20 28 54 43 4c 5f 4f 4b 20 21 3d 20 50 61 72 f (TCL_OK != Par
1da0: 73 65 54 6f 6b 65 6e 73 28 70 2c 20 6c 65 6e 67 seTokens(p, leng
1db0: 74 68 2c 20 2f 2a 20 6d 61 73 6b 20 2a 2f 20 30 th, /* mask */ 0
1dc0: 2c 20 66 6c 61 67 73 2c 20 26 70 61 72 73 65 29 , flags, &parse)
1dd0: 29 20 7b 0a 2b 09 72 65 74 75 72 6e 20 4e 55 4c ) {.+.return NUL
1de0: 4c 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 L;.+ }.+.+
1df0: 20 2f 2a 20 4e 65 78 74 2c 20 73 75 62 73 74 69 /* Next, substi
1e00: 74 75 74 65 20 74 68 65 20 70 61 72 73 65 64 20 tute the parsed
1e10: 74 6f 6b 65 6e 73 20 6a 75 73 74 20 61 73 20 69 tokens just as i
1e20: 6e 20 6e 6f 72 6d 61 6c 20 54 63 6c 20 65 76 61 n normal Tcl eva
1e30: 6c 75 61 74 69 6f 6e 20 2a 2f 0a 2b 20 20 20 20 luation */.+
1e40: 65 6e 64 54 6f 6b 65 6e 50 74 72 20 3d 20 70 61 endTokenPtr = pa
1e50: 72 73 65 2e 74 6f 6b 65 6e 50 74 72 20 2b 20 70 rse.tokenPtr + p
1e60: 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 3b 0a arse.numTokens;.
1e70: 2b 20 20 20 20 74 6f 6b 65 6e 73 4c 65 66 74 20 + tokensLeft
1e80: 3d 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e = parse.numToken
1e90: 73 3b 0a 2b 20 20 20 20 63 6f 64 65 20 3d 20 54 s;.+ code = T
1ea0: 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e clSubstTokens(in
1eb0: 74 65 72 70 2c 20 65 6e 64 54 6f 6b 65 6e 50 74 terp, endTokenPt
1ec0: 72 20 2d 20 74 6f 6b 65 6e 73 4c 65 66 74 2c 20 r - tokensLeft,
1ed0: 74 6f 6b 65 6e 73 4c 65 66 74 2c 0a 2b 09 20 20 tokensLeft,.+.
1ee0: 20 20 26 74 6f 6b 65 6e 73 4c 65 66 74 29 3b 0a &tokensLeft);.
1ef0: 2b 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d + if (code ==
1f00: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 54 63 6c TCL_OK) {.+.Tcl
1f10: 5f 46 72 65 65 50 61 72 73 65 28 26 70 61 72 73 _FreeParse(&pars
1f20: 65 29 3b 0a 2b 09 72 65 74 75 72 6e 20 54 63 6c e);.+.return Tcl
1f30: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
1f40: 74 65 72 70 29 3b 0a 2b 20 20 20 20 7d 0a 2b 20 terp);.+ }.+
1f50: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f result = Tcl_
1f60: 4e 65 77 4f 62 6a 28 29 3b 0a 2b 20 20 20 20 77 NewObj();.+ w
1f70: 68 69 6c 65 20 28 31 29 20 7b 0a 2b 09 73 77 69 hile (1) {.+.swi
1f80: 74 63 68 20 28 63 6f 64 65 29 20 7b 0a 2b 09 20 tch (code) {.+.
1f90: 20 20 20 63 61 73 65 20 54 43 4c 5f 45 52 52 4f case TCL_ERRO
1fa0: 52 3a 0a 2b 09 09 54 63 6c 5f 46 72 65 65 50 61 R:.+..Tcl_FreePa
1fb0: 72 73 65 28 26 70 61 72 73 65 29 3b 0a 2b 09 09 rse(&parse);.+..
1fc0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
1fd0: 28 72 65 73 75 6c 74 29 3b 0a 2b 09 09 72 65 74 (result);.+..ret
1fe0: 75 72 6e 20 4e 55 4c 4c 3b 0a 2b 09 20 20 20 20 urn NULL;.+.
1ff0: 63 61 73 65 20 54 43 4c 5f 42 52 45 41 4b 3a 0a case TCL_BREAK:.
2000: 2b 09 09 74 6f 6b 65 6e 73 4c 65 66 74 20 3d 20 +..tokensLeft =
2010: 30 3b 09 09 2f 2a 20 48 61 6c 74 20 73 75 62 73 0;../* Halt subs
2020: 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 2b 09 20 20 titution */.+.
2030: 20 20 64 65 66 61 75 6c 74 3a 0a 2b 09 09 54 63 default:.+..Tc
2040: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a l_AppendObjToObj
2050: 28 72 65 73 75 6c 74 2c 20 54 63 6c 5f 47 65 74 (result, Tcl_Get
2060: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
2070: 29 29 3b 0a 2b 09 7d 0a 2b 0a 2b 09 69 66 20 28 ));.+.}.+.+.if (
2080: 74 6f 6b 65 6e 73 4c 65 66 74 20 3d 3d 20 30 29 tokensLeft == 0)
2090: 20 7b 0a 2b 09 20 20 20 20 54 63 6c 5f 46 72 65 {.+. Tcl_Fre
20a0: 65 50 61 72 73 65 28 26 70 61 72 73 65 29 3b 0a eParse(&parse);.
20b0: 2b 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 +. return res
20c0: 75 6c 74 3b 0a 2b 09 7d 0a 2b 0a 2b 09 63 6f 64 ult;.+.}.+.+.cod
20d0: 65 20 3d 20 54 63 6c 53 75 62 73 74 54 6f 6b 65 e = TclSubstToke
20e0: 6e 73 28 69 6e 74 65 72 70 2c 20 65 6e 64 54 6f ns(interp, endTo
20f0: 6b 65 6e 50 74 72 20 2d 20 74 6f 6b 65 6e 73 4c kenPtr - tokensL
2100: 65 66 74 2c 20 74 6f 6b 65 6e 73 4c 65 66 74 2c eft, tokensLeft,
2110: 0a 2b 09 09 26 74 6f 6b 65 6e 73 4c 65 66 74 29 .+..&tokensLeft)
2120: 3b 0a 2b 20 20 20 20 7d 0a 2b 7d 0a 2b 2f 2a 0a ;.+ }.+}.+/*.
2130: 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d + *-------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 2b 20 2a 0a 2b 20 ---------.+ *.+
2180: 2a 20 54 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 * TclSubstTokens
2190: 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 41 63 63 65 --.+ *.+ *.Acce
21a0: 70 74 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 pts an array of
21b0: 63 6f 75 6e 74 20 54 63 6c 5f 54 6f 6b 65 6e 27 count Tcl_Token'
21c0: 73 2c 20 61 6e 64 20 63 72 65 61 74 65 73 20 61 s, and creates a
21d0: 20 72 65 73 75 6c 74 0a 2b 20 2a 09 76 61 6c 75 result.+ *.valu
21e0: 65 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 20 e in the interp
21f0: 66 72 6f 6d 20 63 6f 6e 63 61 74 65 6e 61 74 69 from concatenati
2200: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f ng the results o
2210: 66 20 0a 2b 20 2a 09 70 65 72 66 6f 72 6d 69 6e f .+ *.performin
2220: 67 20 54 63 6c 20 73 75 62 73 74 69 74 75 74 69 g Tcl substituti
2230: 6f 6e 20 6f 6e 20 65 61 63 68 20 54 63 6c 5f 54 on on each Tcl_T
2240: 6f 6b 65 6e 2e 20 20 53 75 62 73 74 69 74 75 74 oken. Substitut
2250: 69 6f 6e 0a 2b 20 2a 09 69 73 20 69 6e 74 65 72 ion.+ *.is inter
2260: 72 75 70 74 65 64 20 69 66 20 61 6e 79 20 6e 6f rupted if any no
2270: 6e 2d 54 43 4c 5f 4f 4b 20 63 6f 6d 70 6c 65 74 n-TCL_OK complet
2280: 69 6f 6e 20 63 6f 64 65 20 61 72 69 73 65 73 2e ion code arises.
2290: 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c 74 73 .+ *.+ * Results
22a0: 3a 0a 2b 20 2a 20 09 54 68 65 20 72 65 74 75 72 :.+ * .The retur
22b0: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 61 n value is a sta
22c0: 6e 64 61 72 64 20 54 63 6c 20 63 6f 6d 70 6c 65 ndard Tcl comple
22d0: 74 69 6f 6e 20 63 6f 64 65 2e 20 20 54 68 65 0a tion code. The.
22e0: 2b 20 2a 20 09 72 65 73 75 6c 74 20 69 6e 20 69 + * .result in i
22f0: 6e 74 65 72 70 20 69 73 20 74 68 65 20 73 75 62 nterp is the sub
2300: 73 74 69 74 75 74 65 64 20 76 61 6c 75 65 2c 20 stituted value,
2310: 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 or an error mess
2320: 61 67 65 0a 2b 20 2a 20 09 69 66 20 54 43 4c 5f age.+ * .if TCL_
2330: 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 ERROR is returne
2340: 64 2e 20 20 49 66 20 74 6f 6b 65 6e 73 4c 65 66 d. If tokensLef
2350: 74 50 74 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c tPtr is not NULL
2360: 2c 20 74 68 65 6e 0a 2b 20 2a 20 09 69 74 20 70 , then.+ * .it p
2370: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 74 20 oints to an int
2380: 77 68 65 72 65 20 74 68 65 20 6e 75 6d 62 65 72 where the number
2390: 20 6f 66 20 74 6f 6b 65 6e 73 20 72 65 6d 61 69 of tokens remai
23a0: 6e 69 6e 67 20 74 6f 0a 2b 20 2a 20 09 62 65 20 ning to.+ * .be
23b0: 70 72 6f 63 65 73 73 65 64 20 69 73 20 77 72 69 processed is wri
23c0: 74 74 65 6e 2e 0a 2b 20 2a 0a 2b 20 2a 20 53 69 tten..+ *.+ * Si
23d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 2b 20 2a 20 de effects:.+ *
23e0: 09 43 61 6e 20 62 65 20 61 6e 79 74 68 69 6e 67 .Can be anything
23f0: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 , depending on t
2400: 68 65 20 74 79 70 65 73 20 6f 66 20 73 75 62 73 he types of subs
2410: 74 69 74 75 74 69 6f 6e 20 64 6f 6e 65 2e 0a 2b titution done..+
2420: 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.+ *----------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a ------------.+ *
2470: 2f 0a 2b 0a 2b 69 6e 74 0a 2b 54 63 6c 53 75 62 /.+.+int.+TclSub
2480: 73 74 54 6f 6b 65 6e 73 28 69 6e 74 65 72 70 2c stTokens(interp,
2490: 20 74 6f 6b 65 6e 50 74 72 2c 20 63 6f 75 6e 74 tokenPtr, count
24a0: 2c 20 74 6f 6b 65 6e 73 4c 65 66 74 50 74 72 29 , tokensLeftPtr)
24b0: 0a 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .+ Tcl_Interp
24c0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 *interp;
24d0: 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 /* Interpreter
24e0: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6c 6f 6f in which to loo
24f0: 6b 75 70 0a 2b 20 20 20 20 20 20 20 20 20 20 20 kup.+
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2510: 20 20 20 20 20 20 2a 20 76 61 72 69 61 62 6c 65 * variable
2520: 73 2c 20 65 78 65 63 75 74 65 20 6e 65 73 74 65 s, execute neste
2530: 64 20 63 6f 6d 6d 61 6e 64 73 2c 0a 2b 20 20 20 d commands,.+
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 *
2560: 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 and report error
2570: 73 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f 54 s. */.+ Tcl_T
2580: 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 3b 20 oken *tokenPtr;
2590: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
25a0: 72 20 74 6f 20 66 69 72 73 74 20 69 6e 20 61 6e r to first in an
25b0: 20 61 72 72 61 79 20 6f 66 20 74 6f 6b 65 6e 73 array of tokens
25c0: 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .+
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25e0: 20 20 20 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 * to evaluate
25f0: 20 61 6e 64 20 63 6f 6e 63 61 74 65 6e 61 74 65 and concatenate
2600: 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 63 6f . */.+ int co
2610: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 unt;
2620: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
2630: 6f 66 20 74 6f 6b 65 6e 73 20 74 6f 20 63 6f 6e of tokens to con
2640: 73 69 64 65 72 20 61 74 20 74 6f 6b 65 6e 50 74 sider at tokenPt
2650: 72 2e 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 r..+
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2670: 20 20 20 20 20 2a 20 4d 75 73 74 20 62 65 20 61 * Must be a
2680: 74 20 6c 65 61 73 74 20 31 2e 20 2a 2f 0a 2b 20 t least 1. */.+
2690: 20 20 20 69 6e 74 20 2a 74 6f 6b 65 6e 73 4c 65 int *tokensLe
26a0: 66 74 50 74 72 3b 09 09 2f 2a 20 49 66 20 6e 6f ftPtr;../* If no
26b0: 74 20 4e 55 4c 4c 2c 20 70 6f 69 6e 74 73 20 74 t NULL, points t
26c0: 6f 20 6d 65 6d 6f 72 79 20 77 68 65 72 65 20 61 o memory where a
26d0: 6e 0a 2b 09 09 09 09 20 2a 20 69 6e 74 65 67 65 n.+.... * intege
26e0: 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 r representing t
26f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b he number of tok
2700: 65 6e 73 0a 2b 09 09 09 09 20 2a 20 6c 65 66 74 ens.+.... * left
2710: 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 to be substitut
2720: 65 64 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 ed will be writt
2730: 65 6e 20 2a 2f 0a 2b 7b 0a 2b 20 20 20 20 54 63 en */.+{.+ Tc
2740: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 3b 0a 2b l_Obj *result;.+
2750: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 54 int code = T
2760: 43 4c 5f 4f 4b 3b 0a 2b 0a 2b 20 20 20 20 2f 2a CL_OK;.+.+ /*
2770: 0a 2b 20 20 20 20 20 2a 20 45 61 63 68 20 70 61 .+ * Each pa
2780: 73 73 20 74 68 72 6f 75 67 68 20 74 68 69 73 20 ss through this
2790: 6c 6f 6f 70 20 77 69 6c 6c 20 73 75 62 73 74 69 loop will substi
27a0: 74 75 74 65 20 6f 6e 65 20 74 6f 6b 65 6e 2c 20 tute one token,
27b0: 61 6e 64 20 69 74 73 0a 2b 20 20 20 20 20 2a 20 and its.+ *
27c0: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 components, if a
27d0: 6e 79 2e 20 20 54 68 65 20 6f 6e 6c 79 20 74 68 ny. The only th
27e0: 69 6e 67 20 74 72 69 63 6b 79 20 68 65 72 65 20 ing tricky here
27f0: 69 73 20 74 68 61 74 20 77 65 20 67 6f 20 74 6f is that we go to
2800: 0a 2b 20 20 20 20 20 2a 20 73 6f 6d 65 20 65 66 .+ * some ef
2810: 66 6f 72 74 20 74 6f 20 70 61 73 73 20 54 63 6c fort to pass Tcl
2820: 5f 4f 62 6a 27 73 20 74 68 72 6f 75 67 68 20 75 _Obj's through u
2830: 6e 74 6f 75 63 68 65 64 2c 20 74 6f 20 61 76 6f ntouched, to avo
2840: 69 64 20 73 74 72 69 6e 67 0a 2b 20 20 20 20 20 id string.+
2850: 2a 20 63 6f 70 79 69 6e 67 20 61 6e 64 20 54 63 * copying and Tc
2860: 6c 5f 4f 62 6a 20 63 72 65 61 74 69 6f 6e 20 69 l_Obj creation i
2870: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 6f 20 61 f possible, to a
2880: 69 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 id performance a
2890: 6e 64 0a 2b 20 20 20 20 20 2a 20 6c 69 6d 69 74 nd.+ * limit
28a0: 20 73 68 69 6d 6d 65 72 69 6e 67 2e 0a 2b 20 20 shimmering..+
28b0: 20 20 20 2a 0a 2b 20 20 20 20 20 2a 20 46 75 72 *.+ * Fur
28c0: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f ther optimizatio
28d0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 n opportunities
28e0: 6d 69 67 68 74 20 62 65 20 74 6f 20 63 68 65 63 might be to chec
28f0: 6b 20 66 6f 72 20 74 68 65 0a 2b 20 20 20 20 20 k for the.+
2900: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 * equivalent of
2910: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
2920: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
2930: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
2940: 29 29 0a 2b 20 20 20 20 20 2a 20 61 6e 64 20 6f )).+ * and o
2950: 6d 69 74 20 74 68 65 6d 2e 0a 2b 20 20 20 20 20 mit them..+
2960: 2a 2f 0a 2b 0a 2b 20 20 20 20 72 65 73 75 6c 74 */.+.+ result
2970: 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 20 20 20 66 6f = NULL;.+ fo
2980: 72 20 28 20 3b 20 28 63 6f 75 6e 74 20 3e 20 30 r ( ; (count > 0
2990: 29 20 26 26 20 28 63 6f 64 65 20 3d 3d 20 54 43 ) && (code == TC
29a0: 4c 5f 4f 4b 29 3b 20 63 6f 75 6e 74 2d 2d 2c 20 L_OK); count--,
29b0: 74 6f 6b 65 6e 50 74 72 2b 2b 29 20 7b 0a 2b 09 tokenPtr++) {.+.
29c0: 54 63 6c 5f 4f 62 6a 20 2a 61 70 70 65 6e 64 4f Tcl_Obj *appendO
29d0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 43 4f 4e bj = NULL;.+.CON
29e0: 53 54 20 63 68 61 72 20 2a 61 70 70 65 6e 64 20 ST char *append
29f0: 3d 20 4e 55 4c 4c 3b 0a 2b 09 69 6e 74 20 61 70 = NULL;.+.int ap
2a00: 70 65 6e 64 42 79 74 65 4c 65 6e 67 74 68 20 3d pendByteLength =
2a10: 20 30 3b 0a 2b 0a 2b 09 73 77 69 74 63 68 20 28 0;.+.+.switch (
2a20: 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 65 29 20 tokenPtr->type)
2a30: 7b 0a 2b 09 20 20 20 20 63 61 73 65 20 54 43 4c {.+. case TCL
2a40: 5f 54 4f 4b 45 4e 5f 54 45 58 54 3a 0a 2b 09 09 _TOKEN_TEXT:.+..
2a50: 61 70 70 65 6e 64 20 3d 20 74 6f 6b 65 6e 50 74 append = tokenPt
2a60: 72 2d 3e 73 74 61 72 74 3b 0a 2b 09 09 61 70 70 r->start;.+..app
2a70: 65 6e 64 42 79 74 65 4c 65 6e 67 74 68 20 3d 20 endByteLength =
2a80: 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 7a 65 3b 0a tokenPtr->size;.
2a90: 2b 09 09 62 72 65 61 6b 3b 0a 2b 0a 2b 09 20 20 +..break;.+.+.
2aa0: 20 20 63 61 73 65 20 54 43 4c 5f 54 4f 4b 45 4e case TCL_TOKEN
2ab0: 5f 42 53 3a 20 7b 0a 2b 09 09 63 68 61 72 20 75 _BS: {.+..char u
2ac0: 74 66 43 68 61 72 42 79 74 65 73 5b 54 43 4c 5f tfCharBytes[TCL_
2ad0: 55 54 46 5f 4d 41 58 5d 3b 0a 2b 09 09 61 70 70 UTF_MAX];.+..app
2ae0: 65 6e 64 42 79 74 65 4c 65 6e 67 74 68 20 3d 20 endByteLength =
2af0: 54 63 6c 5f 55 74 66 42 61 63 6b 73 6c 61 73 68 Tcl_UtfBackslash
2b00: 28 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 (tokenPtr->start
2b10: 2c 0a 2b 09 09 09 28 69 6e 74 20 2a 29 20 4e 55 ,.+...(int *) NU
2b20: 4c 4c 2c 20 75 74 66 43 68 61 72 42 79 74 65 73 LL, utfCharBytes
2b30: 29 3b 0a 2b 09 09 61 70 70 65 6e 64 20 3d 20 75 );.+..append = u
2b40: 74 66 43 68 61 72 42 79 74 65 73 3b 0a 2b 09 09 tfCharBytes;.+..
2b50: 62 72 65 61 6b 3b 0a 2b 09 20 20 20 20 7d 0a 2b break;.+. }.+
2b60: 0a 2b 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f .+. case TCL_
2b70: 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 4e 44 3a 0a 2b TOKEN_COMMAND:.+
2b80: 09 09 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 ..code = Tcl_Eva
2b90: 6c 45 78 28 69 6e 74 65 72 70 2c 20 74 6f 6b 65 lEx(interp, toke
2ba0: 6e 50 74 72 2d 3e 73 74 61 72 74 2b 31 2c 20 74 nPtr->start+1, t
2bb0: 6f 6b 65 6e 50 74 72 2d 3e 73 69 7a 65 2d 32 2c okenPtr->size-2,
2bc0: 0a 2b 09 09 09 30 29 3b 0a 2b 09 09 61 70 70 65 .+...0);.+..appe
2bd0: 6e 64 4f 62 6a 20 3d 20 54 63 6c 5f 47 65 74 4f ndObj = Tcl_GetO
2be0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
2bf0: 3b 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b 0a 2b 09 ;.+..break;.+.+.
2c00: 20 20 20 20 63 61 73 65 20 54 43 4c 5f 54 4f 4b case TCL_TOK
2c10: 45 4e 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 2b EN_VARIABLE: {.+
2c20: 09 09 54 63 6c 5f 4f 62 6a 20 2a 61 72 72 61 79 ..Tcl_Obj *array
2c30: 49 6e 64 65 78 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 Index = NULL;.+.
2c40: 09 54 63 6c 5f 4f 62 6a 20 2a 76 61 72 4e 61 6d .Tcl_Obj *varNam
2c50: 65 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 09 69 66 20 e = NULL;.+..if
2c60: 28 74 6f 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f (tokenPtr->numCo
2c70: 6d 70 6f 6e 65 6e 74 73 20 3e 20 31 29 20 7b 0a mponents > 1) {.
2c80: 2b 09 09 20 20 20 20 2f 2a 20 53 75 62 73 74 20 +.. /* Subst
2c90: 74 68 65 20 69 6e 64 65 78 20 70 61 72 74 20 6f the index part o
2ca0: 66 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 f an array varia
2cb0: 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f ble reference */
2cc0: 0a 2b 09 09 20 20 20 20 63 6f 64 65 20 3d 20 54 .+.. code = T
2cd0: 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e clSubstTokens(in
2ce0: 74 65 72 70 2c 20 74 6f 6b 65 6e 50 74 72 2b 32 terp, tokenPtr+2
2cf0: 2c 0a 2b 09 09 09 20 20 20 20 74 6f 6b 65 6e 50 ,.+... tokenP
2d00: 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 tr->numComponent
2d10: 73 20 2d 20 31 2c 20 4e 55 4c 4c 29 3b 0a 2b 09 s - 1, NULL);.+.
2d20: 09 20 20 20 20 61 72 72 61 79 49 6e 64 65 78 20 . arrayIndex
2d30: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 = Tcl_GetObjResu
2d40: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 2b 09 09 20 lt(interp);.+..
2d50: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
2d60: 75 6e 74 28 61 72 72 61 79 49 6e 64 65 78 29 3b unt(arrayIndex);
2d70: 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 69 66 20 28 63 .+..}.+.+..if (c
2d80: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
2d90: 0a 2b 09 09 20 20 20 20 76 61 72 4e 61 6d 65 20 .+.. varName
2da0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
2db0: 62 6a 28 74 6f 6b 65 6e 50 74 72 5b 31 5d 2e 73 bj(tokenPtr[1].s
2dc0: 74 61 72 74 2c 0a 2b 09 09 09 20 20 20 20 74 6f tart,.+... to
2dd0: 6b 65 6e 50 74 72 5b 31 5d 2e 73 69 7a 65 29 3b kenPtr[1].size);
2de0: 0a 2b 09 09 20 20 20 20 61 70 70 65 6e 64 4f 62 .+.. appendOb
2df0: 6a 20 3d 20 54 63 6c 5f 4f 62 6a 47 65 74 56 61 j = Tcl_ObjGetVa
2e00: 72 32 28 69 6e 74 65 72 70 2c 20 76 61 72 4e 61 r2(interp, varNa
2e10: 6d 65 2c 20 61 72 72 61 79 49 6e 64 65 78 2c 0a me, arrayIndex,.
2e20: 2b 09 09 09 20 20 20 20 54 43 4c 5f 4c 45 41 56 +... TCL_LEAV
2e30: 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 2b 09 09 20 E_ERR_MSG);.+..
2e40: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2e50: 75 6e 74 28 76 61 72 4e 61 6d 65 29 3b 0a 2b 09 unt(varName);.+.
2e60: 09 20 20 20 20 69 66 20 28 61 70 70 65 6e 64 4f . if (appendO
2e70: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 bj == NULL) {.+.
2e80: 09 09 63 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 ..code = TCL_ERR
2e90: 4f 52 3b 0a 2b 09 09 20 20 20 20 7d 0a 2b 09 09 OR;.+.. }.+..
2ea0: 7d 0a 2b 0a 2b 09 09 73 77 69 74 63 68 20 28 63 }.+.+..switch (c
2eb0: 6f 64 65 29 20 7b 0a 2b 09 09 20 20 20 20 63 61 ode) {.+.. ca
2ec0: 73 65 20 54 43 4c 5f 4f 4b 3a 09 2f 2a 20 47 6f se TCL_OK:./* Go
2ed0: 74 20 76 61 6c 75 65 20 2a 2f 0a 2b 09 09 20 20 t value */.+..
2ee0: 20 20 63 61 73 65 20 54 43 4c 5f 45 52 52 4f 52 case TCL_ERROR
2ef0: 3a 09 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 76 :./* Already hav
2f00: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 e error message
2f10: 2a 2f 0a 2b 09 09 20 20 20 20 63 61 73 65 20 54 */.+.. case T
2f20: 43 4c 5f 42 52 45 41 4b 3a 09 2f 2a 20 57 69 6c CL_BREAK:./* Wil
2f30: 6c 20 6e 6f 74 20 73 75 62 73 74 69 74 75 74 65 l not substitute
2f40: 20 61 6e 79 77 61 79 20 2a 2f 0a 2b 09 09 20 20 anyway */.+..
2f50: 20 20 63 61 73 65 20 54 43 4c 5f 43 4f 4e 54 49 case TCL_CONTI
2f60: 4e 55 45 3a 09 2f 2a 20 57 69 6c 6c 20 6e 6f 74 NUE:./* Will not
2f70: 20 73 75 62 73 74 69 74 75 74 65 20 61 6e 79 77 substitute anyw
2f80: 61 79 20 2a 2f 0a 2b 09 09 09 62 72 65 61 6b 3b ay */.+...break;
2f90: 0a 2b 09 09 20 20 20 20 64 65 66 61 75 6c 74 3a .+.. default:
2fa0: 0a 2b 09 09 09 2f 2a 20 41 6c 6c 20 6f 74 68 65 .+.../* All othe
2fb0: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 73 2c 20 r return codes,
2fc0: 77 65 20 77 69 6c 6c 20 73 75 62 73 74 20 74 68 we will subst th
2fd0: 65 0a 2b 09 09 09 20 2a 20 72 65 73 75 6c 74 20 e.+... * result
2fe0: 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 2d 74 68 from the code-th
2ff0: 72 6f 77 69 6e 67 20 65 76 61 6c 75 61 74 69 6f rowing evaluatio
3000: 6e 20 2a 2f 0a 2b 09 09 09 61 70 70 65 6e 64 4f n */.+...appendO
3010: 62 6a 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 bj = Tcl_GetObjR
3020: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 2b esult(interp);.+
3030: 09 09 7d 0a 2b 0a 2b 09 09 69 66 20 28 61 72 72 ..}.+.+..if (arr
3040: 61 79 49 6e 64 65 78 20 21 3d 20 4e 55 4c 4c 29 ayIndex != NULL)
3050: 20 7b 0a 2b 09 09 20 20 20 20 54 63 6c 5f 44 65 {.+.. Tcl_De
3060: 63 72 52 65 66 43 6f 75 6e 74 28 61 72 72 61 79 crRefCount(array
3070: 49 6e 64 65 78 29 3b 0a 2b 09 09 7d 0a 2b 09 09 Index);.+..}.+..
3080: 63 6f 75 6e 74 20 2d 3d 20 74 6f 6b 65 6e 50 74 count -= tokenPt
3090: 72 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 r->numComponents
30a0: 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 20 2b 3d ;.+..tokenPtr +=
30b0: 20 74 6f 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f tokenPtr->numCo
30c0: 6d 70 6f 6e 65 6e 74 73 3b 0a 2b 09 09 62 72 65 mponents;.+..bre
30d0: 61 6b 3b 0a 2b 09 20 20 20 20 7d 0a 2b 0a 2b 09 ak;.+. }.+.+.
30e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 2b 09 09 default:.+..
30f0: 54 63 6c 5f 50 61 6e 69 63 28 22 75 6e 65 78 70 Tcl_Panic("unexp
3100: 65 63 74 65 64 20 74 6f 6b 65 6e 20 74 79 70 65 ected token type
3110: 20 69 6e 20 54 63 6c 53 75 62 73 74 54 6f 6b 65 in TclSubstToke
3120: 6e 73 3a 20 25 64 22 2c 0a 2b 09 09 09 74 6f 6b ns: %d",.+...tok
3130: 65 6e 50 74 72 2d 3e 74 79 70 65 29 3b 0a 2b 09 enPtr->type);.+.
3140: 7d 0a 2b 0a 2b 09 69 66 20 28 28 63 6f 64 65 20 }.+.+.if ((code
3150: 3d 3d 20 54 43 4c 5f 42 52 45 41 4b 29 20 7c 7c == TCL_BREAK) ||
3160: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 43 4f (code == TCL_CO
3170: 4e 54 49 4e 55 45 29 29 20 7b 0a 2b 09 20 20 20 NTINUE)) {.+.
3180: 20 2f 2a 20 49 6e 68 69 62 69 74 20 73 75 62 73 /* Inhibit subs
3190: 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 2b 09 20 20 titution */.+.
31a0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 2b 09 7d 0a continue;.+.}.
31b0: 2b 0a 2b 09 69 66 20 28 72 65 73 75 6c 74 20 3d +.+.if (result =
31c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 = NULL) {.+.
31d0: 2f 2a 20 0a 2b 09 20 20 20 20 20 2a 20 46 69 72 /* .+. * Fir
31e0: 73 74 20 70 61 73 73 20 74 68 72 6f 75 67 68 2e st pass through.
31f0: 20 20 49 66 20 77 65 20 68 61 76 65 20 61 20 54 If we have a T
3200: 63 6c 5f 4f 62 6a 2c 20 6a 75 73 74 20 75 73 65 cl_Obj, just use
3210: 20 69 74 2e 0a 2b 09 20 20 20 20 20 2a 20 49 66 it..+. * If
3220: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 6f 6e 65 not, create one
3230: 20 66 72 6f 6d 20 6f 75 72 20 73 74 72 69 6e 67 from our string
3240: 2e 20 0a 2b 09 20 20 20 20 20 2a 2f 0a 2b 0a 2b . .+. */.+.+
3250: 09 20 20 20 20 69 66 20 28 61 70 70 65 6e 64 4f . if (appendO
3260: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 bj != NULL) {.+.
3270: 09 72 65 73 75 6c 74 20 3d 20 61 70 70 65 6e 64 .result = append
3280: 4f 62 6a 3b 0a 2b 09 20 20 20 20 7d 20 65 6c 73 Obj;.+. } els
3290: 65 20 7b 0a 2b 09 09 72 65 73 75 6c 74 20 3d 20 e {.+..result =
32a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
32b0: 28 61 70 70 65 6e 64 2c 20 61 70 70 65 6e 64 42 (append, appendB
32c0: 79 74 65 4c 65 6e 67 74 68 29 3b 3b 0a 2b 09 20 yteLength);;.+.
32d0: 20 20 20 7d 0a 2b 09 20 20 20 20 54 63 6c 5f 49 }.+. Tcl_I
32e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ncrRefCount(resu
32f0: 6c 74 29 3b 0a 2b 09 7d 20 65 6c 73 65 20 7b 0a lt);.+.} else {.
3300: 2b 09 20 20 20 20 2f 2a 20 53 75 62 73 65 71 75 +. /* Subsequ
3310: 65 6e 74 20 70 61 73 73 65 73 2e 20 20 41 70 70 ent passes. App
3320: 65 6e 64 20 74 6f 20 72 65 73 75 6c 74 2e 20 2a end to result. *
3330: 2f 0a 2b 09 20 20 20 20 69 66 20 28 54 63 6c 5f /.+. if (Tcl_
3340: 49 73 53 68 61 72 65 64 28 72 65 73 75 6c 74 29 IsShared(result)
3350: 29 20 7b 0a 2b 09 09 54 63 6c 5f 44 65 63 72 52 ) {.+..Tcl_DecrR
3360: 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 29 3b efCount(result);
3370: 0a 2b 09 09 72 65 73 75 6c 74 20 3d 20 54 63 6c .+..result = Tcl
3380: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 72 65 _DuplicateObj(re
3390: 73 75 6c 74 29 3b 0a 2b 09 09 54 63 6c 5f 49 6e sult);.+..Tcl_In
33a0: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c crRefCount(resul
33b0: 74 29 3b 0a 2b 09 20 20 20 20 7d 0a 2b 09 20 20 t);.+. }.+.
33c0: 20 20 69 66 20 28 61 70 70 65 6e 64 4f 62 6a 20 if (appendObj
33d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 09 54 63 != NULL) {.+..Tc
33e0: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a l_AppendObjToObj
33f0: 28 72 65 73 75 6c 74 2c 20 61 70 70 65 6e 64 4f (result, appendO
3400: 62 6a 29 3b 0a 2b 09 20 20 20 20 7d 20 65 6c 73 bj);.+. } els
3410: 65 20 7b 0a 2b 09 09 54 63 6c 5f 41 70 70 65 6e e {.+..Tcl_Appen
3420: 64 54 6f 4f 62 6a 28 72 65 73 75 6c 74 2c 20 61 dToObj(result, a
3430: 70 70 65 6e 64 2c 20 61 70 70 65 6e 64 42 79 74 ppend, appendByt
3440: 65 4c 65 6e 67 74 68 29 3b 0a 2b 09 20 20 20 20 eLength);.+.
3450: 7d 0a 2b 09 7d 0a 2b 20 20 20 20 7d 0a 2b 0a 2b }.+.}.+ }.+.+
3460: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
3470: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 09 2f 2a 20 TCL_ERROR) {./*
3480: 4b 65 65 70 20 65 72 72 6f 72 20 6d 65 73 73 61 Keep error messa
3490: 67 65 20 69 6e 20 72 65 73 75 6c 74 21 20 2a 2f ge in result! */
34a0: 0a 2b 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d .+.if (result !=
34b0: 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 54 NULL) {.+. T
34c0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
34d0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 29 3b interp, result);
34e0: 0a 2b 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 20 20 .+.} else {.+.
34f0: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
3500: 74 28 69 6e 74 65 72 70 29 3b 0a 2b 09 7d 0a 2b t(interp);.+.}.+
3510: 20 20 20 20 7d 0a 2b 20 20 20 20 69 66 20 28 74 }.+ if (t
3520: 6f 6b 65 6e 73 4c 65 66 74 50 74 72 20 21 3d 20 okensLeftPtr !=
3530: 4e 55 4c 4c 29 20 7b 0a 2b 09 2a 74 6f 6b 65 6e NULL) {.+.*token
3540: 73 4c 65 66 74 50 74 72 20 3d 20 63 6f 75 6e 74 sLeftPtr = count
3550: 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 69 66 ;.+ }.+ if
3560: 20 28 72 65 73 75 6c 74 20 21 3d 20 4e 55 4c 4c (result != NULL
3570: 29 20 7b 0a 2b 09 54 63 6c 5f 44 65 63 72 52 65 ) {.+.Tcl_DecrRe
3580: 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 29 3b 0a fCount(result);.
3590: 2b 20 20 20 20 7d 0a 2b 20 20 20 20 72 65 74 75 + }.+ retu
35a0: 72 6e 20 63 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 20 rn code;.+}.+..
35b0: 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *----------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a ------------. *
3600: 0a .