Attachment "684982-alt.patch" to
ticket [684982ffff]
added by
dgp
2003-03-13 09:39:58.
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 32 3a 32 36 3a Mar 2003 02:26:
0120: 35 38 20 2d 30 30 30 30 0a 40 40 20 2d 33 34 36 58 -0000.@@ -346
0130: 2c 37 20 2b 33 34 36 2c 36 20 40 40 0a 20 20 20 ,7 +346,6 @@.
0140: 20 20 54 63 6c 5f 49 6e 69 74 48 61 73 68 54 61 Tcl_InitHashTa
0150: 62 6c 65 28 26 69 50 74 72 2d 3e 70 61 63 6b 61 ble(&iPtr->packa
0160: 67 65 54 61 62 6c 65 2c 20 54 43 4c 5f 53 54 52 geTable, TCL_STR
0170: 49 4e 47 5f 4b 45 59 53 29 3b 0a 20 20 20 20 20 ING_KEYS);.
0180: 69 50 74 72 2d 3e 70 61 63 6b 61 67 65 55 6e 6b iPtr->packageUnk
0190: 6e 6f 77 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 nown = NULL;.
01a0: 20 20 69 50 74 72 2d 3e 63 6d 64 43 6f 75 6e 74 iPtr->cmdCount
01b0: 20 3d 20 30 3b 0a 2d 20 20 20 20 69 50 74 72 2d = 0;.- iPtr-
01c0: 3e 74 65 72 6d 4f 66 66 73 65 74 20 3d 20 30 3b >termOffset = 0;
01d0: 0a 20 20 20 20 20 54 63 6c 49 6e 69 74 4c 69 74 . TclInitLit
01e0: 65 72 61 6c 54 61 62 6c 65 28 26 28 69 50 74 72 eralTable(&(iPtr
01f0: 2d 3e 6c 69 74 65 72 61 6c 54 61 62 6c 65 29 29 ->literalTable))
0200: 3b 0a 20 20 20 20 20 69 50 74 72 2d 3e 63 6f 6d ;. iPtr->com
0210: 70 69 6c 65 45 70 6f 63 68 20 3d 20 30 3b 0a 20 pileEpoch = 0;.
0220: 20 20 20 20 69 50 74 72 2d 3e 63 6f 6d 70 69 6c iPtr->compil
0230: 65 64 50 72 6f 63 50 74 72 20 3d 20 4e 55 4c 4c edProcPtr = NULL
0240: 3b 0a 40 40 20 2d 33 33 34 37 2c 31 34 33 20 2b ;.@@ -3347,143 +
0250: 33 33 34 36 2c 37 20 40 40 0a 20 20 20 20 20 69 3346,7 @@. i
0260: 6e 74 20 63 6f 75 6e 74 3b 09 09 09 2f 2a 20 4e nt count;.../* N
0270: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 umber of tokens
0280: 74 6f 20 63 6f 6e 73 69 64 65 72 20 61 74 20 74 to consider at t
0290: 6f 6b 65 6e 50 74 72 2e 0a 20 09 09 09 09 20 2a okenPtr.. .... *
02a0: 20 4d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 Must be at leas
02b0: 74 20 31 2e 20 2a 2f 0a 20 7b 0a 2d 20 20 20 20 t 1. */. {.-
02c0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 Tcl_Obj *resultP
02d0: 74 72 2c 20 2a 69 6e 64 65 78 50 74 72 2c 20 2a tr, *indexPtr, *
02e0: 76 61 6c 75 65 50 74 72 3b 0a 2d 20 20 20 20 63 valuePtr;.- c
02f0: 68 61 72 20 62 75 66 66 65 72 5b 54 43 4c 5f 55 har buffer[TCL_U
0300: 54 46 5f 4d 41 58 5d 3b 0a 2d 23 69 66 64 65 66 TF_MAX];.-#ifdef
0310: 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 2d TCL_MEM_DEBUG.-
0320: 23 20 20 20 64 65 66 69 6e 65 20 20 4d 41 58 5f # define MAX_
0330: 56 41 52 5f 43 48 41 52 53 20 35 0a 2d 23 65 6c VAR_CHARS 5.-#el
0340: 73 65 0a 2d 23 20 20 20 64 65 66 69 6e 65 20 20 se.-# define
0350: 4d 41 58 5f 56 41 52 5f 43 48 41 52 53 20 33 30 MAX_VAR_CHARS 30
0360: 0a 2d 23 65 6e 64 69 66 0a 2d 20 20 20 20 63 68 .-#endif.- ch
0370: 61 72 20 6e 61 6d 65 42 75 66 66 65 72 5b 4d 41 ar nameBuffer[MA
0380: 58 5f 56 41 52 5f 43 48 41 52 53 2b 31 5d 3b 0a X_VAR_CHARS+1];.
0390: 2d 20 20 20 20 63 68 61 72 20 2a 76 61 72 4e 61 - char *varNa
03a0: 6d 65 2c 20 2a 69 6e 64 65 78 3b 0a 2d 20 20 20 me, *index;.-
03b0: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 70 20 3d CONST char *p =
03c0: 20 4e 55 4c 4c 3b 09 2f 2a 20 49 6e 69 74 69 61 NULL;./* Initia
03d0: 6c 69 7a 65 64 20 74 6f 20 61 76 6f 69 64 20 63 lized to avoid c
03e0: 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e ompiler warning.
03f0: 20 2a 2f 0a 2d 20 20 20 20 69 6e 74 20 6c 65 6e */.- int len
0400: 67 74 68 2c 20 63 6f 64 65 3b 0a 2d 0a 2d 20 20 gth, code;.-.-
0410: 20 20 2f 2a 0a 2d 20 20 20 20 20 2a 20 54 68 65 /*.- * The
0420: 20 6f 6e 6c 79 20 74 72 69 63 6b 79 20 74 68 69 only tricky thi
0430: 6e 67 20 61 62 6f 75 74 20 74 68 69 73 20 70 72 ng about this pr
0440: 6f 63 65 64 75 72 65 20 69 73 20 74 68 61 74 20 ocedure is that
0450: 69 74 20 61 74 74 65 6d 70 74 73 20 74 6f 0a 2d it attempts to.-
0460: 20 20 20 20 20 2a 20 61 76 6f 69 64 20 6f 62 6a * avoid obj
0470: 65 63 74 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 ect creation and
0480: 20 73 74 72 69 6e 67 20 63 6f 70 79 69 6e 67 20 string copying
0490: 77 68 65 6e 65 76 65 72 20 70 6f 73 73 69 62 6c whenever possibl
04a0: 65 2e 20 20 46 6f 72 0a 2d 20 20 20 20 20 2a 20 e. For.- *
04b0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 example, if the
04c0: 76 61 6c 75 65 20 69 73 20 6a 75 73 74 20 61 20 value is just a
04d0: 6e 65 73 74 65 64 20 63 6f 6d 6d 61 6e 64 2c 20 nested command,
04e0: 74 68 65 6e 20 75 73 65 20 74 68 65 0a 2d 20 20 then use the.-
04f0: 20 20 20 2a 20 63 6f 6d 6d 61 6e 64 27 73 20 72 * command's r
0500: 65 73 75 6c 74 20 6f 62 6a 65 63 74 20 64 69 72 esult object dir
0510: 65 63 74 6c 79 2e 0a 2d 20 20 20 20 20 2a 2f 0a ectly..- */.
0520: 2d 0a 2d 20 20 20 20 63 6f 64 65 20 3d 20 54 43 -.- code = TC
0530: 4c 5f 4f 4b 3b 0a 2d 20 20 20 20 72 65 73 75 6c L_OK;.- resul
0540: 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 2d 20 20 tPtr = NULL;.-
0550: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
0560: 74 28 69 6e 74 65 72 70 29 3b 0a 2d 20 20 20 20 t(interp);.-
0570: 66 6f 72 20 28 20 3b 20 63 6f 75 6e 74 20 3e 20 for ( ; count >
0580: 30 3b 20 63 6f 75 6e 74 2d 2d 2c 20 74 6f 6b 65 0; count--, toke
0590: 6e 50 74 72 2b 2b 29 20 7b 0a 2d 09 76 61 6c 75 nPtr++) {.-.valu
05a0: 65 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 2d 0a 2d ePtr = NULL;.-.-
05b0: 09 2f 2a 0a 2d 09 20 2a 20 54 68 65 20 73 77 69 ./*.-. * The swi
05c0: 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 62 65 tch statement be
05d0: 6c 6f 77 20 63 6f 6d 70 75 74 65 73 20 74 68 65 low computes the
05e0: 20 6e 65 78 74 20 76 61 6c 75 65 20 74 6f 20 62 next value to b
05f0: 65 0a 2d 09 20 2a 20 63 6f 6e 63 61 74 20 74 6f e.-. * concat to
0600: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 61 73 20 the result, as
0610: 65 69 74 68 65 72 20 61 20 72 61 6e 67 65 20 6f either a range o
0620: 66 20 74 65 78 74 20 6f 72 20 61 6e 0a 2d 09 20 f text or an.-.
0630: 2a 20 6f 62 6a 65 63 74 2e 0a 2d 09 20 2a 2f 0a * object..-. */.
0640: 2d 0a 2d 09 73 77 69 74 63 68 20 28 74 6f 6b 65 -.-.switch (toke
0650: 6e 50 74 72 2d 3e 74 79 70 65 29 20 7b 0a 2d 09 nPtr->type) {.-.
0660: 20 20 20 20 63 61 73 65 20 54 43 4c 5f 54 4f 4b case TCL_TOK
0670: 45 4e 5f 54 45 58 54 3a 0a 2d 09 09 70 20 3d 20 EN_TEXT:.-..p =
0680: 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 3b tokenPtr->start;
0690: 0a 2d 09 09 6c 65 6e 67 74 68 20 3d 20 74 6f 6b .-..length = tok
06a0: 65 6e 50 74 72 2d 3e 73 69 7a 65 3b 0a 2d 09 09 enPtr->size;.-..
06b0: 62 72 65 61 6b 3b 0a 2d 0a 2d 09 20 20 20 20 63 break;.-.-. c
06c0: 61 73 65 20 54 43 4c 5f 54 4f 4b 45 4e 5f 42 53 ase TCL_TOKEN_BS
06d0: 3a 0a 2d 09 09 6c 65 6e 67 74 68 20 3d 20 54 63 :.-..length = Tc
06e0: 6c 5f 55 74 66 42 61 63 6b 73 6c 61 73 68 28 74 l_UtfBackslash(t
06f0: 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 2c 20 okenPtr->start,
0700: 28 69 6e 74 20 2a 29 20 4e 55 4c 4c 2c 0a 2d 09 (int *) NULL,.-.
0710: 09 09 62 75 66 66 65 72 29 3b 0a 2d 09 09 70 20 ..buffer);.-..p
0720: 3d 20 62 75 66 66 65 72 3b 0a 2d 09 09 62 72 65 = buffer;.-..bre
0730: 61 6b 3b 0a 2d 0a 2d 09 20 20 20 20 63 61 73 65 ak;.-.-. case
0740: 20 54 43 4c 5f 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 TCL_TOKEN_COMMA
0750: 4e 44 3a 0a 2d 09 09 63 6f 64 65 20 3d 20 54 63 ND:.-..code = Tc
0760: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
0770: 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 tokenPtr->start
0780: 2b 31 2c 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 +1, tokenPtr->si
0790: 7a 65 2d 32 2c 0a 2d 09 09 09 30 29 3b 0a 2d 09 ze-2,.-...0);.-.
07a0: 09 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c .if (code != TCL
07b0: 5f 4f 4b 29 20 7b 0a 2d 09 09 20 20 20 20 67 6f _OK) {.-.. go
07c0: 74 6f 20 64 6f 6e 65 3b 0a 2d 09 09 7d 0a 2d 09 to done;.-..}.-.
07d0: 09 76 61 6c 75 65 50 74 72 20 3d 20 54 63 6c 5f .valuePtr = Tcl_
07e0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
07f0: 65 72 70 29 3b 0a 2d 09 09 62 72 65 61 6b 3b 0a erp);.-..break;.
0800: 2d 0a 2d 09 20 20 20 20 63 61 73 65 20 54 43 4c -.-. case TCL
0810: 5f 54 4f 4b 45 4e 5f 56 41 52 49 41 42 4c 45 3a _TOKEN_VARIABLE:
0820: 0a 2d 09 09 69 66 20 28 74 6f 6b 65 6e 50 74 72 .-..if (tokenPtr
0830: 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 20 ->numComponents
0840: 3d 3d 20 31 29 20 7b 0a 2d 09 09 20 20 20 20 69 == 1) {.-.. i
0850: 6e 64 65 78 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a ndexPtr = NULL;.
0860: 2d 09 09 20 20 20 20 69 6e 64 65 78 20 3d 20 4e -.. index = N
0870: 55 4c 4c 3b 0a 2d 09 09 7d 20 65 6c 73 65 20 7b ULL;.-..} else {
0880: 0a 2d 09 09 20 20 20 20 63 6f 64 65 20 3d 20 54 .-.. code = T
0890: 63 6c 5f 45 76 61 6c 54 6f 6b 65 6e 73 53 74 61 cl_EvalTokensSta
08a0: 6e 64 61 72 64 28 69 6e 74 65 72 70 2c 20 74 6f ndard(interp, to
08b0: 6b 65 6e 50 74 72 2b 32 2c 0a 2d 09 09 09 20 20 kenPtr+2,.-...
08c0: 20 20 74 6f 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 tokenPtr->numC
08d0: 6f 6d 70 6f 6e 65 6e 74 73 20 2d 20 31 29 3b 0a omponents - 1);.
08e0: 2d 09 09 20 20 20 20 69 66 20 28 63 6f 64 65 20 -.. if (code
08f0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2d 09 09 != TCL_OK) {.-..
0900: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 2d 09 09 20 .goto done;.-..
0910: 20 20 20 7d 0a 2d 09 09 20 20 20 20 69 6e 64 65 }.-.. inde
0920: 78 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 xPtr = Tcl_GetOb
0930: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b jResult(interp);
0940: 0a 2d 09 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 .-.. Tcl_Incr
0950: 52 65 66 43 6f 75 6e 74 28 69 6e 64 65 78 50 74 RefCount(indexPt
0960: 72 29 3b 0a 2d 09 09 20 20 20 20 69 6e 64 65 78 r);.-.. index
0970: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
0980: 28 69 6e 64 65 78 50 74 72 29 3b 0a 2d 09 09 7d (indexPtr);.-..}
0990: 0a 2d 0a 2d 09 09 2f 2a 0a 2d 09 09 20 2a 20 57 .-.-../*.-.. * W
09a0: 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 e have to make a
09b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 72 copy of the var
09c0: 69 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 6f 72 iable name in or
09d0: 64 65 72 0a 2d 09 09 20 2a 20 74 6f 20 68 61 76 der.-.. * to hav
09e0: 65 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 e a null-termina
09f0: 74 65 64 20 73 74 72 69 6e 67 2e 20 20 57 65 20 ted string. We
0a00: 63 61 6e 27 74 20 6d 61 6b 65 20 61 0a 2d 09 09 can't make a.-..
0a10: 20 2a 20 74 65 6d 70 6f 72 61 72 79 20 6d 6f 64 * temporary mod
0a20: 69 66 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 ification to the
0a30: 20 73 63 72 69 70 74 20 74 6f 20 6e 75 6c 6c 2d script to null-
0a40: 74 65 72 6d 69 6e 61 74 65 0a 2d 09 09 20 2a 20 terminate.-.. *
0a50: 74 68 65 20 6e 61 6d 65 2c 20 62 65 63 61 75 73 the name, becaus
0a60: 65 20 61 20 74 72 61 63 65 20 63 61 6c 6c 62 61 e a trace callba
0a70: 63 6b 20 6d 69 67 68 74 20 70 6f 74 65 6e 74 69 ck might potenti
0a80: 61 6c 6c 79 0a 2d 09 09 20 2a 20 72 65 75 73 65 ally.-.. * reuse
0a90: 20 74 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 the script and
0aa0: 62 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74 be affected by t
0ab0: 68 65 20 6e 75 6c 6c 20 63 68 61 72 61 63 74 65 he null characte
0ac0: 72 2e 0a 2d 09 09 20 2a 2f 0a 2d 0a 2d 09 09 69 r..-.. */.-.-..i
0ad0: 66 20 28 74 6f 6b 65 6e 50 74 72 5b 31 5d 2e 73 f (tokenPtr[1].s
0ae0: 69 7a 65 20 3c 3d 20 4d 41 58 5f 56 41 52 5f 43 ize <= MAX_VAR_C
0af0: 48 41 52 53 29 20 7b 0a 2d 09 09 20 20 20 20 76 HARS) {.-.. v
0b00: 61 72 4e 61 6d 65 20 3d 20 6e 61 6d 65 42 75 66 arName = nameBuf
0b10: 66 65 72 3b 0a 2d 09 09 7d 20 65 6c 73 65 20 7b fer;.-..} else {
0b20: 0a 2d 09 09 20 20 20 20 76 61 72 4e 61 6d 65 20 .-.. varName
0b30: 3d 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 = ckalloc((unsig
0b40: 6e 65 64 29 20 28 74 6f 6b 65 6e 50 74 72 5b 31 ned) (tokenPtr[1
0b50: 5d 2e 73 69 7a 65 20 2b 20 31 29 29 3b 0a 2d 09 ].size + 1));.-.
0b60: 09 7d 0a 2d 09 09 73 74 72 6e 63 70 79 28 76 61 .}.-..strncpy(va
0b70: 72 4e 61 6d 65 2c 20 74 6f 6b 65 6e 50 74 72 5b rName, tokenPtr[
0b80: 31 5d 2e 73 74 61 72 74 2c 20 28 73 69 7a 65 5f 1].start, (size_
0b90: 74 29 20 74 6f 6b 65 6e 50 74 72 5b 31 5d 2e 73 t) tokenPtr[1].s
0ba0: 69 7a 65 29 3b 0a 2d 09 09 76 61 72 4e 61 6d 65 ize);.-..varName
0bb0: 5b 74 6f 6b 65 6e 50 74 72 5b 31 5d 2e 73 69 7a [tokenPtr[1].siz
0bc0: 65 5d 20 3d 20 30 3b 0a 2d 09 09 76 61 6c 75 65 e] = 0;.-..value
0bd0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 Ptr = Tcl_GetVar
0be0: 32 45 78 28 69 6e 74 65 72 70 2c 20 76 61 72 4e 2Ex(interp, varN
0bf0: 61 6d 65 2c 20 69 6e 64 65 78 2c 0a 2d 09 09 09 ame, index,.-...
0c00: 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 TCL_LEAVE_ERR_MS
0c10: 47 29 3b 0a 2d 09 09 69 66 20 28 76 61 72 4e 61 G);.-..if (varNa
0c20: 6d 65 20 21 3d 20 6e 61 6d 65 42 75 66 66 65 72 me != nameBuffer
0c30: 29 20 7b 0a 2d 09 09 20 20 20 20 63 6b 66 72 65 ) {.-.. ckfre
0c40: 65 28 76 61 72 4e 61 6d 65 29 3b 0a 2d 09 09 7d e(varName);.-..}
0c50: 0a 2d 09 09 69 66 20 28 69 6e 64 65 78 50 74 72 .-..if (indexPtr
0c60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2d 09 09 20 != NULL) {.-..
0c70: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
0c80: 75 6e 74 28 69 6e 64 65 78 50 74 72 29 3b 0a 2d unt(indexPtr);.-
0c90: 09 09 7d 0a 2d 09 09 69 66 20 28 76 61 6c 75 65 ..}.-..if (value
0ca0: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 2d Ptr == NULL) {.-
0cb0: 09 09 20 20 20 20 63 6f 64 65 20 3d 20 54 43 4c .. code = TCL
0cc0: 5f 45 52 52 4f 52 3b 0a 2d 09 09 20 20 20 20 67 _ERROR;.-.. g
0cd0: 6f 74 6f 20 64 6f 6e 65 3b 0a 2d 09 09 7d 0a 2d oto done;.-..}.-
0ce0: 09 09 63 6f 75 6e 74 20 2d 3d 20 74 6f 6b 65 6e ..count -= token
0cf0: 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e Ptr->numComponen
0d00: 74 73 3b 0a 2d 09 09 74 6f 6b 65 6e 50 74 72 20 ts;.-..tokenPtr
0d10: 2b 3d 20 74 6f 6b 65 6e 50 74 72 2d 3e 6e 75 6d += tokenPtr->num
0d20: 43 6f 6d 70 6f 6e 65 6e 74 73 3b 0a 2d 09 09 62 Components;.-..b
0d30: 72 65 61 6b 3b 0a 2d 0a 2d 09 20 20 20 20 64 65 reak;.-.-. de
0d40: 66 61 75 6c 74 3a 0a 2d 09 09 70 61 6e 69 63 28 fault:.-..panic(
0d50: 22 75 6e 65 78 70 65 63 74 65 64 20 74 6f 6b 65 "unexpected toke
0d60: 6e 20 74 79 70 65 20 69 6e 20 54 63 6c 5f 45 76 n type in Tcl_Ev
0d70: 61 6c 54 6f 6b 65 6e 73 53 74 61 6e 64 61 72 64 alTokensStandard
0d80: 22 29 3b 0a 2d 09 7d 0a 2d 0a 2d 09 2f 2a 0a 2d ");.-.}.-.-./*.-
0d90: 09 20 2a 20 49 66 20 76 61 6c 75 65 50 74 72 20 . * If valuePtr
0da0: 69 73 6e 27 74 20 4e 55 4c 4c 2c 20 74 68 65 20 isn't NULL, the
0db0: 6e 65 78 74 20 70 69 65 63 65 20 6f 66 20 74 65 next piece of te
0dc0: 78 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 xt comes from th
0dd0: 61 74 0a 2d 09 20 2a 20 6f 62 6a 65 63 74 3b 20 at.-. * object;
0de0: 6f 74 68 65 72 77 69 73 65 2c 20 74 61 6b 65 20 otherwise, take
0df0: 6c 65 6e 67 74 68 20 62 79 74 65 73 20 73 74 61 length bytes sta
0e00: 72 74 69 6e 67 20 61 74 20 70 2e 0a 2d 09 20 2a rting at p..-. *
0e10: 2f 0a 2d 0a 2d 09 69 66 20 28 72 65 73 75 6c 74 /.-.-.if (result
0e20: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 2d Ptr == NULL) {.-
0e30: 09 20 20 20 20 69 66 20 28 76 61 6c 75 65 50 74 . if (valuePt
0e40: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2d 09 09 r != NULL) {.-..
0e50: 72 65 73 75 6c 74 50 74 72 20 3d 20 76 61 6c 75 resultPtr = valu
0e60: 65 50 74 72 3b 0a 2d 09 20 20 20 20 7d 20 65 6c ePtr;.-. } el
0e70: 73 65 20 7b 0a 2d 09 09 72 65 73 75 6c 74 50 74 se {.-..resultPt
0e80: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
0e90: 67 4f 62 6a 28 70 2c 20 6c 65 6e 67 74 68 29 3b gObj(p, length);
0ea0: 0a 2d 09 20 20 20 20 7d 0a 2d 09 20 20 20 20 54 .-. }.-. T
0eb0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
0ec0: 72 65 73 75 6c 74 50 74 72 29 3b 0a 2d 09 7d 20 resultPtr);.-.}
0ed0: 65 6c 73 65 20 7b 0a 2d 09 20 20 20 20 69 66 20 else {.-. if
0ee0: 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 72 65 (Tcl_IsShared(re
0ef0: 73 75 6c 74 50 74 72 29 29 20 7b 0a 2d 09 09 54 sultPtr)) {.-..T
0f00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
0f10: 72 65 73 75 6c 74 50 74 72 29 3b 0a 2d 09 09 72 resultPtr);.-..r
0f20: 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f 44 esultPtr = Tcl_D
0f30: 75 70 6c 69 63 61 74 65 4f 62 6a 28 72 65 73 75 uplicateObj(resu
0f40: 6c 74 50 74 72 29 3b 0a 2d 09 09 54 63 6c 5f 49 ltPtr);.-..Tcl_I
0f50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ncrRefCount(resu
0f60: 6c 74 50 74 72 29 3b 0a 2d 09 20 20 20 20 7d 0a ltPtr);.-. }.
0f70: 2d 09 20 20 20 20 69 66 20 28 76 61 6c 75 65 50 -. if (valueP
0f80: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2d 09 tr != NULL) {.-.
0f90: 09 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 .p = Tcl_GetStri
0fa0: 6e 67 46 72 6f 6d 4f 62 6a 28 76 61 6c 75 65 50 ngFromObj(valueP
0fb0: 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 2d 09 tr, &length);.-.
0fc0: 20 20 20 20 7d 0a 2d 09 20 20 20 20 54 63 6c 5f }.-. Tcl_
0fd0: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 AppendToObj(resu
0fe0: 6c 74 50 74 72 2c 20 70 2c 20 6c 65 6e 67 74 68 ltPtr, p, length
0ff0: 29 3b 0a 2d 09 7d 0a 2d 20 20 20 20 7d 0a 2d 20 );.-.}.- }.-
1000: 20 20 20 69 66 20 28 72 65 73 75 6c 74 50 74 72 if (resultPtr
1010: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2d 09 54 63 != NULL) {.-.Tc
1020: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
1030: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 nterp, resultPtr
1040: 29 3b 0a 2d 20 20 20 20 7d 20 65 6c 73 65 20 7b );.- } else {
1050: 0a 2d 09 63 6f 64 65 20 3d 20 54 43 4c 5f 45 52 .-.code = TCL_ER
1060: 52 4f 52 3b 0a 2d 20 20 20 20 7d 0a 2d 0a 2d 20 ROR;.- }.-.-
1070: 20 20 20 64 6f 6e 65 3a 0a 2d 20 20 20 20 69 66 done:.- if
1080: 20 28 72 65 73 75 6c 74 50 74 72 20 21 3d 20 4e (resultPtr != N
1090: 55 4c 4c 29 20 7b 0a 2d 09 54 63 6c 5f 44 65 63 ULL) {.-.Tcl_Dec
10a0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
10b0: 50 74 72 29 3b 0a 2d 20 20 20 20 7d 0a 2d 20 20 Ptr);.- }.-
10c0: 20 20 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 2b return code;.+
10d0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 53 75 return TclSu
10e0: 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 65 72 70 bstTokens(interp
10f0: 2c 20 74 6f 6b 65 6e 50 74 72 2c 20 63 6f 75 6e , tokenPtr, coun
1100: 74 2c 20 2f 2a 20 6e 75 6d 4c 65 66 74 50 74 72 t, /* numLeftPtr
1110: 20 2a 2f 20 4e 55 4c 4c 29 3b 0a 20 7d 0a 20 0a */ NULL);. }. .
1120: 20 0a 40 40 20 2d 33 35 37 39 2c 37 20 2b 33 34 .@@ -3579,7 +34
1130: 34 32 2c 37 20 40 40 0a 20 23 64 65 66 69 6e 65 42,7 @@. #define
1140: 20 4e 55 4d 5f 53 54 41 54 49 43 5f 4f 42 4a 53 NUM_STATIC_OBJS
1150: 20 32 30 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20. Tcl_Obj
1160: 20 2a 73 74 61 74 69 63 4f 62 6a 41 72 72 61 79 *staticObjArray
1170: 5b 4e 55 4d 5f 53 54 41 54 49 43 5f 4f 42 4a 53 [NUM_STATIC_OBJS
1180: 5d 2c 20 2a 2a 6f 62 6a 76 3b 0a 20 20 20 20 20 ], **objv;.
1190: 54 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e Tcl_Token *token
11a0: 50 74 72 3b 0a 2d 20 20 20 20 69 6e 74 20 69 2c Ptr;.- int i,
11b0: 20 63 6f 64 65 2c 20 63 6f 6d 6d 61 6e 64 4c 65 code, commandLe
11c0: 6e 67 74 68 2c 20 62 79 74 65 73 4c 65 66 74 2c ngth, bytesLeft,
11d0: 20 6e 65 73 74 65 64 3b 0a 2b 20 20 20 20 69 6e nested;.+ in
11e0: 74 20 69 2c 20 63 6f 64 65 2c 20 63 6f 6d 6d 61 t i, code, comma
11f0: 6e 64 4c 65 6e 67 74 68 2c 20 62 79 74 65 73 4c ndLength, bytesL
1200: 65 66 74 3b 0a 20 20 20 20 20 43 61 6c 6c 46 72 eft;. CallFr
1210: 61 6d 65 20 2a 73 61 76 65 64 56 61 72 46 72 61 ame *savedVarFra
1220: 6d 65 50 74 72 3b 20 20 20 2f 2a 20 53 61 76 65 mePtr; /* Save
1230: 73 20 6f 6c 64 20 63 6f 70 79 20 6f 66 20 69 50 s old copy of iP
1240: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 0a tr->varFramePtr.
1250: 20 09 09 09 09 20 20 20 20 2a 20 69 6e 20 63 61 .... * in ca
1260: 73 65 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 se TCL_EVAL_GLOB
1270: 41 4c 20 77 61 73 20 73 65 74 2e 20 2a 2f 0a 20 AL was set. */.
1280: 20 20 20 20 69 6e 74 20 61 6c 6c 6f 77 45 78 63 int allowExc
1290: 65 70 74 69 6f 6e 73 20 3d 20 28 69 50 74 72 2d eptions = (iPtr-
12a0: 3e 65 76 61 6c 46 6c 61 67 73 20 26 20 54 43 4c >evalFlags & TCL
12b0: 5f 41 4c 4c 4f 57 5f 45 58 43 45 50 54 49 4f 4e _ALLOW_EXCEPTION
12c0: 53 29 3b 0a 40 40 20 2d 33 36 31 30 2c 33 31 20 S);.@@ -3610,31
12d0: 2b 33 34 37 33 2c 31 34 20 40 40 0a 20 20 20 20 +3473,14 @@.
12e0: 20 6f 62 6a 76 20 3d 20 73 74 61 74 69 63 4f 62 objv = staticOb
12f0: 6a 41 72 72 61 79 3b 0a 20 20 20 20 20 70 20 3d jArray;. p =
1300: 20 73 63 72 69 70 74 3b 0a 20 20 20 20 20 62 79 script;. by
1310: 74 65 73 4c 65 66 74 20 3d 20 6e 75 6d 42 79 74 tesLeft = numByt
1320: 65 73 3b 0a 2d 20 20 20 20 69 66 20 28 69 50 74 es;.- if (iPt
1330: 72 2d 3e 65 76 61 6c 46 6c 61 67 73 20 26 20 54 r->evalFlags & T
1340: 43 4c 5f 42 52 41 43 4b 45 54 5f 54 45 52 4d 29 CL_BRACKET_TERM)
1350: 20 7b 0a 2d 09 6e 65 73 74 65 64 20 3d 20 31 3b {.-.nested = 1;
1360: 0a 2d 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2d .- } else {.-
1370: 09 6e 65 73 74 65 64 20 3d 20 30 3b 0a 2d 20 20 .nested = 0;.-
1380: 20 20 7d 0a 20 20 20 20 20 69 50 74 72 2d 3e 65 }. iPtr->e
1390: 76 61 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 valFlags = 0;.
13a0: 20 20 20 64 6f 20 7b 0a 2d 09 69 66 20 28 54 63 do {.-.if (Tc
13b0: 6c 5f 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 69 l_ParseCommand(i
13c0: 6e 74 65 72 70 2c 20 70 2c 20 62 79 74 65 73 4c nterp, p, bytesL
13d0: 65 66 74 2c 20 6e 65 73 74 65 64 2c 20 26 70 61 eft, nested, &pa
13e0: 72 73 65 29 0a 2b 09 69 66 20 28 54 63 6c 5f 50 rse).+.if (Tcl_P
13f0: 61 72 73 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 arseCommand(inte
1400: 72 70 2c 20 70 2c 20 62 79 74 65 73 4c 65 66 74 rp, p, bytesLeft
1410: 2c 20 30 2c 20 26 70 61 72 73 65 29 0a 20 09 20 , 0, &parse). .
1420: 20 20 20 20 20 20 20 21 3d 20 54 43 4c 5f 4f 4b != TCL_OK
1430: 29 20 7b 0a 20 09 20 20 20 20 63 6f 64 65 20 3d ) {. . code =
1440: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 09 20 20 TCL_ERROR;. .
1450: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 09 goto error;. .
1460: 7d 0a 20 09 67 6f 74 50 61 72 73 65 20 3d 20 31 }. .gotParse = 1
1470: 3b 20 0a 2d 0a 2d 09 69 66 20 28 6e 65 73 74 65 ; .-.-.if (neste
1480: 64 20 26 26 20 70 61 72 73 65 2e 74 65 72 6d 20 d && parse.term
1490: 3d 3d 20 28 73 63 72 69 70 74 20 2b 20 6e 75 6d == (script + num
14a0: 42 79 74 65 73 29 29 20 7b 0a 2d 09 20 20 20 20 Bytes)) {.-.
14b0: 2f 2a 0a 2d 09 20 20 20 20 20 2a 20 41 20 6e 65 /*.-. * A ne
14c0: 73 74 65 64 20 73 63 72 69 70 74 20 63 61 6e 20 sted script can
14d0: 6f 6e 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 69 only terminate i
14e0: 6e 20 27 5d 27 2e 20 49 66 0a 2d 09 20 20 20 20 n ']'. If.-.
14f0: 20 2a 20 74 68 65 20 70 61 72 73 69 6e 67 20 67 * the parsing g
1500: 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 61 74 ot terminated at
1510: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 the end of the
1520: 73 63 72 69 70 74 2c 0a 2d 09 20 20 20 20 20 2a script,.-. *
1530: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20 63 6c there was no cl
1540: 6f 73 69 6e 67 20 27 5d 27 2e 20 20 52 65 70 6f osing ']'. Repo
1550: 72 74 20 74 68 65 20 73 79 6e 74 61 78 20 65 72 rt the syntax er
1560: 72 6f 72 2e 0a 2d 09 20 20 20 20 20 2a 2f 0a 2d ror..-. */.-
1570: 0a 2d 09 20 20 20 20 63 6f 64 65 20 3d 20 54 43 .-. code = TC
1580: 4c 5f 45 52 52 4f 52 3b 0a 2d 09 20 20 20 20 67 L_ERROR;.-. g
1590: 6f 74 6f 20 65 72 72 6f 72 3b 0a 2d 09 7d 0a 2d oto error;.-.}.-
15a0: 0a 20 09 69 66 20 28 70 61 72 73 65 2e 6e 75 6d . .if (parse.num
15b0: 57 6f 72 64 73 20 3e 20 30 29 20 7b 0a 20 09 20 Words > 0) {. .
15c0: 20 20 20 2f 2a 0a 20 09 20 20 20 20 20 2a 20 47 /*. . * G
15d0: 65 6e 65 72 61 74 65 20 61 6e 20 61 72 72 61 79 enerate an array
15e0: 20 6f 66 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 of objects for
15f0: 74 68 65 20 77 6f 72 64 73 20 6f 66 20 74 68 65 the words of the
1600: 20 63 6f 6d 6d 61 6e 64 2e 0a 40 40 20 2d 33 36 command..@@ -36
1610: 34 39 2c 38 20 2b 33 34 39 35 2c 38 20 40 40 0a 49,8 +3495,8 @@.
1620: 20 09 20 20 20 20 66 6f 72 20 28 6f 62 6a 65 63 . for (objec
1630: 74 73 55 73 65 64 20 3d 20 30 2c 20 74 6f 6b 65 tsUsed = 0, toke
1640: 6e 50 74 72 20 3d 20 70 61 72 73 65 2e 74 6f 6b nPtr = parse.tok
1650: 65 6e 50 74 72 3b 0a 20 09 09 20 20 20 20 6f 62 enPtr;. .. ob
1660: 6a 65 63 74 73 55 73 65 64 20 3c 20 70 61 72 73 jectsUsed < pars
1670: 65 2e 6e 75 6d 57 6f 72 64 73 3b 0a 20 09 09 20 e.numWords;. ..
1680: 20 20 20 6f 62 6a 65 63 74 73 55 73 65 64 2b 2b objectsUsed++
1690: 2c 20 74 6f 6b 65 6e 50 74 72 20 2b 3d 20 28 74 , tokenPtr += (t
16a0: 6f 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 okenPtr->numComp
16b0: 6f 6e 65 6e 74 73 20 2b 20 31 29 29 20 7b 0a 2d onents + 1)) {.-
16c0: 09 09 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 ..code = Tcl_Eva
16d0: 6c 54 6f 6b 65 6e 73 53 74 61 6e 64 61 72 64 28 lTokensStandard(
16e0: 69 6e 74 65 72 70 2c 20 74 6f 6b 65 6e 50 74 72 interp, tokenPtr
16f0: 2b 31 2c 20 0a 2d 09 09 20 20 20 20 20 20 20 20 +1, .-..
1700: 20 20 20 20 74 6f 6b 65 6e 50 74 72 2d 3e 6e 75 tokenPtr->nu
1710: 6d 43 6f 6d 70 6f 6e 65 6e 74 73 29 3b 0a 2b 09 mComponents);.+.
1720: 09 63 6f 64 65 20 3d 20 54 63 6c 53 75 62 73 74 .code = TclSubst
1730: 54 6f 6b 65 6e 73 28 69 6e 74 65 72 70 2c 20 74 Tokens(interp, t
1740: 6f 6b 65 6e 50 74 72 2b 31 2c 20 0a 2b 09 09 20 okenPtr+1, .+..
1750: 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e token
1760: 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e Ptr->numComponen
1770: 74 73 2c 20 4e 55 4c 4c 29 3b 0a 20 09 09 69 66 ts, NULL);. ..if
1780: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b (code == TCL_OK
1790: 29 20 7b 0a 20 09 09 20 20 20 20 6f 62 6a 76 5b ) {. .. objv[
17a0: 6f 62 6a 65 63 74 73 55 73 65 64 5d 20 3d 20 54 objectsUsed] = T
17b0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
17c0: 69 6e 74 65 72 70 29 3b 0a 20 09 09 20 20 20 20 interp);. ..
17d0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
17e0: 28 6f 62 6a 76 5b 6f 62 6a 65 63 74 73 55 73 65 (objv[objectsUse
17f0: 64 5d 29 3b 0a 40 40 20 2d 33 37 30 33 2c 32 30 d]);.@@ -3703,20
1800: 20 2b 33 35 34 39 2c 37 20 40 40 0a 20 09 70 20 +3549,7 @@. .p
1810: 3d 20 6e 65 78 74 3b 0a 20 09 54 63 6c 5f 46 72 = next;. .Tcl_Fr
1820: 65 65 50 61 72 73 65 28 26 70 61 72 73 65 29 3b eeParse(&parse);
1830: 0a 20 09 67 6f 74 50 61 72 73 65 20 3d 20 30 3b . .gotParse = 0;
1840: 0a 2d 09 69 66 20 28 6e 65 73 74 65 64 20 26 26 .-.if (nested &&
1850: 20 28 2a 70 61 72 73 65 2e 74 65 72 6d 20 3d 3d (*parse.term ==
1860: 20 27 5d 27 29 29 20 7b 0a 2d 09 20 20 20 20 2f ']')) {.-. /
1870: 2a 0a 2d 09 20 20 20 20 20 2a 20 57 65 20 67 65 *.-. * We ge
1880: 74 20 68 65 72 65 20 69 6e 20 74 68 65 20 73 70 t here in the sp
1890: 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 ecial case where
18a0: 20 74 68 65 20 54 43 4c 5f 42 52 41 43 4b 45 54 the TCL_BRACKET
18b0: 5f 54 45 52 4d 0a 2d 09 20 20 20 20 20 2a 20 66 _TERM.-. * f
18c0: 6c 61 67 20 77 61 73 20 73 65 74 20 69 6e 20 74 lag was set in t
18d0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 he interpreter a
18e0: 6e 64 20 74 68 65 20 6c 61 74 65 73 74 20 70 61 nd the latest pa
18f0: 72 73 65 64 20 63 6f 6d 6d 61 6e 64 0a 2d 09 20 rsed command.-.
1900: 20 20 20 20 2a 20 77 61 73 20 74 65 72 6d 69 6e * was termin
1910: 61 74 65 64 20 62 79 20 74 68 65 20 6d 61 74 63 ated by the matc
1920: 68 69 6e 67 20 63 6c 6f 73 65 2d 62 72 61 63 6b hing close-brack
1930: 65 74 20 77 65 20 73 65 65 6b 2e 0a 2d 09 20 20 et we seek..-.
1940: 20 20 20 2a 20 52 65 74 75 72 6e 20 69 6d 6d 65 * Return imme
1950: 64 69 61 74 65 6c 79 2e 0a 2d 09 20 20 20 20 20 diately..-.
1960: 2a 2f 0a 2d 0a 2d 09 20 20 20 20 69 50 74 72 2d */.-.-. iPtr-
1970: 3e 74 65 72 6d 4f 66 66 73 65 74 20 3d 20 28 70 >termOffset = (p
1980: 20 2d 20 31 29 20 2d 20 73 63 72 69 70 74 3b 0a - 1) - script;.
1990: 2d 09 20 20 20 20 69 50 74 72 2d 3e 76 61 72 46 -. iPtr->varF
19a0: 72 61 6d 65 50 74 72 20 3d 20 73 61 76 65 64 56 ramePtr = savedV
19b0: 61 72 46 72 61 6d 65 50 74 72 3b 0a 2d 09 20 20 arFramePtr;.-.
19c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
19d0: 0a 2d 09 7d 0a 20 20 20 20 20 7d 20 77 68 69 6c .-.}. } whil
19e0: 65 20 28 62 79 74 65 73 4c 65 66 74 20 3e 20 30 e (bytesLeft > 0
19f0: 29 3b 0a 2d 20 20 20 20 69 50 74 72 2d 3e 74 65 );.- iPtr->te
1a00: 72 6d 4f 66 66 73 65 74 20 3d 20 70 20 2d 20 73 rmOffset = p - s
1a10: 63 72 69 70 74 3b 0a 20 20 20 20 20 69 50 74 72 cript;. iPtr
1a20: 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 20 3d 20 ->varFramePtr =
1a30: 73 61 76 65 64 56 61 72 46 72 61 6d 65 50 74 72 savedVarFramePtr
1a40: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;. return TC
1a50: 4c 5f 4f 4b 3b 0a 20 0a 40 40 20 2d 33 37 35 33 L_OK;. .@@ -3753
1a60: 2c 38 35 20 2b 33 35 38 36 2c 36 20 40 40 0a 20 ,85 +3586,6 @@.
1a70: 09 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 .ckfree((char *)
1a80: 20 6f 62 6a 76 29 3b 0a 20 20 20 20 20 7d 0a 20 objv);. }.
1a90: 20 20 20 20 69 50 74 72 2d 3e 76 61 72 46 72 61 iPtr->varFra
1aa0: 6d 65 50 74 72 20 3d 20 73 61 76 65 64 56 61 72 mePtr = savedVar
1ab0: 46 72 61 6d 65 50 74 72 3b 0a 2d 0a 2d 20 20 20 FramePtr;.-.-
1ac0: 20 2f 2a 0a 2d 20 20 20 20 20 2a 20 41 6c 6c 20 /*.- * All
1ad0: 74 68 61 74 27 73 20 6c 65 66 74 20 74 6f 20 64 that's left to d
1ae0: 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 o before returni
1af0: 6e 67 20 69 73 20 74 6f 20 73 65 74 20 69 50 74 ng is to set iPt
1b00: 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 0a 2d 20 r->termOffset.-
1b10: 20 20 20 20 2a 20 74 6f 20 70 6f 69 6e 74 20 70 * to point p
1b20: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 ast the end of t
1b30: 68 65 20 73 63 72 69 70 74 20 77 65 20 6a 75 73 he script we jus
1b40: 74 20 65 76 61 6c 75 61 74 65 64 2e 0a 2d 20 20 t evaluated..-
1b50: 20 20 20 2a 2f 0a 2d 0a 2d 20 20 20 20 6e 65 78 */.-.- nex
1b60: 74 20 3d 20 70 61 72 73 65 2e 63 6f 6d 6d 61 6e t = parse.comman
1b70: 64 53 74 61 72 74 20 2b 20 70 61 72 73 65 2e 63 dStart + parse.c
1b80: 6f 6d 6d 61 6e 64 53 69 7a 65 3b 0a 2d 20 20 20 ommandSize;.-
1b90: 20 62 79 74 65 73 4c 65 66 74 20 2d 3d 20 6e 65 bytesLeft -= ne
1ba0: 78 74 20 2d 20 70 3b 0a 2d 20 20 20 20 70 20 3d xt - p;.- p =
1bb0: 20 6e 65 78 74 3b 0a 2d 0a 2d 20 20 20 20 69 66 next;.-.- if
1bc0: 20 28 21 6e 65 73 74 65 64 29 20 7b 0a 2d 09 69 (!nested) {.-.i
1bd0: 50 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 Ptr->termOffset
1be0: 3d 20 70 20 2d 20 73 63 72 69 70 74 3b 0a 2d 09 = p - script;.-.
1bf0: 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 2d 20 20 return code;.-
1c00: 20 20 7d 0a 2d 0a 2d 20 20 20 20 2f 2a 0a 2d 20 }.-.- /*.-
1c10: 20 20 20 20 2a 20 57 68 65 6e 20 77 65 20 61 72 * When we ar
1c20: 65 20 6e 65 73 74 65 64 20 28 74 68 65 20 54 43 e nested (the TC
1c30: 4c 5f 42 52 41 43 4b 45 54 5f 54 45 52 4d 20 66 L_BRACKET_TERM f
1c40: 6c 61 67 20 77 61 73 20 73 65 74 20 69 6e 20 74 lag was set in t
1c50: 68 65 0a 2d 20 20 20 20 20 2a 20 69 6e 74 65 72 he.- * inter
1c60: 70 72 65 74 65 72 29 2c 20 77 65 20 6d 75 73 74 preter), we must
1c70: 20 66 69 6e 64 20 74 68 65 20 6d 61 74 63 68 69 find the matchi
1c80: 6e 67 20 63 6c 6f 73 65 2d 62 72 61 63 6b 65 74 ng close-bracket
1c90: 20 74 6f 0a 2d 20 20 20 20 20 2a 20 65 6e 64 20 to.- * end
1ca0: 74 68 65 20 73 63 72 69 70 74 20 77 65 20 61 72 the script we ar
1cb0: 65 20 65 76 61 6c 75 61 74 69 6e 67 2e 0a 2d 20 e evaluating..-
1cc0: 20 20 20 20 2a 0a 2d 20 20 20 20 20 2a 20 57 68 *.- * Wh
1cd0: 65 6e 20 6f 75 72 20 72 65 74 75 72 6e 20 63 6f en our return co
1ce0: 64 65 20 69 73 20 54 43 4c 5f 43 4f 4e 54 49 4e de is TCL_CONTIN
1cf0: 55 45 20 6f 72 20 54 43 4c 5f 52 45 54 55 52 4e UE or TCL_RETURN
1d00: 2c 20 77 65 20 77 61 6e 74 0a 2d 20 20 20 20 20 , we want.-
1d10: 2a 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 73 * to correctly s
1d20: 65 74 20 69 50 74 72 2d 3e 74 65 72 6d 4f 66 66 et iPtr->termOff
1d30: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 set to point to
1d40: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 0a 2d 20 that matching.-
1d50: 20 20 20 20 2a 20 63 6c 6f 73 65 2d 62 72 61 63 * close-brac
1d60: 6b 65 74 20 73 6f 20 6f 75 72 20 63 61 6c 6c 65 ket so our calle
1d70: 72 20 63 61 6e 20 6d 6f 76 65 20 74 6f 20 74 68 r can move to th
1d80: 65 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2d 20 e part of the.-
1d90: 20 20 20 20 2a 20 73 74 72 69 6e 67 20 62 65 79 * string bey
1da0: 6f 6e 64 20 74 68 65 20 73 63 72 69 70 74 20 77 ond the script w
1db0: 65 20 77 65 72 65 20 61 73 6b 65 64 20 74 6f 20 e were asked to
1dc0: 65 76 61 6c 75 61 74 65 2e 0a 2d 20 20 20 20 20 evaluate..-
1dd0: 2a 20 53 6f 20 77 65 20 74 72 79 20 74 6f 20 70 * So we try to p
1de0: 61 72 73 65 20 70 61 73 74 20 74 68 65 20 72 65 arse past the re
1df0: 73 74 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e st of the comman
1e00: 64 73 2e 0a 2d 20 20 20 20 20 2a 2f 0a 2d 0a 2d ds..- */.-.-
1e10: 20 20 20 20 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b next = NULL;
1e20: 0a 2d 20 20 20 20 77 68 69 6c 65 20 28 62 79 74 .- while (byt
1e30: 65 73 4c 65 66 74 20 26 26 20 28 2a 70 61 72 73 esLeft && (*pars
1e40: 65 2e 74 65 72 6d 20 21 3d 20 27 5d 27 29 29 20 e.term != ']'))
1e50: 7b 0a 2d 09 69 66 20 28 54 43 4c 5f 4f 4b 20 21 {.-.if (TCL_OK !
1e60: 3d 20 54 63 6c 5f 50 61 72 73 65 43 6f 6d 6d 61 = Tcl_ParseComma
1e70: 6e 64 28 4e 55 4c 4c 2c 20 70 2c 20 62 79 74 65 nd(NULL, p, byte
1e80: 73 4c 65 66 74 2c 20 31 2c 20 26 70 61 72 73 65 sLeft, 1, &parse
1e90: 29 29 20 7b 0a 2d 09 20 20 20 20 2f 2a 0a 2d 09 )) {.-. /*.-.
1ea0: 20 20 20 20 20 2a 20 53 79 6e 74 61 78 20 65 72 * Syntax er
1eb0: 72 6f 72 2e 20 20 53 65 74 20 74 68 65 20 74 65 ror. Set the te
1ec0: 72 6d 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 rmOffset to the
1ed0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2d 09 20 beginning of.-.
1ee0: 20 20 20 20 2a 20 74 68 65 20 6c 61 73 74 20 63 * the last c
1ef0: 6f 6d 6d 61 6e 64 20 70 61 72 73 65 64 2e 0a 2d ommand parsed..-
1f00: 09 20 20 20 20 20 2a 2f 0a 2d 0a 2d 09 20 20 20 . */.-.-.
1f10: 20 69 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55 4c if (next == NUL
1f20: 4c 29 20 7b 0a 2d 09 20 20 20 20 20 20 20 20 69 L) {.-. i
1f30: 50 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 Ptr->termOffset
1f40: 3d 20 28 70 61 72 73 65 2e 63 6f 6d 6d 61 6e 64 = (parse.command
1f50: 53 74 61 72 74 20 2d 20 31 29 20 2d 20 73 63 72 Start - 1) - scr
1f60: 69 70 74 3b 0a 2d 09 20 20 20 20 7d 20 65 6c 73 ipt;.-. } els
1f70: 65 20 7b 0a 2d 09 20 20 20 20 20 20 20 20 69 50 e {.-. iP
1f80: 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 3d tr->termOffset =
1f90: 20 28 6e 65 78 74 20 2d 20 31 29 20 2d 20 73 63 (next - 1) - sc
1fa0: 72 69 70 74 3b 0a 2d 09 20 20 20 20 7d 0a 2d 09 ript;.-. }.-.
1fb0: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 3b return code;
1fc0: 0a 2d 09 7d 0a 2d 09 6e 65 78 74 20 3d 20 70 61 .-.}.-.next = pa
1fd0: 72 73 65 2e 63 6f 6d 6d 61 6e 64 53 74 61 72 74 rse.commandStart
1fe0: 20 2b 20 70 61 72 73 65 2e 63 6f 6d 6d 61 6e 64 + parse.command
1ff0: 53 69 7a 65 3b 0a 2d 09 62 79 74 65 73 4c 65 66 Size;.-.bytesLef
2000: 74 20 2d 3d 20 6e 65 78 74 20 2d 20 70 3b 0a 2d t -= next - p;.-
2010: 09 70 20 3d 20 6e 65 78 74 3b 0a 2d 09 6e 65 78 .p = next;.-.nex
2020: 74 20 3d 20 70 61 72 73 65 2e 63 6f 6d 6d 61 6e t = parse.comman
2030: 64 53 74 61 72 74 3b 0a 2d 09 54 63 6c 5f 46 72 dStart;.-.Tcl_Fr
2040: 65 65 50 61 72 73 65 28 26 70 61 72 73 65 29 3b eeParse(&parse);
2050: 0a 2d 20 20 20 20 7d 0a 2d 0a 2d 20 20 20 20 69 .- }.-.- i
2060: 66 20 28 62 79 74 65 73 4c 65 66 74 29 20 7b 0a f (bytesLeft) {.
2070: 2d 09 2f 2a 20 0a 2d 09 20 2a 20 70 61 72 73 65 -./* .-. * parse
2080: 2e 74 65 72 6d 20 70 6f 69 6e 74 73 20 74 6f 20 .term points to
2090: 74 68 65 20 63 6c 6f 73 65 2d 62 72 61 63 6b 65 the close-bracke
20a0: 74 2e 0a 2d 09 20 2a 2f 0a 2d 0a 2d 09 69 50 74 t..-. */.-.-.iPt
20b0: 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 3d 20 r->termOffset =
20c0: 70 61 72 73 65 2e 74 65 72 6d 20 2d 20 73 63 72 parse.term - scr
20d0: 69 70 74 3b 0a 2d 20 20 20 20 7d 20 65 6c 73 65 ipt;.- } else
20e0: 20 69 66 20 28 70 61 72 73 65 2e 74 65 72 6d 20 if (parse.term
20f0: 3d 3d 20 73 63 72 69 70 74 20 2b 20 6e 75 6d 42 == script + numB
2100: 79 74 65 73 29 20 7b 0a 2d 09 2f 2a 0a 2d 09 20 ytes) {.-./*.-.
2110: 2a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 63 * There was no c
2120: 6c 6f 73 65 2d 62 72 61 63 6b 65 74 2e 20 20 53 lose-bracket. S
2130: 79 6e 74 61 78 20 65 72 72 6f 72 2e 0a 2d 09 20 yntax error..-.
2140: 2a 2f 0a 2d 0a 2d 09 69 50 74 72 2d 3e 74 65 72 */.-.-.iPtr->ter
2150: 6d 4f 66 66 73 65 74 20 3d 20 70 61 72 73 65 2e mOffset = parse.
2160: 74 65 72 6d 20 2d 20 73 63 72 69 70 74 3b 0a 2d term - script;.-
2170: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
2180: 74 28 69 6e 74 65 72 70 2c 0a 2d 09 09 54 63 6c t(interp,.-..Tcl
2190: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d _NewStringObj("m
21a0: 69 73 73 69 6e 67 20 63 6c 6f 73 65 2d 62 72 61 issing close-bra
21b0: 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 2d 09 72 cket", -1));.-.r
21c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
21d0: 0a 2d 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .- } else if
21e0: 28 2a 70 61 72 73 65 2e 74 65 72 6d 20 21 3d 20 (*parse.term !=
21f0: 27 5d 27 29 20 7b 0a 2d 09 2f 2a 0a 2d 09 20 2a ']') {.-./*.-. *
2200: 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 63 6c There was no cl
2210: 6f 73 65 2d 62 72 61 63 6b 65 74 2e 20 20 53 79 ose-bracket. Sy
2220: 6e 74 61 78 20 65 72 72 6f 72 2e 0a 2d 09 20 2a ntax error..-. *
2230: 2f 0a 2d 0a 2d 09 69 50 74 72 2d 3e 74 65 72 6d /.-.-.iPtr->term
2240: 4f 66 66 73 65 74 20 3d 20 28 70 61 72 73 65 2e Offset = (parse.
2250: 74 65 72 6d 20 2b 20 31 29 20 2d 20 73 63 72 69 term + 1) - scri
2260: 70 74 3b 0a 2d 09 54 63 6c 5f 53 65 74 4f 62 6a pt;.-.Tcl_SetObj
2270: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 2d Result(interp,.-
2280: 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2290: 62 6a 28 22 6d 69 73 73 69 6e 67 20 63 6c 6f 73 bj("missing clos
22a0: 65 2d 62 72 61 63 6b 65 74 22 2c 20 2d 31 29 29 e-bracket", -1))
22b0: 3b 0a 2d 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;.-.return TCL_E
22c0: 52 52 4f 52 3b 0a 2d 20 20 20 20 7d 20 65 6c 73 RROR;.- } els
22d0: 65 20 7b 0a 2d 09 2f 2a 20 0a 2d 09 20 2a 20 70 e {.-./* .-. * p
22e0: 61 72 73 65 2e 74 65 72 6d 20 70 6f 69 6e 74 73 arse.term points
22f0: 20 74 6f 20 74 68 65 20 63 6c 6f 73 65 2d 62 72 to the close-br
2300: 61 63 6b 65 74 2e 0a 2d 09 20 2a 2f 0a 2d 09 69 acket..-. */.-.i
2310: 50 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 Ptr->termOffset
2320: 3d 20 70 61 72 73 65 2e 74 65 72 6d 20 2d 20 73 = parse.term - s
2330: 63 72 69 70 74 3b 0a 2d 20 20 20 20 7d 0a 20 20 cript;.- }.
2340: 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a return code;.
2350: 20 7d 0a 20 0c 0a 40 40 20 2d 33 39 33 32 2c 39 }. ..@@ -3932,9
2360: 20 2b 33 36 38 36 2c 36 20 40 40 0a 20 20 2a 09 +3686,6 @@. *.
2370: 68 6f 6c 64 73 20 74 68 65 20 62 79 74 65 63 6f holds the byteco
2380: 64 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 de instructions
2390: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 for the commands
23a0: 2e 20 45 78 65 63 75 74 69 6e 67 20 74 68 65 0a . Executing the.
23b0: 20 20 2a 09 63 6f 6d 6d 61 6e 64 73 20 77 69 6c *.commands wil
23c0: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e l almost certain
23d0: 6c 79 20 68 61 76 65 20 73 69 64 65 20 65 66 66 ly have side eff
23e0: 65 63 74 73 20 74 68 61 74 20 64 65 70 65 6e 64 ects that depend
23f0: 0a 20 20 2a 09 6f 6e 20 74 68 6f 73 65 20 63 6f . *.on those co
2400: 6d 6d 61 6e 64 73 2e 0a 2d 20 2a 0a 2d 20 2a 09 mmands..- *.- *.
2410: 4a 75 73 74 20 61 73 20 69 6e 20 54 63 6c 5f 45 Just as in Tcl_E
2420: 76 61 6c 2c 20 69 6e 74 65 72 70 2d 3e 74 65 72 val, interp->ter
2430: 6d 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 mOffset is set t
2440: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 o the offset of
2450: 74 68 65 0a 2d 20 2a 09 6c 61 73 74 20 63 68 61 the.- *.last cha
2460: 72 61 63 74 65 72 20 65 78 65 63 75 74 65 64 20 racter executed
2470: 69 6e 20 74 68 65 20 6f 62 6a 50 74 72 27 73 20 in the objPtr's
2480: 73 74 72 69 6e 67 2e 0a 20 20 2a 0a 20 20 2a 2d string.. *. *-
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 0a 20 20 2a 2f 0a 49 6e 64 65 78 -----. */.Index
24e0: 3a 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 6d 64 : generic/tclCmd
24f0: 4d 5a 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d MZ.c.===========
2500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2530: 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c ========.RCS fil
2540: 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f e: /cvsroot/tcl/
2550: 74 63 6c 2f 67 65 6e 65 72 69 63 2f 74 63 6c 43 tcl/generic/tclC
2560: 6d 64 4d 5a 2e 63 2c 76 0a 72 65 74 72 69 65 76 mdMZ.c,v.retriev
2570: 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 38 ing revision 1.8
2580: 32 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 38 32 2.diff -u -r1.82
2590: 20 74 63 6c 43 6d 64 4d 5a 2e 63 0a 2d 2d 2d 20 tclCmdMZ.c.---
25a0: 67 65 6e 65 72 69 63 2f 74 63 6c 43 6d 64 4d 5a generic/tclCmdMZ
25b0: 2e 63 09 32 37 20 46 65 62 20 32 30 30 33 20 30 .c.27 Feb 2003 0
25c0: 30 3a 35 34 3a 33 36 20 2d 30 30 30 30 09 31 2e 0:54:36 -0000.1.
25d0: 38 32 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 82.+++ generic/t
25e0: 63 6c 43 6d 64 4d 5a 2e 63 09 31 33 20 4d 61 72 clCmdMZ.c.13 Mar
25f0: 20 32 30 30 33 20 30 32 3a 32 36 3a 35 38 20 2d 2003 02:26:58 -
2600: 30 30 30 30 0a 40 40 20 2d 32 34 39 30 2c 31 35 0000.@@ -2490,15
2610: 39 20 2b 32 34 39 30 2c 36 20 40 40 0a 20 2f 2a 9 +2490,6 @@. /*
2620: 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2d ----------. *.-
2670: 20 2a 20 54 63 6c 5f 53 75 62 73 74 4f 62 6a 20 * Tcl_SubstObj
2680: 2d 2d 0a 2d 20 2a 0a 2d 20 2a 09 54 68 69 73 20 --.- *.- *.This
2690: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d function perform
26a0: 73 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 s the substituti
26b0: 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e ons specified on
26c0: 20 74 68 65 0a 2d 20 2a 09 67 69 76 65 6e 20 73 the.- *.given s
26d0: 74 72 69 6e 67 20 61 73 20 64 65 73 63 72 69 62 tring as describ
26e0: 65 64 20 69 6e 20 74 68 65 20 75 73 65 72 20 64 ed in the user d
26f0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
2700: 20 74 68 65 0a 2d 20 2a 09 22 73 75 62 73 74 22 the.- *."subst"
2710: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 Tcl command. T
2720: 68 69 73 20 63 6f 64 65 20 69 73 20 68 65 61 76 his code is heav
2730: 69 6c 79 20 62 61 73 65 64 20 6f 6e 20 61 6e 0a ily based on an.
2740: 2d 20 2a 09 69 6d 70 6c 65 6d 65 6e 74 61 74 69 - *.implementati
2750: 6f 6e 20 62 79 20 41 6e 64 72 65 77 20 50 61 79 on by Andrew Pay
2760: 6e 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 69 ne. Note that i
2770: 66 20 61 20 63 6f 6d 6d 61 6e 64 0a 2d 20 2a 09 f a command.- *.
2780: 73 75 62 73 74 69 74 75 74 69 6f 6e 20 72 65 74 substitution ret
2790: 75 72 6e 73 20 54 43 4c 5f 43 4f 4e 54 49 4e 55 urns TCL_CONTINU
27a0: 45 20 6f 72 20 54 43 4c 5f 52 45 54 55 52 4e 20 E or TCL_RETURN
27b0: 66 72 6f 6d 20 69 74 73 0a 2d 20 2a 09 65 76 61 from its.- *.eva
27c0: 6c 75 61 74 69 6f 6e 20 61 6e 64 20 69 73 20 6e luation and is n
27d0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 65 ot completely we
27e0: 6c 6c 2d 66 6f 72 6d 65 64 2c 20 74 68 65 20 72 ll-formed, the r
27f0: 65 73 75 6c 74 73 20 61 72 65 0a 2d 20 2a 09 6e esults are.- *.n
2800: 6f 74 20 64 65 66 69 6e 65 64 20 28 6f 72 20 61 ot defined (or a
2810: 74 20 6c 65 61 73 74 20 68 61 72 64 20 74 6f 20 t least hard to
2820: 63 68 61 72 61 63 74 65 72 69 73 65 2e 29 20 20 characterise.)
2830: 54 68 69 73 20 66 61 75 6c 74 0a 2d 20 2a 09 77 This fault.- *.w
2840: 69 6c 6c 20 62 65 20 66 69 78 65 64 20 61 74 20 ill be fixed at
2850: 73 6f 6d 65 20 70 6f 69 6e 74 2c 20 62 75 74 20 some point, but
2860: 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 the cost of the
2870: 6f 6e 6c 79 20 73 61 6e 65 0a 2d 20 2a 09 66 69 only sane.- *.fi
2880: 78 20 28 77 65 6c 6c 2d 66 6f 72 6d 65 64 6e 65 x (well-formedne
2890: 73 73 20 63 68 65 63 6b 20 66 69 72 73 74 29 20 ss check first)
28a0: 69 73 20 73 75 63 68 20 74 68 61 74 20 79 6f 75 is such that you
28b0: 20 6e 65 65 64 20 74 6f 0a 2d 20 2a 09 22 70 72 need to.- *."pr
28c0: 65 63 6f 6d 70 69 6c 65 20 61 6e 64 20 63 61 63 ecompile and cac
28d0: 68 65 22 20 74 6f 20 73 74 6f 70 20 65 76 65 72 he" to stop ever
28e0: 79 6f 6e 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 yone from being
28f0: 68 69 74 20 77 69 74 68 0a 2d 20 2a 09 74 68 65 hit with.- *.the
2900: 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 65 76 consequences ev
2910: 65 72 79 20 74 69 6d 65 20 74 68 72 6f 75 67 68 ery time through
2920: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 . Note that the
2930: 20 63 75 72 72 65 6e 74 0a 2d 20 2a 09 62 65 68 current.- *.beh
2940: 61 76 69 6f 75 72 20 69 73 20 6e 6f 74 20 61 20 aviour is not a
2950: 73 65 63 75 72 69 74 79 20 68 6f 6c 65 3b 20 69 security hole; i
2960: 74 20 6a 75 73 74 20 72 65 73 74 61 72 74 73 20 t just restarts
2970: 70 61 72 73 69 6e 67 0a 2d 20 2a 09 74 68 65 20 parsing.- *.the
2980: 73 74 72 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 string following
2990: 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f the substitutio
29a0: 6e 20 69 6e 20 61 20 6d 69 6c 64 6c 79 20 73 75 n in a mildly su
29b0: 72 70 72 69 73 69 6e 67 0a 2d 20 2a 09 70 6c 61 rprising.- *.pla
29c0: 63 65 2c 20 61 6e 64 20 69 74 20 69 73 20 61 20 ce, and it is a
29d0: 76 65 72 79 20 62 61 64 20 69 64 65 61 20 74 6f very bad idea to
29e0: 20 63 6f 75 6e 74 20 6f 6e 20 74 68 69 73 20 72 count on this r
29f0: 65 6d 61 69 6e 69 6e 67 0a 2d 20 2a 09 74 68 65 emaining.- *.the
2a00: 20 73 61 6d 65 20 69 6e 20 66 75 74 75 72 65 2e same in future.
2a10: 2e 2e 0a 2d 20 2a 0a 2d 20 2a 20 52 65 73 75 6c ...- *.- * Resul
2a20: 74 73 3a 0a 2d 20 2a 09 41 20 54 63 6c 5f 4f 62 ts:.- *.A Tcl_Ob
2a30: 6a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 j* containing th
2a40: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 73 74 e substituted st
2a50: 72 69 6e 67 2c 20 6f 72 20 4e 55 4c 4c 20 74 6f ring, or NULL to
2a60: 0a 2d 20 2a 09 69 6e 64 69 63 61 74 65 20 74 68 .- *.indicate th
2a70: 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 at an error occu
2a80: 72 72 65 64 2e 0a 2d 20 2a 0a 2d 20 2a 20 53 69 rred..- *.- * Si
2a90: 64 65 20 65 66 66 65 63 74 73 3a 0a 2d 20 2a 09 de effects:.- *.
2aa0: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 See the user doc
2ab0: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2d 20 2a 0a umentation..- *.
2ac0: 2d 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d - *-------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 2f 0a 2d ---------.- */.-
2b10: 0a 2d 54 63 6c 5f 4f 62 6a 20 2a 0a 2d 54 63 6c .-Tcl_Obj *.-Tcl
2b20: 5f 53 75 62 73 74 4f 62 6a 28 69 6e 74 65 72 70 _SubstObj(interp
2b30: 2c 20 6f 62 6a 50 74 72 2c 20 66 6c 61 67 73 29 , objPtr, flags)
2b40: 0a 2d 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .- Tcl_Interp
2b50: 20 2a 69 6e 74 65 72 70 3b 0a 2d 20 20 20 20 54 *interp;.- T
2b60: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
2b70: 2d 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a - int flags;.
2b80: 2d 7b 0a 2d 20 20 20 20 54 63 6c 5f 4f 62 6a 20 -{.- Tcl_Obj
2b90: 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 2d 20 20 20 *resultObj;.-
2ba0: 20 63 68 61 72 20 2a 70 2c 20 2a 6f 6c 64 3b 0a char *p, *old;.
2bb0: 2d 0a 2d 20 20 20 20 6f 6c 64 20 3d 20 70 20 3d -.- old = p =
2bc0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
2bd0: 62 6a 50 74 72 29 3b 0a 2d 20 20 20 20 72 65 73 bjPtr);.- res
2be0: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 ultObj = Tcl_New
2bf0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 StringObj("", 0)
2c00: 3b 0a 2d 20 20 20 20 77 68 69 6c 65 20 28 31 29 ;.- while (1)
2c10: 20 7b 0a 2d 09 73 77 69 74 63 68 20 28 2a 70 29 {.-.switch (*p)
2c20: 20 7b 0a 2d 09 63 61 73 65 20 30 3a 0a 2d 09 20 {.-.case 0:.-.
2c30: 20 20 20 69 66 20 28 70 20 21 3d 20 6f 6c 64 29 if (p != old)
2c40: 20 7b 0a 2d 09 09 54 63 6c 5f 41 70 70 65 6e 64 {.-..Tcl_Append
2c50: 54 6f 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c ToObj(resultObj,
2c60: 20 6f 6c 64 2c 20 70 2d 6f 6c 64 29 3b 0a 2d 09 old, p-old);.-.
2c70: 20 20 20 20 7d 0a 2d 09 20 20 20 20 72 65 74 75 }.-. retu
2c80: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 2d 0a rn resultObj;.-.
2c90: 2d 09 63 61 73 65 20 27 5c 5c 27 3a 0a 2d 09 20 -.case '\\':.-.
2ca0: 20 20 20 69 66 20 28 66 6c 61 67 73 20 26 20 54 if (flags & T
2cb0: 43 4c 5f 53 55 42 53 54 5f 42 41 43 4b 53 4c 41 CL_SUBST_BACKSLA
2cc0: 53 48 45 53 29 20 7b 0a 2d 09 09 63 68 61 72 20 SHES) {.-..char
2cd0: 62 75 66 5b 54 43 4c 5f 55 54 46 5f 4d 41 58 5d buf[TCL_UTF_MAX]
2ce0: 3b 0a 2d 09 09 69 6e 74 20 63 6f 75 6e 74 3b 0a ;.-..int count;.
2cf0: 2d 0a 2d 09 09 69 66 20 28 70 20 21 3d 20 6f 6c -.-..if (p != ol
2d00: 64 29 20 7b 0a 2d 09 09 20 20 20 20 54 63 6c 5f d) {.-.. Tcl_
2d10: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 AppendToObj(resu
2d20: 6c 74 4f 62 6a 2c 20 6f 6c 64 2c 20 70 2d 6f 6c ltObj, old, p-ol
2d30: 64 29 3b 0a 2d 09 09 7d 0a 2d 09 09 54 63 6c 5f d);.-..}.-..Tcl_
2d40: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 AppendToObj(resu
2d50: 6c 74 4f 62 6a 2c 20 62 75 66 2c 0a 2d 09 09 09 ltObj, buf,.-...
2d60: 09 54 63 6c 5f 55 74 66 42 61 63 6b 73 6c 61 73 .Tcl_UtfBackslas
2d70: 68 28 70 2c 20 26 63 6f 75 6e 74 2c 20 62 75 66 h(p, &count, buf
2d80: 29 29 3b 0a 2d 09 09 70 20 2b 3d 20 63 6f 75 6e ));.-..p += coun
2d90: 74 3b 0a 2d 09 09 6f 6c 64 20 3d 20 70 3b 0a 2d t;.-..old = p;.-
2da0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 . } else {.-.
2db0: 09 70 2b 2b 3b 0a 2d 09 20 20 20 20 7d 0a 2d 09 .p++;.-. }.-.
2dc0: 20 20 20 20 62 72 65 61 6b 3b 0a 2d 0a 2d 09 63 break;.-.-.c
2dd0: 61 73 65 20 27 24 27 3a 0a 2d 09 20 20 20 20 69 ase '$':.-. i
2de0: 66 20 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 53 f (flags & TCL_S
2df0: 55 42 53 54 5f 56 41 52 49 41 42 4c 45 53 29 20 UBST_VARIABLES)
2e00: 7b 0a 2d 09 09 54 63 6c 5f 50 61 72 73 65 20 70 {.-..Tcl_Parse p
2e10: 61 72 73 65 3b 0a 2d 09 09 69 6e 74 20 63 6f 64 arse;.-..int cod
2e20: 65 3b 0a 2d 0a 2d 09 09 2f 2a 0a 2d 09 09 20 2a e;.-.-../*.-.. *
2e30: 20 43 6f 64 65 20 69 73 20 73 69 6d 70 6c 65 72 Code is simpler
2e40: 20 6f 76 65 72 61 6c 6c 20 69 66 20 77 65 20 28 overall if we (
2e50: 65 66 66 65 63 74 69 76 65 6c 79 29 20 69 6e 6c effectively) inl
2e60: 69 6e 65 0a 2d 09 09 20 2a 20 54 63 6c 5f 50 61 ine.-.. * Tcl_Pa
2e70: 72 73 65 56 61 72 2c 20 70 61 72 74 69 63 75 6c rseVar, particul
2e80: 61 72 6c 79 20 61 73 20 74 68 61 74 20 61 6c 6c arly as that all
2e90: 6f 77 73 20 75 73 20 74 6f 20 75 73 65 0a 2d 09 ows us to use.-.
2ea0: 09 20 2a 20 61 20 6e 6f 6e 2d 73 74 72 69 6e 67 . * a non-string
2eb0: 20 69 6e 74 65 72 66 61 63 65 20 77 68 65 6e 20 interface when
2ec0: 77 65 20 63 6f 6d 65 20 74 6f 20 61 70 70 65 6e we come to appen
2ed0: 64 69 6e 67 0a 2d 09 09 20 2a 20 74 68 65 20 76 ding.-.. * the v
2ee0: 61 72 69 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 ariable contents
2ef0: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6f to the result o
2f00: 62 6a 65 63 74 2e 20 20 54 68 65 72 65 0a 2d 09 bject. There.-.
2f10: 09 20 2a 20 61 72 65 20 61 20 66 65 77 20 6f 74 . * are a few ot
2f20: 68 65 72 20 6f 70 74 69 6d 69 73 61 74 69 6f 6e her optimisation
2f30: 73 20 74 68 61 74 20 64 6f 69 6e 67 20 74 68 69 s that doing thi
2f40: 73 0a 2d 09 09 20 2a 20 65 6e 61 62 6c 65 73 20 s.-.. * enables
2f50: 28 6c 69 6b 65 20 62 65 69 6e 67 20 61 62 6c 65 (like being able
2f60: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 to continue the
2f70: 20 72 75 6e 20 6f 66 0a 2d 09 09 20 2a 20 75 6e run of.-.. * un
2f80: 73 75 62 73 74 69 74 75 74 65 64 20 63 68 61 72 substituted char
2f90: 61 63 74 65 72 73 20 73 74 72 61 69 67 68 74 20 acters straight
2fa0: 74 68 72 6f 75 67 68 20 69 66 20 61 20 27 24 27 through if a '$'
2fb0: 0a 2d 09 09 20 2a 20 64 6f 65 73 20 6e 6f 74 20 .-.. * does not
2fc0: 70 72 65 63 65 64 65 20 61 20 76 61 72 69 61 62 precede a variab
2fd0: 6c 65 20 6e 61 6d 65 2e 29 0a 2d 09 09 20 2a 2f le name.).-.. */
2fe0: 0a 2d 09 09 69 66 20 28 54 63 6c 5f 50 61 72 73 .-..if (Tcl_Pars
2ff0: 65 56 61 72 4e 61 6d 65 28 69 6e 74 65 72 70 2c eVarName(interp,
3000: 20 70 2c 20 2d 31 2c 20 26 70 61 72 73 65 2c 20 p, -1, &parse,
3010: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 0) != TCL_OK) {.
3020: 2d 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f -.. goto erro
3030: 72 52 65 73 75 6c 74 3b 0a 2d 09 09 7d 0a 2d 09 rResult;.-..}.-.
3040: 09 69 66 20 28 70 61 72 73 65 2e 6e 75 6d 54 6f .if (parse.numTo
3050: 6b 65 6e 73 20 3d 3d 20 31 29 20 7b 0a 2d 09 09 kens == 1) {.-..
3060: 20 20 20 20 2f 2a 0a 2d 09 09 20 20 20 20 20 2a /*.-.. *
3070: 20 54 68 65 72 65 20 69 73 6e 27 74 20 61 20 76 There isn't a v
3080: 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 66 74 ariable name aft
3090: 65 72 20 61 6c 6c 3a 20 74 68 65 20 24 20 69 73 er all: the $ is
30a0: 0a 2d 09 09 20 20 20 20 20 2a 20 6a 75 73 74 20 .-.. * just
30b0: 61 20 24 2e 0a 2d 09 09 20 20 20 20 20 2a 2f 0a a $..-.. */.
30c0: 2d 09 09 20 20 20 20 70 2b 2b 3b 0a 2d 09 09 20 -.. p++;.-..
30d0: 20 20 20 62 72 65 61 6b 3b 0a 2d 09 09 7d 0a 2d break;.-..}.-
30e0: 09 09 69 66 20 28 70 20 21 3d 20 6f 6c 64 29 20 ..if (p != old)
30f0: 7b 0a 2d 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {.-.. Tcl_App
3100: 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 6c 74 4f endToObj(resultO
3110: 62 6a 2c 20 6f 6c 64 2c 20 70 2d 6f 6c 64 29 3b bj, old, p-old);
3120: 0a 2d 09 09 7d 0a 2d 09 09 70 20 2b 3d 20 70 61 .-..}.-..p += pa
3130: 72 73 65 2e 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 rse.tokenPtr->si
3140: 7a 65 3b 0a 2d 09 09 63 6f 64 65 20 3d 20 54 63 ze;.-..code = Tc
3150: 6c 5f 45 76 61 6c 54 6f 6b 65 6e 73 53 74 61 6e l_EvalTokensStan
3160: 64 61 72 64 28 69 6e 74 65 72 70 2c 20 70 61 72 dard(interp, par
3170: 73 65 2e 74 6f 6b 65 6e 50 74 72 2c 0a 2d 09 09 se.tokenPtr,.-..
3180: 20 20 20 20 20 20 20 20 70 61 72 73 65 2e 6e 75 parse.nu
3190: 6d 54 6f 6b 65 6e 73 29 3b 0a 2d 09 09 69 66 20 mTokens);.-..if
31a0: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 45 52 52 (code == TCL_ERR
31b0: 4f 52 29 20 7b 0a 2d 09 09 20 20 20 20 67 6f 74 OR) {.-.. got
31c0: 6f 20 65 72 72 6f 72 52 65 73 75 6c 74 3b 0a 2d o errorResult;.-
31d0: 09 09 7d 0a 2d 09 09 69 66 20 28 63 6f 64 65 20 ..}.-..if (code
31e0: 3d 3d 20 54 43 4c 5f 42 52 45 41 4b 29 20 7b 0a == TCL_BREAK) {.
31f0: 2d 09 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 -.. Tcl_Reset
3200: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
3210: 2d 09 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 -.. return re
3220: 73 75 6c 74 4f 62 6a 3b 0a 2d 09 09 7d 0a 2d 09 sultObj;.-..}.-.
3230: 09 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c .if (code != TCL
3240: 5f 43 4f 4e 54 49 4e 55 45 29 20 7b 0a 2d 09 09 _CONTINUE) {.-..
3250: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 Tcl_AppendOb
3260: 6a 54 6f 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a jToObj(resultObj
3270: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 , Tcl_GetObjResu
3280: 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 2d 09 09 lt(interp));.-..
3290: 7d 0a 2d 09 09 54 63 6c 5f 52 65 73 65 74 52 65 }.-..Tcl_ResetRe
32a0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 2d 09 sult(interp);.-.
32b0: 09 6f 6c 64 20 3d 20 70 3b 0a 2d 09 20 20 20 20 .old = p;.-.
32c0: 7d 20 65 6c 73 65 20 7b 0a 2d 09 09 70 2b 2b 3b } else {.-..p++;
32d0: 0a 2d 09 20 20 20 20 7d 0a 2d 09 20 20 20 20 62 .-. }.-. b
32e0: 72 65 61 6b 3b 0a 2d 0a 2d 09 63 61 73 65 20 27 reak;.-.-.case '
32f0: 5b 27 3a 0a 2d 09 20 20 20 20 69 66 20 28 66 6c [':.-. if (fl
3300: 61 67 73 20 26 20 54 43 4c 5f 53 55 42 53 54 5f ags & TCL_SUBST_
3310: 43 4f 4d 4d 41 4e 44 53 29 20 7b 0a 2d 09 09 49 COMMANDS) {.-..I
3320: 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 nterp *iPtr = (I
3330: 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b nterp *) interp;
3340: 0a 2d 09 09 69 6e 74 20 63 6f 64 65 3b 0a 2d 0a .-..int code;.-.
3350: 2d 09 09 69 66 20 28 70 20 21 3d 20 6f 6c 64 29 -..if (p != old)
3360: 20 7b 0a 2d 09 09 20 20 20 20 54 63 6c 5f 41 70 {.-.. Tcl_Ap
3370: 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 6c 74 pendToObj(result
3380: 4f 62 6a 2c 20 6f 6c 64 2c 20 70 2d 6f 6c 64 29 Obj, old, p-old)
3390: 3b 0a 2d 09 09 7d 0a 2d 09 09 69 50 74 72 2d 3e ;.-..}.-..iPtr->
33a0: 65 76 61 6c 46 6c 61 67 73 20 3d 20 54 43 4c 5f evalFlags = TCL_
33b0: 42 52 41 43 4b 45 54 5f 54 45 52 4d 3b 0a 2d 09 BRACKET_TERM;.-.
33c0: 09 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c .code = Tcl_Eval
33d0: 45 78 28 69 6e 74 65 72 70 2c 20 70 2b 31 2c 20 Ex(interp, p+1,
33e0: 2d 31 2c 20 30 29 3b 0a 2d 09 09 73 77 69 74 63 -1, 0);.-..switc
33f0: 68 20 28 63 6f 64 65 29 20 7b 0a 2d 09 09 63 61 h (code) {.-..ca
3400: 73 65 20 54 43 4c 5f 45 52 52 4f 52 3a 0a 2d 09 se TCL_ERROR:.-.
3410: 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 52 . goto errorR
3420: 65 73 75 6c 74 3b 0a 2d 09 09 63 61 73 65 20 54 esult;.-..case T
3430: 43 4c 5f 42 52 45 41 4b 3a 0a 2d 09 09 20 20 20 CL_BREAK:.-..
3440: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 Tcl_ResetResult
3450: 28 69 6e 74 65 72 70 29 3b 0a 2d 09 09 20 20 20 (interp);.-..
3460: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
3470: 6a 3b 0a 2d 09 09 64 65 66 61 75 6c 74 3a 0a 2d j;.-..default:.-
3480: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
3490: 4f 62 6a 54 6f 4f 62 6a 28 72 65 73 75 6c 74 4f ObjToObj(resultO
34a0: 62 6a 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 bj, Tcl_GetObjRe
34b0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 2d sult(interp));.-
34c0: 09 09 63 61 73 65 20 54 43 4c 5f 43 4f 4e 54 49 ..case TCL_CONTI
34d0: 4e 55 45 3a 0a 2d 09 09 20 20 20 20 54 63 6c 5f NUE:.-.. Tcl_
34e0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
34f0: 72 70 29 3b 0a 2d 09 09 20 20 20 20 6f 6c 64 20 rp);.-.. old
3500: 3d 20 70 20 3d 20 28 70 2b 31 20 2b 20 69 50 74 = p = (p+1 + iPt
3510: 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 2b 20 r->termOffset +
3520: 31 29 3b 0a 2d 09 09 7d 0a 2d 09 20 20 20 20 7d 1);.-..}.-. }
3530: 20 65 6c 73 65 20 7b 0a 2d 09 09 70 2b 2b 3b 0a else {.-..p++;.
3540: 2d 09 20 20 20 20 7d 0a 2d 09 20 20 20 20 62 72 -. }.-. br
3550: 65 61 6b 3b 0a 2d 09 64 65 66 61 75 6c 74 3a 0a eak;.-.default:.
3560: 2d 09 20 20 20 20 70 2b 2b 3b 0a 2d 09 20 20 20 -. p++;.-.
3570: 20 62 72 65 61 6b 3b 0a 2d 09 7d 0a 2d 20 20 20 break;.-.}.-
3580: 20 7d 0a 2d 0a 2d 20 65 72 72 6f 72 52 65 73 75 }.-.- errorResu
3590: 6c 74 3a 0a 2d 20 20 20 20 54 63 6c 5f 44 65 63 lt:.- Tcl_Dec
35a0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
35b0: 4f 62 6a 29 3b 0a 2d 20 20 20 20 72 65 74 75 72 Obj);.- retur
35c0: 6e 20 4e 55 4c 4c 3b 0a 2d 7d 0a 2d 0c 0a 2d 2f n NULL;.-}.-..-/
35d0: 2a 0a 2d 20 2a 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 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 0a -----------.- *.
3620: 20 20 2a 20 54 63 6c 5f 53 77 69 74 63 68 4f 62 * Tcl_SwitchOb
3630: 6a 43 6d 64 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09 jCmd --. *. *.
3640: 54 68 69 73 20 6f 62 6a 65 63 74 2d 62 61 73 65 This object-base
3650: 64 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 d procedure is i
3660: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
3670: 73 20 74 68 65 20 22 73 77 69 74 63 68 22 20 54 s the "switch" T
3680: 63 6c 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 cl.Index: generi
3690: 63 2f 74 63 6c 43 6f 6d 70 43 6d 64 73 2e 63 0a c/tclCompCmds.c.
36a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
36b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
36c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
36d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
36e0: 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 ===.RCS file: /c
36f0: 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 vsroot/tcl/tcl/g
3700: 65 6e 65 72 69 63 2f 74 63 6c 43 6f 6d 70 43 6d eneric/tclCompCm
3710: 64 73 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e ds.c,v.retrievin
3720: 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 34 31 0a g revision 1.41.
3730: 64 69 66 66 20 2d 75 20 2d 72 31 2e 34 31 20 74 diff -u -r1.41 t
3740: 63 6c 43 6f 6d 70 43 6d 64 73 2e 63 0a 2d 2d 2d clCompCmds.c.---
3750: 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 6f 6d 70 generic/tclComp
3760: 43 6d 64 73 2e 63 09 36 20 4d 61 72 20 32 30 30 Cmds.c.6 Mar 200
3770: 33 20 32 33 3a 31 37 3a 30 39 20 2d 30 30 30 30 3 23:17:09 -0000
3780: 09 31 2e 34 31 0a 2b 2b 2b 20 67 65 6e 65 72 69 .1.41.+++ generi
3790: 63 2f 74 63 6c 43 6f 6d 70 43 6d 64 73 2e 63 09 c/tclCompCmds.c.
37a0: 31 33 20 4d 61 72 20 32 30 30 33 20 30 32 3a 32 13 Mar 2003 02:2
37b0: 36 3a 35 38 20 2d 30 30 30 30 0a 40 40 20 2d 33 6:58 -0000.@@ -3
37c0: 31 34 30 2c 37 20 2b 33 31 34 30 2c 37 20 40 40 140,7 +3140,7 @@
37d0: 0a 20 09 54 63 6c 45 6d 69 74 4f 70 63 6f 64 65 . .TclEmitOpcode
37e0: 28 49 4e 53 54 5f 50 4f 50 2c 20 65 6e 76 50 74 (INST_POP, envPt
37f0: 72 29 3b 0a 20 09 65 6e 76 50 74 72 2d 3e 63 75 r);. .envPtr->cu
3800: 72 72 53 74 61 63 6b 44 65 70 74 68 20 3d 20 73 rrStackDepth = s
3810: 61 76 65 64 53 74 61 63 6b 44 65 70 74 68 20 2b avedStackDepth +
3820: 20 31 3b 0a 20 09 63 6f 64 65 20 3d 20 54 63 6c 1;. .code = Tcl
3830: 43 6f 6d 70 69 6c 65 53 63 72 69 70 74 28 69 6e CompileScript(in
3840: 74 65 72 70 2c 20 62 6f 64 79 54 6f 6b 65 6e 41 terp, bodyTokenA
3850: 72 72 61 79 5b 69 2b 31 5d 2e 73 74 61 72 74 2c rray[i+1].start,
3860: 0a 2d 09 09 62 6f 64 79 54 6f 6b 65 6e 41 72 72 .-..bodyTokenArr
3870: 61 79 5b 69 2b 31 5d 2e 73 69 7a 65 2c 20 2f 2a ay[i+1].size, /*
3880: 6e 65 73 74 65 64 2a 2f 20 30 2c 20 65 6e 76 50 nested*/ 0, envP
3890: 74 72 29 3b 0a 2b 09 09 62 6f 64 79 54 6f 6b 65 tr);.+..bodyToke
38a0: 6e 41 72 72 61 79 5b 69 2b 31 5d 2e 73 69 7a 65 nArray[i+1].size
38b0: 2c 20 65 6e 76 50 74 72 29 3b 0a 20 09 69 66 20 , envPtr);. .if
38c0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 (code != TCL_OK)
38d0: 20 7b 0a 20 09 20 20 20 20 63 6b 66 72 65 65 28 {. . ckfree(
38e0: 28 63 68 61 72 20 2a 29 61 72 67 76 29 3b 0a 20 (char *)argv);.
38f0: 09 20 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 . ckfree((cha
3900: 72 20 2a 29 62 6f 64 79 54 6f 6b 65 6e 41 72 72 r *)bodyTokenArr
3910: 61 79 29 3b 0a 49 6e 64 65 78 3a 20 67 65 6e 65 ay);.Index: gene
3920: 72 69 63 2f 74 63 6c 43 6f 6d 70 45 78 70 72 2e ric/tclCompExpr.
3930: 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d c.==============
3940: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3950: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3960: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3970: 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 =====.RCS file:
3980: 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c /cvsroot/tcl/tcl
3990: 2f 67 65 6e 65 72 69 63 2f 74 63 6c 43 6f 6d 70 /generic/tclComp
39a0: 45 78 70 72 2e 63 2c 76 0a 72 65 74 72 69 65 76 Expr.c,v.retriev
39b0: 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 ing revision 1.1
39c0: 33 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 31 33 3.diff -u -r1.13
39d0: 20 74 63 6c 43 6f 6d 70 45 78 70 72 2e 63 0a 2d tclCompExpr.c.-
39e0: 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 6f -- generic/tclCo
39f0: 6d 70 45 78 70 72 2e 63 09 31 36 20 46 65 62 20 mpExpr.c.16 Feb
3a00: 32 30 30 33 20 30 31 3a 33 36 3a 33 32 20 2d 30 2003 01:36:32 -0
3a10: 30 30 30 09 31 2e 31 33 0a 2b 2b 2b 20 67 65 6e 000.1.13.+++ gen
3a20: 65 72 69 63 2f 74 63 6c 43 6f 6d 70 45 78 70 72 eric/tclCompExpr
3a30: 2e 63 09 31 33 20 4d 61 72 20 32 30 30 33 20 30 .c.13 Mar 2003 0
3a40: 32 3a 32 36 3a 35 38 20 2d 30 30 30 30 0a 40 40 2:26:58 -0000.@@
3a50: 20 2d 33 39 38 2c 37 20 2b 33 39 38 2c 37 20 40 -398,7 +398,7 @
3a60: 40 0a 20 09 20 20 20 20 0a 20 20 20 20 20 20 20 @. . .
3a70: 20 20 63 61 73 65 20 54 43 4c 5f 54 4f 4b 45 4e case TCL_TOKEN
3a80: 5f 43 4f 4d 4d 41 4e 44 3a 0a 20 09 20 20 20 20 _COMMAND:. .
3a90: 63 6f 64 65 20 3d 20 54 63 6c 43 6f 6d 70 69 6c code = TclCompil
3aa0: 65 53 63 72 69 70 74 28 69 6e 74 65 72 70 2c 20 eScript(interp,
3ab0: 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 2b tokenPtr->start+
3ac0: 31 2c 0a 2d 09 09 20 20 20 20 74 6f 6b 65 6e 50 1,.-.. tokenP
3ad0: 74 72 2d 3e 73 69 7a 65 2d 32 2c 20 2f 2a 6e 65 tr->size-2, /*ne
3ae0: 73 74 65 64 2a 2f 20 30 2c 20 65 6e 76 50 74 72 sted*/ 0, envPtr
3af0: 29 3b 0a 2b 09 09 20 20 20 20 74 6f 6b 65 6e 50 );.+.. tokenP
3b00: 74 72 2d 3e 73 69 7a 65 2d 32 2c 20 65 6e 76 50 tr->size-2, envP
3b10: 74 72 29 3b 0a 20 09 20 20 20 20 69 66 20 28 63 tr);. . if (c
3b20: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode != TCL_OK) {
3b30: 0a 20 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 . ..goto done;.
3b40: 09 20 20 20 20 7d 0a 49 6e 64 65 78 3a 20 67 65 . }.Index: ge
3b50: 6e 65 72 69 63 2f 74 63 6c 43 6f 6d 70 69 6c 65 neric/tclCompile
3b60: 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .c.=============
3b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3ba0: 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a ======.RCS file:
3bb0: 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 /cvsroot/tcl/tc
3bc0: 6c 2f 67 65 6e 65 72 69 63 2f 74 63 6c 43 6f 6d l/generic/tclCom
3bd0: 70 69 6c 65 2e 63 2c 76 0a 72 65 74 72 69 65 76 pile.c,v.retriev
3be0: 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 34 ing revision 1.4
3bf0: 33 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 34 33 3.diff -u -r1.43
3c00: 20 74 63 6c 43 6f 6d 70 69 6c 65 2e 63 0a 2d 2d tclCompile.c.--
3c10: 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 6f 6d - generic/tclCom
3c20: 70 69 6c 65 2e 63 09 31 39 20 46 65 62 20 32 30 pile.c.19 Feb 20
3c30: 30 33 20 31 34 3a 33 33 3a 33 39 20 2d 30 30 30 03 14:33:39 -000
3c40: 30 09 31 2e 34 33 0a 2b 2b 2b 20 67 65 6e 65 72 0.1.43.+++ gener
3c50: 69 63 2f 74 63 6c 43 6f 6d 70 69 6c 65 2e 63 09 ic/tclCompile.c.
3c60: 31 33 20 4d 61 72 20 32 30 30 33 20 30 32 3a 32 13 Mar 2003 02:2
3c70: 36 3a 35 38 20 2d 30 30 30 30 0a 40 40 20 2d 33 6:58 -0000.@@ -3
3c80: 34 38 2c 31 34 20 2b 33 34 38 2c 31 36 20 40 40 48,14 +348,16 @@
3c90: 0a 20 20 20 20 20 43 6f 6d 70 69 6c 65 48 6f 6f . CompileHoo
3ca0: 6b 50 72 6f 63 20 2a 68 6f 6f 6b 50 72 6f 63 3b kProc *hookProc;
3cb0: 09 2f 2a 20 50 72 6f 63 65 64 75 72 65 20 74 6f ./* Procedure to
3cc0: 20 69 6e 76 6f 6b 65 20 61 66 74 65 72 20 63 6f invoke after co
3cd0: 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 mpilation. */.
3ce0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ClientData cl
3cf0: 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 48 6f 6f ientData;./* Hoo
3d00: 6b 20 70 72 6f 63 65 64 75 72 65 20 70 72 69 76 k procedure priv
3d10: 61 74 65 20 64 61 74 61 2e 20 2a 2f 0a 20 7b 0a ate data. */. {.
3d20: 2b 23 69 66 64 65 66 20 54 43 4c 5f 43 4f 4d 50 +#ifdef TCL_COMP
3d30: 49 4c 45 5f 44 45 42 55 47 0a 20 20 20 20 20 49 ILE_DEBUG. I
3d40: 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 nterp *iPtr = (I
3d50: 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b nterp *) interp;
3d60: 0a 2b 23 65 6e 64 69 66 20 2f 2a 54 43 4c 5f 43 .+#endif /*TCL_C
3d70: 4f 4d 50 49 4c 45 5f 44 45 42 55 47 2a 2f 0a 20 OMPILE_DEBUG*/.
3d80: 20 20 20 20 43 6f 6d 70 69 6c 65 45 6e 76 20 63 CompileEnv c
3d90: 6f 6d 70 45 6e 76 3b 09 09 2f 2a 20 43 6f 6d 70 ompEnv;../* Comp
3da0: 69 6c 61 74 69 6f 6e 20 65 6e 76 69 72 6f 6e 6d ilation environm
3db0: 65 6e 74 20 73 74 72 75 63 74 75 72 65 0a 20 09 ent structure. .
3dc0: 09 09 09 20 2a 20 61 6c 6c 6f 63 61 74 65 64 20 ... * allocated
3dd0: 69 6e 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 in frame. */.
3de0: 20 20 4c 69 74 65 72 61 6c 54 61 62 6c 65 20 2a LiteralTable *
3df0: 6c 6f 63 61 6c 54 61 62 6c 65 50 74 72 20 3d 20 localTablePtr =
3e00: 26 28 63 6f 6d 70 45 6e 76 2e 6c 6f 63 61 6c 4c &(compEnv.localL
3e10: 69 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 72 itTable);. r
3e20: 65 67 69 73 74 65 72 20 41 75 78 44 61 74 61 20 egister AuxData
3e30: 2a 61 75 78 44 61 74 61 50 74 72 3b 0a 20 20 20 *auxDataPtr;.
3e40: 20 20 4c 69 74 65 72 61 6c 45 6e 74 72 79 20 2a LiteralEntry *
3e50: 65 6e 74 72 79 50 74 72 3b 0a 20 20 20 20 20 72 entryPtr;. r
3e60: 65 67 69 73 74 65 72 20 69 6e 74 20 69 3b 0a 2d egister int i;.-
3e70: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 2c 20 int length,
3e80: 6e 65 73 74 65 64 2c 20 72 65 73 75 6c 74 3b 0a nested, result;.
3e90: 2b 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 2c + int length,
3ea0: 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 63 68 result;. ch
3eb0: 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 0a 20 23 ar *string;. . #
3ec0: 69 66 64 65 66 20 54 43 4c 5f 43 4f 4d 50 49 4c ifdef TCL_COMPIL
3ed0: 45 5f 44 45 42 55 47 0a 40 40 20 2d 33 36 38 2c E_DEBUG.@@ -368,
3ee0: 32 31 20 2b 33 37 30 2c 31 35 20 40 40 0a 20 20 21 +370,15 @@.
3ef0: 20 20 20 7d 0a 20 23 65 6e 64 69 66 0a 20 0a 2d }. #endif. .-
3f00: 20 20 20 20 69 66 20 28 69 50 74 72 2d 3e 65 76 if (iPtr->ev
3f10: 61 6c 46 6c 61 67 73 20 26 20 54 43 4c 5f 42 52 alFlags & TCL_BR
3f20: 41 43 4b 45 54 5f 54 45 52 4d 29 20 7b 0a 2d 09 ACKET_TERM) {.-.
3f30: 6e 65 73 74 65 64 20 3d 20 31 3b 0a 2d 20 20 20 nested = 1;.-
3f40: 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 6e 65 73 74 } else {.-.nest
3f50: 65 64 20 3d 20 30 3b 0a 2d 20 20 20 20 7d 0a 20 ed = 0;.- }.
3f60: 20 20 20 20 73 74 72 69 6e 67 20 3d 20 54 63 6c string = Tcl
3f70: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
3f80: 6a 28 6f 62 6a 50 74 72 2c 20 26 6c 65 6e 67 74 j(objPtr, &lengt
3f90: 68 29 3b 0a 20 20 20 20 20 54 63 6c 49 6e 69 74 h);. TclInit
3fa0: 43 6f 6d 70 69 6c 65 45 6e 76 28 69 6e 74 65 72 CompileEnv(inter
3fb0: 70 2c 20 26 63 6f 6d 70 45 6e 76 2c 20 73 74 72 p, &compEnv, str
3fc0: 69 6e 67 2c 20 6c 65 6e 67 74 68 29 3b 0a 2d 20 ing, length);.-
3fd0: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 43 result = TclC
3fe0: 6f 6d 70 69 6c 65 53 63 72 69 70 74 28 69 6e 74 ompileScript(int
3ff0: 65 72 70 2c 20 73 74 72 69 6e 67 2c 20 6c 65 6e erp, string, len
4000: 67 74 68 2c 20 6e 65 73 74 65 64 2c 20 26 63 6f gth, nested, &co
4010: 6d 70 45 6e 76 29 3b 0a 2b 20 20 20 20 72 65 73 mpEnv);.+ res
4020: 75 6c 74 20 3d 20 54 63 6c 43 6f 6d 70 69 6c 65 ult = TclCompile
4030: 53 63 72 69 70 74 28 69 6e 74 65 72 70 2c 20 73 Script(interp, s
4040: 74 72 69 6e 67 2c 20 6c 65 6e 67 74 68 2c 20 26 tring, length, &
4050: 63 6f 6d 70 45 6e 76 29 3b 0a 20 0a 20 20 20 20 compEnv);. .
4060: 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 if (result == T
4070: 43 4c 5f 4f 4b 29 20 7b 0a 20 09 2f 2a 0a 20 09 CL_OK) {. ./*. .
4080: 20 2a 20 53 75 63 63 65 73 73 66 75 6c 20 63 6f * Successful co
4090: 6d 70 69 6c 61 74 69 6f 6e 2e 20 41 64 64 20 61 mpilation. Add a
40a0: 20 22 64 6f 6e 65 22 20 69 6e 73 74 72 75 63 74 "done" instruct
40b0: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 2e 0a ion at the end..
40c0: 20 09 20 2a 2f 0a 20 0a 2d 09 63 6f 6d 70 45 6e . */. .-.compEn
40d0: 76 2e 6e 75 6d 53 72 63 42 79 74 65 73 20 3d 20 v.numSrcBytes =
40e0: 69 50 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 iPtr->termOffset
40f0: 3b 0a 20 09 54 63 6c 45 6d 69 74 4f 70 63 6f 64 ;. .TclEmitOpcod
4100: 65 28 49 4e 53 54 5f 44 4f 4e 45 2c 20 26 63 6f e(INST_DONE, &co
4110: 6d 70 45 6e 76 29 3b 0a 20 0a 20 09 2f 2a 0a 40 mpEnv);. . ./*.@
4120: 40 20 2d 37 38 36 2c 31 30 20 2b 37 38 32 2c 36 @ -786,10 +782,6
4130: 20 40 40 0a 20 20 2a 09 6f 6e 20 66 61 69 6c 75 @@. *.on failu
4140: 72 65 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 re. If TCL_ERROR
4150: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 is returned, th
4160: 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 en the interpret
4170: 65 72 27 73 20 72 65 73 75 6c 74 0a 20 20 2a 09 er's result. *.
4180: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 72 72 6f contains an erro
4190: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 2a 0a 2d r message.. *.-
41a0: 20 2a 09 69 6e 74 65 72 70 2d 3e 74 65 72 6d 4f *.interp->termO
41b0: 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 ffset is set to
41c0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 the offset of th
41d0: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 e character in t
41e0: 68 65 0a 2d 20 2a 09 73 63 72 69 70 74 20 6a 75 he.- *.script ju
41f0: 73 74 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 st after the las
4200: 74 20 6f 6e 65 20 73 75 63 63 65 73 73 66 75 6c t one successful
4210: 6c 79 20 70 72 6f 63 65 73 73 65 64 3b 20 74 68 ly processed; th
4220: 69 73 20 77 69 6c 6c 20 62 65 0a 2d 20 2a 09 74 is will be.- *.t
4230: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 he offset of the
4240: 20 27 5d 27 20 69 66 20 28 66 6c 61 67 73 20 26 ']' if (flags &
4250: 20 54 43 4c 5f 42 52 41 43 4b 45 54 5f 54 45 52 TCL_BRACKET_TER
4260: 4d 29 2e 0a 2d 20 2a 0a 20 20 2a 20 53 69 64 65 M)..- *. * Side
4270: 20 65 66 66 65 63 74 73 3a 0a 20 20 2a 09 41 64 effects:. *.Ad
4280: 64 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 ds instructions
4290: 74 6f 20 65 6e 76 50 74 72 20 74 6f 20 65 76 61 to envPtr to eva
42a0: 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 luate the script
42b0: 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 20 20 2a at runtime.. *
42c0: 0a 40 40 20 2d 37 39 37 2c 37 20 2b 37 38 39 2c .@@ -797,7 +789,
42d0: 37 20 40 40 0a 20 20 2a 2f 0a 20 0a 20 69 6e 74 7 @@. */. . int
42e0: 0a 2d 54 63 6c 43 6f 6d 70 69 6c 65 53 63 72 69 .-TclCompileScri
42f0: 70 74 28 69 6e 74 65 72 70 2c 20 73 63 72 69 70 pt(interp, scrip
4300: 74 2c 20 6e 75 6d 42 79 74 65 73 2c 20 6e 65 73 t, numBytes, nes
4310: 74 65 64 2c 20 65 6e 76 50 74 72 29 0a 2b 54 63 ted, envPtr).+Tc
4320: 6c 43 6f 6d 70 69 6c 65 53 63 72 69 70 74 28 69 lCompileScript(i
4330: 6e 74 65 72 70 2c 20 73 63 72 69 70 74 2c 20 6e nterp, script, n
4340: 75 6d 42 79 74 65 73 2c 20 65 6e 76 50 74 72 29 umBytes, envPtr)
4350: 0a 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 . Tcl_Interp
4360: 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 55 73 *interp;../* Us
4370: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 61 6e 64 ed for error and
4380: 20 73 74 61 74 75 73 20 72 65 70 6f 72 74 69 6e status reportin
4390: 67 2e 0a 20 09 09 09 09 20 2a 20 41 6c 73 6f 20 g.. .... * Also
43a0: 73 65 72 76 65 73 20 61 73 20 63 6f 6e 74 65 78 serves as contex
43b0: 74 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e t for finding an
43c0: 64 0a 20 09 09 09 09 20 2a 20 63 6f 6d 70 69 6c d. .... * compil
43d0: 69 6e 67 20 63 6f 6d 6d 61 6e 64 73 2e 20 20 4d ing commands. M
43e0: 61 79 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 ay not be NULL.
43f0: 2a 2f 0a 40 40 20 2d 38 30 35 2c 31 30 20 2b 37 */.@@ -805,10 +7
4400: 39 37 2c 36 20 40 40 0a 20 20 20 20 20 69 6e 74 97,6 @@. int
4410: 20 6e 75 6d 42 79 74 65 73 3b 09 09 2f 2a 20 4e numBytes;../* N
4420: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 umber of bytes i
4430: 6e 20 73 63 72 69 70 74 2e 20 49 66 20 3c 20 30 n script. If < 0
4440: 2c 20 74 68 65 0a 20 09 09 09 09 20 2a 20 73 63 , the. .... * sc
4450: 72 69 70 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 ript consists of
4460: 20 61 6c 6c 20 62 79 74 65 73 20 75 70 20 74 6f all bytes up to
4470: 20 74 68 65 0a 20 09 09 09 09 20 2a 20 66 69 72 the. .... * fir
4480: 73 74 20 6e 75 6c 6c 20 63 68 61 72 61 63 74 65 st null characte
4490: 72 2e 20 2a 2f 0a 2d 20 20 20 20 69 6e 74 20 6e r. */.- int n
44a0: 65 73 74 65 64 3b 09 09 09 2f 2a 20 4e 6f 6e 2d ested;.../* Non-
44b0: 7a 65 72 6f 20 6d 65 61 6e 73 20 74 68 69 73 20 zero means this
44c0: 69 73 20 61 20 6e 65 73 74 65 64 20 63 6f 6d 6d is a nested comm
44d0: 61 6e 64 3a 0a 2d 09 09 09 09 20 2a 20 63 6c 6f and:.-.... * clo
44e0: 73 65 20 62 72 61 63 6b 65 74 20 27 5d 27 20 73 se bracket ']' s
44f0: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 hould be conside
4500: 72 65 64 20 61 0a 2d 09 09 09 09 20 2a 20 63 6f red a.-.... * co
4510: 6d 6d 61 6e 64 20 74 65 72 6d 69 6e 61 74 6f 72 mmand terminator
4520: 2e 20 49 66 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 . If zero, close
4530: 0a 2d 09 09 09 09 20 2a 20 62 72 61 63 6b 65 74 .-.... * bracket
4540: 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 has no special
4550: 6d 65 61 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 meaning. */.
4560: 20 43 6f 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76 CompileEnv *env
4570: 50 74 72 3b 09 09 2f 2a 20 48 6f 6c 64 73 20 72 Ptr;../* Holds r
4580: 65 73 75 6c 74 69 6e 67 20 69 6e 73 74 72 75 63 esulting instruc
4590: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 7b 0a 20 20 20 tions. */. {.
45a0: 20 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d Interp *iPtr =
45b0: 20 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 (Interp *) inte
45c0: 72 70 3b 0a 40 40 20 2d 38 34 35 2c 35 35 20 2b rp;.@@ -845,55 +
45d0: 38 33 33 2c 31 31 20 40 40 0a 20 20 20 20 20 62 833,11 @@. b
45e0: 79 74 65 73 4c 65 66 74 20 3d 20 6e 75 6d 42 79 ytesLeft = numBy
45f0: 74 65 73 3b 0a 20 20 20 20 20 67 6f 74 50 61 72 tes;. gotPar
4600: 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 64 6f 20 se = 0;. do
4610: 7b 0a 2d 09 69 66 20 28 54 63 6c 5f 50 61 72 73 {.-.if (Tcl_Pars
4620: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c eCommand(interp,
4630: 20 70 2c 20 62 79 74 65 73 4c 65 66 74 2c 20 6e p, bytesLeft, n
4640: 65 73 74 65 64 2c 20 26 70 61 72 73 65 29 20 21 ested, &parse) !
4650: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 69 66 = TCL_OK) {.+.if
4660: 20 28 54 63 6c 5f 50 61 72 73 65 43 6f 6d 6d 61 (Tcl_ParseComma
4670: 6e 64 28 69 6e 74 65 72 70 2c 20 70 2c 20 62 79 nd(interp, p, by
4680: 74 65 73 4c 65 66 74 2c 20 30 2c 20 26 70 61 72 tesLeft, 0, &par
4690: 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b se) != TCL_OK) {
46a0: 0a 20 09 20 20 20 20 63 6f 64 65 20 3d 20 54 43 . . code = TC
46b0: 4c 5f 45 52 52 4f 52 3b 0a 20 09 20 20 20 20 67 L_ERROR;. . g
46c0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 09 7d 0a 20 oto error;. .}.
46d0: 09 67 6f 74 50 61 72 73 65 20 3d 20 31 3b 0a 2d .gotParse = 1;.-
46e0: 09 69 66 20 28 6e 65 73 74 65 64 29 20 7b 0a 2d .if (nested) {.-
46f0: 09 20 20 20 20 2f 2a 0a 2d 09 20 20 20 20 20 2a . /*.-. *
4700: 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 75 73 This is an unus
4710: 75 61 6c 20 73 69 74 75 61 74 69 6f 6e 20 77 68 ual situation wh
4720: 65 72 65 20 74 68 65 20 63 61 6c 6c 65 72 20 68 ere the caller h
4730: 61 73 20 70 61 73 73 65 64 20 75 73 0a 2d 09 20 as passed us.-.
4740: 20 20 20 20 2a 20 61 20 6e 6f 6e 2d 7a 65 72 6f * a non-zero
4750: 20 76 61 6c 75 65 20 66 6f 72 20 22 6e 65 73 74 value for "nest
4760: 65 64 22 2e 20 20 48 6f 77 20 75 6e 75 73 75 61 ed". How unusua
4770: 6c 3f 20 20 57 65 6c 6c 2c 20 74 68 69 73 0a 2d l? Well, this.-
4780: 09 20 20 20 20 20 2a 20 70 72 6f 63 65 64 75 72 . * procedur
4790: 65 2c 20 54 63 6c 43 6f 6d 70 69 6c 65 53 63 72 e, TclCompileScr
47a0: 69 70 74 2c 20 69 73 20 69 6e 74 65 72 6e 61 6c ipt, is internal
47b0: 20 74 6f 20 54 63 6c 2c 20 73 6f 20 61 6c 6c 0a to Tcl, so all.
47c0: 2d 09 20 20 20 20 20 2a 20 63 61 6c 6c 65 72 73 -. * callers
47d0: 20 73 68 6f 75 6c 64 20 62 65 20 77 69 74 68 69 should be withi
47e0: 6e 20 54 63 6c 20 69 74 73 65 6c 66 2e 20 20 41 n Tcl itself. A
47f0: 6c 6c 20 62 75 74 20 6f 6e 65 20 6f 66 20 74 68 ll but one of th
4800: 6f 73 65 0a 2d 09 20 20 20 20 20 2a 20 63 61 6c ose.-. * cal
4810: 6c 65 72 73 20 65 78 70 6c 69 63 69 74 6c 79 20 lers explicitly
4820: 70 61 73 73 20 69 6e 20 28 6e 65 73 74 65 64 20 pass in (nested
4830: 3d 20 30 29 2e 20 20 54 68 65 20 65 78 63 65 70 = 0). The excep
4840: 74 69 6f 6e 61 6c 0a 2d 09 20 20 20 20 20 2a 20 tional.-. *
4850: 63 61 6c 6c 65 72 20 69 73 20 54 63 6c 53 65 74 caller is TclSet
4860: 42 79 74 65 43 6f 64 65 46 72 6f 6d 41 6e 79 2c ByteCodeFromAny,
4870: 20 77 68 69 63 68 20 77 69 6c 6c 20 70 61 73 73 which will pass
4880: 20 69 6e 0a 2d 09 20 20 20 20 20 2a 20 28 6e 65 in.-. * (ne
4890: 73 74 65 64 20 3d 20 31 29 20 69 66 20 61 6e 64 sted = 1) if and
48a0: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 66 6c 61 only if the fla
48b0: 67 20 54 43 4c 5f 42 52 41 43 4b 45 54 5f 54 45 g TCL_BRACKET_TE
48c0: 52 4d 0a 2d 09 20 20 20 20 20 2a 20 69 73 20 73 RM.-. * is s
48d0: 65 74 20 69 6e 20 74 68 65 20 65 76 61 6c 46 6c et in the evalFl
48e0: 61 67 73 20 66 69 65 6c 64 20 6f 66 20 69 6e 74 ags field of int
48f0: 65 72 70 2e 0a 2d 09 20 20 20 20 20 2a 0a 2d 09 erp..-. *.-.
4900: 20 20 20 20 20 2a 20 49 74 20 61 70 70 65 61 72 * It appear
4910: 73 20 74 68 61 74 20 74 68 65 20 54 43 4c 5f 42 s that the TCL_B
4920: 52 41 43 4b 45 54 5f 54 45 52 4d 20 66 6c 61 67 RACKET_TERM flag
4930: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 is only ever se
4940: 74 0a 2d 09 20 20 20 20 20 2a 20 62 79 20 54 63 t.-. * by Tc
4950: 6c 5f 53 75 62 73 74 4f 62 6a 2c 20 61 6e 64 20 l_SubstObj, and
4960: 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 it immediately c
4970: 61 6c 6c 73 20 54 63 6c 5f 45 76 61 6c 45 78 0a alls Tcl_EvalEx.
4980: 2d 09 20 20 20 20 20 2a 20 77 68 69 63 68 20 63 -. * which c
4990: 6c 65 61 72 73 20 74 68 65 20 66 6c 61 67 20 62 lears the flag b
49a0: 65 66 6f 72 65 20 70 61 73 73 69 6e 67 20 74 68 efore passing th
49b0: 65 20 69 6e 74 65 72 70 20 61 6c 6f 6e 67 2e 0a e interp along..
49c0: 2d 09 20 20 20 20 20 2a 20 53 6f 2c 20 49 20 64 -. * So, I d
49d0: 6f 6e 27 74 20 74 68 69 6e 6b 20 74 68 69 73 20 on't think this
49e0: 70 72 6f 63 65 64 75 72 65 2c 20 54 63 6c 43 6f procedure, TclCo
49f0: 6d 70 69 6c 65 53 63 72 69 70 74 2c 20 69 73 0a mpileScript, is.
4a00: 2d 09 20 20 20 20 20 2a 20 2a 2a 65 76 65 72 2a -. * **ever*
4a10: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 28 6e * called with (n
4a20: 65 73 74 65 64 20 21 3d 20 30 29 2e 20 0a 2d 09 ested != 0). .-.
4a30: 20 20 20 20 20 2a 20 28 54 68 65 20 74 65 73 74 * (The test
4a40: 73 75 69 74 65 20 69 6e 64 65 65 64 20 64 6f 65 suite indeed doe
4a50: 73 6e 27 74 20 65 78 65 72 63 69 73 65 20 74 68 sn't exercise th
4a60: 69 73 20 63 6f 64 65 2e 20 4d 53 29 0a 2d 09 20 is code. MS).-.
4a70: 20 20 20 20 2a 0a 2d 09 20 20 20 20 20 2a 20 54 *.-. * T
4a80: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 his means that t
4a90: 68 65 20 62 72 61 6e 63 68 65 73 20 69 6e 20 74 he branches in t
4aa0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 74 68 his procedure th
4ab0: 61 74 20 61 72 65 0a 2d 09 20 20 20 20 20 2a 20 at are.-. *
4ac0: 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 68 65 6e only active when
4ad0: 20 28 6e 65 73 74 65 64 20 21 3d 20 30 29 20 61 (nested != 0) a
4ae0: 72 65 20 70 72 6f 62 61 62 6c 79 20 6e 65 76 65 re probably neve
4af0: 72 20 65 78 65 72 63 69 73 65 64 2e 0a 2d 09 20 r exercised..-.
4b00: 20 20 20 20 2a 20 54 68 69 73 20 6d 65 61 6e 73 * This means
4b10: 20 74 68 61 74 20 61 6e 79 20 62 75 67 73 20 69 that any bugs i
4b20: 6e 20 74 68 65 6d 20 67 6f 20 75 6e 6e 6f 74 69 n them go unnoti
4b30: 63 65 64 2c 20 61 6e 64 20 61 6e 79 20 62 75 67 ced, and any bug
4b40: 0a 2d 09 20 20 20 20 20 2a 20 66 69 78 65 73 20 .-. * fixes
4b50: 69 6e 20 74 68 65 6d 20 68 61 76 65 20 61 20 73 in them have a s
4b60: 65 6d 69 2d 74 68 65 6f 72 65 74 69 63 61 6c 20 emi-theoretical
4b70: 6e 61 74 75 72 65 2e 0a 2d 09 20 20 20 20 20 2a nature..-. *
4b80: 0a 2d 09 20 20 20 20 20 2a 20 41 6c 6c 20 74 68 .-. * All th
4b90: 61 74 20 73 61 69 64 2c 20 74 68 65 20 73 70 65 at said, the spe
4ba0: 63 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 c for this proce
4bb0: 64 75 72 65 20 73 61 79 73 20 69 74 20 73 68 6f dure says it sho
4bc0: 75 6c 64 0a 2d 09 20 20 20 20 20 2a 20 68 61 6e uld.-. * han
4bd0: 64 6c 65 20 74 68 65 20 28 6e 65 73 74 65 64 20 dle the (nested
4be0: 21 3d 20 30 29 20 63 61 73 65 2c 20 73 6f 20 68 != 0) case, so h
4bf0: 65 72 65 27 73 20 61 6e 20 61 74 74 65 6d 70 74 ere's an attempt
4c00: 20 74 6f 20 66 69 78 0a 2d 09 20 20 20 20 20 2a to fix.-. *
4c10: 20 62 75 67 73 20 28 54 63 6c 20 42 75 67 20 36 bugs (Tcl Bug 6
4c20: 38 31 38 34 31 29 20 69 6e 20 74 68 61 74 20 63 81841) in that c
4c30: 61 73 65 2e 20 20 4a 75 73 74 20 69 6e 20 63 61 ase. Just in ca
4c40: 73 65 20 73 6f 6d 65 0a 2d 09 20 20 20 20 20 2a se some.-. *
4c50: 20 63 61 6c 6c 65 72 73 20 65 76 65 6e 74 75 61 callers eventua
4c60: 6c 6c 79 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 61 lly come along a
4c70: 6e 64 20 65 78 70 65 63 74 20 69 74 20 74 6f 20 nd expect it to
4c80: 77 6f 72 6b 2e 2e 2e 0a 2d 09 20 20 20 20 20 2a work....-. *
4c90: 2f 0a 2d 0a 2d 09 20 20 20 20 69 66 20 28 70 61 /.-.-. if (pa
4ca0: 72 73 65 2e 74 65 72 6d 20 3d 3d 20 28 73 63 72 rse.term == (scr
4cb0: 69 70 74 20 2b 20 6e 75 6d 42 79 74 65 73 29 29 ipt + numBytes))
4cc0: 20 7b 0a 2d 09 09 2f 2a 20 0a 2d 09 09 20 2a 20 {.-../* .-.. *
4cd0: 54 68 65 20 28 6e 65 73 74 65 64 20 21 3d 20 30 The (nested != 0
4ce0: 29 20 63 61 73 65 20 69 73 20 6d 65 61 6e 74 20 ) case is meant
4cf0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 to indicate that
4d00: 20 74 68 65 0a 2d 09 09 20 2a 20 63 61 6c 6c 65 the.-.. * calle
4d10: 72 20 66 6f 75 6e 64 20 61 6e 20 6f 70 65 6e 20 r found an open
4d20: 62 72 61 63 6b 65 74 20 28 5b 29 20 61 6e 64 20 bracket ([) and
4d30: 61 73 6b 65 64 20 75 73 20 74 6f 0a 2d 09 09 20 asked us to.-..
4d40: 2a 20 70 61 72 73 65 20 61 6e 64 20 63 6f 6d 70 * parse and comp
4d50: 69 6c 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 ile Tcl commands
4d60: 20 75 70 20 74 6f 20 74 68 65 20 6d 61 74 63 68 up to the match
4d70: 69 6e 67 0a 2d 09 09 20 2a 20 63 6c 6f 73 65 20 ing.-.. * close
4d80: 62 72 61 63 6b 65 74 20 28 5d 29 2e 20 20 57 65 bracket (]). We
4d90: 20 68 61 76 65 20 74 6f 20 64 65 74 65 63 74 20 have to detect
4da0: 61 6e 64 20 68 61 6e 64 6c 65 0a 2d 09 09 20 2a and handle.-.. *
4db0: 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 the case where
4dc0: 74 68 65 20 63 6c 6f 73 65 20 62 72 61 63 6b 65 the close bracke
4dd0: 74 20 69 73 20 6d 69 73 73 69 6e 67 2e 0a 2d 09 t is missing..-.
4de0: 09 20 2a 2f 0a 2d 0a 2d 09 09 54 63 6c 5f 53 65 . */.-.-..Tcl_Se
4df0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
4e00: 70 2c 0a 2d 09 09 09 54 63 6c 5f 4e 65 77 53 74 p,.-...Tcl_NewSt
4e10: 72 69 6e 67 4f 62 6a 28 22 6d 69 73 73 69 6e 67 ringObj("missing
4e20: 20 63 6c 6f 73 65 2d 62 72 61 63 6b 65 74 22 2c close-bracket",
4e30: 20 2d 31 29 29 3b 0a 2d 09 09 63 6f 64 65 20 3d -1));.-..code =
4e40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2d 09 09 67 TCL_ERROR;.-..g
4e50: 6f 74 6f 20 65 72 72 6f 72 3b 0a 2d 09 20 20 20 oto error;.-.
4e60: 20 7d 0a 2d 09 7d 0a 20 09 69 66 20 28 70 61 72 }.-.}. .if (par
4e70: 73 65 2e 6e 75 6d 57 6f 72 64 73 20 3e 20 30 29 se.numWords > 0)
4e80: 20 7b 0a 20 09 20 20 20 20 2f 2a 0a 20 09 20 20 {. . /*. .
4e90: 20 20 20 2a 20 49 66 20 6e 6f 74 20 74 68 65 20 * If not the
4ea0: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 2c 20 70 first command, p
4eb0: 6f 70 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 op the previous
4ec0: 63 6f 6d 6d 61 6e 64 27 73 20 72 65 73 75 6c 74 command's result
4ed0: 0a 40 40 20 2d 39 30 33 2c 31 31 20 2b 38 34 37 .@@ -903,11 +847
4ee0: 2c 38 20 40 40 0a 20 0a 20 09 20 20 20 20 69 66 ,8 @@. . . if
4ef0: 20 28 21 69 73 46 69 72 73 74 43 6d 64 29 20 7b (!isFirstCmd) {
4f00: 0a 20 09 09 54 63 6c 45 6d 69 74 4f 70 63 6f 64 . ..TclEmitOpcod
4f10: 65 28 49 4e 53 54 5f 50 4f 50 2c 20 65 6e 76 50 e(INST_POP, envP
4f20: 74 72 29 3b 0a 2d 09 09 69 66 20 28 21 6e 65 73 tr);.-..if (!nes
4f30: 74 65 64 29 20 7b 0a 2d 09 09 20 20 20 20 65 6e ted) {.-.. en
4f40: 76 50 74 72 2d 3e 63 6d 64 4d 61 70 50 74 72 5b vPtr->cmdMapPtr[
4f50: 6c 61 73 74 54 6f 70 4c 65 76 65 6c 43 6d 64 49 lastTopLevelCmdI
4f60: 6e 64 65 78 5d 2e 6e 75 6d 43 6f 64 65 42 79 74 ndex].numCodeByt
4f70: 65 73 20 3d 0a 2d 09 09 09 20 20 20 28 65 6e 76 es =.-... (env
4f80: 50 74 72 2d 3e 63 6f 64 65 4e 65 78 74 20 2d 20 Ptr->codeNext -
4f90: 65 6e 76 50 74 72 2d 3e 63 6f 64 65 53 74 61 72 envPtr->codeStar
4fa0: 74 29 0a 2d 09 09 09 20 20 20 2d 20 73 74 61 72 t).-... - star
4fb0: 74 43 6f 64 65 4f 66 66 73 65 74 3b 0a 2d 09 09 tCodeOffset;.-..
4fc0: 7d 0a 2b 09 09 65 6e 76 50 74 72 2d 3e 63 6d 64 }.+..envPtr->cmd
4fd0: 4d 61 70 50 74 72 5b 6c 61 73 74 54 6f 70 4c 65 MapPtr[lastTopLe
4fe0: 76 65 6c 43 6d 64 49 6e 64 65 78 5d 2e 6e 75 6d velCmdIndex].num
4ff0: 43 6f 64 65 42 79 74 65 73 20 3d 0a 2b 09 09 09 CodeBytes =.+...
5000: 28 65 6e 76 50 74 72 2d 3e 63 6f 64 65 4e 65 78 (envPtr->codeNex
5010: 74 20 2d 20 65 6e 76 50 74 72 2d 3e 63 6f 64 65 t - envPtr->code
5020: 53 74 61 72 74 29 20 2d 20 73 74 61 72 74 43 6f Start) - startCo
5030: 64 65 4f 66 66 73 65 74 3b 0a 20 09 20 20 20 20 deOffset;. .
5040: 7d 0a 20 0a 20 09 20 20 20 20 2f 2a 0a 40 40 20 }. . . /*.@@
5050: 2d 39 33 31 2c 38 20 2b 38 37 32 2c 37 20 40 40 -931,8 +872,7 @@
5060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a . *
5070: 20 49 66 20 74 72 61 63 69 6e 67 2c 20 70 72 69 If tracing, pri
5080: 6e 74 20 61 20 6c 69 6e 65 20 66 6f 72 20 65 61 nt a line for ea
5090: 63 68 20 74 6f 70 20 6c 65 76 65 6c 20 63 6f 6d ch top level com
50a0: 6d 61 6e 64 20 63 6f 6d 70 69 6c 65 64 2e 0a 20 mand compiled..
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a */.
50c0: 20 0a 2d 09 20 20 20 20 69 66 20 28 28 74 63 6c .-. if ((tcl
50d0: 54 72 61 63 65 43 6f 6d 70 69 6c 65 20 3e 3d 20 TraceCompile >=
50e0: 31 29 0a 2d 09 09 20 20 20 20 26 26 20 21 6e 65 1).-.. && !ne
50f0: 73 74 65 64 20 26 26 20 28 65 6e 76 50 74 72 2d sted && (envPtr-
5100: 3e 70 72 6f 63 50 74 72 20 3d 3d 20 4e 55 4c 4c >procPtr == NULL
5110: 29 29 20 7b 0a 2b 09 20 20 20 20 69 66 20 28 28 )) {.+. if ((
5120: 74 63 6c 54 72 61 63 65 43 6f 6d 70 69 6c 65 20 tclTraceCompile
5130: 3e 3d 20 31 29 20 26 26 20 28 65 6e 76 50 74 72 >= 1) && (envPtr
5140: 2d 3e 70 72 6f 63 50 74 72 20 3d 3d 20 4e 55 4c ->procPtr == NUL
5150: 4c 29 29 20 7b 0a 20 09 09 66 70 72 69 6e 74 66 L)) {. ..fprintf
5160: 28 73 74 64 6f 75 74 2c 20 22 20 20 43 6f 6d 70 (stdout, " Comp
5170: 69 6c 69 6e 67 3a 20 22 29 3b 0a 20 09 09 54 63 iling: ");. ..Tc
5180: 6c 50 72 69 6e 74 53 6f 75 72 63 65 28 73 74 64 lPrintSource(std
5190: 6f 75 74 2c 20 70 61 72 73 65 2e 63 6f 6d 6d 61 out, parse.comma
51a0: 6e 64 53 74 61 72 74 2c 0a 20 09 09 09 54 63 6c ndStart,. ...Tcl
51b0: 4d 69 6e 28 63 6f 6d 6d 61 6e 64 4c 65 6e 67 74 Min(commandLengt
51c0: 68 2c 20 35 35 29 29 3b 0a 40 40 20 2d 39 34 36 h, 55));.@@ -946
51d0: 2c 39 20 2b 38 38 36 2c 37 20 40 40 0a 20 09 20 ,9 +886,7 @@. .
51e0: 20 20 20 0a 20 09 20 20 20 20 65 6e 76 50 74 72 . . envPtr
51f0: 2d 3e 6e 75 6d 43 6f 6d 6d 61 6e 64 73 2b 2b 3b ->numCommands++;
5200: 0a 20 09 20 20 20 20 63 75 72 72 43 6d 64 49 6e . . currCmdIn
5210: 64 65 78 20 3d 20 28 65 6e 76 50 74 72 2d 3e 6e dex = (envPtr->n
5220: 75 6d 43 6f 6d 6d 61 6e 64 73 20 2d 20 31 29 3b umCommands - 1);
5230: 0a 2d 09 20 20 20 20 69 66 20 28 21 6e 65 73 74 .-. if (!nest
5240: 65 64 29 20 7b 0a 2d 09 09 6c 61 73 74 54 6f 70 ed) {.-..lastTop
5250: 4c 65 76 65 6c 43 6d 64 49 6e 64 65 78 20 3d 20 LevelCmdIndex =
5260: 63 75 72 72 43 6d 64 49 6e 64 65 78 3b 0a 2d 09 currCmdIndex;.-.
5270: 20 20 20 20 7d 0a 2b 09 20 20 20 20 6c 61 73 74 }.+. last
5280: 54 6f 70 4c 65 76 65 6c 43 6d 64 49 6e 64 65 78 TopLevelCmdIndex
5290: 20 3d 20 63 75 72 72 43 6d 64 49 6e 64 65 78 3b = currCmdIndex;
52a0: 0a 20 09 20 20 20 20 73 74 61 72 74 43 6f 64 65 . . startCode
52b0: 4f 66 66 73 65 74 20 3d 20 28 65 6e 76 50 74 72 Offset = (envPtr
52c0: 2d 3e 63 6f 64 65 4e 65 78 74 20 2d 20 65 6e 76 ->codeNext - env
52d0: 50 74 72 2d 3e 63 6f 64 65 53 74 61 72 74 29 3b Ptr->codeStart);
52e0: 0a 20 09 20 20 20 20 45 6e 74 65 72 43 6d 64 53 . . EnterCmdS
52f0: 74 61 72 74 44 61 74 61 28 65 6e 76 50 74 72 2c tartData(envPtr,
5300: 20 63 75 72 72 43 6d 64 49 6e 64 65 78 2c 0a 20 currCmdIndex,.
5310: 09 20 20 20 20 20 20 20 20 20 20 20 20 28 70 61 . (pa
5320: 72 73 65 2e 63 6f 6d 6d 61 6e 64 53 74 61 72 74 rse.commandStart
5330: 20 2d 20 65 6e 76 50 74 72 2d 3e 73 6f 75 72 63 - envPtr->sourc
5340: 65 29 2c 20 73 74 61 72 74 43 6f 64 65 4f 66 66 e), startCodeOff
5350: 73 65 74 29 3b 0a 40 40 20 2d 31 30 37 31 2c 31 set);.@@ -1071,1
5360: 36 20 2b 31 30 30 39 2c 36 20 40 40 0a 20 09 70 6 +1009,6 @@. .p
5370: 20 3d 20 6e 65 78 74 3b 0a 20 09 54 63 6c 5f 46 = next;. .Tcl_F
5380: 72 65 65 50 61 72 73 65 28 26 70 61 72 73 65 29 reeParse(&parse)
5390: 3b 0a 20 09 67 6f 74 50 61 72 73 65 20 3d 20 30 ;. .gotParse = 0
53a0: 3b 0a 2d 09 69 66 20 28 6e 65 73 74 65 64 20 26 ;.-.if (nested &
53b0: 26 20 28 2a 70 61 72 73 65 2e 74 65 72 6d 20 3d & (*parse.term =
53c0: 3d 20 27 5d 27 29 29 20 7b 0a 2d 09 20 20 20 20 = ']')) {.-.
53d0: 2f 2a 0a 2d 09 20 20 20 20 20 2a 20 57 65 20 67 /*.-. * We g
53e0: 65 74 20 68 65 72 65 20 69 6e 20 74 68 65 20 73 et here in the s
53f0: 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 pecial case wher
5400: 65 20 54 43 4c 5f 42 52 41 43 4b 45 54 5f 54 45 e TCL_BRACKET_TE
5410: 52 4d 20 77 61 73 0a 2d 09 20 20 20 20 20 2a 20 RM was.-. *
5420: 73 65 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 set in the inter
5430: 70 72 65 74 65 72 20 61 6e 64 20 74 68 65 20 6c preter and the l
5440: 61 74 65 73 74 20 70 61 72 73 65 64 20 63 6f 6d atest parsed com
5450: 6d 61 6e 64 20 77 61 73 0a 2d 09 20 20 20 20 20 mand was.-.
5460: 2a 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 * terminated by
5470: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6c 6f the matching clo
5480: 73 65 2d 62 72 61 63 6b 65 74 20 77 65 20 77 65 se-bracket we we
5490: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 2e 0a re looking for..
54a0: 2d 09 20 20 20 20 20 2a 20 53 74 6f 70 20 63 6f -. * Stop co
54b0: 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2d 09 20 20 20 mpilation..-.
54c0: 20 20 2a 2f 0a 2d 09 20 20 20 20 0a 2d 09 20 20 */.-. .-.
54d0: 20 20 62 72 65 61 6b 3b 0a 2d 09 7d 0a 20 20 20 break;.-.}.
54e0: 20 20 7d 20 77 68 69 6c 65 20 28 62 79 74 65 73 } while (bytes
54f0: 4c 65 66 74 20 3e 20 30 29 3b 0a 20 0a 20 20 20 Left > 0);. .
5500: 20 20 2f 2a 0a 40 40 20 2d 31 30 39 33 2c 31 37 /*.@@ -1093,17
5510: 20 2b 31 30 32 31 2c 37 20 40 40 0a 20 09 20 20 +1021,7 @@. .
5520: 20 20 20 20 20 20 65 6e 76 50 74 72 29 3b 0a 20 envPtr);.
5530: 20 20 20 20 7d 0a 20 20 20 20 20 0a 2d 20 20 20 }. .-
5540: 20 69 66 20 28 6e 65 73 74 65 64 29 20 7b 0a 2d if (nested) {.-
5550: 09 2f 2a 0a 2d 09 20 2a 20 57 68 65 6e 20 28 6e ./*.-. * When (n
5560: 65 73 74 65 64 20 21 3d 20 30 29 20 62 61 63 6b ested != 0) back
5570: 20 75 70 20 31 20 63 68 61 72 61 63 74 65 72 20 up 1 character
5580: 74 6f 20 68 61 76 65 20 0a 2d 09 20 2a 20 69 50 to have .-. * iP
5590: 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 74 20 69 tr->termOffset i
55a0: 6e 64 69 63 61 74 65 20 74 68 65 20 6f 66 66 73 ndicate the offs
55b0: 65 74 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 et to the matchi
55c0: 6e 67 0a 2d 09 20 2a 20 63 6c 6f 73 65 2d 62 72 ng.-. * close-br
55d0: 61 63 6b 65 74 2e 0a 2d 09 20 2a 2f 0a 2d 0a 2d acket..-. */.-.-
55e0: 09 69 50 74 72 2d 3e 74 65 72 6d 4f 66 66 73 65 .iPtr->termOffse
55f0: 74 20 3d 20 28 70 20 2d 20 31 29 20 2d 20 73 63 t = (p - 1) - sc
5600: 72 69 70 74 3b 0a 2d 20 20 20 20 7d 20 65 6c 73 ript;.- } els
5610: 65 20 7b 0a 2d 09 69 50 74 72 2d 3e 74 65 72 6d e {.-.iPtr->term
5620: 4f 66 66 73 65 74 20 3d 20 28 70 20 2d 20 73 63 Offset = (p - sc
5630: 72 69 70 74 29 3b 0a 2d 20 20 20 20 7d 0a 2b 20 ript);.- }.+
5640: 20 20 20 65 6e 76 50 74 72 2d 3e 6e 75 6d 53 72 envPtr->numSr
5650: 63 42 79 74 65 73 20 3d 20 28 70 20 2d 20 73 63 cBytes = (p - sc
5660: 72 69 70 74 29 3b 0a 20 20 20 20 20 54 63 6c 5f ript);. Tcl_
5670: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
5680: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;. return TC
5690: 4c 5f 4f 4b 3b 0a 20 09 0a 40 40 20 2d 31 31 33 L_OK;. ..@@ -113
56a0: 32 2c 37 20 2b 31 30 35 30 2c 37 20 40 40 0a 20 2,7 +1050,7 @@.
56b0: 20 20 20 20 69 66 20 28 67 6f 74 50 61 72 73 65 if (gotParse
56c0: 29 20 7b 0a 20 09 54 63 6c 5f 46 72 65 65 50 61 ) {. .Tcl_FreePa
56d0: 72 73 65 28 26 70 61 72 73 65 29 3b 0a 20 20 20 rse(&parse);.
56e0: 20 20 7d 0a 2d 20 20 20 20 69 50 74 72 2d 3e 74 }.- iPtr->t
56f0: 65 72 6d 4f 66 66 73 65 74 20 3d 20 28 70 20 2d ermOffset = (p -
5700: 20 73 63 72 69 70 74 29 3b 0a 2b 20 20 20 20 65 script);.+ e
5710: 6e 76 50 74 72 2d 3e 6e 75 6d 53 72 63 42 79 74 nvPtr->numSrcByt
5720: 65 73 20 3d 20 28 70 20 2d 20 73 63 72 69 70 74 es = (p - script
5730: 29 3b 0a 20 20 20 20 20 54 63 6c 5f 44 53 74 72 );. Tcl_DStr
5740: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
5750: 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a return code;.
5760: 20 7d 0a 40 40 20 2d 31 32 30 37 2c 37 20 2b 31 }.@@ -1207,7 +1
5770: 31 32 35 2c 37 20 40 40 0a 20 09 09 7d 0a 20 09 125,7 @@. ..}. .
5780: 09 0a 20 09 09 63 6f 64 65 20 3d 20 54 63 6c 43 .. ..code = TclC
5790: 6f 6d 70 69 6c 65 53 63 72 69 70 74 28 69 6e 74 ompileScript(int
57a0: 65 72 70 2c 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 erp, tokenPtr->s
57b0: 74 61 72 74 2b 31 2c 0a 2d 09 09 09 74 6f 6b 65 tart+1,.-...toke
57c0: 6e 50 74 72 2d 3e 73 69 7a 65 2d 32 2c 20 2f 2a nPtr->size-2, /*
57d0: 6e 65 73 74 65 64 2a 2f 20 30 2c 09 65 6e 76 50 nested*/ 0,.envP
57e0: 74 72 29 3b 0a 2b 09 09 09 74 6f 6b 65 6e 50 74 tr);.+...tokenPt
57f0: 72 2d 3e 73 69 7a 65 2d 32 2c 20 65 6e 76 50 74 r->size-2, envPt
5800: 72 29 3b 0a 20 09 09 69 66 20 28 63 6f 64 65 20 r);. ..if (code
5810: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 20 09 09 != TCL_OK) {. ..
5820: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a goto error;.
5830: 20 09 09 7d 0a 40 40 20 2d 31 33 39 36 2c 38 20 ..}.@@ -1396,8
5840: 2b 31 33 31 34 2c 37 20 40 40 0a 20 20 20 20 20 +1314,7 @@.
5850: 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 69 */. . i
5860: 66 20 28 28 63 6f 75 6e 74 20 3d 3d 20 31 29 20 f ((count == 1)
5870: 26 26 20 28 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 && (tokenPtr->ty
5880: 70 65 20 3d 3d 20 54 43 4c 5f 54 4f 4b 45 4e 5f pe == TCL_TOKEN_
5890: 54 45 58 54 29 29 20 7b 0a 2d 09 63 6f 64 65 20 TEXT)) {.-.code
58a0: 3d 20 54 63 6c 43 6f 6d 70 69 6c 65 53 63 72 69 = TclCompileScri
58b0: 70 74 28 69 6e 74 65 72 70 2c 20 74 6f 6b 65 6e pt(interp, token
58c0: 50 74 72 2d 3e 73 74 61 72 74 2c 20 74 6f 6b 65 Ptr->start, toke
58d0: 6e 50 74 72 2d 3e 73 69 7a 65 2c 0a 2d 09 20 20 nPtr->size,.-.
58e0: 20 20 20 20 20 20 2f 2a 6e 65 73 74 65 64 2a 2f /*nested*/
58f0: 20 30 2c 20 65 6e 76 50 74 72 29 3b 0a 2b 09 63 0, envPtr);.+.c
5900: 6f 64 65 20 3d 20 54 63 6c 43 6f 6d 70 69 6c 65 ode = TclCompile
5910: 53 63 72 69 70 74 28 69 6e 74 65 72 70 2c 20 74 Script(interp, t
5920: 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 2c 20 okenPtr->start,
5930: 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 7a 65 2c 20 tokenPtr->size,
5940: 65 6e 76 50 74 72 29 3b 0a 20 09 72 65 74 75 72 envPtr);. .retur
5950: 6e 20 63 6f 64 65 3b 0a 20 20 20 20 20 7d 0a 20 n code;. }.
5960: 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f .Index: generic/
5970: 74 63 6c 43 6f 6d 70 69 6c 65 2e 68 0a 3d 3d 3d tclCompile.h.===
5980: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5990: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59c0: 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 .RCS file: /cvsr
59d0: 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 oot/tcl/tcl/gene
59e0: 72 69 63 2f 74 63 6c 43 6f 6d 70 69 6c 65 2e 68 ric/tclCompile.h
59f0: 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65 ,v.retrieving re
5a00: 76 69 73 69 6f 6e 20 31 2e 33 34 0a 64 69 66 66 vision 1.34.diff
5a10: 20 2d 75 20 2d 72 31 2e 33 34 20 74 63 6c 43 6f -u -r1.34 tclCo
5a20: 6d 70 69 6c 65 2e 68 0a 2d 2d 2d 20 67 65 6e 65 mpile.h.--- gene
5a30: 72 69 63 2f 74 63 6c 43 6f 6d 70 69 6c 65 2e 68 ric/tclCompile.h
5a40: 09 35 20 4d 61 72 20 32 30 30 33 20 32 32 3a 33 .5 Mar 2003 22:3
5a50: 31 3a 32 33 20 2d 30 30 30 30 09 31 2e 33 34 0a 1:23 -0000.1.34.
5a60: 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 +++ generic/tclC
5a70: 6f 6d 70 69 6c 65 2e 68 09 31 33 20 4d 61 72 20 ompile.h.13 Mar
5a80: 32 30 30 33 20 30 32 3a 32 36 3a 35 39 20 2d 30 2003 02:26:59 -0
5a90: 30 30 30 0a 40 40 20 2d 37 34 38 2c 38 20 2b 37 000.@@ -748,8 +7
5aa0: 34 38 2c 37 20 40 40 0a 20 09 09 09 20 20 20 20 48,7 @@. ...
5ab0: 54 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e Tcl_Token *token
5ac0: 50 74 72 2c 20 69 6e 74 20 6e 75 6d 57 6f 72 64 Ptr, int numWord
5ad0: 73 2c 0a 20 09 09 09 20 20 20 20 43 6f 6d 70 69 s,. ... Compi
5ae0: 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72 29 29 3b leEnv *envPtr));
5af0: 0a 20 45 58 54 45 52 4e 20 69 6e 74 09 09 54 63 . EXTERN int..Tc
5b00: 6c 43 6f 6d 70 69 6c 65 53 63 72 69 70 74 20 5f lCompileScript _
5b10: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f ANSI_ARGS_((Tcl_
5b20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
5b30: 2d 09 09 09 20 20 20 20 43 4f 4e 53 54 20 63 68 -... CONST ch
5b40: 61 72 20 2a 73 63 72 69 70 74 2c 20 69 6e 74 20 ar *script, int
5b50: 6e 75 6d 42 79 74 65 73 2c 20 69 6e 74 20 6e 65 numBytes, int ne
5b60: 73 74 65 64 2c 0a 2d 09 09 09 20 20 20 20 43 6f sted,.-... Co
5b70: 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72 mpileEnv *envPtr
5b80: 29 29 3b 0a 2b 09 09 09 20 20 20 20 43 4f 4e 53 ));.+... CONS
5b90: 54 20 63 68 61 72 20 2a 73 63 72 69 70 74 2c 20 T char *script,
5ba0: 69 6e 74 20 6e 75 6d 42 79 74 65 73 2c 20 43 6f int numBytes, Co
5bb0: 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72 mpileEnv *envPtr
5bc0: 29 29 3b 0a 20 45 58 54 45 52 4e 20 69 6e 74 09 ));. EXTERN int.
5bd0: 09 54 63 6c 43 6f 6d 70 69 6c 65 54 6f 6b 65 6e .TclCompileToken
5be0: 73 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 s _ANSI_ARGS_((T
5bf0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5c00: 70 2c 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 54 p,. ... Tcl_T
5c10: 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 2c 20 oken *tokenPtr,
5c20: 69 6e 74 20 63 6f 75 6e 74 2c 0a 20 09 09 09 20 int count,. ...
5c30: 20 20 20 43 6f 6d 70 69 6c 65 45 6e 76 20 2a 65 CompileEnv *e
5c40: 6e 76 50 74 72 29 29 3b 0a 49 6e 64 65 78 3a 20 nvPtr));.Index:
5c50: 67 65 6e 65 72 69 63 2f 74 63 6c 45 78 65 63 75 generic/tclExecu
5c60: 74 65 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d te.c.===========
5c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5ca0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c ========.RCS fil
5cb0: 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f e: /cvsroot/tcl/
5cc0: 74 63 6c 2f 67 65 6e 65 72 69 63 2f 74 63 6c 45 tcl/generic/tclE
5cd0: 78 65 63 75 74 65 2e 63 2c 76 0a 72 65 74 72 69 xecute.c,v.retri
5ce0: 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 eving revision 1
5cf0: 2e 39 34 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e .94.diff -u -r1.
5d00: 39 34 20 74 63 6c 45 78 65 63 75 74 65 2e 63 0a 94 tclExecute.c.
5d10: 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 45 --- generic/tclE
5d20: 78 65 63 75 74 65 2e 63 09 31 39 20 46 65 62 20 xecute.c.19 Feb
5d30: 32 30 30 33 20 31 34 3a 33 33 3a 33 39 20 2d 30 2003 14:33:39 -0
5d40: 30 30 30 09 31 2e 39 34 0a 2b 2b 2b 20 67 65 6e 000.1.94.+++ gen
5d50: 65 72 69 63 2f 74 63 6c 45 78 65 63 75 74 65 2e eric/tclExecute.
5d60: 63 09 31 33 20 4d 61 72 20 32 30 30 33 20 30 32 c.13 Mar 2003 02
5d70: 3a 32 36 3a 35 39 20 2d 30 30 30 30 0a 40 40 20 :26:59 -0000.@@
5d80: 2d 38 33 31 2c 37 20 2b 38 33 31 2c 36 20 40 40 -831,7 +831,6 @@
5d90: 0a 20 09 20 2a 20 61 6e 64 20 61 75 78 20 64 61 . . * and aux da
5da0: 74 61 20 69 74 65 6d 73 20 69 73 20 67 69 76 65 ta items is give
5db0: 6e 20 74 6f 20 74 68 65 20 42 79 74 65 43 6f 64 n to the ByteCod
5dc0: 65 20 6f 62 6a 65 63 74 2e 0a 20 09 20 2a 2f 0a e object.. . */.
5dd0: 20 0a 2d 09 63 6f 6d 70 45 6e 76 2e 6e 75 6d 53 .-.compEnv.numS
5de0: 72 63 42 79 74 65 73 20 3d 20 69 50 74 72 2d 3e rcBytes = iPtr->
5df0: 74 65 72 6d 4f 66 66 73 65 74 3b 0a 20 09 54 63 termOffset;. .Tc
5e00: 6c 45 6d 69 74 4f 70 63 6f 64 65 28 49 4e 53 54 lEmitOpcode(INST
5e10: 5f 44 4f 4e 45 2c 20 26 63 6f 6d 70 45 6e 76 29 _DONE, &compEnv)
5e20: 3b 0a 20 09 54 63 6c 49 6e 69 74 42 79 74 65 43 ;. .TclInitByteC
5e30: 6f 64 65 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 26 odeObj(objPtr, &
5e40: 63 6f 6d 70 45 6e 76 29 3b 0a 20 09 54 63 6c 46 compEnv);. .TclF
5e50: 72 65 65 43 6f 6d 70 69 6c 65 45 6e 76 28 26 63 reeCompileEnv(&c
5e60: 6f 6d 70 45 6e 76 29 3b 0a 40 40 20 2d 31 30 33 ompEnv);.@@ -103
5e70: 37 2c 31 36 20 2b 31 30 33 36 2c 37 20 40 40 0a 7,16 +1036,7 @@.
5e80: 20 09 7d 0a 20 20 20 20 20 7d 0a 20 0a 2d 20 20 .}. }. .-
5e90: 20 20 2f 2a 0a 2d 20 20 20 20 20 2a 20 53 65 74 /*.- * Set
5ea0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
5eb0: 27 73 20 74 65 72 6d 4f 66 66 73 65 74 20 6d 65 's termOffset me
5ec0: 6d 62 65 72 20 74 6f 20 74 68 65 20 6f 66 66 73 mber to the offs
5ed0: 65 74 20 6f 66 20 74 68 65 0a 2d 20 20 20 20 20 et of the.-
5ee0: 2a 20 63 68 61 72 61 63 74 65 72 20 6a 75 73 74 * character just
5ef0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 after the last
5f00: 6f 6e 65 20 65 78 65 63 75 74 65 64 2e 20 57 65 one executed. We
5f10: 20 61 70 70 72 6f 78 69 6d 61 74 65 20 74 68 65 approximate the
5f20: 20 6f 66 66 73 65 74 0a 2d 20 20 20 20 20 2a 20 offset.- *
5f30: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 of the last char
5f40: 61 63 74 65 72 20 65 78 65 63 75 74 65 64 20 62 acter executed b
5f50: 79 20 75 73 69 6e 67 20 74 68 65 20 6e 75 6d 62 y using the numb
5f60: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 er of characters
5f70: 0a 2d 20 20 20 20 20 2a 20 63 6f 6d 70 69 6c 65 .- * compile
5f80: 64 2e 20 0a 2d 20 20 20 20 20 2a 2f 0a 2d 0a 2d d. .- */.-.-
5f90: 20 20 20 20 69 50 74 72 2d 3e 74 65 72 6d 4f 66 iPtr->termOf
5fa0: 66 73 65 74 20 3d 20 6e 75 6d 53 72 63 42 79 74 fset = numSrcByt
5fb0: 65 73 3b 0a 20 20 20 20 20 69 50 74 72 2d 3e 66 es;. iPtr->f
5fc0: 6c 61 67 73 20 26 3d 20 7e 45 52 52 5f 41 4c 52 lags &= ~ERR_ALR
5fd0: 45 41 44 59 5f 4c 4f 47 47 45 44 3b 0a 2d 0a 20 EADY_LOGGED;.-.
5fe0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
5ff0: 74 3b 0a 20 7d 0a 20 0c 0a 49 6e 64 65 78 3a 20 t;. }. ..Index:
6000: 67 65 6e 65 72 69 63 2f 74 63 6c 49 6e 74 2e 68 generic/tclInt.h
6010: 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .===============
6020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6050: 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f ====.RCS file: /
6060: 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f cvsroot/tcl/tcl/
6070: 67 65 6e 65 72 69 63 2f 74 63 6c 49 6e 74 2e 68 generic/tclInt.h
6080: 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65 ,v.retrieving re
6090: 76 69 73 69 6f 6e 20 31 2e 31 31 39 0a 64 69 66 vision 1.119.dif
60a0: 66 20 2d 75 20 2d 72 31 2e 31 31 39 20 74 63 6c f -u -r1.119 tcl
60b0: 49 6e 74 2e 68 0a 2d 2d 2d 20 67 65 6e 65 72 69 Int.h.--- generi
60c0: 63 2f 74 63 6c 49 6e 74 2e 68 09 35 20 4d 61 72 c/tclInt.h.5 Mar
60d0: 20 32 30 30 33 20 32 32 3a 33 31 3a 32 34 20 2d 2003 22:31:24 -
60e0: 30 30 30 30 09 31 2e 31 31 39 0a 2b 2b 2b 20 67 0000.1.119.+++ g
60f0: 65 6e 65 72 69 63 2f 74 63 6c 49 6e 74 2e 68 09 eneric/tclInt.h.
6100: 31 33 20 4d 61 72 20 32 30 30 33 20 30 32 3a 32 13 Mar 2003 02:2
6110: 36 3a 35 39 20 2d 30 30 30 30 0a 40 40 20 2d 31 6:59 -0000.@@ -1
6120: 32 34 39 2c 38 20 2b 31 32 34 39 2c 37 20 40 40 249,8 +1249,7 @@
6130: 0a 20 09 09 09 09 20 2a 20 4e 6f 72 6d 61 6c 6c . .... * Normall
6140: 79 20 7a 65 72 6f 2c 20 62 75 74 20 6d 61 79 20 y zero, but may
6150: 62 65 20 73 65 74 20 62 65 66 6f 72 65 0a 20 09 be set before. .
6160: 09 09 09 20 2a 20 63 61 6c 6c 69 6e 67 20 54 63 ... * calling Tc
6170: 6c 5f 45 76 61 6c 2e 20 20 53 65 65 20 62 65 6c l_Eval. See bel
6180: 6f 77 20 66 6f 72 20 76 61 6c 69 64 0a 20 09 09 ow for valid. ..
6190: 09 09 20 2a 20 76 61 6c 75 65 73 2e 20 2a 2f 0a .. * values. */.
61a0: 2d 20 20 20 20 69 6e 74 20 74 65 72 6d 4f 66 66 - int termOff
61b0: 73 65 74 3b 09 09 2f 2a 20 4f 66 66 73 65 74 20 set;../* Offset
61c0: 6f 66 20 63 68 61 72 61 63 74 65 72 20 6a 75 73 of character jus
61d0: 74 20 61 66 74 65 72 20 6c 61 73 74 20 6f 6e 65 t after last one
61e0: 0a 2d 09 09 09 09 20 2a 20 63 6f 6d 70 69 6c 65 .-.... * compile
61f0: 64 20 6f 72 20 65 78 65 63 75 74 65 64 20 62 79 d or executed by
6200: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 2e 20 2a 2f Tcl_EvalObj. */
6210: 0a 2b 20 20 20 20 69 6e 74 20 75 6e 75 73 65 64 .+ int unused
6220: 31 3b 09 09 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 1;../* No longer
6230: 20 75 73 65 64 20 28 77 61 73 20 74 65 72 6d 4f used (was termO
6240: 66 66 73 65 74 29 20 2a 2f 0a 20 20 20 20 20 4c ffset) */. L
6250: 69 74 65 72 61 6c 54 61 62 6c 65 20 6c 69 74 65 iteralTable lite
6260: 72 61 6c 54 61 62 6c 65 3b 09 2f 2a 20 43 6f 6e ralTable;./* Con
6270: 74 61 69 6e 73 20 4c 69 74 65 72 61 6c 45 6e 74 tains LiteralEnt
6280: 72 79 27 73 20 64 65 73 63 72 69 62 69 6e 67 20 ry's describing
6290: 61 6c 6c 0a 20 09 09 09 09 20 2a 20 54 63 6c 20 all. .... * Tcl
62a0: 6f 62 6a 65 63 74 73 20 68 6f 6c 64 69 6e 67 20 objects holding
62b0: 6c 69 74 65 72 61 6c 73 20 6f 66 20 73 63 72 69 literals of scri
62c0: 70 74 73 0a 20 09 09 09 09 20 2a 20 63 6f 6d 70 pts. .... * comp
62d0: 69 6c 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 iled by the inte
62e0: 72 70 72 65 74 65 72 2e 20 49 6e 64 65 78 65 64 rpreter. Indexed
62f0: 20 62 79 0a 40 40 20 2d 31 33 32 30 2c 31 34 20 by.@@ -1320,14
6300: 2b 31 33 31 39 2c 31 31 20 40 40 0a 20 2f 2a 0a +1319,11 @@. /*.
6310: 20 20 2a 20 45 76 61 6c 46 6c 61 67 20 62 69 74 * EvalFlag bit
6320: 73 20 66 6f 72 20 49 6e 74 65 72 70 20 73 74 72 s for Interp str
6330: 75 63 74 75 72 65 73 3a 0a 20 20 2a 0a 2d 20 2a uctures:. *.- *
6340: 20 54 43 4c 5f 42 52 41 43 4b 45 54 5f 54 45 52 TCL_BRACKET_TER
6350: 4d 09 31 20 6d 65 61 6e 73 20 74 68 61 74 20 74 M.1 means that t
6360: 68 65 20 63 75 72 72 65 6e 74 20 73 63 72 69 70 he current scrip
6370: 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 t is terminated
6380: 62 79 0a 2d 20 2a 09 09 09 61 20 63 6c 6f 73 65 by.- *...a close
6390: 20 62 72 61 63 6b 65 74 20 72 61 74 68 65 72 20 bracket rather
63a0: 74 68 61 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 than the end of
63b0: 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 20 2a 20 the string.. *
63c0: 54 43 4c 5f 41 4c 4c 4f 57 5f 45 58 43 45 50 54 TCL_ALLOW_EXCEPT
63d0: 49 4f 4e 53 09 31 20 6d 65 61 6e 73 20 69 74 27 IONS.1 means it'
63e0: 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 73 63 72 s OK for the scr
63f0: 69 70 74 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 ipt to terminate
6400: 20 77 69 74 68 0a 20 20 2a 09 09 09 61 20 63 6f with. *...a co
6410: 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 43 de other than TC
6420: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
6430: 52 3b 09 30 20 6d 65 61 6e 73 0a 20 20 2a 09 09 R;.0 means. *..
6440: 09 63 6f 64 65 73 20 6f 74 68 65 72 20 74 68 61 .codes other tha
6450: 6e 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62 n these should b
6460: 65 20 74 75 72 6e 65 64 20 69 6e 74 6f 20 65 72 e turned into er
6470: 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 0a 2d 23 64 rors.. */. .-#d
6480: 65 66 69 6e 65 20 54 43 4c 5f 42 52 41 43 4b 45 efine TCL_BRACKE
6490: 54 5f 54 45 52 4d 09 20 20 31 0a 20 23 64 65 66 T_TERM. 1. #def
64a0: 69 6e 65 20 54 43 4c 5f 41 4c 4c 4f 57 5f 45 58 ine TCL_ALLOW_EX
64b0: 43 45 50 54 49 4f 4e 53 09 20 20 34 0a 20 0a 20 CEPTIONS. 4. .
64c0: 2f 2a 0a 40 40 20 2d 31 38 30 32 2c 37 20 2b 31 /*.@@ -1802,7 +1
64d0: 37 39 38 2c 31 30 20 40 40 0a 20 45 58 54 45 52 798,10 @@. EXTER
64e0: 4e 20 56 4f 49 44 20 20 20 20 20 20 20 20 20 20 N VOID
64f0: 20 20 20 54 63 6c 52 65 6d 65 6d 62 65 72 4a 6f TclRememberJo
6500: 69 6e 61 62 6c 65 54 68 72 65 61 64 20 5f 41 4e inableThread _AN
6510: 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 54 68 SI_ARGS_((Tcl_Th
6520: 72 65 61 64 49 64 20 69 64 29 29 3b 0a 20 45 58 readId id));. EX
6530: 54 45 52 4e 20 76 6f 69 64 09 09 54 63 6c 52 65 TERN void..TclRe
6540: 6d 65 6d 62 65 72 4d 75 74 65 78 20 5f 41 4e 53 memberMutex _ANS
6550: 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 4d 75 74 I_ARGS_((Tcl_Mut
6560: 65 78 20 2a 6d 75 74 65 78 29 29 3b 0a 20 45 58 ex *mutex));. EX
6570: 54 45 52 4e 20 56 4f 49 44 20 20 20 20 20 20 20 TERN VOID
6580: 20 20 20 20 20 20 54 63 6c 53 69 67 6e 61 6c 45 TclSignalE
6590: 78 69 74 54 68 72 65 61 64 20 5f 41 4e 53 49 5f xitThread _ANSI_
65a0: 41 52 47 53 5f 28 28 54 63 6c 5f 54 68 72 65 61 ARGS_((Tcl_Threa
65b0: 64 49 64 20 69 64 2c 0a 2d 09 09 09 20 20 20 20 dId id,.-...
65c0: 20 69 6e 74 20 72 65 73 75 6c 74 29 29 3b 0a 2b int result));.+
65d0: 09 09 09 20 20 20 20 69 6e 74 20 72 65 73 75 6c ... int resul
65e0: 74 29 29 3b 0a 2b 45 58 54 45 52 4e 20 69 6e 74 t));.+EXTERN int
65f0: 09 09 54 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 ..TclSubstTokens
6600: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 _ANSI_ARGS_((Tc
6610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6620: 2c 0a 2b 09 09 09 20 20 20 20 54 63 6c 5f 54 6f ,.+... Tcl_To
6630: 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 2c 20 69 ken *tokenPtr, i
6640: 6e 74 20 63 6f 75 6e 74 2c 0a 2b 09 09 09 20 20 nt count,.+...
6650: 20 20 69 6e 74 20 2a 74 6f 6b 65 6e 73 4c 65 66 int *tokensLef
6660: 74 50 74 72 29 29 3b 0a 20 45 58 54 45 52 4e 20 tPtr));. EXTERN
6670: 76 6f 69 64 09 09 54 63 6c 54 72 61 6e 73 66 65 void..TclTransfe
6680: 72 52 65 73 75 6c 74 20 5f 41 4e 53 49 5f 41 52 rResult _ANSI_AR
6690: 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 GS_((Tcl_Interp
66a0: 2a 73 6f 75 72 63 65 49 6e 74 65 72 70 2c 0a 20 *sourceInterp,.
66b0: 09 09 09 20 20 20 20 69 6e 74 20 72 65 73 75 6c ... int resul
66c0: 74 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 74 t, Tcl_Interp *t
66d0: 61 72 67 65 74 49 6e 74 65 72 70 29 29 3b 0a 20 argetInterp));.
66e0: 45 58 54 45 52 4e 20 54 63 6c 5f 4f 62 6a 2a 20 EXTERN Tcl_Obj*
66f0: 20 20 20 20 20 20 20 20 54 63 6c 70 4e 61 74 69 TclpNati
6700: 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65 64 20 0a veToNormalized .
6710: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 Index: generic/t
6720: 63 6c 50 61 72 73 65 2e 63 0a 3d 3d 3d 3d 3d 3d clParse.c.======
6730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 =============.RC
6770: 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 S file: /cvsroot
6780: 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 /tcl/tcl/generic
6790: 2f 74 63 6c 50 61 72 73 65 2e 63 2c 76 0a 72 65 /tclParse.c,v.re
67a0: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f trieving revisio
67b0: 6e 20 31 2e 32 35 0a 64 69 66 66 20 2d 75 20 2d n 1.25.diff -u -
67c0: 72 31 2e 32 35 20 74 63 6c 50 61 72 73 65 2e 63 r1.25 tclParse.c
67d0: 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c .--- generic/tcl
67e0: 50 61 72 73 65 2e 63 09 31 36 20 46 65 62 20 32 Parse.c.16 Feb 2
67f0: 30 30 33 20 30 31 3a 33 36 3a 33 32 20 2d 30 30 003 01:36:32 -00
6800: 30 30 09 31 2e 32 35 0a 2b 2b 2b 20 67 65 6e 65 00.1.25.+++ gene
6810: 72 69 63 2f 74 63 6c 50 61 72 73 65 2e 63 09 31 ric/tclParse.c.1
6820: 33 20 4d 61 72 20 32 30 30 33 20 30 32 3a 32 36 3 Mar 2003 02:26
6830: 3a 35 39 20 2d 30 30 30 30 0a 40 40 20 2d 31 37 :59 -0000.@@ -17
6840: 39 2c 37 20 2b 31 37 39 2c 37 20 40 40 0a 20 73 9,7 +179,7 @@. s
6850: 74 61 74 69 63 20 69 6e 74 09 09 50 61 72 73 65 tatic int..Parse
6860: 43 6f 6d 6d 65 6e 74 20 5f 41 4e 53 49 5f 41 52 Comment _ANSI_AR
6870: 47 53 5f 28 28 43 4f 4e 53 54 20 63 68 61 72 20 GS_((CONST char
6880: 2a 73 72 63 2c 20 69 6e 74 20 6e 75 6d 42 79 74 *src, int numByt
6890: 65 73 2c 0a 20 09 09 09 20 20 20 20 54 63 6c 5f es,. ... Tcl_
68a0: 50 61 72 73 65 20 2a 70 61 72 73 65 50 74 72 29 Parse *parsePtr)
68b0: 29 3b 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 );. static int..
68c0: 50 61 72 73 65 54 6f 6b 65 6e 73 20 5f 41 4e 53 ParseTokens _ANS
68d0: 49 5f 41 52 47 53 5f 28 28 43 4f 4e 53 54 20 63 I_ARGS_((CONST c
68e0: 68 61 72 20 2a 73 72 63 2c 20 69 6e 74 20 6e 75 har *src, int nu
68f0: 6d 42 79 74 65 73 2c 0a 2d 09 09 09 20 20 20 20 mBytes,.-...
6900: 69 6e 74 20 6d 61 73 6b 2c 20 54 63 6c 5f 50 61 int mask, Tcl_Pa
6910: 72 73 65 20 2a 70 61 72 73 65 50 74 72 29 29 3b rse *parsePtr));
6920: 0a 2b 09 09 09 20 20 20 20 69 6e 74 20 6d 61 73 .+... int mas
6930: 6b 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 54 63 k, int flags, Tc
6940: 6c 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50 74 l_Parse *parsePt
6950: 72 29 29 3b 0a 20 0a 20 2f 2a 0a 20 20 2a 2d 2d r));. . /*. *--
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69a0: 2d 2d 2d 2d 0a 40 40 20 2d 33 34 33 2c 37 20 2b ----.@@ -343,7 +
69b0: 33 34 33 2c 37 20 40 40 0a 20 09 20 20 20 20 20 343,7 @@. .
69c0: 2a 2f 0a 20 0a 20 09 20 20 20 20 69 66 20 28 50 */. . . if (P
69d0: 61 72 73 65 54 6f 6b 65 6e 73 28 73 72 63 2c 20 arseTokens(src,
69e0: 6e 75 6d 42 79 74 65 73 2c 20 54 59 50 45 5f 53 numBytes, TYPE_S
69f0: 50 41 43 45 7c 74 65 72 6d 69 6e 61 74 6f 72 73 PACE|terminators
6a00: 2c 0a 2d 09 09 20 20 20 20 70 61 72 73 65 50 74 ,.-.. parsePt
6a10: 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a r) != TCL_OK) {.
6a20: 2b 09 09 20 20 20 20 54 43 4c 5f 53 55 42 53 54 +.. TCL_SUBST
6a30: 5f 41 4c 4c 2c 20 70 61 72 73 65 50 74 72 29 20 _ALL, parsePtr)
6a40: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 20 09 09 != TCL_OK) {. ..
6a50: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 09 20 20 goto error;. .
6a60: 20 20 7d 0a 20 09 20 20 20 20 73 72 63 20 3d 20 }. . src =
6a70: 70 61 72 73 65 50 74 72 2d 3e 74 65 72 6d 3b 20 parsePtr->term;
6a80: 6e 75 6d 42 79 74 65 73 20 3d 20 70 61 72 73 65 numBytes = parse
6a90: 50 74 72 2d 3e 65 6e 64 20 2d 20 73 72 63 3b 0a Ptr->end - src;.
6aa0: 40 40 20 2d 37 38 35 2c 39 20 2b 37 38 35 2c 31 @@ -785,9 +785,1
6ab0: 33 20 40 40 0a 20 20 2a 2f 0a 20 0a 20 73 74 61 3 @@. */. . sta
6ac0: 74 69 63 20 69 6e 74 0a 2d 50 61 72 73 65 54 6f tic int.-ParseTo
6ad0: 6b 65 6e 73 28 73 72 63 2c 20 6e 75 6d 42 79 74 kens(src, numByt
6ae0: 65 73 2c 20 6d 61 73 6b 2c 20 70 61 72 73 65 50 es, mask, parseP
6af0: 74 72 29 0a 2b 50 61 72 73 65 54 6f 6b 65 6e 73 tr).+ParseTokens
6b00: 28 73 72 63 2c 20 6e 75 6d 42 79 74 65 73 2c 20 (src, numBytes,
6b10: 6d 61 73 6b 2c 20 66 6c 61 67 73 2c 20 70 61 72 mask, flags, par
6b20: 73 65 50 74 72 29 0a 20 20 20 20 20 72 65 67 69 sePtr). regi
6b30: 73 74 65 72 20 43 4f 4e 53 54 20 63 68 61 72 20 ster CONST char
6b40: 2a 73 72 63 3b 09 2f 2a 20 46 69 72 73 74 20 63 *src;./* First c
6b50: 68 61 72 61 63 74 65 72 20 74 6f 20 70 61 72 73 haracter to pars
6b60: 65 2e 20 2a 2f 0a 20 20 20 20 20 72 65 67 69 73 e. */. regis
6b70: 74 65 72 20 69 6e 74 20 6e 75 6d 42 79 74 65 73 ter int numBytes
6b80: 3b 09 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 ;./* Max number
6b90: 6f 66 20 62 79 74 65 73 20 74 6f 20 73 63 61 6e of bytes to scan
6ba0: 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 66 6c . */.+ int fl
6bb0: 61 67 73 3b 09 09 09 2f 2a 20 4f 52 2d 65 64 20 ags;.../* OR-ed
6bc0: 62 69 74 73 20 69 6e 64 69 63 61 74 69 6e 67 20 bits indicating
6bd0: 77 68 61 74 20 73 75 62 73 74 69 74 75 74 69 6f what substitutio
6be0: 6e 73 0a 2b 09 09 09 09 20 20 20 74 6f 20 70 65 ns.+.... to pe
6bf0: 72 66 6f 72 6d 3a 20 54 43 4c 5f 53 55 42 53 54 rform: TCL_SUBST
6c00: 5f 43 4f 4d 4d 41 4e 44 53 2c 0a 2b 09 09 09 09 _COMMANDS,.+....
6c10: 20 20 20 54 43 4c 5f 53 55 42 53 54 5f 56 41 52 TCL_SUBST_VAR
6c20: 49 41 42 4c 45 53 2c 20 61 6e 64 20 0a 2b 09 09 IABLES, and .+..
6c30: 09 09 20 20 20 54 43 4c 5f 53 55 42 53 54 5f 42 .. TCL_SUBST_B
6c40: 41 43 4b 53 4c 41 53 48 45 53 20 2a 2f 0a 20 20 ACKSLASHES */.
6c50: 20 20 20 69 6e 74 20 6d 61 73 6b 3b 09 09 09 2f int mask;.../
6c60: 2a 20 53 70 65 63 69 66 69 65 73 20 77 68 65 6e * Specifies when
6c70: 20 74 6f 20 73 74 6f 70 20 70 61 72 73 69 6e 67 to stop parsing
6c80: 2e 20 20 54 68 65 0a 20 09 09 09 09 20 2a 20 70 . The. .... * p
6c90: 61 72 73 65 20 73 74 6f 70 73 20 61 74 20 74 68 arse stops at th
6ca0: 65 20 66 69 72 73 74 20 75 6e 71 75 6f 74 65 64 e first unquoted
6cb0: 0a 20 09 09 09 09 20 2a 20 63 68 61 72 61 63 74 . .... * charact
6cc0: 65 72 20 77 68 6f 73 65 20 43 48 41 52 5f 54 59 er whose CHAR_TY
6cd0: 50 45 20 63 6f 6e 74 61 69 6e 73 0a 40 40 20 2d PE contains.@@ -
6ce0: 37 39 38 2c 36 20 2b 38 30 32 2c 39 20 40 40 0a 798,6 +802,9 @@.
6cf0: 20 7b 0a 20 20 20 20 20 63 68 61 72 20 74 79 70 {. char typ
6d00: 65 3b 20 0a 20 20 20 20 20 69 6e 74 20 6f 72 69 e; . int ori
6d10: 67 69 6e 61 6c 54 6f 6b 65 6e 73 2c 20 76 61 72 ginalTokens, var
6d20: 54 6f 6b 65 6e 3b 0a 2b 20 20 20 20 69 6e 74 20 Token;.+ int
6d30: 6e 6f 53 75 62 73 74 43 6d 64 73 20 3d 20 21 28 noSubstCmds = !(
6d40: 66 6c 61 67 73 20 26 20 54 43 4c 5f 53 55 42 53 flags & TCL_SUBS
6d50: 54 5f 43 4f 4d 4d 41 4e 44 53 29 3b 0a 2b 20 20 T_COMMANDS);.+
6d60: 20 20 69 6e 74 20 6e 6f 53 75 62 73 74 56 61 72 int noSubstVar
6d70: 73 20 3d 20 21 28 66 6c 61 67 73 20 26 20 54 43 s = !(flags & TC
6d80: 4c 5f 53 55 42 53 54 5f 56 41 52 49 41 42 4c 45 L_SUBST_VARIABLE
6d90: 53 29 3b 0a 2b 20 20 20 20 69 6e 74 20 6e 6f 53 S);.+ int noS
6da0: 75 62 73 74 42 53 20 3d 20 21 28 66 6c 61 67 73 ubstBS = !(flags
6db0: 20 26 20 54 43 4c 5f 53 55 42 53 54 5f 42 41 43 & TCL_SUBST_BAC
6dc0: 4b 53 4c 41 53 48 45 53 29 3b 0a 20 20 20 20 20 KSLASHES);.
6dd0: 54 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e Tcl_Token *token
6de0: 50 74 72 3b 0a 20 20 20 20 20 54 63 6c 5f 50 61 Ptr;. Tcl_Pa
6df0: 72 73 65 20 6e 65 73 74 65 64 3b 0a 20 0a 40 40 rse nested;. .@@
6e00: 20 2d 38 33 31 2c 36 20 2b 38 33 38 2c 31 33 20 -831,6 +838,13
6e10: 40 40 0a 20 09 20 20 20 20 74 6f 6b 65 6e 50 74 @@. . tokenPt
6e20: 72 2d 3e 73 69 7a 65 20 3d 20 73 72 63 20 2d 20 r->size = src -
6e30: 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 3b tokenPtr->start;
6e40: 0a 20 09 20 20 20 20 70 61 72 73 65 50 74 72 2d . . parsePtr-
6e50: 3e 6e 75 6d 54 6f 6b 65 6e 73 2b 2b 3b 0a 20 09 >numTokens++;. .
6e60: 7d 20 65 6c 73 65 20 69 66 20 28 2a 73 72 63 20 } else if (*src
6e70: 3d 3d 20 27 24 27 29 20 7b 0a 2b 09 20 20 20 20 == '$') {.+.
6e80: 69 66 20 28 6e 6f 53 75 62 73 74 56 61 72 73 29 if (noSubstVars)
6e90: 20 7b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e {.+..tokenPtr->
6ea0: 74 79 70 65 20 3d 20 54 43 4c 5f 54 4f 4b 45 4e type = TCL_TOKEN
6eb0: 5f 54 45 58 54 3b 0a 2b 09 09 74 6f 6b 65 6e 50 _TEXT;.+..tokenP
6ec0: 74 72 2d 3e 73 69 7a 65 20 3d 20 31 3b 0a 2b 09 tr->size = 1;.+.
6ed0: 09 70 61 72 73 65 50 74 72 2d 3e 6e 75 6d 54 6f .parsePtr->numTo
6ee0: 6b 65 6e 73 2b 2b 3b 0a 2b 09 09 73 72 63 2b 2b kens++;.+..src++
6ef0: 3b 20 6e 75 6d 42 79 74 65 73 2d 2d 3b 0a 2b 09 ; numBytes--;.+.
6f00: 09 63 6f 6e 74 69 6e 75 65 3b 0a 2b 09 20 20 20 .continue;.+.
6f10: 20 7d 0a 20 09 20 20 20 20 2f 2a 0a 20 09 20 20 }. . /*. .
6f20: 20 20 20 2a 20 54 68 69 73 20 69 73 20 61 20 76 * This is a v
6f30: 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 ariable referenc
6f40: 65 2e 20 20 43 61 6c 6c 20 54 63 6c 5f 50 61 72 e. Call Tcl_Par
6f50: 73 65 56 61 72 4e 61 6d 65 20 74 6f 20 64 6f 0a seVarName to do.
6f60: 20 09 20 20 20 20 20 2a 20 61 6c 6c 20 74 68 65 . * all the
6f70: 20 64 69 72 74 79 20 77 6f 72 6b 20 6f 66 20 70 dirty work of p
6f80: 61 72 73 69 6e 67 20 74 68 65 20 6e 61 6d 65 2e arsing the name.
6f90: 0a 40 40 20 2d 38 34 34 2c 36 20 2b 38 35 38 2c .@@ -844,6 +858,
6fa0: 31 33 20 40 40 0a 20 09 20 20 20 20 73 72 63 20 13 @@. . src
6fb0: 2b 3d 20 70 61 72 73 65 50 74 72 2d 3e 74 6f 6b += parsePtr->tok
6fc0: 65 6e 50 74 72 5b 76 61 72 54 6f 6b 65 6e 5d 2e enPtr[varToken].
6fd0: 73 69 7a 65 3b 0a 20 09 20 20 20 20 6e 75 6d 42 size;. . numB
6fe0: 79 74 65 73 20 2d 3d 20 70 61 72 73 65 50 74 72 ytes -= parsePtr
6ff0: 2d 3e 74 6f 6b 65 6e 50 74 72 5b 76 61 72 54 6f ->tokenPtr[varTo
7000: 6b 65 6e 5d 2e 73 69 7a 65 3b 0a 20 09 7d 20 65 ken].size;. .} e
7010: 6c 73 65 20 69 66 20 28 2a 73 72 63 20 3d 3d 20 lse if (*src ==
7020: 27 5b 27 29 20 7b 0a 2b 09 20 20 20 20 69 66 20 '[') {.+. if
7030: 28 6e 6f 53 75 62 73 74 43 6d 64 73 29 20 7b 0a (noSubstCmds) {.
7040: 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 +..tokenPtr->typ
7050: 65 20 3d 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 e = TCL_TOKEN_TE
7060: 58 54 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d XT;.+..tokenPtr-
7070: 3e 73 69 7a 65 20 3d 20 31 3b 0a 2b 09 09 70 61 >size = 1;.+..pa
7080: 72 73 65 50 74 72 2d 3e 6e 75 6d 54 6f 6b 65 6e rsePtr->numToken
7090: 73 2b 2b 3b 0a 2b 09 09 73 72 63 2b 2b 3b 20 6e s++;.+..src++; n
70a0: 75 6d 42 79 74 65 73 2d 2d 3b 0a 2b 09 09 63 6f umBytes--;.+..co
70b0: 6e 74 69 6e 75 65 3b 0a 2b 09 20 20 20 20 7d 0a ntinue;.+. }.
70c0: 20 09 20 20 20 20 2f 2a 0a 20 09 20 20 20 20 20 . /*. .
70d0: 2a 20 43 6f 6d 6d 61 6e 64 20 73 75 62 73 74 69 * Command substi
70e0: 74 75 74 69 6f 6e 2e 20 20 43 61 6c 6c 20 54 63 tution. Call Tc
70f0: 6c 5f 50 61 72 73 65 43 6f 6d 6d 61 6e 64 20 72 l_ParseCommand r
7100: 65 63 75 72 73 69 76 65 6c 79 0a 20 09 20 20 20 ecursively. .
7110: 20 20 2a 20 28 61 6e 64 20 72 65 70 65 61 74 65 * (and repeate
7120: 64 6c 79 29 20 74 6f 20 70 61 72 73 65 20 74 68 dly) to parse th
7130: 65 20 6e 65 73 74 65 64 20 63 6f 6d 6d 61 6e 64 e nested command
7140: 28 73 29 2c 20 74 68 65 6e 0a 40 40 20 2d 38 39 (s), then.@@ -89
7150: 36 2c 36 20 2b 39 31 37 2c 31 33 20 40 40 0a 20 6,6 +917,13 @@.
7160: 09 20 20 20 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 . tokenPtr->s
7170: 69 7a 65 20 3d 20 73 72 63 20 2d 20 74 6f 6b 65 ize = src - toke
7180: 6e 50 74 72 2d 3e 73 74 61 72 74 3b 0a 20 09 20 nPtr->start;. .
7190: 20 20 20 70 61 72 73 65 50 74 72 2d 3e 6e 75 6d parsePtr->num
71a0: 54 6f 6b 65 6e 73 2b 2b 3b 0a 20 09 7d 20 65 6c Tokens++;. .} el
71b0: 73 65 20 69 66 20 28 2a 73 72 63 20 3d 3d 20 27 se if (*src == '
71c0: 5c 5c 27 29 20 7b 0a 2b 09 20 20 20 20 69 66 20 \\') {.+. if
71d0: 28 6e 6f 53 75 62 73 74 42 53 29 20 7b 0a 2b 09 (noSubstBS) {.+.
71e0: 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 65 20 .tokenPtr->type
71f0: 3d 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 58 54 = TCL_TOKEN_TEXT
7200: 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 72 2d 3e 73 ;.+..tokenPtr->s
7210: 69 7a 65 20 3d 20 31 3b 0a 2b 09 09 70 61 72 73 ize = 1;.+..pars
7220: 65 50 74 72 2d 3e 6e 75 6d 54 6f 6b 65 6e 73 2b ePtr->numTokens+
7230: 2b 3b 0a 2b 09 09 73 72 63 2b 2b 3b 20 6e 75 6d +;.+..src++; num
7240: 42 79 74 65 73 2d 2d 3b 0a 2b 09 09 63 6f 6e 74 Bytes--;.+..cont
7250: 69 6e 75 65 3b 0a 2b 09 20 20 20 20 7d 0a 20 09 inue;.+. }. .
7260: 20 20 20 20 2f 2a 0a 20 09 20 20 20 20 20 2a 20 /*. . *
7270: 42 61 63 6b 73 6c 61 73 68 20 73 75 62 73 74 69 Backslash substi
7280: 74 75 74 69 6f 6e 2e 0a 20 09 20 20 20 20 20 2a tution.. . *
7290: 2f 0a 40 40 20 2d 31 32 31 30 2c 38 20 2b 31 32 /.@@ -1210,8 +12
72a0: 33 38 2c 38 20 40 40 0a 20 09 20 20 20 20 20 2a 38,8 @@. . *
72b0: 20 73 69 6e 63 65 20 69 74 20 63 6f 75 6c 64 20 since it could
72c0: 63 6f 6e 74 61 69 6e 20 61 6e 79 20 6e 75 6d 62 contain any numb
72d0: 65 72 20 6f 66 20 73 75 62 73 74 69 74 75 74 69 er of substituti
72e0: 6f 6e 73 2e 0a 20 09 20 20 20 20 20 2a 2f 0a 20 ons.. . */.
72f0: 0a 2d 09 20 20 20 20 69 66 20 28 50 61 72 73 65 .-. if (Parse
7300: 54 6f 6b 65 6e 73 28 73 72 63 2b 31 2c 20 6e 75 Tokens(src+1, nu
7310: 6d 42 79 74 65 73 2d 31 2c 20 54 59 50 45 5f 43 mBytes-1, TYPE_C
7320: 4c 4f 53 45 5f 50 41 52 45 4e 2c 20 70 61 72 73 LOSE_PAREN, pars
7330: 65 50 74 72 29 0a 2d 09 09 20 20 20 20 21 3d 20 ePtr).-.. !=
7340: 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 20 20 20 20 TCL_OK) {.+.
7350: 69 66 20 28 54 43 4c 5f 4f 4b 20 21 3d 20 50 61 if (TCL_OK != Pa
7360: 72 73 65 54 6f 6b 65 6e 73 28 73 72 63 2b 31 2c rseTokens(src+1,
7370: 20 6e 75 6d 42 79 74 65 73 2d 31 2c 20 54 59 50 numBytes-1, TYP
7380: 45 5f 43 4c 4f 53 45 5f 50 41 52 45 4e 2c 0a 2b E_CLOSE_PAREN,.+
7390: 09 09 20 20 20 20 54 43 4c 5f 53 55 42 53 54 5f .. TCL_SUBST_
73a0: 41 4c 4c 2c 20 70 61 72 73 65 50 74 72 29 29 20 ALL, parsePtr))
73b0: 7b 0a 20 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b {. ..goto error;
73c0: 0a 20 09 20 20 20 20 7d 0a 20 09 20 20 20 20 69 . . }. . i
73d0: 66 20 28 28 70 61 72 73 65 50 74 72 2d 3e 74 65 f ((parsePtr->te
73e0: 72 6d 20 3d 3d 20 28 73 72 63 20 2b 20 6e 75 6d rm == (src + num
73f0: 42 79 74 65 73 29 29 20 0a 40 40 20 2d 31 33 30 Bytes)) .@@ -130
7400: 32 2c 37 20 2b 31 33 33 30 2c 37 20 40 40 0a 20 2,7 +1330,7 @@.
7410: 09 72 65 74 75 72 6e 20 22 24 22 3b 0a 20 20 20 .return "$";.
7420: 20 20 7d 0a 20 0a 2d 20 20 20 20 63 6f 64 65 20 }. .- code
7430: 3d 20 54 63 6c 5f 45 76 61 6c 54 6f 6b 65 6e 73 = Tcl_EvalTokens
7440: 53 74 61 6e 64 61 72 64 28 69 6e 74 65 72 70 2c Standard(interp,
7450: 20 70 61 72 73 65 2e 74 6f 6b 65 6e 50 74 72 2c parse.tokenPtr,
7460: 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 parse.numTokens
7470: 29 3b 0a 2b 20 20 20 20 63 6f 64 65 20 3d 20 54 );.+ code = T
7480: 63 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e clSubstTokens(in
7490: 74 65 72 70 2c 20 70 61 72 73 65 2e 74 6f 6b 65 terp, parse.toke
74a0: 6e 50 74 72 2c 20 70 61 72 73 65 2e 6e 75 6d 54 nPtr, parse.numT
74b0: 6f 6b 65 6e 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 okens, NULL);.
74c0: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 if (code != T
74d0: 43 4c 5f 4f 4b 29 20 7b 0a 20 09 72 65 74 75 72 CL_OK) {. .retur
74e0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 7d 0a 40 n NULL;. }.@
74f0: 40 20 2d 31 36 30 36 2c 37 20 2b 31 36 33 34 2c @ -1606,7 +1634,
7500: 38 20 40 40 0a 20 09 70 61 72 73 65 50 74 72 2d 8 @@. .parsePtr-
7510: 3e 65 72 72 6f 72 54 79 70 65 20 3d 20 54 43 4c >errorType = TCL
7520: 5f 50 41 52 53 45 5f 53 55 43 43 45 53 53 3b 0a _PARSE_SUCCESS;.
7530: 20 20 20 20 20 7d 0a 20 20 20 20 20 0a 2d 20 20 }. .-
7540: 20 20 69 66 20 28 50 61 72 73 65 54 6f 6b 65 6e if (ParseToken
7550: 73 28 73 74 72 69 6e 67 2b 31 2c 20 6e 75 6d 42 s(string+1, numB
7560: 79 74 65 73 2d 31 2c 20 54 59 50 45 5f 51 55 4f ytes-1, TYPE_QUO
7570: 54 45 2c 20 70 61 72 73 65 50 74 72 29 20 21 3d TE, parsePtr) !=
7580: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 20 20 20 20 TCL_OK) {.+
7590: 69 66 20 28 54 43 4c 5f 4f 4b 20 21 3d 20 50 61 if (TCL_OK != Pa
75a0: 72 73 65 54 6f 6b 65 6e 73 28 73 74 72 69 6e 67 rseTokens(string
75b0: 2b 31 2c 20 6e 75 6d 42 79 74 65 73 2d 31 2c 20 +1, numBytes-1,
75c0: 54 59 50 45 5f 51 55 4f 54 45 2c 0a 2b 09 20 20 TYPE_QUOTE,.+.
75d0: 20 20 54 43 4c 5f 53 55 42 53 54 5f 41 4c 4c 2c TCL_SUBST_ALL,
75e0: 20 70 61 72 73 65 50 74 72 29 29 20 7b 0a 20 09 parsePtr)) {. .
75f0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 goto error;.
7600: 20 7d 0a 20 20 20 20 20 69 66 20 28 2a 70 61 72 }. if (*par
7610: 73 65 50 74 72 2d 3e 74 65 72 6d 20 21 3d 20 27 sePtr->term != '
7620: 22 27 29 20 7b 0a 40 40 20 2d 31 36 32 38 2c 36 "') {.@@ -1628,6
7630: 20 2b 31 36 35 37 2c 34 32 30 20 40 40 0a 20 20 +1657,420 @@.
7640: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7650: 52 4f 52 3b 0a 20 7d 0a 20 0a 2b 2f 2a 0a 2b 20 ROR;. }. .+/*.+
7660: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 2b 20 2a 20 -------.+ *.+ *
76b0: 54 63 6c 5f 53 75 62 73 74 4f 62 6a 20 2d 2d 0a Tcl_SubstObj --.
76c0: 2b 20 2a 0a 2b 20 2a 20 20 20 20 20 20 54 68 69 + *.+ * Thi
76d0: 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f s function perfo
76e0: 72 6d 73 20 74 68 65 20 73 75 62 73 74 69 74 75 rms the substitu
76f0: 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 tions specified
7700: 6f 6e 20 74 68 65 0a 2b 20 2a 20 20 20 20 20 20 on the.+ *
7710: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 given string as
7720: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 described in the
7730: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 user documentat
7740: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2b 20 2a 20 ion for the.+ *
7750: 20 20 20 20 20 22 73 75 62 73 74 22 20 54 63 6c "subst" Tcl
7760: 20 63 6f 6d 6d 61 6e 64 2e 20 20 20 20 20 20 20 command.
7770: 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c 74 73 .+ *.+ * Results
7780: 3a 0a 2b 20 2a 20 20 20 20 20 20 41 20 54 63 6c :.+ * A Tcl
7790: 5f 4f 62 6a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 _Obj* containing
77a0: 20 74 68 65 20 73 75 62 73 74 69 74 75 74 65 64 the substituted
77b0: 20 73 74 72 69 6e 67 2c 20 6f 72 20 4e 55 4c 4c string, or NULL
77c0: 20 74 6f 0a 2b 20 2a 20 20 20 20 20 20 69 6e 64 to.+ * ind
77d0: 69 63 61 74 65 20 74 68 61 74 20 61 6e 20 65 72 icate that an er
77e0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 0a 2b 20 ror occurred..+
77f0: 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65 63 *.+ * Side effec
7800: 74 73 3a 0a 2b 20 2a 20 20 20 20 20 20 53 65 65 ts:.+ * See
7810: 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 the user docume
7820: 6e 74 61 74 69 6f 6e 2e 0a 2b 20 2a 0a 2b 20 2a ntation..+ *.+ *
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7870: 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 54 ------.+ */.+.+T
7880: 63 6c 5f 4f 62 6a 20 2a 0a 2b 54 63 6c 5f 53 75 cl_Obj *.+Tcl_Su
7890: 62 73 74 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f bstObj(interp, o
78a0: 62 6a 50 74 72 2c 20 66 6c 61 67 73 29 0a 2b 20 bjPtr, flags).+
78b0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
78c0: 6e 74 65 72 70 3b 09 2f 2a 20 49 6e 74 65 72 70 nterp;./* Interp
78d0: 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 73 reter in which s
78e0: 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 ubstitution occu
78f0: 72 73 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f 4f rs */.+ Tcl_O
7900: 62 6a 20 2a 6f 62 6a 50 74 72 3b 09 2f 2a 20 54 bj *objPtr;./* T
7910: 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 73 he value to be s
7920: 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 2b 20 ubstituted */.+
7930: 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f int flags;../
7940: 2a 20 57 68 61 74 20 73 75 62 73 74 69 74 75 74 * What substitut
7950: 69 6f 6e 73 20 74 6f 20 64 6f 20 2a 2f 0a 2b 7b ions to do */.+{
7960: 0a 2b 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 .+ int length
7970: 2c 20 74 6f 6b 65 6e 73 4c 65 66 74 2c 20 63 6f , tokensLeft, co
7980: 64 65 3b 0a 2b 20 20 20 20 54 63 6c 5f 50 61 72 de;.+ Tcl_Par
7990: 73 65 20 70 61 72 73 65 3b 0a 2b 20 20 20 20 54 se parse;.+ T
79a0: 63 6c 5f 54 6f 6b 65 6e 20 2a 65 6e 64 54 6f 6b cl_Token *endTok
79b0: 65 6e 50 74 72 3b 0a 2b 20 20 20 20 54 63 6c 5f enPtr;.+ Tcl_
79c0: 4f 62 6a 20 2a 72 65 73 75 6c 74 3b 0a 2b 20 20 Obj *result;.+
79d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 65 72 72 4d 73 Tcl_Obj *errMs
79e0: 67 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 20 20 20 43 g = NULL;.+ C
79f0: 4f 4e 53 54 20 63 68 61 72 20 2a 70 20 3d 20 54 ONST char *p = T
7a00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7a10: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 26 6c 65 6e Obj(objPtr, &len
7a20: 67 74 68 29 3b 0a 2b 0a 2b 20 20 20 20 70 61 72 gth);.+.+ par
7a30: 73 65 2e 74 6f 6b 65 6e 50 74 72 20 3d 20 70 61 se.tokenPtr = pa
7a40: 72 73 65 2e 73 74 61 74 69 63 54 6f 6b 65 6e 73 rse.staticTokens
7a50: 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e 6e 75 6d ;.+ parse.num
7a60: 54 6f 6b 65 6e 73 20 3d 20 30 3b 0a 2b 20 20 20 Tokens = 0;.+
7a70: 20 70 61 72 73 65 2e 74 6f 6b 65 6e 73 41 76 61 parse.tokensAva
7a80: 69 6c 61 62 6c 65 20 3d 20 4e 55 4d 5f 53 54 41 ilable = NUM_STA
7a90: 54 49 43 5f 54 4f 4b 45 4e 53 3b 0a 2b 20 20 20 TIC_TOKENS;.+
7aa0: 20 70 61 72 73 65 2e 73 74 72 69 6e 67 20 3d 20 parse.string =
7ab0: 70 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e 65 6e p;.+ parse.en
7ac0: 64 20 3d 20 70 20 2b 20 6c 65 6e 67 74 68 3b 0a d = p + length;.
7ad0: 2b 20 20 20 20 70 61 72 73 65 2e 74 65 72 6d 20 + parse.term
7ae0: 3d 20 70 61 72 73 65 2e 65 6e 64 3b 0a 2b 20 20 = parse.end;.+
7af0: 20 20 70 61 72 73 65 2e 69 6e 74 65 72 70 20 3d parse.interp =
7b00: 20 69 6e 74 65 72 70 3b 0a 2b 20 20 20 20 70 61 interp;.+ pa
7b10: 72 73 65 2e 69 6e 63 6f 6d 70 6c 65 74 65 20 3d rse.incomplete =
7b20: 20 30 3b 0a 2b 20 20 20 20 70 61 72 73 65 2e 65 0;.+ parse.e
7b30: 72 72 6f 72 54 79 70 65 20 3d 20 54 43 4c 5f 50 rrorType = TCL_P
7b40: 41 52 53 45 5f 53 55 43 43 45 53 53 3b 0a 2b 0a ARSE_SUCCESS;.+.
7b50: 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 + /*.+ *
7b60: 46 69 72 73 74 20 70 61 72 73 65 20 74 68 65 20 First parse the
7b70: 73 74 72 69 6e 67 20 72 65 70 20 6f 66 20 6f 62 string rep of ob
7b80: 6a 50 74 72 2c 20 61 73 20 69 66 20 69 74 20 77 jPtr, as if it w
7b90: 65 72 65 20 65 6e 63 6c 6f 73 65 64 0a 2b 20 20 ere enclosed.+
7ba0: 20 20 20 2a 20 61 73 20 61 20 22 2d 71 75 6f 74 * as a "-quot
7bb0: 65 64 20 77 6f 72 64 20 69 6e 20 61 20 6e 6f 72 ed word in a nor
7bc0: 6d 61 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e mal Tcl command.
7bd0: 20 20 48 6f 6e 6f 72 20 66 6c 61 67 73 20 74 68 Honor flags th
7be0: 61 74 0a 2b 20 20 20 20 20 2a 20 73 65 6c 65 63 at.+ * selec
7bf0: 74 69 76 65 6c 79 20 69 6e 68 69 62 69 74 20 74 tively inhibit t
7c00: 79 70 65 73 20 6f 66 20 73 75 62 73 74 69 74 75 ypes of substitu
7c10: 74 69 6f 6e 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b tion..+ */.+
7c20: 0a 2b 20 20 20 20 69 66 20 28 54 43 4c 5f 4f 4b .+ if (TCL_OK
7c30: 20 21 3d 20 50 61 72 73 65 54 6f 6b 65 6e 73 28 != ParseTokens(
7c40: 70 2c 20 6c 65 6e 67 74 68 2c 20 2f 2a 20 6d 61 p, length, /* ma
7c50: 73 6b 20 2a 2f 20 30 2c 20 66 6c 61 67 73 2c 20 sk */ 0, flags,
7c60: 26 70 61 72 73 65 29 29 20 7b 0a 2b 0a 2b 09 2f &parse)) {.+.+./
7c70: 2a 0a 2b 09 20 2a 20 54 68 65 72 65 20 77 61 73 *.+. * There was
7c80: 20 61 20 70 61 72 73 65 20 65 72 72 6f 72 2e 20 a parse error.
7c90: 20 53 61 76 65 20 74 68 65 20 65 72 72 6f 72 20 Save the error
7ca0: 6d 65 73 73 61 67 65 20 66 6f 72 0a 2b 09 20 2a message for.+. *
7cb0: 20 70 6f 73 73 69 62 6c 65 20 72 65 70 6f 72 74 possible report
7cc0: 69 6e 67 20 6c 61 74 65 72 2e 0a 2b 09 20 2a 2f ing later..+. */
7cd0: 0a 2b 0a 2b 09 65 72 72 4d 73 67 20 3d 20 54 63 .+.+.errMsg = Tc
7ce0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
7cf0: 6e 74 65 72 70 29 3b 0a 2b 09 54 63 6c 5f 49 6e nterp);.+.Tcl_In
7d00: 63 72 52 65 66 43 6f 75 6e 74 28 65 72 72 4d 73 crRefCount(errMs
7d10: 67 29 3b 0a 2b 0a 2b 09 2f 2a 0a 2b 09 20 2a 20 g);.+.+./*.+. *
7d20: 57 65 20 6e 65 65 64 20 74 6f 20 72 65 2d 70 61 We need to re-pa
7d30: 72 73 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 rse to get the p
7d40: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 ortion of the st
7d50: 72 69 6e 67 20 77 65 20 63 61 6e 0a 2b 09 20 2a ring we can.+. *
7d60: 20 5b 73 75 62 73 74 5d 20 62 65 66 6f 72 65 20 [subst] before
7d70: 74 68 65 20 70 61 72 73 65 20 65 72 72 6f 72 2e the parse error.
7d80: 20 20 53 61 64 6c 79 2c 20 61 6c 6c 20 74 68 65 Sadly, all the
7d90: 20 54 63 6c 5f 54 6f 6b 65 6e 27 73 0a 2b 09 20 Tcl_Token's.+.
7da0: 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 * created by the
7db0: 20 66 69 72 73 74 20 70 61 72 73 65 20 61 74 74 first parse att
7dc0: 65 6d 70 74 20 61 72 65 20 67 6f 6e 65 2c 20 66 empt are gone, f
7dd0: 72 65 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 reed according t
7de0: 6f 20 74 68 65 0a 2b 09 20 2a 20 70 75 62 6c 69 o the.+. * publi
7df0: 63 20 73 70 65 63 20 66 6f 72 20 74 68 65 20 54 c spec for the T
7e00: 63 6c 5f 50 61 72 73 65 2a 20 72 6f 75 74 69 6e cl_Parse* routin
7e10: 65 73 2e 20 20 54 68 65 20 6f 6e 6c 79 20 63 6c es. The only cl
7e20: 75 65 20 77 65 20 68 61 76 65 0a 2b 09 20 2a 20 ue we have.+. *
7e30: 69 73 20 70 61 72 73 65 2e 74 65 72 6d 2c 20 77 is parse.term, w
7e40: 68 69 63 68 20 70 6f 69 6e 74 73 20 74 6f 20 65 hich points to e
7e50: 69 74 68 65 72 20 74 68 65 20 75 6e 6d 61 74 63 ither the unmatc
7e60: 68 65 64 20 6f 70 65 6e 65 72 2c 20 6f 72 0a 2b hed opener, or.+
7e70: 09 20 2a 20 74 6f 20 63 68 61 72 61 63 74 65 72 . * to character
7e80: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 s that follow a
7e90: 63 6c 6f 73 65 20 62 72 61 63 65 20 6f 72 20 63 close brace or c
7ea0: 6c 6f 73 65 20 71 75 6f 74 65 2e 0a 2b 09 20 2a lose quote..+. *
7eb0: 0a 2b 09 20 2a 20 43 61 6c 6c 20 50 61 72 73 65 .+. * Call Parse
7ec0: 54 6f 6b 65 6e 73 20 61 67 61 69 6e 2c 20 77 6f Tokens again, wo
7ed0: 72 6b 69 6e 67 20 6f 6e 20 74 68 65 20 73 74 72 rking on the str
7ee0: 69 6e 67 20 75 70 20 74 6f 20 70 61 72 73 65 2e ing up to parse.
7ef0: 74 65 72 6d 2e 0a 2b 09 20 2a 20 4b 65 65 70 20 term..+. * Keep
7f00: 72 65 70 65 61 74 69 6e 67 20 75 6e 74 69 6c 20 repeating until
7f10: 77 65 20 67 65 74 20 61 20 67 6f 6f 64 20 70 61 we get a good pa
7f20: 72 73 65 20 6f 6e 20 61 20 70 72 65 66 69 78 2e rse on a prefix.
7f30: 0a 2b 09 20 2a 2f 0a 2b 0a 2b 09 64 6f 20 7b 0a .+. */.+.+.do {.
7f40: 2b 09 20 20 20 20 70 61 72 73 65 2e 6e 75 6d 54 +. parse.numT
7f50: 6f 6b 65 6e 73 20 3d 20 30 3b 0a 2b 09 20 20 20 okens = 0;.+.
7f60: 20 70 61 72 73 65 2e 74 6f 6b 65 6e 73 41 76 61 parse.tokensAva
7f70: 69 6c 61 62 6c 65 20 3d 20 4e 55 4d 5f 53 54 41 ilable = NUM_STA
7f80: 54 49 43 5f 54 4f 4b 45 4e 53 3b 0a 2b 09 20 20 TIC_TOKENS;.+.
7f90: 20 20 70 61 72 73 65 2e 65 6e 64 20 3d 20 70 61 parse.end = pa
7fa0: 72 73 65 2e 74 65 72 6d 3b 0a 2b 09 20 20 20 20 rse.term;.+.
7fb0: 70 61 72 73 65 2e 69 6e 63 6f 6d 70 6c 65 74 65 parse.incomplete
7fc0: 20 3d 20 30 3b 0a 2b 09 20 20 20 20 70 61 72 73 = 0;.+. pars
7fd0: 65 2e 65 72 72 6f 72 54 79 70 65 20 3d 20 54 43 e.errorType = TC
7fe0: 4c 5f 50 41 52 53 45 5f 53 55 43 43 45 53 53 3b L_PARSE_SUCCESS;
7ff0: 0a 2b 09 7d 20 77 68 69 6c 65 20 28 54 43 4c 5f .+.} while (TCL_
8000: 4f 4b 20 21 3d 20 50 61 72 73 65 54 6f 6b 65 6e OK != ParseToken
8010: 73 28 70 2c 20 70 61 72 73 65 2e 65 6e 64 20 2d s(p, parse.end -
8020: 20 70 2c 20 30 2c 20 66 6c 61 67 73 2c 20 26 70 p, 0, flags, &p
8030: 61 72 73 65 29 29 3b 0a 2b 0a 2b 09 2f 2a 20 54 arse));.+.+./* T
8040: 68 65 20 67 6f 6f 64 20 70 61 72 73 65 20 77 69 he good parse wi
8050: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20 66 6f ll have to be fo
8060: 6c 6c 6f 77 65 64 20 62 79 20 7b 2c 20 28 2c 20 llowed by {, (,
8070: 6f 72 20 5b 2e 20 2a 2f 0a 2b 09 73 77 69 74 63 or [. */.+.switc
8080: 68 20 28 2a 70 61 72 73 65 2e 74 65 72 6d 29 20 h (*parse.term)
8090: 7b 0a 2b 09 20 20 20 20 63 61 73 65 20 27 7b 27 {.+. case '{'
80a0: 3a 0a 2b 09 09 2f 2a 0a 2b 09 09 20 2a 20 50 61 :.+../*.+.. * Pa
80b0: 72 73 65 20 65 72 72 6f 72 20 77 61 73 20 61 20 rse error was a
80c0: 6d 69 73 73 69 6e 67 20 7d 20 69 6e 20 61 20 24 missing } in a $
80d0: 7b 76 61 72 6e 61 6d 65 7d 20 76 61 72 69 61 62 {varname} variab
80e0: 6c 65 0a 2b 09 09 20 2a 20 73 75 62 73 74 69 74 le.+.. * substit
80f0: 75 74 69 6f 6e 20 61 74 20 74 68 65 20 74 6f 70 ution at the top
8100: 6c 65 76 65 6c 2e 20 20 57 65 20 77 69 6c 6c 20 level. We will
8110: 73 75 62 73 74 20 65 76 65 72 79 74 68 69 6e 67 subst everything
8120: 0a 2b 09 09 20 2a 20 75 70 20 74 6f 20 74 68 61 .+.. * up to tha
8130: 74 20 62 72 6f 6b 65 6e 20 76 61 72 69 61 62 6c t broken variabl
8140: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 62 e substitution b
8150: 65 66 6f 72 65 20 72 65 70 6f 72 74 69 6e 67 0a efore reporting.
8160: 2b 09 09 20 2a 20 74 68 65 20 70 61 72 73 65 20 +.. * the parse
8170: 65 72 72 6f 72 2e 20 20 53 75 62 73 74 69 74 75 error. Substitu
8180: 74 69 6e 67 20 74 68 65 20 6c 65 66 74 6f 76 65 ting the leftove
8190: 72 20 27 24 27 20 77 69 6c 6c 0a 2b 09 09 20 2a r '$' will.+.. *
81a0: 20 68 61 76 65 20 6e 6f 20 73 69 64 65 2d 65 66 have no side-ef
81b0: 66 65 63 74 73 2c 20 73 6f 20 74 68 65 20 63 75 fects, so the cu
81c0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 72 65 rrent token stre
81d0: 61 6d 20 69 73 20 66 69 6e 65 2e 0a 2b 09 09 20 am is fine..+..
81e0: 2a 2f 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b 09 20 */.+..break;.+.
81f0: 20 20 20 63 61 73 65 20 27 28 27 3a 0a 2b 09 09 case '(':.+..
8200: 2f 2a 0a 2b 09 09 20 2a 20 50 61 72 73 65 20 65 /*.+.. * Parse e
8210: 72 72 6f 72 20 77 61 73 20 64 75 72 69 6e 67 20 rror was during
8220: 74 68 65 20 70 61 72 73 69 6e 67 20 6f 66 20 74 the parsing of t
8230: 68 65 20 69 6e 64 65 78 20 70 61 72 74 20 6f 66 he index part of
8240: 0a 2b 09 09 20 2a 20 61 6e 20 61 72 72 61 79 20 .+.. * an array
8250: 76 61 72 69 61 62 6c 65 20 73 75 62 73 74 69 74 variable substit
8260: 75 74 69 6f 6e 20 61 74 20 74 68 65 20 74 6f 70 ution at the top
8270: 6c 65 76 65 6c 2e 20 20 0a 2b 09 09 20 2a 2f 0a level. .+.. */.
8280: 2b 09 09 69 66 20 28 2a 28 70 61 72 73 65 2e 74 +..if (*(parse.t
8290: 65 72 6d 20 2d 20 31 29 20 3d 3d 20 27 24 27 29 erm - 1) == '$')
82a0: 20 7b 0a 2b 09 09 20 20 20 20 2f 2a 0a 2b 09 09 {.+.. /*.+..
82b0: 20 20 20 20 20 2a 20 53 70 65 63 69 61 6c 20 63 * Special c
82c0: 61 73 65 20 77 68 65 72 65 20 72 65 6d 6f 76 69 ase where removi
82d0: 6e 67 20 74 68 65 20 61 72 72 61 79 20 69 6e 64 ng the array ind
82e0: 65 78 20 6c 65 66 74 0a 2b 09 09 20 20 20 20 20 ex left.+..
82f0: 2a 20 75 73 20 77 69 74 68 20 6a 75 73 74 20 61 * us with just a
8300: 20 64 6f 6c 6c 61 72 20 73 69 67 6e 20 28 61 72 dollar sign (ar
8310: 72 61 79 20 76 61 72 69 61 62 6c 65 20 77 69 74 ray variable wit
8320: 68 0a 2b 09 09 20 20 20 20 20 2a 20 6e 61 6d 65 h.+.. * name
8330: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e the empty strin
8340: 67 20 61 73 20 69 74 73 20 6e 61 6d 65 29 2c 20 g as its name),
8350: 69 6e 73 74 65 61 64 20 6f 66 0a 2b 09 09 20 20 instead of.+..
8360: 20 20 20 2a 20 77 69 74 68 20 61 20 73 63 61 6c * with a scal
8370: 61 72 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 ar variable refe
8380: 72 65 6e 63 65 2e 20 20 0a 2b 09 09 20 20 20 20 rence. .+..
8390: 20 2a 0a 2b 09 09 20 20 20 20 20 2a 20 41 73 20 *.+.. * As
83a0: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 in the previous
83b0: 63 61 73 65 2c 20 65 78 69 73 74 69 6e 67 20 74 case, existing t
83c0: 6f 6b 65 6e 20 73 74 72 65 61 6d 20 69 73 20 4f oken stream is O
83d0: 4b 2e 0a 2b 09 09 20 20 20 20 20 2a 2f 0a 2b 09 K..+.. */.+.
83e0: 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 09 20 20 20 .} else {.+..
83f0: 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 /* The current p
8400: 61 72 73 65 20 69 6e 63 6c 75 64 65 73 20 61 20 arse includes a
8410: 73 75 63 63 65 73 73 66 75 6c 20 70 61 72 73 65 successful parse
8420: 20 6f 66 20 61 0a 2b 09 09 20 20 20 20 2a 20 73 of a.+.. * s
8430: 63 61 6c 61 72 20 76 61 72 69 61 62 6c 65 20 73 calar variable s
8440: 75 62 73 74 69 74 75 74 69 6f 6e 20 77 68 65 72 ubstitution wher
8450: 65 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 68 e there should h
8460: 61 76 65 0a 2b 09 09 20 20 20 20 2a 20 62 65 65 ave.+.. * bee
8470: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 n an array varia
8480: 62 6c 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e ble substitution
8490: 2e 20 20 57 65 20 72 65 6d 6f 76 65 20 74 68 61 . We remove tha
84a0: 74 0a 2b 09 09 20 20 20 20 2a 20 6d 69 73 74 61 t.+.. * mista
84b0: 6b 65 6e 20 70 61 72 74 20 6f 66 20 74 68 65 20 ken part of the
84c0: 70 61 72 73 65 20 62 65 66 6f 72 65 20 6d 6f 76 parse before mov
84d0: 69 6e 67 20 6f 6e 2e 20 20 41 20 73 63 61 6c 61 ing on. A scala
84e0: 72 0a 2b 09 09 20 20 20 20 2a 20 76 61 72 69 61 r.+.. * varia
84f0: 62 6c 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e ble substitution
8500: 20 69 73 20 74 77 6f 20 74 6f 6b 65 6e 73 2e 0a is two tokens..
8510: 2b 09 09 20 20 20 20 2a 2f 0a 2b 09 09 20 20 20 +.. */.+..
8520: 20 54 63 6c 5f 54 6f 6b 65 6e 20 2a 76 61 72 54 Tcl_Token *varT
8530: 6f 6b 65 6e 50 74 72 20 3d 0a 2b 09 09 09 20 20 okenPtr =.+...
8540: 20 20 70 61 72 73 65 2e 74 6f 6b 65 6e 50 74 72 parse.tokenPtr
8550: 20 2b 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 + parse.numToke
8560: 6e 73 20 2d 20 32 3b 0a 2b 0a 2b 09 09 20 20 20 ns - 2;.+.+..
8570: 20 69 66 20 28 76 61 72 54 6f 6b 65 6e 50 74 72 if (varTokenPtr
8580: 2d 3e 74 79 70 65 20 21 3d 20 54 43 4c 5f 54 4f ->type != TCL_TO
8590: 4b 45 4e 5f 56 41 52 49 41 42 4c 45 29 20 7b 0a KEN_VARIABLE) {.
85a0: 2b 09 09 09 54 63 6c 5f 50 61 6e 69 63 28 22 54 +...Tcl_Panic("T
85b0: 63 6c 5f 53 75 62 73 74 4f 62 6a 3a 20 70 72 6f cl_SubstObj: pro
85c0: 67 72 61 6d 6d 69 6e 67 20 65 72 72 6f 72 22 29 gramming error")
85d0: 3b 0a 2b 09 09 20 20 20 20 7d 0a 2b 09 09 20 20 ;.+.. }.+..
85e0: 20 20 69 66 20 28 76 61 72 54 6f 6b 65 6e 50 74 if (varTokenPt
85f0: 72 5b 31 5d 2e 74 79 70 65 20 21 3d 20 54 43 4c r[1].type != TCL
8600: 5f 54 4f 4b 45 4e 5f 54 45 58 54 29 20 7b 0a 2b _TOKEN_TEXT) {.+
8610: 09 09 09 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 ...Tcl_Panic("Tc
8620: 6c 5f 53 75 62 73 74 4f 62 6a 3a 20 70 72 6f 67 l_SubstObj: prog
8630: 72 61 6d 6d 69 6e 67 20 65 72 72 6f 72 22 29 3b ramming error");
8640: 0a 2b 09 09 20 20 20 20 7d 0a 2b 09 09 20 20 20 .+.. }.+..
8650: 20 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 parse.numTokens
8660: 20 2d 3d 20 32 3b 0a 2b 09 09 7d 0a 2b 09 09 62 -= 2;.+..}.+..b
8670: 72 65 61 6b 3b 0a 2b 09 20 20 20 20 63 61 73 65 reak;.+. case
8680: 20 27 5b 27 3a 0a 2b 09 09 2f 2a 0a 2b 09 09 20 '[':.+../*.+..
8690: 2a 20 50 61 72 73 65 20 65 72 72 6f 72 20 6f 63 * Parse error oc
86a0: 63 75 72 72 65 64 20 64 75 72 69 6e 67 20 70 61 curred during pa
86b0: 72 73 69 6e 67 20 6f 66 20 61 20 74 6f 70 6c 65 rsing of a tople
86c0: 76 65 6c 0a 2b 09 09 20 2a 20 63 6f 6d 6d 61 6e vel.+.. * comman
86d0: 64 20 73 75 62 73 74 69 74 75 74 69 6f 6e 2e 20 d substitution.
86e0: 20 0a 2b 09 09 20 2a 2f 0a 2b 0a 2b 09 09 70 61 .+.. */.+.+..pa
86f0: 72 73 65 2e 65 6e 64 20 3d 20 70 20 2b 20 6c 65 rse.end = p + le
8700: 6e 67 74 68 3b 0a 2b 09 09 70 20 3d 20 70 61 72 ngth;.+..p = par
8710: 73 65 2e 74 65 72 6d 20 2b 20 31 3b 0a 2b 09 09 se.term + 1;.+..
8720: 6c 65 6e 67 74 68 20 3d 20 70 61 72 73 65 2e 65 length = parse.e
8730: 6e 64 20 2d 20 70 3b 0a 2b 09 09 69 66 20 28 6c nd - p;.+..if (l
8740: 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b 0a 2b 09 ength == 0) {.+.
8750: 09 20 20 20 20 2f 2a 0a 2b 09 09 20 20 20 20 20 . /*.+..
8760: 2a 20 4e 6f 20 63 6f 6d 6d 61 6e 64 73 2c 20 6a * No commands, j
8770: 75 73 74 20 61 6e 20 75 6e 6d 61 74 63 68 65 64 ust an unmatched
8780: 20 5b 2e 20 20 0a 2b 09 09 20 20 20 20 20 2a 20 [. .+.. *
8790: 41 73 20 69 6e 20 70 72 65 76 69 6f 75 73 20 63 As in previous c
87a0: 61 73 65 73 2c 20 65 78 69 73 74 69 6e 67 20 74 ases, existing t
87b0: 6f 6b 65 6e 20 73 74 72 65 61 6d 20 69 73 20 4f oken stream is O
87c0: 4b 2e 0a 2b 09 09 20 20 20 20 20 2a 2f 0a 2b 09 K..+.. */.+.
87d0: 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 09 20 20 20 .} else {.+..
87e0: 20 2f 2a 20 0a 2b 09 09 20 20 20 20 20 2a 20 57 /* .+.. * W
87f0: 65 20 77 61 6e 74 20 74 6f 20 61 64 64 20 74 68 e want to add th
8800: 65 20 70 61 72 73 69 6e 67 20 6f 66 20 61 73 20 e parsing of as
8810: 6d 61 6e 79 20 63 6f 6d 6d 61 6e 64 73 20 61 73 many commands as
8820: 20 77 65 0a 2b 09 09 20 20 20 20 20 2a 20 63 61 we.+.. * ca
8830: 6e 20 77 69 74 68 69 6e 20 74 68 61 74 20 73 75 n within that su
8840: 62 73 74 69 74 75 74 69 6f 6e 20 75 6e 74 69 6c bstitution until
8850: 20 77 65 20 72 65 61 63 68 20 74 68 65 0a 2b 09 we reach the.+.
8860: 09 20 20 20 20 20 2a 20 61 63 74 75 61 6c 20 70 . * actual p
8870: 61 72 73 65 20 65 72 72 6f 72 2e 20 20 57 65 27 arse error. We'
8880: 6c 6c 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c ll do additional
8890: 20 70 61 72 73 69 6e 67 20 74 6f 0a 2b 09 09 20 parsing to.+..
88a0: 20 20 20 20 2a 20 64 65 74 65 72 6d 69 6e 65 20 * determine
88b0: 77 68 61 74 20 6c 65 6e 67 74 68 20 74 6f 20 63 what length to c
88c0: 6c 61 69 6d 20 66 6f 72 20 74 68 65 20 66 69 6e laim for the fin
88d0: 61 6c 0a 2b 09 09 20 20 20 20 20 2a 20 54 43 4c al.+.. * TCL
88e0: 5f 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 4e 44 20 74 _TOKEN_COMMAND t
88f0: 6f 6b 65 6e 2e 0a 2b 09 09 20 20 20 20 20 2a 2f oken..+.. */
8900: 0a 2b 09 09 20 20 20 20 54 63 6c 5f 54 6f 6b 65 .+.. Tcl_Toke
8910: 6e 20 2a 74 6f 6b 65 6e 50 74 72 3b 0a 2b 09 09 n *tokenPtr;.+..
8920: 20 20 20 20 54 63 6c 5f 50 61 72 73 65 20 6e 65 Tcl_Parse ne
8930: 73 74 65 64 3b 0a 2b 09 09 20 20 20 20 43 4f 4e sted;.+.. CON
8940: 53 54 20 63 68 61 72 20 2a 6c 61 73 74 54 65 72 ST char *lastTer
8950: 6d 20 3d 20 70 61 72 73 65 2e 74 65 72 6d 3b 0a m = parse.term;.
8960: 2b 0a 2b 09 09 20 20 20 20 77 68 69 6c 65 20 28 +.+.. while (
8970: 54 43 4c 5f 4f 4b 20 3d 3d 20 0a 2b 09 09 09 20 TCL_OK == .+...
8980: 20 20 20 54 63 6c 5f 50 61 72 73 65 43 6f 6d 6d Tcl_ParseComm
8990: 61 6e 64 28 4e 55 4c 4c 2c 20 70 2c 20 6c 65 6e and(NULL, p, len
89a0: 67 74 68 2c 20 30 2c 20 26 6e 65 73 74 65 64 29 gth, 0, &nested)
89b0: 29 20 7b 0a 2b 09 09 09 54 63 6c 5f 46 72 65 65 ) {.+...Tcl_Free
89c0: 50 61 72 73 65 28 26 6e 65 73 74 65 64 29 3b 0a Parse(&nested);.
89d0: 2b 09 09 09 70 20 3d 20 6e 65 73 74 65 64 2e 74 +...p = nested.t
89e0: 65 72 6d 20 2b 20 28 6e 65 73 74 65 64 2e 74 65 erm + (nested.te
89f0: 72 6d 20 3c 20 6e 65 73 74 65 64 2e 65 6e 64 29 rm < nested.end)
8a00: 3b 0a 2b 09 09 09 6c 65 6e 67 74 68 20 3d 20 6e ;.+...length = n
8a10: 65 73 74 65 64 2e 65 6e 64 20 2d 20 70 3b 0a 2b ested.end - p;.+
8a20: 09 09 09 69 66 20 28 6c 65 6e 67 74 68 20 3d 3d ...if (length ==
8a30: 20 30 29 20 7b 0a 2b 09 09 09 20 20 20 20 2f 2a 0) {.+... /*
8a40: 0a 2b 09 09 09 20 20 20 20 20 2a 20 49 66 20 77 .+... * If w
8a50: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 73 74 72 e run out of str
8a60: 69 6e 67 2c 20 62 6c 61 6d 65 20 74 68 65 20 6d ing, blame the m
8a70: 69 73 73 69 6e 67 0a 2b 09 09 09 20 20 20 20 20 issing.+...
8a80: 2a 20 63 6c 6f 73 65 20 62 72 61 63 6b 65 74 20 * close bracket
8a90: 6f 6e 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 6d on the last comm
8aa0: 61 6e 64 2c 20 61 6e 64 20 64 6f 0a 2b 09 09 09 and, and do.+...
8ab0: 20 20 20 20 20 2a 20 6e 6f 74 20 65 76 61 6c 75 * not evalu
8ac0: 61 74 65 20 69 74 20 64 75 72 69 6e 67 20 73 75 ate it during su
8ad0: 62 73 74 69 74 75 74 69 6f 6e 2e 0a 2b 09 09 09 bstitution..+...
8ae0: 20 20 20 20 20 2a 2f 0a 2b 09 09 09 20 20 20 20 */.+...
8af0: 62 72 65 61 6b 3b 0a 2b 09 09 09 7d 0a 2b 09 09 break;.+...}.+..
8b00: 09 6c 61 73 74 54 65 72 6d 20 3d 20 6e 65 73 74 .lastTerm = nest
8b10: 65 64 2e 74 65 72 6d 3b 0a 2b 09 09 20 20 20 20 ed.term;.+..
8b20: 7d 0a 2b 0a 2b 09 09 20 20 20 20 69 66 20 28 6c }.+.+.. if (l
8b30: 61 73 74 54 65 72 6d 20 3d 3d 20 70 61 72 73 65 astTerm == parse
8b40: 2e 74 65 72 6d 29 20 7b 0a 2b 09 09 09 2f 2a 0a .term) {.+.../*.
8b50: 2b 09 09 09 20 2a 20 50 61 72 73 65 20 65 72 72 +... * Parse err
8b60: 6f 72 20 69 6e 20 66 69 72 73 74 20 63 6f 6d 6d or in first comm
8b70: 61 6e 64 2e 20 20 4e 6f 20 63 6f 6d 6d 61 6e 64 and. No command
8b80: 73 0a 2b 09 09 09 20 2a 20 74 6f 20 73 75 62 73 s.+... * to subs
8b90: 74 2c 20 61 64 64 20 6e 6f 20 6d 6f 72 65 20 74 t, add no more t
8ba0: 6f 6b 65 6e 73 2e 0a 2b 09 09 09 20 2a 2f 0a 2b okens..+... */.+
8bb0: 09 09 09 62 72 65 61 6b 3b 0a 2b 09 09 20 20 20 ...break;.+..
8bc0: 20 7d 0a 2b 0a 2b 09 09 20 20 20 20 2f 2a 0a 2b }.+.+.. /*.+
8bd0: 09 09 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 .. * Create
8be0: 61 20 63 6f 6d 6d 61 6e 64 20 73 75 62 73 74 69 a command substi
8bf0: 74 75 74 69 6f 6e 20 74 6f 6b 65 6e 20 66 6f 72 tution token for
8c00: 20 77 68 61 74 65 76 65 72 0a 2b 09 09 20 20 20 whatever.+..
8c10: 20 20 2a 20 63 6f 6d 6d 61 6e 64 73 20 67 6f 74 * commands got
8c20: 20 70 61 72 73 65 64 2e 0a 2b 09 09 20 20 20 20 parsed..+..
8c30: 20 2a 2f 0a 2b 0a 2b 09 09 20 20 20 20 69 66 20 */.+.+.. if
8c40: 28 70 61 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 (parse.numTokens
8c50: 20 3d 3d 20 70 61 72 73 65 2e 74 6f 6b 65 6e 73 == parse.tokens
8c60: 41 76 61 69 6c 61 62 6c 65 29 20 7b 0a 2b 09 09 Available) {.+..
8c70: 09 54 63 6c 45 78 70 61 6e 64 54 6f 6b 65 6e 41 .TclExpandTokenA
8c80: 72 72 61 79 28 26 70 61 72 73 65 29 3b 0a 2b 09 rray(&parse);.+.
8c90: 09 20 20 20 20 7d 0a 2b 09 09 20 20 20 20 74 6f . }.+.. to
8ca0: 6b 65 6e 50 74 72 20 3d 20 26 70 61 72 73 65 2e kenPtr = &parse.
8cb0: 74 6f 6b 65 6e 50 74 72 5b 70 61 72 73 65 2e 6e tokenPtr[parse.n
8cc0: 75 6d 54 6f 6b 65 6e 73 5d 3b 0a 2b 09 09 20 20 umTokens];.+..
8cd0: 20 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 tokenPtr->star
8ce0: 74 20 3d 20 70 61 72 73 65 2e 74 65 72 6d 3b 0a t = parse.term;.
8cf0: 2b 09 09 20 20 20 20 74 6f 6b 65 6e 50 74 72 2d +.. tokenPtr-
8d00: 3e 6e 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 20 3d >numComponents =
8d10: 20 30 3b 0a 2b 09 09 20 20 20 20 74 6f 6b 65 6e 0;.+.. token
8d20: 50 74 72 2d 3e 74 79 70 65 20 3d 20 54 43 4c 5f Ptr->type = TCL_
8d30: 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 4e 44 3b 0a 2b TOKEN_COMMAND;.+
8d40: 09 09 20 20 20 20 74 6f 6b 65 6e 50 74 72 2d 3e .. tokenPtr->
8d50: 73 69 7a 65 20 3d 20 6c 61 73 74 54 65 72 6d 20 size = lastTerm
8d60: 2d 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 - tokenPtr->star
8d70: 74 20 2b 20 31 3b 0a 2b 09 09 20 20 20 20 70 61 t + 1;.+.. pa
8d80: 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 2b 2b 3b rse.numTokens++;
8d90: 0a 2b 09 09 7d 0a 2b 09 09 62 72 65 61 6b 3b 0a .+..}.+..break;.
8da0: 2b 0a 2b 09 20 20 20 20 64 65 66 61 75 6c 74 3a +.+. default:
8db0: 0a 2b 09 09 54 63 6c 5f 50 61 6e 69 63 28 22 62 .+..Tcl_Panic("b
8dc0: 61 64 20 70 61 72 73 65 20 69 6e 20 54 63 6c 5f ad parse in Tcl_
8dd0: 53 75 62 73 74 4f 62 6a 3a 20 25 63 22 2c 20 70 SubstObj: %c", p
8de0: 5b 6c 65 6e 67 74 68 5d 29 3b 0a 2b 09 7d 0a 2b [length]);.+.}.+
8df0: 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 2f 2a 20 }.+.+ /*
8e00: 4e 65 78 74 2c 20 73 75 62 73 74 69 74 75 74 65 Next, substitute
8e10: 20 74 68 65 20 70 61 72 73 65 64 20 74 6f 6b 65 the parsed toke
8e20: 6e 73 20 6a 75 73 74 20 61 73 20 69 6e 20 6e 6f ns just as in no
8e30: 72 6d 61 6c 20 54 63 6c 20 65 76 61 6c 75 61 74 rmal Tcl evaluat
8e40: 69 6f 6e 20 2a 2f 0a 2b 20 20 20 20 65 6e 64 54 ion */.+ endT
8e50: 6f 6b 65 6e 50 74 72 20 3d 20 70 61 72 73 65 2e okenPtr = parse.
8e60: 74 6f 6b 65 6e 50 74 72 20 2b 20 70 61 72 73 65 tokenPtr + parse
8e70: 2e 6e 75 6d 54 6f 6b 65 6e 73 3b 0a 2b 20 20 20 .numTokens;.+
8e80: 20 74 6f 6b 65 6e 73 4c 65 66 74 20 3d 20 70 61 tokensLeft = pa
8e90: 72 73 65 2e 6e 75 6d 54 6f 6b 65 6e 73 3b 0a 2b rse.numTokens;.+
8ea0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 53 75 code = TclSu
8eb0: 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 65 72 70 bstTokens(interp
8ec0: 2c 20 65 6e 64 54 6f 6b 65 6e 50 74 72 20 2d 20 , endTokenPtr -
8ed0: 74 6f 6b 65 6e 73 4c 65 66 74 2c 20 74 6f 6b 65 tokensLeft, toke
8ee0: 6e 73 4c 65 66 74 2c 0a 2b 09 20 20 20 20 26 74 nsLeft,.+. &t
8ef0: 6f 6b 65 6e 73 4c 65 66 74 29 3b 0a 2b 20 20 20 okensLeft);.+
8f00: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c if (code == TCL
8f10: 5f 4f 4b 29 20 7b 0a 2b 09 54 63 6c 5f 46 72 65 _OK) {.+.Tcl_Fre
8f20: 65 50 61 72 73 65 28 26 70 61 72 73 65 29 3b 0a eParse(&parse);.
8f30: 2b 09 69 66 20 28 65 72 72 4d 73 67 20 21 3d 20 +.if (errMsg !=
8f40: 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 54 63 NULL) {.+. Tc
8f50: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
8f60: 6e 74 65 72 70 2c 20 65 72 72 4d 73 67 29 3b 0a nterp, errMsg);.
8f70: 2b 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 +. Tcl_DecrRe
8f80: 66 43 6f 75 6e 74 28 65 72 72 4d 73 67 29 3b 0a fCount(errMsg);.
8f90: 2b 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c +. return NUL
8fa0: 4c 3b 0a 2b 09 7d 0a 2b 09 72 65 74 75 72 6e 20 L;.+.}.+.return
8fb0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_GetObjResult
8fc0: 28 69 6e 74 65 72 70 29 3b 0a 2b 20 20 20 20 7d (interp);.+ }
8fd0: 0a 2b 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 .+ result = T
8fe0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 2b 20 20 cl_NewObj();.+
8ff0: 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 2b 09 while (1) {.+.
9000: 73 77 69 74 63 68 20 28 63 6f 64 65 29 20 7b 0a switch (code) {.
9010: 2b 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f 45 +. case TCL_E
9020: 52 52 4f 52 3a 0a 2b 09 09 54 63 6c 5f 46 72 65 RROR:.+..Tcl_Fre
9030: 65 50 61 72 73 65 28 26 70 61 72 73 65 29 3b 0a eParse(&parse);.
9040: 2b 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f +..Tcl_DecrRefCo
9050: 75 6e 74 28 72 65 73 75 6c 74 29 3b 0a 2b 09 09 unt(result);.+..
9060: 69 66 20 28 65 72 72 4d 73 67 20 21 3d 20 4e 55 if (errMsg != NU
9070: 4c 4c 29 20 7b 0a 2b 09 09 20 20 20 20 54 63 6c LL) {.+.. Tcl
9080: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 65 72 _DecrRefCount(er
9090: 72 4d 73 67 29 3b 0a 2b 09 09 7d 0a 2b 09 09 72 rMsg);.+..}.+..r
90a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 2b 09 20 20 eturn NULL;.+.
90b0: 20 20 63 61 73 65 20 54 43 4c 5f 42 52 45 41 4b case TCL_BREAK
90c0: 3a 0a 2b 09 09 74 6f 6b 65 6e 73 4c 65 66 74 20 :.+..tokensLeft
90d0: 3d 20 30 3b 09 09 2f 2a 20 48 61 6c 74 20 73 75 = 0;../* Halt su
90e0: 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 2b 09 bstitution */.+.
90f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 2b 09 09 default:.+..
9100: 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f Tcl_AppendObjToO
9110: 62 6a 28 72 65 73 75 6c 74 2c 20 54 63 6c 5f 47 bj(result, Tcl_G
9120: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
9130: 72 70 29 29 3b 0a 2b 09 7d 0a 2b 0a 2b 09 69 66 rp));.+.}.+.+.if
9140: 20 28 74 6f 6b 65 6e 73 4c 65 66 74 20 3d 3d 20 (tokensLeft ==
9150: 30 29 20 7b 0a 2b 09 20 20 20 20 54 63 6c 5f 46 0) {.+. Tcl_F
9160: 72 65 65 50 61 72 73 65 28 26 70 61 72 73 65 29 reeParse(&parse)
9170: 3b 0a 2b 09 20 20 20 20 69 66 20 28 65 72 72 4d ;.+. if (errM
9180: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 sg != NULL) {.+.
9190: 09 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c .if (code != TCL
91a0: 5f 42 52 45 41 4b 29 20 7b 0a 2b 09 09 20 20 20 _BREAK) {.+..
91b0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
91c0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 4d 73 67 t(interp, errMsg
91d0: 29 3b 0a 2b 09 09 20 20 20 20 54 63 6c 5f 44 65 );.+.. Tcl_De
91e0: 63 72 52 65 66 43 6f 75 6e 74 28 65 72 72 4d 73 crRefCount(errMs
91f0: 67 29 3b 0a 2b 09 09 20 20 20 20 72 65 74 75 72 g);.+.. retur
9200: 6e 20 4e 55 4c 4c 3b 0a 2b 09 09 7d 0a 2b 09 09 n NULL;.+..}.+..
9210: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
9220: 28 65 72 72 4d 73 67 29 3b 0a 2b 09 20 20 20 20 (errMsg);.+.
9230: 7d 0a 2b 09 20 20 20 20 72 65 74 75 72 6e 20 72 }.+. return r
9240: 65 73 75 6c 74 3b 0a 2b 09 7d 0a 2b 0a 2b 09 63 esult;.+.}.+.+.c
9250: 6f 64 65 20 3d 20 54 63 6c 53 75 62 73 74 54 6f ode = TclSubstTo
9260: 6b 65 6e 73 28 69 6e 74 65 72 70 2c 20 65 6e 64 kens(interp, end
9270: 54 6f 6b 65 6e 50 74 72 20 2d 20 74 6f 6b 65 6e TokenPtr - token
9280: 73 4c 65 66 74 2c 20 74 6f 6b 65 6e 73 4c 65 66 sLeft, tokensLef
9290: 74 2c 0a 2b 09 09 26 74 6f 6b 65 6e 73 4c 65 66 t,.+..&tokensLef
92a0: 74 29 3b 0a 2b 20 20 20 20 7d 0a 2b 7d 0a 2b 0a t);.+ }.+}.+.
92b0: 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d +/*.+ *---------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 -------------.+
9300: 2a 0a 2b 20 2a 20 54 63 6c 53 75 62 73 74 54 6f *.+ * TclSubstTo
9310: 6b 65 6e 73 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 kens --.+ *.+ *.
9320: 41 63 63 65 70 74 73 20 61 6e 20 61 72 72 61 79 Accepts an array
9330: 20 6f 66 20 63 6f 75 6e 74 20 54 63 6c 5f 54 6f of count Tcl_To
9340: 6b 65 6e 27 73 2c 20 61 6e 64 20 63 72 65 61 74 ken's, and creat
9350: 65 73 20 61 20 72 65 73 75 6c 74 0a 2b 20 2a 09 es a result.+ *.
9360: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 69 6e 74 value in the int
9370: 65 72 70 20 66 72 6f 6d 20 63 6f 6e 63 61 74 65 erp from concate
9380: 6e 61 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c nating the resul
9390: 74 73 20 6f 66 20 0a 2b 20 2a 09 70 65 72 66 6f ts of .+ *.perfo
93a0: 72 6d 69 6e 67 20 54 63 6c 20 73 75 62 73 74 69 rming Tcl substi
93b0: 74 75 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 54 tution on each T
93c0: 63 6c 5f 54 6f 6b 65 6e 2e 20 20 53 75 62 73 74 cl_Token. Subst
93d0: 69 74 75 74 69 6f 6e 0a 2b 20 2a 09 69 73 20 69 itution.+ *.is i
93e0: 6e 74 65 72 72 75 70 74 65 64 20 69 66 20 61 6e nterrupted if an
93f0: 79 20 6e 6f 6e 2d 54 43 4c 5f 4f 4b 20 63 6f 6d y non-TCL_OK com
9400: 70 6c 65 74 69 6f 6e 20 63 6f 64 65 20 61 72 69 pletion code ari
9410: 73 65 73 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 ses..+ *.+ * Res
9420: 75 6c 74 73 3a 0a 2b 20 2a 20 09 54 68 65 20 72 ults:.+ * .The r
9430: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 eturn value is a
9440: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 63 6f standard Tcl co
9450: 6d 70 6c 65 74 69 6f 6e 20 63 6f 64 65 2e 20 20 mpletion code.
9460: 54 68 65 0a 2b 20 2a 20 09 72 65 73 75 6c 74 20 The.+ * .result
9470: 69 6e 20 69 6e 74 65 72 70 20 69 73 20 74 68 65 in interp is the
9480: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 61 6c substituted val
9490: 75 65 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 ue, or an error
94a0: 6d 65 73 73 61 67 65 0a 2b 20 2a 20 09 69 66 20 message.+ * .if
94b0: 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 TCL_ERROR is ret
94c0: 75 72 6e 65 64 2e 20 20 49 66 20 74 6f 6b 65 6e urned. If token
94d0: 73 4c 65 66 74 50 74 72 20 69 73 20 6e 6f 74 20 sLeftPtr is not
94e0: 4e 55 4c 4c 2c 20 74 68 65 6e 0a 2b 20 2a 20 09 NULL, then.+ * .
94f0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 it points to an
9500: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 75 int where the nu
9510: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 72 mber of tokens r
9520: 65 6d 61 69 6e 69 6e 67 20 74 6f 0a 2b 20 2a 20 emaining to.+ *
9530: 09 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 73 .be processed is
9540: 20 77 72 69 74 74 65 6e 2e 0a 2b 20 2a 0a 2b 20 written..+ *.+
9550: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
9560: 2b 20 2a 20 09 43 61 6e 20 62 65 20 61 6e 79 74 + * .Can be anyt
9570: 68 69 6e 67 2c 20 64 65 70 65 6e 64 69 6e 67 20 hing, depending
9580: 6f 6e 20 74 68 65 20 74 79 70 65 73 20 6f 66 20 on the types of
9590: 73 75 62 73 74 69 74 75 74 69 6f 6e 20 64 6f 6e substitution don
95a0: 65 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d e..+ *.+ *------
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95f0: 0a 2b 20 2a 2f 0a 2b 0a 2b 69 6e 74 0a 2b 54 63 .+ */.+.+int.+Tc
9600: 6c 53 75 62 73 74 54 6f 6b 65 6e 73 28 69 6e 74 lSubstTokens(int
9610: 65 72 70 2c 20 74 6f 6b 65 6e 50 74 72 2c 20 63 erp, tokenPtr, c
9620: 6f 75 6e 74 2c 20 74 6f 6b 65 6e 73 4c 65 66 74 ount, tokensLeft
9630: 50 74 72 29 0a 2b 20 20 20 20 54 63 6c 5f 49 6e Ptr).+ Tcl_In
9640: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 terp *interp;
9650: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 70 72 /* Interpr
9660: 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f eter in which to
9670: 20 6c 6f 6f 6b 75 70 0a 2b 20 20 20 20 20 20 20 lookup.+
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9690: 20 20 20 20 20 20 20 20 20 20 2a 20 76 61 72 69 * vari
96a0: 61 62 6c 65 73 2c 20 65 78 65 63 75 74 65 20 6e ables, execute n
96b0: 65 73 74 65 64 20 63 6f 6d 6d 61 6e 64 73 2c 0a ested commands,.
96c0: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
96e0: 20 20 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 65 * and report e
96f0: 72 72 6f 72 73 2e 20 2a 2f 0a 2b 20 20 20 20 54 rrors. */.+ T
9700: 63 6c 5f 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 cl_Token *tokenP
9710: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f tr; /* Po
9720: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 69 inter to first i
9730: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 6f n an array of to
9740: 6b 65 6e 73 0a 2b 20 20 20 20 20 20 20 20 20 20 kens.+
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9760: 20 20 20 20 20 20 20 2a 20 74 6f 20 65 76 61 6c * to eval
9770: 75 61 74 65 20 61 6e 64 20 63 6f 6e 63 61 74 65 uate and concate
9780: 6e 61 74 65 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e nate. */.+ in
9790: 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 t count;
97a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
97b0: 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 74 6f ber of tokens to
97c0: 20 63 6f 6e 73 69 64 65 72 20 61 74 20 74 6f 6b consider at tok
97d0: 65 6e 50 74 72 2e 0a 2b 20 20 20 20 20 20 20 20 enPtr..+
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
97f0: 20 20 20 20 20 20 20 20 20 2a 20 4d 75 73 74 20 * Must
9800: 62 65 20 61 74 20 6c 65 61 73 74 20 31 2e 20 2a be at least 1. *
9810: 2f 0a 2b 20 20 20 20 69 6e 74 20 2a 74 6f 6b 65 /.+ int *toke
9820: 6e 73 4c 65 66 74 50 74 72 3b 09 09 2f 2a 20 49 nsLeftPtr;../* I
9830: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 6f 69 6e f not NULL, poin
9840: 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 77 68 65 ts to memory whe
9850: 72 65 20 61 6e 0a 2b 09 09 09 09 20 2a 20 69 6e re an.+.... * in
9860: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 69 teger representi
9870: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ng the number of
9880: 20 74 6f 6b 65 6e 73 0a 2b 09 09 09 09 20 2a 20 tokens.+.... *
9890: 6c 65 66 74 20 74 6f 20 62 65 20 73 75 62 73 74 left to be subst
98a0: 69 74 75 74 65 64 20 77 69 6c 6c 20 62 65 20 77 ituted will be w
98b0: 72 69 74 74 65 6e 20 2a 2f 0a 2b 7b 0a 2b 20 20 ritten */.+{.+
98c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
98d0: 74 3b 0a 2b 20 20 20 20 69 6e 74 20 63 6f 64 65 t;.+ int code
98e0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 2b 0a 2b 20 20 = TCL_OK;.+.+
98f0: 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 45 61 63 /*.+ * Eac
9900: 68 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 h pass through t
9910: 68 69 73 20 6c 6f 6f 70 20 77 69 6c 6c 20 73 75 his loop will su
9920: 62 73 74 69 74 75 74 65 20 6f 6e 65 20 74 6f 6b bstitute one tok
9930: 65 6e 2c 20 61 6e 64 20 69 74 73 0a 2b 20 20 20 en, and its.+
9940: 20 20 2a 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 * components,
9950: 69 66 20 61 6e 79 2e 20 20 54 68 65 20 6f 6e 6c if any. The onl
9960: 79 20 74 68 69 6e 67 20 74 72 69 63 6b 79 20 68 y thing tricky h
9970: 65 72 65 20 69 73 20 74 68 61 74 20 77 65 20 67 ere is that we g
9980: 6f 20 74 6f 0a 2b 20 20 20 20 20 2a 20 73 6f 6d o to.+ * som
9990: 65 20 65 66 66 6f 72 74 20 74 6f 20 70 61 73 73 e effort to pass
99a0: 20 54 63 6c 5f 4f 62 6a 27 73 20 74 68 72 6f 75 Tcl_Obj's throu
99b0: 67 68 20 75 6e 74 6f 75 63 68 65 64 2c 20 74 6f gh untouched, to
99c0: 20 61 76 6f 69 64 20 73 74 72 69 6e 67 0a 2b 20 avoid string.+
99d0: 20 20 20 20 2a 20 63 6f 70 79 69 6e 67 20 61 6e * copying an
99e0: 64 20 54 63 6c 5f 4f 62 6a 20 63 72 65 61 74 69 d Tcl_Obj creati
99f0: 6f 6e 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 on if possible,
9a00: 74 6f 20 61 69 64 20 70 65 72 66 6f 72 6d 61 6e to aid performan
9a10: 63 65 20 61 6e 64 0a 2b 20 20 20 20 20 2a 20 6c ce and.+ * l
9a20: 69 6d 69 74 20 73 68 69 6d 6d 65 72 69 6e 67 2e imit shimmering.
9a30: 0a 2b 20 20 20 20 20 2a 0a 2b 20 20 20 20 20 2a .+ *.+ *
9a40: 20 46 75 72 74 68 65 72 20 6f 70 74 69 6d 69 7a Further optimiz
9a50: 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 ation opportunit
9a60: 69 65 73 20 6d 69 67 68 74 20 62 65 20 74 6f 20 ies might be to
9a70: 63 68 65 63 6b 20 66 6f 72 20 74 68 65 0a 2b 20 check for the.+
9a80: 20 20 20 20 2a 20 65 71 75 69 76 61 6c 65 6e 74 * equivalent
9a90: 20 6f 66 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 of Tcl_SetObjRe
9aa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
9ab0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
9ac0: 74 65 72 70 29 29 0a 2b 20 20 20 20 20 2a 20 61 terp)).+ * a
9ad0: 6e 64 20 6f 6d 69 74 20 74 68 65 6d 2e 0a 2b 20 nd omit them..+
9ae0: 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 72 65 */.+.+ re
9af0: 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 20 sult = NULL;.+
9b00: 20 20 66 6f 72 20 28 20 3b 20 28 63 6f 75 6e 74 for ( ; (count
9b10: 20 3e 20 30 29 20 26 26 20 28 63 6f 64 65 20 3d > 0) && (code =
9b20: 3d 20 54 43 4c 5f 4f 4b 29 3b 20 63 6f 75 6e 74 = TCL_OK); count
9b30: 2d 2d 2c 20 74 6f 6b 65 6e 50 74 72 2b 2b 29 20 --, tokenPtr++)
9b40: 7b 0a 2b 09 54 63 6c 5f 4f 62 6a 20 2a 61 70 70 {.+.Tcl_Obj *app
9b50: 65 6e 64 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 2b endObj = NULL;.+
9b60: 09 43 4f 4e 53 54 20 63 68 61 72 20 2a 61 70 70 .CONST char *app
9b70: 65 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 69 6e end = NULL;.+.in
9b80: 74 20 61 70 70 65 6e 64 42 79 74 65 4c 65 6e 67 t appendByteLeng
9b90: 74 68 20 3d 20 30 3b 0a 2b 0a 2b 09 73 77 69 74 th = 0;.+.+.swit
9ba0: 63 68 20 28 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 ch (tokenPtr->ty
9bb0: 70 65 29 20 7b 0a 2b 09 20 20 20 20 63 61 73 65 pe) {.+. case
9bc0: 20 54 43 4c 5f 54 4f 4b 45 4e 5f 54 45 58 54 3a TCL_TOKEN_TEXT:
9bd0: 0a 2b 09 09 61 70 70 65 6e 64 20 3d 20 74 6f 6b .+..append = tok
9be0: 65 6e 50 74 72 2d 3e 73 74 61 72 74 3b 0a 2b 09 enPtr->start;.+.
9bf0: 09 61 70 70 65 6e 64 42 79 74 65 4c 65 6e 67 74 .appendByteLengt
9c00: 68 20 3d 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 h = tokenPtr->si
9c10: 7a 65 3b 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b 0a ze;.+..break;.+.
9c20: 2b 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f 54 +. case TCL_T
9c30: 4f 4b 45 4e 5f 42 53 3a 20 7b 0a 2b 09 09 63 68 OKEN_BS: {.+..ch
9c40: 61 72 20 75 74 66 43 68 61 72 42 79 74 65 73 5b ar utfCharBytes[
9c50: 54 43 4c 5f 55 54 46 5f 4d 41 58 5d 3b 0a 2b 09 TCL_UTF_MAX];.+.
9c60: 09 61 70 70 65 6e 64 42 79 74 65 4c 65 6e 67 74 .appendByteLengt
9c70: 68 20 3d 20 54 63 6c 5f 55 74 66 42 61 63 6b 73 h = Tcl_UtfBacks
9c80: 6c 61 73 68 28 74 6f 6b 65 6e 50 74 72 2d 3e 73 lash(tokenPtr->s
9c90: 74 61 72 74 2c 0a 2b 09 09 09 28 69 6e 74 20 2a tart,.+...(int *
9ca0: 29 20 4e 55 4c 4c 2c 20 75 74 66 43 68 61 72 42 ) NULL, utfCharB
9cb0: 79 74 65 73 29 3b 0a 2b 09 09 61 70 70 65 6e 64 ytes);.+..append
9cc0: 20 3d 20 75 74 66 43 68 61 72 42 79 74 65 73 3b = utfCharBytes;
9cd0: 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b 09 20 20 20 .+..break;.+.
9ce0: 20 7d 0a 2b 0a 2b 09 20 20 20 20 63 61 73 65 20 }.+.+. case
9cf0: 54 43 4c 5f 54 4f 4b 45 4e 5f 43 4f 4d 4d 41 4e TCL_TOKEN_COMMAN
9d00: 44 3a 0a 2b 09 09 63 6f 64 65 20 3d 20 54 63 6c D:.+..code = Tcl
9d10: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 _EvalEx(interp,
9d20: 74 6f 6b 65 6e 50 74 72 2d 3e 73 74 61 72 74 2b tokenPtr->start+
9d30: 31 2c 20 74 6f 6b 65 6e 50 74 72 2d 3e 73 69 7a 1, tokenPtr->siz
9d40: 65 2d 32 2c 0a 2b 09 09 09 30 29 3b 0a 2b 09 09 e-2,.+...0);.+..
9d50: 61 70 70 65 6e 64 4f 62 6a 20 3d 20 54 63 6c 5f appendObj = Tcl_
9d60: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
9d70: 65 72 70 29 3b 0a 2b 09 09 62 72 65 61 6b 3b 0a erp);.+..break;.
9d80: 2b 0a 2b 09 20 20 20 20 63 61 73 65 20 54 43 4c +.+. case TCL
9d90: 5f 54 4f 4b 45 4e 5f 56 41 52 49 41 42 4c 45 3a _TOKEN_VARIABLE:
9da0: 20 7b 0a 2b 09 09 54 63 6c 5f 4f 62 6a 20 2a 61 {.+..Tcl_Obj *a
9db0: 72 72 61 79 49 6e 64 65 78 20 3d 20 4e 55 4c 4c rrayIndex = NULL
9dc0: 3b 0a 2b 09 09 54 63 6c 5f 4f 62 6a 20 2a 76 61 ;.+..Tcl_Obj *va
9dd0: 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 rName = NULL;.+.
9de0: 09 69 66 20 28 74 6f 6b 65 6e 50 74 72 2d 3e 6e .if (tokenPtr->n
9df0: 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 20 3e 20 31 umComponents > 1
9e00: 29 20 7b 0a 2b 09 09 20 20 20 20 2f 2a 20 53 75 ) {.+.. /* Su
9e10: 62 73 74 20 74 68 65 20 69 6e 64 65 78 20 70 61 bst the index pa
9e20: 72 74 20 6f 66 20 61 6e 20 61 72 72 61 79 20 76 rt of an array v
9e30: 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 ariable referenc
9e40: 65 20 2a 2f 0a 2b 09 09 20 20 20 20 63 6f 64 65 e */.+.. code
9e50: 20 3d 20 54 63 6c 53 75 62 73 74 54 6f 6b 65 6e = TclSubstToken
9e60: 73 28 69 6e 74 65 72 70 2c 20 74 6f 6b 65 6e 50 s(interp, tokenP
9e70: 74 72 2b 32 2c 0a 2b 09 09 09 20 20 20 20 74 6f tr+2,.+... to
9e80: 6b 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f kenPtr->numCompo
9e90: 6e 65 6e 74 73 20 2d 20 31 2c 20 4e 55 4c 4c 29 nents - 1, NULL)
9ea0: 3b 0a 2b 09 09 20 20 20 20 61 72 72 61 79 49 6e ;.+.. arrayIn
9eb0: 64 65 78 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a dex = Tcl_GetObj
9ec0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
9ed0: 2b 09 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 +.. Tcl_IncrR
9ee0: 65 66 43 6f 75 6e 74 28 61 72 72 61 79 49 6e 64 efCount(arrayInd
9ef0: 65 78 29 3b 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 69 ex);.+..}.+.+..i
9f00: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f f (code == TCL_O
9f10: 4b 29 20 7b 0a 2b 09 09 20 20 20 20 76 61 72 4e K) {.+.. varN
9f20: 61 6d 65 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 ame = Tcl_NewStr
9f30: 69 6e 67 4f 62 6a 28 74 6f 6b 65 6e 50 74 72 5b ingObj(tokenPtr[
9f40: 31 5d 2e 73 74 61 72 74 2c 0a 2b 09 09 09 20 20 1].start,.+...
9f50: 20 20 74 6f 6b 65 6e 50 74 72 5b 31 5d 2e 73 69 tokenPtr[1].si
9f60: 7a 65 29 3b 0a 2b 09 09 20 20 20 20 61 70 70 65 ze);.+.. appe
9f70: 6e 64 4f 62 6a 20 3d 20 54 63 6c 5f 4f 62 6a 47 ndObj = Tcl_ObjG
9f80: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 76 etVar2(interp, v
9f90: 61 72 4e 61 6d 65 2c 20 61 72 72 61 79 49 6e 64 arName, arrayInd
9fa0: 65 78 2c 0a 2b 09 09 09 20 20 20 20 54 43 4c 5f ex,.+... TCL_
9fb0: 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a LEAVE_ERR_MSG);.
9fc0: 2b 09 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 +.. Tcl_DecrR
9fd0: 65 66 43 6f 75 6e 74 28 76 61 72 4e 61 6d 65 29 efCount(varName)
9fe0: 3b 0a 2b 09 09 20 20 20 20 69 66 20 28 61 70 70 ;.+.. if (app
9ff0: 65 6e 64 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 endObj == NULL)
a000: 7b 0a 2b 09 09 09 63 6f 64 65 20 3d 20 54 43 4c {.+...code = TCL
a010: 5f 45 52 52 4f 52 3b 0a 2b 09 09 20 20 20 20 7d _ERROR;.+.. }
a020: 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 73 77 69 74 63 .+..}.+.+..switc
a030: 68 20 28 63 6f 64 65 29 20 7b 0a 2b 09 09 20 20 h (code) {.+..
a040: 20 20 63 61 73 65 20 54 43 4c 5f 4f 4b 3a 09 2f case TCL_OK:./
a050: 2a 20 47 6f 74 20 76 61 6c 75 65 20 2a 2f 0a 2b * Got value */.+
a060: 09 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f 45 .. case TCL_E
a070: 52 52 4f 52 3a 09 2f 2a 20 41 6c 72 65 61 64 79 RROR:./* Already
a080: 20 68 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 have error mess
a090: 61 67 65 20 2a 2f 0a 2b 09 09 20 20 20 20 63 61 age */.+.. ca
a0a0: 73 65 20 54 43 4c 5f 42 52 45 41 4b 3a 09 2f 2a se TCL_BREAK:./*
a0b0: 20 57 69 6c 6c 20 6e 6f 74 20 73 75 62 73 74 69 Will not substi
a0c0: 74 75 74 65 20 61 6e 79 77 61 79 20 2a 2f 0a 2b tute anyway */.+
a0d0: 09 09 20 20 20 20 63 61 73 65 20 54 43 4c 5f 43 .. case TCL_C
a0e0: 4f 4e 54 49 4e 55 45 3a 09 2f 2a 20 57 69 6c 6c ONTINUE:./* Will
a0f0: 20 6e 6f 74 20 73 75 62 73 74 69 74 75 74 65 20 not substitute
a100: 61 6e 79 77 61 79 20 2a 2f 0a 2b 09 09 09 62 72 anyway */.+...br
a110: 65 61 6b 3b 0a 2b 09 09 20 20 20 20 64 65 66 61 eak;.+.. defa
a120: 75 6c 74 3a 0a 2b 09 09 09 2f 2a 20 41 6c 6c 20 ult:.+.../* All
a130: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 63 6f 64 other return cod
a140: 65 73 2c 20 77 65 20 77 69 6c 6c 20 73 75 62 73 es, we will subs
a150: 74 20 74 68 65 0a 2b 09 09 09 20 2a 20 72 65 73 t the.+... * res
a160: 75 6c 74 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 ult from the cod
a170: 65 2d 74 68 72 6f 77 69 6e 67 20 65 76 61 6c 75 e-throwing evalu
a180: 61 74 69 6f 6e 20 2a 2f 0a 2b 09 09 09 61 70 70 ation */.+...app
a190: 65 6e 64 4f 62 6a 20 3d 20 54 63 6c 5f 47 65 74 endObj = Tcl_Get
a1a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
a1b0: 29 3b 0a 2b 09 09 7d 0a 2b 0a 2b 09 09 69 66 20 );.+..}.+.+..if
a1c0: 28 61 72 72 61 79 49 6e 64 65 78 20 21 3d 20 4e (arrayIndex != N
a1d0: 55 4c 4c 29 20 7b 0a 2b 09 09 20 20 20 20 54 63 ULL) {.+.. Tc
a1e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 l_DecrRefCount(a
a1f0: 72 72 61 79 49 6e 64 65 78 29 3b 0a 2b 09 09 7d rrayIndex);.+..}
a200: 0a 2b 09 09 63 6f 75 6e 74 20 2d 3d 20 74 6f 6b .+..count -= tok
a210: 65 6e 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 6f 6e enPtr->numCompon
a220: 65 6e 74 73 3b 0a 2b 09 09 74 6f 6b 65 6e 50 74 ents;.+..tokenPt
a230: 72 20 2b 3d 20 74 6f 6b 65 6e 50 74 72 2d 3e 6e r += tokenPtr->n
a240: 75 6d 43 6f 6d 70 6f 6e 65 6e 74 73 3b 0a 2b 09 umComponents;.+.
a250: 09 62 72 65 61 6b 3b 0a 2b 09 20 20 20 20 7d 0a .break;.+. }.
a260: 2b 0a 2b 09 20 20 20 20 64 65 66 61 75 6c 74 3a +.+. default:
a270: 0a 2b 09 09 54 63 6c 5f 50 61 6e 69 63 28 22 75 .+..Tcl_Panic("u
a280: 6e 65 78 70 65 63 74 65 64 20 74 6f 6b 65 6e 20 nexpected token
a290: 74 79 70 65 20 69 6e 20 54 63 6c 53 75 62 73 74 type in TclSubst
a2a0: 54 6f 6b 65 6e 73 3a 20 25 64 22 2c 0a 2b 09 09 Tokens: %d",.+..
a2b0: 09 74 6f 6b 65 6e 50 74 72 2d 3e 74 79 70 65 29 .tokenPtr->type)
a2c0: 3b 0a 2b 09 7d 0a 2b 0a 2b 09 69 66 20 28 28 63 ;.+.}.+.+.if ((c
a2d0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 42 52 45 41 4b ode == TCL_BREAK
a2e0: 29 20 7c 7c 20 28 63 6f 64 65 20 3d 3d 20 54 43 ) || (code == TC
a2f0: 4c 5f 43 4f 4e 54 49 4e 55 45 29 29 20 7b 0a 2b L_CONTINUE)) {.+
a300: 09 20 20 20 20 2f 2a 20 49 6e 68 69 62 69 74 20 . /* Inhibit
a310: 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a substitution */.
a320: 2b 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a +. continue;.
a330: 2b 09 7d 0a 2b 0a 2b 09 69 66 20 28 72 65 73 75 +.}.+.+.if (resu
a340: 6c 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 lt == NULL) {.+.
a350: 20 20 20 20 2f 2a 20 0a 2b 09 20 20 20 20 20 2a /* .+. *
a360: 20 46 69 72 73 74 20 70 61 73 73 20 74 68 72 6f First pass thro
a370: 75 67 68 2e 20 20 49 66 20 77 65 20 68 61 76 65 ugh. If we have
a380: 20 61 20 54 63 6c 5f 4f 62 6a 2c 20 6a 75 73 74 a Tcl_Obj, just
a390: 20 75 73 65 20 69 74 2e 0a 2b 09 20 20 20 20 20 use it..+.
a3a0: 2a 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 * If not, create
a3b0: 20 6f 6e 65 20 66 72 6f 6d 20 6f 75 72 20 73 74 one from our st
a3c0: 72 69 6e 67 2e 20 0a 2b 09 20 20 20 20 20 2a 2f ring. .+. */
a3d0: 0a 2b 0a 2b 09 20 20 20 20 69 66 20 28 61 70 70 .+.+. if (app
a3e0: 65 6e 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 endObj != NULL)
a3f0: 7b 0a 2b 09 09 72 65 73 75 6c 74 20 3d 20 61 70 {.+..result = ap
a400: 70 65 6e 64 4f 62 6a 3b 0a 2b 09 20 20 20 20 7d pendObj;.+. }
a410: 20 65 6c 73 65 20 7b 0a 2b 09 09 72 65 73 75 6c else {.+..resul
a420: 74 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e t = Tcl_NewStrin
a430: 67 4f 62 6a 28 61 70 70 65 6e 64 2c 20 61 70 70 gObj(append, app
a440: 65 6e 64 42 79 74 65 4c 65 6e 67 74 68 29 3b 3b endByteLength);;
a450: 0a 2b 09 20 20 20 20 7d 0a 2b 09 20 20 20 20 54 .+. }.+. T
a460: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a470: 72 65 73 75 6c 74 29 3b 0a 2b 09 7d 20 65 6c 73 result);.+.} els
a480: 65 20 7b 0a 2b 09 20 20 20 20 2f 2a 20 53 75 62 e {.+. /* Sub
a490: 73 65 71 75 65 6e 74 20 70 61 73 73 65 73 2e 20 sequent passes.
a4a0: 20 41 70 70 65 6e 64 20 74 6f 20 72 65 73 75 6c Append to resul
a4b0: 74 2e 20 2a 2f 0a 2b 09 20 20 20 20 69 66 20 28 t. */.+. if (
a4c0: 54 63 6c 5f 49 73 53 68 61 72 65 64 28 72 65 73 Tcl_IsShared(res
a4d0: 75 6c 74 29 29 20 7b 0a 2b 09 09 54 63 6c 5f 44 ult)) {.+..Tcl_D
a4e0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ecrRefCount(resu
a4f0: 6c 74 29 3b 0a 2b 09 09 72 65 73 75 6c 74 20 3d lt);.+..result =
a500: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
a510: 6a 28 72 65 73 75 6c 74 29 3b 0a 2b 09 09 54 63 j(result);.+..Tc
a520: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 l_IncrRefCount(r
a530: 65 73 75 6c 74 29 3b 0a 2b 09 20 20 20 20 7d 0a esult);.+. }.
a540: 2b 09 20 20 20 20 69 66 20 28 61 70 70 65 6e 64 +. if (append
a550: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b Obj != NULL) {.+
a560: 09 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 ..Tcl_AppendObjT
a570: 6f 4f 62 6a 28 72 65 73 75 6c 74 2c 20 61 70 70 oObj(result, app
a580: 65 6e 64 4f 62 6a 29 3b 0a 2b 09 20 20 20 20 7d endObj);.+. }
a590: 20 65 6c 73 65 20 7b 0a 2b 09 09 54 63 6c 5f 41 else {.+..Tcl_A
a5a0: 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 6c ppendToObj(resul
a5b0: 74 2c 20 61 70 70 65 6e 64 2c 20 61 70 70 65 6e t, append, appen
a5c0: 64 42 79 74 65 4c 65 6e 67 74 68 29 3b 0a 2b 09 dByteLength);.+.
a5d0: 20 20 20 20 7d 0a 2b 09 7d 0a 2b 20 20 20 20 7d }.+.}.+ }
a5e0: 0a 2b 0a 2b 20 20 20 20 69 66 20 28 63 6f 64 65 .+.+ if (code
a5f0: 20 21 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b != TCL_ERROR) {
a600: 09 2f 2a 20 4b 65 65 70 20 65 72 72 6f 72 20 6d ./* Keep error m
a610: 65 73 73 61 67 65 20 69 6e 20 72 65 73 75 6c 74 essage in result
a620: 21 20 2a 2f 0a 2b 09 69 66 20 28 72 65 73 75 6c ! */.+.if (resul
a630: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 t != NULL) {.+.
a640: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
a650: 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ult(interp, resu
a660: 6c 74 29 3b 0a 2b 09 7d 20 65 6c 73 65 20 7b 0a lt);.+.} else {.
a670: 2b 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 +. Tcl_ResetR
a680: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 2b esult(interp);.+
a690: 09 7d 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 69 .}.+ }.+ i
a6a0: 66 20 28 74 6f 6b 65 6e 73 4c 65 66 74 50 74 72 f (tokensLeftPtr
a6b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 2a 74 != NULL) {.+.*t
a6c0: 6f 6b 65 6e 73 4c 65 66 74 50 74 72 20 3d 20 63 okensLeftPtr = c
a6d0: 6f 75 6e 74 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 ount;.+ }.+
a6e0: 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 if (result !=
a6f0: 4e 55 4c 4c 29 20 7b 0a 2b 09 54 63 6c 5f 44 65 NULL) {.+.Tcl_De
a700: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c crRefCount(resul
a710: 74 29 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 t);.+ }.+
a720: 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 2b 7d 0a return code;.+}.
a730: 2b 0c 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d +.. /*. *------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 0a 20 20 2a 0a 49 6e 64 65 78 3a 20 74 65 73 74 . *.Index: test
a790: 73 2f 73 75 62 73 74 2e 74 65 73 74 0a 3d 3d 3d s/subst.test.===
a7a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7e0: 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 .RCS file: /cvsr
a7f0: 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 74 65 73 74 oot/tcl/tcl/test
a800: 73 2f 73 75 62 73 74 2e 74 65 73 74 2c 76 0a 72 s/subst.test,v.r
a810: 65 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 etrieving revisi
a820: 6f 6e 20 31 2e 31 33 0a 64 69 66 66 20 2d 75 20 on 1.13.diff -u
a830: 2d 72 31 2e 31 33 20 73 75 62 73 74 2e 74 65 73 -r1.13 subst.tes
a840: 74 0a 2d 2d 2d 20 74 65 73 74 73 2f 73 75 62 73 t.--- tests/subs
a850: 74 2e 74 65 73 74 09 31 36 20 46 65 62 20 32 30 t.test.16 Feb 20
a860: 30 33 20 30 31 3a 33 36 3a 33 32 20 2d 30 30 30 03 01:36:32 -000
a870: 30 09 31 2e 31 33 0a 2b 2b 2b 20 74 65 73 74 73 0.1.13.+++ tests
a880: 2f 73 75 62 73 74 2e 74 65 73 74 09 31 33 20 4d /subst.test.13 M
a890: 61 72 20 32 30 30 33 20 30 32 3a 32 37 3a 30 30 ar 2003 02:27:00
a8a0: 20 2d 30 30 30 30 0a 40 40 20 2d 31 34 2c 37 20 -0000.@@ -14,7
a8b0: 2b 31 34 2c 37 20 40 40 0a 20 23 20 52 43 53 3a +14,7 @@. # RCS:
a8c0: 20 40 28 23 29 20 24 49 64 3a 20 73 75 62 73 74 @(#) $Id: subst
a8d0: 2e 74 65 73 74 2c 76 20 31 2e 31 33 20 32 30 30 .test,v 1.13 200
a8e0: 33 2f 30 32 2f 31 36 20 30 31 3a 33 36 3a 33 32 3/02/16 01:36:32
a8f0: 20 6d 73 6f 66 65 72 20 45 78 70 20 24 0a 20 0a msofer Exp $. .
a900: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 5b 6e if {[lsearch [n
a910: 61 6d 65 73 70 61 63 65 20 63 68 69 6c 64 72 65 amespace childre
a920: 6e 5d 20 3a 3a 74 63 6c 74 65 73 74 5d 20 3d 3d n] ::tcltest] ==
a930: 20 2d 31 7d 20 7b 0a 2d 20 20 20 20 70 61 63 6b -1} {.- pack
a940: 61 67 65 20 72 65 71 75 69 72 65 20 74 63 6c 74 age require tclt
a950: 65 73 74 0a 2b 20 20 20 20 70 61 63 6b 61 67 65 est.+ package
a960: 20 72 65 71 75 69 72 65 20 74 63 6c 74 65 73 74 require tcltest
a970: 20 32 2e 31 0a 20 20 20 20 20 6e 61 6d 65 73 70 2.1. namesp
a980: 61 63 65 20 69 6d 70 6f 72 74 20 2d 66 6f 72 63 ace import -forc
a990: 65 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 2a 0a 20 e ::tcltest::*.
a9a0: 7d 0a 20 0a 40 40 20 2d 33 34 2c 36 20 2b 33 34 }. .@@ -34,6 +34
a9b0: 2c 31 30 20 40 40 0a 20 74 65 73 74 20 73 75 62 ,10 @@. test sub
a9c0: 73 74 2d 32 2e 33 20 7b 73 69 6d 70 6c 65 20 73 st-2.3 {simple s
a9d0: 74 72 69 6e 67 73 7d 20 7b 0a 20 20 20 20 20 73 trings} {. s
a9e0: 75 62 73 74 20 61 62 63 64 65 66 67 0a 20 7d 20 ubst abcdefg. }
a9f0: 61 62 63 64 65 66 67 0a 2b 74 65 73 74 20 73 75 abcdefg.+test su
aa00: 62 73 74 2d 32 2e 34 20 7b 73 69 6d 70 6c 65 20 bst-2.4 {simple
aa10: 73 74 72 69 6e 67 73 7d 20 7b 0a 2b 20 20 20 20 strings} {.+
aa20: 23 20 54 63 6c 20 42 75 67 20 36 38 35 31 30 36 # Tcl Bug 685106
aa30: 0a 2b 20 20 20 20 73 75 62 73 74 20 5b 62 79 74 .+ subst [byt
aa40: 65 73 74 72 69 6e 67 20 62 61 72 5c 78 30 30 73 estring bar\x00s
aa50: 6f 6f 6d 5d 0a 2b 7d 20 5b 62 79 74 65 73 74 72 oom].+} [bytestr
aa60: 69 6e 67 20 62 61 72 5c 78 30 30 73 6f 6f 6d 5d ing bar\x00soom]
aa70: 0a 20 0a 20 74 65 73 74 20 73 75 62 73 74 2d 33 . . test subst-3
aa80: 2e 31 20 7b 62 61 63 6b 73 6c 61 73 68 20 73 75 .1 {backslash su
aa90: 62 73 74 69 74 75 74 69 6f 6e 73 7d 20 7b 0a 20 bstitutions} {.
aaa0: 20 20 20 20 73 75 62 73 74 20 7b 5c 78 5c 24 78 subst {\x\$x
aab0: 5c 5b 66 6f 6f 20 62 61 72 5d 5c 5c 7d 0a 40 40 \[foo bar]\\}.@@
aac0: 20 2d 31 35 38 2c 31 32 20 2b 31 36 32 2c 31 32 -158,12 +162,12
aad0: 20 40 40 0a 20 74 65 73 74 20 73 75 62 73 74 2d @@. test subst-
aae0: 38 2e 36 20 7b 72 65 74 75 72 6e 20 69 6e 20 61 8.6 {return in a
aaf0: 20 73 75 62 73 74 7d 20 7b 0a 20 20 20 20 20 6c subst} {. l
ab00: 69 73 74 20 5b 63 61 74 63 68 20 7b 73 75 62 73 ist [catch {subs
ab10: 74 20 7b 66 6f 6f 20 5b 72 65 74 75 72 6e 20 7b t {foo [return {
ab20: 78 7d 3b 20 62 6f 67 75 73 20 63 6f 64 65 20 62 x}; bogus code b
ab30: 61 72 7d 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 ar}} msg] $msg.
ab40: 7d 20 7b 31 20 7b 6d 69 73 73 69 6e 67 20 63 6c } {1 {missing cl
ab50: 6f 73 65 2d 62 72 61 63 6b 65 74 7d 7d 0a 2d 74 ose-bracket}}.-t
ab60: 65 73 74 20 73 75 62 73 74 2d 38 2e 37 20 7b 72 est subst-8.7 {r
ab70: 65 74 75 72 6e 20 69 6e 20 61 20 73 75 62 73 74 eturn in a subst
ab80: 2c 20 70 61 72 73 65 20 65 72 72 6f 72 7d 20 7b , parse error} {
ab90: 0a 2b 74 65 73 74 20 73 75 62 73 74 2d 38 2e 37 .+test subst-8.7
aba0: 20 7b 72 65 74 75 72 6e 20 69 6e 20 61 20 73 75 {return in a su
abb0: 62 73 74 2c 20 70 61 72 73 65 20 65 72 72 6f 72 bst, parse error
abc0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 20 73 } -body {. s
abd0: 75 62 73 74 20 7b 66 6f 6f 20 5b 72 65 74 75 72 ubst {foo [retur
abe0: 6e 20 7b 78 7d 20 3b 20 73 65 74 20 61 20 7b 7d n {x} ; set a {}
abf0: 22 20 3b 20 73 74 75 66 66 5d 20 62 61 72 7d 0a " ; stuff] bar}.
ac00: 2d 7d 20 7b 66 6f 6f 20 78 73 65 74 20 61 20 7b -} {foo xset a {
ac10: 7d 22 20 3b 20 73 74 75 66 66 5d 20 62 61 72 7d }" ; stuff] bar}
ac20: 0a 2d 74 65 73 74 20 73 75 62 73 74 2d 38 2e 38 .-test subst-8.8
ac30: 20 7b 72 65 74 75 72 6e 20 69 6e 20 61 20 73 75 {return in a su
ac40: 62 73 74 2c 20 70 61 72 73 65 20 65 72 72 6f 72 bst, parse error
ac50: 7d 20 7b 0a 2b 7d 20 2d 72 65 74 75 72 6e 43 6f } {.+} -returnCo
ac60: 64 65 73 20 65 72 72 6f 72 20 2d 72 65 73 75 6c des error -resul
ac70: 74 20 7b 65 78 74 72 61 20 63 68 61 72 61 63 74 t {extra charact
ac80: 65 72 73 20 61 66 74 65 72 20 63 6c 6f 73 65 2d ers after close-
ac90: 62 72 61 63 65 7d 0a 2b 74 65 73 74 20 73 75 62 brace}.+test sub
aca0: 73 74 2d 38 2e 38 20 7b 72 65 74 75 72 6e 20 69 st-8.8 {return i
acb0: 6e 20 61 20 73 75 62 73 74 2c 20 70 61 72 73 65 n a subst, parse
acc0: 20 65 72 72 6f 72 7d 20 2d 62 6f 64 79 20 7b 0a error} -body {.
acd0: 20 20 20 20 20 73 75 62 73 74 20 7b 66 6f 6f 20 subst {foo
ace0: 5b 72 65 74 75 72 6e 20 7b 78 7d 20 3b 20 73 65 [return {x} ; se
acf0: 74 20 62 61 72 20 62 61 7a 20 3b 20 73 65 74 20 t bar baz ; set
ad00: 61 20 7b 7d 22 20 3b 20 73 74 75 66 66 5d 20 62 a {}" ; stuff] b
ad10: 61 72 7d 0a 2d 7d 20 7b 66 6f 6f 20 78 73 65 74 ar}.-} {foo xset
ad20: 20 62 61 72 20 62 61 7a 20 3b 20 73 65 74 20 61 bar baz ; set a
ad30: 20 7b 7d 22 20 3b 20 73 74 75 66 66 5d 20 62 61 {}" ; stuff] ba
ad40: 72 7d 0a 2b 7d 20 2d 72 65 74 75 72 6e 43 6f 64 r}.+} -returnCod
ad50: 65 73 20 65 72 72 6f 72 20 2d 72 65 73 75 6c 74 es error -result
ad60: 20 7b 65 78 74 72 61 20 63 68 61 72 61 63 74 65 {extra characte
ad70: 72 73 20 61 66 74 65 72 20 63 6c 6f 73 65 2d 62 rs after close-b
ad80: 72 61 63 65 7d 0a 20 74 65 73 74 20 73 75 62 73 race}. test subs
ad90: 74 2d 38 2e 39 20 7b 72 65 74 75 72 6e 20 69 6e t-8.9 {return in
ada0: 20 61 20 76 61 72 69 61 62 6c 65 20 73 75 62 73 a variable subs
adb0: 74 7d 20 7b 0a 20 20 20 20 20 73 75 62 73 74 20 t} {. subst
adc0: 7b 66 6f 6f 20 24 76 61 72 28 5b 72 65 74 75 72 {foo $var([retur
add0: 6e 20 7b 78 7d 5d 29 20 62 61 72 7d 0a 20 7d 20 n {x}]) bar}. }
ade0: 7b 66 6f 6f 20 78 20 62 61 72 7d 0a 40 40 20 2d {foo x bar}.@@ -
adf0: 32 30 36 2c 31 32 20 2b 32 31 30 2c 31 32 20 40 206,12 +210,12 @
ae00: 40 0a 20 74 65 73 74 20 73 75 62 73 74 2d 31 31 @. test subst-11
ae10: 2e 33 20 7b 63 6f 6e 74 69 6e 75 65 20 69 6e 20 .3 {continue in
ae20: 61 20 73 75 62 73 74 7d 20 7b 0a 20 20 20 20 20 a subst} {.
ae30: 73 75 62 73 74 20 7b 66 6f 6f 20 5b 69 66 20 31 subst {foo [if 1
ae40: 20 7b 20 63 6f 6e 74 69 6e 75 65 3b 20 62 6f 67 { continue; bog
ae50: 75 73 20 63 6f 64 65 7d 5d 20 62 61 72 7d 0a 20 us code}] bar}.
ae60: 7d 20 7b 66 6f 6f 20 20 62 61 72 7d 0a 2d 74 65 } {foo bar}.-te
ae70: 73 74 20 73 75 62 73 74 2d 31 31 2e 34 20 7b 63 st subst-11.4 {c
ae80: 6f 6e 74 69 6e 75 65 20 69 6e 20 61 20 73 75 62 ontinue in a sub
ae90: 73 74 2c 20 70 61 72 73 65 20 65 72 72 6f 72 7d st, parse error}
aea0: 20 7b 0a 2b 74 65 73 74 20 73 75 62 73 74 2d 31 {.+test subst-1
aeb0: 31 2e 34 20 7b 63 6f 6e 74 69 6e 75 65 20 69 6e 1.4 {continue in
aec0: 20 61 20 73 75 62 73 74 2c 20 70 61 72 73 65 20 a subst, parse
aed0: 65 72 72 6f 72 7d 20 2d 62 6f 64 79 20 7b 0a 20 error} -body {.
aee0: 20 20 20 20 73 75 62 73 74 20 7b 66 6f 6f 20 5b subst {foo [
aef0: 63 6f 6e 74 69 6e 75 65 20 3b 20 73 65 74 20 61 continue ; set a
af00: 20 7b 7d 7b 7d 20 3b 20 73 74 75 66 66 5d 20 62 {}{} ; stuff] b
af10: 61 72 7d 0a 2d 7d 20 7b 66 6f 6f 20 73 65 74 20 ar}.-} {foo set
af20: 61 20 7b 7d 7b 7d 20 3b 20 73 74 75 66 66 5d 20 a {}{} ; stuff]
af30: 62 61 72 7d 0a 2d 74 65 73 74 20 73 75 62 73 74 bar}.-test subst
af40: 2d 31 31 2e 35 20 7b 63 6f 6e 74 69 6e 75 65 20 -11.5 {continue
af50: 69 6e 20 61 20 73 75 62 73 74 2c 20 70 61 72 73 in a subst, pars
af60: 65 20 65 72 72 6f 72 7d 20 7b 0a 2b 7d 20 2d 72 e error} {.+} -r
af70: 65 74 75 72 6e 43 6f 64 65 73 20 65 72 72 6f 72 eturnCodes error
af80: 20 2d 72 65 73 75 6c 74 20 7b 65 78 74 72 61 20 -result {extra
af90: 63 68 61 72 61 63 74 65 72 73 20 61 66 74 65 72 characters after
afa0: 20 63 6c 6f 73 65 2d 62 72 61 63 65 7d 0a 2b 74 close-brace}.+t
afb0: 65 73 74 20 73 75 62 73 74 2d 31 31 2e 35 20 7b est subst-11.5 {
afc0: 63 6f 6e 74 69 6e 75 65 20 69 6e 20 61 20 73 75 continue in a su
afd0: 62 73 74 2c 20 70 61 72 73 65 20 65 72 72 6f 72 bst, parse error
afe0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 20 73 } -body {. s
aff0: 75 62 73 74 20 7b 66 6f 6f 20 5b 63 6f 6e 74 69 ubst {foo [conti
b000: 6e 75 65 20 3b 73 65 74 20 62 61 72 20 62 61 7a nue ;set bar baz
b010: 20 3b 73 65 74 20 61 20 7b 7d 7b 7d 20 3b 20 73 ;set a {}{} ; s
b020: 74 75 66 66 5d 20 62 61 72 7d 0a 2d 7d 20 7b 66 tuff] bar}.-} {f
b030: 6f 6f 20 73 65 74 20 62 61 72 20 62 61 7a 20 3b oo set bar baz ;
b040: 73 65 74 20 61 20 7b 7d 7b 7d 20 3b 20 73 74 75 set a {}{} ; stu
b050: 66 66 5d 20 62 61 72 7d 0a 2b 7d 20 2d 72 65 74 ff] bar}.+} -ret
b060: 75 72 6e 43 6f 64 65 73 20 65 72 72 6f 72 20 2d urnCodes error -
b070: 72 65 73 75 6c 74 20 7b 65 78 74 72 61 20 63 68 result {extra ch
b080: 61 72 61 63 74 65 72 73 20 61 66 74 65 72 20 63 aracters after c
b090: 6c 6f 73 65 2d 62 72 61 63 65 7d 0a 20 74 65 73 lose-brace}. tes
b0a0: 74 20 73 75 62 73 74 2d 31 31 2e 36 20 7b 63 6f t subst-11.6 {co
b0b0: 6e 74 69 6e 75 65 20 69 6e 20 61 20 76 61 72 69 ntinue in a vari
b0c0: 61 62 6c 65 20 73 75 62 73 74 7d 20 7b 0a 20 20 able subst} {.
b0d0: 20 20 20 73 75 62 73 74 20 7b 66 6f 6f 20 24 76 subst {foo $v
b0e0: 61 72 28 5b 63 6f 6e 74 69 6e 75 65 5d 29 20 62 ar([continue]) b
b0f0: 61 72 7d 0a 20 7d 20 7b 66 6f 6f 20 20 62 61 72 ar}. } {foo bar
b100: 7d 0a }.