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.