Tcl Library Source Code

Hex Artifact Content
Login

Artifact 8ee8b91980a99012de00587b144c5eea94f5140d:


0000: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 0a 23 20 54 49 54 4c 45 3a 0a  ------.# TITLE:.
0050: 23 09 65 78 70 61 6e 64 65 72 2e 74 63 6c 0a 23  #.expander.tcl.#
0060: 0a 23 20 41 55 54 48 4f 52 3a 0a 23 09 57 69 6c  .# AUTHOR:.#.Wil
0070: 6c 20 44 75 71 75 65 74 74 65 0a 23 0a 23 20 44  l Duquette.#.# D
0080: 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 0a 23 20  ESCRIPTION:.#.# 
0090: 41 6e 20 65 78 70 61 6e 64 65 72 20 69 73 20 61  An expander is a
00a0: 6e 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 61  n object that ta
00b0: 6b 65 73 20 61 73 20 69 6e 70 75 74 20 74 65 78  kes as input tex
00c0: 74 20 77 69 74 68 20 65 6d 62 65 64 64 65 64 0a  t with embedded.
00d0: 23 20 54 63 6c 20 63 6f 64 65 20 61 6e 64 20 72  # Tcl code and r
00e0: 65 74 75 72 6e 73 20 74 65 78 74 20 77 69 74 68  eturns text with
00f0: 20 74 68 65 20 65 6d 62 65 64 64 65 64 20 63 6f   the embedded co
0100: 64 65 20 65 78 70 61 6e 64 65 64 2e 20 20 54 68  de expanded.  Th
0110: 65 0a 23 20 74 65 78 74 20 63 61 6e 20 62 65 20  e.# text can be 
0120: 70 72 6f 76 69 64 65 64 20 61 6c 6c 20 61 74 20  provided all at 
0130: 6f 6e 63 65 20 6f 72 20 69 6e 63 72 65 6d 65 6e  once or incremen
0140: 74 61 6c 6c 79 2e 0a 23 0a 23 20 53 65 65 20 20  tally..#.# See  
0150: 65 78 70 61 6e 64 65 72 2e 5b 65 5d 68 74 6d 6c  expander.[e]html
0160: 20 66 6f 72 20 75 73 61 67 65 20 69 6e 66 6f 2e   for usage info.
0170: 0a 23 20 41 6c 73 6f 20 65 78 70 61 6e 64 65 72  .# Also expander
0180: 2e 6e 0a 23 0a 23 20 4c 49 43 45 4e 53 45 3a 0a  .n.#.# LICENSE:.
0190: 23 20 20 20 20 20 20 20 43 6f 70 79 72 69 67 68  #       Copyrigh
01a0: 74 20 28 43 29 20 32 30 30 31 20 62 79 20 57 69  t (C) 2001 by Wi
01b0: 6c 6c 69 61 6d 20 48 2e 20 44 75 71 75 65 74 74  lliam H. Duquett
01c0: 65 2e 20 20 53 65 65 20 65 78 70 61 6e 64 65 72  e.  See expander
01d0: 5f 6c 69 63 65 6e 73 65 2e 74 78 74 2c 0a 23 20  _license.txt,.# 
01e0: 20 20 20 20 20 20 64 69 73 74 72 69 62 75 74 65        distribute
01f0: 64 20 77 69 74 68 20 74 68 69 73 20 66 69 6c 65  d with this file
0200: 2c 20 66 6f 72 20 6c 69 63 65 6e 73 65 20 69 6e  , for license in
0210: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 23 0a 23 20 43  formation..#.# C
0220: 48 41 4e 47 45 20 4c 4f 47 3a 0a 23 0a 23 20 20  HANGE LOG:.#.#  
0230: 20 20 20 20 20 31 30 2f 33 31 2f 30 31 3a 20 56       10/31/01: V
0240: 30 2e 39 20 63 6f 64 65 20 69 73 20 63 6f 6d 70  0.9 code is comp
0250: 6c 65 74 65 2e 0a 23 20 20 20 20 20 20 20 31 31  lete..#       11
0260: 2f 32 33 2f 30 31 3a 20 41 64 64 65 64 20 22 65  /23/01: Added "e
0270: 76 61 6c 63 6d 64 22 3b 20 56 31 2e 30 20 63 6f  valcmd"; V1.0 co
0280: 64 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  de is complete..
0290: 0a 23 20 50 72 6f 76 69 64 65 20 74 68 65 20 70  .# Provide the p
02a0: 61 63 6b 61 67 65 2e 0a 0a 23 20 43 72 65 61 74  ackage...# Creat
02b0: 65 20 74 68 65 20 70 61 63 6b 61 67 65 27 73 20  e the package's 
02c0: 6e 61 6d 65 73 70 61 63 65 2e 0a 0a 6e 61 6d 65  namespace...name
02d0: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 74 65 78  space eval ::tex
02e0: 74 75 74 69 6c 20 7b 0a 20 20 20 20 6e 61 6d 65  tutil {.    name
02f0: 73 70 61 63 65 20 65 76 61 6c 20 65 78 70 61 6e  space eval expan
0300: 64 65 72 20 7b 0a 09 23 20 41 6c 6c 20 69 6e 64  der {..# All ind
0310: 69 63 65 73 20 61 72 65 20 70 72 65 66 69 78 65  ices are prefixe
0320: 64 20 62 79 20 22 24 65 78 70 2d 22 2e 0a 09 23  d by "$exp-"...#
0330: 0a 09 23 20 6c 62 09 09 20 20 20 20 54 68 65 20  ..# lb..    The 
0340: 6c 65 66 74 20 62 72 61 63 6b 65 74 20 73 65 71  left bracket seq
0350: 75 65 6e 63 65 0a 09 23 20 72 62 09 09 20 20 20  uence..# rb..   
0360: 20 54 68 65 20 72 69 67 68 74 20 62 72 61 63 6b   The right brack
0370: 65 74 20 73 65 71 75 65 6e 63 65 0a 09 23 20 65  et sequence..# e
0380: 72 72 6d 6f 64 65 09 20 20 20 20 48 6f 77 20 74  rrmode.    How t
0390: 6f 20 68 61 6e 64 6c 65 20 6d 61 63 72 6f 20 65  o handle macro e
03a0: 72 72 6f 72 73 3a 20 0a 09 23 09 09 20 20 20 20  rrors: ..#..    
03b0: 6e 6f 74 68 69 6e 67 2c 20 6d 61 63 72 6f 2c 20  nothing, macro, 
03c0: 65 72 72 6f 72 2c 20 66 61 69 6c 2e 0a 20 20 20  error, fail..   
03d0: 20 20 20 20 20 23 20 65 76 61 6c 63 6d 64 20 20       # evalcmd  
03e0: 20 20 20 20 20 20 20 20 20 54 68 65 20 65 76 61           The eva
03f0: 6c 75 61 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 2e  luation command.
0400: 0a 09 23 20 74 65 78 74 63 6d 64 20 20 20 20 20  ..# textcmd     
0410: 20 20 20 20 20 20 54 68 65 20 70 6c 61 69 6e 20        The plain 
0420: 74 65 78 74 20 70 72 6f 63 65 73 73 69 6e 67 20  text processing 
0430: 63 6f 6d 6d 61 6e 64 2e 0a 09 23 20 6c 65 76 65  command...# leve
0440: 6c 09 09 20 20 20 20 54 68 65 20 63 6f 6e 74 65  l..    The conte
0450: 78 74 20 6c 65 76 65 6c 0a 09 23 20 6f 75 74 70  xt level..# outp
0460: 75 74 2d 24 6c 65 76 65 6c 20 20 20 20 20 54 68  ut-$level     Th
0470: 65 20 61 63 63 75 6d 75 6c 61 74 65 64 20 74 65  e accumulated te
0480: 78 74 20 61 74 20 74 68 69 73 20 63 6f 6e 74 65  xt at this conte
0490: 78 74 20 6c 65 76 65 6c 2e 0a 09 23 20 6e 61 6d  xt level...# nam
04a0: 65 2d 24 6c 65 76 65 6c 20 20 20 20 20 20 20 54  e-$level       T
04b0: 68 65 20 74 61 67 20 6e 61 6d 65 20 6f 66 20 74  he tag name of t
04c0: 68 69 73 20 63 6f 6e 74 65 78 74 20 6c 65 76 65  his context leve
04d0: 6c 0a 09 23 20 64 61 74 61 2d 24 6c 65 76 65 6c  l..# data-$level
04e0: 2d 24 76 61 72 20 20 41 20 76 61 72 69 61 62 6c  -$var  A variabl
04f0: 65 20 6f 66 20 74 68 69 73 20 63 6f 6e 74 65 78  e of this contex
0500: 74 20 6c 65 76 65 6c 20 20 20 20 20 0a 09 0a 09  t level     ....
0510: 76 61 72 69 61 62 6c 65 20 49 6e 66 6f 0a 20 20  variable Info.  
0520: 20 20 0a 09 23 20 49 6e 20 6d 65 74 68 6f 64 73    ..# In methods
0530: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62  , the current ob
0540: 6a 65 63 74 3a 0a 09 76 61 72 69 61 62 6c 65 20  ject:..variable 
0550: 54 68 69 73 20 22 22 0a 09 0a 09 23 20 45 78 70  This ""....# Exp
0560: 6f 72 74 20 70 75 62 6c 69 63 20 63 6f 6d 6d 61  ort public comma
0570: 6e 64 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65  nds..namespace e
0580: 78 70 6f 72 74 20 65 78 70 61 6e 64 65 72 0a 20  xport expander. 
0590: 20 20 20 7d 0a 0a 20 20 20 20 23 6e 61 6d 65 73     }..    #names
05a0: 70 61 63 65 20 69 6d 70 6f 72 74 20 65 78 70 61  pace import expa
05b0: 6e 64 65 72 3a 3a 2a 0a 20 20 20 20 6e 61 6d 65  nder::*.    name
05c0: 73 70 61 63 65 20 65 78 70 6f 72 74 20 65 78 70  space export exp
05d0: 61 6e 64 65 72 0a 0a 20 20 20 20 70 72 6f 63 20  ander..    proc 
05e0: 65 78 70 61 6e 64 65 72 20 7b 6e 61 6d 65 7d 20  expander {name} 
05f0: 7b 75 70 6c 65 76 65 6c 20 3a 3a 74 65 78 74 75  {uplevel ::textu
0600: 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 65  til::expander::e
0610: 78 70 61 6e 64 65 72 20 5b 6c 69 73 74 20 24 6e  xpander [list $n
0620: 61 6d 65 5d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ame]}.}..#------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0670: 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 65  # FUNCTION:.# .e
0680: 78 70 61 6e 64 65 72 20 6e 61 6d 65 0a 23 0a 23  xpander name.#.#
0690: 20 49 4e 50 55 54 53 3a 0a 23 09 6e 61 6d 65 09   INPUTS:.#.name.
06a0: 09 41 20 70 72 6f 63 20 6e 61 6d 65 20 66 6f 72  .A proc name for
06b0: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e   the new object.
06c0: 20 20 49 66 20 6e 6f 74 0a 23 20 20 20 20 20 20    If not.#      
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 66 75 6c 6c 79 2d 71 75 61 6c 69 66 69 65 64   fully-qualified
06f0: 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
0700: 74 6f 20 62 65 20 72 65 6c 61 74 69 76 65 0a 23  to be relative.#
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0720: 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 63 61         to the ca
0730: 6c 6c 65 72 27 73 20 6e 61 6d 65 73 70 61 63 65  ller's namespace
0740: 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23  ..#.# RETURNS:.#
0750: 09 6e 6f 74 68 69 6e 67 0a 23 0a 23 20 44 45 53  .nothing.#.# DES
0760: 43 52 49 50 54 49 4f 4e 3a 0a 23 09 43 72 65 61  CRIPTION:.#.Crea
0770: 74 65 73 20 61 20 6e 65 77 20 65 78 70 61 6e 64  tes a new expand
0780: 65 72 20 6f 62 6a 65 63 74 2e 0a 0a 70 72 6f 63  er object...proc
0790: 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70   ::textutil::exp
07a0: 61 6e 64 65 72 3a 3a 65 78 70 61 6e 64 65 72 20  ander::expander 
07b0: 7b 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 76 61 72  {name} {.    var
07c0: 69 61 62 6c 65 20 49 6e 66 6f 0a 0a 20 20 20 20  iable Info..    
07d0: 23 20 46 49 52 53 54 2c 20 71 75 61 6c 69 66 79  # FIRST, qualify
07e0: 20 74 68 65 20 6e 61 6d 65 2e 0a 20 20 20 20 69   the name..    i
07f0: 66 20 7b 21 5b 73 74 72 69 6e 67 20 6d 61 74 63  f {![string matc
0800: 68 20 22 3a 3a 2a 22 20 24 6e 61 6d 65 5d 7d 20  h "::*" $name]} 
0810: 7b 0a 20 20 20 20 20 20 20 20 23 20 47 65 74 20  {.        # Get 
0820: 63 61 6c 6c 65 72 27 73 20 6e 61 6d 65 73 70 61  caller's namespa
0830: 63 65 3b 20 61 70 70 65 6e 64 20 3a 3a 20 69 66  ce; append :: if
0840: 20 6e 6f 74 20 67 6c 6f 62 61 6c 20 6e 61 6d 65   not global name
0850: 73 70 61 63 65 2e 0a 20 20 20 20 20 20 20 20 73  space..        s
0860: 65 74 20 6e 73 20 5b 75 70 6c 65 76 65 6c 20 31  et ns [uplevel 1
0870: 20 6e 61 6d 65 73 70 61 63 65 20 63 75 72 72 65   namespace curre
0880: 6e 74 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  nt].        if {
0890: 22 3a 3a 22 20 21 3d 20 24 6e 73 7d 20 7b 0a 20  "::" != $ns} {. 
08a0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
08b0: 64 20 6e 73 20 22 3a 3a 22 0a 20 20 20 20 20 20  d ns "::".      
08c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 0a 20 20 20    }.        .   
08d0: 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20 22 24       set name "$
08e0: 6e 73 24 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a  ns$name".    }..
08f0: 20 20 20 20 23 20 4e 45 58 54 2c 20 43 68 65 63      # NEXT, Chec
0900: 6b 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 69  k the name.    i
0910: 66 20 7b 22 22 20 21 3d 20 5b 69 6e 66 6f 20 63  f {"" != [info c
0920: 6f 6d 6d 61 6e 64 20 24 6e 61 6d 65 5d 7d 20 7b  ommand $name]} {
0930: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0940: 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 63 6f 6d  -code error "com
0950: 6d 61 6e 64 20 6e 61 6d 65 20 5c 22 24 6e 61 6d  mand name \"$nam
0960: 65 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73  e\" already exis
0970: 74 73 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ts".    }..    #
0980: 20 4e 45 58 54 2c 20 43 72 65 61 74 65 20 74 68   NEXT, Create th
0990: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 70 72  e object..    pr
09a0: 6f 63 20 24 6e 61 6d 65 20 7b 6d 65 74 68 6f 64  oc $name {method
09b0: 20 61 72 67 73 7d 20 5b 66 6f 72 6d 61 74 20 7b   args} [format {
09c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
09d0: 74 63 68 20 7b 3a 3a 74 65 78 74 75 74 69 6c 3a  tch {::textutil:
09e0: 3a 65 78 70 61 6e 64 65 72 3a 3a 4d 65 74 68 6f  :expander::Metho
09f0: 64 73 20 25 73 20 24 6d 65 74 68 6f 64 20 24 61  ds %s $method $a
0a00: 72 67 73 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 0a  rgs} result]} {.
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0a20: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 24  rn -code error $
0a30: 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 7d  result.        }
0a40: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
0a50: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
0a60: 6c 74 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  lt.        }.   
0a70: 20 7d 20 24 6e 61 6d 65 5d 0a 0a 20 20 20 20 23   } $name]..    #
0a80: 20 4e 45 58 54 2c 20 49 6e 69 74 69 61 6c 69 7a   NEXT, Initializ
0a90: 65 20 74 68 65 20 6f 62 6a 65 63 74 0a 20 20 20  e the object.   
0aa0: 20 4f 70 5f 72 65 73 65 74 20 24 6e 61 6d 65 0a   Op_reset $name.
0ab0: 20 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20      .    return 
0ac0: 24 6e 61 6d 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  $name.}..#------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0b10: 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4d  # FUNCTION:.# .M
0b20: 65 74 68 6f 64 73 20 6e 61 6d 65 20 6d 65 74 68  ethods name meth
0b30: 6f 64 20 61 72 67 4c 69 73 74 0a 23 0a 23 20 49  od argList.#.# I
0b40: 4e 50 55 54 53 3a 0a 23 09 6e 61 6d 65 09 09 54  NPUTS:.#.name..T
0b50: 68 65 20 6f 62 6a 65 63 74 27 73 20 66 75 6c 6c  he object's full
0b60: 79 20 71 75 61 6c 69 66 69 65 64 20 70 72 6f 63  y qualified proc
0b70: 65 64 75 72 65 20 6e 61 6d 65 2e 0a 23 09 09 09  edure name..#...
0b80: 54 68 69 73 20 61 72 67 75 6d 65 6e 74 20 69 73  This argument is
0b90: 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
0ba0: 20 6f 62 6a 65 63 74 20 63 6f 6d 6d 61 6e 64 0a   object command.
0bb0: 23 09 09 09 69 74 73 65 6c 66 2e 0a 23 09 6d 65  #...itself..#.me
0bc0: 74 68 6f 64 09 09 54 68 65 20 6d 65 74 68 6f 64  thod..The method
0bd0: 20 74 6f 20 63 61 6c 6c 2e 0a 23 09 61 72 67 4c   to call..#.argL
0be0: 69 73 74 09 09 41 72 67 75 6d 65 6e 74 73 20 66  ist..Arguments f
0bf0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 63 20  or the specific 
0c00: 6d 65 74 68 6f 64 2e 0a 23 0a 23 20 52 45 54 55  method..#.# RETU
0c10: 52 4e 53 3a 0a 23 09 44 65 70 65 6e 64 73 20 6f  RNS:.#.Depends o
0c20: 6e 20 74 68 65 20 6d 65 74 68 6f 64 0a 23 0a 23  n the method.#.#
0c30: 20 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09   DESCRIPTION:.#.
0c40: 48 61 6e 64 6c 65 73 20 61 6c 6c 20 6d 65 74 68  Handles all meth
0c50: 6f 64 20 64 69 73 70 61 74 63 68 20 66 6f 72 20  od dispatch for 
0c60: 61 20 65 78 70 61 6e 64 65 72 20 6f 62 6a 65 63  a expander objec
0c70: 74 2e 0a 23 20 20 20 20 20 20 20 54 68 65 20 65  t..#       The e
0c80: 78 70 61 6e 64 65 72 27 73 20 6f 62 6a 65 63 74  xpander's object
0c90: 20 63 6f 6d 6d 61 6e 64 20 6d 65 72 65 6c 79 20   command merely 
0ca0: 70 61 73 73 65 73 20 69 74 73 20 61 72 67 75 6d  passes its argum
0cb0: 65 6e 74 73 20 74 6f 0a 23 09 74 68 69 73 20 66  ents to.#.this f
0cc0: 75 6e 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 64  unction, which d
0cd0: 69 73 70 61 74 63 68 65 73 20 74 68 65 20 61 72  ispatches the ar
0ce0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 0a 23  guments to the.#
0cf0: 09 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 74  .appropriate met
0d00: 68 6f 64 20 70 72 6f 63 65 64 75 72 65 2e 20 20  hod procedure.  
0d10: 49 66 20 74 68 65 20 6d 65 74 68 6f 64 20 72 61  If the method ra
0d20: 69 73 65 73 20 61 6e 20 65 72 72 6f 72 2c 0a 23  ises an error,.#
0d30: 09 74 68 65 20 6d 65 74 68 6f 64 20 70 72 6f 63  .the method proc
0d40: 65 64 75 72 65 27 73 20 6e 61 6d 65 20 69 6e 20  edure's name in 
0d50: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
0d60: 65 20 69 73 20 72 65 70 6c 61 63 65 64 0a 23 09  e is replaced.#.
0d70: 62 79 20 74 68 65 20 6f 62 6a 65 63 74 20 61 6e  by the object an
0d80: 64 20 6d 65 74 68 6f 64 20 6e 61 6d 65 73 2e 0a  d method names..
0d90: 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c  .proc ::textutil
0da0: 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 4d 65 74 68  ::expander::Meth
0db0: 6f 64 73 20 7b 6e 61 6d 65 20 6d 65 74 68 6f 64  ods {name method
0dc0: 20 61 72 67 4c 69 73 74 7d 20 7b 0a 20 20 20 20   argList} {.    
0dd0: 76 61 72 69 61 62 6c 65 20 49 6e 66 6f 0a 20 20  variable Info.  
0de0: 20 20 76 61 72 69 61 62 6c 65 20 54 68 69 73 0a    variable This.
0df0: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61  .    switch -exa
0e00: 63 74 20 2d 2d 20 24 6d 65 74 68 6f 64 20 7b 0a  ct -- $method {.
0e10: 20 20 20 20 20 20 20 20 65 78 70 61 6e 64 20 2d          expand -
0e20: 0a 20 20 20 20 20 20 20 20 6c 62 20 2d 0a 20 20  .        lb -.  
0e30: 20 20 20 20 20 20 72 62 20 2d 0a 20 20 20 20 20        rb -.     
0e40: 20 20 20 73 65 74 62 72 61 63 6b 65 74 73 20 2d     setbrackets -
0e50: 0a 20 20 20 20 20 20 20 20 65 72 72 6d 6f 64 65  .        errmode
0e60: 20 2d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 63   -.        evalc
0e70: 6d 64 20 2d 0a 09 74 65 78 74 63 6d 64 20 2d 0a  md -..textcmd -.
0e80: 20 20 20 20 20 20 20 20 63 70 75 73 68 20 2d 0a          cpush -.
0e90: 09 63 74 6f 70 61 6e 64 63 6c 65 61 72 20 2d 0a  .ctopandclear -.
0ea0: 20 20 20 20 20 20 20 20 63 69 73 20 2d 0a 20 20          cis -.  
0eb0: 20 20 20 20 20 20 63 6e 61 6d 65 20 2d 0a 20 20        cname -.  
0ec0: 20 20 20 20 20 20 63 73 65 74 20 2d 0a 20 20 20        cset -.   
0ed0: 20 20 20 20 20 63 67 65 74 20 2d 0a 20 20 20 20       cget -.    
0ee0: 20 20 20 20 63 76 61 72 20 2d 0a 20 20 20 20 20      cvar -.     
0ef0: 20 20 20 63 70 6f 70 20 2d 0a 20 20 20 20 20 20     cpop -.      
0f00: 20 20 63 61 70 70 65 6e 64 20 2d 0a 09 77 68 65    cappend -..whe
0f10: 72 65 20 2d 0a 20 20 20 20 20 20 20 20 72 65 73  re -.        res
0f20: 65 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  et {.           
0f30: 20 23 20 46 49 52 53 54 2c 20 65 78 65 63 75 74   # FIRST, execut
0f40: 65 20 74 68 65 20 6d 65 74 68 6f 64 2c 20 66 69  e the method, fi
0f50: 72 73 74 20 73 65 74 74 69 6e 67 20 54 68 69 73  rst setting This
0f60: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 0a 20   to the object. 
0f70: 20 20 20 20 20 20 20 20 20 20 20 23 20 6e 61 6d             # nam
0f80: 65 3b 20 74 68 65 6e 2c 20 61 66 74 65 72 20 74  e; then, after t
0f90: 68 65 20 6d 65 74 68 6f 64 20 68 61 73 20 62 65  he method has be
0fa0: 65 6e 20 63 61 6c 6c 65 64 2c 20 72 65 73 74 6f  en called, resto
0fb0: 72 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  re the.         
0fc0: 20 20 20 23 20 6f 6c 64 20 6f 62 6a 65 63 74 20     # old object 
0fd0: 6e 61 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  name..          
0fe0: 20 20 73 65 74 20 6f 6c 64 54 68 69 73 20 24 54    set oldThis $T
0ff0: 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
1000: 73 65 74 20 54 68 69 73 20 24 6e 61 6d 65 0a 0a  set This $name..
1010: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1020: 72 65 74 76 61 6c 20 5b 63 61 74 63 68 20 22 4f  retval [catch "O
1030: 70 5f 24 6d 65 74 68 6f 64 20 24 6e 61 6d 65 20  p_$method $name 
1040: 24 61 72 67 4c 69 73 74 22 20 72 65 73 75 6c 74  $argList" result
1050: 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ]..            s
1060: 65 74 20 54 68 69 73 20 24 6f 6c 64 54 68 69 73  et This $oldThis
1070: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1080: 4e 45 58 54 2c 20 68 61 6e 64 6c 65 20 74 68 65  NEXT, handle the
1090: 20 72 65 73 75 6c 74 20 62 61 73 65 64 20 6f 6e   result based on
10a0: 20 74 68 65 20 72 65 74 76 61 6c 2e 0a 20 20 20   the retval..   
10b0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65           if {$re
10c0: 74 76 61 6c 7d 20 7b 0a 20 20 20 20 20 20 20 20  tval} {.        
10d0: 20 20 20 20 20 20 20 20 72 65 67 73 75 62 20 2d          regsub -
10e0: 2d 20 22 4f 70 5f 24 6d 65 74 68 6f 64 22 20 24  - "Op_$method" $
10f0: 72 65 73 75 6c 74 20 22 24 6e 61 6d 65 20 24 6d  result "$name $m
1100: 65 74 68 6f 64 22 20 72 65 73 75 6c 74 0a 20 20  ethod" result.  
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1120: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
1130: 20 24 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20   $result.       
1140: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1160: 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 20 20 20  turn $result.   
1170: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1180: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66     }.        def
1190: 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 20  ault {.         
11a0: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
11b0: 65 72 72 6f 72 20 22 5c 22 24 6e 61 6d 65 20 24  error "\"$name $
11c0: 6d 65 74 68 6f 64 5c 22 20 69 73 20 6e 6f 74 20  method\" is not 
11d0: 64 65 66 69 6e 65 64 22 0a 20 20 20 20 20 20 20  defined".       
11e0: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d   }.    }.}..#---
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1230: 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23  --.# FUNCTION:.#
1240: 20 09 47 65 74 20 6b 65 79 0a 23 0a 23 20 49 4e   .Get key.#.# IN
1250: 50 55 54 53 3a 0a 23 09 6b 65 79 09 09 41 20 6b  PUTS:.#.key..A k
1260: 65 79 20 69 6e 74 6f 20 74 68 65 20 49 6e 66 6f  ey into the Info
1270: 20 61 72 72 61 79 2c 20 65 78 63 6c 75 64 69 6e   array, excludin
1280: 67 20 74 68 65 0a 23 09 20 20 20 20 20 20 20 20  g the.#.        
1290: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 6e          object n
12a0: 61 6d 65 2e 20 20 45 2e 67 2e 2c 20 22 6c 62 22  ame.  E.g., "lb"
12b0: 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23 09  .#.# RETURNS:.#.
12c0: 54 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  The value from t
12d0: 68 65 20 61 72 72 61 79 0a 23 0a 23 20 44 45 53  he array.#.# DES
12e0: 43 52 49 50 54 49 4f 4e 3a 0a 23 09 47 65 74 73  CRIPTION:.#.Gets
12f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e   the value of an
1300: 20 65 6e 74 72 79 20 66 72 6f 6d 20 49 6e 66 6f   entry from Info
1310: 20 66 6f 72 20 54 68 69 73 2e 0a 0a 70 72 6f 63   for This...proc
1320: 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70   ::textutil::exp
1330: 61 6e 64 65 72 3a 3a 47 65 74 20 7b 6b 65 79 7d  ander::Get {key}
1340: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
1350: 49 6e 66 6f 0a 20 20 20 20 76 61 72 69 61 62 6c  Info.    variabl
1360: 65 20 54 68 69 73 0a 0a 20 20 20 20 72 65 74 75  e This..    retu
1370: 72 6e 20 24 49 6e 66 6f 28 24 54 68 69 73 2d 24  rn $Info($This-$
1380: 6b 65 79 29 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  key).}..#-------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
13d0: 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 53 65   FUNCTION:.# .Se
13e0: 74 20 6b 65 79 20 76 61 6c 75 65 0a 23 0a 23 20  t key value.#.# 
13f0: 49 4e 50 55 54 53 3a 0a 23 09 6b 65 79 09 09 41  INPUTS:.#.key..A
1400: 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 49 6e   key into the In
1410: 66 6f 20 61 72 72 61 79 2c 20 65 78 63 6c 75 64  fo array, exclud
1420: 69 6e 67 20 74 68 65 0a 23 09 20 20 20 20 20 20  ing the.#.      
1430: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1440: 20 6e 61 6d 65 2e 20 20 45 2e 67 2e 2c 20 22 6c   name.  E.g., "l
1450: 62 22 0a 23 0a 23 09 76 61 6c 75 65 09 09 41 20  b".#.#.value..A 
1460: 54 63 6c 20 76 61 6c 75 65 0a 23 0a 23 20 52 45  Tcl value.#.# RE
1470: 54 55 52 4e 53 3a 0a 23 09 54 68 65 20 76 61 6c  TURNS:.#.The val
1480: 75 65 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49  ue.#.# DESCRIPTI
1490: 4f 4e 3a 0a 23 09 53 65 74 73 20 74 68 65 20 76  ON:.#.Sets the v
14a0: 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e 74 72 79  alue of an entry
14b0: 20 69 6e 20 49 6e 66 6f 20 66 6f 72 20 54 68 69   in Info for Thi
14c0: 73 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75  s...proc ::textu
14d0: 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 53  til::expander::S
14e0: 65 74 20 7b 6b 65 79 20 76 61 6c 75 65 7d 20 7b  et {key value} {
14f0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 49 6e  .    variable In
1500: 66 6f 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  fo.    variable 
1510: 54 68 69 73 0a 0a 20 20 20 20 72 65 74 75 72 6e  This..    return
1520: 20 5b 73 65 74 20 49 6e 66 6f 28 24 54 68 69 73   [set Info($This
1530: 2d 24 6b 65 79 29 20 24 76 61 6c 75 65 5d 0a 7d  -$key) $value].}
1540: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54  --------.# FUNCT
1590: 49 4f 4e 3a 0a 23 20 09 56 61 72 20 6b 65 79 0a  ION:.# .Var key.
15a0: 23 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09 6b 65  #.# INPUTS:.#.ke
15b0: 79 09 09 41 20 6b 65 79 20 69 6e 74 6f 20 74 68  y..A key into th
15c0: 65 20 49 6e 66 6f 20 61 72 72 61 79 2c 20 65 78  e Info array, ex
15d0: 63 6c 75 64 69 6e 67 20 74 68 65 0a 23 09 20 20  cluding the.#.  
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
15f0: 6a 65 63 74 20 6e 61 6d 65 2e 20 20 45 2e 67 2e  ject name.  E.g.
1600: 2c 20 22 6c 62 22 0a 23 0a 23 20 52 45 54 55 52  , "lb".#.# RETUR
1610: 4e 53 3a 0a 23 09 54 68 65 20 66 75 6c 6c 20 76  NS:.#.The full v
1620: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2c 20 73 75  ariable name, su
1630: 69 74 61 62 6c 65 20 66 6f 72 20 73 65 74 74 69  itable for setti
1640: 6e 67 20 6f 72 20 6c 61 70 70 65 6e 64 69 6e 67  ng or lappending
1650: 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69  ..proc ::textuti
1660: 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 56 61 72  l::expander::Var
1670: 20 7b 6b 65 79 7d 20 7b 0a 20 20 20 20 76 61 72   {key} {.    var
1680: 69 61 62 6c 65 20 49 6e 66 6f 0a 20 20 20 20 76  iable Info.    v
1690: 61 72 69 61 62 6c 65 20 54 68 69 73 0a 0a 20 20  ariable This..  
16a0: 20 20 72 65 74 75 72 6e 20 3a 3a 74 65 78 74 75    return ::textu
16b0: 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 49  til::expander::I
16c0: 6e 66 6f 28 24 54 68 69 73 2d 24 6b 65 79 29 0a  nfo($This-$key).
16d0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43  ---------.# FUNC
1720: 54 49 4f 4e 3a 0a 23 20 09 43 6f 6e 74 61 69 6e  TION:.# .Contain
1730: 73 20 6c 69 73 74 20 76 61 6c 75 65 0a 23 0a 23  s list value.#.#
1740: 20 49 4e 50 55 54 53 3a 0a 23 20 20 20 20 20 20   INPUTS:.#      
1750: 20 6c 69 73 74 09 09 61 6e 79 20 6c 69 73 74 0a   list..any list.
1760: 23 09 76 61 6c 75 65 09 09 61 6e 79 20 76 61 6c  #.value..any val
1770: 75 65 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a  ue.#.# RETURNS:.
1780: 23 09 54 52 55 45 20 69 66 20 74 68 65 20 6c 69  #.TRUE if the li
1790: 73 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  st contains the 
17a0: 76 61 6c 75 65 2c 20 61 6e 64 20 66 61 6c 73 65  value, and false
17b0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 0a 70 72 6f   otherwise...pro
17c0: 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78  c ::textutil::ex
17d0: 70 61 6e 64 65 72 3a 3a 43 6f 6e 74 61 69 6e 73  pander::Contains
17e0: 20 7b 6c 69 73 74 20 76 61 6c 75 65 7d 20 7b 0a   {list value} {.
17f0: 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
1800: 20 2d 65 78 61 63 74 20 24 6c 69 73 74 20 24 76   -exact $list $v
1810: 61 6c 75 65 5d 20 3d 3d 20 2d 31 7d 20 7b 0a 20  alue] == -1} {. 
1820: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 0a         return 0.
1830: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1840: 20 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20       return 1.  
1850: 20 20 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d    }.}...#-------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
18a0: 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4f 70   FUNCTION:.# .Op
18b0: 5f 6c 62 20 3f 6e 65 77 62 72 61 63 6b 65 74 3f  _lb ?newbracket?
18c0: 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09 6e  .#.# INPUTS:.#.n
18d0: 65 77 62 72 61 63 6b 65 74 09 09 49 66 20 67 69  ewbracket..If gi
18e0: 76 65 6e 2c 20 74 68 65 20 6e 65 77 20 62 72 61  ven, the new bra
18f0: 63 6b 65 74 20 74 6f 6b 65 6e 2e 0a 23 0a 23 20  cket token..#.# 
1900: 52 45 54 55 52 4e 53 3a 0a 23 09 54 68 65 20 63  RETURNS:.#.The c
1910: 75 72 72 65 6e 74 20 6c 65 66 74 20 62 72 61 63  urrent left brac
1920: 6b 65 74 0a 23 0a 23 20 44 45 53 43 52 49 50 54  ket.#.# DESCRIPT
1930: 49 4f 4e 3a 0a 23 09 52 65 74 75 72 6e 73 20 74  ION:.#.Returns t
1940: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 66 74 20  he current left 
1950: 62 72 61 63 6b 65 74 20 74 6f 6b 65 6e 2e 0a 0a  bracket token...
1960: 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a  proc ::textutil:
1970: 3a 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f 6c 62  :expander::Op_lb
1980: 20 7b 6e 61 6d 65 20 7b 6e 65 77 62 72 61 63 6b   {name {newbrack
1990: 65 74 20 22 22 7d 7d 20 7b 0a 20 20 20 20 69 66  et ""}} {.    if
19a0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
19b0: 20 24 6e 65 77 62 72 61 63 6b 65 74 5d 20 21 3d   $newbracket] !=
19c0: 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 53 65   0} {.        Se
19d0: 74 20 6c 62 20 24 6e 65 77 62 72 61 63 6b 65 74  t lb $newbracket
19e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
19f0: 6e 20 5b 47 65 74 20 6c 62 5d 0a 7d 0a 0a 23 2d  n [Get lb].}..#-
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a  ----.# FUNCTION:
1a50: 0a 23 20 09 4f 70 5f 72 62 20 3f 6e 65 77 62 72  .# .Op_rb ?newbr
1a60: 61 63 6b 65 74 3f 0a 23 0a 23 20 49 4e 50 55 54  acket?.#.# INPUT
1a70: 53 3a 0a 23 09 6e 65 77 62 72 61 63 6b 65 74 09  S:.#.newbracket.
1a80: 09 49 66 20 67 69 76 65 6e 2c 20 74 68 65 20 6e  .If given, the n
1a90: 65 77 20 62 72 61 63 6b 65 74 20 74 6f 6b 65 6e  ew bracket token
1aa0: 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23  ..#.# RETURNS:.#
1ab0: 09 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 66  .The current lef
1ac0: 74 20 62 72 61 63 6b 65 74 0a 23 0a 23 20 44 45  t bracket.#.# DE
1ad0: 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 52 65 74  SCRIPTION:.#.Ret
1ae0: 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  urns the current
1af0: 20 6c 65 66 74 20 62 72 61 63 6b 65 74 20 74 6f   left bracket to
1b00: 6b 65 6e 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78  ken...proc ::tex
1b10: 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a  tutil::expander:
1b20: 3a 4f 70 5f 72 62 20 7b 6e 61 6d 65 20 7b 6e 65  :Op_rb {name {ne
1b30: 77 62 72 61 63 6b 65 74 20 22 22 7d 7d 20 7b 0a  wbracket ""}} {.
1b40: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1b50: 6c 65 6e 67 74 68 20 24 6e 65 77 62 72 61 63 6b  length $newbrack
1b60: 65 74 5d 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20  et] != 0} {.    
1b70: 20 20 20 20 53 65 74 20 72 62 20 24 6e 65 77 62      Set rb $newb
1b80: 72 61 63 6b 65 74 0a 20 20 20 20 7d 0a 20 20 20  racket.    }.   
1b90: 20 72 65 74 75 72 6e 20 5b 47 65 74 20 72 62 5d   return [Get rb]
1ba0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e  ----------.# FUN
1bf0: 43 54 49 4f 4e 3a 0a 23 20 09 4f 70 5f 73 65 74  CTION:.# .Op_set
1c00: 62 72 61 63 6b 65 74 73 20 6c 62 72 61 63 6b 20  brackets lbrack 
1c10: 72 62 72 61 63 6b 0a 23 0a 23 20 49 4e 50 55 54  rbrack.#.# INPUT
1c20: 53 3a 0a 23 09 6c 62 72 61 63 6b 09 09 54 68 65  S:.#.lbrack..The
1c30: 20 6e 65 77 20 6c 65 66 74 20 62 72 61 63 6b 65   new left bracke
1c40: 74 0a 23 09 72 62 72 61 63 6b 09 09 54 68 65 20  t.#.rbrack..The 
1c50: 6e 65 77 20 72 69 67 68 74 20 62 72 61 63 6b 65  new right bracke
1c60: 74 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23  t.#.# RETURNS:.#
1c70: 09 6e 6f 74 68 69 6e 67 0a 23 0a 23 20 44 45 53  .nothing.#.# DES
1c80: 43 52 49 50 54 49 4f 4e 3a 0a 23 09 53 65 74 73  CRIPTION:.#.Sets
1c90: 20 74 68 65 20 62 72 61 63 6b 65 74 73 20 61 73   the brackets as
1ca0: 20 61 20 70 61 69 72 2e 0a 0a 70 72 6f 63 20 3a   a pair...proc :
1cb0: 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e  :textutil::expan
1cc0: 64 65 72 3a 3a 4f 70 5f 73 65 74 62 72 61 63 6b  der::Op_setbrack
1cd0: 65 74 73 20 7b 6e 61 6d 65 20 6c 62 72 61 63 6b  ets {name lbrack
1ce0: 20 72 62 72 61 63 6b 7d 20 7b 0a 20 20 20 20 53   rbrack} {.    S
1cf0: 65 74 20 6c 62 20 24 6c 62 72 61 63 6b 0a 20 20  et lb $lbrack.  
1d00: 20 20 53 65 74 20 72 62 20 24 72 62 72 61 63 6b    Set rb $rbrack
1d10: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  .    return.}..#
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e  -----.# FUNCTION
1d70: 3a 0a 23 20 09 4f 70 5f 65 72 72 6d 6f 64 65 20  :.# .Op_errmode 
1d80: 3f 6e 65 77 45 72 72 6d 6f 64 65 3f 0a 23 0a 23  ?newErrmode?.#.#
1d90: 20 49 4e 50 55 54 53 3a 0a 23 09 6e 65 77 45 72   INPUTS:.#.newEr
1da0: 72 6d 6f 64 65 09 09 49 66 20 67 69 76 65 6e 2c  rmode..If given,
1db0: 20 74 68 65 20 6e 65 77 20 65 72 72 6f 72 20 6d   the new error m
1dc0: 6f 64 65 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53  ode..#.# RETURNS
1dd0: 3a 0a 23 09 54 68 65 20 63 75 72 72 65 6e 74 20  :.#.The current 
1de0: 65 72 72 6f 72 20 6d 6f 64 65 0a 23 0a 23 20 44  error mode.#.# D
1df0: 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 52 65  ESCRIPTION:.#.Re
1e00: 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e  turns the curren
1e10: 74 20 65 72 72 6f 72 20 6d 6f 64 65 2e 0a 0a 70  t error mode...p
1e20: 72 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a  roc ::textutil::
1e30: 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f 65 72 72  expander::Op_err
1e40: 6d 6f 64 65 20 7b 6e 61 6d 65 20 7b 6e 65 77 45  mode {name {newE
1e50: 72 72 6d 6f 64 65 20 22 22 7d 7d 20 7b 0a 20 20  rrmode ""}} {.  
1e60: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1e70: 6e 67 74 68 20 24 6e 65 77 45 72 72 6d 6f 64 65  ngth $newErrmode
1e80: 5d 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20  ] != 0} {.      
1e90: 20 20 69 66 20 7b 21 5b 43 6f 6e 74 61 69 6e 73    if {![Contains
1ea0: 20 22 6d 61 63 72 6f 20 6e 6f 74 68 69 6e 67 20   "macro nothing 
1eb0: 65 72 72 6f 72 20 66 61 69 6c 22 20 24 6e 65 77  error fail" $new
1ec0: 45 72 72 6d 6f 64 65 5d 7d 20 7b 0a 20 20 20 20  Errmode]} {.    
1ed0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 24          error "$
1ee0: 6e 61 6d 65 20 65 72 72 6d 6f 64 65 3a 20 49 6e  name errmode: In
1ef0: 76 61 6c 69 64 20 65 72 72 6f 72 20 6d 6f 64 65  valid error mode
1f00: 3a 20 24 6e 65 77 45 72 72 6d 6f 64 65 22 0a 20  : $newErrmode". 
1f10: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f20: 20 20 53 65 74 20 65 72 72 6d 6f 64 65 20 24 6e    Set errmode $n
1f30: 65 77 45 72 72 6d 6f 64 65 0a 20 20 20 20 7d 0a  ewErrmode.    }.
1f40: 20 20 20 20 72 65 74 75 72 6e 20 5b 47 65 74 20      return [Get 
1f50: 65 72 72 6d 6f 64 65 5d 0a 7d 0a 0a 23 2d 2d 2d  errmode].}..#---
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23  --.# FUNCTION:.#
1fb0: 20 09 4f 70 5f 65 76 61 6c 63 6d 64 20 3f 6e 65   .Op_evalcmd ?ne
1fc0: 77 45 76 61 6c 43 6d 64 3f 0a 23 0a 23 20 49 4e  wEvalCmd?.#.# IN
1fd0: 50 55 54 53 3a 0a 23 09 6e 65 77 45 76 61 6c 43  PUTS:.#.newEvalC
1fe0: 6d 64 09 09 49 66 20 67 69 76 65 6e 2c 20 74 68  md..If given, th
1ff0: 65 20 6e 65 77 20 65 76 61 6c 20 63 6f 6d 6d 61  e new eval comma
2000: 6e 64 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a  nd..#.# RETURNS:
2010: 0a 23 09 54 68 65 20 63 75 72 72 65 6e 74 20 65  .#.The current e
2020: 76 61 6c 20 63 6f 6d 6d 61 6e 64 0a 23 0a 23 20  val command.#.# 
2030: 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 52  DESCRIPTION:.#.R
2040: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
2050: 6e 74 20 65 76 61 6c 20 63 6f 6d 6d 61 6e 64 2e  nt eval command.
2060: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f    This is the co
2070: 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 0a 23 09  mmand used to.#.
2080: 65 76 61 6c 75 61 74 65 20 6d 61 63 72 6f 73 3b  evaluate macros;
2090: 20 69 74 20 64 65 66 61 75 6c 74 73 20 74 6f 20   it defaults to 
20a0: 22 75 70 6c 65 76 65 6c 20 23 30 22 2e 0a 0a 70  "uplevel #0"...p
20b0: 72 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a  roc ::textutil::
20c0: 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f 65 76 61  expander::Op_eva
20d0: 6c 63 6d 64 20 7b 6e 61 6d 65 20 7b 6e 65 77 45  lcmd {name {newE
20e0: 76 61 6c 43 6d 64 20 22 22 7d 7d 20 7b 0a 20 20  valCmd ""}} {.  
20f0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2100: 6e 67 74 68 20 24 6e 65 77 45 76 61 6c 43 6d 64  ngth $newEvalCmd
2110: 5d 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20  ] != 0} {.      
2120: 20 20 53 65 74 20 65 76 61 6c 63 6d 64 20 24 6e    Set evalcmd $n
2130: 65 77 45 76 61 6c 43 6d 64 0a 20 20 20 20 7d 0a  ewEvalCmd.    }.
2140: 20 20 20 20 72 65 74 75 72 6e 20 5b 47 65 74 20      return [Get 
2150: 65 76 61 6c 63 6d 64 5d 0a 7d 0a 0a 23 2d 2d 2d  evalcmd].}..#---
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23  --.# FUNCTION:.#
21b0: 20 09 4f 70 5f 74 65 78 74 63 6d 64 20 3f 6e 65   .Op_textcmd ?ne
21c0: 77 54 65 78 74 43 6d 64 3f 0a 23 0a 23 20 49 4e  wTextCmd?.#.# IN
21d0: 50 55 54 53 3a 0a 23 09 6e 65 77 54 65 78 74 43  PUTS:.#.newTextC
21e0: 6d 64 09 09 49 66 20 67 69 76 65 6e 2c 20 74 68  md..If given, th
21f0: 65 20 6e 65 77 20 74 65 78 74 20 63 6f 6d 6d 61  e new text comma
2200: 6e 64 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a  nd..#.# RETURNS:
2210: 0a 23 09 54 68 65 20 63 75 72 72 65 6e 74 20 74  .#.The current t
2220: 65 78 74 20 63 6f 6d 6d 61 6e 64 0a 23 0a 23 20  ext command.#.# 
2230: 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 52  DESCRIPTION:.#.R
2240: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
2250: 6e 74 20 74 65 78 74 20 63 6f 6d 6d 61 6e 64 2e  nt text command.
2260: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f    This is the co
2270: 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 0a 23 09  mmand used to.#.
2280: 70 72 6f 63 65 73 73 20 70 6c 61 69 6e 20 74 65  process plain te
2290: 78 74 2e 20 49 74 20 64 65 66 61 75 6c 74 73 20  xt. It defaults 
22a0: 74 6f 20 7b 7d 2c 20 6d 65 61 6e 69 6e 67 20 69  to {}, meaning i
22b0: 64 65 6e 74 69 74 79 2e 0a 0a 70 72 6f 63 20 3a  dentity...proc :
22c0: 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e  :textutil::expan
22d0: 64 65 72 3a 3a 4f 70 5f 74 65 78 74 63 6d 64 20  der::Op_textcmd 
22e0: 7b 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  {name args} {.  
22f0: 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20    switch -exact 
2300: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20  [llength $args] 
2310: 7b 0a 09 30 20 7b 7d 0a 09 31 20 7b 53 65 74 20  {..0 {}..1 {Set 
2320: 74 65 78 74 63 6d 64 20 5b 6c 69 6e 64 65 78 20  textcmd [lindex 
2330: 24 61 72 67 73 20 30 5d 7d 0a 09 64 65 66 61 75  $args 0]}..defau
2340: 6c 74 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  lt {..    return
2350: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 77 72   -code error "wr
2360: 6f 6e 67 23 61 72 67 73 20 66 6f 72 20 74 65 78  ong#args for tex
2370: 74 63 6d 64 3a 20 6e 61 6d 65 20 3f 6e 65 77 54  tcmd: name ?newT
2380: 65 78 74 63 6d 64 3f 22 0a 09 7d 0a 20 20 20 20  extcmd?"..}.    
2390: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 47 65  }.    return [Ge
23a0: 74 20 74 65 78 74 63 6d 64 5d 0a 7d 0a 0a 23 2d  t textcmd].}..#-
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a  ----.# FUNCTION:
2400: 0a 23 20 09 4f 70 5f 72 65 73 65 74 0a 23 0a 23  .# .Op_reset.#.#
2410: 20 49 4e 50 55 54 53 3a 0a 23 09 6e 6f 6e 65 0a   INPUTS:.#.none.
2420: 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23 09 6e  #.# RETURNS:.#.n
2430: 6f 74 68 69 6e 67 0a 23 0a 23 20 44 45 53 43 52  othing.#.# DESCR
2440: 49 50 54 49 4f 4e 3a 0a 23 09 52 65 73 65 74 73  IPTION:.#.Resets
2450: 20 61 6c 6c 20 6f 62 6a 65 63 74 20 76 61 6c 75   all object valu
2460: 65 73 2c 20 61 73 20 74 68 6f 75 67 68 20 69 74  es, as though it
2470: 20 77 65 72 65 20 62 72 61 6e 64 20 6e 65 77 2e   were brand new.
2480: 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69  ..proc ::textuti
2490: 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f  l::expander::Op_
24a0: 72 65 73 65 74 20 7b 6e 61 6d 65 7d 20 7b 0a 20  reset {name} {. 
24b0: 20 20 20 76 61 72 69 61 62 6c 65 20 49 6e 66 6f     variable Info
24c0: 20 0a 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f   ..    if {[info
24d0: 20 65 78 69 73 74 73 20 49 6e 66 6f 28 24 6e 61   exists Info($na
24e0: 6d 65 2d 6c 62 29 5d 7d 20 7b 0a 20 20 20 20 20  me-lb)]} {.     
24f0: 20 20 20 66 6f 72 65 61 63 68 20 65 6c 74 20 5b     foreach elt [
2500: 61 72 72 61 79 20 6e 61 6d 65 73 20 49 6e 66 6f  array names Info
2510: 20 22 24 6e 61 6d 65 2d 2a 22 5d 20 7b 0a 20 20   "$name-*"] {.  
2520: 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
2530: 49 6e 66 6f 28 24 65 6c 74 29 0a 20 20 20 20 20  Info($elt).     
2540: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2550: 73 65 74 20 49 6e 66 6f 28 24 6e 61 6d 65 2d 6c  set Info($name-l
2560: 62 29 20 22 5c 5b 22 0a 20 20 20 20 73 65 74 20  b) "\[".    set 
2570: 49 6e 66 6f 28 24 6e 61 6d 65 2d 72 62 29 20 22  Info($name-rb) "
2580: 5c 5d 22 0a 20 20 20 20 73 65 74 20 49 6e 66 6f  \]".    set Info
2590: 28 24 6e 61 6d 65 2d 65 72 72 6d 6f 64 65 29 20  ($name-errmode) 
25a0: 22 66 61 69 6c 22 0a 20 20 20 20 73 65 74 20 49  "fail".    set I
25b0: 6e 66 6f 28 24 6e 61 6d 65 2d 65 76 61 6c 63 6d  nfo($name-evalcm
25c0: 64 29 20 22 75 70 6c 65 76 65 6c 20 23 30 22 0a  d) "uplevel #0".
25d0: 20 20 20 20 73 65 74 20 49 6e 66 6f 28 24 6e 61      set Info($na
25e0: 6d 65 2d 74 65 78 74 63 6d 64 29 20 22 22 0a 20  me-textcmd) "". 
25f0: 20 20 20 73 65 74 20 49 6e 66 6f 28 24 6e 61 6d     set Info($nam
2600: 65 2d 6c 65 76 65 6c 29 20 30 0a 20 20 20 20 73  e-level) 0.    s
2610: 65 74 20 49 6e 66 6f 28 24 6e 61 6d 65 2d 6f 75  et Info($name-ou
2620: 74 70 75 74 2d 30 29 20 22 22 0a 20 20 20 20 73  tput-0) "".    s
2630: 65 74 20 49 6e 66 6f 28 24 6e 61 6d 65 2d 6e 61  et Info($name-na
2640: 6d 65 2d 30 29 20 22 3a 30 22 0a 0a 20 20 20 20  me-0) ":0"..    
2650: 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  return.}..#-----
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 0a 23 20 43 6f 6e 74 65 78 74 3a 20  ----.# Context: 
26b0: 45 76 65 72 79 20 65 78 70 61 6e 73 69 6f 6e 20  Every expansion 
26c0: 74 61 6b 65 73 20 70 6c 61 63 65 20 69 6e 20 69  takes place in i
26d0: 74 73 20 6f 77 6e 20 63 6f 6e 74 65 78 74 3b 20  ts own context; 
26e0: 68 6f 77 65 76 65 72 2c 20 0a 23 20 61 20 6d 61  however, .# a ma
26f0: 63 72 6f 20 63 61 6e 20 70 75 73 68 20 61 20 6e  cro can push a n
2700: 65 77 20 63 6f 6e 74 65 78 74 2c 20 63 61 75 73  ew context, caus
2710: 69 6e 67 20 74 68 65 20 74 65 78 74 20 69 74 20  ing the text it 
2720: 72 65 74 75 72 6e 73 20 61 6e 64 20 61 6c 6c 0a  returns and all.
2730: 23 20 73 75 62 73 65 71 75 65 6e 74 20 74 65 78  # subsequent tex
2740: 74 20 74 6f 20 62 65 20 73 61 76 65 64 20 73 65  t to be saved se
2750: 70 61 72 61 74 65 6c 79 2e 20 20 4c 61 74 65 72  parately.  Later
2760: 2c 20 61 20 6d 61 74 63 68 69 6e 67 20 6d 61 63  , a matching mac
2770: 72 6f 20 63 61 6e 0a 23 20 70 6f 70 20 74 68 65  ro can.# pop the
2780: 20 63 6f 6e 74 65 78 74 2c 20 61 63 71 75 69 72   context, acquir
2790: 69 6e 67 20 61 6c 6c 20 74 65 78 74 20 73 61 76  ing all text sav
27a0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 72  ed since the fir
27b0: 73 74 20 63 6f 6d 6d 61 6e 64 2c 0a 23 20 61 6e  st command,.# an
27c0: 64 20 75 73 65 20 74 68 61 74 20 69 6e 20 69 74  d use that in it
27d0: 73 20 6f 77 6e 20 6f 75 74 70 75 74 2e 0a 0a 23  s own output...#
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e  -----.# FUNCTION
2830: 3a 0a 23 20 09 4f 70 5f 63 70 75 73 68 20 63 6e  :.# .Op_cpush cn
2840: 61 6d 65 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a  ame.#.# INPUTS:.
2850: 23 09 63 6e 61 6d 65 09 09 54 68 65 20 63 6f 6e  #.cname..The con
2860: 74 65 78 74 20 6e 61 6d 65 0a 23 0a 23 20 52 45  text name.#.# RE
2870: 54 55 52 4e 53 3a 0a 23 09 6e 6f 74 68 69 6e 67  TURNS:.#.nothing
2880: 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49 4f 4e  .#.# DESCRIPTION
2890: 3a 0a 23 20 20 20 20 20 20 20 50 75 73 68 65 73  :.#       Pushes
28a0: 20 61 6e 20 65 6d 70 74 79 20 6d 61 63 72 6f 20   an empty macro 
28b0: 63 6f 6e 74 65 78 74 20 6f 6e 74 6f 20 74 68 65  context onto the
28c0: 20 73 74 61 63 6b 2e 20 20 41 6c 6c 20 65 78 70   stack.  All exp
28d0: 61 6e 64 65 64 20 74 65 78 74 0a 23 20 20 20 20  anded text.#    
28e0: 20 20 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64     will be added
28f0: 20 74 6f 20 74 68 69 73 20 63 6f 6e 74 65 78 74   to this context
2900: 20 75 6e 74 69 6c 20 69 74 20 69 73 20 70 6f 70   until it is pop
2910: 70 65 64 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78  ped...proc ::tex
2920: 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a  tutil::expander:
2930: 3a 4f 70 5f 63 70 75 73 68 20 7b 6e 61 6d 65 20  :Op_cpush {name 
2940: 63 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 23 20 46  cname} {.    # F
2950: 52 49 4e 4b 3a 20 6e 6f 63 68 65 63 6b 0a 20 20  RINK: nocheck.  
2960: 20 20 69 6e 63 72 20 5b 56 61 72 20 6c 65 76 65    incr [Var leve
2970: 6c 5d 0a 20 20 20 20 23 20 46 52 49 4e 4b 3a 20  l].    # FRINK: 
2980: 6e 6f 63 68 65 63 6b 0a 20 20 20 20 73 65 74 20  nocheck.    set 
2990: 5b 56 61 72 20 6f 75 74 70 75 74 2d 5b 47 65 74  [Var output-[Get
29a0: 20 6c 65 76 65 6c 5d 5d 20 7b 7d 0a 20 20 20 20   level]] {}.    
29b0: 23 20 46 52 49 4e 4b 3a 20 6e 6f 63 68 65 63 6b  # FRINK: nocheck
29c0: 0a 20 20 20 20 73 65 74 20 5b 56 61 72 20 6e 61  .    set [Var na
29d0: 6d 65 2d 5b 47 65 74 20 6c 65 76 65 6c 5d 5d 20  me-[Get level]] 
29e0: 24 63 6e 61 6d 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  $cname.}..#-----
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09  .# FUNCTION:.# .
2a40: 4f 70 5f 63 69 73 20 63 6e 61 6d 65 0a 23 0a 23  Op_cis cname.#.#
2a50: 20 49 4e 50 55 54 53 3a 0a 23 09 63 6e 61 6d 65   INPUTS:.#.cname
2a60: 09 09 41 20 63 6f 6e 74 65 78 74 20 6e 61 6d 65  ..A context name
2a70: 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23 09  .#.# RETURNS:.#.
2a80: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 0a 23 0a  true or false.#.
2a90: 23 20 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23  # DESCRIPTION:.#
2aa0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 73 20 74         Returns t
2ab0: 72 75 65 20 69 66 20 74 68 65 20 63 75 72 72 65  rue if the curre
2ac0: 6e 74 20 63 6f 6e 74 65 78 74 20 68 61 73 20 74  nt context has t
2ad0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d  he specified nam
2ae0: 65 2c 20 61 6e 64 0a 23 09 66 61 6c 73 65 20 6f  e, and.#.false o
2af0: 74 68 65 72 77 69 73 65 2e 0a 0a 70 72 6f 63 20  therwise...proc 
2b00: 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61  ::textutil::expa
2b10: 6e 64 65 72 3a 3a 4f 70 5f 63 69 73 20 7b 6e 61  nder::Op_cis {na
2b20: 6d 65 20 63 6e 61 6d 65 7d 20 7b 0a 20 20 20 20  me cname} {.    
2b30: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73  return [expr {[s
2b40: 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 24 63  tring compare $c
2b50: 6e 61 6d 65 20 5b 4f 70 5f 63 6e 61 6d 65 20 24  name [Op_cname $
2b60: 6e 61 6d 65 5d 5d 20 3d 3d 20 30 7d 5d 0a 7d 0a  name]] == 0}].}.
2b70: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49  -------.# FUNCTI
2bc0: 4f 4e 3a 0a 23 20 09 4f 70 5f 63 6e 61 6d 65 0a  ON:.# .Op_cname.
2bd0: 23 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09 6e 6f  #.# INPUTS:.#.no
2be0: 6e 65 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a  ne.#.# RETURNS:.
2bf0: 23 09 54 68 65 20 63 6f 6e 74 65 78 74 20 6e 61  #.The context na
2c00: 6d 65 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49  me.#.# DESCRIPTI
2c10: 4f 4e 3a 0a 23 20 20 20 20 20 20 20 52 65 74 75  ON:.#       Retu
2c20: 72 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  rns the name of 
2c30: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
2c40: 65 78 74 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78  ext...proc ::tex
2c50: 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a  tutil::expander:
2c60: 3a 4f 70 5f 63 6e 61 6d 65 20 7b 6e 61 6d 65 7d  :Op_cname {name}
2c70: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 47   {.    return [G
2c80: 65 74 20 6e 61 6d 65 2d 5b 47 65 74 20 6c 65 76  et name-[Get lev
2c90: 65 6c 5d 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  el]].}..#-------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2ce0: 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4f 70   FUNCTION:.# .Op
2cf0: 5f 63 73 65 74 20 76 61 72 6e 61 6d 65 20 76 61  _cset varname va
2d00: 6c 75 65 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a  lue.#.# INPUTS:.
2d10: 23 09 76 61 72 6e 61 6d 65 09 09 54 68 65 20 6e  #.varname..The n
2d20: 61 6d 65 20 6f 66 20 61 20 63 6f 6e 74 65 78 74  ame of a context
2d30: 20 76 61 72 69 61 62 6c 65 0a 23 09 76 61 6c 75   variable.#.valu
2d40: 65 09 09 54 68 65 20 6e 65 77 20 76 61 6c 75 65  e..The new value
2d50: 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 65 78 74   for the context
2d60: 20 76 61 72 69 61 62 6c 65 0a 23 0a 23 20 52 45   variable.#.# RE
2d70: 54 55 52 4e 53 3a 0a 23 09 54 68 65 20 76 61 6c  TURNS:.#.The val
2d80: 75 65 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49  ue.#.# DESCRIPTI
2d90: 4f 4e 3a 0a 23 20 20 20 20 20 20 20 53 65 74 73  ON:.#       Sets
2da0: 20 61 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74   a variable in t
2db0: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
2dc0: 78 74 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74  xt...proc ::text
2dd0: 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a  util::expander::
2de0: 4f 70 5f 63 73 65 74 20 7b 6e 61 6d 65 20 76 61  Op_cset {name va
2df0: 72 6e 61 6d 65 20 76 61 6c 75 65 7d 20 7b 0a 20  rname value} {. 
2e00: 20 20 20 53 65 74 20 64 61 74 61 2d 5b 47 65 74     Set data-[Get
2e10: 20 6c 65 76 65 6c 5d 2d 24 76 61 72 6e 61 6d 65   level]-$varname
2e20: 20 24 76 61 6c 75 65 0a 7d 0a 0a 23 2d 2d 2d 2d   $value.}..#----
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e70: 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20  -.# FUNCTION:.# 
2e80: 09 4f 70 5f 63 67 65 74 20 76 61 72 6e 61 6d 65  .Op_cget varname
2e90: 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09 76  .#.# INPUTS:.#.v
2ea0: 61 72 6e 61 6d 65 09 09 54 68 65 20 6e 61 6d 65  arname..The name
2eb0: 20 6f 66 20 61 20 63 6f 6e 74 65 78 74 20 76 61   of a context va
2ec0: 72 69 61 62 6c 65 0a 23 0a 23 20 52 45 54 55 52  riable.#.# RETUR
2ed0: 4e 53 3a 0a 23 09 54 68 65 20 76 61 6c 75 65 0a  NS:.#.The value.
2ee0: 23 0a 23 20 44 45 53 43 52 49 50 54 49 4f 4e 3a  #.# DESCRIPTION:
2ef0: 0a 23 20 20 20 20 20 20 20 52 65 74 75 72 6e 73  .#       Returns
2f00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
2f10: 63 6f 6e 74 65 78 74 20 76 61 72 69 61 62 6c 65  context variable
2f20: 2e 20 20 49 74 27 73 20 61 6e 20 65 72 72 6f 72  .  It's an error
2f30: 20 69 66 0a 23 09 74 68 65 20 76 61 72 69 61 62   if.#.the variab
2f40: 6c 65 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  le doesn't exist
2f50: 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74  ...proc ::textut
2f60: 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 4f 70  il::expander::Op
2f70: 5f 63 67 65 74 20 7b 6e 61 6d 65 20 76 61 72 6e  _cget {name varn
2f80: 61 6d 65 7d 20 7b 0a 20 20 20 20 69 66 20 7b 21  ame} {.    if {!
2f90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 5b 56 61  [info exists [Va
2fa0: 72 20 64 61 74 61 2d 5b 47 65 74 20 6c 65 76 65  r data-[Get leve
2fb0: 6c 5d 2d 24 76 61 72 6e 61 6d 65 5d 5d 7d 20 7b  l]-$varname]]} {
2fc0: 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22  .        error "
2fd0: 24 6e 61 6d 65 20 63 67 65 74 3a 20 24 76 61 72  $name cget: $var
2fe0: 6e 61 6d 65 20 64 6f 65 73 6e 27 74 20 65 78 69  name doesn't exi
2ff0: 73 74 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65  st in this conte
3000: 78 74 20 28 5b 47 65 74 20 6c 65 76 65 6c 5d 29  xt ([Get level])
3010: 22 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ".    }.    retu
3020: 72 6e 20 5b 47 65 74 20 64 61 74 61 2d 5b 47 65  rn [Get data-[Ge
3030: 74 20 6c 65 76 65 6c 5d 2d 24 76 61 72 6e 61 6d  t level]-$varnam
3040: 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  e].}..#---------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46  ------------.# F
3090: 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4f 70 5f 63  UNCTION:.# .Op_c
30a0: 76 61 72 20 76 61 72 6e 61 6d 65 0a 23 0a 23 20  var varname.#.# 
30b0: 49 4e 50 55 54 53 3a 0a 23 09 76 61 72 6e 61 6d  INPUTS:.#.varnam
30c0: 65 09 09 54 68 65 20 6e 61 6d 65 20 6f 66 20 61  e..The name of a
30d0: 20 63 6f 6e 74 65 78 74 20 76 61 72 69 61 62 6c   context variabl
30e0: 65 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23  e.#.# RETURNS:.#
30f0: 09 54 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68  .The index to th
3100: 65 20 76 61 72 69 61 62 6c 65 0a 23 0a 23 20 44  e variable.#.# D
3110: 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 20 20 20  ESCRIPTION:.#   
3120: 20 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 20      Returns the 
3130: 69 6e 64 65 78 20 74 6f 20 61 20 63 6f 6e 74 65  index to a conte
3140: 78 74 20 76 61 72 69 61 62 6c 65 2c 20 66 6f 72  xt variable, for
3150: 20 75 73 65 20 77 69 74 68 20 73 65 74 2c 20 0a   use with set, .
3160: 23 09 6c 61 70 70 65 6e 64 2c 20 65 74 63 2e 0a  #.lappend, etc..
3170: 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c  .proc ::textutil
3180: 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f 63  ::expander::Op_c
3190: 76 61 72 20 7b 6e 61 6d 65 20 76 61 72 6e 61 6d  var {name varnam
31a0: 65 7d 20 7b 0a 20 20 20 20 69 66 20 7b 21 5b 69  e} {.    if {![i
31b0: 6e 66 6f 20 65 78 69 73 74 73 20 5b 56 61 72 20  nfo exists [Var 
31c0: 64 61 74 61 2d 5b 47 65 74 20 6c 65 76 65 6c 5d  data-[Get level]
31d0: 2d 24 76 61 72 6e 61 6d 65 5d 5d 7d 20 7b 0a 20  -$varname]]} {. 
31e0: 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 24 6e         error "$n
31f0: 61 6d 65 20 63 76 61 72 3a 20 24 76 61 72 6e 61  ame cvar: $varna
3200: 6d 65 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  me doesn't exist
3210: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
3220: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ".    }..    ret
3230: 75 72 6e 20 5b 56 61 72 20 64 61 74 61 2d 5b 47  urn [Var data-[G
3240: 65 74 20 6c 65 76 65 6c 5d 2d 24 76 61 72 6e 61  et level]-$varna
3250: 6d 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  me].}..#--------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
32a0: 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4f 70 5f  FUNCTION:.# .Op_
32b0: 63 70 6f 70 20 63 6e 61 6d 65 0a 23 0a 23 20 49  cpop cname.#.# I
32c0: 4e 50 55 54 53 3a 0a 23 09 63 6e 61 6d 65 09 09  NPUTS:.#.cname..
32d0: 54 68 65 20 65 78 70 65 63 74 65 64 20 63 6f 6e  The expected con
32e0: 74 65 78 74 20 6e 61 6d 65 2e 0a 23 0a 23 20 52  text name..#.# R
32f0: 45 54 55 52 4e 53 3a 0a 23 09 54 68 65 20 61 63  ETURNS:.#.The ac
3300: 63 75 6d 75 6c 61 74 65 64 20 6f 75 74 70 75 74  cumulated output
3310: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
3320: 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49 4f 4e  .#.# DESCRIPTION
3330: 3a 0a 23 20 20 20 20 20 20 20 52 65 74 75 72 6e  :.#       Return
3340: 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65  s the accumulate
3350: 64 20 6f 75 74 70 75 74 20 66 6f 72 20 74 68 65  d output for the
3360: 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74   current context
3370: 2c 20 66 69 72 73 74 0a 23 09 70 6f 70 70 69 6e  , first.#.poppin
3380: 67 20 74 68 65 20 63 6f 6e 74 65 78 74 20 66 72  g the context fr
3390: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  om the stack.  T
33a0: 68 65 20 65 78 70 65 63 74 65 64 20 63 6f 6e 74  he expected cont
33b0: 65 78 74 20 6e 61 6d 65 0a 23 09 6d 75 73 74 20  ext name.#.must 
33c0: 6d 61 74 63 68 20 74 68 65 20 72 65 61 6c 20 6e  match the real n
33d0: 61 6d 65 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  ame, or an error
33e0: 20 6f 63 63 75 72 73 2e 0a 0a 70 72 6f 63 20 3a   occurs...proc :
33f0: 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e  :textutil::expan
3400: 64 65 72 3a 3a 4f 70 5f 63 70 6f 70 20 7b 6e 61  der::Op_cpop {na
3410: 6d 65 20 63 6e 61 6d 65 7d 20 7b 0a 20 20 20 20  me cname} {.    
3420: 76 61 72 69 61 62 6c 65 20 49 6e 66 6f 0a 0a 20  variable Info.. 
3430: 20 20 20 69 66 20 7b 5b 47 65 74 20 6c 65 76 65     if {[Get leve
3440: 6c 5d 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 20  l] == 0} {.     
3450: 20 20 20 65 72 72 6f 72 20 22 24 6e 61 6d 65 20     error "$name 
3460: 63 70 6f 70 20 75 6e 64 65 72 66 6c 6f 77 20 6f  cpop underflow o
3470: 6e 20 27 24 63 6e 61 6d 65 27 22 0a 20 20 20 20  n '$cname'".    
3480: 7d 0a 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  }..    if {[stri
3490: 6e 67 20 63 6f 6d 70 61 72 65 20 5b 4f 70 5f 63  ng compare [Op_c
34a0: 6e 61 6d 65 20 24 6e 61 6d 65 5d 20 24 63 6e 61  name $name] $cna
34b0: 6d 65 5d 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20  me] != 0} {.    
34c0: 20 20 20 20 65 72 72 6f 72 20 22 24 6e 61 6d 65      error "$name
34d0: 20 63 70 6f 70 20 63 6f 6e 74 65 78 74 20 6d 69   cpop context mi
34e0: 73 6d 61 74 63 68 3a 20 65 78 70 65 63 74 65 64  smatch: expected
34f0: 20 5b 4f 70 5f 63 6e 61 6d 65 20 24 6e 61 6d 65   [Op_cname $name
3500: 5d 2c 20 67 6f 74 20 24 63 6e 61 6d 65 22 0a 20  ], got $cname". 
3510: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 72 65     }..    set re
3520: 73 75 6c 74 20 5b 47 65 74 20 6f 75 74 70 75 74  sult [Get output
3530: 2d 5b 47 65 74 20 6c 65 76 65 6c 5d 5d 0a 20 20  -[Get level]].  
3540: 20 20 23 20 46 52 49 4e 4b 3a 20 6e 6f 63 68 65    # FRINK: noche
3550: 63 6b 0a 20 20 20 20 73 65 74 20 5b 56 61 72 20  ck.    set [Var 
3560: 6f 75 74 70 75 74 2d 5b 47 65 74 20 6c 65 76 65  output-[Get leve
3570: 6c 5d 5d 20 22 22 0a 20 20 20 20 23 20 46 52 49  l]] "".    # FRI
3580: 4e 4b 3a 20 6e 6f 63 68 65 63 6b 0a 20 20 20 20  NK: nocheck.    
3590: 73 65 74 20 5b 56 61 72 20 6e 61 6d 65 2d 5b 47  set [Var name-[G
35a0: 65 74 20 6c 65 76 65 6c 5d 5d 20 22 22 0a 0a 20  et level]] "".. 
35b0: 20 20 20 66 6f 72 65 61 63 68 20 65 6c 74 20 5b     foreach elt [
35c0: 61 72 72 61 79 20 6e 61 6d 65 73 20 22 49 6e 66  array names "Inf
35d0: 6f 20 64 61 74 61 2d 5b 47 65 74 20 6c 65 76 65  o data-[Get leve
35e0: 6c 5d 2d 2a 22 5d 20 7b 0a 20 20 20 20 20 20 20  l]-*"] {.       
35f0: 20 75 6e 73 65 74 20 49 6e 66 6f 28 24 65 6c 74   unset Info($elt
3600: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 46  ).    }..    # F
3610: 52 49 4e 4b 3a 20 6e 6f 63 68 65 63 6b 0a 20 20  RINK: nocheck.  
3620: 20 20 69 6e 63 72 20 5b 56 61 72 20 6c 65 76 65    incr [Var leve
3630: 6c 5d 20 2d 31 0a 20 20 20 20 72 65 74 75 72 6e  l] -1.    return
3640: 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 2d 2d 2d   $result.}..#---
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23  --.# FUNCTION:.#
36a0: 20 09 4f 70 5f 63 74 6f 70 61 6e 64 63 6c 65 61   .Op_ctopandclea
36b0: 72 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09  r.#.# INPUTS:.#.
36c0: 4e 6f 6e 65 2e 0a 23 0a 23 20 52 45 54 55 52 4e  None..#.# RETURN
36d0: 53 3a 0a 23 09 54 68 65 20 61 63 63 75 6d 75 6c  S:.#.The accumul
36e0: 61 74 65 64 20 6f 75 74 70 75 74 20 69 6e 20 74  ated output in t
36f0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 6f 6e 74 65  he topmost conte
3700: 78 74 2c 20 63 6c 65 61 72 73 20 74 68 65 20 63  xt, clears the c
3710: 6f 6e 74 65 78 74 2c 0a 23 09 62 75 74 20 64 6f  ontext,.#.but do
3720: 65 73 20 6e 6f 74 20 70 6f 70 20 69 74 2e 0a 23  es not pop it..#
3730: 0a 23 20 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a  .# DESCRIPTION:.
3740: 23 20 20 20 20 20 20 20 52 65 74 75 72 6e 73 20  #       Returns 
3750: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65 64 20  the accumulated 
3760: 6f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 63  output for the c
3770: 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2c 20  urrent context, 
3780: 66 69 72 73 74 0a 23 09 70 6f 70 70 69 6e 67 20  first.#.popping 
3790: 74 68 65 20 63 6f 6e 74 65 78 74 20 66 72 6f 6d  the context from
37a0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
37b0: 20 65 78 70 65 63 74 65 64 20 63 6f 6e 74 65 78   expected contex
37c0: 74 20 6e 61 6d 65 0a 23 09 6d 75 73 74 20 6d 61  t name.#.must ma
37d0: 74 63 68 20 74 68 65 20 72 65 61 6c 20 6e 61 6d  tch the real nam
37e0: 65 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6f  e, or an error o
37f0: 63 63 75 72 73 2e 0a 0a 70 72 6f 63 20 3a 3a 74  ccurs...proc ::t
3800: 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65  extutil::expande
3810: 72 3a 3a 4f 70 5f 63 74 6f 70 61 6e 64 63 6c 65  r::Op_ctopandcle
3820: 61 72 20 7b 6e 61 6d 65 7d 20 7b 0a 20 20 20 20  ar {name} {.    
3830: 76 61 72 69 61 62 6c 65 20 49 6e 66 6f 0a 0a 20  variable Info.. 
3840: 20 20 20 69 66 20 7b 5b 47 65 74 20 6c 65 76 65     if {[Get leve
3850: 6c 5d 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 20  l] == 0} {.     
3860: 20 20 20 65 72 72 6f 72 20 22 24 6e 61 6d 65 20     error "$name 
3870: 63 70 6f 70 20 75 6e 64 65 72 66 6c 6f 77 20 6f  cpop underflow o
3880: 6e 20 27 5b 4f 70 5f 63 6e 61 6d 65 20 24 6e 61  n '[Op_cname $na
3890: 6d 65 5d 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20  me]'".    }..   
38a0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 47 65 74   set result [Get
38b0: 20 6f 75 74 70 75 74 2d 5b 47 65 74 20 6c 65 76   output-[Get lev
38c0: 65 6c 5d 5d 0a 20 20 20 20 53 65 74 20 6f 75 74  el]].    Set out
38d0: 70 75 74 2d 5b 47 65 74 20 6c 65 76 65 6c 5d 20  put-[Get level] 
38e0: 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72  "".    return $r
38f0: 65 73 75 6c 74 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  esult.}..#------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3940: 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4f  # FUNCTION:.# .O
3950: 70 5f 63 61 70 70 65 6e 64 20 74 65 78 74 0a 23  p_cappend text.#
3960: 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09 74 65 78  .# INPUTS:.#.tex
3970: 74 09 09 54 65 78 74 20 74 6f 20 61 64 64 20 74  t..Text to add t
3980: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 23 0a 23  o the output.#.#
3990: 20 52 45 54 55 52 4e 53 3a 0a 23 09 54 68 65 20   RETURNS:.#.The 
39a0: 61 63 63 75 6d 75 6c 61 74 65 64 20 6f 75 74 70  accumulated outp
39b0: 75 74 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49  ut.#.# DESCRIPTI
39c0: 4f 4e 3a 0a 23 20 20 20 20 20 20 20 41 70 70 65  ON:.#       Appe
39d0: 6e 64 73 20 74 68 65 20 74 65 78 74 20 74 6f 20  nds the text to 
39e0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65 64 20  the accumulated 
39f0: 6f 75 74 70 75 74 20 69 6e 20 74 68 65 20 63 75  output in the cu
3a00: 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0a 0a  rrent context...
3a10: 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a  proc ::textutil:
3a20: 3a 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f 63 61  :expander::Op_ca
3a30: 70 70 65 6e 64 20 7b 6e 61 6d 65 20 74 65 78 74  ppend {name text
3a40: 7d 20 7b 0a 20 20 20 20 23 20 46 52 49 4e 4b 3a  } {.    # FRINK:
3a50: 20 6e 6f 63 68 65 63 6b 0a 20 20 20 20 61 70 70   nocheck.    app
3a60: 65 6e 64 20 5b 56 61 72 20 6f 75 74 70 75 74 2d  end [Var output-
3a70: 5b 47 65 74 20 6c 65 76 65 6c 5d 5d 20 24 74 65  [Get level]] $te
3a80: 78 74 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  xt.}..#---------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ad0: 0a 23 20 4d 61 63 72 6f 2d 65 78 70 61 6e 73 69  .# Macro-expansi
3ae0: 6f 6e 3a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  on:  The followi
3af0: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 65 20 68  ng code is the h
3b00: 65 61 72 74 20 6f 66 20 74 68 65 20 6d 6f 64 75  eart of the modu
3b10: 6c 65 2e 0a 23 20 47 69 76 65 6e 20 61 20 74 65  le..# Given a te
3b20: 78 74 20 73 74 72 69 6e 67 2c 20 61 6e 64 20 74  xt string, and t
3b30: 68 65 20 63 75 72 72 65 6e 74 20 76 61 72 69 61  he current varia
3b40: 62 6c 65 20 73 65 74 74 69 6e 67 73 2c 20 74 68  ble settings, th
3b50: 69 73 20 63 6f 64 65 0a 23 20 72 65 74 75 72 6e  is code.# return
3b60: 73 20 61 6e 20 65 78 70 61 6e 64 65 64 20 73 74  s an expanded st
3b70: 72 69 6e 67 2c 20 77 69 74 68 20 61 6c 6c 20 6d  ring, with all m
3b80: 61 63 72 6f 73 20 72 65 70 6c 61 63 65 64 2e 0a  acros replaced..
3b90: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49  -------.# FUNCTI
3be0: 4f 4e 3a 0a 23 20 09 4f 70 5f 65 78 70 61 6e 64  ON:.# .Op_expand
3bf0: 20 69 6e 70 75 74 53 74 72 69 6e 67 20 3f 62 72   inputString ?br
3c00: 61 63 6b 65 74 73 3f 0a 23 0a 23 20 49 4e 50 55  ackets?.#.# INPU
3c10: 54 53 3a 0a 23 09 69 6e 70 75 74 53 74 72 69 6e  TS:.#.inputStrin
3c20: 67 09 09 54 68 65 20 74 65 78 74 20 74 6f 20 65  g..The text to e
3c30: 78 70 61 6e 64 2e 0a 23 09 62 72 61 63 6b 65 74  xpand..#.bracket
3c40: 73 09 09 41 20 6c 69 73 74 20 6f 66 20 74 77 6f  s..A list of two
3c50: 20 62 72 61 63 6b 65 74 20 74 6f 6b 65 6e 73 2e   bracket tokens.
3c60: 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23 09  .#.# RETURNS:.#.
3c70: 54 68 65 20 65 78 70 61 6e 64 65 64 20 74 65 78  The expanded tex
3c80: 74 2e 0a 23 0a 23 20 44 45 53 43 52 49 50 54 49  t..#.# DESCRIPTI
3c90: 4f 4e 3a 0a 23 09 46 69 6e 64 73 20 61 6c 6c 20  ON:.#.Finds all 
3ca0: 65 6d 62 65 64 64 65 64 20 6d 61 63 72 6f 73 20  embedded macros 
3cb0: 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  in the input str
3cc0: 69 6e 67 2c 20 61 6e 64 20 65 78 70 61 6e 64 73  ing, and expands
3cd0: 20 74 68 65 6d 2e 0a 23 09 49 66 20 3f 62 72 61   them..#.If ?bra
3ce0: 63 6b 65 74 73 3f 20 69 73 20 67 69 76 65 6e 2c  ckets? is given,
3cf0: 20 69 74 20 6d 75 73 74 20 62 65 20 6c 69 73 74   it must be list
3d00: 20 6f 66 20 6c 65 6e 67 74 68 20 32 2c 20 63 6f   of length 2, co
3d10: 6e 74 61 69 6e 69 6e 67 0a 23 09 72 65 70 6c 61  ntaining.#.repla
3d20: 63 65 6d 65 6e 74 20 6c 65 66 74 20 61 6e 64 20  cement left and 
3d30: 72 69 67 68 74 20 6d 61 63 72 6f 20 62 72 61 63  right macro brac
3d40: 6b 65 74 73 3b 20 6f 74 68 65 72 77 69 73 65 20  kets; otherwise 
3d50: 74 68 65 20 64 65 66 61 75 6c 74 0a 23 09 62 72  the default.#.br
3d60: 61 63 6b 65 74 73 20 61 72 65 20 75 73 65 64 2e  ackets are used.
3d70: 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69  ..proc ::textuti
3d80: 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 4f 70 5f  l::expander::Op_
3d90: 65 78 70 61 6e 64 20 7b 6e 61 6d 65 20 69 6e 70  expand {name inp
3da0: 75 74 53 74 72 69 6e 67 20 7b 62 72 61 63 6b 65  utString {bracke
3db0: 74 73 20 22 22 7d 7d 20 7b 0a 20 20 20 20 23 20  ts ""}} {.    # 
3dc0: 46 49 52 53 54 2c 20 70 75 73 68 20 61 20 6e 65  FIRST, push a ne
3dd0: 77 20 63 6f 6e 74 65 78 74 20 6f 6e 74 6f 20 74  w context onto t
3de0: 68 65 20 73 74 61 63 6b 2c 20 61 6e 64 20 73 61  he stack, and sa
3df0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ve the current. 
3e00: 20 20 20 23 20 62 72 61 63 6b 65 74 73 2e 0a 0a     # brackets...
3e10: 20 20 20 20 4f 70 5f 63 70 75 73 68 20 24 6e 61      Op_cpush $na
3e20: 6d 65 20 65 78 70 61 6e 64 0a 20 20 20 20 4f 70  me expand.    Op
3e30: 5f 63 73 65 74 20 24 6e 61 6d 65 20 6c 62 20 5b  _cset $name lb [
3e40: 47 65 74 20 6c 62 5d 0a 20 20 20 20 4f 70 5f 63  Get lb].    Op_c
3e50: 73 65 74 20 24 6e 61 6d 65 20 72 62 20 5b 47 65  set $name rb [Ge
3e60: 74 20 72 62 5d 0a 0a 20 20 20 20 23 20 4b 65 65  t rb]..    # Kee
3e70: 70 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72  p position infor
3e80: 6d 61 74 69 6f 6e 20 69 6e 20 63 6f 6e 74 65 78  mation in contex
3e90: 74 20 76 61 72 69 61 62 6c 65 73 20 61 73 20 77  t variables as w
3ea0: 65 6c 6c 2e 0a 20 20 20 20 23 20 4c 69 6e 65 20  ell..    # Line 
3eb0: 77 65 20 61 72 65 20 69 6e 2c 20 63 6f 75 6e 74  we are in, count
3ec0: 69 6e 67 20 66 72 6f 6d 20 31 3b 20 63 6f 6c 75  ing from 1; colu
3ed0: 6d 6e 20 77 65 20 61 72 65 20 61 74 2c 0a 20 20  mn we are at,.  
3ee0: 20 20 23 20 63 6f 75 6e 74 69 6e 67 20 66 72 6f    # counting fro
3ef0: 6d 20 30 2c 20 61 6e 64 20 69 6e 64 65 78 20 6f  m 0, and index o
3f00: 66 20 63 68 61 72 61 63 74 65 72 20 77 65 20 61  f character we a
3f10: 72 65 20 61 74 2c 0a 20 20 20 20 23 20 63 6f 75  re at,.    # cou
3f20: 6e 74 69 6e 67 20 66 72 6f 6d 20 30 2e 20 54 61  nting from 0. Ta
3f30: 62 73 20 63 6f 75 6e 74 73 20 61 73 20 27 31 27  bs counts as '1'
3f40: 20 77 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 0a   when computing.
3f50: 20 20 20 20 23 20 74 68 65 20 63 6f 6c 75 6d 6e      # the column
3f60: 2e 0a 0a 20 20 20 20 4c 6f 63 49 6e 69 74 20 24  ...    LocInit $
3f70: 6e 61 6d 65 0a 0a 20 20 20 20 23 20 53 46 20 54  name..    # SF T
3f80: 63 6c 6c 69 62 20 42 75 67 20 23 35 33 30 30 35  cllib Bug #53005
3f90: 36 2e 0a 20 20 20 20 73 65 74 20 73 74 61 72 74  6..    set start
3fa0: 5f 6c 65 76 65 6c 20 5b 47 65 74 20 6c 65 76 65  _level [Get leve
3fb0: 6c 5d 20 3b 20 23 20 72 65 6d 65 6d 62 65 72 20  l] ; # remember 
3fc0: 74 68 69 73 20 66 6f 72 20 63 68 65 63 6b 20 61  this for check a
3fd0: 74 20 65 6e 64 0a 0a 20 20 20 20 23 20 4e 45 58  t end..    # NEX
3fe0: 54 2c 20 75 73 65 20 74 68 65 20 75 73 65 72 27  T, use the user'
3ff0: 73 20 62 72 61 63 6b 65 74 73 2c 20 69 66 20 67  s brackets, if g
4000: 69 76 65 6e 2e 0a 20 20 20 20 69 66 20 7b 5b 6c  iven..    if {[l
4010: 6c 65 6e 67 74 68 20 24 62 72 61 63 6b 65 74 73  length $brackets
4020: 5d 20 3d 3d 20 32 7d 20 7b 0a 20 20 20 20 20 20  ] == 2} {.      
4030: 20 20 53 65 74 20 6c 62 20 5b 6c 69 6e 64 65 78    Set lb [lindex
4040: 20 24 62 72 61 63 6b 65 74 73 20 30 5d 0a 20 20   $brackets 0].  
4050: 20 20 20 20 20 20 53 65 74 20 72 62 20 5b 6c 69        Set rb [li
4060: 6e 64 65 78 20 24 62 72 61 63 6b 65 74 73 20 31  ndex $brackets 1
4070: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 4e  ].    }..    # N
4080: 45 58 54 2c 20 6c 6f 6f 70 20 6f 76 65 72 20 74  EXT, loop over t
4090: 68 65 20 73 74 72 69 6e 67 2c 20 66 69 6e 64 69  he string, findi
40a0: 6e 67 20 61 6e 64 20 65 78 70 61 6e 64 69 6e 67  ng and expanding
40b0: 20 6d 61 63 72 6f 73 2e 0a 20 20 20 20 77 68 69   macros..    whi
40c0: 6c 65 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  le {[string leng
40d0: 74 68 20 24 69 6e 70 75 74 53 74 72 69 6e 67 5d  th $inputString]
40e0: 20 3e 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20   > 0} {.        
40f0: 73 65 74 20 70 6c 61 69 6e 54 65 78 74 20 5b 45  set plainText [E
4100: 78 74 72 61 63 74 54 6f 54 6f 6b 65 6e 20 69 6e  xtractToToken in
4110: 70 75 74 53 74 72 69 6e 67 20 5b 47 65 74 20 6c  putString [Get l
4120: 62 5d 20 65 78 63 6c 75 64 65 5d 0a 0a 20 20 20  b] exclude]..   
4130: 20 20 20 20 20 23 20 46 49 52 53 54 2c 20 49 66       # FIRST, If
4140: 20 74 68 65 72 65 20 77 61 73 20 70 6c 61 69 6e   there was plain
4150: 20 74 65 78 74 2c 20 61 70 70 65 6e 64 20 69 74   text, append it
4160: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2c 20   to the output, 
4170: 61 6e 64 20 0a 20 20 20 20 20 20 20 20 23 20 63  and .        # c
4180: 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 20 20 20 20  ontinue..       
4190: 20 69 66 20 7b 24 70 6c 61 69 6e 54 65 78 74 20   if {$plainText 
41a0: 21 3d 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 65  != ""} {..    se
41b0: 74 20 69 6e 70 75 74 20 24 70 6c 61 69 6e 54 65  t input $plainTe
41c0: 78 74 0a 09 20 20 20 20 73 65 74 20 74 63 20 5b  xt..    set tc [
41d0: 47 65 74 20 74 65 78 74 63 6d 64 5d 0a 09 20 20  Get textcmd]..  
41e0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
41f0: 6e 67 74 68 20 24 74 63 5d 20 3e 20 30 7d 20 7b  ngth $tc] > 0} {
4200: 0a 09 09 6c 61 70 70 65 6e 64 20 74 63 20 24 70  ...lappend tc $p
4210: 6c 61 69 6e 54 65 78 74 0a 0a 09 09 69 66 20 7b  lainText....if {
4220: 21 5b 63 61 74 63 68 20 22 5b 47 65 74 20 65 76  ![catch "[Get ev
4230: 61 6c 63 6d 64 5d 20 5b 6c 69 73 74 20 24 74 63  alcmd] [list $tc
4240: 5d 22 20 72 65 73 75 6c 74 5d 7d 20 7b 0a 09 09  ]" result]} {...
4250: 20 20 20 20 73 65 74 20 70 6c 61 69 6e 54 65 78      set plainTex
4260: 74 20 24 72 65 73 75 6c 74 0a 09 09 7d 20 65 6c  t $result...} el
4270: 73 65 20 7b 0a 09 09 20 20 20 20 48 61 6e 64 6c  se {...    Handl
4280: 65 45 72 72 6f 72 20 24 6e 61 6d 65 20 7b 70 6c  eError $name {pl
4290: 61 69 6e 20 74 65 78 74 7d 20 24 74 63 20 24 72  ain text} $tc $r
42a0: 65 73 75 6c 74 0a 09 09 7d 0a 09 20 20 20 20 7d  esult...}..    }
42b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 5f  .            Op_
42c0: 63 61 70 70 65 6e 64 20 24 6e 61 6d 65 20 24 70  cappend $name $p
42d0: 6c 61 69 6e 54 65 78 74 0a 09 20 20 20 20 4c 6f  lainText..    Lo
42e0: 63 55 70 64 61 74 65 20 20 24 6e 61 6d 65 20 24  cUpdate  $name $
42f0: 69 6e 70 75 74 0a 0a 20 20 20 20 20 20 20 20 20  input..         
4300: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4310: 65 6e 67 74 68 20 24 69 6e 70 75 74 53 74 72 69  ength $inputStri
4320: 6e 67 5d 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20  ng] == 0} {.    
4330: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4340: 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  k.            }.
4350: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
4360: 20 20 20 23 20 4e 45 58 54 2c 20 41 20 6d 61 63     # NEXT, A mac
4370: 72 6f 20 69 73 20 74 68 65 20 6e 65 78 74 20 74  ro is the next t
4380: 68 69 6e 67 3b 20 70 72 6f 63 65 73 73 20 69 74  hing; process it
4390: 2e 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
43a0: 61 74 63 68 20 7b 47 65 74 4d 61 63 72 6f 20 69  atch {GetMacro i
43b0: 6e 70 75 74 53 74 72 69 6e 67 7d 20 6d 61 63 72  nputString} macr
43c0: 6f 5d 7d 20 7b 0a 09 20 20 20 20 23 20 53 46 20  o]} {..    # SF 
43d0: 74 63 6c 6c 69 62 20 62 75 67 20 37 38 31 39 37  tcllib bug 78197
43e0: 33 20 2e 2e 2e 20 44 6f 20 6e 6f 74 20 74 68 72  3 ... Do not thr
43f0: 6f 77 20 61 20 72 65 67 75 6c 61 72 0a 09 20 20  ow a regular..  
4400: 20 20 23 20 65 72 72 6f 72 2e 20 55 73 65 20 48    # error. Use H
4410: 61 6e 64 6c 65 45 72 72 6f 72 20 74 6f 20 67 69  andleError to gi
4420: 76 65 20 74 68 65 20 75 73 65 72 20 63 6f 6e 74  ve the user cont
4430: 72 6f 6c 20 6f 66 20 74 68 65 0a 09 20 20 20 20  rol of the..    
4440: 23 20 73 69 74 75 61 74 69 6f 6e 2c 20 76 69 61  # situation, via
4450: 20 74 68 65 20 64 65 66 69 6e 65 64 20 65 72 72   the defined err
4460: 6f 72 20 6d 6f 64 65 2e 20 54 68 65 20 63 6f 6e  or mode. The con
4470: 74 69 6e 75 65 0a 09 20 20 20 20 23 20 69 6e 74  tinue..    # int
4480: 65 72 63 65 70 74 73 20 69 66 20 74 68 65 20 75  ercepts if the u
4490: 73 65 72 20 61 6c 6c 6f 77 73 20 74 68 65 20 65  ser allows the e
44a0: 78 70 61 6e 73 69 6f 6e 20 74 6f 20 72 75 6e 20  xpansion to run 
44b0: 6f 6e 2c 0a 09 20 20 20 20 23 20 79 65 74 20 77  on,..    # yet w
44c0: 65 20 6d 75 73 74 20 6e 6f 74 20 74 72 79 20 74  e must not try t
44d0: 6f 20 72 75 6e 20 74 68 65 20 6e 6f 6e 2d 65 78  o run the non-ex
44e0: 69 73 74 69 6e 67 20 6d 61 63 72 6f 2e 0a 0a 09  isting macro....
44f0: 20 20 20 20 48 61 6e 64 6c 65 45 72 72 6f 72 20      HandleError 
4500: 24 6e 61 6d 65 20 7b 72 65 61 64 69 6e 67 20 6d  $name {reading m
4510: 61 63 72 6f 7d 20 24 69 6e 70 75 74 53 74 72 69  acro} $inputStri
4520: 6e 67 20 24 6d 61 63 72 6f 0a 09 20 20 20 20 63  ng $macro..    c
4530: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20  ontinue.        
4540: 7d 0a 0a 20 20 20 20 20 20 20 20 23 20 45 78 70  }..        # Exp
4550: 61 6e 64 20 74 68 65 20 6d 61 63 72 6f 2c 20 61  and the macro, a
4560: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
4570: 73 75 6c 74 2c 20 6f 72 0a 20 20 20 20 20 20 20  sult, or.       
4580: 20 23 20 68 61 6e 64 6c 65 20 61 6e 20 65 72 72   # handle an err
4590: 6f 72 2e 0a 20 20 20 20 20 20 20 20 69 66 20 7b  or..        if {
45a0: 21 5b 63 61 74 63 68 20 22 5b 47 65 74 20 65 76  ![catch "[Get ev
45b0: 61 6c 63 6d 64 5d 20 5b 6c 69 73 74 20 24 6d 61  alcmd] [list $ma
45c0: 63 72 6f 5d 22 20 72 65 73 75 6c 74 5d 7d 20 7b  cro]" result]} {
45d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 5f  .            Op_
45e0: 63 61 70 70 65 6e 64 20 24 6e 61 6d 65 20 24 72  cappend $name $r
45f0: 65 73 75 6c 74 20 0a 0a 09 20 20 20 20 23 20 57  esult ...    # W
4600: 65 20 68 61 76 65 20 74 6f 20 61 64 76 61 6e 63  e have to advanc
4610: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 62  e the location b
4620: 79 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  y the length of 
4630: 74 68 65 0a 09 20 20 20 20 23 20 6d 61 63 72 6f  the..    # macro
4640: 2c 20 70 6c 75 73 20 74 68 65 20 74 77 6f 20 62  , plus the two b
4650: 72 61 63 6b 65 74 73 2e 20 54 68 65 79 20 77 65  rackets. They we
4660: 72 65 20 73 74 72 69 70 70 65 64 20 62 79 0a 09  re stripped by..
4670: 20 20 20 20 23 20 47 65 74 4d 61 63 72 6f 2c 20      # GetMacro, 
4680: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 61 64  so we have to ad
4690: 64 20 74 68 65 6d 20 68 65 72 65 20 61 67 61 69  d them here agai
46a0: 6e 20 74 6f 20 6d 61 6b 65 0a 09 20 20 20 20 23  n to make..    #
46b0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 63 6f 72   computation cor
46c0: 72 65 63 74 2e 0a 0a 09 20 20 20 20 4c 6f 63 55  rect....    LocU
46d0: 70 64 61 74 65 20 24 6e 61 6d 65 20 5b 47 65 74  pdate $name [Get
46e0: 20 6c 62 5d 24 7b 6d 61 63 72 6f 7d 5b 47 65 74   lb]${macro}[Get
46f0: 20 72 62 5d 0a 20 20 20 20 20 20 20 20 20 20 20   rb].           
4700: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20   continue.      
4710: 20 20 7d 20 0a 0a 09 48 61 6e 64 6c 65 45 72 72    } ...HandleErr
4720: 6f 72 20 24 6e 61 6d 65 20 6d 61 63 72 6f 20 24  or $name macro $
4730: 6d 61 63 72 6f 20 24 72 65 73 75 6c 74 0a 20 20  macro $result.  
4740: 20 20 7d 0a 0a 20 20 20 20 23 20 53 46 20 54 63    }..    # SF Tc
4750: 6c 6c 69 62 20 42 75 67 20 23 35 33 30 30 35 36  llib Bug #530056
4760: 2e 0a 20 20 20 20 69 66 20 7b 5b 47 65 74 20 6c  ..    if {[Get l
4770: 65 76 65 6c 5d 20 3e 20 24 73 74 61 72 74 5f 6c  evel] > $start_l
4780: 65 76 65 6c 7d 20 7b 0a 09 23 20 54 68 65 20 75  evel} {..# The u
4790: 73 65 72 20 6d 61 63 72 6f 73 20 70 75 73 68 65  ser macros pushe
47a0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  d additional con
47b0: 74 65 78 74 73 2c 20 62 75 74 20 66 6f 72 67 6f  texts, but forgo
47c0: 74 20 74 6f 0a 09 23 20 70 6f 70 20 74 68 65 6d  t to..# pop them
47d0: 20 61 6c 6c 2e 20 54 68 65 20 6d 61 69 6e 20 77   all. The main w
47e0: 6f 72 6b 20 68 65 72 65 20 69 73 20 74 6f 20 70  ork here is to p
47f0: 6c 61 63 65 20 61 6c 6c 20 74 68 65 20 73 74 69  lace all the sti
4800: 6c 6c 0a 09 23 20 6f 70 65 6e 20 63 6f 6e 74 65  ll..# open conte
4810: 78 74 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72  xts into the err
4820: 6f 72 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20  or message, and 
4830: 74 6f 20 70 72 6f 64 75 63 65 0a 09 23 20 73 79  to produce..# sy
4840: 6e 74 61 63 74 69 63 61 6c 6c 79 20 63 6f 72 72  ntactically corr
4850: 65 63 74 20 65 6e 67 6c 69 73 68 2e 0a 0a 09 73  ect english....s
4860: 65 74 20 63 20 5b 6c 69 73 74 5d 0a 09 73 65 74  et c [list]..set
4870: 20 6e 20 5b 65 78 70 72 20 7b 5b 47 65 74 20 6c   n [expr {[Get l
4880: 65 76 65 6c 5d 20 2d 20 24 73 74 61 72 74 5f 6c  evel] - $start_l
4890: 65 76 65 6c 7d 5d 0a 09 69 66 20 7b 24 6e 20 3d  evel}]..if {$n =
48a0: 3d 20 31 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  = 1} {..    set 
48b0: 63 74 78 20 20 63 6f 6e 74 65 78 74 0a 09 20 20  ctx  context..  
48c0: 20 20 73 65 74 20 76 65 72 62 20 77 61 73 0a 09    set verb was..
48d0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65  } else {..    se
48e0: 74 20 63 74 78 20 20 63 6f 6e 74 65 78 74 73 0a  t ctx  contexts.
48f0: 09 20 20 20 20 73 65 74 20 76 65 72 62 20 77 65  .    set verb we
4900: 72 65 0a 09 7d 0a 09 66 6f 72 20 7b 69 6e 63 72  re..}..for {incr
4910: 20 6e 20 2d 31 7d 20 7b 24 6e 20 3e 3d 20 30 7d   n -1} {$n >= 0}
4920: 20 7b 69 6e 63 72 20 6e 20 2d 31 7d 20 7b 0a 09   {incr n -1} {..
4930: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 20 5b 47      lappend c [G
4940: 65 74 20 6e 61 6d 65 2d 5b 65 78 70 72 20 7b 5b  et name-[expr {[
4950: 47 65 74 20 6c 65 76 65 6c 5d 2d 24 6e 7d 5d 5d  Get level]-$n}]]
4960: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 2d 63 6f 64  ..}..return -cod
4970: 65 20 65 72 72 6f 72 20 5c 0a 09 09 22 54 68 65  e error \..."The
4980: 20 66 6f 6c 6c 6f 77 69 6e 67 20 24 63 74 78 20   following $ctx 
4990: 70 75 73 68 65 64 20 62 79 20 74 68 65 20 6d 61  pushed by the ma
49a0: 63 72 6f 73 20 24 76 65 72 62 20 6e 6f 74 20 70  cros $verb not p
49b0: 6f 70 70 65 64 3a 20 5b 6a 6f 69 6e 20 24 63 20  opped: [join $c 
49c0: 2c 5d 2e 22 0a 20 20 20 20 7d 20 65 6c 73 65 69  ,].".    } elsei
49d0: 66 20 7b 5b 47 65 74 20 6c 65 76 65 6c 5d 20 3c  f {[Get level] <
49e0: 20 24 73 74 61 72 74 5f 6c 65 76 65 6c 7d 20 7b   $start_level} {
49f0: 0a 09 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24  ..set n [expr {$
4a00: 73 74 61 72 74 5f 6c 65 76 65 6c 20 2d 20 5b 47  start_level - [G
4a10: 65 74 20 6c 65 76 65 6c 5d 7d 5d 0a 09 69 66 20  et level]}]..if 
4a20: 7b 24 6e 20 3d 3d 20 31 7d 20 7b 0a 09 20 20 20  {$n == 1} {..   
4a30: 20 73 65 74 20 63 74 78 20 20 63 6f 6e 74 65 78   set ctx  contex
4a40: 74 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  t..} else {..   
4a50: 20 73 65 74 20 63 74 78 20 20 63 6f 6e 74 65 78   set ctx  contex
4a60: 74 73 0a 09 7d 0a 09 72 65 74 75 72 6e 20 2d 63  ts..}..return -c
4a70: 6f 64 65 20 65 72 72 6f 72 20 5c 0a 09 09 22 54  ode error \..."T
4a80: 68 65 20 6d 61 63 72 6f 73 20 70 6f 70 70 65 64  he macros popped
4a90: 20 24 6e 20 6d 6f 72 65 20 24 63 74 78 20 74 68   $n more $ctx th
4aa0: 61 6e 20 74 68 65 79 20 68 61 64 20 70 75 73 68  an they had push
4ab0: 65 64 2e 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ed.".    }..    
4ac0: 4f 70 5f 6c 62 20 24 6e 61 6d 65 20 5b 4f 70 5f  Op_lb $name [Op_
4ad0: 63 67 65 74 20 24 6e 61 6d 65 20 6c 62 5d 0a 20  cget $name lb]. 
4ae0: 20 20 20 4f 70 5f 72 62 20 24 6e 61 6d 65 20 5b     Op_rb $name [
4af0: 4f 70 5f 63 67 65 74 20 24 6e 61 6d 65 20 72 62  Op_cget $name rb
4b00: 5d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 4f  ]..    return [O
4b10: 70 5f 63 70 6f 70 20 24 6e 61 6d 65 20 65 78 70  p_cpop $name exp
4b20: 61 6e 64 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  and].}..#-------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4b70: 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09 4f 70   FUNCTION:.# .Op
4b80: 5f 77 68 65 72 65 0a 23 0a 23 20 49 4e 50 55 54  _where.#.# INPUT
4b90: 53 3a 0a 23 09 4e 6f 6e 65 2e 0a 23 0a 23 20 52  S:.#.None..#.# R
4ba0: 45 54 55 52 4e 53 3a 0a 23 09 54 68 65 20 63 75  ETURNS:.#.The cu
4bb0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
4bc0: 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a 23 0a 23  n the input..#.#
4bd0: 20 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09   DESCRIPTION:.#.
4be0: 52 65 74 72 69 65 76 65 73 20 74 68 65 20 63 75  Retrieves the cu
4bf0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
4c00: 68 65 20 65 78 70 61 6e 64 65 72 0a 23 09 69 73  he expander.#.is
4c10: 20 61 74 20 64 75 72 69 6e 67 20 70 72 6f 63 65   at during proce
4c20: 73 73 69 6e 67 2e 0a 0a 70 72 6f 63 20 3a 3a 74  ssing...proc ::t
4c30: 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65  extutil::expande
4c40: 72 3a 3a 4f 70 5f 77 68 65 72 65 20 7b 6e 61 6d  r::Op_where {nam
4c50: 65 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e} {.    return 
4c60: 5b 4c 6f 63 47 65 74 20 24 6e 61 6d 65 5d 0a 7d  [LocGet $name].}
4c70: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54  --------.# FUNCT
4cc0: 49 4f 4e 0a 23 09 48 61 6e 64 6c 65 45 72 72 6f  ION.#.HandleErro
4cd0: 72 20 6e 61 6d 65 20 74 69 74 6c 65 20 63 6f 6d  r name title com
4ce0: 6d 61 6e 64 20 65 72 72 6d 73 67 0a 23 0a 23 20  mand errmsg.#.# 
4cf0: 49 4e 50 55 54 53 3a 0a 23 09 6e 61 6d 65 09 09  INPUTS:.#.name..
4d00: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
4d10: 65 78 70 61 6e 64 65 72 20 6f 62 6a 65 63 74 20  expander object 
4d20: 69 6e 20 71 75 65 73 74 69 6f 6e 2e 0a 23 09 74  in question..#.t
4d30: 69 74 6c 65 09 09 41 20 74 69 74 6c 65 20 74 65  itle..A title te
4d40: 78 74 0a 23 09 63 6f 6d 6d 61 6e 64 09 09 54 68  xt.#.command..Th
4d50: 65 20 63 6f 6d 6d 61 6e 64 20 77 68 69 63 68 20  e command which 
4d60: 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
4d70: 2e 0a 23 09 65 72 72 6d 73 67 09 09 54 68 65 20  ..#.errmsg..The 
4d80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
4d90: 20 72 65 70 6f 72 74 0a 23 0a 23 20 52 45 54 55   report.#.# RETU
4da0: 52 4e 53 3a 0a 23 09 4e 6f 74 68 69 6e 67 0a 23  RNS:.#.Nothing.#
4db0: 0a 23 20 44 45 53 43 52 49 50 54 49 4f 4e 53 0a  .# DESCRIPTIONS.
4dc0: 23 09 49 73 20 65 78 65 63 75 74 65 64 20 77 68  #.Is executed wh
4dd0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  en an error in a
4de0: 20 6d 61 63 72 6f 20 6f 72 20 74 68 65 20 70 6c   macro or the pl
4df0: 61 69 6e 20 74 65 78 74 20 68 61 6e 64 6c 65 72  ain text handler
4e00: 0a 23 09 6f 63 63 75 72 73 2e 20 47 65 6e 65 72  .#.occurs. Gener
4e10: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
4e20: 73 73 61 67 65 20 61 63 63 6f 72 64 69 6e 67 20  ssage according 
4e30: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 23  to the current.#
4e40: 09 65 72 72 6f 72 20 6d 6f 64 65 2e 0a 0a 70 72  .error mode...pr
4e50: 6f 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65  oc ::textutil::e
4e60: 78 70 61 6e 64 65 72 3a 3a 48 61 6e 64 6c 65 45  xpander::HandleE
4e70: 72 72 6f 72 20 7b 6e 61 6d 65 20 74 69 74 6c 65  rror {name title
4e80: 20 63 6f 6d 6d 61 6e 64 20 65 72 72 6d 73 67 7d   command errmsg}
4e90: 20 7b 0a 20 20 20 20 73 77 69 74 63 68 20 5b 47   {.    switch [G
4ea0: 65 74 20 65 72 72 6d 6f 64 65 5d 20 7b 0a 09 6e  et errmode] {..n
4eb0: 6f 74 68 69 6e 67 20 7b 20 7d 0a 09 6d 61 63 72  othing { }..macr
4ec0: 6f 20 7b 0a 09 20 20 20 20 23 20 54 68 65 20 6c  o {..    # The l
4ed0: 6f 63 61 74 69 6f 6e 20 69 73 20 69 72 72 65 6c  ocation is irrel
4ee0: 65 76 61 6e 74 20 68 65 72 65 2e 0a 09 20 20 20  evant here...   
4ef0: 20 4f 70 5f 63 61 70 70 65 6e 64 20 24 6e 61 6d   Op_cappend $nam
4f00: 65 20 22 5b 47 65 74 20 6c 62 5d 24 63 6f 6d 6d  e "[Get lb]$comm
4f10: 61 6e 64 5b 47 65 74 20 72 62 5d 22 20 0a 09 7d  and[Get rb]" ..}
4f20: 0a 09 65 72 72 6f 72 20 7b 0a 09 20 20 20 20 66  ..error {..    f
4f30: 6f 72 65 61 63 68 20 7b 63 68 20 6c 69 6e 65 20  oreach {ch line 
4f40: 63 6f 6c 7d 20 5b 4c 6f 63 47 65 74 20 24 6e 61  col} [LocGet $na
4f50: 6d 65 5d 20 62 72 65 61 6b 0a 09 20 20 20 20 73  me] break..    s
4f60: 65 74 20 64 69 73 70 6c 61 79 20 5b 44 69 73 70  et display [Disp
4f70: 6c 61 79 4f 66 20 24 63 6f 6d 6d 61 6e 64 5d 0a  layOf $command].
4f80: 0a 09 20 20 20 20 4f 70 5f 63 61 70 70 65 6e 64  ..    Op_cappend
4f90: 20 24 6e 61 6d 65 20 22 5c 6e 3d 3d 3d 3d 3d 3d   $name "\n======
4fa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 5c 6e 22 0a 09  ===========\n"..
4fc0: 20 20 20 20 4f 70 5f 63 61 70 70 65 6e 64 20 24      Op_cappend $
4fd0: 6e 61 6d 65 20 22 2a 2a 2a 20 45 72 72 6f 72 20  name "*** Error 
4fe0: 69 6e 20 24 74 69 74 6c 65 20 61 74 20 6c 69 6e  in $title at lin
4ff0: 65 20 24 6c 69 6e 65 2c 20 63 6f 6c 75 6d 6e 20  e $line, column 
5000: 24 63 6f 6c 3a 5c 6e 22 0a 09 20 20 20 20 4f 70  $col:\n"..    Op
5010: 5f 63 61 70 70 65 6e 64 20 24 6e 61 6d 65 20 22  _cappend $name "
5020: 2a 2a 2a 20 5b 47 65 74 20 6c 62 5d 24 64 69 73  *** [Get lb]$dis
5030: 70 6c 61 79 5b 47 65 74 20 72 62 5d 5c 6e 2d 2d  play[Get rb]\n--
5040: 3e 20 24 65 72 72 6d 73 67 5c 6e 22 0a 09 20 20  > $errmsg\n"..  
5050: 20 20 4f 70 5f 63 61 70 70 65 6e 64 20 24 6e 61    Op_cappend $na
5060: 6d 65 20 22 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  me "============
5070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5080: 3d 3d 3d 3d 3d 5c 6e 22 0a 09 7d 0a 09 66 61 69  =====\n"..}..fai
5090: 6c 20 20 20 7b 20 0a 09 20 20 20 20 66 6f 72 65  l   { ..    fore
50a0: 61 63 68 20 7b 63 68 20 6c 69 6e 65 20 63 6f 6c  ach {ch line col
50b0: 7d 20 5b 4c 6f 63 47 65 74 20 24 6e 61 6d 65 5d  } [LocGet $name]
50c0: 20 62 72 65 61 6b 0a 09 20 20 20 20 73 65 74 20   break..    set 
50d0: 64 69 73 70 6c 61 79 20 5b 44 69 73 70 6c 61 79  display [Display
50e0: 4f 66 20 24 63 6f 6d 6d 61 6e 64 5d 0a 0a 09 20  Of $command]... 
50f0: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
5100: 65 72 72 6f 72 20 22 45 72 72 6f 72 20 69 6e 20  error "Error in 
5110: 24 74 69 74 6c 65 20 61 74 20 6c 69 6e 65 20 24  $title at line $
5120: 6c 69 6e 65 2c 5c 0a 09 09 20 20 20 20 63 6f 6c  line,\...    col
5130: 75 6d 6e 20 24 63 6f 6c 3a 5c 6e 5b 47 65 74 20  umn $col:\n[Get 
5140: 6c 62 5d 24 64 69 73 70 6c 61 79 5b 47 65 74 20  lb]$display[Get 
5150: 72 62 5d 5c 6e 2d 2d 3e 5c 0a 09 09 20 20 20 20  rb]\n-->\...    
5160: 24 65 72 72 6d 73 67 22 0a 09 7d 0a 09 64 65 66  $errmsg"..}..def
5170: 61 75 6c 74 20 7b 0a 09 20 20 20 20 72 65 74 75  ault {..    retu
5180: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
5190: 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 6d 6f  Unknown error mo
51a0: 64 65 3a 20 5b 47 65 74 20 65 72 72 6d 6f 64 65  de: [Get errmode
51b0: 5d 22 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23  ]"..}.    }.}..#
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e  -----.# FUNCTION
5210: 3a 0a 23 20 09 45 78 74 72 61 63 74 54 6f 54 6f  :.# .ExtractToTo
5220: 6b 65 6e 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  ken string token
5230: 20 6d 6f 64 65 0a 23 0a 23 20 49 4e 50 55 54 53   mode.#.# INPUTS
5240: 3a 0a 23 09 73 74 72 69 6e 67 09 09 54 68 65 20  :.#.string..The 
5250: 74 65 78 74 20 74 6f 20 70 72 6f 63 65 73 73 2e  text to process.
5260: 0a 23 09 74 6f 6b 65 6e 09 09 54 68 65 20 74 6f  .#.token..The to
5270: 6b 65 6e 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 0a  ken to look for.
5280: 23 09 6d 6f 64 65 09 09 69 6e 63 6c 75 64 65 20  #.mode..include 
5290: 6f 72 20 65 78 63 6c 75 64 65 0a 23 0a 23 20 52  or exclude.#.# R
52a0: 45 54 55 52 4e 53 3a 0a 23 09 54 68 65 20 65 78  ETURNS:.#.The ex
52b0: 74 72 61 63 74 65 64 20 74 65 78 74 0a 23 0a 23  tracted text.#.#
52c0: 20 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 20   DESCRIPTION:.# 
52d0: 09 45 78 74 72 61 63 74 20 74 65 78 74 20 66 72  .Extract text fr
52e0: 6f 6d 20 61 20 73 74 72 69 6e 67 2c 20 75 70 20  om a string, up 
52f0: 74 6f 20 6f 72 20 69 6e 63 6c 75 64 69 6e 67 20  to or including 
5300: 61 20 70 61 72 74 69 63 75 6c 61 72 0a 23 20 09  a particular.# .
5310: 74 6f 6b 65 6e 2e 20 20 52 65 6d 6f 76 65 20 74  token.  Remove t
5320: 68 65 20 65 78 74 72 61 63 74 65 64 20 74 65 78  he extracted tex
5330: 74 20 66 72 6f 6d 20 74 68 65 20 73 74 72 69 6e  t from the strin
5340: 67 2e 0a 23 20 09 6d 6f 64 65 20 64 65 74 65 72  g..# .mode deter
5350: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74 68  mines whether th
5360: 65 20 66 6f 75 6e 64 20 74 6f 6b 65 6e 20 69 73  e found token is
5370: 20 72 65 6d 6f 76 65 64 3b 0a 23 20 09 69 74 20   removed;.# .it 
5380: 73 68 6f 75 6c 64 20 62 65 20 22 69 6e 63 6c 75  should be "inclu
5390: 64 65 22 20 6f 72 20 22 65 78 63 6c 75 64 65 22  de" or "exclude"
53a0: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
53b0: 0a 23 20 09 6d 6f 64 69 66 69 65 64 20 69 6e 20  .# .modified in 
53c0: 70 6c 61 63 65 2c 20 61 6e 64 20 74 68 65 20 65  place, and the e
53d0: 78 74 72 61 63 74 65 64 20 74 65 78 74 20 69 73  xtracted text is
53e0: 20 72 65 74 75 72 6e 65 64 2e 0a 0a 70 72 6f 63   returned...proc
53f0: 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70   ::textutil::exp
5400: 61 6e 64 65 72 3a 3a 45 78 74 72 61 63 74 54 6f  ander::ExtractTo
5410: 54 6f 6b 65 6e 20 7b 73 74 72 69 6e 67 20 74 6f  Token {string to
5420: 6b 65 6e 20 6d 6f 64 65 7d 20 7b 0a 20 20 20 20  ken mode} {.    
5430: 75 70 76 61 72 20 24 73 74 72 69 6e 67 20 74 68  upvar $string th
5440: 65 53 74 72 69 6e 67 0a 0a 20 20 20 20 23 20 46  eString..    # F
5450: 69 72 73 74 2c 20 64 65 74 65 72 6d 69 6e 65 20  irst, determine 
5460: 74 68 65 20 6f 66 66 73 65 74 0a 20 20 20 20 73  the offset.    s
5470: 77 69 74 63 68 20 24 6d 6f 64 65 20 7b 0a 20 20  witch $mode {.  
5480: 20 20 20 20 20 20 69 6e 63 6c 75 64 65 20 7b 20        include { 
5490: 73 65 74 20 6f 66 66 73 65 74 20 5b 65 78 70 72  set offset [expr
54a0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
54b0: 20 24 74 6f 6b 65 6e 5d 20 2d 20 31 7d 5d 20 7d   $token] - 1}] }
54c0: 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65  .        exclude
54d0: 20 7b 20 73 65 74 20 6f 66 66 73 65 74 20 2d 31   { set offset -1
54e0: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
54f0: 6c 74 20 7b 20 65 72 72 6f 72 20 22 3a 3a 65 78  lt { error "::ex
5500: 70 61 6e 64 65 72 3a 3a 45 78 74 72 61 63 74 54  pander::ExtractT
5510: 6f 54 6f 6b 65 6e 3a 20 75 6e 6b 6e 6f 77 6e 20  oToken: unknown 
5520: 6d 6f 64 65 20 24 6d 6f 64 65 22 20 7d 0a 20 20  mode $mode" }.  
5530: 20 20 7d 0a 0a 20 20 20 20 23 20 4e 65 78 74 2c    }..    # Next,
5540: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
5550: 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68  occurrence of th
5560: 65 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 73 65 74  e token..    set
5570: 20 74 6f 6b 65 6e 50 6f 73 20 5b 73 74 72 69 6e   tokenPos [strin
5580: 67 20 66 69 72 73 74 20 24 74 6f 6b 65 6e 20 24  g first $token $
5590: 74 68 65 53 74 72 69 6e 67 5d 0a 0a 20 20 20 20  theString]..    
55a0: 23 20 4e 65 78 74 2c 20 72 65 74 75 72 6e 20 74  # Next, return t
55b0: 68 65 20 65 6e 74 69 72 65 20 73 74 72 69 6e 67  he entire string
55c0: 20 69 66 20 69 74 20 77 61 73 6e 27 74 20 66 6f   if it wasn't fo
55d0: 75 6e 64 2c 20 6f 72 20 6a 75 73 74 0a 20 20 20  und, or just.   
55e0: 20 23 20 74 68 65 20 70 61 72 74 20 75 70 74 6f   # the part upto
55f0: 20 6f 72 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   or including th
5600: 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20  e character..   
5610: 20 69 66 20 7b 24 74 6f 6b 65 6e 50 6f 73 20 3d   if {$tokenPos =
5620: 3d 20 2d 31 7d 20 7b 0a 20 20 20 20 20 20 20 20  = -1} {.        
5630: 73 65 74 20 74 68 65 54 65 78 74 20 24 74 68 65  set theText $the
5640: 53 74 72 69 6e 67 0a 20 20 20 20 20 20 20 20 73  String.        s
5650: 65 74 20 74 68 65 53 74 72 69 6e 67 20 22 22 0a  et theString "".
5660: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
5670: 20 20 20 20 20 73 65 74 20 6e 65 77 45 6e 64 20       set newEnd 
5680: 20 20 20 5b 65 78 70 72 20 7b 24 74 6f 6b 65 6e     [expr {$token
5690: 50 6f 73 20 2b 20 24 6f 66 66 73 65 74 7d 5d 0a  Pos + $offset}].
56a0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 77 42          set newB
56b0: 65 67 69 6e 20 20 5b 65 78 70 72 20 7b 24 6e 65  egin  [expr {$ne
56c0: 77 45 6e 64 20 2b 20 31 7d 5d 0a 20 20 20 20 20  wEnd + 1}].     
56d0: 20 20 20 73 65 74 20 74 68 65 54 65 78 74 20 20     set theText  
56e0: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
56f0: 74 68 65 53 74 72 69 6e 67 20 30 20 24 6e 65 77  theString 0 $new
5700: 45 6e 64 5d 0a 20 20 20 20 20 20 20 20 73 65 74  End].        set
5710: 20 74 68 65 53 74 72 69 6e 67 20 5b 73 74 72 69   theString [stri
5720: 6e 67 20 72 61 6e 67 65 20 24 74 68 65 53 74 72  ng range $theStr
5730: 69 6e 67 20 24 6e 65 77 42 65 67 69 6e 20 65 6e  ing $newBegin en
5740: 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  d].    }..    re
5750: 74 75 72 6e 20 24 74 68 65 54 65 78 74 0a 7d 0a  turn $theText.}.
5760: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54 49  -------.# FUNCTI
57b0: 4f 4e 3a 0a 23 20 09 47 65 74 4d 61 63 72 6f 20  ON:.# .GetMacro 
57c0: 73 74 72 69 6e 67 0a 23 0a 23 20 49 4e 50 55 54  string.#.# INPUT
57d0: 53 3a 0a 23 09 73 74 72 69 6e 67 09 09 54 68 65  S:.#.string..The
57e0: 20 74 65 78 74 20 74 6f 20 70 72 6f 63 65 73 73   text to process
57f0: 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23  ..#.# RETURNS:.#
5800: 09 54 68 65 20 6d 61 63 72 6f 2c 20 73 74 72 69  .The macro, stri
5810: 70 70 65 64 20 6f 66 20 69 74 73 20 62 72 61 63  pped of its brac
5820: 6b 65 74 73 2e 0a 23 0a 23 20 44 45 53 43 52 49  kets..#.# DESCRI
5830: 50 54 49 4f 4e 3a 0a 0a 70 72 6f 63 20 3a 3a 74  PTION:..proc ::t
5840: 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65  extutil::expande
5850: 72 3a 3a 47 65 74 4d 61 63 72 6f 20 7b 73 74 72  r::GetMacro {str
5860: 69 6e 67 7d 20 7b 0a 20 20 20 20 75 70 76 61 72  ing} {.    upvar
5870: 20 24 73 74 72 69 6e 67 20 74 68 65 53 74 72 69   $string theStri
5880: 6e 67 0a 0a 20 20 20 20 23 20 46 49 52 53 54 2c  ng..    # FIRST,
5890: 20 69 74 27 73 20 61 6e 20 65 72 72 6f 72 20 69   it's an error i
58a0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 64 6f 65  f the string doe
58b0: 73 6e 27 74 20 62 65 67 69 6e 20 77 69 74 68 20  sn't begin with 
58c0: 61 0a 20 20 20 20 23 20 62 72 61 63 6b 65 74 2e  a.    # bracket.
58d0: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
58e0: 20 66 69 72 73 74 20 5b 47 65 74 20 6c 62 5d 20   first [Get lb] 
58f0: 24 74 68 65 53 74 72 69 6e 67 5d 20 21 3d 20 30  $theString] != 0
5900: 7d 20 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f  } {.        erro
5910: 72 20 22 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 47  r "::expander::G
5920: 65 74 4d 61 63 72 6f 3a 20 61 73 73 65 72 74 69  etMacro: asserti
5930: 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6e 65 78 74  on failure, next
5940: 20 74 65 78 74 20 69 73 6e 27 74 20 61 20 63 6f   text isn't a co
5950: 6d 6d 61 6e 64 21 20 27 24 74 68 65 53 74 72 69  mmand! '$theStri
5960: 6e 67 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ng'".    }..    
5970: 23 20 4e 45 58 54 2c 20 65 78 74 72 61 63 74 20  # NEXT, extract 
5980: 61 20 66 75 6c 6c 20 6d 61 63 72 6f 0a 20 20 20  a full macro.   
5990: 20 73 65 74 20 6d 61 63 72 6f 20 5b 45 78 74 72   set macro [Extr
59a0: 61 63 74 54 6f 54 6f 6b 65 6e 20 74 68 65 53 74  actToToken theSt
59b0: 72 69 6e 67 20 5b 47 65 74 20 6c 62 5d 20 69 6e  ring [Get lb] in
59c0: 63 6c 75 64 65 5d 0a 20 20 20 20 77 68 69 6c 65  clude].    while
59d0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
59e0: 20 24 74 68 65 53 74 72 69 6e 67 5d 20 3e 20 30   $theString] > 0
59f0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  } {.        appe
5a00: 6e 64 20 6d 61 63 72 6f 20 5b 45 78 74 72 61 63  nd macro [Extrac
5a10: 74 54 6f 54 6f 6b 65 6e 20 74 68 65 53 74 72 69  tToToken theStri
5a20: 6e 67 20 5b 47 65 74 20 72 62 5d 20 69 6e 63 6c  ng [Get rb] incl
5a30: 75 64 65 5d 0a 0a 20 20 20 20 20 20 20 20 23 20  ude]..        # 
5a40: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
5a50: 63 6f 6d 6d 61 6e 64 20 72 65 61 6c 6c 79 20 65  command really e
5a60: 6e 64 73 20 77 69 74 68 20 74 68 65 20 5b 72 62  nds with the [rb
5a70: 5d 20 63 68 61 72 61 63 74 65 72 73 2c 0a 20 20  ] characters,.  
5a80: 20 20 20 20 20 20 23 20 77 68 61 74 65 76 65 72        # whatever
5a90: 20 74 68 65 79 20 61 72 65 2e 20 20 49 66 20 6e   they are.  If n
5aa0: 6f 74 2c 20 62 72 65 61 6b 20 62 65 63 61 75 73  ot, break becaus
5ab0: 65 20 6f 66 20 75 6e 65 78 70 65 63 74 65 64 0a  e of unexpected.
5ac0: 20 20 20 20 20 20 20 20 23 20 65 6e 64 20 6f 66          # end of
5ad0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 69   file..        i
5ae0: 66 20 7b 21 5b 49 73 42 72 61 63 6b 65 74 65 64  f {![IsBracketed
5af0: 20 24 6d 61 63 72 6f 5d 7d 20 7b 0a 20 20 20 20   $macro]} {.    
5b00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5b10: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
5b20: 20 20 73 65 74 20 73 74 72 69 70 70 65 64 4d 61    set strippedMa
5b30: 63 72 6f 20 5b 53 74 72 69 70 42 72 61 63 6b 65  cro [StripBracke
5b40: 74 73 20 24 6d 61 63 72 6f 5d 0a 0a 20 20 20 20  ts $macro]..    
5b50: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 63 6f      if {[info co
5b60: 6d 70 6c 65 74 65 20 22 70 75 74 73 20 5c 5b 24  mplete "puts \[$
5b70: 73 74 72 69 70 70 65 64 4d 61 63 72 6f 5c 5d 22  strippedMacro\]"
5b80: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]} {.           
5b90: 20 72 65 74 75 72 6e 20 24 73 74 72 69 70 70 65   return $strippe
5ba0: 64 4d 61 63 72 6f 0a 20 20 20 20 20 20 20 20 7d  dMacro.        }
5bb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b  .    }..    if {
5bc0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
5bd0: 6d 61 63 72 6f 5d 20 3e 20 34 30 7d 20 7b 0a 20  macro] > 40} {. 
5be0: 20 20 20 20 20 20 20 73 65 74 20 6d 61 63 72 6f         set macro
5bf0: 20 22 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20   "[string range 
5c00: 24 6d 61 63 72 6f 20 30 20 33 39 5d 2e 2e 2e 5c  $macro 0 39]...\
5c10: 6e 22 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  n".    }.    err
5c20: 6f 72 20 22 55 6e 65 78 70 65 63 74 65 64 20 45  or "Unexpected E
5c30: 4f 46 20 69 6e 20 6d 61 63 72 6f 3a 5c 6e 24 6d  OF in macro:\n$m
5c40: 61 63 72 6f 22 0a 7d 0a 0a 23 20 53 74 72 69 70  acro".}..# Strip
5c50: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
5c60: 62 72 61 63 6b 65 74 20 74 6f 6b 65 6e 73 20 66  bracket tokens f
5c70: 72 6f 6d 20 74 68 65 20 65 6e 64 73 20 6f 66 20  rom the ends of 
5c80: 61 20 6d 61 63 72 6f 2c 0a 23 20 70 72 6f 76 69  a macro,.# provi
5c90: 64 65 64 20 74 68 61 74 20 69 74 27 73 20 70 72  ded that it's pr
5ca0: 6f 70 65 72 6c 79 20 62 72 61 63 6b 65 74 65 64  operly bracketed
5cb0: 2e 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75 74 69  ..proc ::textuti
5cc0: 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 53 74 72  l::expander::Str
5cd0: 69 70 42 72 61 63 6b 65 74 73 20 7b 6d 61 63 72  ipBrackets {macr
5ce0: 6f 7d 20 7b 0a 20 20 20 20 73 65 74 20 6c 6c 65  o} {.    set lle
5cf0: 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  n [string length
5d00: 20 5b 47 65 74 20 6c 62 5d 5d 0a 20 20 20 20 73   [Get lb]].    s
5d10: 65 74 20 72 6c 65 6e 20 5b 73 74 72 69 6e 67 20  et rlen [string 
5d20: 6c 65 6e 67 74 68 20 5b 47 65 74 20 72 62 5d 5d  length [Get rb]]
5d30: 0a 20 20 20 20 73 65 74 20 74 6c 65 6e 20 5b 73  .    set tlen [s
5d40: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 61  tring length $ma
5d50: 63 72 6f 5d 0a 0a 20 20 20 20 72 65 74 75 72 6e  cro]..    return
5d60: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
5d70: 6d 61 63 72 6f 20 24 6c 6c 65 6e 20 5b 65 78 70  macro $llen [exp
5d80: 72 20 7b 24 74 6c 65 6e 20 2d 20 24 72 6c 65 6e  r {$tlen - $rlen
5d90: 20 2d 20 31 7d 5d 5d 0a 7d 0a 0a 23 20 52 65 74   - 1}]].}..# Ret
5da0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 6d 61 63  urn 1 if the mac
5db0: 72 6f 20 69 73 20 70 72 6f 70 65 72 6c 79 20 62  ro is properly b
5dc0: 72 61 63 6b 65 74 65 64 2c 20 61 6e 64 20 30 20  racketed, and 0 
5dd0: 6f 74 68 65 72 77 69 73 65 2e 0a 70 72 6f 63 20  otherwise..proc 
5de0: 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61  ::textutil::expa
5df0: 6e 64 65 72 3a 3a 49 73 42 72 61 63 6b 65 74 65  nder::IsBrackete
5e00: 64 20 7b 6d 61 63 72 6f 7d 20 7b 0a 20 20 20 20  d {macro} {.    
5e10: 73 65 74 20 6c 6c 65 6e 20 5b 73 74 72 69 6e 67  set llen [string
5e20: 20 6c 65 6e 67 74 68 20 5b 47 65 74 20 6c 62 5d   length [Get lb]
5e30: 5d 0a 20 20 20 20 73 65 74 20 72 6c 65 6e 20 5b  ].    set rlen [
5e40: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 47  string length [G
5e50: 65 74 20 72 62 5d 5d 0a 20 20 20 20 73 65 74 20  et rb]].    set 
5e60: 74 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e  tlen [string len
5e70: 67 74 68 20 24 6d 61 63 72 6f 5d 0a 0a 20 20 20  gth $macro]..   
5e80: 20 73 65 74 20 6c 65 66 74 45 6e 64 20 20 5b 73   set leftEnd  [s
5e90: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6d 61 63  tring range $mac
5ea0: 72 6f 20 30 20 20 20 20 20 20 20 5b 65 78 70 72  ro 0       [expr
5eb0: 20 7b 24 6c 6c 65 6e 20 2d 20 31 7d 5d 5d 0a 20   {$llen - 1}]]. 
5ec0: 20 20 20 73 65 74 20 72 69 67 68 74 45 6e 64 20     set rightEnd 
5ed0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6d  [string range $m
5ee0: 61 63 72 6f 20 5b 65 78 70 72 20 7b 24 74 6c 65  acro [expr {$tle
5ef0: 6e 20 2d 20 24 72 6c 65 6e 7d 5d 20 65 6e 64 5d  n - $rlen}] end]
5f00: 0a 0a 20 20 20 20 69 66 20 7b 24 6c 65 66 74 45  ..    if {$leftE
5f10: 6e 64 20 21 3d 20 5b 47 65 74 20 6c 62 5d 7d 20  nd != [Get lb]} 
5f20: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5f30: 20 30 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20   0.    } elseif 
5f40: 7b 24 72 69 67 68 74 45 6e 64 20 21 3d 20 5b 47  {$rightEnd != [G
5f50: 65 74 20 72 62 5d 7d 20 7b 0a 20 20 20 20 20 20  et rb]} {.      
5f60: 20 20 72 65 74 75 72 6e 20 30 0a 20 20 20 20 7d    return 0.    }
5f70: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
5f80: 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 7d  return 1.    }.}
5f90: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54  --------.# FUNCT
5fe0: 49 4f 4e 3a 0a 23 20 09 4c 6f 63 49 6e 69 74 20  ION:.# .LocInit 
5ff0: 6e 61 6d 65 0a 23 0a 23 20 49 4e 50 55 54 53 3a  name.#.# INPUTS:
6000: 0a 23 09 6e 61 6d 65 09 09 54 68 65 20 65 78 70  .#.name..The exp
6010: 61 6e 64 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  ander object to 
6020: 75 73 65 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53  use..#.# RETURNS
6030: 3a 0a 23 09 4e 6f 20 72 65 73 75 6c 74 2e 0a 23  :.#.No result..#
6040: 0a 23 20 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a  .# DESCRIPTION:.
6050: 23 09 41 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  #.A convenience 
6060: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 4c  wrapper around L
6070: 6f 63 53 65 74 2e 20 49 6e 69 74 69 61 6c 69 7a  ocSet. Initializ
6080: 65 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 0a  es the location.
6090: 23 09 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  #.to the start o
60a0: 66 20 74 68 65 20 69 6e 70 75 74 20 28 63 68 61  f the input (cha
60b0: 72 20 30 2c 20 6c 69 6e 65 20 31 2c 20 63 6f 6c  r 0, line 1, col
60c0: 75 6d 6e 20 30 29 2e 0a 0a 70 72 6f 63 20 3a 3a  umn 0)...proc ::
60d0: 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64  textutil::expand
60e0: 65 72 3a 3a 4c 6f 63 49 6e 69 74 20 7b 6e 61 6d  er::LocInit {nam
60f0: 65 7d 20 7b 0a 20 20 20 20 4c 6f 63 53 65 74 20  e} {.    LocSet 
6100: 24 6e 61 6d 65 20 7b 30 20 31 20 30 7d 0a 20 20  $name {0 1 0}.  
6110: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d    return.}..#---
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23  --.# FUNCTION:.#
6170: 20 09 4c 6f 63 53 65 74 20 6e 61 6d 65 20 6c 6f   .LocSet name lo
6180: 63 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09  c.#.# INPUTS:.#.
6190: 6e 61 6d 65 09 09 54 68 65 20 65 78 70 61 6e 64  name..The expand
61a0: 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 75 73 65  er object to use
61b0: 2e 0a 23 09 6c 6f 63 09 09 4c 6f 63 61 74 69 6f  ..#.loc..Locatio
61c0: 6e 2c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  n, list containi
61d0: 6e 67 20 63 68 61 72 61 63 74 65 72 20 70 6f 73  ng character pos
61e0: 69 74 69 6f 6e 2c 0a 23 09 09 09 6c 69 6e 65 20  ition,.#...line 
61f0: 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d  number and colum
6200: 6e 2c 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  n, in this order
6210: 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23  ..#.# RETURNS:.#
6220: 09 4e 6f 20 72 65 73 75 6c 74 2e 0a 23 0a 23 20  .No result..#.# 
6230: 44 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 53  DESCRIPTION:.#.S
6240: 65 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ets the current 
6250: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
6260: 65 78 70 61 6e 64 65 72 20 74 6f 20 27 6c 6f 63  expander to 'loc
6270: 27 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74 75  '...proc ::textu
6280: 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a 4c  til::expander::L
6290: 6f 63 53 65 74 20 7b 6e 61 6d 65 20 6c 6f 63 7d  ocSet {name loc}
62a0: 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b   {.    foreach {
62b0: 63 68 20 6c 69 6e 65 20 63 6f 6c 7d 20 24 6c 6f  ch line col} $lo
62c0: 63 20 62 72 65 61 6b 0a 20 20 20 20 4f 70 5f 63  c break.    Op_c
62d0: 73 65 74 20 20 24 6e 61 6d 65 20 63 68 61 72 20  set  $name char 
62e0: 24 63 68 0a 20 20 20 20 4f 70 5f 63 73 65 74 20  $ch.    Op_cset 
62f0: 20 24 6e 61 6d 65 20 6c 69 6e 65 20 24 6c 69 6e   $name line $lin
6300: 65 0a 20 20 20 20 4f 70 5f 63 73 65 74 20 20 24  e.    Op_cset  $
6310: 6e 61 6d 65 20 63 6f 6c 20 20 24 63 6f 6c 0a 20  name col  $col. 
6320: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d     return.}..#--
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a  ---.# FUNCTION:.
6380: 23 20 09 4c 6f 63 47 65 74 20 6e 61 6d 65 0a 23  # .LocGet name.#
6390: 0a 23 20 49 4e 50 55 54 53 3a 0a 23 09 6e 61 6d  .# INPUTS:.#.nam
63a0: 65 09 09 54 68 65 20 65 78 70 61 6e 64 65 72 20  e..The expander 
63b0: 6f 62 6a 65 63 74 20 74 6f 20 75 73 65 2e 0a 23  object to use..#
63c0: 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23 09 41 20  .# RETURNS:.#.A 
63d0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
63e0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72  the current char
63f0: 61 63 74 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20  acter position, 
6400: 6c 69 6e 65 20 6e 75 6d 62 65 72 0a 23 09 61 6e  line number.#.an
6410: 64 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 68 69  d column, in thi
6420: 73 20 6f 72 64 65 72 2e 0a 23 0a 23 20 44 45 53  s order..#.# DES
6430: 43 52 49 50 54 49 4f 4e 3a 0a 23 09 52 65 74 75  CRIPTION:.#.Retu
6440: 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rns the current 
6450: 6c 6f 63 61 74 69 6f 6e 20 61 73 20 73 74 6f 72  location as stor
6460: 65 64 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  ed in the expand
6470: 65 72 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74  er...proc ::text
6480: 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a  util::expander::
6490: 4c 6f 63 47 65 74 20 7b 6e 61 6d 65 7d 20 7b 0a  LocGet {name} {.
64a0: 20 20 20 20 6c 69 73 74 20 5b 4f 70 5f 63 67 65      list [Op_cge
64b0: 74 20 24 6e 61 6d 65 20 63 68 61 72 5d 20 5b 4f  t $name char] [O
64c0: 70 5f 63 67 65 74 20 24 6e 61 6d 65 20 6c 69 6e  p_cget $name lin
64d0: 65 5d 20 5b 4f 70 5f 63 67 65 74 20 24 6e 61 6d  e] [Op_cget $nam
64e0: 65 20 63 6f 6c 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  e col].}..#-----
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6530: 0a 23 20 46 55 4e 43 54 49 4f 4e 3a 0a 23 20 09  .# FUNCTION:.# .
6540: 4c 6f 63 55 70 64 61 74 65 20 6e 61 6d 65 20 74  LocUpdate name t
6550: 65 78 74 0a 23 0a 23 20 49 4e 50 55 54 53 3a 0a  ext.#.# INPUTS:.
6560: 23 09 6e 61 6d 65 09 09 54 68 65 20 65 78 70 61  #.name..The expa
6570: 6e 64 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 75  nder object to u
6580: 73 65 2e 0a 23 09 74 65 78 74 09 09 54 68 65 20  se..#.text..The 
6590: 74 65 78 74 20 74 6f 20 70 72 6f 63 65 73 73 2e  text to process.
65a0: 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a 23 09  .#.# RETURNS:.#.
65b0: 4e 6f 20 72 65 73 75 6c 74 2e 0a 23 0a 23 20 44  No result..#.# D
65c0: 45 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 54 61  ESCRIPTION:.#.Ta
65d0: 6b 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  kes the current 
65e0: 6c 6f 63 61 74 69 6f 6e 20 61 73 20 73 74 6f 72  location as stor
65f0: 65 64 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  ed in the expand
6600: 65 72 2c 20 63 6f 6d 70 75 74 65 73 0a 23 09 61  er, computes.#.a
6610: 20 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 20 62 61   new location ba
6620: 73 65 64 20 6f 6e 20 74 68 65 20 73 74 72 69 6e  sed on the strin
6630: 67 20 28 69 74 73 20 6c 65 6e 67 74 68 20 61 6e  g (its length an
6640: 64 20 63 6f 6e 74 65 6e 74 73 0a 23 09 28 6e 75  d contents.#.(nu
6650: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 29 29 2c  mber of lines)),
6660: 20 61 6e 64 20 6d 61 6b 65 73 20 74 68 61 74 20   and makes that 
6670: 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 20 74 68 65  new location the
6680: 20 63 75 72 72 65 6e 74 0a 23 09 6c 6f 63 61 74   current.#.locat
6690: 69 6f 6e 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78  ion...proc ::tex
66a0: 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a  tutil::expander:
66b0: 3a 4c 6f 63 55 70 64 61 74 65 20 7b 6e 61 6d 65  :LocUpdate {name
66c0: 20 74 65 78 74 7d 20 7b 0a 20 20 20 20 66 6f 72   text} {.    for
66d0: 65 61 63 68 20 7b 63 68 20 6c 69 6e 65 20 63 6f  each {ch line co
66e0: 6c 7d 20 5b 4c 6f 63 47 65 74 20 24 6e 61 6d 65  l} [LocGet $name
66f0: 5d 20 62 72 65 61 6b 0a 20 20 20 20 73 65 74 20  ] break.    set 
6700: 6e 75 6d 63 68 61 72 73 20 5b 73 74 72 69 6e 67  numchars [string
6710: 20 6c 65 6e 67 74 68 20 24 74 65 78 74 5d 0a 20   length $text]. 
6720: 20 20 20 23 38 2e 34 2b 20 73 65 74 20 6e 75 6d     #8.4+ set num
6730: 6c 69 6e 65 73 20 5b 72 65 67 65 78 70 20 2d 61  lines [regexp -a
6740: 6c 6c 20 22 5c 6e 22 20 24 74 65 78 74 5d 0a 20  ll "\n" $text]. 
6750: 20 20 20 73 65 74 20 6e 75 6d 6c 69 6e 65 73 20     set numlines 
6760: 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20  [expr {[llength 
6770: 5b 73 70 6c 69 74 20 24 74 65 78 74 20 5c 6e 5d  [split $text \n]
6780: 5d 2d 31 7d 5d 0a 0a 20 20 20 20 69 6e 63 72 20  ]-1}]..    incr 
6790: 63 68 20 20 20 24 6e 75 6d 63 68 61 72 73 0a 20  ch   $numchars. 
67a0: 20 20 20 69 6e 63 72 20 6c 69 6e 65 20 24 6e 75     incr line $nu
67b0: 6d 6c 69 6e 65 73 0a 20 20 20 20 69 66 20 7b 24  mlines.    if {$
67c0: 6e 75 6d 6c 69 6e 65 73 7d 20 7b 0a 09 73 65 74  numlines} {..set
67d0: 20 63 6f 6c 20 5b 65 78 70 72 20 7b 24 6e 75 6d   col [expr {$num
67e0: 63 68 61 72 73 20 2d 20 5b 73 74 72 69 6e 67 20  chars - [string 
67f0: 6c 61 73 74 20 5c 6e 20 24 74 65 78 74 5d 20 2d  last \n $text] -
6800: 20 31 7d 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20   1}].    } else 
6810: 7b 0a 09 69 6e 63 72 20 63 6f 6c 20 24 6e 75 6d  {..incr col $num
6820: 63 68 61 72 73 0a 20 20 20 20 7d 0a 0a 20 20 20  chars.    }..   
6830: 20 4c 6f 63 53 65 74 20 24 6e 61 6d 65 20 5b 6c   LocSet $name [l
6840: 69 73 74 20 24 63 68 20 24 6c 69 6e 65 20 24 63  ist $ch $line $c
6850: 6f 6c 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d  ol].    return.}
6860: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55 4e 43 54  --------.# FUNCT
68b0: 49 4f 4e 3a 0a 23 20 09 4c 6f 63 52 61 6e 67 65  ION:.# .LocRange
68c0: 20 6e 61 6d 65 20 74 65 78 74 0a 23 0a 23 20 49   name text.#.# I
68d0: 4e 50 55 54 53 3a 0a 23 09 6e 61 6d 65 09 09 54  NPUTS:.#.name..T
68e0: 68 65 20 65 78 70 61 6e 64 65 72 20 6f 62 6a 65  he expander obje
68f0: 63 74 20 74 6f 20 75 73 65 2e 0a 23 09 74 65 78  ct to use..#.tex
6900: 74 09 09 54 68 65 20 74 65 78 74 20 74 6f 20 70  t..The text to p
6910: 72 6f 63 65 73 73 2e 0a 23 0a 23 20 52 45 54 55  rocess..#.# RETU
6920: 52 4e 53 3a 0a 23 09 41 20 74 65 78 74 20 72 61  RNS:.#.A text ra
6930: 6e 67 65 20 64 65 73 63 72 69 70 74 69 6f 6e 2c  nge description,
6940: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
6950: 20 74 68 65 20 27 6c 6f 63 61 74 69 6f 6e 27 20   the 'location' 
6960: 64 61 74 61 0a 23 09 75 73 65 64 20 69 6e 20 74  data.#.used in t
6970: 68 65 20 74 63 6c 20 64 65 62 75 67 67 65 72 2f  he tcl debugger/
6980: 63 68 65 63 6b 65 72 2e 0a 23 0a 23 20 44 45 53  checker..#.# DES
6990: 43 52 49 50 54 49 4f 4e 3a 0a 23 09 54 61 6b 65  CRIPTION:.#.Take
69a0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
69b0: 63 61 74 69 6f 6e 20 61 73 20 73 74 6f 72 65 64  cation as stored
69c0: 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 72   in the expander
69d0: 20 6f 62 6a 65 63 74 0a 23 09 61 6e 64 20 74 68   object.#.and th
69e0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
69f0: 74 65 78 74 20 74 6f 20 67 65 6e 65 72 61 74 65  text to generate
6a00: 20 61 20 63 68 61 72 61 63 74 65 72 20 72 61 6e   a character ran
6a10: 67 65 2e 0a 0a 70 72 6f 63 20 3a 3a 74 65 78 74  ge...proc ::text
6a20: 75 74 69 6c 3a 3a 65 78 70 61 6e 64 65 72 3a 3a  util::expander::
6a30: 4c 6f 63 52 61 6e 67 65 20 7b 6e 61 6d 65 20 74  LocRange {name t
6a40: 65 78 74 7d 20 7b 0a 20 20 20 20 23 20 4e 6f 74  ext} {.    # Not
6a50: 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75 63  e that the struc
6a60: 74 75 72 65 20 69 73 20 63 6f 6d 70 61 74 69 62  ture is compatib
6a70: 6c 65 20 77 69 74 68 0a 20 20 20 20 23 20 74 68  le with.    # th
6a80: 65 20 72 61 6e 67 65 73 20 75 73 65 73 20 62 79  e ranges uses by
6a90: 20 74 63 6c 20 64 65 62 75 67 67 65 72 20 61 6e   tcl debugger an
6aa0: 64 20 63 68 65 63 6b 65 72 2e 0a 20 20 20 20 23  d checker..    #
6ab0: 20 7b 6c 69 6e 65 20 7b 63 68 61 72 70 6f 73 20   {line {charpos 
6ac0: 6c 65 6e 67 74 68 7d 7d 0a 0a 20 20 20 20 66 6f  length}}..    fo
6ad0: 72 65 61 63 68 20 7b 63 68 20 6c 69 6e 65 20 63  reach {ch line c
6ae0: 6f 6c 7d 20 5b 4c 6f 63 47 65 74 20 24 6e 61 6d  ol} [LocGet $nam
6af0: 65 5d 20 62 72 65 61 6b 0a 20 20 20 20 72 65 74  e] break.    ret
6b00: 75 72 6e 20 5b 6c 69 73 74 20 24 6c 69 6e 65 20  urn [list $line 
6b10: 5b 6c 69 73 74 20 24 63 68 20 5b 73 74 72 69 6e  [list $ch [strin
6b20: 67 20 6c 65 6e 67 74 68 20 24 74 65 78 74 5d 5d  g length $text]]
6b30: 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ].}..#----------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 46 55  -----------.# FU
6b80: 4e 43 54 49 4f 4e 3a 0a 23 20 09 44 69 73 70 6c  NCTION:.# .Displ
6b90: 61 79 4f 66 20 74 65 78 74 0a 23 0a 23 20 49 4e  ayOf text.#.# IN
6ba0: 50 55 54 53 3a 0a 23 09 74 65 78 74 09 09 54 68  PUTS:.#.text..Th
6bb0: 65 20 74 65 78 74 20 74 6f 20 70 72 6f 63 65 73  e text to proces
6bc0: 73 2e 0a 23 0a 23 20 52 45 54 55 52 4e 53 3a 0a  s..#.# RETURNS:.
6bd0: 23 09 54 68 65 20 74 65 78 74 2c 20 63 75 74 20  #.The text, cut 
6be0: 64 6f 77 6e 20 74 6f 20 61 74 20 6d 6f 73 74 20  down to at most 
6bf0: 33 30 20 62 79 74 65 73 2e 0a 23 0a 23 20 44 45  30 bytes..#.# DE
6c00: 53 43 52 49 50 54 49 4f 4e 3a 0a 23 09 43 75 74  SCRIPTION:.#.Cut
6c10: 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 74  s the incoming t
6c20: 65 78 74 20 64 6f 77 6e 20 74 6f 20 63 6f 6e 74  ext down to cont
6c30: 61 69 6e 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  ain no more than
6c40: 20 33 30 0a 23 09 63 68 61 72 61 63 74 65 72 73   30.#.characters
6c50: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 2e 20 41   of the input. A
6c60: 64 64 73 20 61 6e 20 65 6c 6c 69 70 73 69 73 20  dds an ellipsis 
6c70: 28 2e 2e 2e 29 20 69 66 20 63 68 61 72 61 63 74  (...) if charact
6c80: 65 72 73 0a 23 09 77 65 72 65 20 61 63 74 75 61  ers.#.were actua
6c90: 6c 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  lly removed from
6ca0: 20 74 68 65 20 69 6e 70 75 74 2e 0a 0a 70 72 6f   the input...pro
6cb0: 63 20 3a 3a 74 65 78 74 75 74 69 6c 3a 3a 65 78  c ::textutil::ex
6cc0: 70 61 6e 64 65 72 3a 3a 44 69 73 70 6c 61 79 4f  pander::DisplayO
6cd0: 66 20 7b 74 65 78 74 7d 20 7b 0a 20 20 20 20 73  f {text} {.    s
6ce0: 65 74 20 65 6c 6c 69 70 20 22 22 0a 20 20 20 20  et ellip "".    
6cf0: 77 68 69 6c 65 20 7b 5b 73 74 72 69 6e 67 20 62  while {[string b
6d00: 79 74 65 6c 65 6e 67 74 68 20 24 74 65 78 74 5d  ytelength $text]
6d10: 20 3e 20 33 30 7d 20 7b 0a 09 73 65 74 20 65 6c   > 30} {..set el
6d20: 6c 69 70 20 2e 2e 2e 0a 09 73 65 74 20 74 65 78  lip .....set tex
6d30: 74 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  t [string range 
6d40: 24 74 65 78 74 20 30 20 65 6e 64 2d 31 5d 0a 20  $text 0 end-1]. 
6d50: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 64 69 73     }.    set dis
6d60: 70 6c 61 79 20 24 74 65 78 74 24 65 6c 6c 69 70  play $text$ellip
6d70: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50 72 6f  ----------.# Pro
6dc0: 76 69 64 65 20 74 68 65 20 70 61 63 6b 61 67 65  vide the package
6dd0: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 63 6f 64   only if the cod
6de0: 65 20 61 62 6f 76 65 20 77 61 73 20 72 65 61 64  e above was read
6df0: 20 61 6e 64 20 65 78 65 63 75 74 65 64 0a 23 20   and executed.# 
6e00: 77 69 74 68 6f 75 74 20 65 72 72 6f 72 2e 0a 0a  without error...
6e10: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
6e20: 74 65 78 74 75 74 69 6c 3a 3a 65 78 70 61 6e 64  textutil::expand
6e30: 65 72 20 31 2e 33 0a                             er 1.3.