Tcl Source Code

Hex Artifact Content
Login

Artifact 6a342e17a7fb9a0a69e6cd615f055becd9606c90:

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