System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 002ce907da8f1d2675c96d4a5497b199f3792805:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 74 65 73 74 2e 65 61 67 6c 65  .#..# test.eagle
0060: 20 2d 2d 0d 0a 23 0d 0a 23 20 45 78 74 65 6e 73   --..#..# Extens
0070: 69 62 6c 65 20 41 64 61 70 74 61 62 6c 65 20 47  ible Adaptable G
0080: 65 6e 65 72 61 6c 69 7a 65 64 20 4c 6f 67 69 63  eneralized Logic
0090: 20 45 6e 67 69 6e 65 20 28 45 61 67 6c 65 29 0d   Engine (Eagle).
00a0: 0a 23 20 45 61 67 6c 65 20 54 65 73 74 20 50 61  .# Eagle Test Pa
00b0: 63 6b 61 67 65 20 46 69 6c 65 0d 0a 23 0d 0a 23  ckage File..#..#
00c0: 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32   Copyright (c) 2
00d0: 30 30 37 2d 32 30 31 32 20 62 79 20 4a 6f 65 20  007-2012 by Joe 
00e0: 4d 69 73 74 61 63 68 6b 69 6e 2e 20 20 41 6c 6c  Mistachkin.  All
00f0: 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64   rights reserved
0100: 2e 0d 0a 23 0d 0a 23 20 53 65 65 20 74 68 65 20  ...#..# See the 
0110: 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 65  file "license.te
0120: 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d 61  rms" for informa
0130: 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 6e  tion on usage an
0140: 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e  d redistribution
0150: 20 6f 66 0d 0a 23 20 74 68 69 73 20 66 69 6c 65   of..# this file
0160: 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 43  , and for a DISC
0170: 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 41  LAIMER OF ALL WA
0180: 52 52 41 4e 54 49 45 53 2e 0d 0a 23 0d 0a 23 20  RRANTIES...#..# 
0190: 52 43 53 3a 20 40 28 23 29 20 24 49 64 3a 20 24  RCS: @(#) $Id: $
01a0: 0d 0a 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23  ..#..###########
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01f0: 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54  ####....#..# NOT
0200: 45 3a 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e  E: Use our own n
0210: 61 6d 65 73 70 61 63 65 20 68 65 72 65 20 62 65  amespace here be
0220: 63 61 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67  cause even thoug
0230: 68 20 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65  h we do not dire
0240: 63 74 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75  ctly..#       su
0250: 70 70 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73  pport namespaces
0260: 20 6f 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64   ourselves, we d
0270: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f  o not want to po
0280: 6c 6c 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c  llute the global
0290: 0d 0a 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70  ..#       namesp
02a0: 61 63 65 20 69 66 20 74 68 69 73 20 73 63 72 69  ace if this scri
02b0: 70 74 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73  pt actually ends
02c0: 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61   up being evalua
02d0: 74 65 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a  ted in Tcl...#..
02e0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a  namespace eval :
02f0: 3a 45 61 67 6c 65 20 7b 0d 0a 20 20 70 72 6f 63  :Eagle {..  proc
0300: 20 64 75 6d 70 53 74 61 74 65 20 7b 7d 20 7b 0d   dumpState {} {.
0310: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
0320: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 66 6f  [list]....    fo
0330: 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 5b 6c  reach varName [l
0340: 73 6f 72 74 20 5b 75 70 6c 65 76 65 6c 20 31 20  sort [uplevel 1 
0350: 5b 6c 69 73 74 20 69 6e 66 6f 20 76 61 72 73 5d  [list info vars]
0360: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]] {..      if {
0370: 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
0380: 20 61 72 72 61 79 20 65 78 69 73 74 73 20 24 76   array exists $v
0390: 61 72 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e 20 7b  arName]]} then {
03a0: 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
03b0: 64 20 72 65 73 75 6c 74 20 24 76 61 72 4e 61 6d  d result $varNam
03c0: 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  e [list \..     
03d0: 20 20 20 20 20 20 20 61 72 72 61 79 20 5b 75 70         array [up
03e0: 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72  level 1 [list ar
03f0: 72 61 79 20 67 65 74 20 24 76 61 72 4e 61 6d 65  ray get $varName
0400: 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ]]]..      } els
0410: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  e {..        lap
0420: 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61 72  pend result $var
0430: 4e 61 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  Name [list \..  
0440: 20 20 20 20 20 20 20 20 20 20 73 63 61 6c 61 72            scalar
0450: 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
0460: 74 20 73 65 74 20 24 76 61 72 4e 61 6d 65 5d 5d  t set $varName]]
0470: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
0480: 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  }....    return 
0490: 24 72 65 73 75 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d  $result..  }....
04a0: 0a 20 20 70 72 6f 63 20 74 72 61 77 70 75 74 73  .  proc trawputs
04b0: 20 7b 20 63 68 61 6e 6e 65 6c 20 73 74 72 69 6e   { channel strin
04c0: 67 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  g } {..    #..  
04d0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 6e 20    # NOTE: If an 
04e0: 6f 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 77  output channel w
04f0: 61 73 20 70 72 6f 76 69 64 65 64 2c 20 75 73 65  as provided, use
0500: 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20   it; otherwise, 
0510: 69 67 6e 6f 72 65 0d 0a 20 20 20 20 23 20 20 20  ignore..    #   
0520: 20 20 20 20 74 68 65 20 6d 65 73 73 61 67 65 2e      the message.
0530: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
0540: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
0550: 24 63 68 61 6e 6e 65 6c 5d 20 3e 20 30 7d 20 74  $channel] > 0} t
0560: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  hen {..      #..
0570: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
0580: 65 63 6b 20 69 66 20 6f 75 74 70 75 74 20 69 73  eck if output is
0590: 20 62 65 69 6e 67 20 61 63 74 69 76 65 6c 79 20   being actively 
05a0: 69 6e 74 65 72 63 65 70 74 65 64 20 62 79 20 75  intercepted by u
05b0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
05c0: 20 20 20 69 66 20 7b 21 5b 69 73 45 61 67 6c 65     if {![isEagle
05d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
05e0: 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f    [llength [info
05f0: 20 63 6f 6d 6d 61 6e 64 73 20 3a 3a 74 63 6c 3a   commands ::tcl:
0600: 3a 73 61 76 65 3a 3a 70 75 74 73 5d 5d 20 3e 20  :save::puts]] > 
0610: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0620: 20 20 20 3a 3a 74 63 6c 3a 3a 73 61 76 65 3a 3a     ::tcl::save::
0630: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
0640: 24 63 68 61 6e 6e 65 6c 20 24 73 74 72 69 6e 67  $channel $string
0650: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
0660: 0d 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 2d  ..        puts -
0670: 6e 6f 6e 65 77 6c 69 6e 65 20 24 63 68 61 6e 6e  nonewline $chann
0680: 65 6c 20 24 73 74 72 69 6e 67 0d 0a 20 20 20 20  el $string..    
0690: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
06a0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 74 70 75 74 73  ....  proc tputs
06b0: 20 7b 20 63 68 61 6e 6e 65 6c 20 73 74 72 69 6e   { channel strin
06c0: 67 20 7d 20 7b 0d 0a 20 20 20 20 74 72 61 77 70  g } {..    trawp
06d0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 24 73 74  uts $channel $st
06e0: 72 69 6e 67 3b 20 74 6c 6f 67 20 24 73 74 72 69  ring; tlog $stri
06f0: 6e 67 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d  ng..  }.....  #.
0700: 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  .  # NOTE: This 
0710: 69 73 20 61 20 73 68 69 6d 20 64 65 73 69 67 6e  is a shim design
0720: 65 64 20 74 6f 20 61 63 74 20 6c 69 6b 65 20 74  ed to act like t
0730: 63 6c 4c 6f 67 2e 0d 0a 20 20 23 0d 0a 20 20 70  clLog...  #..  p
0740: 72 6f 63 20 74 74 63 6c 4c 6f 67 20 7b 20 73 74  roc ttclLog { st
0750: 72 69 6e 67 20 7d 20 7b 0d 0a 20 20 20 20 74 70  ring } {..    tp
0760: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
0770: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
0780: 24 73 74 72 69 6e 67 20 5c 6e 5d 0d 0a 20 20 7d  $string \n]..  }
0790: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 64 6f 65 73  .....  proc does
07a0: 54 65 73 74 4c 6f 67 46 69 6c 65 45 78 69 73 74  TestLogFileExist
07b0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
07c0: 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20  .    if {[catch 
07d0: 7b 0d 0a 20 20 20 20 20 20 65 78 70 72 20 7b 5b  {..      expr {[
07e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
07f0: 65 4e 61 6d 65 5d 20 26 26 20 5b 66 69 6c 65 20  eName] && [file 
0800: 73 69 7a 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20  size $fileName] 
0810: 3e 20 30 7d 0d 0a 20 20 20 20 7d 20 72 65 73 75  > 0}..    } resu
0820: 6c 74 5d 20 3d 3d 20 30 20 26 26 20 24 72 65 73  lt] == 0 && $res
0830: 75 6c 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ult} then {..   
0840: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
0850: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0860: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
0870: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
0880: 0a 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4c  .  proc getTestL
0890: 6f 67 53 74 61 72 74 53 65 6e 74 72 79 20 7b 7d  ogStartSentry {}
08a0: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e   {..    if {![in
08b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
08c0: 5f 72 75 6e 5f 69 64 5d 7d 20 74 68 65 6e 20 7b  _run_id]} then {
08d0: 0d 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65  ..      set ::te
08e0: 73 74 5f 72 75 6e 5f 69 64 20 5b 67 65 74 4e 65  st_run_id [getNe
08f0: 77 54 65 73 74 52 75 6e 49 64 5d 0d 0a 20 20 20  wTestRunId]..   
0900: 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e   }....    return
0910: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
0920: 20 20 20 20 20 20 20 20 22 2a 2a 2a 2a 20 53 54          "**** ST
0930: 41 52 54 20 4f 46 20 54 45 53 54 20 4c 4f 47 20  ART OF TEST LOG 
0940: 5c 22 22 20 24 3a 3a 74 65 73 74 5f 72 75 6e 5f  \"" $::test_run_
0950: 69 64 20 22 5c 22 20 2a 2a 2a 2a 5c 6e 22 5d 0d  id "\" ****\n"].
0960: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
0970: 65 78 74 72 61 63 74 54 65 73 74 52 75 6e 49 64  extractTestRunId
0980: 46 72 6f 6d 4c 6f 67 53 74 61 72 74 53 65 6e 74  FromLogStartSent
0990: 72 79 20 7b 20 73 65 6e 74 72 79 20 7d 20 7b 0d  ry { sentry } {.
09a0: 0a 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20  .    set prefix 
09b0: 7b 5e 5c 2a 5c 2a 5c 2a 5c 2a 20 53 54 41 52 54  {^\*\*\*\* START
09c0: 20 4f 46 20 54 45 53 54 20 4c 4f 47 20 22 7d 0d   OF TEST LOG "}.
09d0: 0a 20 20 20 20 73 65 74 20 73 75 66 66 69 78 20  .    set suffix 
09e0: 7b 22 20 5c 2a 5c 2a 5c 2a 5c 2a 5c 6e 24 7d 0d  {" \*\*\*\*\n$}.
09f0: 0a 0d 0a 20 20 20 20 73 65 74 20 70 61 74 74 65  ...    set patte
0a00: 72 6e 28 31 29 20 5b 61 70 70 65 6e 64 41 72 67  rn(1) [appendArg
0a10: 73 20 24 70 72 65 66 69 78 20 7b 28 5b 30 2d 39  s $prefix {([0-9
0a20: 41 2d 46 5d 7b 35 36 7d 29 7d 20 24 73 75 66 66  A-F]{56})} $suff
0a30: 69 78 5d 3b 20 23 20 54 63 6c 0d 0a 0d 0a 20 20  ix]; # Tcl....  
0a40: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d    if {[regexp --
0a50: 20 24 70 61 74 74 65 72 6e 28 31 29 20 24 73 65   $pattern(1) $se
0a60: 6e 74 72 79 20 64 75 6d 6d 79 20 72 65 73 75 6c  ntry dummy resul
0a70: 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
0a80: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
0a90: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73  ..    }....    s
0aa0: 65 74 20 70 61 74 74 65 72 6e 28 32 29 20 5b 61  et pattern(2) [a
0ab0: 70 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69  ppendArgs $prefi
0ac0: 78 20 7b 28 5b 30 2d 39 41 2d 46 5d 7b 36 34 7d  x {([0-9A-F]{64}
0ad0: 29 7d 20 24 73 75 66 66 69 78 5d 3b 20 23 20 45  )} $suffix]; # E
0ae0: 61 67 6c 65 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  agle....    if {
0af0: 5b 72 65 67 65 78 70 20 2d 2d 20 24 70 61 74 74  [regexp -- $patt
0b00: 65 72 6e 28 32 29 20 24 73 65 6e 74 72 79 20 64  ern(2) $sentry d
0b10: 75 6d 6d 79 20 72 65 73 75 6c 74 5d 7d 20 74 68  ummy result]} th
0b20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75  en {..      retu
0b30: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
0b40: 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  }....    return 
0b50: 3c 6e 6f 6e 65 3e 0d 0a 20 20 7d 0d 0a 0c 0d 0a  <none>..  }.....
0b60: 20 20 70 72 6f 63 20 64 6f 65 73 54 65 73 74 4c    proc doesTestL
0b70: 6f 67 48 61 76 65 53 74 61 72 74 53 65 6e 74 72  ogHaveStartSentr
0b80: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20  y {} {..    set 
0b90: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 54 65 73  fileName [getTes
0ba0: 74 4c 6f 67 5d 0d 0a 0d 0a 20 20 20 20 69 66 20  tLog]....    if 
0bb0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
0bc0: 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
0bd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66  then {..      if
0be0: 20 7b 5b 64 6f 65 73 54 65 73 74 4c 6f 67 46 69   {[doesTestLogFi
0bf0: 6c 65 45 78 69 73 74 20 24 66 69 6c 65 4e 61 6d  leExist $fileNam
0c00: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
0c10: 20 20 20 20 73 65 74 20 73 65 6e 74 72 79 20 5b      set sentry [
0c20: 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 67 65 74  string trim [get
0c30: 54 65 73 74 4c 6f 67 53 74 61 72 74 53 65 6e 74  TestLogStartSent
0c40: 72 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry]]....        
0c50: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
0c60: 74 68 20 24 73 65 6e 74 72 79 5d 20 3e 20 30 7d  th $sentry] > 0}
0c70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0c80: 20 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61     set data [rea
0c90: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 5d  dFile $fileName]
0ca0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
0cb0: 20 7b 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20   {[string first 
0cc0: 24 73 65 6e 74 72 79 20 24 64 61 74 61 5d 20 21  $sentry $data] !
0cd0: 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
0ce0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0cf0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
0d00: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
0d10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
0d20: 0a 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73  .    return fals
0d30: 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  e..  }.....  pro
0d40: 63 20 64 69 64 54 65 73 74 4c 6f 67 48 61 76 65  c didTestLogHave
0d50: 53 74 61 72 74 53 65 6e 74 72 79 20 7b 20 73 65  StartSentry { se
0d60: 6e 74 72 79 20 76 61 72 4e 61 6d 65 20 7d 20 7b  ntry varName } {
0d70: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
0d80: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f  exists ::test_lo
0d90: 67 5f 73 65 6e 74 72 79 5d 7d 20 74 68 65 6e 20  g_sentry]} then 
0da0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 3a 3a  {..      if {$::
0db0: 74 65 73 74 5f 6c 6f 67 5f 73 65 6e 74 72 79 20  test_log_sentry 
0dc0: 6e 65 20 24 73 65 6e 74 72 79 7d 20 74 68 65 6e  ne $sentry} then
0dd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
0de0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 65 72 72  r 1 $varName err
0df0: 6f 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  or....        se
0e00: 74 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41  t error [appendA
0e10: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
0e20: 20 20 20 22 2d 2d 2d 2d 20 74 65 73 74 20 6c 6f     "---- test lo
0e30: 67 20 73 74 61 72 74 20 73 65 6e 74 72 79 20 6d  g start sentry m
0e40: 69 73 6d 61 74 63 68 20 65 72 72 6f 72 2c 20 77  ismatch error, w
0e50: 61 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  as \"" \..      
0e60: 20 20 20 20 20 20 5b 65 78 74 72 61 63 74 54 65        [extractTe
0e70: 73 74 52 75 6e 49 64 46 72 6f 6d 4c 6f 67 53 74  stRunIdFromLogSt
0e80: 61 72 74 53 65 6e 74 72 79 20 24 3a 3a 74 65 73  artSentry $::tes
0e90: 74 5f 6c 6f 67 5f 73 65 6e 74 72 79 5d 20 5c 0d  t_log_sentry] \.
0ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
0eb0: 2c 20 6e 6f 77 20 5c 22 22 20 5b 65 78 74 72 61  , now \"" [extra
0ec0: 63 74 54 65 73 74 52 75 6e 49 64 46 72 6f 6d 4c  ctTestRunIdFromL
0ed0: 6f 67 53 74 61 72 74 53 65 6e 74 72 79 20 24 73  ogStartSentry $s
0ee0: 65 6e 74 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  entry] \..      
0ef0: 20 20 20 20 20 20 5c 22 5c 6e 5d 0d 0a 20 20 20        \"\n]..   
0f00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
0f10: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
0f20: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 72   else {..      r
0f30: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
0f40: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
0f50: 6f 63 20 73 65 74 54 65 73 74 4c 6f 67 53 74 61  oc setTestLogSta
0f60: 72 74 53 65 6e 74 72 79 20 7b 20 73 65 6e 74 72  rtSentry { sentr
0f70: 79 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20  y varName } {.. 
0f80: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
0f90: 61 6d 65 20 72 65 73 75 6c 74 0d 0a 0d 0a 20 20  ame result....  
0fa0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0fb0: 74 73 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 73 65  ts ::test_log_se
0fc0: 6e 74 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ntry]} then {.. 
0fd0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
0fe0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
0ff0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 74           "---- t
1000: 65 73 74 20 6c 6f 67 20 73 74 61 72 74 20 73 65  est log start se
1010: 6e 74 72 79 20 72 65 69 6e 69 74 69 61 6c 69 7a  ntry reinitializ
1020: 65 64 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  ed to \"" \..   
1030: 20 20 20 20 20 20 20 5b 65 78 74 72 61 63 74 54         [extractT
1040: 65 73 74 52 75 6e 49 64 46 72 6f 6d 4c 6f 67 53  estRunIdFromLogS
1050: 74 61 72 74 53 65 6e 74 72 79 20 24 73 65 6e 74  tartSentry $sent
1060: 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
1070: 20 22 5c 22 2c 20 77 61 73 20 5c 22 22 20 5b 65   "\", was \"" [e
1080: 78 74 72 61 63 74 54 65 73 74 52 75 6e 49 64 46  xtractTestRunIdF
1090: 72 6f 6d 4c 6f 67 53 74 61 72 74 53 65 6e 74 72  romLogStartSentr
10a0: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  y \..          $
10b0: 3a 3a 74 65 73 74 5f 6c 6f 67 5f 73 65 6e 74 72  ::test_log_sentr
10c0: 79 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 7d 20  y] \"\n]..    } 
10d0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 73 65  else {..      se
10e0: 74 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64  t result [append
10f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1100: 20 20 22 2d 2d 2d 2d 20 74 65 73 74 20 6c 6f 67    "---- test log
1110: 20 73 74 61 72 74 20 73 65 6e 74 72 79 20 69 6e   start sentry in
1120: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 5c 22 22  itialized to \""
1130: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65   \..          [e
1140: 78 74 72 61 63 74 54 65 73 74 52 75 6e 49 64 46  xtractTestRunIdF
1150: 72 6f 6d 4c 6f 67 53 74 61 72 74 53 65 6e 74 72  romLogStartSentr
1160: 79 20 24 73 65 6e 74 72 79 5d 20 5c 0d 0a 20 20  y $sentry] \..  
1170: 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d 0d 0a 20          \"\n].. 
1180: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65 74 20     }....    set 
1190: 3a 3a 74 65 73 74 5f 6c 6f 67 5f 73 65 6e 74 72  ::test_log_sentr
11a0: 79 20 24 73 65 6e 74 72 79 0d 0a 20 20 7d 0d 0a  y $sentry..  }..
11b0: 0c 0d 0a 20 20 70 72 6f 63 20 74 6c 6f 67 20 7b  ...  proc tlog {
11c0: 20 73 74 72 69 6e 67 20 7d 20 7b 0d 0a 20 20 20   string } {..   
11d0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
11e0: 49 66 20 61 20 74 65 73 74 20 6c 6f 67 20 66 69  If a test log fi
11f0: 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
1200: 64 2c 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72  d, use it; other
1210: 77 69 73 65 2c 20 69 67 6e 6f 72 65 20 74 68 65  wise, ignore the
1220: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 6d 65  ..    #       me
1230: 73 73 61 67 65 2e 0d 0a 20 20 20 20 23 0d 0a 20  ssage...    #.. 
1240: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
1250: 5b 67 65 74 54 65 73 74 4c 6f 67 5d 0d 0a 0d 0a  [getTestLog]....
1260: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1270: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
1280: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1290: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12a0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
12b0: 61 6e 79 20 71 75 65 75 65 64 20 74 65 73 74 20  any queued test 
12c0: 6c 6f 67 20 64 61 74 61 20 74 68 61 74 20 6e 65  log data that ne
12d0: 65 64 73 20 74 6f 20 62 65 20 73 65 6e 74 20 74  eds to be sent t
12e0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
12f0: 20 20 20 20 20 6c 6f 67 20 66 69 6c 65 20 70 72       log file pr
1300: 69 6f 72 20 74 6f 20 73 65 6e 64 69 6e 67 20 74  ior to sending t
1310: 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e  he current strin
1320: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
1330: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1340: 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 71  sts ::test_log_q
1350: 75 65 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ueue]} then {.. 
1360: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1370: 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73    # NOTE: Proces
1380: 73 20 65 61 63 68 20 71 75 65 75 65 64 20 74 65  s each queued te
1390: 73 74 20 6c 6f 67 20 65 6e 74 72 79 2c 20 69 6e  st log entry, in
13a0: 20 6f 72 64 65 72 2c 20 73 65 6e 64 69 6e 67 20   order, sending 
13b0: 74 68 65 6d 20 74 6f 0d 0a 20 20 20 20 20 20 20  them to..       
13c0: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
13d0: 74 20 6c 6f 67 20 66 69 6c 65 20 28 61 73 20 6c  t log file (as l
13e0: 6f 6e 67 20 61 73 20 74 68 65 79 20 61 72 65 20  ong as they are 
13f0: 6e 6f 74 20 65 6d 70 74 79 20 73 74 72 69 6e 67  not empty string
1400: 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  s)...        #  
1410: 20 20 20 20 20 45 61 63 68 20 65 6e 74 72 79 20       Each entry 
1420: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1430: 74 68 65 20 71 75 65 75 65 20 61 66 74 65 72 20  the queue after 
1440: 69 74 20 69 73 20 73 65 6e 74 20 74 6f 20 74 68  it is sent to th
1450: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1460: 20 20 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65     test log file
1470: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1480: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65 6e        foreach en
1490: 74 72 79 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65  try [lsort -inte
14a0: 67 65 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  ger [array names
14b0: 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 71 75 65 75   ::test_log_queu
14c0: 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e]] {..         
14d0: 20 73 65 74 20 6e 65 77 53 74 72 69 6e 67 20 24   set newString $
14e0: 3a 3a 74 65 73 74 5f 6c 6f 67 5f 71 75 65 75 65  ::test_log_queue
14f0: 28 24 65 6e 74 72 79 29 0d 0a 0d 0a 20 20 20 20  ($entry)....    
1500: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1510: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 53 74 72  g length $newStr
1520: 69 6e 67 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ing] > 0} then {
1530: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1540: 20 7b 21 5b 64 6f 65 73 54 65 73 74 4c 6f 67 46   {![doesTestLogF
1550: 69 6c 65 45 78 69 73 74 20 24 66 69 6c 65 4e 61  ileExist $fileNa
1560: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
1570: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
1580: 65 6e 74 72 79 20 5b 67 65 74 54 65 73 74 4c 6f  entry [getTestLo
1590: 67 53 74 61 72 74 53 65 6e 74 72 79 5d 0d 0a 0d  gStartSentry]...
15a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
15b0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
15c0: 68 20 24 73 65 6e 74 72 79 5d 20 3e 20 30 7d 20  h $sentry] > 0} 
15d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 42 55 47             # BUG
1600: 46 49 58 3a 20 41 74 20 74 68 69 73 20 70 6f 69  FIX: At this poi
1610: 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64  nt, there should
1620: 20 6e 6f 74 20 62 65 20 61 6e 79 20 72 65 63 6f   not be any reco
1630: 72 64 20 6f 66 20 61 0d 0a 20 20 20 20 20 20 20  rd of a..       
1640: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1650: 20 20 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73     previously us
1660: 65 64 20 74 65 73 74 20 6c 6f 67 20 73 65 6e 74  ed test log sent
1670: 72 79 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ry.  If there is
1680: 2c 20 64 6f 0d 0a 20 20 20 20 20 20 20 20 20 20  , do..          
1690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
16a0: 6e 6f 74 20 61 70 70 65 6e 64 20 61 20 74 65 73  not append a tes
16b0: 74 20 6c 6f 67 20 73 65 6e 74 72 79 20 61 67 61  t log sentry aga
16c0: 69 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  in because the t
16d0: 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  est..           
16e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 6c       #         l
16f0: 6f 67 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65  og file may have
1700: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   been deleted an
1710: 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  d we need to mak
1720: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1730: 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75 72     #         sur
1740: 65 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 69  e the test log i
1750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1760: 20 61 73 20 22 63 6f 6d 70 6c 65 74 65 22 2e 0d   as "complete"..
1770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1780: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1790: 20 20 20 20 69 66 20 7b 5b 64 69 64 54 65 73 74      if {[didTest
17a0: 4c 6f 67 48 61 76 65 53 74 61 72 74 53 65 6e 74  LogHaveStartSent
17b0: 72 79 20 24 73 65 6e 74 72 79 20 73 65 6e 74 72  ry $sentry sentr
17c0: 79 45 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  yError]} then {.
17d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
17f0: 73 74 73 20 73 65 6e 74 72 79 45 72 72 6f 72 5d  sts sentryError]
1800: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
1820: 70 65 6e 64 53 68 61 72 65 64 4c 6f 67 46 69 6c  pendSharedLogFil
1830: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 73 65 6e  e $fileName $sen
1840: 74 72 79 45 72 72 6f 72 0d 0a 20 20 20 20 20 20  tryError..      
1850: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1870: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1880: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 65             setTe
1890: 73 74 4c 6f 67 53 74 61 72 74 53 65 6e 74 72 79  stLogStartSentry
18a0: 20 24 73 65 6e 74 72 79 20 73 65 6e 74 72 79 52   $sentry sentryR
18b0: 65 73 75 6c 74 0d 0a 0d 0a 20 20 20 20 20 20 20  esult....       
18c0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
18d0: 64 53 68 61 72 65 64 4c 6f 67 46 69 6c 65 20 24  dSharedLogFile $
18e0: 66 69 6c 65 4e 61 6d 65 20 24 73 65 6e 74 72 79  fileName $sentry
18f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1900: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1910: 65 78 69 73 74 73 20 73 65 6e 74 72 79 52 65 73  exists sentryRes
1920: 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 61 70 70 65 6e 64 53 68 61 72 65 64 4c 6f    appendSharedLo
1950: 67 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  gFile $fileName 
1960: 24 73 65 6e 74 72 79 52 65 73 75 6c 74 0d 0a 20  $sentryResult.. 
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1990: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19c0: 20 20 20 20 20 61 70 70 65 6e 64 53 68 61 72 65       appendShare
19d0: 64 4c 6f 67 46 69 6c 65 20 24 66 69 6c 65 4e 61  dLogFile $fileNa
19e0: 6d 65 20 24 6e 65 77 53 74 72 69 6e 67 0d 0a 20  me $newString.. 
19f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1a00: 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 3a 3a          unset ::
1a10: 74 65 73 74 5f 6c 6f 67 5f 71 75 65 75 65 28 24  test_log_queue($
1a20: 65 6e 74 72 79 29 0d 0a 20 20 20 20 20 20 20 20  entry)..        
1a30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
1a40: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a50: 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
1a60: 6e 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 71  n the test log q
1a70: 75 65 75 65 20 77 65 72 65 20 6a 75 73 74 20 70  ueue were just p
1a80: 72 6f 63 65 73 73 65 64 2c 0d 0a 20 20 20 20 20  rocessed,..     
1a90: 20 20 20 23 20 20 20 20 20 20 20 75 6e 73 65 74     #       unset
1aa0: 20 74 68 65 20 65 6e 74 69 72 65 20 61 72 72 61   the entire arra
1ab0: 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  y now...        
1ac0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
1ad0: 61 72 72 61 79 20 73 69 7a 65 20 74 65 73 74 5f  array size test_
1ae0: 6c 6f 67 5f 71 75 65 75 65 5d 20 3d 3d 20 30 7d  log_queue] == 0}
1af0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b00: 20 20 20 75 6e 73 65 74 20 3a 3a 74 65 73 74 5f     unset ::test_
1b10: 6c 6f 67 5f 71 75 65 75 65 0d 0a 20 20 20 20 20  log_queue..     
1b20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1b30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b40: 23 20 4e 4f 54 45 3a 20 49 66 20 61 6e 20 65 6d  # NOTE: If an em
1b50: 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 73 75  pty string is su
1b60: 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61  pplied by the ca
1b70: 6c 6c 65 72 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  ller, do nothing
1b80: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1b90: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1ba0: 6e 67 74 68 20 24 73 74 72 69 6e 67 5d 20 3e 20  ngth $string] > 
1bb0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1bc0: 20 20 20 69 66 20 7b 21 5b 64 6f 65 73 54 65 73     if {![doesTes
1bd0: 74 4c 6f 67 46 69 6c 65 45 78 69 73 74 20 24 66  tLogFileExist $f
1be0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1bf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1c00: 73 65 6e 74 72 79 20 5b 67 65 74 54 65 73 74 4c  sentry [getTestL
1c10: 6f 67 53 74 61 72 74 53 65 6e 74 72 79 5d 0d 0a  ogStartSentry]..
1c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1c30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1c40: 73 65 6e 74 72 79 5d 20 3e 20 30 7d 20 74 68 65  sentry] > 0} the
1c50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c60: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1c70: 23 20 42 55 47 46 49 58 3a 20 41 74 20 74 68 69  # BUGFIX: At thi
1c80: 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73  s point, there s
1c90: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6e 79  hould not be any
1ca0: 20 72 65 63 6f 72 64 20 6f 66 20 61 0d 0a 20 20   record of a..  
1cb0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1cc0: 20 20 20 20 70 72 65 76 69 6f 75 73 6c 79 20 75      previously u
1cd0: 73 65 64 20 74 65 73 74 20 6c 6f 67 20 73 65 6e  sed test log sen
1ce0: 74 72 79 2e 20 20 49 66 20 74 68 65 72 65 20 69  try.  If there i
1cf0: 73 2c 20 64 6f 0d 0a 20 20 20 20 20 20 20 20 20  s, do..         
1d00: 20 20 20 23 20 20 20 20 20 20 20 20 20 6e 6f 74     #         not
1d10: 20 61 70 70 65 6e 64 20 61 20 74 65 73 74 20 6c   append a test l
1d20: 6f 67 20 73 65 6e 74 72 79 20 61 67 61 69 6e 20  og sentry again 
1d30: 62 65 63 61 75 73 65 20 74 68 65 20 74 65 73 74  because the test
1d40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1d50: 20 20 20 20 20 20 20 20 6c 6f 67 20 66 69 6c 65          log file
1d60: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 64   may have been d
1d70: 65 6c 65 74 65 64 20 61 6e 64 20 77 65 20 6e 65  eleted and we ne
1d80: 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20  ed to make..    
1d90: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1da0: 20 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20    sure the test 
1db0: 6c 6f 67 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  log is not consi
1dc0: 64 65 72 65 64 20 61 73 20 22 63 6f 6d 70 6c 65  dered as "comple
1dd0: 74 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  te"...          
1de0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1df0: 20 69 66 20 7b 5b 64 69 64 54 65 73 74 4c 6f 67   if {[didTestLog
1e00: 48 61 76 65 53 74 61 72 74 53 65 6e 74 72 79 20  HaveStartSentry 
1e10: 24 73 65 6e 74 72 79 20 73 65 6e 74 72 79 45 72  $sentry sentryEr
1e20: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1e40: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73 65 6e  [info exists sen
1e50: 74 72 79 45 72 72 6f 72 5d 7d 20 74 68 65 6e 20  tryError]} then 
1e60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e70: 20 20 20 61 70 70 65 6e 64 53 68 61 72 65 64 4c     appendSharedL
1e80: 6f 67 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ogFile $fileName
1e90: 20 24 73 65 6e 74 72 79 45 72 72 6f 72 0d 0a 20   $sentryError.. 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1ec0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1ed0: 20 20 20 20 73 65 74 54 65 73 74 4c 6f 67 53 74      setTestLogSt
1ee0: 61 72 74 53 65 6e 74 72 79 20 24 73 65 6e 74 72  artSentry $sentr
1ef0: 79 20 73 65 6e 74 72 79 52 65 73 75 6c 74 0d 0a  y sentryResult..
1f00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f10: 61 70 70 65 6e 64 53 68 61 72 65 64 4c 6f 67 46  appendSharedLogF
1f20: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 73  ile $fileName $s
1f30: 65 6e 74 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20  entry....       
1f40: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1f50: 20 65 78 69 73 74 73 20 73 65 6e 74 72 79 52 65   exists sentryRe
1f60: 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1f80: 70 70 65 6e 64 53 68 61 72 65 64 4c 6f 67 46 69  ppendSharedLogFi
1f90: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 73 65  le $fileName $se
1fa0: 6e 74 72 79 52 65 73 75 6c 74 0d 0a 20 20 20 20  ntryResult..    
1fb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1fc0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fd0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1fe0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61 70   }....        ap
1ff0: 70 65 6e 64 53 68 61 72 65 64 4c 6f 67 46 69 6c  pendSharedLogFil
2000: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 73 74 72  e $fileName $str
2010: 69 6e 67 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ing..      }..  
2020: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
2030: 72 6f 63 20 67 65 74 53 6f 66 74 77 61 72 65 52  roc getSoftwareR
2040: 65 67 69 73 74 72 79 4b 65 79 20 7b 20 77 6f 77  egistryKey { wow
2050: 36 34 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b  64 } {..    if {
2060: 24 77 6f 77 36 34 20 26 26 20 5b 69 6e 66 6f 20  $wow64 && [info 
2070: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
2080: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
2090: 26 26 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  && [lsearch -exa
20a0: 63 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c  ct \..        [l
20b0: 69 73 74 20 69 61 36 34 20 61 6d 64 36 34 20 61  ist ia64 amd64 a
20c0: 72 6d 36 34 5d 20 24 3a 3a 74 63 6c 5f 70 6c 61  rm64] $::tcl_pla
20d0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
20e0: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
20f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2100: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
2110: 20 57 6f 57 36 34 20 72 65 67 69 73 74 72 79 20   WoW64 registry 
2120: 6b 65 79 20 6e 61 6d 65 20 62 65 63 61 75 73 65  key name because
2130: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
2140: 6f 6e 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  on a..      #   
2150: 20 20 20 20 36 34 2d 62 69 74 20 6f 70 65 72 61      64-bit opera
2160: 74 69 6e 67 20 73 79 73 74 65 6d 20 61 6e 64 20  ting system and 
2170: 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69  the caller speci
2180: 66 69 63 61 6c 6c 79 20 72 65 71 75 65 73 74 65  fically requeste
2190: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
21a0: 20 74 68 65 20 57 6f 57 36 34 20 72 65 67 69 73   the WoW64 regis
21b0: 74 72 79 20 6b 65 79 20 6e 61 6d 65 2e 0d 0a 20  try key name... 
21c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
21d0: 74 75 72 6e 20 53 6f 66 74 77 61 72 65 5c 5c 57  turn Software\\W
21e0: 6f 77 36 34 33 32 4e 6f 64 65 0d 0a 20 20 20 20  ow6432Node..    
21f0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2200: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2210: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69   Return the nati
2220: 76 65 20 72 65 67 69 73 74 72 79 20 6b 65 79 20  ve registry key 
2230: 6e 61 6d 65 20 62 65 63 61 75 73 65 20 77 65 20  name because we 
2240: 61 72 65 20 65 69 74 68 65 72 20 6e 6f 74 0d 0a  are either not..
2250: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 75        #       ru
2260: 6e 6e 69 6e 67 20 6f 6e 20 61 20 36 34 2d 62 69  nning on a 64-bi
2270: 74 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  t operating syst
2280: 65 6d 20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  em or the caller
2290: 20 77 61 6e 74 73 20 74 68 65 0d 0a 20 20 20 20   wants the..    
22a0: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
22b0: 20 72 65 67 69 73 74 72 79 20 6b 65 79 20 6e 61   registry key na
22c0: 6d 65 20 28 69 2e 65 2e 20 6e 6f 74 20 74 68 65  me (i.e. not the
22d0: 20 57 6f 57 36 34 20 72 65 67 69 73 74 72 79 20   WoW64 registry 
22e0: 6b 65 79 20 6e 61 6d 65 29 2e 0d 0a 20 20 20 20  key name)...    
22f0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
2300: 6e 20 53 6f 66 74 77 61 72 65 0d 0a 20 20 20 20  n Software..    
2310: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
2320: 63 20 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  c haveConstraint
2330: 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20   { name } {..   
2340: 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20   if {[isEagle]} 
2350: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65  then {..      re
2360: 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
2370: 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78          [info ex
2380: 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65 73  ists ::eagle_tes
2390: 74 73 28 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  ts(Constraints)]
23a0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
23b0: 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74   [lsearch -exact
23c0: 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
23d0: 43 6f 6e 73 74 72 61 69 6e 74 73 29 20 24 6e 61  Constraints) $na
23e0: 6d 65 5d 20 21 3d 20 2d 31 7d 5d 0d 0a 20 20 20  me] != -1}]..   
23f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
2400: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
2410: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
2420: 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 74 65 73   exists ::tcltes
2430: 74 3a 3a 74 65 73 74 43 6f 6e 73 74 72 61 69 6e  t::testConstrain
2440: 74 73 28 24 6e 61 6d 65 29 5d 20 26 26 20 5c 0d  ts($name)] && \.
2450: 0a 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 63  .          $::tc
2460: 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e 73 74  ltest::testConst
2470: 72 61 69 6e 74 73 28 24 6e 61 6d 65 29 7d 5d 0d  raints($name)}].
2480: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
2490: 20 20 70 72 6f 63 20 61 64 64 43 6f 6e 73 74 72    proc addConstr
24a0: 61 69 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 61 6c  aint { name {val
24b0: 75 65 20 31 7d 20 7d 20 7b 0d 0a 20 20 20 20 69  ue 1} } {..    i
24c0: 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68  f {[isEagle]} th
24d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  en {..      if {
24e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
24f0: 61 67 6c 65 5f 74 65 73 74 73 28 43 6f 6e 73 74  agle_tests(Const
2500: 72 61 69 6e 74 73 29 5d 20 26 26 20 5c 0d 0a 20  raints)] && \.. 
2510: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63           [lsearc
2520: 68 20 2d 65 78 61 63 74 20 24 3a 3a 65 61 67 6c  h -exact $::eagl
2530: 65 5f 74 65 73 74 73 28 43 6f 6e 73 74 72 61 69  e_tests(Constrai
2540: 6e 74 73 29 20 24 6e 61 6d 65 5d 20 3d 3d 20 2d  nts) $name] == -
2550: 31 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  1 && \..        
2560: 20 20 24 76 61 6c 75 65 7d 20 74 68 65 6e 20 7b    $value} then {
2570: 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
2580: 64 20 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28  d ::eagle_tests(
2590: 43 6f 6e 73 74 72 61 69 6e 74 73 29 20 24 6e 61  Constraints) $na
25a0: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  me..      }..   
25b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
25c0: 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73 74   ::tcltest::test
25d0: 43 6f 6e 73 74 72 61 69 6e 74 20 24 6e 61 6d 65  Constraint $name
25e0: 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a   $value..    }..
25f0: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d  ..    return "".
2600: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
2610: 68 61 76 65 4f 72 41 64 64 43 6f 6e 73 74 72 61  haveOrAddConstra
2620: 69 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 61 6c 75  int { name {valu
2630: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 69  e ""} } {..    i
2640: 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68  f {[isEagle]} th
2650: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  en {..      if {
2660: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 6c  [llength [info l
2670: 65 76 65 6c 20 30 5d 5d 20 3d 3d 20 32 7d 20 74  evel 0]] == 2} t
2680: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
2690: 65 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74  eturn [haveConst
26a0: 72 61 69 6e 74 20 24 6e 61 6d 65 5d 0d 0a 20 20  raint $name]..  
26b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
26c0: 65 74 75 72 6e 20 5b 61 64 64 43 6f 6e 73 74 72  eturn [addConstr
26d0: 61 69 6e 74 20 24 6e 61 6d 65 20 5b 65 78 70 72  aint $name [expr
26e0: 20 7b 62 6f 6f 6c 28 24 76 61 6c 75 65 29 7d 5d   {bool($value)}]
26f0: 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  ]..    } else {.
2700: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 3a  .      return [:
2710: 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f  :tcltest::testCo
2720: 6e 73 74 72 61 69 6e 74 20 24 6e 61 6d 65 20 24  nstraint $name $
2730: 76 61 6c 75 65 5d 0d 0a 20 20 20 20 7d 0d 0a 20  value]..    }.. 
2740: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65   }.....  proc ge
2750: 74 43 6f 6e 73 74 72 61 69 6e 74 73 20 7b 7d 20  tConstraints {} 
2760: 7b 0d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  {..    set resul
2770: 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
2780: 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74  if {[isEagle]} t
2790: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  hen {..      if 
27a0: 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 3a 3a 65  {[catch {set ::e
27b0: 61 67 6c 65 5f 74 65 73 74 73 28 43 6f 6e 73 74  agle_tests(Const
27c0: 72 61 69 6e 74 73 29 7d 20 63 6f 6e 73 74 72 61  raints)} constra
27d0: 69 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ints] == 0} then
27e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
27f0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
2800: 24 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20  $constraints..  
2810: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73      }..    } els
2820: 65 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  e {..      forea
2830: 63 68 20 6e 61 6d 65 20 5b 61 72 72 61 79 20 6e  ch name [array n
2840: 61 6d 65 73 20 3a 3a 74 63 6c 74 65 73 74 3a 3a  ames ::tcltest::
2850: 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d  testConstraints]
2860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
2870: 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73 74  $::tcltest::test
2880: 43 6f 6e 73 74 72 61 69 6e 74 73 28 24 6e 61 6d  Constraints($nam
2890: 65 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e)} then {..    
28a0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
28b0: 73 75 6c 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20  sult $name..    
28c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
28d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74      }....    ret
28e0: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 7d  urn $result..  }
28f0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 43  .....  proc getC
2900: 61 63 68 65 64 43 6f 6e 73 74 72 61 69 6e 74 73  achedConstraints
2910: 20 7b 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b   {} {..    if {[
2920: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
2930: 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 20  st_constraints] 
2940: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c  && \..        [l
2950: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
2960: 6f 6e 73 74 72 61 69 6e 74 73 5d 20 3e 20 30 7d  onstraints] > 0}
2970: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72   then {..      r
2980: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f  eturn $::test_co
2990: 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 20 20 7d  nstraints..    }
29a0: 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  ....    return [
29b0: 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 0d  getConstraints].
29c0: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
29d0: 75 73 65 43 61 63 68 65 64 43 6f 6e 73 74 72 61  useCachedConstra
29e0: 69 6e 74 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 66  ints {} {..    f
29f0: 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 67 65 74  oreach name [get
2a00: 43 61 63 68 65 64 43 6f 6e 73 74 72 61 69 6e 74  CachedConstraint
2a10: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43  s] {..      addC
2a20: 6f 6e 73 74 72 61 69 6e 74 20 24 6e 61 6d 65 0d  onstraint $name.
2a30: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
2a40: 20 20 70 72 6f 63 20 72 65 6d 6f 76 65 43 6f 6e    proc removeCon
2a50: 73 74 72 61 69 6e 74 20 7b 20 6e 61 6d 65 20 7d  straint { name }
2a60: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45   {..    if {[isE
2a70: 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  agle]} then {.. 
2a80: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2a90: 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65  xists ::eagle_te
2aa0: 73 74 73 28 43 6f 6e 73 74 72 61 69 6e 74 73 29  sts(Constraints)
2ab0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2ac0: 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 6c 73     set index [ls
2ad0: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 3a 3a  earch -exact $::
2ae0: 65 61 67 6c 65 5f 74 65 73 74 73 28 43 6f 6e 73  eagle_tests(Cons
2af0: 74 72 61 69 6e 74 73 29 20 24 6e 61 6d 65 5d 0d  traints) $name].
2b00: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  ...        if {$
2b10: 69 6e 64 65 78 20 21 3d 20 2d 31 7d 20 74 68 65  index != -1} the
2b20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
2b30: 65 74 20 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  et ::eagle_tests
2b40: 28 43 6f 6e 73 74 72 61 69 6e 74 73 29 20 5b 6c  (Constraints) [l
2b50: 72 65 70 6c 61 63 65 20 5c 0d 0a 20 20 20 20 20  replace \..     
2b60: 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c           $::eagl
2b70: 65 5f 74 65 73 74 73 28 43 6f 6e 73 74 72 61 69  e_tests(Constrai
2b80: 6e 74 73 29 20 24 69 6e 64 65 78 20 24 69 6e 64  nts) $index $ind
2b90: 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ex]..        }..
2ba0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65        }..    } e
2bb0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  lse {..      if 
2bc0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2bd0: 74 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e  tcltest::testCon
2be0: 73 74 72 61 69 6e 74 73 28 24 6e 61 6d 65 29 5d  straints($name)]
2bf0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2c00: 20 20 75 6e 73 65 74 20 3a 3a 74 63 6c 74 65 73    unset ::tcltes
2c10: 74 3a 3a 74 65 73 74 43 6f 6e 73 74 72 61 69 6e  t::testConstrain
2c20: 74 73 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  ts($name)..     
2c30: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
2c40: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 7d 0d   return ""..  }.
2c50: 0a 0c 0d 0a 20 20 70 72 6f 63 20 66 69 78 43 6f  ....  proc fixCo
2c60: 6e 73 74 72 61 69 6e 74 73 20 7b 20 63 6f 6e 73  nstraints { cons
2c70: 74 72 61 69 6e 74 73 20 7d 20 7b 0d 0a 20 20 20  traints } {..   
2c80: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72   set result [str
2c90: 69 6e 67 20 74 72 69 6d 20 24 63 6f 6e 73 74 72  ing trim $constr
2ca0: 61 69 6e 74 73 5d 0d 0a 0d 0a 20 20 20 20 69 66  aints]....    if
2cb0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
2cc0: 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74   $result] > 0} t
2cd0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  hen {..      #..
2ce0: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 46 69        # HACK: Fi
2cf0: 78 75 70 20 66 6f 72 20 74 68 65 20 73 65 6d 69  xup for the semi
2d00: 2d 6d 61 67 69 63 61 6c 20 65 78 70 72 65 73 73  -magical express
2d10: 69 6f 6e 20 28 76 69 61 20 5b 65 78 70 72 5d 29  ion (via [expr])
2d20: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
2d30: 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 20       constraint 
2d40: 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 65 64  syntax supported
2d50: 20 62 79 20 74 68 65 20 54 63 6c 74 65 73 74 20   by the Tcltest 
2d60: 70 61 63 6b 61 67 65 20 61 6e 64 20 6e 6f 74 0d  package and not.
2d70: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
2d80: 79 20 74 68 65 20 45 61 67 6c 65 2e 54 65 73 74  y the Eagle.Test
2d90: 20 70 61 63 6b 61 67 65 2e 20 20 54 68 69 73 20   package.  This 
2da0: 6e 65 65 64 73 20 74 6f 20 68 61 70 70 65 6e 20  needs to happen 
2db0: 66 6f 72 20 54 63 6c 0d 0a 20 20 20 20 20 20 23  for Tcl..      #
2dc0: 20 20 20 20 20 20 20 69 6e 20 74 65 73 74 20 63         in test c
2dd0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
2de0: 63 6f 6e 74 61 69 6e 20 61 6e 79 20 63 68 61 72  contain any char
2df0: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 0d  acters that are.
2e00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
2e10: 6f 74 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 2c  ot alphanumeric,
2e20: 20 6e 6f 74 20 61 20 70 65 72 69 6f 64 2c 20 61   not a period, a
2e30: 6e 64 20 6e 6f 74 20 61 20 63 6f 6c 6f 6e 20 28  nd not a colon (
2e40: 65 2e 67 2e 20 69 6e 0d 0a 20 20 20 20 20 20 23  e.g. in..      #
2e50: 20 20 20 20 20 20 20 74 68 69 73 20 63 61 73 65         this case
2e60: 2c 20 74 68 65 20 65 78 63 6c 61 6d 61 74 69 6f  , the exclamatio
2e70: 6e 20 70 6f 69 6e 74 29 3b 20 68 6f 77 65 76 65  n point); howeve
2e80: 72 2c 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  r, it should onl
2e90: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
2ea0: 20 62 65 20 72 65 71 75 69 72 65 64 20 77 68 65   be required whe
2eb0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2ec0: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
2ed0: 20 69 73 20 67 72 65 61 74 65 72 0d 0a 20 20 20   is greater..   
2ee0: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20     #       than 
2ef0: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
2f00: 20 20 20 20 20 69 66 20 7b 21 5b 69 73 45 61 67       if {![isEag
2f10: 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  le]} then {..   
2f20: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
2f30: 20 66 69 72 73 74 20 21 20 24 72 65 73 75 6c 74   first ! $result
2f40: 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d  ] != -1} then {.
2f50: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2f60: 20 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20          # HACK: 
2f70: 41 6c 6c 20 6f 66 20 6f 75 72 20 74 65 73 74 20  All of our test 
2f80: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 73 73 75  constraints assu
2f90: 6d 65 20 74 68 65 79 20 61 72 65 0d 0a 20 20 20  me they are..   
2fa0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
2fb0: 6c 6f 67 69 63 61 6c 6c 79 20 61 6e 64 2d 65 64  logically and-ed
2fc0: 22 20 74 6f 67 65 74 68 65 72 2e 0d 0a 20 20 20  " together...   
2fd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2fe0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
2ff0: 6a 6f 69 6e 20 5b 73 70 6c 69 74 20 24 72 65 73  join [split $res
3000: 75 6c 74 5d 20 22 20 26 26 20 22 5d 0d 0a 20 20  ult] " && "]..  
3010: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
3020: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72  ..    }....    r
3030: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
3040: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 69 73   }.....  proc is
3050: 43 6f 72 65 50 75 62 6c 69 63 4b 65 79 54 6f 6b  CorePublicKeyTok
3060: 65 6e 20 7b 20 70 75 62 6c 69 63 4b 65 79 54 6f  en { publicKeyTo
3070: 6b 65 6e 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a  ken } {..    #..
3080: 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73      # HACK: This
3090: 20 6c 69 73 74 20 6f 66 20 22 77 65 6c 6c 2d 6b   list of "well-k
30a0: 6e 6f 77 6e 22 20 70 75 62 6c 69 63 20 6b 65 79  nown" public key
30b0: 20 74 6f 6b 65 6e 73 20 69 73 20 68 61 72 64 2d   tokens is hard-
30c0: 63 6f 64 65 64 2e 0d 0a 20 20 20 20 23 0d 0a 20  coded...    #.. 
30d0: 20 20 20 73 65 74 20 70 75 62 6c 69 63 4b 65 79     set publicKey
30e0: 54 6f 6b 65 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a  Tokens [list \..
30f0: 20 20 20 20 20 20 20 20 32 39 63 36 32 39 37 36          29c62976
3100: 33 30 62 65 30 35 65 62 20 31 65 32 32 65 63 36  30be05eb 1e22ec6
3110: 37 38 37 39 37 33 39 61 32 20 33 35 38 30 33 30  7879739a2 358030
3120: 30 36 33 61 38 33 32 62 63 33 5d 0d 0a 0d 0a 20  063a832bc3].... 
3130: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
3140: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3150: 73 65 74 20 65 78 70 72 20 7b 24 70 75 62 6c 69  set expr {$publi
3160: 63 4b 65 79 54 6f 6b 65 6e 20 69 6e 20 24 70 75  cKeyToken in $pu
3170: 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 73 7d 0d 0a  blicKeyTokens}..
3180: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70  ..      if {[exp
3190: 72 20 24 65 78 70 72 5d 7d 20 74 68 65 6e 20 7b  r $expr]} then {
31a0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
31b0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
31c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
31d0: 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
31e0: 20 2d 65 78 61 63 74 20 24 70 75 62 6c 69 63 4b   -exact $publicK
31f0: 65 79 54 6f 6b 65 6e 73 20 24 70 75 62 6c 69 63  eyTokens $public
3200: 4b 65 79 54 6f 6b 65 6e 5d 20 21 3d 20 2d 31 7d  KeyToken] != -1}
3210: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3220: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
3230: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
3240: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3250: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
3260: 20 66 69 78 54 69 6d 69 6e 67 43 6f 6e 73 74 72   fixTimingConstr
3270: 61 69 6e 74 73 20 7b 20 63 6f 6e 73 74 72 61 69  aints { constrai
3280: 6e 74 73 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a  nts } {..    #..
3290: 20 20 20 20 23 20 48 41 43 4b 3a 20 49 6e 20 45      # HACK: In E
32a0: 61 67 6c 65 2c 20 77 68 65 6e 20 74 68 65 20 72  agle, when the r
32b0: 69 67 68 74 20 74 65 73 74 20 63 6f 6e 73 74 72  ight test constr
32c0: 61 69 6e 74 20 69 73 20 70 72 65 73 65 6e 74 2c  aint is present,
32d0: 20 2a 61 6e 79 2a 20 74 65 73 74 73 0d 0a 20 20   *any* tests..  
32e0: 20 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20    #       where 
32f0: 50 41 53 53 45 44 20 2f 20 46 41 49 4c 45 44 20  PASSED / FAILED 
3300: 72 65 73 75 6c 74 73 20 63 61 6e 20 76 61 72 79  results can vary
3310: 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
3320: 69 63 61 6c 6c 79 20 64 75 65 0d 0a 20 20 20 20  ically due..    
3330: 23 20 20 20 20 20 20 20 74 6f 20 74 69 6d 69 6e  #       to timin
3340: 67 20 69 73 73 75 65 73 20 28 65 2e 67 2e 20 70  g issues (e.g. p
3350: 65 72 66 6f 72 6d 61 6e 63 65 29 20 61 72 65 20  erformance) are 
3360: 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 63  forbidden from c
3370: 61 75 73 69 6e 67 0d 0a 20 20 20 20 23 20 20 20  ausing..    #   
3380: 20 20 20 20 74 68 65 20 6f 76 65 72 61 6c 6c 20      the overall 
3390: 74 65 73 74 20 72 75 6e 20 74 6f 20 66 61 69 6c  test run to fail
33a0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ...    #..    if
33b0: 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
33c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  n {..      if {[
33d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
33e0: 28 66 61 69 6c 54 69 6d 69 6e 67 54 65 73 74 73  (failTimingTests
33f0: 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  )] || \..       
3400: 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
3410: 6e 74 20 6f 66 66 69 63 69 61 6c 53 74 61 62 6c  nt officialStabl
3420: 65 52 65 6c 65 61 73 65 49 6e 50 72 6f 67 72 65  eReleaseInProgre
3430: 73 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ss]} then {..   
3440: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 78       return [fix
3450: 43 6f 6e 73 74 72 61 69 6e 74 73 20 5b 63 6f 6e  Constraints [con
3460: 63 61 74 20 24 63 6f 6e 73 74 72 61 69 6e 74 73  cat $constraints
3470: 20 5b 6c 69 73 74 20 66 61 69 6c 2e 66 61 6c 73   [list fail.fals
3480: 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  e]]]..      } el
3490: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
34a0: 74 75 72 6e 20 5b 66 69 78 43 6f 6e 73 74 72 61  turn [fixConstra
34b0: 69 6e 74 73 20 24 63 6f 6e 73 74 72 61 69 6e 74  ints $constraint
34c0: 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s]..      }..   
34d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
34e0: 20 72 65 74 75 72 6e 20 5b 66 69 78 43 6f 6e 73   return [fixCons
34f0: 74 72 61 69 6e 74 73 20 24 63 6f 6e 73 74 72 61  traints $constra
3500: 69 6e 74 73 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20  ints]..    }..  
3510: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 74 65 73  }.....  proc tes
3520: 74 44 65 62 75 67 42 72 65 61 6b 20 7b 7d 20 7b  tDebugBreak {} {
3530: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67  ..    if {[isEag
3540: 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  le]} then {..   
3550: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3560: 54 45 3a 20 49 6e 20 45 61 67 6c 65 2c 20 73 69  TE: In Eagle, si
3570: 6d 70 6c 79 20 62 72 65 61 6b 20 69 6e 74 6f 20  mply break into 
3580: 74 68 65 20 69 6e 74 65 72 61 63 74 69 76 65 20  the interactive 
3590: 6c 6f 6f 70 20 75 73 69 6e 67 20 74 68 65 0d 0a  loop using the..
35a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
35b0: 74 65 67 72 61 74 65 64 20 73 63 72 69 70 74 20  tegrated script 
35c0: 64 65 62 75 67 67 65 72 2e 0d 0a 20 20 20 20 20  debugger...     
35d0: 20 23 0d 0a 20 20 20 20 20 20 64 65 62 75 67 20   #..      debug 
35e0: 62 72 65 61 6b 0d 0a 20 20 20 20 7d 20 65 6c 73  break..    } els
35f0: 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e {..      #..  
3600: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6e      # NOTE: In n
3610: 61 74 69 76 65 20 54 63 6c 2c 20 61 74 74 65 6d  ative Tcl, attem
3620: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 54 63  pt to use the Tc
3630: 6c 50 72 6f 20 44 65 62 75 67 67 65 72 20 69 6e  lPro Debugger in
3640: 74 65 72 66 61 63 65 2e 0d 0a 20 20 20 20 20 20  terface...      
3650: 23 20 20 20 20 20 20 20 54 68 69 73 20 72 65 71  #       This req
3660: 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20 54  uires that the T
3670: 63 6c 50 72 6f 20 44 65 62 75 67 67 65 72 20 69  clPro Debugger i
3680: 6e 74 65 72 66 61 63 65 20 70 61 63 6b 61 67 65  nterface package
3690: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
36a0: 20 20 20 70 72 65 73 65 6e 74 20 73 6f 6d 65 77     present somew
36b0: 68 65 72 65 20 61 6c 6f 6e 67 20 74 68 65 20 61  here along the a
36c0: 75 74 6f 2d 70 61 74 68 2e 0d 0a 20 20 20 20 20  uto-path...     
36d0: 20 23 0d 0a 20 20 20 20 20 20 70 61 63 6b 61 67   #..      packag
36e0: 65 20 72 65 71 75 69 72 65 20 74 63 6c 64 65 62  e require tcldeb
36f0: 75 67 67 65 72 5f 61 74 74 61 63 68 3b 20 64 65  ugger_attach; de
3700: 62 75 67 67 65 72 5f 69 6e 69 74 3b 20 64 65 62  bugger_init; deb
3710: 75 67 67 65 72 5f 62 72 65 61 6b 0d 0a 20 20 20  ugger_break..   
3720: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
3730: 6f 63 20 74 65 73 74 41 72 72 61 79 47 65 74 20  oc testArrayGet 
3740: 7b 20 76 61 72 4e 61 6d 65 20 7b 69 6e 74 65 67  { varName {integ
3750: 65 72 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  er false} } {.. 
3760: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
3770: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 72 65  : Returns the re
3780: 73 75 6c 74 73 20 6f 66 20 5b 61 72 72 61 79 20  sults of [array 
3790: 67 65 74 5d 20 69 6e 20 61 20 77 65 6c 6c 2d 64  get] in a well-d
37a0: 65 66 69 6e 65 64 20 6f 72 64 65 72 2e 0d 0a 20  efined order... 
37b0: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 73     #..    if {[s
37c0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
37d0: 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65  rName] == 0} the
37e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
37f0: 6e 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 7d 0d  n [list]..    }.
3800: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
3810: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
3820: 68 65 20 61 72 72 61 79 20 69 6e 20 74 68 65 20  he array in the 
3830: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 63  context of the c
3840: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20  aller...    #.. 
3850: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
3860: 61 6d 65 20 61 72 72 61 79 0d 0a 0d 0a 20 20 20  ame array....   
3870: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
3880: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 6d 61 6e  Build the comman
3890: 64 20 74 68 61 74 20 77 69 6c 6c 20 73 6f 72 74  d that will sort
38a0: 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 73   the array names
38b0: 20 69 6e 74 6f 20 6f 72 64 65 72 2e 0d 0a 20 20   into order...  
38c0: 20 20 23 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d    #..    set com
38d0: 6d 61 6e 64 20 5b 6c 69 73 74 20 6c 73 6f 72 74  mand [list lsort
38e0: 5d 0d 0a 20 20 20 20 69 66 20 7b 24 69 6e 74 65  ]..    if {$inte
38f0: 67 65 72 7d 20 74 68 65 6e 20 7b 6c 61 70 70 65  ger} then {lappe
3900: 6e 64 20 63 6f 6d 6d 61 6e 64 20 2d 69 6e 74 65  nd command -inte
3910: 67 65 72 7d 0d 0a 20 20 20 20 6c 61 70 70 65 6e  ger}..    lappen
3920: 64 20 63 6f 6d 6d 61 6e 64 20 5b 61 72 72 61 79  d command [array
3930: 20 6e 61 6d 65 73 20 61 72 72 61 79 5d 0d 0a 0d   names array]...
3940: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
3950: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 66 6f  [list]....    fo
3960: 72 65 61 63 68 20 6e 61 6d 65 20 5b 65 76 61 6c  reach name [eval
3970: 20 24 63 6f 6d 6d 61 6e 64 5d 20 7b 0d 0a 20 20   $command] {..  
3980: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
3990: 6c 74 20 24 6e 61 6d 65 20 24 61 72 72 61 79 28  lt $name $array(
39a0: 24 6e 61 6d 65 29 0d 0a 20 20 20 20 7d 0d 0a 0d  $name)..    }...
39b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73  .    return $res
39c0: 75 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  ult..  }.....  p
39d0: 72 6f 63 20 74 65 73 74 41 72 72 61 79 47 65 74  roc testArrayGet
39e0: 32 20 7b 20 76 61 72 4e 61 6d 65 20 7b 70 61 74  2 { varName {pat
39f0: 74 65 72 6e 20 22 22 7d 20 7b 69 6e 74 65 67 65  tern ""} {intege
3a00: 72 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  r false} } {..  
3a10: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
3a20: 20 52 65 74 75 72 6e 73 20 74 68 65 20 72 65 73   Returns the res
3a30: 75 6c 74 73 20 6f 66 20 5b 61 72 72 61 79 20 67  ults of [array g
3a40: 65 74 5d 20 69 6e 20 61 20 77 65 6c 6c 2d 64 65  et] in a well-de
3a50: 66 69 6e 65 64 20 6f 72 64 65 72 2e 0d 0a 20 20  fined order...  
3a60: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74    #..    if {[st
3a70: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
3a80: 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
3a90: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
3aa0: 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 7d 0d 0a   [list]..    }..
3ab0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
3ac0: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
3ad0: 65 20 61 72 72 61 79 20 69 6e 20 74 68 65 20 63  e array in the c
3ae0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 63 61  ontext of the ca
3af0: 6c 6c 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ller...    #..  
3b00: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
3b10: 6d 65 20 61 72 72 61 79 0d 0a 0d 0a 20 20 20 20  me array....    
3b20: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  #..    # NOTE: B
3b30: 75 69 6c 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64  uild the command
3b40: 20 74 68 61 74 20 77 69 6c 6c 20 73 6f 72 74 20   that will sort 
3b50: 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 73 20  the array names 
3b60: 69 6e 74 6f 20 6f 72 64 65 72 2e 0d 0a 20 20 20  into order...   
3b70: 20 23 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d   #..    set comm
3b80: 61 6e 64 20 5b 6c 69 73 74 20 6c 73 6f 72 74 5d  and [list lsort]
3b90: 0d 0a 20 20 20 20 69 66 20 7b 24 69 6e 74 65 67  ..    if {$integ
3ba0: 65 72 7d 20 74 68 65 6e 20 7b 6c 61 70 70 65 6e  er} then {lappen
3bb0: 64 20 63 6f 6d 6d 61 6e 64 20 2d 69 6e 74 65 67  d command -integ
3bc0: 65 72 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  er}....    #..  
3bd0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
3be0: 72 65 20 69 73 20 61 20 70 61 74 74 65 72 6e 2c  re is a pattern,
3bf0: 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69   use it; otherwi
3c00: 73 65 2c 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  se, all elements
3c10: 20 61 72 65 0d 0a 20 20 20 20 23 20 20 20 20 20   are..    #     
3c20: 20 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20    returned...   
3c30: 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72   #..    if {[str
3c40: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 61 74 74  ing length $patt
3c50: 65 72 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ern] > 0} then {
3c60: 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  ..      lappend 
3c70: 63 6f 6d 6d 61 6e 64 20 5b 61 72 72 61 79 20 6e  command [array n
3c80: 61 6d 65 73 20 61 72 72 61 79 20 24 70 61 74 74  ames array $patt
3c90: 65 72 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65  ern]..    } else
3ca0: 20 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e   {..      lappen
3cb0: 64 20 63 6f 6d 6d 61 6e 64 20 5b 61 72 72 61 79  d command [array
3cc0: 20 6e 61 6d 65 73 20 61 72 72 61 79 5d 0d 0a 20   names array].. 
3cd0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65 74 20     }....    set 
3ce0: 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
3cf0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d  .    foreach nam
3d00: 65 20 5b 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64  e [eval $command
3d10: 5d 20 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70 65  ] {..      lappe
3d20: 6e 64 20 72 65 73 75 6c 74 20 24 6e 61 6d 65 20  nd result $name 
3d30: 24 61 72 72 61 79 28 24 6e 61 6d 65 29 0d 0a 20  $array($name).. 
3d40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75     }....    retu
3d50: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 7d 0d  rn $result..  }.
3d60: 0a 0c 0d 0a 20 20 70 72 6f 63 20 74 65 73 74 52  ....  proc testR
3d70: 65 73 75 6c 74 47 65 74 20 7b 20 73 63 72 69 70  esultGet { scrip
3d80: 74 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20 63  t } {..    set c
3d90: 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65  ode [catch {uple
3da0: 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72  vel 1 $script} r
3db0: 65 73 75 6c 74 5d 0d 0a 20 20 20 20 72 65 74 75  esult]..    retu
3dc0: 72 6e 20 5b 65 78 70 72 20 7b 24 63 6f 64 65 20  rn [expr {$code 
3dd0: 3d 3d 20 30 20 3f 20 24 72 65 73 75 6c 74 20 3a  == 0 ? $result :
3de0: 20 22 3c 65 72 72 6f 72 3e 22 7d 5d 0d 0a 20 20   "<error>"}]..  
3df0: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 74 65 73  }.....  proc tes
3e00: 74 56 61 6c 75 65 47 65 74 20 7b 20 76 61 72 4e  tValueGet { varN
3e10: 61 6d 65 20 7b 69 6e 74 65 67 65 72 20 66 61 6c  ame {integer fal
3e20: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a  se} } {..    #..
3e30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
3e40: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 73 20  rns the results 
3e50: 6f 66 20 5b 61 72 72 61 79 20 67 65 74 5d 20 69  of [array get] i
3e60: 6e 20 61 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  n a well-defined
3e70: 20 6f 72 64 65 72 0d 0a 20 20 20 20 23 20 20 20   order..    #   
3e80: 20 20 20 20 2d 4f 52 2d 20 74 68 65 20 76 61 6c      -OR- the val
3e90: 75 65 20 6f 66 20 74 68 65 20 73 63 61 6c 61 72  ue of the scalar
3ea0: 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20   variable...    
3eb0: 23 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  #..    if {[stri
3ec0: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
3ed0: 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
3ee0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
3ef0: 6c 69 73 74 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  list]..    }....
3f00: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
3f10: 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66  E: Is the specif
3f20: 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 69 6e  ied variable (in
3f30: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
3f40: 74 68 65 20 63 61 6c 6c 65 72 29 20 61 6e 0d 0a  the caller) an..
3f50: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 72 61      #       arra
3f60: 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  y?..    #..    i
3f70: 66 20 7b 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  f {[uplevel 1 [l
3f80: 69 73 74 20 61 72 72 61 79 20 65 78 69 73 74 73  ist array exists
3f90: 20 24 76 61 72 4e 61 6d 65 5d 5d 7d 20 74 68 65   $varName]]} the
3fa0: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
3fb0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
3fc0: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 69  r to the array i
3fd0: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
3fe0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   the caller...  
3ff0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
4000: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 61 72  ar 1 $varName ar
4010: 72 61 79 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ray....      #..
4020: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
4030: 69 6c 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  ild the command 
4040: 74 68 61 74 20 77 69 6c 6c 20 73 6f 72 74 20 74  that will sort t
4050: 68 65 20 61 72 72 61 79 20 6e 61 6d 65 73 20 69  he array names i
4060: 6e 74 6f 20 6f 72 64 65 72 2e 0d 0a 20 20 20 20  nto order...    
4070: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63    #..      set c
4080: 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 6c 73 6f  ommand [list lso
4090: 72 74 5d 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  rt]..      if {$
40a0: 69 6e 74 65 67 65 72 7d 20 74 68 65 6e 20 7b 6c  integer} then {l
40b0: 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 2d  append command -
40c0: 69 6e 74 65 67 65 72 7d 0d 0a 20 20 20 20 20 20  integer}..      
40d0: 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20  lappend command 
40e0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61 72 72  [array names arr
40f0: 61 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  ay]....      set
4100: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
4110: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
4120: 6e 61 6d 65 20 5b 65 76 61 6c 20 24 63 6f 6d 6d  name [eval $comm
4130: 61 6e 64 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  and] {..        
4140: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
4150: 6e 61 6d 65 20 24 61 72 72 61 79 28 24 6e 61 6d  name $array($nam
4160: 65 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  e)..      }..   
4170: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
4180: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
4190: 3a 20 47 72 61 62 20 74 68 65 20 76 61 6c 75 65  : Grab the value
41a0: 20 6f 66 20 74 68 65 20 73 63 61 6c 61 72 20 76   of the scalar v
41b0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 63  ariable in the c
41c0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20  ontext of the.. 
41d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
41e0: 6c 65 72 20 61 6e 64 20 74 68 65 6e 20 72 65 74  ler and then ret
41f0: 75 72 6e 20 62 6f 74 68 20 74 68 65 20 6e 61 6d  urn both the nam
4200: 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 2e  e and the value.
4210: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4220: 20 73 65 74 20 76 61 72 56 61 6c 75 65 20 5b 75   set varValue [u
4230: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
4240: 65 74 20 24 76 61 72 4e 61 6d 65 5d 5d 0d 0a 20  et $varName]].. 
4250: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
4260: 5b 6c 69 73 74 20 24 76 61 72 56 61 6c 75 65 5d  [list $varValue]
4270: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72  ..    }....    r
4280: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
4290: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65   }.....  proc ge
42a0: 74 46 69 72 73 74 4c 69 6e 65 4f 66 45 72 72 6f  tFirstLineOfErro
42b0: 72 20 7b 20 65 72 72 6f 72 20 7d 20 7b 0d 0a 20  r { error } {.. 
42c0: 20 20 20 73 65 74 20 65 72 72 6f 72 20 5b 73 74     set error [st
42d0: 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c  ring map [list \
42e0: 72 5c 6e 20 5c 6e 5d 20 24 65 72 72 6f 72 5d 0d  r\n \n] $error].
42f0: 0a 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b  .    set index [
4300: 73 74 72 69 6e 67 20 66 69 72 73 74 20 5c 6e 20  string first \n 
4310: 24 65 72 72 6f 72 5d 0d 0a 0d 0a 20 20 20 20 69  $error]....    i
4320: 66 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 7d  f {$index != -1}
4330: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69   then {..      i
4340: 6e 63 72 20 69 6e 64 65 78 20 2d 31 0d 0a 0d 0a  ncr index -1....
4350: 20 20 20 20 20 20 69 66 20 7b 24 69 6e 64 65 78        if {$index
4360: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74        return [st
4380: 72 69 6e 67 20 72 61 6e 67 65 20 24 65 72 72 6f  ring range $erro
4390: 72 20 30 20 24 69 6e 64 65 78 5d 0d 0a 20 20 20  r 0 $index]..   
43a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
43b0: 20 20 20 72 65 74 75 72 6e 20 24 65 72 72 6f 72     return $error
43c0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
43d0: 20 63 61 6c 63 75 6c 61 74 65 42 6f 67 6f 43 6f   calculateBogoCo
43e0: 70 73 20 7b 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e  ps { {millisecon
43f0: 64 73 20 32 30 30 30 7d 20 7b 6c 65 67 61 63 79  ds 2000} {legacy
4400: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
4410: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
4420: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
4430: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
4440: 65 63 6f 6e 64 73 20 72 65 71 75 65 73 74 65 64  econds requested
4450: 20 69 73 20 67 72 65 61 74 65 72 0d 0a 20 20 20   is greater..   
4460: 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65   #       than ze
4470: 72 6f 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ro...    #..    
4480: 69 66 20 7b 24 6d 69 6c 6c 69 73 65 63 6f 6e 64  if {$millisecond
4490: 73 20 3c 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s <= 0} then {..
44a0: 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
44b0: 6f 6d 70 6c 61 69 6e 20 3a 3a 74 65 73 74 5f 73  omplain ::test_s
44c0: 75 69 74 65 5f 72 75 6e 6e 69 6e 67 0d 0a 20 20  uite_running..  
44d0: 20 20 20 20 65 72 72 6f 72 20 22 6e 75 6d 62 65      error "numbe
44e0: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
44f0: 73 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  s must be greate
4500: 72 20 74 68 61 6e 20 7a 65 72 6f 22 0d 0a 20 20  r than zero"..  
4510: 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20    }....    #..  
4520: 20 20 23 20 48 41 43 4b 3a 20 44 69 66 66 65 72    # HACK: Differ
4530: 65 6e 74 20 74 65 63 68 6e 69 71 75 65 73 20 61  ent techniques a
4540: 72 65 20 75 73 65 64 20 74 6f 20 63 61 6c 63 75  re used to calcu
4550: 6c 61 74 65 20 74 68 65 20 70 65 72 66 6f 72 6d  late the perform
4560: 61 6e 63 65 20 6f 66 0d 0a 20 20 20 20 23 20 20  ance of..    #  
4570: 20 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65       the machine
4580: 20 66 6f 72 20 54 63 6c 20 61 6e 64 20 45 61 67   for Tcl and Eag
4590: 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  le...    #..    
45a0: 69 66 20 7b 21 24 6c 65 67 61 63 79 20 26 26 20  if {!$legacy && 
45b0: 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20  [isEagle]} then 
45c0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
45d0: 20 20 23 20 42 55 47 42 55 47 3a 20 54 63 6c 20    # BUGBUG: Tcl 
45e0: 38 2e 34 20 64 6f 65 73 20 6e 6f 74 20 6c 69 6b  8.4 does not lik
45f0: 65 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  e this expressio
4600: 6e 20 28 61 6e 64 20 54 63 6c 20 74 72 69 65 73  n (and Tcl tries
4610: 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
4620: 20 20 20 20 20 63 6f 6d 70 69 6c 65 20 69 74 20       compile it 
4630: 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 77  even though it w
4640: 69 6c 6c 20 6f 6e 6c 79 20 61 63 74 75 61 6c 6c  ill only actuall
4650: 79 20 65 76 65 72 20 62 65 0d 0a 20 20 20 20 20  y ever be..     
4660: 20 23 20 20 20 20 20 20 20 20 20 65 76 61 6c 75   #         evalu
4670: 61 74 65 64 20 69 6e 20 45 61 67 6c 65 29 2e 0d  ated in Eagle)..
4680: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4690: 73 65 74 20 65 78 70 72 20 7b 5b 63 61 74 63 68  set expr {[catch
46a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69   {..        stri
46b0: 6e 67 20 66 69 72 73 74 20 2d 74 69 6d 65 6f 75  ng first -timeou
46c0: 74 20 5b 74 69 6d 65 20 6e 6f 70 20 2d 31 20 2d  t [time nop -1 -
46d0: 2d 2d 5d 0d 0a 20 20 20 20 20 20 7d 20 74 69 6d  --]..      } tim
46e0: 65 6f 75 74 5d 20 69 6e 20 5b 6c 69 73 74 20 30  eout] in [list 0
46f0: 20 32 5d 20 26 26 20 24 74 69 6d 65 6f 75 74 20   2] && $timeout 
4700: 21 3d 20 2d 31 7d 0d 0a 0d 0a 20 20 20 20 20 20  != -1}....      
4710: 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a  #..      # HACK:
4720: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
4730: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 22 2d 74  rmine if the "-t
4740: 69 6d 65 6f 75 74 22 20 6f 70 74 69 6f 6e 20 66  imeout" option f
4750: 6f 72 20 5b 74 69 6d 65 5d 20 69 73 0d 0a 20 20  or [time] is..  
4760: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
4770: 6c 61 62 6c 65 2e 20 20 49 66 20 73 6f 2c 20 75  lable.  If so, u
4780: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  se it...      #.
4790: 0a 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70 72  .      if {[expr
47a0: 20 24 65 78 70 72 5d 7d 20 74 68 65 6e 20 7b 0d   $expr]} then {.
47b0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
47c0: 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  e [catch {..    
47d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
47e0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
47f0: 69 73 20 74 68 65 20 6d 6f 73 74 20 72 6f 62 75  is the most robu
4800: 73 74 20 6d 65 74 68 6f 64 2c 20 69 2e 65 2e 20  st method, i.e. 
4810: 75 73 65 20 74 68 65 20 22 2d 74 69 6d 65 6f 75  use the "-timeou
4820: 74 22 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  t"..          # 
4830: 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20        option to 
4840: 74 68 65 20 5b 74 69 6d 65 5d 20 63 6f 6d 6d 61  the [time] comma
4850: 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nd...          #
4860: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
4870: 62 65 66 6f 72 65 20 5b 69 6e 66 6f 20 63 6d 64  before [info cmd
4880: 63 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  count]..        
4890: 20 20 63 61 74 63 68 20 7b 74 69 6d 65 20 7b 6e    catch {time {n
48a0: 6f 70 7d 20 2d 31 20 2d 74 69 6d 65 6f 75 74 20  op} -1 -timeout 
48b0: 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 7d 3b 20  $milliseconds}; 
48c0: 23 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 6f 70 2e  # internal loop.
48d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
48e0: 61 66 74 65 72 20 5b 69 6e 66 6f 20 63 6d 64 63  after [info cmdc
48f0: 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ount]....       
4900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4910: 23 20 48 41 43 4b 3a 20 4d 6f 6e 6f 20 68 61 73  # HACK: Mono has
4920: 20 61 20 62 75 67 20 74 68 61 74 20 72 65 73 75   a bug that resu
4930: 6c 74 73 20 69 6e 20 65 78 63 65 73 73 69 76 65  lts in excessive
4940: 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73 0d   trailing zeros.
4950: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
4960: 20 20 20 68 65 72 65 20 28 4d 6f 6e 6f 20 62 75     here (Mono bu
4970: 67 20 23 36 35 35 37 38 30 29 2e 0d 0a 20 20 20  g #655780)...   
4980: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4990: 20 20 20 20 69 66 20 7b 5b 69 73 4d 6f 6e 6f 5d      if {[isMono]
49a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
49b0: 20 20 20 20 20 20 65 78 70 72 20 7b 64 6f 75 62        expr {doub
49c0: 6c 65 28 28 24 61 66 74 65 72 20 2d 20 24 62 65  le(($after - $be
49d0: 66 6f 72 65 29 20 2f 20 28 24 6d 69 6c 6c 69 73  fore) / ($millis
49e0: 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 2e 30 29  econds / 1000.0)
49f0: 29 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  )}..          } 
4a00: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
4a10: 20 20 20 20 65 78 70 72 20 7b 28 24 61 66 74 65      expr {($afte
4a20: 72 20 2d 20 24 62 65 66 6f 72 65 29 20 2f 20 28  r - $before) / (
4a30: 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20  $milliseconds / 
4a40: 31 30 30 30 2e 30 29 7d 0d 0a 20 20 20 20 20 20  1000.0)}..      
4a50: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
4a60: 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20   result]....    
4a70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4a80: 20 4e 4f 54 45 3a 20 49 66 20 77 65 20 66 61 69   NOTE: If we fai
4a90: 6c 65 64 20 61 62 6f 76 65 2c 20 72 65 74 75 72  led above, retur
4aa0: 6e 20 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69  n an obviously i
4ab0: 6e 76 61 6c 69 64 20 72 65 73 75 6c 74 0d 0a 20  nvalid result.. 
4ac0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
4ad0: 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  nstead...       
4ae0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
4af0: 24 63 6f 64 65 20 3d 3d 20 30 7d 20 74 68 65 6e  $code == 0} then
4b00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
4b10: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
4b20: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
4b30: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4b40: 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   0..        }.. 
4b50: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
4b60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4b70: 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20 63    # HACK: This c
4b80: 61 6c 63 75 6c 61 74 69 6f 6e 20 6d 65 74 68 6f  alculation metho
4b90: 64 20 28 69 2e 65 2e 20 75 73 69 6e 67 20 5b 61  d (i.e. using [a
4ba0: 66 74 65 72 5d 20 74 6f 20 63 61 6e 63 65 6c 20  fter] to cancel 
4bb0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
4bc0: 20 20 20 20 20 5b 74 69 6d 65 5d 20 63 6f 6d 6d       [time] comm
4bd0: 61 6e 64 20 61 66 74 65 72 20 74 68 65 20 73 70  and after the sp
4be0: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
4bf0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 0d  f milliseconds).
4c00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4c10: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
4c20: 63 65 73 73 61 72 79 20 61 73 20 6f 66 20 42 65  cessary as of Be
4c30: 74 61 20 34 35 3b 20 68 6f 77 65 76 65 72 2c 20  ta 45; however, 
4c40: 69 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20  it will be..    
4c50: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 61      #       reta
4c60: 69 6e 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72  ined for backwar
4c70: 64 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  d compatibility 
4c80: 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 72 65  with previous re
4c90: 6c 65 61 73 65 73 0d 0a 20 20 20 20 20 20 20 20  leases..        
4ca0: 23 20 20 20 20 20 20 20 73 6f 6c 65 6c 79 20 66  #       solely f
4cb0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
4cc0: 66 20 72 75 6e 6e 69 6e 67 20 63 6f 6d 70 61 72  f running compar
4cd0: 61 74 69 76 65 20 62 65 6e 63 68 6d 61 72 6b 73  ative benchmarks
4ce0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4cf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61        # NOTE: Sa
4d00: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ve the current r
4d10: 65 61 64 69 6e 65 73 73 20 6c 69 6d 69 74 20 66  eadiness limit f
4d20: 6f 72 20 6c 61 74 65 72 20 72 65 73 74 6f 72 61  or later restora
4d30: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  tion..        # 
4d40: 20 20 20 20 20 20 61 6e 64 20 74 68 65 6e 20 73        and then s
4d50: 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  et the current r
4d60: 65 61 64 69 6e 65 73 73 20 6c 69 6d 69 74 20 74  eadiness limit t
4d70: 6f 20 61 6c 77 61 79 73 20 63 68 65 63 6b 0d 0a  o always check..
4d80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d90: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
4da0: 72 65 61 64 69 6e 65 73 73 20 28 64 65 66 61 75  readiness (defau
4db0: 6c 74 29 2e 20 20 49 66 20 74 68 69 73 20 77 61  lt).  If this wa
4dc0: 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
4dd0: 20 20 20 20 20 20 20 64 6f 6e 65 2c 20 74 68 65         done, the
4de0: 20 5b 69 6e 74 65 72 70 20 63 61 6e 63 65 6c 5d   [interp cancel]
4df0: 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 74 68 69 73   command in this
4e00: 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79 0d 0a   procedure may..
4e10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e20: 68 61 76 65 20 6e 6f 20 65 66 66 65 63 74 2c 20  have no effect, 
4e30: 77 68 69 63 68 20 63 6f 75 6c 64 20 63 61 75 73  which could caus
4e40: 65 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  e this procedure
4e50: 20 74 6f 20 72 75 6e 0d 0a 20 20 20 20 20 20 20   to run..       
4e60: 20 23 20 20 20 20 20 20 20 66 6f 72 65 76 65 72   #       forever
4e70: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4e80: 20 20 20 20 20 20 73 65 74 20 72 65 61 64 79 6c        set readyl
4e90: 69 6d 69 74 20 5b 69 6e 74 65 72 70 20 72 65 61  imit [interp rea
4ea0: 64 79 6c 69 6d 69 74 20 7b 7d 5d 0d 0a 20 20 20  dylimit {}]..   
4eb0: 20 20 20 20 20 69 6e 74 65 72 70 20 72 65 61 64       interp read
4ec0: 79 6c 69 6d 69 74 20 7b 7d 20 30 0d 0a 0d 0a 20  ylimit {} 0.... 
4ed0: 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20         try {..  
4ee0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4ef0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76       # NOTE: Sav
4f00: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 61  e the current ba
4f10: 63 6b 67 72 6f 75 6e 64 20 65 72 72 6f 72 20 68  ckground error h
4f20: 61 6e 64 6c 65 72 20 66 6f 72 20 6c 61 74 65 72  andler for later
4f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4f40: 20 20 20 20 72 65 73 74 6f 72 61 74 69 6f 6e 20      restoration 
4f50: 61 6e 64 20 74 68 65 6e 20 72 65 73 65 74 20 74  and then reset t
4f60: 68 65 20 63 75 72 72 65 6e 74 20 62 61 63 6b 67  he current backg
4f70: 72 6f 75 6e 64 0d 0a 20 20 20 20 20 20 20 20 20  round..         
4f80: 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 68   #       error h
4f90: 61 6e 64 6c 65 72 20 74 6f 20 6e 6f 74 68 69 6e  andler to nothin
4fa0: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  g...          #.
4fb0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 62  .          set b
4fc0: 67 65 72 72 6f 72 20 5b 69 6e 74 65 72 70 20 62  gerror [interp b
4fd0: 67 65 72 72 6f 72 20 7b 7d 5d 0d 0a 20 20 20 20  gerror {}]..    
4fe0: 20 20 20 20 20 20 69 6e 74 65 72 70 20 62 67 65        interp bge
4ff0: 72 72 6f 72 20 7b 7d 20 22 22 0d 0a 0d 0a 20 20  rror {} ""....  
5000: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20          try {.. 
5010: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
5020: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
5030: 3a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  : Save the curre
5040: 6e 74 20 5b 61 66 74 65 72 5d 20 66 6c 61 67 73  nt [after] flags
5050: 20 66 6f 72 20 6c 61 74 65 72 20 72 65 73 74 6f   for later resto
5060: 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ration..        
5070: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
5080: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 6d 20  then reset them 
5090: 74 6f 20 70 72 6f 63 65 73 73 20 65 76 65 6e 74  to process event
50a0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a  s immediately...
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
50c0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66             set f
50d0: 6c 61 67 73 20 5b 61 66 74 65 72 20 66 6c 61 67  lags [after flag
50e0: 73 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s]..            
50f0: 61 66 74 65 72 20 66 6c 61 67 73 20 3d 49 6d 6d  after flags =Imm
5100: 65 64 69 61 74 65 0d 0a 0d 0a 20 20 20 20 20 20  ediate....      
5110: 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20        try {..   
5120: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
5130: 6f 64 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20  ode [catch {..  
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
5150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5160: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
5170: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5180: 68 65 20 5b 61 66 74 65 72 5d 20 65 76 65 6e 74  he [after] event
5190: 20 71 75 65 75 65 0d 0a 20 20 20 20 20 20 20 20   queue..        
51a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
51b0: 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  for the interpre
51c0: 74 65 72 20 69 73 20 74 6f 74 61 6c 6c 79 20 65  ter is totally e
51d0: 6d 70 74 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mpty...         
51e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
51f0: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
5200: 7b 66 6f 72 65 61 63 68 20 69 64 20 5b 61 66 74  {foreach id [aft
5210: 65 72 20 69 6e 66 6f 5d 20 7b 61 66 74 65 72 20  er info] {after 
5220: 63 61 6e 63 65 6c 20 24 69 64 7d 7d 0d 0a 0d 0a  cancel $id}}....
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
5250: 20 20 20 23 20 4e 4f 54 45 3a 20 53 63 68 65 64     # NOTE: Sched
5260: 75 6c 65 20 74 68 65 20 65 76 65 6e 74 20 74 6f  ule the event to
5270: 20 63 61 6e 63 65 6c 20 74 68 65 20 73 63 72 69   cancel the scri
5280: 70 74 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20  pt we are..     
5290: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
52a0: 20 20 20 61 62 6f 75 74 20 74 6f 20 65 76 61 6c     about to eval
52b0: 75 61 74 65 2c 20 63 61 70 74 75 72 69 6e 67 20  uate, capturing 
52c0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 77 65 20 63  the name so we c
52d0: 61 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  an..            
52e0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 63      #       canc
52f0: 65 6c 20 69 74 20 6c 61 74 65 72 2c 20 69 66 20  el it later, if 
5300: 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20  necessary...    
5310: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5330: 65 74 20 65 76 65 6e 74 20 5b 61 66 74 65 72 20  et event [after 
5340: 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 5b 6c  $milliseconds [l
5350: 69 73 74 20 69 6e 74 65 72 70 20 63 61 6e 63 65  ist interp cance
5360: 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l]]....         
5370: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5380: 20 20 20 20 20 20 20 20 20 20 23 20 48 41 43 4b            # HACK
5390: 3a 20 54 68 65 72 65 20 69 73 20 61 20 70 6f 74  : There is a pot
53a0: 65 6e 74 69 61 6c 20 22 72 61 63 65 20 63 6f 6e  ential "race con
53b0: 64 69 74 69 6f 6e 22 20 68 65 72 65 2e 20 20 49  dition" here.  I
53c0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  f the..         
53d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
53e0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
53f0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
5400: 65 6c 61 70 73 65 73 20 62 65 66 6f 72 65 20 28  elapses before (
5410: 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  or..            
5420: 20 20 20 20 23 20 20 20 20 20 20 20 61 66 74 65      #       afte
5430: 72 29 20 65 6e 74 65 72 69 6e 67 20 74 68 65 20  r) entering the 
5440: 5b 63 61 74 63 68 5d 20 73 63 72 69 70 74 20 62  [catch] script b
5450: 6c 6f 63 6b 20 28 62 65 6c 6f 77 29 0d 0a 20 20  lock (below)..  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5470: 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 72        then the r
5480: 65 73 75 6c 74 69 6e 67 20 73 63 72 69 70 74 20  esulting script 
5490: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 20 65 72 72  cancellation err
54a0: 6f 72 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  or will..       
54b0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
54c0: 20 6e 6f 74 20 62 65 20 63 61 75 67 68 74 20 61   not be caught a
54d0: 6e 64 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  nd we will be un
54e0: 61 62 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 74  able to return t
54f0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
5500: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 72      #       corr
5510: 65 63 74 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ect result to th
5520: 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  e caller...     
5530: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
5550: 74 20 62 65 66 6f 72 65 20 5b 69 6e 66 6f 20 63  t before [info c
5560: 6d 64 63 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20  mdcount]..      
5570: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
5580: 7b 74 69 6d 65 20 7b 6e 6f 70 7d 20 2d 31 7d 3b  {time {nop} -1};
5590: 20 23 20 75 73 65 73 20 74 68 65 20 5b 74 69 6d   # uses the [tim
55a0: 65 5d 20 69 6e 74 65 72 6e 61 6c 20 62 75 73 79  e] internal busy
55b0: 20 6c 6f 6f 70 2e 0d 0a 20 20 20 20 20 20 20 20   loop...        
55c0: 20 20 20 20 20 20 20 20 73 65 74 20 61 66 74 65          set afte
55d0: 72 20 5b 69 6e 66 6f 20 63 6d 64 63 6f 75 6e 74  r [info cmdcount
55e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
55f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5600: 20 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20          # HACK: 
5610: 4d 6f 6e 6f 20 68 61 73 20 61 20 62 75 67 20 74  Mono has a bug t
5620: 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 65  hat results in e
5630: 78 63 65 73 73 69 76 65 20 74 72 61 69 6c 69 6e  xcessive trailin
5640: 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g..             
5650: 20 20 20 23 20 20 20 20 20 20 20 7a 65 72 6f 73     #       zeros
5660: 20 68 65 72 65 20 28 4d 6f 6e 6f 20 62 75 67 20   here (Mono bug 
5670: 23 36 35 35 37 38 30 29 2e 0d 0a 20 20 20 20 20  #655780)...     
5680: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
56a0: 20 7b 5b 69 73 4d 6f 6e 6f 5d 7d 20 74 68 65 6e   {[isMono]} then
56b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
56c0: 20 20 20 20 20 20 65 78 70 72 20 7b 64 6f 75 62        expr {doub
56d0: 6c 65 28 28 24 61 66 74 65 72 20 2d 20 24 62 65  le(($after - $be
56e0: 66 6f 72 65 29 20 2f 20 28 24 6d 69 6c 6c 69 73  fore) / ($millis
56f0: 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 2e 30 29  econds / 1000.0)
5700: 29 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )}..            
5710: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 65 78 70 72 20 7b 28 24 61 66 74 65 72 20 2d 20  expr {($after - 
5740: 24 62 65 66 6f 72 65 29 20 2f 20 28 24 6d 69 6c  $before) / ($mil
5750: 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  liseconds / 1000
5760: 2e 30 29 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  .0)}..          
5770: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5780: 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
5790: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
57a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
57b0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 77 65     # NOTE: If we
57c0: 20 66 61 69 6c 65 64 20 64 75 65 20 74 6f 20 74   failed due to t
57d0: 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
57e0: 6e 20 65 78 70 6c 61 69 6e 65 64 0d 0a 20 20 20  n explained..   
57f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
5800: 20 20 20 61 62 6f 76 65 2c 20 72 65 74 75 72 6e     above, return
5810: 20 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e   an obviously in
5820: 76 61 6c 69 64 20 72 65 73 75 6c 74 20 69 6e 73  valid result ins
5830: 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  tead...         
5840: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5850: 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20        if {$code 
5860: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
5880: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
5890: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
58a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
58b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a        return 0..
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
58d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66  .            } f
58e0: 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
58f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
5900: 6f 20 65 78 69 73 74 73 20 65 76 65 6e 74 5d 7d  o exists event]}
5910: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5920: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
5930: 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 65 76  after cancel $ev
5940: 65 6e 74 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  ent}..          
5950: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
5960: 20 20 20 20 20 20 20 61 66 74 65 72 20 66 6c 61         after fla
5970: 67 73 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3d  gs [appendArgs =
5980: 20 24 66 6c 61 67 73 5d 0d 0a 20 20 20 20 20 20   $flags]..      
5990: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
59a0: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
59c0: 72 70 20 62 67 65 72 72 6f 72 20 7b 7d 20 24 62  rp bgerror {} $b
59d0: 67 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  gerror..        
59e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66    }..        } f
59f0: 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
5a00: 20 20 20 20 69 6e 74 65 72 70 20 72 65 61 64 79      interp ready
5a10: 6c 69 6d 69 74 20 7b 7d 20 24 72 65 61 64 79 6c  limit {} $readyl
5a20: 69 6d 69 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d  imit..        }.
5a30: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20  .      }..    } 
5a40: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d  else {..      #.
5a50: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
5a60: 65 63 6f 72 64 20 74 68 65 20 69 6e 69 74 69 61  ecord the initia
5a70: 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 63 6f  l Tcl command co
5a80: 75 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  unt...      #.. 
5a90: 20 20 20 20 20 73 65 74 20 62 65 66 6f 72 65 20       set before 
5aa0: 5b 69 6e 66 6f 20 63 6d 64 63 6f 75 6e 74 5d 0d  [info cmdcount].
5ab0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5ac0: 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 63 75 6c    # NOTE: Calcul
5ad0: 61 74 65 20 68 6f 77 20 6d 61 6e 79 20 77 68 6f  ate how many who
5ae0: 6c 65 20 73 65 63 6f 6e 64 73 20 77 65 20 6e 65  le seconds we ne
5af0: 65 64 20 74 6f 20 73 70 69 6e 20 66 6f 72 2e 0d  ed to spin for..
5b00: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5b10: 73 65 74 20 73 65 63 6f 6e 64 73 20 5b 65 78 70  set seconds [exp
5b20: 72 20 7b 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  r {$milliseconds
5b30: 20 2f 20 31 30 30 30 7d 5d 0d 0a 0d 0a 20 20 20   / 1000}]....   
5b40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5b50: 54 45 3a 20 43 61 6c 63 75 6c 61 74 65 20 74 68  TE: Calculate th
5b60: 65 20 73 74 61 72 74 69 6e 67 20 61 6e 64 20 65  e starting and e
5b70: 6e 64 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20  nding values of 
5b80: 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 2e  [clock seconds].
5b90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5ba0: 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20   set now [clock 
5bb0: 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
5bc0: 73 65 74 20 73 74 61 72 74 20 24 6e 6f 77 3b 20  set start $now; 
5bd0: 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
5be0: 24 6e 6f 77 20 2b 20 24 73 65 63 6f 6e 64 73 7d  $now + $seconds}
5bf0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
5c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 6e      # NOTE: Do n
5c10: 6f 74 68 69 6e 67 20 66 6f 72 20 58 20 73 65 63  othing for X sec
5c20: 6f 6e 64 73 20 28 69 2e 65 2e 20 65 78 63 65 70  onds (i.e. excep
5c30: 74 20 63 61 6c 6c 20 5b 63 6c 6f 63 6b 20 73 65  t call [clock se
5c40: 63 6f 6e 64 73 5d 29 2e 0d 0a 20 20 20 20 20 20  conds])...      
5c50: 23 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b  #..      while {
5c60: 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26  $start <= $now &
5c70: 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 20  & $now < $stop} 
5c80: 7b 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20  {set now [clock 
5c90: 73 65 63 6f 6e 64 73 5d 7d 0d 0a 0d 0a 20 20 20  seconds]}....   
5ca0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5cb0: 54 45 3a 20 52 65 63 6f 72 64 20 74 68 65 20 66  TE: Record the f
5cc0: 69 6e 61 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  inal Tcl command
5cd0: 20 63 6f 75 6e 74 2e 0d 0a 20 20 20 20 20 20 23   count...      #
5ce0: 0d 0a 20 20 20 20 20 20 73 65 74 20 61 66 74 65  ..      set afte
5cf0: 72 20 5b 69 6e 66 6f 20 63 6d 64 63 6f 75 6e 74  r [info cmdcount
5d00: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
5d10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 63      # NOTE: Calc
5d20: 75 6c 61 74 65 20 61 70 70 72 6f 78 69 6d 61 74  ulate approximat
5d30: 65 6c 79 20 68 6f 77 20 6d 61 6e 79 20 54 63 6c  ely how many Tcl
5d40: 20 63 6f 6d 6d 61 6e 64 73 20 70 65 72 20 73 65   commands per se
5d50: 63 6f 6e 64 20 77 65 72 65 0d 0a 20 20 20 20 20  cond were..     
5d60: 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65   #       execute
5d70: 64 20 64 75 72 69 6e 67 20 74 68 65 20 74 69 6d  d during the tim
5d80: 65 64 20 6c 6f 6f 70 20 28 61 62 6f 76 65 29 2e  ed loop (above).
5d90: 20 20 44 75 65 20 74 6f 20 76 61 72 69 6f 75 73    Due to various
5da0: 20 74 68 69 6e 67 73 2c 0d 0a 20 20 20 20 20 20   things,..      
5db0: 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
5dc0: 67 20 6f 76 65 72 68 65 61 64 20 61 73 73 6f 63  g overhead assoc
5dd0: 69 61 74 65 64 20 77 69 74 68 20 5b 63 6c 6f 63  iated with [cloc
5de0: 6b 20 73 65 63 6f 6e 64 73 5d 2c 20 74 68 69 73  k seconds], this
5df0: 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23   number..      #
5e00: 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 61 73         is not as
5e10: 20 61 63 63 75 72 61 74 65 20 61 73 20 74 68 65   accurate as the
5e20: 20 6f 6e 65 20 66 6f 72 20 45 61 67 6c 65 3b 20   one for Eagle; 
5e30: 68 6f 77 65 76 65 72 2c 20 69 74 27 73 20 67 65  however, it's ge
5e40: 6e 65 72 61 6c 6c 79 0d 0a 20 20 20 20 20 20 23  nerally..      #
5e50: 20 20 20 20 20 20 20 67 6f 6f 64 20 65 6e 6f 75         good enou
5e60: 67 68 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gh...      #..  
5e70: 20 20 20 20 65 78 70 72 20 7b 28 24 61 66 74 65      expr {($afte
5e80: 72 20 2d 20 24 62 65 66 6f 72 65 29 20 2f 20 64  r - $before) / d
5e90: 6f 75 62 6c 65 28 24 73 65 63 6f 6e 64 73 29 7d  ouble($seconds)}
5ea0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
5eb0: 0a 20 20 70 72 6f 63 20 63 61 6c 63 75 6c 61 74  .  proc calculat
5ec0: 65 52 65 6c 61 74 69 76 65 50 65 72 66 6f 72 6d  eRelativePerform
5ed0: 61 6e 63 65 20 7b 20 74 79 70 65 20 76 61 6c 75  ance { type valu
5ee0: 65 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  e } {..    #..  
5ef0: 20 20 23 20 4e 4f 54 45 3a 20 41 64 6a 75 73 74    # NOTE: Adjust
5f00: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 70 65   the expected pe
5f10: 72 66 6f 72 6d 61 6e 63 65 20 6e 75 6d 62 65 72  rformance number
5f20: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0d 0a 20   based on the.. 
5f30: 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61 74     #       relat
5f40: 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ive performance 
5f50: 6f 66 20 74 68 69 73 20 6d 61 63 68 69 6e 65 2c  of this machine,
5f60: 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   if available...
5f70: 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
5f80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
5f90: 73 74 5f 62 61 73 65 5f 63 6f 70 73 5d 20 26 26  st_base_cops] &&
5fa0: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a   [info exists ::
5fb0: 74 65 73 74 5f 63 6f 70 73 5d 7d 20 74 68 65 6e  test_cops]} then
5fc0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
5fd0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 69 62     # NOTE: Calib
5fe0: 72 61 74 65 20 74 68 65 20 65 78 70 65 63 74 65  rate the expecte
5ff0: 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6e 75  d performance nu
6000: 6d 62 65 72 73 20 62 61 73 65 64 0d 0a 20 20 20  mbers based..   
6010: 20 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68     #       on th
6020: 65 20 72 61 74 69 6f 20 6f 66 20 74 68 65 20 62  e ratio of the b
6030: 61 73 65 6c 69 6e 65 20 70 65 72 66 6f 72 6d 61  aseline performa
6040: 63 65 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  ce to the..     
6050: 20 23 20 20 20 20 20 20 20 63 75 72 72 65 6e 74   #       current
6060: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0d 0a 20   performance... 
6070: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 77       #..      sw
6080: 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24  itch -exact -- $
6090: 74 79 70 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  type {..        
60a0: 65 6c 61 70 73 65 64 20 7b 0d 0a 20 20 20 20 20  elapsed {..     
60b0: 20 20 20 20 20 69 66 20 7b 24 3a 3a 74 65 73 74       if {$::test
60c0: 5f 63 6f 70 73 20 21 3d 20 30 7d 20 74 68 65 6e  _cops != 0} then
60d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
60e0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 64 6f  return [expr {do
60f0: 75 62 6c 65 28 24 76 61 6c 75 65 29 20 2a 20 5c  uble($value) * \
6100: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6110: 20 20 28 24 3a 3a 74 65 73 74 5f 62 61 73 65 5f    ($::test_base_
6120: 63 6f 70 73 20 2f 20 24 3a 3a 74 65 73 74 5f 63  cops / $::test_c
6130: 6f 70 73 29 7d 5d 0d 0a 20 20 20 20 20 20 20 20  ops)}]..        
6140: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
6150: 20 20 20 20 20 20 20 20 69 74 65 72 61 74 69 6f          iteratio
6160: 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ns {..          
6170: 69 66 20 7b 24 3a 3a 74 65 73 74 5f 62 61 73 65  if {$::test_base
6180: 5f 63 6f 70 73 20 21 3d 20 30 7d 20 74 68 65 6e  _cops != 0} then
6190: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
61a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 64 6f  return [expr {do
61b0: 75 62 6c 65 28 24 76 61 6c 75 65 29 20 2a 20 5c  uble($value) * \
61c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
61d0: 20 20 28 24 3a 3a 74 65 73 74 5f 63 6f 70 73 20    ($::test_cops 
61e0: 2f 20 24 3a 3a 74 65 73 74 5f 62 61 73 65 5f 63  / $::test_base_c
61f0: 6f 70 73 29 7d 5d 0d 0a 20 20 20 20 20 20 20 20  ops)}]..        
6200: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
6210: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6220: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 76 61  ..    return $va
6230: 6c 75 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  lue..  }.....  p
6240: 72 6f 63 20 66 6f 72 6d 61 74 54 69 6d 65 53 74  roc formatTimeSt
6250: 61 6d 70 20 7b 20 73 65 63 6f 6e 64 73 20 7b 67  amp { seconds {g
6260: 6d 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  mt false} } {.. 
6270: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
6280: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6290: 72 65 74 75 72 6e 20 5b 63 6c 6f 63 6b 20 66 6f  return [clock fo
62a0: 72 6d 61 74 20 24 73 65 63 6f 6e 64 73 20 2d 67  rmat $seconds -g
62b0: 6d 74 20 24 67 6d 74 20 2d 69 73 6f 20 2d 69 73  mt $gmt -iso -is
62c0: 6f 74 69 6d 65 7a 6f 6e 65 5d 0d 0a 20 20 20 20  otimezone]..    
62d0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
62e0: 72 65 74 75 72 6e 20 5b 63 6c 6f 63 6b 20 66 6f  return [clock fo
62f0: 72 6d 61 74 20 24 73 65 63 6f 6e 64 73 20 2d 67  rmat $seconds -g
6300: 6d 74 20 24 67 6d 74 20 2d 66 6f 72 6d 61 74 20  mt $gmt -format 
6310: 22 25 59 2d 25 6d 2d 25 64 54 25 48 3a 25 4d 3a  "%Y-%m-%dT%H:%M:
6320: 25 53 20 25 5a 22 5d 0d 0a 20 20 20 20 7d 0d 0a  %S %Z"]..    }..
6330: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 66    }.....  proc f
6340: 6f 72 6d 61 74 45 6c 61 70 73 65 64 54 69 6d 65  ormatElapsedTime
6350: 20 7b 20 73 65 63 6f 6e 64 73 20 7d 20 7b 0d 0a   { seconds } {..
6360: 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
6370: 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 5b 69  ] && [llength [i
6380: 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a  nfo commands obj
6390: 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ect]] > 0} then 
63a0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
63b0: 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
63c0: 20 61 20 54 69 6d 65 53 70 61 6e 20 69 6e 73 74   a TimeSpan inst
63d0: 61 6e 63 65 20 62 61 73 65 64 20 6f 6e 20 74 68  ance based on th
63e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 68 6f 6c  e number of whol
63f0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6400: 20 73 65 63 6f 6e 64 73 2e 0d 0a 20 20 20 20 20   seconds...     
6410: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 74 69   #..      set ti
6420: 6d 65 53 70 61 6e 20 5b 6f 62 6a 65 63 74 20 69  meSpan [object i
6430: 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 2d 61  nvoke -create -a
6440: 6c 69 61 73 20 54 69 6d 65 53 70 61 6e 20 46 72  lias TimeSpan Fr
6450: 6f 6d 53 65 63 6f 6e 64 73 20 5c 0d 0a 20 20 20  omSeconds \..   
6460: 20 20 20 20 20 20 20 24 73 65 63 6f 6e 64 73 5d         $seconds]
6470: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
6480: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
6490: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
64a0: 73 65 63 6f 6e 64 73 20 61 6e 64 20 61 20 68 75  seconds and a hu
64b0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
64c0: 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
64d0: 20 20 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20     representing 
64e0: 74 68 65 20 54 69 6d 65 53 70 61 6e 20 69 6e 73  the TimeSpan ins
64f0: 74 61 6e 63 65 20 63 72 65 61 74 65 64 20 62 61  tance created ba
6500: 73 65 64 20 6f 6e 20 74 68 61 74 0d 0a 20 20 20  sed on that..   
6510: 20 20 20 23 20 20 20 20 20 20 20 73 61 6d 65 20     #       same 
6520: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
6530: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
6540: 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
6550: 64 41 72 67 73 20 24 73 65 63 6f 6e 64 73 20 22  dArgs $seconds "
6560: 20 73 65 63 6f 6e 64 73 20 28 22 20 5b 24 74 69   seconds (" [$ti
6570: 6d 65 53 70 61 6e 20 54 6f 53 74 72 69 6e 67 5d  meSpan ToString]
6580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 20   \..          " 
6590: 65 6c 61 70 73 65 64 20 74 69 6d 65 29 22 5d 0d  elapsed time)"].
65a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
65b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
65c0: 4e 4f 54 45 3a 20 55 6e 66 6f 72 74 75 6e 61 74  NOTE: Unfortunat
65d0: 65 6c 79 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ely, there is no
65e0: 20 62 75 69 6c 74 2d 69 6e 20 6e 61 74 69 76 65   built-in native
65f0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20   Tcl command..  
6600: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
6610: 20 63 61 6e 20 63 6f 72 72 65 63 74 6c 79 20 66   can correctly f
6620: 6f 72 6d 61 74 20 61 6e 20 65 6c 61 70 73 65 64  ormat an elapsed
6630: 20 74 69 6d 65 3b 20 74 68 65 72 65 66 6f 72 65   time; therefore
6640: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
6650: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
6660: 20 6e 75 6d 62 65 72 20 6f 66 20 77 68 6f 6c 65   number of whole
6670: 20 73 65 63 6f 6e 64 73 2e 0d 0a 20 20 20 20 20   seconds...     
6680: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
6690: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 65   [appendArgs $se
66a0: 63 6f 6e 64 73 20 22 20 73 65 63 6f 6e 64 73 22  conds " seconds"
66b0: 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  ]..    }..  }...
66c0: 0d 0a 20 20 70 72 6f 63 20 73 6f 75 72 63 65 49  ..  proc sourceI
66d0: 66 56 61 6c 69 64 20 7b 20 74 79 70 65 20 66 69  fValid { type fi
66e0: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
66f0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
6700: 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20  th $fileName] > 
6710: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6720: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
6730: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
6740: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
6750: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
6760: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
6770: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6780: 2d 2d 2d 2d 20 65 76 61 6c 75 61 74 69 6e 67 20  ---- evaluating 
6790: 22 20 24 74 79 70 65 20 22 20 66 69 6c 65 3a 20  " $type " file: 
67a0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
67b0: 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  \n]....        i
67c0: 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
67d0: 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63  el 1 [list sourc
67e0: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 65 72  e $fileName]} er
67f0: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
6800: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
6810: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
6820: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
6830: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
6840: 20 65 72 72 6f 72 20 64 75 72 69 6e 67 20 22 20   error during " 
6850: 24 74 79 70 65 20 22 20 66 69 6c 65 3a 20 22 20  $type " file: " 
6860: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20  $error \n]....  
6870: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6880: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6890: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
68a0: 6c 6f 67 67 65 64 2c 20 6e 6f 77 20 72 65 2d 74  logged, now re-t
68b0: 68 72 6f 77 20 69 74 2e 0d 0a 20 20 20 20 20 20  hrow it...      
68c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
68d0: 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
68e0: 69 6e 20 3a 3a 74 65 73 74 5f 73 75 69 74 65 5f  in ::test_suite_
68f0: 72 75 6e 6e 69 6e 67 0d 0a 20 20 20 20 20 20 20  running..       
6900: 20 20 20 65 72 72 6f 72 20 24 65 72 72 6f 72 20     error $error 
6910: 24 3a 3a 65 72 72 6f 72 49 6e 66 6f 20 24 3a 3a  $::errorInfo $::
6920: 65 72 72 6f 72 43 6f 64 65 0d 0a 20 20 20 20 20  errorCode..     
6930: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
6940: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
6950: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
6960: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
6970: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6980: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 22 20 24  ---- skipped " $
6990: 74 79 70 65 20 22 20 66 69 6c 65 3a 20 5c 22 22  type " file: \""
69a0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
69b0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
69c0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
69d0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  \n"]..      }.. 
69e0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
69f0: 70 72 6f 63 20 70 72 6f 63 65 73 73 54 65 73 74  proc processTest
6a00: 41 72 67 75 6d 65 6e 74 73 20 7b 20 76 61 72 4e  Arguments { varN
6a10: 61 6d 65 20 73 74 72 69 63 74 20 61 72 67 73 20  ame strict args 
6a20: 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  } {..    #..    
6a30: 23 20 4e 4f 54 45 3a 20 49 6e 69 74 69 61 6c 6c  # NOTE: Initiall
6a40: 79 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  y, there are no 
6a50: 75 6e 6b 6e 6f 77 6e 20 28 69 2e 65 2e 20 75 6e  unknown (i.e. un
6a60: 70 72 6f 63 65 73 73 65 64 29 20 61 72 67 75 6d  processed) argum
6a70: 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ents...    #..  
6a80: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
6a90: 73 74 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  st]....    #..  
6aa0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
6ab0: 20 67 6f 69 6e 67 20 74 6f 20 70 6c 61 63 65 20   going to place 
6ac0: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 6f  the configured o
6ad0: 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 76 61  ptions in the va
6ae0: 72 69 61 62 6c 65 0d 0a 20 20 20 20 23 20 20 20  riable..    #   
6af0: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
6b00: 79 20 74 68 65 20 6e 61 6d 65 20 70 72 6f 76 69  y the name provi
6b10: 64 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ded by the calle
6b20: 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  r...    #..    i
6b30: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
6b40: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
6b50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 75   then {..      u
6b60: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
6b70: 61 72 72 61 79 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  array..    }....
6b80: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 54 4f 44      #..    # TOD
6b90: 4f 3a 20 41 64 64 20 6d 6f 72 65 20 73 75 70 70  O: Add more supp
6ba0: 6f 72 74 20 66 6f 72 20 73 74 61 6e 64 61 72 64  ort for standard
6bb0: 20 22 74 63 6c 74 65 73 74 22 20 6f 70 74 69 6f   "tcltest" optio
6bc0: 6e 73 20 68 65 72 65 2e 0d 0a 20 20 20 20 23 0d  ns here...    #.
6bd0: 0a 20 20 20 20 73 65 74 20 6f 70 74 69 6f 6e 73  .    set options
6be0: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
6bf0: 20 20 2d 62 72 65 61 6b 4f 6e 4c 65 61 6b 20 2d    -breakOnLeak -
6c00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2d 63  configuration -c
6c10: 6f 6e 73 74 72 61 69 6e 74 73 20 2d 65 78 69 74  onstraints -exit
6c20: 4f 6e 43 6f 6d 70 6c 65 74 65 20 5c 0d 0a 20 20  OnComplete \..  
6c30: 20 20 20 20 20 20 2d 66 69 6c 65 20 2d 6c 6f 67        -file -log
6c40: 46 69 6c 65 20 2d 6c 6f 67 49 64 20 2d 6c 6f 67  File -logId -log
6c50: 50 61 74 68 20 2d 6d 61 63 68 69 6e 65 20 2d 6d  Path -machine -m
6c60: 61 74 63 68 20 2d 6e 61 6d 65 50 72 65 66 69 78  atch -namePrefix
6c70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 2d 6e 6f 20   \..        -no 
6c80: 2d 6e 6f 74 46 69 6c 65 20 2d 70 6c 61 74 66 6f  -notFile -platfo
6c90: 72 6d 20 2d 70 6f 73 74 54 65 73 74 20 2d 70 72  rm -postTest -pr
6ca0: 65 54 65 73 74 20 2d 70 6f 73 74 57 61 69 74 20  eTest -postWait 
6cb0: 2d 70 72 65 57 61 69 74 20 5c 0d 0a 20 20 20 20  -preWait \..    
6cc0: 20 20 20 20 2d 72 61 6e 64 6f 6d 4f 72 64 65 72      -randomOrder
6cd0: 20 2d 73 6b 69 70 20 2d 73 74 61 72 74 46 69 6c   -skip -startFil
6ce0: 65 20 2d 73 74 6f 70 46 69 6c 65 20 2d 73 74 6f  e -stopFile -sto
6cf0: 70 4f 6e 46 61 69 6c 75 72 65 20 5c 0d 0a 20 20  pOnFailure \..  
6d00: 20 20 20 20 20 20 2d 73 74 6f 70 4f 6e 4c 65 61        -stopOnLea
6d10: 6b 20 2d 73 75 66 66 69 78 20 2d 73 75 69 74 65  k -suffix -suite
6d20: 20 2d 74 63 6c 73 68 20 2d 74 68 72 65 73 68 6f   -tclsh -thresho
6d30: 6c 64 20 2d 75 6e 63 6f 75 6e 74 65 64 4c 65 61  ld -uncountedLea
6d40: 6b 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 2d 76  ks \..        -v
6d50: 65 72 62 6f 73 65 5d 0d 0a 0d 0a 20 20 20 20 73  erbose]....    s
6d60: 65 74 20 6c 65 6e 67 74 68 20 5b 6c 6c 65 6e 67  et length [lleng
6d70: 74 68 20 24 61 72 67 73 5d 0d 0a 0d 0a 20 20 20  th $args]....   
6d80: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
6d90: 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 6c 65  0} {$index < $le
6da0: 6e 67 74 68 7d 20 7b 69 6e 63 72 20 69 6e 64 65  ngth} {incr inde
6db0: 78 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  x} {..      #.. 
6dc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
6dd0: 62 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69  b the current li
6de0: 73 74 20 65 6c 65 6d 65 6e 74 2c 20 77 68 69 63  st element, whic
6df0: 68 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  h should be the 
6e00: 6e 61 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 23  name of..      #
6e10: 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 20         the test 
6e20: 6f 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 23  option...      #
6e30: 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65  ..      set name
6e40: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 24   [lindex $args $
6e50: 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20  index]....      
6e60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6e70: 20 55 73 65 20 74 68 65 20 5b 74 71 70 75 74 73   Use the [tqputs
6e80: 5d 20 63 6f 6d 6d 61 6e 64 20 68 65 72 65 20 6a  ] command here j
6e90: 75 73 74 20 69 6e 20 63 61 73 65 20 74 68 65 20  ust in case the 
6ea0: 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 0d 0a 20  test log file.. 
6eb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 68 61 73       #       has
6ec0: 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 75 70 20   not been setup 
6ed0: 79 65 74 20 28 69 2e 65 2e 20 62 79 20 64 65 66  yet (i.e. by def
6ee0: 61 75 6c 74 2c 20 74 68 69 73 20 70 72 6f 63 65  ault, this proce
6ef0: 64 75 72 65 20 69 73 0d 0a 20 20 20 20 20 20 23  dure is..      #
6f00: 20 20 20 20 20 20 20 61 6c 6d 6f 73 74 20 61 6c         almost al
6f10: 77 61 79 73 20 63 61 6c 6c 65 64 20 62 79 20 74  ways called by t
6f20: 68 65 20 74 65 73 74 20 70 72 6f 6c 6f 67 75 65  he test prologue
6f30: 20 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74   file prior to t
6f40: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
6f50: 20 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20    test log file 
6f60: 68 61 76 69 6e 67 20 62 65 65 6e 20 73 65 74 75  having been setu
6f70: 70 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  p and we do not 
6f80: 77 61 6e 74 20 74 6f 20 6a 75 73 74 0d 0a 20 20  want to just..  
6f90: 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 73 65      #       lose
6fa0: 20 74 68 69 73 20 6f 75 74 70 75 74 29 2e 0d 0a   this output)...
6fb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
6fc0: 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
6fd0: 63 74 20 24 6f 70 74 69 6f 6e 73 20 24 6e 61 6d  ct $options $nam
6fe0: 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
6ff0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7000: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
7010: 74 68 65 72 65 20 61 6e 6f 74 68 65 72 20 6c 69  there another li
7020: 73 74 20 65 6c 65 6d 65 6e 74 20 61 76 61 69 6c  st element avail
7030: 61 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  able for the val
7040: 75 65 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 20  ue?  If..       
7050: 20 23 20 20 20 20 20 20 20 6e 6f 74 2c 20 74 68   #       not, th
7060: 69 73 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  is is not a vali
7070: 64 20 74 65 73 74 20 6f 70 74 69 6f 6e 2e 0d 0a  d test option...
7080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7090: 20 20 20 69 66 20 7b 24 69 6e 64 65 78 20 2b 20     if {$index + 
70a0: 31 20 3c 20 24 6c 65 6e 67 74 68 7d 20 74 68 65  1 < $length} the
70b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
70c0: 6e 63 72 20 69 6e 64 65 78 3b 20 73 65 74 20 76  ncr index; set v
70d0: 61 6c 75 65 20 5b 6c 69 6e 64 65 78 20 24 61 72  alue [lindex $ar
70e0: 67 73 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20  gs $index]....  
70f0: 20 20 20 20 20 20 20 20 73 65 74 20 61 72 72 61          set arra
7100: 79 28 24 6e 61 6d 65 29 20 24 76 61 6c 75 65 0d  y($name) $value.
7110: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 71 70  ...          tqp
7120: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
7130: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7140: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7150: 20 22 2d 2d 2d 2d 20 6f 76 65 72 72 6f 64 65 20   "---- overrode 
7160: 74 65 73 74 20 6f 70 74 69 6f 6e 20 5c 22 22 20  test option \"" 
7170: 24 6e 61 6d 65 20 22 5c 22 20 77 69 74 68 20 76  $name "\" with v
7180: 61 6c 75 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  alue \"" \..    
7190: 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
71a0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
71b0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
71c0: 20 20 20 20 74 71 70 75 74 73 20 24 3a 3a 74 65      tqputs $::te
71d0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
71e0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
71f0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6e 6f          "---- no
7200: 20 76 61 6c 75 65 20 66 6f 72 20 74 65 73 74 20   value for test 
7210: 6f 70 74 69 6f 6e 20 5c 22 22 20 24 6e 61 6d 65  option \"" $name
7220: 20 22 5c 22 2c 20 69 67 6e 6f 72 65 64 5c 6e 22   "\", ignored\n"
7230: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
7240: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73      } elseif {[s
7250: 74 72 69 6e 67 20 69 6e 64 65 78 20 24 6e 61 6d  tring index $nam
7260: 65 20 30 5d 20 65 71 20 22 2d 22 7d 20 74 68 65  e 0] eq "-"} the
7270: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7280: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7290: 49 73 20 74 68 65 72 65 20 61 6e 6f 74 68 65 72  Is there another
72a0: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 20 61 76   list element av
72b0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
72c0: 76 61 6c 75 65 3f 20 20 49 66 0d 0a 20 20 20 20  value?  If..    
72d0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 74 2c      #       not,
72e0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   it does not con
72f0: 66 6f 72 6d 20 74 6f 20 74 68 65 20 73 74 61 6e  form to the stan
7300: 64 61 72 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  dard command lin
7310: 65 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  e name..        
7320: 23 20 20 20 20 20 20 20 61 6e 64 20 76 61 6c 75  #       and valu
7330: 65 20 70 61 74 74 65 72 6e 2e 0d 0a 20 20 20 20  e pattern...    
7340: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
7350: 66 20 7b 24 69 6e 64 65 78 20 2b 20 31 20 3c 20  f {$index + 1 < 
7360: 24 6c 65 6e 67 74 68 7d 20 74 68 65 6e 20 7b 0d  $length} then {.
7370: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20  .          incr 
7380: 69 6e 64 65 78 3b 20 73 65 74 20 76 61 6c 75 65  index; set value
7390: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 24   [lindex $args $
73a0: 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20  index]....      
73b0: 20 20 20 20 69 66 20 7b 21 24 73 74 72 69 63 74      if {!$strict
73c0: 20 26 26 20 5b 6c 73 65 61 72 63 68 20 2d 65 78   && [lsearch -ex
73d0: 61 63 74 20 24 6f 70 74 69 6f 6e 73 20 24 76 61  act $options $va
73e0: 6c 75 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e  lue] != -1} then
73f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7400: 69 6e 63 72 20 69 6e 64 65 78 20 2d 31 3b 20 23  incr index -1; #
7410: 20 48 41 43 4b 3a 20 52 65 73 79 6e 63 68 72 6f   HACK: Resynchro
7420: 6e 69 7a 65 20 77 69 74 68 20 76 61 6c 69 64 20  nize with valid 
7430: 74 65 73 74 20 6f 70 74 69 6f 6e 2e 0d 0a 20 20  test option...  
7440: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
7450: 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24  d result [list $
7460: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
7470: 20 20 20 20 20 74 71 70 75 74 73 20 24 3a 3a 74       tqputs $::t
7480: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
7490: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
74a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
74b0: 20 6e 6f 20 76 61 6c 75 65 20 66 6f 72 20 75 6e   no value for un
74c0: 6b 6e 6f 77 6e 20 74 65 73 74 20 6f 70 74 69 6f  known test optio
74d0: 6e 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  n \"" $name \.. 
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
74f0: 5c 22 2c 20 69 67 6e 6f 72 65 64 2c 20 62 61 63  \", ignored, bac
7500: 6b 69 6e 67 20 75 70 20 6f 6e 65 20 66 6f 72 20  king up one for 
7510: 74 65 73 74 20 6f 70 74 69 6f 6e 20 5c 22 22 20  test option \"" 
7520: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7530: 20 20 20 24 76 61 6c 75 65 20 5c 22 2e 2e 2e 5c     $value \"...\
7540: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
7550: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7560: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
7570: 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  lt [list $name $
7580: 76 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  value]....      
7590: 20 20 20 20 20 20 74 71 70 75 74 73 20 24 3a 3a        tqputs $::
75a0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
75b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
75d0: 2d 20 75 6e 6b 6e 6f 77 6e 20 74 65 73 74 20 6f  - unknown test o
75e0: 70 74 69 6f 6e 20 5c 22 22 20 24 6e 61 6d 65 20  ption \"" $name 
75f0: 22 5c 22 20 77 69 74 68 20 76 61 6c 75 65 20 5c  "\" with value \
7600: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
7610: 20 20 20 20 20 20 24 76 61 6c 75 65 20 22 5c 22        $value "\"
7620: 2c 20 69 67 6e 6f 72 65 64 5c 6e 22 5d 0d 0a 20  , ignored\n"].. 
7630: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7640: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7650: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
7660: 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e 61  result [list $na
7670: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
7680: 20 74 71 70 75 74 73 20 24 3a 3a 74 65 73 74 5f   tqputs $::test_
7690: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
76a0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
76b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 6e 6f 20 76 61       "---- no va
76c0: 6c 75 65 20 66 6f 72 20 75 6e 6b 6e 6f 77 6e 20  lue for unknown 
76d0: 74 65 73 74 20 6f 70 74 69 6f 6e 20 5c 22 22 20  test option \"" 
76e0: 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  $name \..       
76f0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 67 6e 6f         "\", igno
7700: 72 65 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  red\n"]..       
7710: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
7720: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7730: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
7740: 73 20 74 68 65 72 65 20 61 6e 6f 74 68 65 72 20  s there another 
7750: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 20 61 76 61  list element ava
7760: 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ilable for the v
7770: 61 6c 75 65 3f 20 20 49 66 0d 0a 20 20 20 20 20  alue?  If..     
7780: 20 20 20 23 20 20 20 20 20 20 20 6e 6f 74 2c 20     #       not, 
7790: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  it does not conf
77a0: 6f 72 6d 20 74 6f 20 74 68 65 20 73 74 61 6e 64  orm to the stand
77b0: 61 72 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ard command line
77c0: 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23   name..        #
77d0: 20 20 20 20 20 20 20 61 6e 64 20 76 61 6c 75 65         and value
77e0: 20 70 61 74 74 65 72 6e 2e 0d 0a 20 20 20 20 20   pattern...     
77f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
7800: 20 7b 24 69 6e 64 65 78 20 2b 20 31 20 3c 20 24   {$index + 1 < $
7810: 6c 65 6e 67 74 68 7d 20 74 68 65 6e 20 7b 0d 0a  length} then {..
7820: 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 69            incr i
7830: 6e 64 65 78 3b 20 73 65 74 20 76 61 6c 75 65 20  ndex; set value 
7840: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 24 69  [lindex $args $i
7850: 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ndex]....       
7860: 20 20 20 69 66 20 7b 21 24 73 74 72 69 63 74 20     if {!$strict 
7870: 26 26 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  && [lsearch -exa
7880: 63 74 20 24 6f 70 74 69 6f 6e 73 20 24 76 61 6c  ct $options $val
7890: 75 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ue] != -1} then 
78a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
78b0: 6e 63 72 20 69 6e 64 65 78 20 2d 31 3b 20 23 20  ncr index -1; # 
78c0: 48 41 43 4b 3a 20 52 65 73 79 6e 63 68 72 6f 6e  HACK: Resynchron
78d0: 69 7a 65 20 77 69 74 68 20 76 61 6c 69 64 20 74  ize with valid t
78e0: 65 73 74 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 20  est argument... 
78f0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
7900: 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
7910: 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
7920: 20 20 20 20 20 20 74 71 70 75 74 73 20 24 3a 3a        tqputs $::
7930: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
7940: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7950: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7960: 2d 20 6e 6f 20 76 61 6c 75 65 20 66 6f 72 20 75  - no value for u
7970: 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 20  nknown argument 
7980: 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20  \"" $name \..   
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
79a0: 2c 20 69 67 6e 6f 72 65 64 2c 20 62 61 63 6b 69  , ignored, backi
79b0: 6e 67 20 75 70 20 6f 6e 65 20 66 6f 72 20 74 65  ng up one for te
79c0: 73 74 20 6f 70 74 69 6f 6e 20 5c 22 22 20 5c 0d  st option \"" \.
79d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79e0: 20 24 76 61 6c 75 65 20 5c 22 2e 2e 2e 5c 6e 5d   $value \"...\n]
79f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
7a00: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
7a10: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
7a20: 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61   [list $name $va
7a30: 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
7a40: 20 20 20 20 74 71 70 75 74 73 20 24 3a 3a 74 65      tqputs $::te
7a50: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7a60: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7a70: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
7a80: 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74  unknown argument
7a90: 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 77   \"" $name "\" w
7aa0: 69 74 68 20 76 61 6c 75 65 20 5c 22 22 20 5c 0d  ith value \"" \.
7ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ac0: 20 24 76 61 6c 75 65 20 22 5c 22 2c 20 69 67 6e   $value "\", ign
7ad0: 6f 72 65 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ored\n"]..      
7ae0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
7af0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
7b10: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20  # NOTE: This is 
7b20: 6e 6f 74 20 61 6e 20 6f 70 74 69 6f 6e 20 6f 66  not an option of
7b30: 20 2a 61 6e 79 2a 20 6b 69 6e 64 20 74 68 61 74   *any* kind that
7b40: 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 2e 0d   we know about..
7b50: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
7b60: 20 20 20 49 67 6e 6f 72 65 20 69 74 20 61 6e 64     Ignore it and
7b70: 20 69 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   issue a warning
7b80: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
7b90: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
7ba0: 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24  d result [list $
7bb0: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
7bc0: 20 20 20 74 71 70 75 74 73 20 24 3a 3a 74 65 73     tqputs $::tes
7bd0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7be0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7bf0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 75 6e 6b         "---- unk
7c00: 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 20 5c 22  nown argument \"
7c10: 22 20 24 6e 61 6d 65 20 22 5c 22 2c 20 69 67 6e  " $name "\", ign
7c20: 6f 72 65 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ored\n"]..      
7c30: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
7c40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20    }....    #..  
7c50: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61    # NOTE: Now, a
7c60: 74 74 65 6d 70 74 20 74 6f 20 66 6c 75 73 68 20  ttempt to flush 
7c70: 74 68 65 20 74 65 73 74 20 6c 6f 67 20 71 75 65  the test log que
7c80: 75 65 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  ue, if available
7c90: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 74 6c  ...    #..    tl
7ca0: 6f 67 20 22 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  og ""....    #..
7cb0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
7cc0: 72 6e 20 74 68 65 20 6e 65 73 74 65 64 20 6c 69  rn the nested li
7cd0: 73 74 20 6f 66 20 75 6e 6b 6e 6f 77 6e 20 61 72  st of unknown ar
7ce0: 67 75 6d 65 6e 74 73 2c 20 66 6f 72 6d 61 74 74  guments, formatt
7cf0: 65 64 20 61 73 0d 0a 20 20 20 20 23 20 20 20 20  ed as..    #    
7d00: 20 20 20 6e 61 6d 65 2f 76 61 6c 75 65 20 70 61     name/value pa
7d10: 69 72 73 2c 20 74 6f 20 74 68 65 20 63 61 6c 6c  irs, to the call
7d20: 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  er...    #..    
7d30: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
7d40: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67    }.....  proc g
7d50: 65 74 54 63 6c 53 68 65 6c 6c 46 69 6c 65 4e 61  etTclShellFileNa
7d60: 6d 65 20 7b 20 61 75 74 6f 6d 61 74 69 63 20 6b  me { automatic k
7d70: 69 74 73 20 6d 61 63 68 69 6e 65 20 7d 20 7b 0d  its machine } {.
7d80: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
7d90: 54 45 3a 20 53 74 61 72 74 20 6f 75 74 20 77 69  TE: Start out wi
7da0: 74 68 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  th an empty list
7db0: 20 6f 66 20 63 61 6e 64 69 61 74 65 20 54 63 6c   of candiate Tcl
7dc0: 20 73 68 65 6c 6c 73 2e 0d 0a 20 20 20 20 23 0d   shells...    #.
7dd0: 0a 20 20 20 20 73 65 74 20 73 68 65 6c 6c 73 20  .    set shells 
7de0: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 23 0d  [list]....    #.
7df0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67  .    # NOTE: Fig
7e00: 75 72 65 20 6f 75 74 20 74 68 65 20 65 6e 76 69  ure out the envi
7e10: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
7e20: 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 2e  s to be checked.
7e30: 20 20 49 66 0d 0a 20 20 20 20 23 20 20 20 20 20    If..    #     
7e40: 20 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61    there was a ma
7e50: 63 68 69 6e 65 20 73 70 65 63 69 66 69 65 64 2c  chine specified,
7e60: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64   it will be used
7e70: 20 74 6f 20 63 68 65 63 6b 0d 0a 20 20 20 20 23   to check..    #
7e80: 20 20 20 20 20 20 20 66 6f 72 20 6d 61 63 68 69         for machi
7e90: 6e 65 2d 73 70 65 63 69 66 69 63 20 54 63 6c 20  ne-specific Tcl 
7ea0: 73 68 65 6c 6c 73 2e 0d 0a 20 20 20 20 23 0d 0a  shells...    #..
7eb0: 20 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c      set names [l
7ec0: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 66 6f 72 65  ist]....    fore
7ed0: 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 45  ach name [list E
7ee0: 61 67 6c 65 5f 54 63 6c 5f 53 68 65 6c 6c 20 54  agle_Tcl_Shell T
7ef0: 63 6c 5f 53 68 65 6c 6c 20 45 41 47 4c 45 5f 54  cl_Shell EAGLE_T
7f00: 43 4c 53 48 20 54 43 4c 53 48 5d 20 7b 0d 0a 20  CLSH TCLSH] {.. 
7f10: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
7f20: 20 6c 65 6e 67 74 68 20 24 6d 61 63 68 69 6e 65   length $machine
7f30: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7f40: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
7f50: 6f 72 6d 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  orm [machineToPl
7f60: 61 74 66 6f 72 6d 20 24 6d 61 63 68 69 6e 65 20  atform $machine 
7f70: 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  true]....       
7f80: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
7f90: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
7fa0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7fb0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 61        lappend na
7fc0: 6d 65 73 20 5b 61 70 70 65 6e 64 41 72 67 73 20  mes [appendArgs 
7fd0: 24 6e 61 6d 65 20 5f 20 24 70 6c 61 74 66 6f 72  $name _ $platfor
7fe0: 6d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  m]..        }...
7ff0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61  .        set pla
8000: 74 66 6f 72 6d 20 5b 6d 61 63 68 69 6e 65 54 6f  tform [machineTo
8010: 50 6c 61 74 66 6f 72 6d 20 24 6d 61 63 68 69 6e  Platform $machin
8020: 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20  e false]....    
8030: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
8040: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
8050: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
8060: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
8070: 20 6e 61 6d 65 73 20 5b 61 70 70 65 6e 64 41 72   names [appendAr
8080: 67 73 20 24 6e 61 6d 65 20 5f 20 24 70 6c 61 74  gs $name _ $plat
8090: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 20 20 7d  form]..        }
80a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
80b0: 65 6e 64 20 6e 61 6d 65 73 20 5b 61 70 70 65 6e  end names [appen
80c0: 64 41 72 67 73 20 24 6e 61 6d 65 20 5f 20 24 6d  dArgs $name _ $m
80d0: 61 63 68 69 6e 65 5d 0d 0a 20 20 20 20 20 20 7d  achine]..      }
80e0: 0d 0a 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  ....      lappen
80f0: 64 20 6e 61 6d 65 73 20 24 6e 61 6d 65 0d 0a 20  d names $name.. 
8100: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20     }....    #.. 
8110: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
8120: 20 61 6c 6c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   all environment
8130: 20 76 61 72 69 61 62 6c 65 73 20 28 77 65 20 6b   variables (we k
8140: 6e 6f 77 20 61 62 6f 75 74 29 20 74 68 61 74 0d  now about) that.
8150: 0a 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 79  .    #       may
8160: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61 74   contain the pat
8170: 68 20 77 68 65 72 65 20 74 68 65 20 54 63 6c 20  h where the Tcl 
8180: 73 68 65 6c 6c 20 69 73 20 6c 6f 63 61 74 65 64  shell is located
8190: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 66 6f  ...    #..    fo
81a0: 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65  reach name $name
81b0: 73 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  s {..      #..  
81c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
81d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
81e0: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
81f0: 72 69 61 62 6c 65 2e 20 20 54 68 69 73 0d 0a 20  riable.  This.. 
8200: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c       #       wil
8210: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
8220: 72 69 6e 67 20 69 66 20 69 74 20 77 61 73 20 6e  ring if it was n
8230: 6f 74 20 73 65 74 2e 0d 0a 20 20 20 20 20 20 23  ot set...      #
8240: 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61 6c 75  ..      set valu
8250: 65 20 5b 67 65 74 45 6e 76 69 72 6f 6e 6d 65 6e  e [getEnvironmen
8260: 74 56 61 72 69 61 62 6c 65 20 24 6e 61 6d 65 5d  tVariable $name]
8270: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8280: 20 20 20 23 20 54 4f 44 4f 3a 20 50 6f 73 73 69     # TODO: Possi
8290: 62 6c 79 20 61 64 64 20 61 20 63 68 65 63 6b 20  bly add a check 
82a0: 69 66 20 74 68 65 20 66 69 6c 65 20 61 63 74 75  if the file actu
82b0: 61 6c 6c 79 20 65 78 69 73 74 73 0d 0a 20 20 20  ally exists..   
82c0: 20 20 20 23 20 20 20 20 20 20 20 68 65 72 65 2e     #       here.
82d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
82e0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
82f0: 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30 7d  gth $value] > 0}
8300: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8310: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8320: 54 45 3a 20 2a 45 58 54 45 52 4e 41 4c 2a 20 55  TE: *EXTERNAL* U
8330: 73 65 20 76 65 72 62 61 74 69 6d 2c 20 6e 6f 20  se verbatim, no 
8340: 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 2e 0d 0a  normalization...
8350: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8360: 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61 74 69     if {$automati
8370: 63 20 26 26 20 5b 69 73 45 61 67 6c 65 5d 7d 20  c && [isEagle]} 
8380: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8390: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
83a0: 20 4e 4f 54 45 3a 20 49 6e 20 61 75 74 6f 6d 61   NOTE: In automa
83b0: 74 69 63 20 6d 6f 64 65 2c 20 74 68 65 20 65 6e  tic mode, the en
83c0: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
83d0: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  le..          # 
83e0: 20 20 20 20 20 20 76 61 6c 75 65 20 73 69 6d 70        value simp
83f0: 6c 79 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e  ly represents an
8400: 6f 74 68 65 72 20 63 61 6e 64 69 64 61 74 65 0d  other candidate.
8410: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
8420: 20 20 20 54 63 6c 20 73 68 65 6c 6c 20 28 69 2e     Tcl shell (i.
8430: 65 2e 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  e. it does not h
8440: 61 6c 74 20 74 68 65 20 73 65 61 72 63 68 0d 0a  alt the search..
8450: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
8460: 20 20 66 6f 72 20 6f 74 68 65 72 20 63 61 6e 64    for other cand
8470: 69 64 61 74 65 20 54 63 6c 20 73 68 65 6c 6c 73  idate Tcl shells
8480: 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  )...          #.
8490: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
84a0: 6e 64 20 73 68 65 6c 6c 73 20 24 76 61 6c 75 65  nd shells $value
84b0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
84c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
84d0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
84e0: 45 3a 20 49 6e 20 6d 61 6e 75 61 6c 20 6d 6f 64  E: In manual mod
84f0: 65 2c 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  e, the environme
8500: 6e 74 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  nt variable..   
8510: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
8520: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 73 20  alue represents 
8530: 61 6e 20 22 6f 76 65 72 72 69 64 65 22 20 61 6e  an "override" an
8540: 64 20 68 61 6c 74 73 0d 0a 20 20 20 20 20 20 20  d halts..       
8550: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 73     #       the s
8560: 65 61 72 63 68 20 66 6f 72 20 6f 74 68 65 72 20  earch for other 
8570: 63 61 6e 64 69 64 61 74 65 20 54 63 6c 20 73 68  candidate Tcl sh
8580: 65 6c 6c 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ells...         
8590: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   #..          re
85a0: 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20  turn $value..   
85b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
85c0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
85d0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65  .    # NOTE: The
85e0: 20 61 75 74 6f 6d 61 74 69 63 20 54 63 6c 20 73   automatic Tcl s
85f0: 68 65 6c 6c 20 64 65 74 65 63 74 69 6f 6e 20 69  hell detection i
8600: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
8610: 20 77 68 65 6e 0d 0a 20 20 20 20 23 20 20 20 20   when..    #    
8620: 20 20 20 72 75 6e 6e 69 6e 67 20 69 6e 20 45 61     running in Ea
8630: 67 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  gle...    #..   
8640: 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20   if {[isEagle]} 
8650: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
8660: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
8670: 74 74 65 6d 70 74 20 74 6f 20 63 68 65 63 6b 20  ttempt to check 
8680: 66 6f 72 20 74 68 65 20 22 62 65 73 74 22 20 61  for the "best" a
8690: 76 61 69 6c 61 62 6c 65 20 64 79 6e 61 6d 69 63  vailable dynamic
86a0: 61 6c 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ally..      #   
86b0: 20 20 20 20 6c 6f 61 64 61 62 6c 65 20 54 63 6c      loadable Tcl
86c0: 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65   library and the
86d0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  n attempt to use
86e0: 20 69 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20   its..      #   
86f0: 20 20 20 20 22 61 73 73 6f 63 69 61 74 65 64 22      "associated"
8700: 20 54 63 6c 20 73 68 65 6c 6c 2e 20 20 41 20 76   Tcl shell.  A v
8710: 65 72 79 20 73 69 6d 69 6c 61 72 20 62 6c 6f 63  ery similar bloc
8720: 6b 20 6f 66 20 63 6f 64 65 0d 0a 20 20 20 20 20  k of code..     
8730: 20 23 20 20 20 20 20 20 20 69 73 20 61 6c 73 6f   #       is also
8740: 20 75 73 65 64 20 62 79 20 74 68 65 20 5b 63 68   used by the [ch
8750: 65 63 6b 46 6f 72 54 63 6c 49 6e 73 74 61 6c 6c  eckForTclInstall
8760: 73 5d 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20  s] procedure..  
8770: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74      #       in t
8780: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70  he constraints p
8790: 61 63 6b 61 67 65 2e 0d 0a 20 20 20 20 20 20 23  ackage...      #
87a0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
87b0: 63 68 20 7b 74 63 6c 20 73 65 6c 65 63 74 20 2d  ch {tcl select -
87c0: 61 72 63 68 69 74 65 63 74 75 72 65 7d 20 74 63  architecture} tc
87d0: 6c 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  l] == 0} then {.
87e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
87f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 75      # NOTE: Shou
8800: 6c 64 20 77 65 20 61 6c 73 6f 20 63 6f 6e 73 69  ld we also consi
8810: 64 65 72 20 54 63 6c 4b 69 74 20 73 68 65 6c 6c  der TclKit shell
8820: 73 3f 20 20 49 66 20 73 6f 2c 20 61 20 62 69 74  s?  If so, a bit
8830: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8840: 20 20 6d 6f 72 65 20 68 61 6e 64 6c 69 6e 67 20    more handling 
8850: 69 73 20 72 65 71 75 69 72 65 64 2e 0d 0a 20 20  is required...  
8860: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8870: 20 69 66 20 7b 24 6b 69 74 73 7d 20 74 68 65 6e   if {$kits} then
8880: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
8890: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
88a0: 45 3a 20 44 69 64 20 77 65 20 66 69 6e 64 20 6f  E: Did we find o
88b0: 6e 65 3f 20 20 41 74 74 65 6d 70 74 20 74 6f 20  ne?  Attempt to 
88c0: 67 72 61 62 20 74 68 65 20 70 61 74 63 68 0d 0a  grab the patch..
88d0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
88e0: 20 20 6c 65 76 65 6c 20 66 69 65 6c 64 20 66 72    level field fr
88f0: 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  om the returned 
8900: 64 69 63 74 69 6f 6e 61 72 79 20 76 61 6c 75 65  dictionary value
8910: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
8920: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 6f            set do
8930: 74 50 61 74 63 68 4c 65 76 65 6c 20 5b 67 65 74  tPatchLevel [get
8940: 44 69 63 74 69 6f 6e 61 72 79 56 61 6c 75 65 20  DictionaryValue 
8950: 24 74 63 6c 20 70 61 74 63 68 4c 65 76 65 6c 5d  $tcl patchLevel]
8960: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
8970: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
8980: 45 3a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  E: Verify that t
8990: 68 65 20 70 61 74 63 68 20 6c 65 76 65 6c 20 77  he patch level w
89a0: 65 20 66 6f 75 6e 64 20 69 73 20 76 61 6c 69 64  e found is valid
89b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
89c0: 20 20 20 20 61 6e 64 20 74 68 61 74 20 69 74 20      and that it 
89d0: 63 6f 6e 66 6f 72 6d 73 20 74 6f 20 74 68 65 20  conforms to the 
89e0: 70 61 74 74 65 72 6e 20 77 65 20 65 78 70 65 63  pattern we expec
89f0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
8a00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
8a10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
8a20: 6f 74 50 61 74 63 68 4c 65 76 65 6c 5d 20 3e 20  otPatchLevel] > 
8a30: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
8a40: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b      [regexp -- {
8a50: 5e 5c 64 2b 5c 2e 5c 64 2b 5c 2e 5c 64 2b 24 7d  ^\d+\.\d+\.\d+$}
8a60: 20 24 64 6f 74 50 61 74 63 68 4c 65 76 65 6c 5d   $dotPatchLevel]
8a70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8a80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8a90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
8aa0: 6c 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ld the candidate
8ab0: 20 54 63 6c 4b 69 74 20 73 68 65 6c 6c 20 65 78   TclKit shell ex
8ac0: 65 63 75 74 61 62 6c 65 20 66 69 6c 65 0d 0a 20  ecutable file.. 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8ae0: 20 20 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65     name with the
8af0: 20 64 6f 74 2d 73 65 70 61 72 61 74 65 64 20 70   dot-separated p
8b00: 61 74 63 68 20 6c 65 76 65 6c 2e 20 20 54 68 69  atch level.  Thi
8b10: 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  s is..          
8b20: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63 6f    #       the co
8b30: 6d 6d 6f 6e 20 6e 61 6d 69 6e 67 20 73 63 68 65  mmon naming sche
8b40: 6d 65 20 6f 6e 20 55 6e 69 78 2e 0d 0a 20 20 20  me on Unix...   
8b50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8b60: 20 20 20 20 20 20 20 20 73 65 74 20 64 6f 74 53          set dotS
8b70: 68 65 6c 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  hell [appendArgs
8b80: 20 74 63 6c 6b 69 74 2d 20 24 64 6f 74 50 61 74   tclkit- $dotPat
8b90: 63 68 4c 65 76 65 6c 5d 0d 0a 0d 0a 20 20 20 20  chLevel]....    
8ba0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8bb0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
8bc0: 75 69 6c 64 20 74 68 65 20 63 61 6e 64 69 64 61  uild the candida
8bd0: 74 65 20 54 63 6c 4b 69 74 20 73 68 65 6c 6c 20  te TclKit shell 
8be0: 65 78 65 63 75 74 61 62 6c 65 20 66 69 6c 65 0d  executable file.
8bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
8c00: 20 20 20 20 20 6e 61 6d 65 20 77 69 74 68 20 74       name with t
8c10: 68 65 20 70 61 74 63 68 20 6c 65 76 65 6c 2c 20  he patch level, 
8c20: 72 65 6d 6f 76 69 6e 67 20 74 68 65 20 64 6f 74  removing the dot
8c30: 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 20  .  This..       
8c40: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
8c50: 74 68 65 20 63 6f 6d 6d 6f 6e 20 6e 61 6d 69 6e  the common namin
8c60: 67 20 73 63 68 65 6d 65 20 6f 6e 20 57 69 6e 64  g scheme on Wind
8c70: 6f 77 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ows...          
8c80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8c90: 20 73 65 74 20 73 68 65 6c 6c 20 5b 61 70 70 65   set shell [appe
8ca0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8cb0: 20 20 20 20 20 20 20 20 20 20 74 63 6c 6b 69 74            tclkit
8cc0: 2d 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  - [string map [l
8cd0: 69 73 74 20 2e 20 22 22 5d 20 24 64 6f 74 50 61  ist . ""] $dotPa
8ce0: 74 63 68 4c 65 76 65 6c 5d 5d 0d 0a 0d 0a 20 20  tchLevel]]....  
8cf0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8d00: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
8d10: 20 41 6c 77 61 79 73 20 66 61 76 6f 72 20 74 68   Always favor th
8d20: 65 20 54 63 6c 4b 69 74 20 73 68 65 6c 6c 20 65  e TclKit shell e
8d30: 78 65 63 75 74 61 62 6c 65 20 66 69 6c 65 0d 0a  xecutable file..
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
8d50: 20 20 20 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d      naming schem
8d60: 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  e for the curren
8d70: 74 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  t operating syst
8d80: 65 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  em..            
8d90: 23 20 20 20 20 20 20 20 66 69 72 73 74 2e 0d 0a  #       first...
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
8db0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
8dc0: 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
8dd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8de0: 20 20 6c 61 70 70 65 6e 64 20 73 68 65 6c 6c 73    lappend shells
8df0: 20 24 73 68 65 6c 6c 0d 0a 20 20 20 20 20 20 20   $shell..       
8e00: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 73         lappend s
8e10: 68 65 6c 6c 73 20 24 64 6f 74 53 68 65 6c 6c 0d  hells $dotShell.
8e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
8e30: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
8e40: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 73 68 65       lappend she
8e50: 6c 6c 73 20 24 64 6f 74 53 68 65 6c 6c 0d 0a 20  lls $dotShell.. 
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
8e70: 70 65 6e 64 20 73 68 65 6c 6c 73 20 24 73 68 65  pend shells $she
8e80: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
8e90: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
8ea0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
8eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8ec0: 23 20 4e 4f 54 45 3a 20 44 69 64 20 77 65 20 66  # NOTE: Did we f
8ed0: 69 6e 64 20 6f 6e 65 3f 20 20 41 74 74 65 6d 70  ind one?  Attemp
8ee0: 74 20 74 6f 20 67 72 61 62 20 74 68 65 20 76 65  t to grab the ve
8ef0: 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  rsion..        #
8f00: 20 20 20 20 20 20 20 66 69 65 6c 64 20 66 72 6f         field fro
8f10: 6d 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 64  m the returned d
8f20: 69 63 74 69 6f 6e 61 72 79 20 76 61 6c 75 65 2e  ictionary value.
8f30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8f40: 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72 73       set dotVers
8f50: 69 6f 6e 20 5b 67 65 74 44 69 63 74 69 6f 6e 61  ion [getDictiona
8f60: 72 79 56 61 6c 75 65 20 24 74 63 6c 20 76 65 72  ryValue $tcl ver
8f70: 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sion]....       
8f80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8f90: 54 45 3a 20 56 65 72 69 66 79 20 74 68 61 74 20  TE: Verify that 
8fa0: 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 66  the version we f
8fb0: 6f 75 6e 64 20 69 73 20 76 61 6c 69 64 20 61 6e  ound is valid an
8fc0: 64 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  d that..        
8fd0: 23 20 20 20 20 20 20 20 69 74 20 63 6f 6e 66 6f  #       it confo
8fe0: 72 6d 73 20 74 6f 20 74 68 65 20 70 61 74 74 65  rms to the patte
8ff0: 72 6e 20 77 65 20 65 78 70 65 63 74 2e 0d 0a 20  rn we expect... 
9000: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9010: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
9020: 6e 67 74 68 20 24 64 6f 74 56 65 72 73 69 6f 6e  ngth $dotVersion
9030: 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
9040: 20 20 20 20 20 20 20 20 5b 72 65 67 65 78 70 20          [regexp 
9050: 2d 2d 20 7b 5e 5c 64 2b 5c 2e 5c 64 2b 24 7d 20  -- {^\d+\.\d+$} 
9060: 24 64 6f 74 56 65 72 73 69 6f 6e 5d 7d 20 74 68  $dotVersion]} th
9070: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9080: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
9090: 4f 54 45 3a 20 47 61 74 68 65 72 20 74 68 65 20  OTE: Gather the 
90a0: 6c 69 73 74 20 6f 66 20 63 61 6e 64 69 64 61 74  list of candidat
90b0: 65 20 54 63 6c 20 73 68 65 6c 6c 73 20 74 6f 20  e Tcl shells to 
90c0: 63 68 65 63 6b 0d 0a 20 20 20 20 20 20 20 20 20  check..         
90d0: 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74   #       using t
90e0: 68 65 20 72 61 6e 67 65 20 6f 66 20 76 65 72 73  he range of vers
90f0: 69 6f 6e 73 20 77 65 20 61 72 65 20 69 6e 74 65  ions we are inte
9100: 72 65 73 74 65 64 20 69 6e 2c 0d 0a 20 20 20 20  rested in,..    
9110: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
9120: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
9130: 22 62 65 73 74 22 20 61 76 61 69 6c 61 62 6c 65  "best" available
9140: 20 76 65 72 73 69 6f 6e 20 61 6e 64 0d 0a 20 20   version and..  
9150: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9160: 65 6e 64 69 6e 67 20 77 69 74 68 20 74 68 65 20  ending with the 
9170: 61 62 73 6f 6c 75 74 65 20 6d 69 6e 69 6d 75 6d  absolute minimum
9180: 20 76 65 72 73 69 6f 6e 20 73 75 70 70 6f 72 74   version support
9190: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
91a0: 20 20 20 20 20 20 62 79 20 74 68 65 20 45 61 67        by the Eag
91b0: 6c 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e  le core library.
91c0: 20 20 41 20 76 65 72 79 20 73 69 6d 69 6c 61 72    A very similar
91d0: 20 62 6c 6f 63 6b 0d 0a 20 20 20 20 20 20 20 20   block..        
91e0: 20 20 23 20 20 20 20 20 20 20 6f 66 20 63 6f 64    #       of cod
91f0: 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 62  e is also used b
9200: 79 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 54  y the [checkForT
9210: 63 6c 53 68 65 6c 6c 5d 0d 0a 20 20 20 20 20 20  clShell]..      
9220: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 6f 63      #       proc
9230: 65 64 75 72 65 20 69 6e 20 74 68 65 20 63 6f 6e  edure in the con
9240: 73 74 72 61 69 6e 74 73 20 70 61 63 6b 61 67 65  straints package
9250: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
9260: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
9270: 68 20 76 65 72 73 69 6f 6e 20 5b 6c 73 6f 72 74  h version [lsort
9280: 20 2d 72 65 61 6c 20 2d 64 65 63 72 65 61 73 69   -real -decreasi
9290: 6e 67 20 5b 74 63 6c 20 5c 0d 0a 20 20 20 20 20  ng [tcl \..     
92a0: 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e           version
92b0: 72 61 6e 67 65 20 2d 6d 61 78 69 6d 75 6d 76 65  range -maximumve
92c0: 72 73 69 6f 6e 20 24 64 6f 74 56 65 72 73 69 6f  rsion $dotVersio
92d0: 6e 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  n]] {..         
92e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
92f0: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
9300: 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 54 63  the candidate Tc
9310: 6c 20 73 68 65 6c 6c 20 65 78 65 63 75 74 61 62  l shell executab
9320: 6c 65 20 66 69 6c 65 20 6e 61 6d 65 0d 0a 20 20  le file name..  
9330: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
9340: 20 20 77 69 74 68 20 74 68 65 20 64 6f 74 2d 73    with the dot-s
9350: 65 70 61 72 61 74 65 64 20 76 65 72 73 69 6f 6e  eparated version
9360: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 63  .  This is the c
9370: 6f 6d 6d 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ommon..         
9380: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 69 6e     #       namin
9390: 67 20 73 63 68 65 6d 65 20 6f 6e 20 55 6e 69 78  g scheme on Unix
93a0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
93b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
93c0: 74 20 64 6f 74 53 68 65 6c 6c 20 5b 61 70 70 65  t dotShell [appe
93d0: 6e 64 41 72 67 73 20 74 63 6c 73 68 20 24 76 65  ndArgs tclsh $ve
93e0: 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  rsion]....      
93f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
9410: 6c 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ld the candidate
9420: 20 54 63 6c 20 73 68 65 6c 6c 20 65 78 65 63 75   Tcl shell execu
9430: 74 61 62 6c 65 20 66 69 6c 65 20 6e 61 6d 65 0d  table file name.
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
9450: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 76 65       with the ve
9460: 72 73 69 6f 6e 2c 20 72 65 6d 6f 76 69 6e 67 20  rsion, removing 
9470: 74 68 65 20 64 6f 74 2e 20 20 54 68 69 73 20 69  the dot.  This i
9480: 73 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  s the..         
9490: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 6f     #       commo
94a0: 6e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 20  n naming scheme 
94b0: 6f 6e 20 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20  on Windows...   
94c0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
94d0: 20 20 20 20 20 20 20 20 73 65 74 20 73 68 65 6c          set shel
94e0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63  l [appendArgs tc
94f0: 6c 73 68 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  lsh [string map 
9500: 5b 6c 69 73 74 20 2e 20 22 22 5d 20 24 76 65 72  [list . ""] $ver
9510: 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  sion]]....      
9520: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9530: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77       # NOTE: Alw
9540: 61 79 73 20 66 61 76 6f 72 20 74 68 65 20 54 63  ays favor the Tc
9550: 6c 20 73 68 65 6c 6c 20 65 78 65 63 75 74 61 62  l shell executab
9560: 6c 65 20 66 69 6c 65 20 6e 61 6d 69 6e 67 0d 0a  le file naming..
9570: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
9580: 20 20 20 20 73 63 68 65 6d 65 20 66 6f 72 20 74      scheme for t
9590: 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61  he current opera
95a0: 74 69 6e 67 20 73 79 73 74 65 6d 20 66 69 72 73  ting system firs
95b0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
95c0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
95d0: 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  f {[isWindows]} 
95e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
95f0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 73 68        lappend sh
9600: 65 6c 6c 73 20 24 73 68 65 6c 6c 0d 0a 20 20 20  ells $shell..   
9610: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
9620: 6e 64 20 73 68 65 6c 6c 73 20 24 64 6f 74 53 68  nd shells $dotSh
9630: 65 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ell..           
9640: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9650: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
9660: 20 73 68 65 6c 6c 73 20 24 64 6f 74 53 68 65 6c   shells $dotShel
9670: 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l..             
9680: 20 6c 61 70 70 65 6e 64 20 73 68 65 6c 6c 73 20   lappend shells 
9690: 24 73 68 65 6c 6c 0d 0a 20 20 20 20 20 20 20 20  $shell..        
96a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
96b0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
96c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
96d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
96e0: 20 43 68 65 63 6b 20 65 61 63 68 20 63 61 6e 64   Check each cand
96f0: 69 64 61 74 65 20 54 63 6c 20 73 68 65 6c 6c 20  idate Tcl shell 
9700: 61 6e 64 20 71 75 65 72 79 20 69 74 73 20 66 75  and query its fu
9710: 6c 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  lly..      #    
9720: 20 20 20 71 75 61 6c 69 66 69 65 64 20 70 61 74     qualified pat
9730: 68 20 66 72 6f 6d 20 69 74 2e 20 20 49 66 20 69  h from it.  If i
9740: 74 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 65 63  t cannot be exec
9750: 75 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  uted,..      #  
9760: 20 20 20 20 20 77 65 20 6b 6e 6f 77 20 74 68 61       we know tha
9770: 74 20 63 61 6e 64 69 64 61 74 65 20 54 63 6c 20  t candidate Tcl 
9780: 73 68 65 6c 6c 20 69 73 20 6e 6f 74 20 61 76 61  shell is not ava
9790: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
97a0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
97b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 67  fo exists ::no(g
97c0: 65 74 54 63 6c 45 78 65 63 75 74 61 62 6c 65 46  etTclExecutableF
97d0: 6f 72 54 63 6c 53 68 65 6c 6c 29 5d 7d 20 74 68  orTclShell)]} th
97e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  en {..        fo
97f0: 72 65 61 63 68 20 73 68 65 6c 6c 20 24 73 68 65  reach shell $she
9800: 6c 6c 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lls {..         
9810: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
9820: 20 20 20 20 20 20 20 20 20 20 20 67 65 74 54 63             getTc
9830: 6c 45 78 65 63 75 74 61 62 6c 65 46 6f 72 54 63  lExecutableForTc
9840: 6c 53 68 65 6c 6c 20 24 73 68 65 6c 6c 20 5b 67  lShell $shell [g
9850: 65 74 54 63 6c 53 68 65 6c 6c 56 65 72 62 6f 73  etTclShellVerbos
9860: 69 74 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ity]..          
9870: 7d 20 65 78 65 63 75 74 61 62 6c 65 5d 20 3d 3d  } executable] ==
9880: 20 30 20 26 26 20 24 65 78 65 63 75 74 61 62 6c   0 && $executabl
9890: 65 20 6e 65 20 22 65 72 72 6f 72 22 20 26 26 20  e ne "error" && 
98a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
98b0: 20 21 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   ![string match 
98c0: 22 65 72 72 6f 72 3a 20 2a 22 20 24 65 78 65 63  "error: *" $exec
98d0: 75 74 61 62 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  utable]} then {.
98e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
9900: 54 45 3a 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b  TE: It looks lik
9910: 65 20 74 68 69 73 20 54 63 6c 20 73 68 65 6c 6c  e this Tcl shell
9920: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
9930: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
9940: 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 66      Return the f
9950: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
9960: 61 74 68 20 74 6f 20 69 74 20 6e 6f 77 2e 0d 0a  ath to it now...
9970: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9980: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9990: 6e 20 24 65 78 65 63 75 74 61 62 6c 65 0d 0a 20  n $executable.. 
99a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
99b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
99c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a      }....    #..
99d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
99e0: 72 6e 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 20  rn the fallback 
99f0: 64 65 66 61 75 6c 74 2e 0d 0a 20 20 20 20 23 0d  default...    #.
9a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 63 6c 73  .    return tcls
9a10: 68 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  h..  }.....  pro
9a20: 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61  c getTemporaryPa
9a30: 74 68 20 7b 20 7b 75 73 61 62 6c 65 20 74 72 75  th { {usable tru
9a40: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  e} } {..    #.. 
9a50: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9a60: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 22 74 65   the list of "te
9a70: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
9a80: 79 22 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20  y" override..   
9a90: 20 23 20 20 20 20 20 20 20 65 6e 76 69 72 6f 6e   #       environ
9aa0: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 74  ment variables t
9ab0: 6f 20 63 68 65 63 6b 2e 0d 0a 20 20 20 20 23 0d  o check...    #.
9ac0: 0a 20 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b  .    set names [
9ad0: 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 66 6f 72  list]....    for
9ae0: 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20  each name [list 
9af0: 5c 0d 0a 20 20 20 20 20 20 20 20 45 41 47 4c 45  \..        EAGLE
9b00: 5f 54 45 53 54 5f 54 45 4d 50 20 45 41 47 4c 45  _TEST_TEMP EAGLE
9b10: 5f 54 45 4d 50 20 58 44 47 5f 52 55 4e 54 49 4d  _TEMP XDG_RUNTIM
9b20: 45 5f 44 49 52 20 54 45 4d 50 20 54 4d 50 5d 20  E_DIR TEMP TMP] 
9b30: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
9b40: 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
9b50: 75 72 65 20 77 65 20 68 61 6e 64 6c 65 20 61 6c  ure we handle al
9b60: 6c 20 74 68 65 20 72 65 61 73 6f 6e 61 62 6c 65  l the reasonable
9b70: 20 22 63 61 73 65 73 22 20 6f 66 0d 0a 20 20 20   "cases" of..   
9b80: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65     #       the e
9b90: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
9ba0: 62 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20  ble names...    
9bb0: 20 20 23 0d 0a 20 20 20 20 20 20 6c 61 70 70 65    #..      lappe
9bc0: 6e 64 20 6e 61 6d 65 73 20 5b 73 74 72 69 6e 67  nd names [string
9bd0: 20 74 6f 75 70 70 65 72 20 24 6e 61 6d 65 5d 20   toupper $name] 
9be0: 5b 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20  [string tolower 
9bf0: 24 6e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20  $name] \..      
9c00: 20 20 20 20 5b 73 74 72 69 6e 67 20 74 6f 74 69      [string toti
9c10: 74 6c 65 20 24 6e 61 6d 65 5d 0d 0a 20 20 20 20  tle $name]..    
9c20: 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  }....    #..    
9c30: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
9c40: 20 77 65 20 63 61 6e 20 75 73 65 20 61 6e 79 20   we can use any 
9c50: 6f 66 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  of the environme
9c60: 6e 74 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20  nt variables... 
9c70: 20 20 20 23 0d 0a 20 20 20 20 66 6f 72 65 61 63     #..    foreac
9c80: 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d  h name $names {.
9c90: 0a 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65  .      set value
9ca0: 20 5b 67 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74   [getEnvironment
9cb0: 56 61 72 69 61 62 6c 65 20 24 6e 61 6d 65 5d 0d  Variable $name].
9cc0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9cd0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
9ce0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 65   make sure the e
9cf0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
9d00: 62 6c 65 20 77 61 73 20 61 63 74 75 61 6c 6c 79  ble was actually
9d10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9d20: 73 65 74 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  set to something
9d30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9d40: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
9d50: 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30  ngth $value] > 0
9d60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9d70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9d80: 4f 54 45 3a 20 4e 65 78 74 2c 20 77 68 65 6e 20  OTE: Next, when 
9d90: 74 68 65 20 22 75 73 61 62 6c 65 22 20 61 72 67  the "usable" arg
9da0: 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
9db0: 6f 2c 20 61 74 74 65 6d 70 74 0d 0a 20 20 20 20  o, attempt..    
9dc0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 6d      #       to m
9dd0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 74  ake sure the ret
9de0: 75 72 6e 65 64 20 74 65 6d 70 6f 72 61 72 79 20  urned temporary 
9df0: 70 61 74 68 20 69 73 20 61 63 74 75 61 6c 6c 79  path is actually
9e00: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9e10: 20 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 69    an existing di
9e20: 72 65 63 74 6f 72 79 2c 20 77 72 69 74 61 62 6c  rectory, writabl
9e30: 65 20 62 79 20 75 73 2e 0d 0a 20 20 20 20 20 20  e by us...      
9e40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
9e50: 7b 24 75 73 61 62 6c 65 7d 20 74 68 65 6e 20 7b  {$usable} then {
9e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
9e70: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
9e80: 79 20 24 76 61 6c 75 65 5d 20 26 26 20 5b 66 69  y $value] && [fi
9e90: 6c 65 20 77 72 69 74 61 62 6c 65 20 24 76 61 6c  le writable $val
9ea0: 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
9eb0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9ec0: 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
9ed0: 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20  $value]..       
9ee0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
9ef0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9f00: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
9f10: 6f 72 6d 61 6c 69 7a 65 20 24 76 61 6c 75 65 5d  ormalize $value]
9f20: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9f30: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
9f40: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
9f50: 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e   && [llength [in
9f60: 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65  fo commands obje
9f70: 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ct]] > 0} then {
9f80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9f90: 20 23 20 4e 4f 54 45 3a 20 45 61 67 6c 65 20 66   # NOTE: Eagle f
9fa0: 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 77 68 61  allback, use wha
9fb0: 74 65 76 65 72 20 69 73 20 72 65 70 6f 72 74 65  tever is reporte
9fc0: 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  d by the..      
9fd0: 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69  #       underlyi
9fe0: 6e 67 20 66 72 61 6d 65 77 6f 72 6b 20 61 6e 64  ng framework and
9ff0: 2f 6f 72 20 6f 70 65 72 61 74 69 6e 67 20 73 79  /or operating sy
a000: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
a010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
a020: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 6f 62  le normalize [ob
a030: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74  ject invoke Syst
a040: 65 6d 2e 49 4f 2e 50 61 74 68 20 47 65 74 54 65  em.IO.Path GetTe
a050: 6d 70 50 61 74 68 5d 5d 0d 0a 20 20 20 20 7d 20  mpPath]]..    } 
a060: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d  else {..      #.
a070: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
a080: 63 6c 20 66 61 6c 6c 62 61 63 6b 2c 20 2a 61 73  cl fallback, *as
a090: 73 75 6d 65 2a 20 74 68 61 74 20 77 65 20 63 61  sume* that we ca
a0a0: 6e 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20  n use the..     
a0b0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
a0c0: 72 79 20 77 68 65 72 65 20 74 68 65 20 65 78 65  ry where the exe
a0d0: 63 75 74 61 62 6c 65 20 69 73 20 72 75 6e 6e 69  cutable is runni
a0e0: 6e 67 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  ng for..      # 
a0f0: 20 20 20 20 20 20 74 65 6d 70 6f 72 61 72 79 20        temporary 
a100: 73 74 6f 72 61 67 65 2e 0d 0a 20 20 20 20 20 20  storage...      
a110: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
a120: 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
a130: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69  [file dirname [i
a140: 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75 74  nfo nameofexecut
a150: 61 62 6c 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  able]]]..    }..
a160: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67    }.....  proc g
a170: 65 74 54 65 6d 70 6f 72 61 72 79 46 69 6c 65 4e  etTemporaryFileN
a180: 61 6d 65 20 7b 20 7b 73 65 63 6f 6e 64 73 20 35  ame { {seconds 5
a190: 7d 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b  } } {..    if {[
a1a0: 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
a1b0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
a1c0: 66 69 6c 65 20 74 65 6d 70 6e 61 6d 65 5d 0d 0a  file tempname]..
a1d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
a1e0: 20 20 20 20 73 65 74 20 70 61 74 68 20 5b 67 65      set path [ge
a1f0: 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d  tTemporaryPath].
a200: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 6f 77  ...      set now
a210: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
a220: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 61 72  ..      set star
a230: 74 20 24 6e 6f 77 3b 20 73 65 74 20 73 74 6f 70  t $now; set stop
a240: 20 5b 65 78 70 72 20 7b 24 6e 6f 77 20 2b 20 24   [expr {$now + $
a250: 73 65 63 6f 6e 64 73 7d 5d 0d 0a 0d 0a 20 20 20  seconds}]....   
a260: 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74     while {$start
a270: 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77   <= $now && $now
a280: 20 3c 20 24 73 74 6f 70 7d 20 7b 0d 0a 20 20 20   < $stop} {..   
a290: 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e       binary scan
a2a0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
a2b0: 64 2a 20 5b 65 78 70 72 20 7b 72 61 6e 64 28 29  d* [expr {rand()
a2c0: 7d 5d 5d 20 68 2a 20 72 61 6e 64 6f 6d 0d 0a 0d  }]] h* random...
a2d0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
a2e0: 65 4e 61 6d 65 4f 6e 6c 79 20 5b 61 70 70 65 6e  eNameOnly [appen
a2f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a300: 20 20 20 20 20 74 6d 70 20 5b 73 74 72 69 6e 67       tmp [string
a310: 20 69 6e 64 65 78 20 24 72 61 6e 64 6f 6d 20 30   index $random 0
a320: 5d 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20  ] [string index 
a330: 24 72 61 6e 64 6f 6d 20 31 5d 20 5c 0d 0a 20 20  $random 1] \..  
a340: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
a350: 67 20 69 6e 64 65 78 20 24 72 61 6e 64 6f 6d 20  g index $random 
a360: 65 6e 64 2d 31 5d 20 5b 73 74 72 69 6e 67 20 69  end-1] [string i
a370: 6e 64 65 78 20 24 72 61 6e 64 6f 6d 20 65 6e 64  ndex $random end
a380: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
a390: 20 2e 74 6d 70 5d 0d 0a 0d 0a 20 20 20 20 20 20   .tmp]....      
a3a0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
a3b0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
a3c0: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d 0a  $fileNameOnly]..
a3d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
a3e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
a3f0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
a400: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a410: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
a420: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a430: 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20   set now [clock 
a440: 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
a450: 7d 0d 0a 0d 0a 20 20 20 20 20 20 65 72 72 6f 72  }....      error
a460: 20 22 63 61 6e 6e 6f 74 20 67 65 6e 65 72 61 74   "cannot generat
a470: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
a480: 20 6e 61 6d 65 22 0d 0a 20 20 20 20 7d 0d 0a 20   name"..    }.. 
a490: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65   }.....  proc ge
a4a0: 74 46 69 6c 65 73 20 7b 20 64 69 72 65 63 74 6f  tFiles { directo
a4b0: 72 79 20 70 61 74 74 65 72 6e 20 7d 20 7b 0d 0a  ry pattern } {..
a4c0: 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
a4d0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
a4e0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
a4f0: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  t]....      if {
a500: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69  [file exists $di
a510: 72 65 63 74 6f 72 79 5d 20 26 26 20 5b 66 69 6c  rectory] && [fil
a520: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
a530: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
a540: 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
a550: 63 68 20 66 69 6c 65 4e 61 6d 65 20 5b 6c 73 6f  ch fileName [lso
a560: 72 74 20 2d 64 69 63 74 69 6f 6e 61 72 79 20 5b  rt -dictionary [
a570: 66 69 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63  file list $direc
a580: 74 6f 72 79 20 24 70 61 74 74 65 72 6e 5d 5d 20  tory $pattern]] 
a590: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
a5a0: 7b 5b 66 69 6c 65 20 69 73 66 69 6c 65 20 24 66  {[file isfile $f
a5b0: 69 6c 65 4e 61 6d 65 5d 20 26 26 20 5b 66 69 6c  ileName] && [fil
a5c0: 65 20 72 65 61 64 61 62 6c 65 20 24 66 69 6c 65  e readable $file
a5d0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
a5f0: 6e 64 20 72 65 73 75 6c 74 20 24 66 69 6c 65 4e  nd result $fileN
a600: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
a610: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a620: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
a630: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
a640: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
a650: 20 20 72 65 74 75 72 6e 20 5b 6c 73 6f 72 74 20    return [lsort 
a660: 2d 64 69 63 74 69 6f 6e 61 72 79 20 5b 67 6c 6f  -dictionary [glo
a670: 62 20 2d 64 69 72 65 63 74 6f 72 79 20 24 64 69  b -directory $di
a680: 72 65 63 74 6f 72 79 20 2d 74 79 70 65 73 20 5c  rectory -types \
a690: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 66 20 72  ..          {f r
a6a0: 7d 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d 2d  } -nocomplain --
a6b0: 20 24 70 61 74 74 65 72 6e 5d 5d 0d 0a 20 20 20   $pattern]]..   
a6c0: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
a6d0: 6f 63 20 67 65 74 54 65 73 74 46 69 6c 65 73 20  oc getTestFiles 
a6e0: 7b 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 61  { directories ma
a6f0: 74 63 68 46 69 6c 65 50 61 74 74 65 72 6e 73 20  tchFilePatterns 
a700: 73 6b 69 70 46 69 6c 65 50 61 74 74 65 72 6e 73  skipFilePatterns
a710: 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20 72 65   } {..    set re
a720: 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
a730: 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
a740: 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 69 65  tory $directorie
a750: 73 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 6d  s {..      set m
a760: 61 74 63 68 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  atchFileNames [l
a770: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
a780: 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24 6d  reach pattern $m
a790: 61 74 63 68 46 69 6c 65 50 61 74 74 65 72 6e 73  atchFilePatterns
a7a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
a7b0: 20 6c 61 70 70 65 6e 64 20 6d 61 74 63 68 46 69   lappend matchFi
a7c0: 6c 65 4e 61 6d 65 73 20 5b 67 65 74 46 69 6c 65  leNames [getFile
a7d0: 73 20 24 64 69 72 65 63 74 6f 72 79 20 24 70 61  s $directory $pa
a7e0: 74 74 65 72 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  ttern]..      }.
a7f0: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6b 69  ...      set ski
a800: 70 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  pFileNames [list
a810: 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  ]....      forea
a820: 63 68 20 70 61 74 74 65 72 6e 20 24 73 6b 69 70  ch pattern $skip
a830: 46 69 6c 65 50 61 74 74 65 72 6e 73 20 7b 0d 0a  FilePatterns {..
a840: 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
a850: 70 65 6e 64 20 73 6b 69 70 46 69 6c 65 4e 61 6d  pend skipFileNam
a860: 65 73 20 5b 67 65 74 46 69 6c 65 73 20 24 64 69  es [getFiles $di
a870: 72 65 63 74 6f 72 79 20 24 70 61 74 74 65 72 6e  rectory $pattern
a880: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
a890: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
a8a0: 4e 61 6d 65 20 24 6d 61 74 63 68 46 69 6c 65 4e  Name $matchFileN
a8b0: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
a8c0: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
a8d0: 61 63 74 20 24 73 6b 69 70 46 69 6c 65 4e 61 6d  act $skipFileNam
a8e0: 65 73 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  es $fileName] ==
a8f0: 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
a900: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
a910: 65 73 75 6c 74 20 24 66 69 6c 65 4e 61 6d 65 0d  esult $fileName.
a920: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
a930: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
a940: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
a950: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
a960: 20 67 65 74 54 65 73 74 52 75 6e 49 64 20 7b 7d   getTestRunId {}
a970: 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b   {..    return [
a980: 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73  expr {[info exis
a990: 74 73 20 3a 3a 74 65 73 74 5f 72 75 6e 5f 69 64  ts ::test_run_id
a9a0: 5d 20 3f 20 24 3a 3a 74 65 73 74 5f 72 75 6e 5f  ] ? $::test_run_
a9b0: 69 64 20 3a 20 22 22 7d 5d 0d 0a 20 20 7d 0d 0a  id : ""}]..  }..
a9c0: 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 4e 65 77  ...  proc getNew
a9d0: 54 65 73 74 52 75 6e 49 64 20 7b 7d 20 7b 0d 0a  TestRunId {} {..
a9e0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41 43      #..    # HAC
a9f0: 4b 3a 20 59 65 73 2c 20 74 68 69 73 20 69 73 20  K: Yes, this is 
aa00: 61 20 62 69 74 20 75 67 6c 79 3b 20 68 6f 77 65  a bit ugly; howe
aa10: 76 65 72 2c 20 69 74 20 63 72 65 61 74 65 73 20  ver, it creates 
aa20: 61 20 6e 69 63 65 20 75 6e 69 71 75 65 0d 0a 20  a nice unique.. 
aa30: 20 20 20 23 20 20 20 20 20 20 20 69 64 65 6e 74     #       ident
aa40: 69 66 69 65 72 20 74 6f 20 72 65 70 72 65 73 65  ifier to represe
aa50: 6e 74 20 74 68 65 20 74 65 73 74 20 72 75 6e 2c  nt the test run,
aa60: 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 6e 61   which makes ana
aa70: 6c 79 7a 69 6e 67 0d 0a 20 20 20 20 23 20 20 20  lyzing..    #   
aa80: 20 20 20 20 74 68 65 20 74 65 73 74 20 6c 6f 67      the test log
aa90: 20 66 69 6c 65 73 20 61 20 6c 6f 74 20 65 61 73   files a lot eas
aaa0: 69 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ier...    #..   
aab0: 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20   if {[isEagle]} 
aac0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
aad0: 0a 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a  .      # BUGBUG:
aae0: 20 54 63 6c 20 38 2e 34 20 64 6f 65 73 20 6e 6f   Tcl 8.4 does no
aaf0: 74 20 6c 69 6b 65 20 74 68 69 73 20 65 78 70 72  t like this expr
ab00: 65 73 73 69 6f 6e 20 28 61 6e 64 20 54 63 6c 20  ession (and Tcl 
ab10: 74 72 69 65 73 20 74 6f 0d 0a 20 20 20 20 20 20  tries to..      
ab20: 23 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c  #         compil
ab30: 65 20 69 74 20 65 76 65 6e 20 74 68 6f 75 67 68  e it even though
ab40: 20 69 74 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 63   it will only ac
ab50: 74 75 61 6c 6c 79 20 65 76 65 72 20 62 65 0d 0a  tually ever be..
ab60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
ab70: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 45 61 67  evaluated in Eag
ab80: 6c 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  le)...      #.. 
ab90: 20 20 20 20 20 73 65 74 20 65 78 70 72 20 7b 72       set expr {r
aba0: 61 6e 64 6f 6d 28 29 7d 0d 0a 0d 0a 20 20 20 20  andom()}....    
abb0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
abc0: 45 3a 20 49 6e 63 6c 75 64 65 20 74 68 65 20 68  E: Include the h
abd0: 6f 73 74 20 6e 61 6d 65 20 74 6f 20 6d 61 6b 65  ost name to make
abe0: 20 74 68 65 20 72 65 73 75 6c 74 20 6d 6f 72 65   the result more
abf0: 20 75 6e 69 71 75 65 20 69 6e 20 62 6f 74 68 0d   unique in both.
ac00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
ac10: 69 6d 65 20 61 6e 64 20 73 70 61 63 65 2e 20 20  ime and space.  
ac20: 41 6c 73 6f 2c 20 68 61 73 68 20 74 68 65 20 65  Also, hash the e
ac30: 6e 74 69 72 65 20 63 6f 6e 73 74 72 75 63 74 65  ntire constructe
ac40: 64 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  d string...     
ac50: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
ac60: 69 73 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b 0d  isMono]} then {.
ac70: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ac80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e      # NOTE: When
ac90: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 74 68 65 20   running on the 
aca0: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2c 20  .NET Framework, 
acb0: 77 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 75 73  we can simply us
acc0: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
acd0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 66         [string f
ace0: 6f 72 6d 61 74 5d 20 63 6f 6d 6d 61 6e 64 2e 0d  ormat] command..
acf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ad00: 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 73 68      return [hash
ad10: 20 6e 6f 72 6d 61 6c 20 73 68 61 32 35 36 20 5b   normal sha256 [
ad20: 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 20 5c 0d  string format \.
ad30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 7b 30  .            "{0
ad40: 7d 7b 31 3a 58 38 7d 7b 32 3a 58 38 7d 7b 33 3a  }{1:X8}{2:X8}{3:
ad50: 58 31 36 7d 7b 34 3a 58 31 36 7d 7b 35 3a 58 31  X16}{4:X16}{5:X1
ad60: 36 7d 22 20 5b 69 6e 66 6f 20 68 6f 73 74 5d 20  6}" [info host] 
ad70: 5b 70 69 64 5d 20 5c 0d 0a 20 20 20 20 20 20 20  [pid] \..       
ad80: 20 20 20 20 20 5b 69 6e 66 6f 20 74 69 64 5d 20       [info tid] 
ad90: 5b 63 6c 6f 63 6b 20 6e 6f 77 5d 20 5b 63 6c 6f  [clock now] [clo
ada0: 63 6b 20 63 6c 69 63 6b 73 5d 20 5b 65 78 70 72  ck clicks] [expr
adb0: 20 24 65 78 70 72 5d 5d 5d 0d 0a 20 20 20 20 20   $expr]]]..     
adc0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
add0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ade0: 48 41 43 4b 3a 20 4d 6f 6e 6f 20 64 6f 65 73 20  HACK: Mono does 
adf0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
ae00: 70 70 6f 72 74 20 63 61 6c 6c 69 6e 67 20 74 68  pport calling th
ae10: 65 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 0d  e String.Format.
ae20: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
ae30: 20 6f 76 65 72 6c 6f 61 64 20 74 68 61 74 20 74   overload that t
ae40: 61 6b 65 73 20 61 20 76 61 72 69 61 62 6c 65 20  akes a variable 
ae50: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
ae60: 6e 74 73 20 76 69 61 0d 0a 20 20 20 20 20 20 20  nts via..       
ae70: 20 23 20 20 20 20 20 20 20 72 65 66 6c 65 63 74   #       reflect
ae80: 69 6f 6e 20 28 4d 6f 6e 6f 20 62 75 67 20 23 36  ion (Mono bug #6
ae90: 33 36 39 33 39 29 2e 20 20 41 6c 73 6f 2c 20 73  36939).  Also, s
aea0: 74 72 69 70 20 61 6e 79 20 6c 65 61 64 69 6e 67  trip any leading
aeb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
aec0: 20 20 6d 69 6e 75 73 20 73 69 67 6e 73 20 66 6f    minus signs fo
aed0: 72 20 63 6c 65 61 6e 6c 69 6e 65 73 73 2e 0d 0a  r cleanliness...
aee0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
aef0: 20 20 20 72 65 74 75 72 6e 20 5b 68 61 73 68 20     return [hash 
af00: 6e 6f 72 6d 61 6c 20 73 68 61 32 35 36 20 5b 61  normal sha256 [a
af10: 70 70 65 6e 64 41 72 67 73 20 5b 69 6e 66 6f 20  ppendArgs [info 
af20: 68 6f 73 74 5d 20 5b 73 74 72 69 6e 67 20 5c 0d  host] [string \.
af30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 69  .            tri
af40: 6d 6c 65 66 74 20 5b 70 69 64 5d 20 2d 5d 20 5b  mleft [pid] -] [
af50: 73 74 72 69 6e 67 20 74 72 69 6d 6c 65 66 74 20  string trimleft 
af60: 5b 69 6e 66 6f 20 74 69 64 5d 20 2d 5d 20 5b 73  [info tid] -] [s
af70: 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20  tring \..       
af80: 20 20 20 20 20 74 72 69 6d 6c 65 66 74 20 5b 63       trimleft [c
af90: 6c 6f 63 6b 20 6e 6f 77 5d 20 2d 5d 20 5b 73 74  lock now] -] [st
afa0: 72 69 6e 67 20 74 72 69 6d 6c 65 66 74 20 5b 63  ring trimleft [c
afb0: 6c 6f 63 6b 20 63 6c 69 63 6b 73 5d 20 2d 5d 20  lock clicks] -] 
afc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
afd0: 73 74 72 69 6e 67 20 74 72 69 6d 6c 65 66 74 20  string trimleft 
afe0: 5b 65 78 70 72 20 24 65 78 70 72 5d 20 2d 5d 5d  [expr $expr] -]]
aff0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
b000: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
b020: 20 47 65 6e 65 72 61 74 65 20 61 20 72 61 6e 64   Generate a rand
b030: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 69 6e 67 20  om number using 
b040: 5b 65 78 70 72 5d 20 61 6e 64 20 74 68 65 6e 20  [expr] and then 
b050: 63 6f 6e 76 65 72 74 20 69 74 0d 0a 20 20 20 20  convert it..    
b060: 20 20 23 20 20 20 20 20 20 20 74 6f 20 61 20 36    #       to a 6
b070: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0d 0a  4-bit integer...
b080: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 62        #..      b
b090: 69 6e 61 72 79 20 73 63 61 6e 20 5b 62 69 6e 61  inary scan [bina
b0a0: 72 79 20 66 6f 72 6d 61 74 20 64 2a 20 5b 65 78  ry format d* [ex
b0b0: 70 72 20 7b 72 61 6e 64 28 29 7d 5d 5d 20 77 2a  pr {rand()}]] w*
b0c0: 20 72 61 6e 64 6f 6d 0d 0a 0d 0a 20 20 20 20 20   random....     
b0d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b0e0: 3a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 68 6f  : Convert the ho
b0f0: 73 74 20 6e 61 6d 65 20 74 6f 20 61 20 68 65 78  st name to a hex
b100: 61 64 65 63 69 6d 61 6c 20 73 74 72 69 6e 67 20  adecimal string 
b110: 61 6e 64 20 69 6e 63 6c 75 64 65 0d 0a 20 20 20  and include..   
b120: 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 6e     #       it in
b130: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 61   the result in a
b140: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
b150: 65 20 69 74 20 6d 6f 72 65 20 75 6e 69 71 75 65  e it more unique
b160: 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   in..      #    
b170: 20 20 20 62 6f 74 68 20 74 69 6d 65 20 61 6e 64     both time and
b180: 20 73 70 61 63 65 2e 0d 0a 20 20 20 20 20 20 23   space...      #
b190: 0d 0a 20 20 20 20 20 20 62 69 6e 61 72 79 20 73  ..      binary s
b1a0: 63 61 6e 20 5b 69 6e 66 6f 20 68 6f 73 74 5d 20  can [info host] 
b1b0: 63 2a 20 68 6f 73 74 0d 0a 20 20 20 20 20 20 73  c* host..      s
b1c0: 65 74 20 68 6f 73 74 20 5b 65 76 61 6c 20 5b 6c  et host [eval [l
b1d0: 69 73 74 20 66 6f 72 6d 61 74 20 5b 73 74 72 69  ist format [stri
b1e0: 6e 67 20 72 65 70 65 61 74 20 25 58 20 5b 6c 6c  ng repeat %X [ll
b1f0: 65 6e 67 74 68 20 24 68 6f 73 74 5d 5d 5d 20 24  ength $host]]] $
b200: 68 6f 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  host]....      #
b210: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
b220: 42 75 69 6c 64 20 74 68 65 20 66 69 6e 61 6c 20  Build the final 
b230: 72 65 73 75 6c 74 20 77 69 74 68 20 74 68 65 20  result with the 
b240: 5b 66 6f 72 6d 61 74 5d 20 63 6f 6d 6d 61 6e 64  [format] command
b250: 2c 20 63 6f 6e 76 65 72 74 69 6e 67 0d 0a 20 20  , converting..  
b260: 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 6c 20      #       all 
b270: 74 68 65 20 70 69 65 63 65 73 20 74 6f 20 68 65  the pieces to he
b280: 78 61 64 65 63 69 6d 61 6c 20 28 65 78 63 65 70  xadecimal (excep
b290: 74 20 74 68 65 20 68 6f 73 74 2c 20 77 68 69 63  t the host, whic
b2a0: 68 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  h is..      #   
b2b0: 20 20 20 20 61 6c 72 65 61 64 79 20 68 65 78 61      already hexa
b2c0: 64 65 63 69 6d 61 6c 29 2e 0d 0a 20 20 20 20 20  decimal)...     
b2d0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70 69   #..      set pi
b2e0: 64 20 5b 70 69 64 5d 3b 20 73 65 74 20 73 65 63  d [pid]; set sec
b2f0: 6f 6e 64 73 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  onds [clock seco
b300: 6e 64 73 5d 3b 20 73 65 74 20 63 6c 69 63 6b 73  nds]; set clicks
b310: 20 5b 63 6c 6f 63 6b 20 63 6c 69 63 6b 73 5d 0d   [clock clicks].
b320: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
b330: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b340: 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 20 5b           $host [
b350: 66 6f 72 6d 61 74 20 5b 61 70 70 65 6e 64 41 72  format [appendAr
b360: 67 73 20 25 20 5b 67 65 74 4c 65 6e 67 74 68 4d  gs % [getLengthM
b370: 6f 64 69 66 69 65 72 20 24 70 69 64 5d 20 58 25  odifier $pid] X%
b380: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 67   \..          [g
b390: 65 74 4c 65 6e 67 74 68 4d 6f 64 69 66 69 65 72  etLengthModifier
b3a0: 20 24 73 65 63 6f 6e 64 73 5d 20 58 25 20 5b 67   $seconds] X% [g
b3b0: 65 74 4c 65 6e 67 74 68 4d 6f 64 69 66 69 65 72  etLengthModifier
b3c0: 20 24 63 6c 69 63 6b 73 5d 20 58 25 20 5c 0d 0a   $clicks] X% \..
b3d0: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 4c 65            [getLe
b3e0: 6e 67 74 68 4d 6f 64 69 66 69 65 72 20 24 72 61  ngthModifier $ra
b3f0: 6e 64 6f 6d 5d 20 58 5d 20 24 70 69 64 20 24 73  ndom] X] $pid $s
b400: 65 63 6f 6e 64 73 20 24 63 6c 69 63 6b 73 20 24  econds $clicks $
b410: 72 61 6e 64 6f 6d 5d 5d 0d 0a 20 20 20 20 7d 0d  random]]..    }.
b420: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
b430: 67 65 74 44 65 66 61 75 6c 74 54 65 73 74 4c 6f  getDefaultTestLo
b440: 67 50 61 74 68 20 7b 20 65 78 65 63 75 74 61 62  gPath { executab
b450: 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  le } {..    #.. 
b460: 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65     # NOTE: By de
b470: 66 61 75 6c 74 2c 20 75 73 65 20 74 68 65 20 63  fault, use the c
b480: 6f 6e 66 69 67 75 72 65 64 20 74 65 6d 70 6f 72  onfigured tempor
b490: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
b4a0: 72 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74  r..    #       t
b4b0: 65 73 74 20 6c 6f 67 20 66 69 6c 65 73 20 75 6e  est log files un
b4c0: 6c 65 73 73 20 77 65 20 61 72 65 20 66 6f 72 62  less we are forb
b4d0: 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67  idden from doing
b4e0: 20 73 6f 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20   so...    #..   
b4f0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
b500: 74 73 20 3a 3a 6e 6f 28 74 65 6d 70 6f 72 61 72  ts ::no(temporar
b510: 79 54 65 73 74 4c 6f 67 29 5d 7d 20 74 68 65 6e  yTestLog)]} then
b520: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
b530: 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61   [getTemporaryPa
b540: 74 68 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  th]..    } else 
b550: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
b560: 20 20 23 20 48 41 43 4b 3a 20 49 74 20 73 65 65    # HACK: It see
b570: 6d 73 20 74 68 61 74 20 2e 4e 45 54 20 43 6f 72  ms that .NET Cor
b580: 65 20 63 6f 6e 73 69 64 65 72 73 20 69 74 73 65  e considers itse
b590: 6c 66 20 74 6f 20 62 65 20 74 68 65 0d 0a 20 20  lf to be the..  
b5a0: 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63      #       exec
b5b0: 75 74 61 62 6c 65 2d 6f 66 2d 72 65 63 6f 72 64  utable-of-record
b5c0: 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65 73 73   for the process
b5d0: 3b 20 69 6e 20 74 68 61 74 20 63 61 73 65 2c 0d  ; in that case,.
b5e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
b5f0: 65 6c 6f 63 61 74 65 20 74 68 65 20 6c 6f 67 20  elocate the log 
b600: 66 69 6c 65 20 74 6f 20 62 65 20 6e 65 61 72 65  file to be neare
b610: 72 20 74 68 65 20 61 73 73 65 6d 62 6c 69 65 73  r the assemblies
b620: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b630: 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 20    if {[isEagle] 
b640: 26 26 20 5b 69 73 44 6f 74 4e 65 74 43 6f 72 65  && [isDotNetCore
b650: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b660: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
b670: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
b680: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b690: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
b6a0: 72 6e 61 6d 65 20 24 65 78 65 63 75 74 61 62 6c  rname $executabl
b6b0: 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  e]..      }..   
b6c0: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
b6d0: 6f 63 20 67 65 74 54 65 73 74 4c 6f 67 50 61 74  oc getTestLogPat
b6e0: 68 20 7b 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75  h {} {..    retu
b6f0: 72 6e 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20  rn [expr {[info 
b700: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f  exists ::test_lo
b710: 67 5f 70 61 74 68 5d 20 3f 20 24 74 65 73 74 5f  g_path] ? $test_
b720: 6c 6f 67 5f 70 61 74 68 20 3a 20 22 22 7d 5d 0d  log_path : ""}].
b730: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
b740: 67 65 74 54 65 73 74 4c 6f 67 49 64 20 7b 7d 20  getTestLogId {} 
b750: 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65  {..    return [e
b760: 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  xpr {[info exist
b770: 73 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 69 64 5d  s ::test_log_id]
b780: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 61   ? \..        [a
b790: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 2e 20 24  ppend result . $
b7a0: 3a 3a 74 65 73 74 5f 6c 6f 67 5f 69 64 5d 20 3a  ::test_log_id] :
b7b0: 20 22 22 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20   ""}]..  }..... 
b7c0: 20 70 72 6f 63 20 67 65 74 44 65 66 61 75 6c 74   proc getDefault
b7d0: 54 65 73 74 4c 6f 67 20 7b 7d 20 7b 0d 0a 20 20  TestLog {} {..  
b7e0: 20 20 73 65 74 20 65 78 65 63 75 74 61 62 6c 65    set executable
b7f0: 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65   [info nameofexe
b800: 63 75 74 61 62 6c 65 5d 0d 0a 0d 0a 20 20 20 20  cutable]....    
b810: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
b820: 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 70 61 74 68   ::test_log_path
b830: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b840: 20 73 65 74 20 70 61 74 68 20 24 3a 3a 74 65 73   set path $::tes
b850: 74 5f 6c 6f 67 5f 70 61 74 68 0d 0a 20 20 20 20  t_log_path..    
b860: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b870: 73 65 74 20 70 61 74 68 20 5b 67 65 74 44 65 66  set path [getDef
b880: 61 75 6c 74 54 65 73 74 4c 6f 67 50 61 74 68 20  aultTestLogPath 
b890: 24 65 78 65 63 75 74 61 62 6c 65 5d 0d 0a 20 20  $executable]..  
b8a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72    }....    retur
b8b0: 6e 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a  n [file normaliz
b8c0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61  e [file join $pa
b8d0: 74 68 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  th [appendArgs \
b8e0: 0d 0a 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20  ..        [file 
b8f0: 74 61 69 6c 20 24 65 78 65 63 75 74 61 62 6c 65  tail $executable
b900: 5d 20 5b 67 65 74 54 65 73 74 4c 6f 67 49 64 5d  ] [getTestLogId]
b910: 20 2e 74 65 73 74 2e 20 5b 70 69 64 5d 20 2e 6c   .test. [pid] .l
b920: 6f 67 5d 5d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20  og]]]..  }..... 
b930: 20 70 72 6f 63 20 67 65 74 54 65 73 74 4c 6f 67   proc getTestLog
b940: 20 7b 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72   {} {..    retur
b950: 6e 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65  n [expr {[info e
b960: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f 67  xists ::test_log
b970: 5d 20 3f 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 20  ] ? $::test_log 
b980: 3a 20 22 22 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  : ""}]..  }.....
b990: 20 20 70 72 6f 63 20 67 65 74 4c 61 73 74 54 65    proc getLastTe
b9a0: 73 74 4c 6f 67 20 7b 7d 20 7b 0d 0a 20 20 20 20  stLog {} {..    
b9b0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 55  #..    # NOTE: U
b9c0: 73 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65  se the configure
b9d0: 64 20 6c 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20  d log file name 
b9e0: 2d 4f 52 2d 20 77 68 61 74 20 74 68 65 20 63 6f  -OR- what the co
b9f0: 6e 66 69 67 75 72 65 64 0d 0a 20 20 20 20 23 20  nfigured..    # 
ba00: 20 20 20 20 20 20 6c 6f 67 20 66 69 6c 65 20 6e        log file n
ba10: 61 6d 65 20 77 6f 75 6c 64 20 62 65 2c 20 62 79  ame would be, by
ba20: 20 64 65 66 61 75 6c 74 2c 20 69 66 20 69 74 20   default, if it 
ba30: 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 65 64  actually existed
ba40: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ...    #..    if
ba50: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
ba60: 3a 74 65 73 74 5f 6c 6f 67 5d 7d 20 74 68 65 6e  :test_log]} then
ba70: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 6c 6f   {..      set lo
ba80: 67 46 69 6c 65 4e 61 6d 65 20 24 3a 3a 74 65 73  gFileName $::tes
ba90: 74 5f 6c 6f 67 0d 0a 20 20 20 20 7d 20 65 6c 73  t_log..    } els
baa0: 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 6c  e {..      set l
bab0: 6f 67 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 44  ogFileName [getD
bac0: 65 66 61 75 6c 74 54 65 73 74 4c 6f 67 5d 0d 0a  efaultTestLog]..
bad0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65 74      }....    set
bae0: 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 5b 66 69   logFileName [fi
baf0: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 6c 6f  le normalize $lo
bb00: 67 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  gFileName]..    
bb10: 73 65 74 20 6c 6f 67 54 69 6d 65 20 5b 65 78 70  set logTime [exp
bb20: 72 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  r {[file exists 
bb30: 24 6c 6f 67 46 69 6c 65 4e 61 6d 65 5d 20 3f 20  $logFileName] ? 
bb40: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 66 69 6c 65  \..        [file
bb50: 20 6d 74 69 6d 65 20 24 6c 6f 67 46 69 6c 65 4e   mtime $logFileN
bb60: 61 6d 65 5d 20 3a 20 30 7d 5d 0d 0a 0d 0a 20 20  ame] : 0}]....  
bb70: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
bb80: 20 4d 61 6b 65 20 74 68 65 20 6c 6f 67 20 66 69   Make the log fi
bb90: 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 61 20 70  le name into a p
bba0: 61 74 74 65 72 6e 20 77 65 20 63 61 6e 20 75 73  attern we can us
bbb0: 65 20 74 6f 20 66 69 6e 64 0d 0a 20 20 20 20 23  e to find..    #
bbc0: 20 20 20 20 20 20 20 74 68 65 20 72 65 6c 61 74         the relat
bbd0: 65 64 20 6c 6f 67 20 66 69 6c 65 73 2e 0d 0a 20  ed log files... 
bbe0: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 72     #..    if {[r
bbf0: 65 67 73 75 62 20 2d 2d 20 7b 5c 2e 5c 64 2b 5c  egsub -- {\.\d+\
bc00: 2e 7d 20 24 6c 6f 67 46 69 6c 65 4e 61 6d 65 20  .} $logFileName 
bc10: 7b 2e 2a 2e 7d 20 70 61 74 74 65 72 6e 5d 7d 20  {.*.} pattern]} 
bc20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65  then {..      se
bc30: 74 20 6c 61 73 74 4c 6f 67 46 69 6c 65 20 5b 6c  t lastLogFile [l
bc40: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
bc50: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 5b  reach fileName [
bc60: 66 69 6e 64 46 69 6c 65 73 20 24 70 61 74 74 65  findFiles $patte
bc70: 72 6e 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  rn] {..        #
bc80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
bc90: 3a 20 53 6b 69 70 20 74 68 65 20 63 75 72 72 65  : Skip the curre
bca0: 6e 74 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65  nt test log file
bcb0: 2c 20 69 66 20 66 6f 75 6e 64 2e 0d 0a 20 20 20  , if found...   
bcc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bcd0: 69 66 20 7b 5b 69 73 53 61 6d 65 46 69 6c 65 4e  if {[isSameFileN
bce0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6c  ame $fileName $l
bcf0: 6f 67 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  ogFileName]} the
bd00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
bd10: 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20  ontinue..       
bd20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
bd30: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
bd40: 20 57 68 65 6e 20 77 61 73 20 74 68 69 73 20 6c   When was this l
bd50: 6f 67 20 66 69 6c 65 20 6c 61 73 74 20 6d 6f 64  og file last mod
bd60: 69 66 69 65 64 3f 0d 0a 20 20 20 20 20 20 20 20  ified?..        
bd70: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  #..        set t
bd80: 69 6d 65 20 5b 66 69 6c 65 20 6d 74 69 6d 65 20  ime [file mtime 
bd90: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
bda0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bdb0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
bdc0: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
bdd0: 20 6e 6f 20 6c 6f 67 20 66 69 6c 65 20 73 65 65   no log file see
bde0: 6e 20 2d 4f 52 2d 20 74 68 69 73 0d 0a 20 20 20  n -OR- this..   
bdf0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 67       #       log
be00: 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 6c 61   file has the la
be10: 74 65 73 74 20 6d 6f 64 69 66 69 65 64 20 74 69  test modified ti
be20: 6d 65 20 73 65 65 6e 2e 0d 0a 20 20 20 20 20 20  me seen...      
be30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
be40: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 61 73 74 4c  {[llength $lastL
be50: 6f 67 46 69 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20  ogFile] == 0 || 
be60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
be70: 74 69 6d 65 20 3e 20 5b 6c 69 6e 64 65 78 20 24  time > [lindex $
be80: 6c 61 73 74 4c 6f 67 46 69 6c 65 20 30 5d 7d 20  lastLogFile 0]} 
be90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bea0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
beb0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 6e   NOTE: This is n
bec0: 6f 77 20 74 68 65 20 6c 61 74 65 73 74 20 6c 6f  ow the latest lo
bed0: 67 20 66 69 6c 65 20 73 65 65 6e 2e 0d 0a 20 20  g file seen...  
bee0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bef0: 20 20 20 20 20 73 65 74 20 6c 61 73 74 4c 6f 67       set lastLog
bf00: 46 69 6c 65 20 5b 6c 69 73 74 20 24 74 69 6d 65  File [list $time
bf10: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
bf20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
bf30: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bf40: 20 20 23 20 4e 4f 54 45 3a 20 45 69 74 68 65 72    # NOTE: Either
bf50: 20 72 65 74 75 72 6e 20 74 68 65 20 6c 61 73 74   return the last
bf60: 20 6c 6f 67 20 66 69 6c 65 20 73 65 65 6e 2c 20   log file seen, 
bf70: 69 66 20 61 6e 79 20 2d 4f 52 2d 20 74 68 65 0d  if any -OR- the.
bf80: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
bf90: 6f 6e 66 69 67 75 72 65 64 20 6c 6f 67 20 66 69  onfigured log fi
bfa0: 6c 65 2c 20 69 66 20 69 74 20 61 63 74 75 61 6c  le, if it actual
bfb0: 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ly exists...    
bfc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
bfd0: 6c 6c 65 6e 67 74 68 20 24 6c 61 73 74 4c 6f 67  llength $lastLog
bfe0: 46 69 6c 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  File] > 0} then 
bff0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
c000: 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 61 73 74 4c  n [lindex $lastL
c010: 6f 67 46 69 6c 65 20 31 5d 0d 0a 20 20 20 20 20  ogFile 1]..     
c020: 20 7d 20 65 6c 73 65 69 66 20 7b 24 6c 6f 67 54   } elseif {$logT
c030: 69 6d 65 20 21 3d 20 30 7d 20 74 68 65 6e 20 7b  ime != 0} then {
c040: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
c050: 20 24 6c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a 20   $logFileName.. 
c060: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
c070: 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a  .    return ""..
c080: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67    }.....  proc g
c090: 65 74 54 65 73 74 53 75 69 74 65 20 7b 7d 20 7b  etTestSuite {} {
c0a0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
c0b0: 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74  OTE: Determine t
c0c0: 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 73  he effective tes
c0d0: 74 20 73 75 69 74 65 20 6e 61 6d 65 20 61 6e 64  t suite name and
c0e0: 20 72 65 74 75 72 6e 20 69 74 2e 20 20 49 66 20   return it.  If 
c0f0: 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  the..    #      
c100: 20 74 65 73 74 20 73 75 69 74 65 20 6e 61 6d 65   test suite name
c110: 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74 65 72   cannot be deter
c120: 6d 69 6e 65 64 2c 20 72 65 74 75 72 6e 20 74 68  mined, return th
c130: 65 20 64 65 66 61 75 6c 74 20 62 61 73 65 64 0d  e default based.
c140: 0a 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e 20  .    #       on 
c150: 77 68 65 74 68 65 72 20 77 65 20 61 72 65 20 72  whether we are r
c160: 75 6e 6e 69 6e 67 20 69 6e 20 45 61 67 6c 65 20  unning in Eagle 
c170: 6f 72 20 6e 61 74 69 76 65 20 54 63 6c 2e 0d 0a  or native Tcl...
c180: 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
c190: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
c1a0: 73 74 5f 66 6c 61 67 73 28 2d 73 75 69 74 65 29  st_flags(-suite)
c1b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
c1c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c1d0: 3a 3a 74 65 73 74 5f 66 6c 61 67 73 28 2d 73 75  ::test_flags(-su
c1e0: 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ite)] > 0} then 
c1f0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
c200: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 74 65    # NOTE: The te
c210: 73 74 20 73 75 69 74 65 20 6e 61 6d 65 20 68 61  st suite name ha
c220: 73 20 62 65 65 6e 20 6d 61 6e 75 61 6c 6c 79 20  s been manually 
c230: 6f 76 65 72 72 69 64 64 65 6e 20 76 69 61 20 74  overridden via t
c240: 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  he test..      #
c250: 20 20 20 20 20 20 20 66 6c 61 67 73 3b 20 74 68         flags; th
c260: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
c270: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c280: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
c290: 66 6c 61 67 73 28 2d 73 75 69 74 65 29 0d 0a 20  flags(-suite).. 
c2a0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
c2b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
c2c0: 5f 73 75 69 74 65 5d 7d 20 74 68 65 6e 20 7b 0d  _suite]} then {.
c2d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c2e0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
c2f0: 74 65 73 74 20 73 75 69 74 65 20 6e 61 6d 65 2e  test suite name.
c300: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61    The default va
c310: 6c 75 65 20 69 73 20 73 65 74 20 62 79 20 74 68  lue is set by th
c320: 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20  e test..      # 
c330: 20 20 20 20 20 20 73 75 69 74 65 20 70 72 6f 6c        suite prol
c340: 6f 67 75 65 3b 20 68 6f 77 65 76 65 72 2c 20 74  ogue; however, t
c350: 68 69 73 20 6d 61 79 20 68 61 76 65 20 62 65 65  his may have bee
c360: 6e 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20  n overridden... 
c370: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
c380: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 73 75 69  turn $::test_sui
c390: 74 65 0d 0a 20 20 20 20 7d 20 65 6c 73 65 69 66  te..    } elseif
c3a0: 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
c3b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
c3c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
c3d0: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
c3e0: 20 73 75 69 74 65 20 6e 61 6d 65 20 66 6f 72 20   suite name for 
c3f0: 45 61 67 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  Eagle...      #.
c400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 45  .      return "E
c410: 61 67 6c 65 20 54 65 73 74 20 53 75 69 74 65 20  agle Test Suite 
c420: 66 6f 72 20 45 61 67 6c 65 22 0d 0a 20 20 20 20  for Eagle"..    
c430: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c440: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c450: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
c460: 20 74 65 73 74 20 73 75 69 74 65 20 6e 61 6d 65   test suite name
c470: 20 66 6f 72 20 6e 61 74 69 76 65 20 54 63 6c 2e   for native Tcl.
c480: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c490: 20 72 65 74 75 72 6e 20 22 45 61 67 6c 65 20 54   return "Eagle T
c4a0: 65 73 74 20 53 75 69 74 65 20 66 6f 72 20 54 63  est Suite for Tc
c4b0: 6c 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  l"..    }..  }..
c4c0: 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 54 65 73  ...  proc getTes
c4d0: 74 53 75 69 74 65 46 75 6c 6c 4e 61 6d 65 20 7b  tSuiteFullName {
c4e0: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73  } {..    if {[is
c4f0: 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Eagle]} then {..
c500: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
c510: 6d 65 20 5b 70 72 6f 62 65 46 6f 72 53 63 72 69  me [probeForScri
c520: 70 74 46 69 6c 65 4e 61 6d 65 20 5b 6c 69 73 74  ptFileName [list
c530: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
c540: 69 6c 65 20 6a 6f 69 6e 20 2a 20 70 72 6f 6c 6f  ile join * prolo
c550: 67 75 65 2e 65 61 67 6c 65 5d 20 5b 66 69 6c 65  gue.eagle] [file
c560: 20 6a 6f 69 6e 20 2a 20 65 70 69 6c 6f 67 75 65   join * epilogue
c570: 2e 65 61 67 6c 65 5d 20 5c 0d 0a 20 20 20 20 20  .eagle] \..     
c580: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
c590: 2a 20 54 65 73 74 31 2e 30 20 2a 5d 5d 5d 0d 0a  * Test1.0 *]]]..
c5a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c5b0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
c5c0: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20   ""..    }....  
c5d0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
c5e0: 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
c5f0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c600: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
c610: 69 73 74 73 20 3a 3a 74 65 73 74 5f 73 75 69 74  ists ::test_suit
c620: 65 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  e_file]} then {.
c630: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
c640: 65 4e 61 6d 65 20 24 3a 3a 74 65 73 74 5f 73 75  eName $::test_su
c650: 69 74 65 5f 66 69 6c 65 0d 0a 20 20 20 20 20 20  ite_file..      
c660: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
c670: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
c680: 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  th $fileName] ==
c690: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c6a0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
c6b0: 69 6e 66 6f 20 73 63 72 69 70 74 5d 0d 0a 20 20  info script]..  
c6c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b    }....    if {[
c6d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
c6e0: 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  ileName] == 0} t
c6f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  hen {..      set
c700: 20 66 69 6c 65 4e 61 6d 65 20 3c 6e 6f 6e 65 3e   fileName <none>
c710: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73  ..    }....    s
c720: 65 74 20 73 75 69 74 65 4e 61 6d 65 20 5b 67 65  et suiteName [ge
c730: 74 54 65 73 74 53 75 69 74 65 5d 0d 0a 0d 0a 20  tTestSuite].... 
c740: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
c750: 65 6e 67 74 68 20 24 73 75 69 74 65 4e 61 6d 65  ength $suiteName
c760: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
c770: 20 20 20 20 20 20 73 65 74 20 73 75 69 74 65 4e        set suiteN
c780: 61 6d 65 20 3c 6e 6f 6e 65 3e 0d 0a 20 20 20 20  ame <none>..    
c790: 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  }....    return 
c7a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c  [appendArgs $fil
c7b0: 65 4e 61 6d 65 20 22 20 28 22 20 24 73 75 69 74  eName " (" $suit
c7c0: 65 4e 61 6d 65 20 29 5d 0d 0a 20 20 7d 0d 0a 0c  eName )]..  }...
c7d0: 0d 0a 20 20 70 72 6f 63 20 67 65 74 54 65 73 74  ..  proc getTest
c7e0: 4d 61 63 68 69 6e 65 20 7b 7d 20 7b 0d 0a 20 20  Machine {} {..  
c7f0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
c800: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   Determine the e
c810: 66 66 65 63 74 69 76 65 20 74 65 73 74 20 6d 61  ffective test ma
c820: 63 68 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  chine and return
c830: 20 69 74 2e 20 20 49 66 20 74 68 65 0d 0a 20 20   it.  If the..  
c840: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 6d    #       test m
c850: 61 63 68 69 6e 65 20 63 61 6e 6e 6f 74 20 62 65  achine cannot be
c860: 20 64 65 74 65 72 6d 69 6e 65 64 2c 20 72 65 74   determined, ret
c870: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
c880: 69 6e 67 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ing...    #..   
c890: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
c8a0: 73 20 3a 3a 74 65 73 74 5f 66 6c 61 67 73 28 2d  s ::test_flags(-
c8b0: 6d 61 63 68 69 6e 65 29 5d 20 26 26 20 5c 0d 0a  machine)] && \..
c8c0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
c8d0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 66  length $::test_f
c8e0: 6c 61 67 73 28 2d 6d 61 63 68 69 6e 65 29 5d 20  lags(-machine)] 
c8f0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
c900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
c910: 54 45 3a 20 54 68 65 20 74 65 73 74 20 6d 61 63  TE: The test mac
c920: 68 69 6e 65 20 68 61 73 20 62 65 65 6e 20 6d 61  hine has been ma
c930: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
c940: 6e 20 76 69 61 20 74 68 65 20 74 65 73 74 0d 0a  n via the test..
c950: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
c960: 61 67 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ags; therefore, 
c970: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  use it...      #
c980: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
c990: 3a 3a 74 65 73 74 5f 66 6c 61 67 73 28 2d 6d 61  ::test_flags(-ma
c9a0: 63 68 69 6e 65 29 0d 0a 20 20 20 20 7d 20 65 6c  chine)..    } el
c9b0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
c9c0: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
c9d0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
c9e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c9f0: 45 3a 20 55 73 65 20 74 68 65 20 74 65 73 74 20  E: Use the test 
ca00: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 64 65  machine.  The de
ca10: 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 20 73  fault value is s
ca20: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
ca30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
ca40: 69 74 65 20 70 72 6f 6c 6f 67 75 65 3b 20 68 6f  ite prologue; ho
ca50: 77 65 76 65 72 2c 20 74 68 69 73 20 6d 61 79 20  wever, this may 
ca60: 68 61 76 65 20 62 65 65 6e 20 6f 76 65 72 72 69  have been overri
ca70: 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  dden...      #..
ca80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
ca90: 74 65 73 74 5f 6d 61 63 68 69 6e 65 0d 0a 20 20  test_machine..  
caa0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
cab0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
cac0: 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29  latform(machine)
cad0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
cae0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
caf0: 3a 20 55 73 65 20 74 68 65 20 62 75 69 6c 64 20  : Use the build 
cb00: 6d 61 63 68 69 6e 65 20 6f 66 20 45 61 67 6c 65  machine of Eagle
cb10: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
cb20: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
cb30: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
cb40: 6d 61 63 68 69 6e 65 29 0d 0a 20 20 20 20 7d 20  machine)..    } 
cb50: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d  else {..      #.
cb60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
cb70: 65 20 61 72 65 20 6d 69 73 73 69 6e 67 20 74 68  e are missing th
cb80: 65 20 6d 61 63 68 69 6e 65 2c 20 72 65 74 75 72  e machine, retur
cb90: 6e 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  n nothing...    
cba0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
cbb0: 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  n ""..    }..  }
cbc0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 54  .....  proc getT
cbd0: 65 73 74 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 61  estPlatform { {a
cbe0: 72 63 68 69 74 65 63 74 75 72 65 20 66 61 6c 73  rchitecture fals
cbf0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  e} } {..    #.. 
cc00: 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
cc10: 6d 69 6e 65 20 74 68 65 20 65 66 66 65 63 74 69  mine the effecti
cc20: 76 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d  ve test platform
cc30: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 20   and return it. 
cc40: 20 49 66 20 74 68 65 0d 0a 20 20 20 20 23 20 20   If the..    #  
cc50: 20 20 20 20 20 74 65 73 74 20 70 6c 61 74 66 6f       test platfo
cc60: 72 6d 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74  rm cannot be det
cc70: 65 72 6d 69 6e 65 64 2c 20 72 65 74 75 72 6e 20  ermined, return 
cc80: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
cc90: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
cca0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
ccb0: 74 65 73 74 5f 66 6c 61 67 73 28 2d 70 6c 61 74  test_flags(-plat
ccc0: 66 6f 72 6d 29 5d 20 26 26 20 5c 0d 0a 20 20 20  form)] && \..   
ccd0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
cce0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 66 6c 61 67  gth $::test_flag
ccf0: 73 28 2d 70 6c 61 74 66 6f 72 6d 29 5d 20 3e 20  s(-platform)] > 
cd00: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
cd10: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
cd20: 3a 20 54 68 65 20 74 65 73 74 20 70 6c 61 74 66  : The test platf
cd30: 6f 72 6d 20 68 61 73 20 62 65 65 6e 20 6d 61 6e  orm has been man
cd40: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
cd50: 20 76 69 61 20 74 68 65 20 74 65 73 74 0d 0a 20   via the test.. 
cd60: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c 61       #       fla
cd70: 67 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75  gs; therefore, u
cd80: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  se it...      #.
cd90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a  .      return $:
cda0: 3a 74 65 73 74 5f 66 6c 61 67 73 28 2d 70 6c 61  :test_flags(-pla
cdb0: 74 66 6f 72 6d 29 0d 0a 20 20 20 20 7d 20 65 6c  tform)..    } el
cdc0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
cdd0: 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  ts ::test_platfo
cde0: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
cdf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ce00: 54 45 3a 20 55 73 65 20 74 68 65 20 74 65 73 74  TE: Use the test
ce10: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 65 20   platform.  The 
ce20: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73  default value is
ce30: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
ce40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ce50: 73 75 69 74 65 20 70 72 6f 6c 6f 67 75 65 3b 20  suite prologue; 
ce60: 68 6f 77 65 76 65 72 2c 20 74 68 69 73 20 6d 61  however, this ma
ce70: 79 20 68 61 76 65 20 62 65 65 6e 20 6f 76 65 72  y have been over
ce80: 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23  ridden...      #
ce90: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
cea0: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 0d  ::test_platform.
ceb0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
cec0: 20 20 20 20 20 73 65 74 20 6d 61 63 68 69 6e 65       set machine
ced0: 20 5b 67 65 74 54 65 73 74 4d 61 63 68 69 6e 65   [getTestMachine
cee0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
cef0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d  string length $m
cf00: 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65  achine] > 0} the
cf10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
cf20: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
cf30: 55 73 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  Use the machine 
cf40: 61 72 63 68 69 74 65 63 74 75 72 65 20 74 6f 20  architecture to 
cf50: 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
cf60: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
cf70: 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
cf80: 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20  n return it...  
cf90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cfa0: 20 72 65 74 75 72 6e 20 5b 6d 61 63 68 69 6e 65   return [machine
cfb0: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 6d 61 63 68  ToPlatform $mach
cfc0: 69 6e 65 20 24 61 72 63 68 69 74 65 63 74 75 72  ine $architectur
cfd0: 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  e]..      } else
cfe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
cff0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
d000: 65 20 61 72 65 20 6d 69 73 73 69 6e 67 20 74 68  e are missing th
d010: 65 20 6d 61 63 68 69 6e 65 20 61 6e 64 20 77 65  e machine and we
d020: 20 63 61 6e 6e 6f 74 20 66 69 67 75 72 65 20 6f   cannot figure o
d030: 75 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ut the..        
d040: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
d050: 20 77 69 74 68 6f 75 74 20 69 74 3b 20 74 68 65   without it; the
d060: 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 6e  refore, return n
d070: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
d080: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
d090: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
d0a0: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
d0b0: 20 70 72 6f 63 20 67 65 74 54 65 73 74 43 6f 6e   proc getTestCon
d0c0: 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d  figuration {} {.
d0d0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
d0e0: 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  TE: Determine th
d0f0: 65 20 65 66 66 65 63 74 69 76 65 20 74 65 73 74  e effective test
d100: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
d110: 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 20 20 49  nd return it.  I
d120: 66 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74  f..    #       t
d130: 68 65 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  he test configur
d140: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
d150: 64 65 74 65 72 6d 69 6e 65 64 2c 20 72 65 74 75  determined, retu
d160: 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20  rn an empty..   
d170: 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e   #       string.
d180: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
d190: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
d1a0: 74 65 73 74 5f 66 6c 61 67 73 28 2d 63 6f 6e 66  test_flags(-conf
d1b0: 69 67 75 72 61 74 69 6f 6e 29 5d 20 26 26 20 5c  iguration)] && \
d1c0: 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e  ..        [strin
d1d0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
d1e0: 5f 66 6c 61 67 73 28 2d 63 6f 6e 66 69 67 75 72  _flags(-configur
d1f0: 61 74 69 6f 6e 29 5d 20 3e 20 30 7d 20 74 68 65  ation)] > 0} the
d200: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
d210: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
d220: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
d230: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6d 61 6e 75  on has been manu
d240: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20  ally overridden 
d250: 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23  via the..      #
d260: 20 20 20 20 20 20 20 74 65 73 74 20 66 6c 61 67         test flag
d270: 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73  s; therefore, us
d280: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  e it...      #..
d290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
d2a0: 74 65 73 74 5f 66 6c 61 67 73 28 2d 63 6f 6e 66  test_flags(-conf
d2b0: 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20  iguration)..    
d2c0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
d2d0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
d2e0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 7d 20 74 68  nfiguration]} th
d2f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
d300: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
d310: 20 74 68 65 20 74 65 73 74 20 63 6f 6e 66 69 67   the test config
d320: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
d330: 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 20 73  fault value is s
d340: 65 74 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20  et by the..     
d350: 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 75   #       test su
d360: 69 74 65 20 70 72 6f 6c 6f 67 75 65 3b 20 68 6f  ite prologue; ho
d370: 77 65 76 65 72 2c 20 74 68 69 73 20 6d 61 79 20  wever, this may 
d380: 68 61 76 65 20 62 65 65 6e 20 6f 76 65 72 72 69  have been overri
d390: 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  dden...      #..
d3a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
d3b0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
d3c0: 6f 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 69 66  on..    } elseif
d3d0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
d3e0: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
d3f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 5d 7d  configuration)]}
d400: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
d410: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d420: 55 73 65 20 74 68 65 20 62 75 69 6c 64 20 63 6f  Use the build co
d430: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 45  nfiguration of E
d440: 61 67 6c 65 20 69 74 73 65 6c 66 2e 20 20 54 68  agle itself.  Th
d450: 69 73 20 76 61 6c 75 65 20 77 69 6c 6c 0d 0a 20  is value will.. 
d460: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 6f 73       #       mos
d470: 74 20 6c 69 6b 65 6c 79 20 62 65 20 65 69 74 68  t likely be eith
d480: 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52  er "Debug" or "R
d490: 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20  elease"...      
d4a0: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
d4b0: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
d4c0: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
d4d0: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
d4e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d4f0: 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 6d 69   NOTE: We are mi
d500: 73 73 69 6e 67 20 74 68 65 20 63 6f 6e 66 69 67  ssing the config
d510: 75 72 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  uration, return 
d520: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
d530: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
d540: 22 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  ""..    }..  }..
d550: 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 54 65 73  ...  proc getTes
d560: 74 4e 61 6d 65 50 72 65 66 69 78 20 7b 7d 20 7b  tNamePrefix {} {
d570: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
d580: 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74  OTE: Determine t
d590: 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 73  he effective tes
d5a0: 74 20 6e 61 6d 65 20 70 72 65 66 69 78 20 61 6e  t name prefix an
d5b0: 64 20 72 65 74 75 72 6e 20 69 74 2e 20 20 49 66  d return it.  If
d5c0: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 68  ..    #       th
d5d0: 65 20 74 65 73 74 20 6e 61 6d 65 20 70 72 65 66  e test name pref
d5e0: 69 78 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74  ix cannot be det
d5f0: 65 72 6d 69 6e 65 64 2c 20 72 65 74 75 72 6e 20  ermined, return 
d600: 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20 23 20  an empty..    # 
d610: 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20        string... 
d620: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69     #..    if {[i
d630: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
d640: 74 5f 66 6c 61 67 73 28 2d 6e 61 6d 65 50 72 65  t_flags(-namePre
d650: 66 69 78 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  fix)] && \..    
d660: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
d670: 74 68 20 24 3a 3a 74 65 73 74 5f 66 6c 61 67 73  th $::test_flags
d680: 28 2d 6e 61 6d 65 50 72 65 66 69 78 29 5d 20 3e  (-namePrefix)] >
d690: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d6a0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d6b0: 45 3a 20 54 68 65 20 74 65 73 74 20 6e 61 6d 65  E: The test name
d6c0: 20 70 72 65 66 69 78 20 68 61 73 20 62 65 65 6e   prefix has been
d6d0: 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   manually overri
d6e0: 64 64 65 6e 20 76 69 61 20 74 68 65 0d 0a 20 20  dden via the..  
d6f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
d700: 20 66 6c 61 67 73 3b 20 74 68 65 72 65 66 6f 72   flags; therefor
d710: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
d720: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
d730: 6e 20 24 3a 3a 74 65 73 74 5f 66 6c 61 67 73 28  n $::test_flags(
d740: 2d 6e 61 6d 65 50 72 65 66 69 78 29 0d 0a 20 20  -namePrefix)..  
d750: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
d760: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
d770: 6e 61 6d 65 5f 70 72 65 66 69 78 5d 20 26 26 20  name_prefix] && 
d780: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69  \..        [stri
d790: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
d7a0: 74 5f 6e 61 6d 65 5f 70 72 65 66 69 78 5d 20 3e  t_name_prefix] >
d7b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d7c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d7d0: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
d7e0: 6c 74 20 74 65 73 74 20 6e 61 6d 65 20 70 72 65  lt test name pre
d7f0: 66 69 78 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  fix...      #.. 
d800: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
d810: 65 73 74 5f 6e 61 6d 65 5f 70 72 65 66 69 78 0d  est_name_prefix.
d820: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
d830: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d840: 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 6d 69 73  NOTE: We are mis
d850: 73 69 6e 67 20 74 68 65 20 74 65 73 74 20 6e 61  sing the test na
d860: 6d 65 20 70 72 65 66 69 78 2c 20 72 65 74 75 72  me prefix, retur
d870: 6e 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  n nothing...    
d880: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
d890: 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  n ""..    }..  }
d8a0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 54  .....  proc getT
d8b0: 65 73 74 53 75 66 66 69 78 20 7b 7d 20 7b 0d 0a  estSuffix {} {..
d8c0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
d8d0: 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  E: Determine the
d8e0: 20 65 66 66 65 63 74 69 76 65 20 74 65 73 74 20   effective test 
d8f0: 73 75 66 66 69 78 20 61 6e 64 20 72 65 74 75 72  suffix and retur
d900: 6e 20 69 74 2e 20 20 49 66 0d 0a 20 20 20 20 23  n it.  If..    #
d910: 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 20         the test 
d920: 73 75 66 66 69 78 20 63 61 6e 6e 6f 74 20 62 65  suffix cannot be
d930: 20 64 65 74 65 72 6d 69 6e 65 64 2c 20 72 65 74   determined, ret
d940: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
d950: 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67    #       string
d960: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ...    #..    if
d970: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
d980: 3a 74 65 73 74 5f 66 6c 61 67 73 28 2d 73 75 66  :test_flags(-suf
d990: 66 69 78 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  fix)] && \..    
d9a0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
d9b0: 74 68 20 24 3a 3a 74 65 73 74 5f 66 6c 61 67 73  th $::test_flags
d9c0: 28 2d 73 75 66 66 69 78 29 5d 20 3e 20 30 7d 20  (-suffix)] > 0} 
d9d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
d9e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
d9f0: 68 65 20 74 65 73 74 20 73 75 66 66 69 78 20 68  he test suffix h
da00: 61 73 20 62 65 65 6e 20 6d 61 6e 75 61 6c 6c 79  as been manually
da10: 20 6f 76 65 72 72 69 64 64 65 6e 20 76 69 61 20   overridden via 
da20: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
da30: 20 20 20 74 65 73 74 20 66 6c 61 67 73 3b 20 74     test flags; t
da40: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
da50: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
da60: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
da70: 5f 66 6c 61 67 73 28 2d 73 75 66 66 69 78 29 0d  _flags(-suffix).
da80: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b  .    } elseif {[
da90: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
daa0: 73 74 5f 73 75 66 66 69 78 5d 7d 20 74 68 65 6e  st_suffix]} then
dab0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
dac0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
dad0: 68 65 20 74 65 73 74 20 73 75 66 66 69 78 2e 20  he test suffix. 
dae0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   There is no def
daf0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 0d 0a  ault value for..
db00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
db10: 69 73 20 76 61 72 69 61 62 6c 65 20 28 69 2e 65  is variable (i.e
db20: 2e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 74  . by default, it
db30: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 29   does not exist)
db40: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
db50: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
db60: 5f 73 75 66 66 69 78 0d 0a 20 20 20 20 7d 20 65  _suffix..    } e
db70: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
db80: 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74  sts ::eagle_plat
db90: 66 6f 72 6d 28 74 65 78 74 29 5d 20 26 26 20 5c  form(text)] && \
dba0: 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e  ..        [strin
dbb0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c  g length $::eagl
dbc0: 65 5f 70 6c 61 74 66 6f 72 6d 28 74 65 78 74 29  e_platform(text)
dbd0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
dbe0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dbf0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 62 75  NOTE: Use the bu
dc00: 69 6c 64 20 22 74 65 78 74 22 20 6f 66 20 45 61  ild "text" of Ea
dc10: 67 6c 65 20 69 74 73 65 6c 66 2e 20 20 54 68 69  gle itself.  Thi
dc20: 73 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23  s value..      #
dc30: 20 20 20 20 20 20 20 77 69 6c 6c 20 74 79 70 69         will typi
dc40: 63 61 6c 6c 79 20 62 65 20 22 4e 65 74 46 78 32  cally be "NetFx2
dc50: 30 22 2c 20 22 4e 65 74 46 78 34 30 22 2c 20 65  0", "NetFx40", e
dc60: 74 63 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 20  tc.  The..      
dc70: 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20  #       default 
dc80: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 65 6c  value of this el
dc90: 65 6d 65 6e 74 20 69 73 20 61 6e 20 65 6d 70 74  ement is an empt
dca0: 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  y string...     
dcb0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
dcc0: 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f   $::eagle_platfo
dcd0: 72 6d 28 74 65 78 74 29 0d 0a 20 20 20 20 7d 20  rm(text)..    } 
dce0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
dcf0: 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61  ists ::eagle_pla
dd00: 74 66 6f 72 6d 28 73 75 66 66 69 78 29 5d 20 26  tform(suffix)] &
dd10: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74  & \..        [st
dd20: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65  ring length $::e
dd30: 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 73 75  agle_platform(su
dd40: 66 66 69 78 29 5d 20 3e 20 30 7d 20 74 68 65 6e  ffix)] > 0} then
dd50: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
dd60: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
dd70: 68 65 20 62 75 69 6c 64 20 73 75 66 66 69 78 20  he build suffix 
dd80: 6f 66 20 45 61 67 6c 65 20 69 74 73 65 6c 66 2e  of Eagle itself.
dd90: 20 20 54 68 69 73 20 76 61 6c 75 65 0d 0a 20 20    This value..  
dda0: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c      #       will
ddb0: 20 74 79 70 69 63 61 6c 6c 79 20 62 65 20 22 4e   typically be "N
ddc0: 65 74 46 78 32 30 22 2c 20 22 4e 65 74 46 78 34  etFx20", "NetFx4
ddd0: 30 22 2c 20 65 74 63 2e 20 20 54 68 65 0d 0a 20  0", etc.  The.. 
dde0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
ddf0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 74 68  ault value of th
de00: 69 73 20 65 6c 65 6d 65 6e 74 20 69 73 20 61 6e  is element is an
de10: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
de20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
de30: 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f 70  eturn $::eagle_p
de40: 6c 61 74 66 6f 72 6d 28 73 75 66 66 69 78 29 0d  latform(suffix).
de50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
de60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
de70: 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 6d 69 73  NOTE: We are mis
de80: 73 69 6e 67 20 74 68 65 20 74 65 73 74 20 73 75  sing the test su
de90: 66 66 69 78 2c 20 72 65 74 75 72 6e 20 6e 6f 74  ffix, return not
dea0: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  hing...      #..
deb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
dec0: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
ded0: 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 55 6e    proc getTestUn
dee0: 63 6f 75 6e 74 65 64 4c 65 61 6b 73 20 7b 7d 20  countedLeaks {} 
def0: 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  {..    if {[info
df00: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 75   exists ::test_u
df10: 6e 63 6f 75 6e 74 65 64 5f 6c 65 61 6b 73 5d 20  ncounted_leaks] 
df20: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73  && \..        [s
df30: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
df40: 74 65 73 74 5f 75 6e 63 6f 75 6e 74 65 64 5f 6c  test_uncounted_l
df50: 65 61 6b 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  eaks] > 0} then 
df60: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
df70: 24 3a 3a 74 65 73 74 5f 75 6e 63 6f 75 6e 74 65  $::test_uncounte
df80: 64 5f 6c 65 61 6b 73 0d 0a 20 20 20 20 7d 0d 0a  d_leaks..    }..
df90: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69  ..    return [li
dfa0: 73 74 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  st]..  }.....  p
dfb0: 72 6f 63 20 67 65 74 52 75 6e 74 69 6d 65 41 73  roc getRuntimeAs
dfc0: 73 65 6d 62 6c 79 4e 61 6d 65 20 7b 7d 20 7b 0d  semblyName {} {.
dfd0: 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c  .    if {[isEagl
dfe0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
dff0: 20 20 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43    if {[isDotNetC
e000: 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ore]} then {..  
e010: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
e020: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
e030: 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20  s object]] > 0} 
e040: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e050: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
e060: 20 48 41 43 4b 3a 20 54 68 65 20 63 6f 72 65 20   HACK: The core 
e070: 72 75 6e 74 69 6d 65 20 61 73 73 65 6d 62 6c 79  runtime assembly
e080: 20 28 69 2e 65 2e 20 74 68 65 20 6f 6e 65 20 63   (i.e. the one c
e090: 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20 20  ontaining..     
e0a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
e0b0: 74 65 6d 2e 4f 62 6a 65 63 74 2c 20 65 74 20 61  tem.Object, et a
e0c0: 6c 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  l) must have alr
e0d0: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
e0e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
e0f0: 20 20 20 20 28 3f 29 2c 20 73 6f 20 6a 75 73 74      (?), so just
e100: 20 61 62 75 73 65 20 74 68 65 20 5b 6f 62 6a 65   abuse the [obje
e110: 63 74 20 6c 6f 61 64 5d 20 73 75 62 2d 63 6f 6d  ct load] sub-com
e120: 6d 61 6e 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  mand to..       
e130: 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
e140: 6e 20 69 74 73 20 61 73 73 65 6d 62 6c 79 20 6e  n its assembly n
e150: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ame...          
e160: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
e170: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6f 62 6a  urn [lindex [obj
e180: 65 63 74 20 6c 6f 61 64 20 53 79 73 74 65 6d 2e  ect load System.
e190: 50 72 69 76 61 74 65 2e 43 6f 72 65 4c 69 62 5d  Private.CoreLib]
e1a0: 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65   0]..        } e
e1b0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
e1c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
e1d0: 48 41 43 4b 3a 20 54 68 65 20 5b 6f 62 6a 65 63  HACK: The [objec
e1e0: 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e  t] command is un
e1f0: 61 76 61 69 6c 61 62 6c 65 2c 20 6a 75 73 74 20  available, just 
e200: 66 61 6b 65 20 69 74 2e 0d 0a 20 20 20 20 20 20  fake it...      
e210: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e220: 20 72 65 74 75 72 6e 20 22 53 79 73 74 65 6d 2e   return "System.
e230: 50 72 69 76 61 74 65 2e 43 6f 72 65 4c 69 62 2c  Private.CoreLib,
e240: 20 56 65 72 73 69 6f 6e 3d 34 2e 30 2e 30 2e 30   Version=4.0.0.0
e250: 2c 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,\..            
e260: 20 20 43 75 6c 74 75 72 65 3d 6e 65 75 74 72 61    Culture=neutra
e270: 6c 2c 20 50 75 62 6c 69 63 4b 65 79 54 6f 6b 65  l, PublicKeyToke
e280: 6e 3d 37 63 65 63 38 35 64 37 62 65 61 37 37 39  n=7cec85d7bea779
e290: 38 65 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  8e"..        }..
e2a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e2b0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
e2c0: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
e2d0: 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30  nds object]] > 0
e2e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e2f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e300: 20 23 20 48 41 43 4b 3a 20 54 68 65 20 63 6f 72   # HACK: The cor
e310: 65 20 72 75 6e 74 69 6d 65 20 61 73 73 65 6d 62  e runtime assemb
e320: 6c 79 20 28 69 2e 65 2e 20 74 68 65 20 6f 6e 65  ly (i.e. the one
e330: 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20   containing..   
e340: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
e350: 79 73 74 65 6d 2e 4f 62 6a 65 63 74 2c 20 65 74  ystem.Object, et
e360: 20 61 6c 29 20 6d 75 73 74 20 68 61 76 65 20 61   al) must have a
e370: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
e380: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
e390: 20 20 20 20 20 20 28 3f 29 2c 20 73 6f 20 6a 75        (?), so ju
e3a0: 73 74 20 61 62 75 73 65 20 74 68 65 20 5b 6f 62  st abuse the [ob
e3b0: 6a 65 63 74 20 6c 6f 61 64 5d 20 73 75 62 2d 63  ject load] sub-c
e3c0: 6f 6d 6d 61 6e 64 20 74 6f 0d 0a 20 20 20 20 20  ommand to..     
e3d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
e3e0: 75 72 6e 20 69 74 73 20 61 73 73 65 6d 62 6c 79  urn its assembly
e3f0: 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
e400: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
e410: 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6f  eturn [lindex [o
e420: 62 6a 65 63 74 20 6c 6f 61 64 20 6d 73 63 6f 72  bject load mscor
e430: 6c 69 62 5d 20 30 5d 0d 0a 20 20 20 20 20 20 20  lib] 0]..       
e440: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
e450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e460: 20 20 23 20 48 41 43 4b 3a 20 54 68 65 20 5b 6f    # HACK: The [o
e470: 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  bject] command i
e480: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 6a  s unavailable, j
e490: 75 73 74 20 66 61 6b 65 20 69 74 2e 0d 0a 20 20  ust fake it...  
e4a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e4b0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
e4c0: 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c  xists ::eagle_pl
e4d0: 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65 56 65  atform(runtimeVe
e4e0: 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20  rsion)] && \..  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
e500: 69 6e 67 20 69 6e 64 65 78 20 24 3a 3a 65 61 67  ing index $::eag
e510: 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74  le_platform(runt
e520: 69 6d 65 56 65 72 73 69 6f 6e 29 20 30 5d 20 3e  imeVersion) 0] >
e530: 3d 20 34 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 4} then {..   
e540: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
e550: 20 20 20 20 20 20 20 20 23 20 42 55 47 42 55 47          # BUGBUG
e560: 3a 20 44 6f 65 73 20 6e 6f 74 20 68 61 6e 64 6c  : Does not handl
e570: 65 20 61 20 6d 61 6a 6f 72 20 43 4c 52 20 76 65  e a major CLR ve
e580: 72 73 69 6f 6e 20 67 72 65 61 74 65 72 20 74 68  rsion greater th
e590: 61 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  an..            
e5a0: 23 20 20 20 20 20 20 20 20 20 66 6f 75 72 20 28  #         four (
e5b0: 34 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  4)...           
e5c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
e5d0: 72 65 74 75 72 6e 20 22 6d 73 63 6f 72 6c 69 62  return "mscorlib
e5e0: 2c 20 56 65 72 73 69 6f 6e 3d 34 2e 30 2e 30 2e  , Version=4.0.0.
e5f0: 30 2c 20 43 75 6c 74 75 72 65 3d 6e 65 75 74 72  0, Culture=neutr
e600: 61 6c 2c 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  al,\..          
e610: 20 20 20 20 20 20 50 75 62 6c 69 63 4b 65 79 54        PublicKeyT
e620: 6f 6b 65 6e 3d 62 37 37 61 35 63 35 36 31 39 33  oken=b77a5c56193
e630: 34 65 30 38 39 22 0d 0a 20 20 20 20 20 20 20 20  4e089"..        
e640: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
e650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
e660: 6d 73 63 6f 72 6c 69 62 2c 20 56 65 72 73 69 6f  mscorlib, Versio
e670: 6e 3d 32 2e 30 2e 30 2e 30 2c 20 43 75 6c 74 75  n=2.0.0.0, Cultu
e680: 72 65 3d 6e 65 75 74 72 61 6c 2c 5c 0d 0a 20 20  re=neutral,\..  
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 75                Pu
e6a0: 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 3d 62 37 37  blicKeyToken=b77
e6b0: 61 35 63 35 36 31 39 33 34 65 30 38 39 22 0d 0a  a5c561934e089"..
e6c0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
e6d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
e6e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
e6f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e700: 48 41 43 4b 3a 20 4e 61 74 69 76 65 20 54 63 6c  HACK: Native Tcl
e710: 20 68 61 73 20 6e 6f 20 72 75 6e 74 69 6d 65 20   has no runtime 
e720: 61 73 73 65 6d 62 6c 79 20 6e 61 6d 65 20 61 73  assembly name as
e730: 20 69 74 20 69 73 20 6e 61 74 69 76 65 2e 0d 0a   it is native...
e740: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
e750: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
e760: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
e770: 67 65 74 54 65 73 74 41 73 73 65 6d 62 6c 79 4e  getTestAssemblyN
e780: 61 6d 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 69 66  ame {} {..    if
e790: 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
e7a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
e7b0: 6e 20 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74  n [lindex [split
e7c0: 20 5b 6c 69 6e 64 65 78 20 5b 69 6e 66 6f 20 61   [lindex [info a
e7d0: 73 73 65 6d 62 6c 79 5d 20 30 5d 20 2c 5d 20 30  ssembly] 0] ,] 0
e7e0: 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  ]..    } else {.
e7f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 61  .      return Ea
e800: 67 6c 65 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  gle..    }..  }.
e810: 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
e820: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
e830: 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  e should return 
e840: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
e850: 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 20 6d  [exec] command m
e860: 61 79 20 62 65 0d 0a 20 20 23 20 20 20 20 20 20  ay be..  #      
e870: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 70 65   used by the spe
e880: 63 69 66 69 65 64 20 74 65 73 74 20 70 61 63 6b  cified test pack
e890: 61 67 65 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a  age procedure...
e8a0: 20 20 23 0d 0a 20 20 70 72 6f 63 20 63 61 6e 54    #..  proc canT
e8b0: 65 73 74 45 78 65 63 20 7b 20 70 72 6f 63 4e 61  estExec { procNa
e8c0: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b  me } {..    if {
e8d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
e8e0: 6f 28 65 78 65 63 29 5d 7d 20 74 68 65 6e 20 7b  o(exec)]} then {
e8f0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
e900: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  alse..    }.... 
e910: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
e920: 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 54 65 73 74  sts ::no(canTest
e930: 45 78 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Exec)]} then {..
e940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
e950: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
e960: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
e970: 67 74 68 20 24 70 72 6f 63 4e 61 6d 65 5d 20 3e  gth $procName] >
e980: 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
e990: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 5b 61   [info exists [a
e9a0: 70 70 65 6e 64 41 72 67 73 20 3a 3a 6e 6f 28 63  ppendArgs ::no(c
e9b0: 61 6e 54 65 73 74 45 78 65 63 2e 20 24 70 72 6f  anTestExec. $pro
e9c0: 63 4e 61 6d 65 20 29 5d 5d 7d 20 74 68 65 6e 20  cName )]]} then 
e9d0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
e9e0: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  false..    }....
e9f0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
ea00: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
ea10: 74 65 73 74 45 78 65 63 20 7b 20 63 6f 6d 6d 61  testExec { comma
ea20: 6e 64 4e 61 6d 65 20 6f 70 74 69 6f 6e 73 20 61  ndName options a
ea30: 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74  rgs } {..    set
ea40: 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65   command [list e
ea50: 78 65 63 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  xec]....    if {
ea60: 5b 6c 6c 65 6e 67 74 68 20 24 6f 70 74 69 6f 6e  [llength $option
ea70: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 65 76  s] > 0} then {ev
ea80: 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
ea90: 6e 64 20 24 6f 70 74 69 6f 6e 73 7d 0d 0a 0d 0a  nd $options}....
eaa0: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
eab0: 61 6e 64 20 2d 2d 20 24 63 6f 6d 6d 61 6e 64 4e  and -- $commandN
eac0: 61 6d 65 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  ame....    if {[
ead0: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3e  llength $args] >
eae0: 20 30 7d 20 74 68 65 6e 20 7b 65 76 61 6c 20 6c   0} then {eval l
eaf0: 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
eb00: 61 72 67 73 7d 0d 0a 20 20 20 20 73 65 74 20 70  args}..    set p
eb10: 72 6f 63 4e 61 6d 65 20 5b 6c 69 6e 64 65 78 20  rocName [lindex 
eb20: 5b 69 6e 66 6f 20 6c 65 76 65 6c 20 5b 69 6e 66  [info level [inf
eb30: 6f 20 6c 65 76 65 6c 5d 5d 20 30 5d 0d 0a 0d 0a  o level]] 0]....
eb40: 20 20 20 20 69 66 20 7b 21 5b 63 61 6e 54 65 73      if {![canTes
eb50: 74 45 78 65 63 20 24 70 72 6f 63 4e 61 6d 65 5d  tExec $procName]
eb60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
eb70: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
eb80: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
eb90: 73 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 69 6e 67  s "---- skipping
eba0: 20 63 6f 6d 6d 61 6e 64 3a 20 22 20 24 63 6f 6d   command: " $com
ebb0: 6d 61 6e 64 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  mand \n]....    
ebc0: 20 20 65 72 72 6f 72 20 22 74 65 73 74 20 75 73    error "test us
ebd0: 65 20 6f 66 20 5c 5b 24 70 72 6f 63 4e 61 6d 65  e of \[$procName
ebe0: 5c 5d 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  \] has been disa
ebf0: 62 6c 65 64 22 0d 0a 20 20 20 20 7d 20 65 6c 73  bled"..    } els
ec00: 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e {..      tputs
ec10: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
ec20: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
ec30: 2d 2d 20 72 75 6e 6e 69 6e 67 20 63 6f 6d 6d 61  -- running comma
ec40: 6e 64 3a 20 22 20 24 63 6f 6d 6d 61 6e 64 20 5c  nd: " $command \
ec50: 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75  n]....      retu
ec60: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 24 63  rn [uplevel 1 $c
ec70: 6f 6d 6d 61 6e 64 5d 0d 0a 20 20 20 20 7d 0d 0a  ommand]..    }..
ec80: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 74    }.....  proc t
ec90: 65 73 74 43 6c 72 45 78 65 63 20 7b 20 63 6f 6d  estClrExec { com
eca0: 6d 61 6e 64 4e 61 6d 65 20 6f 70 74 69 6f 6e 73  mandName options
ecb0: 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 73   args } {..    s
ecc0: 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74  et command [list
ecd0: 20 65 78 65 63 5d 0d 0a 0d 0a 20 20 20 20 69 66   exec]....    if
ece0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6f 70 74 69   {[llength $opti
ecf0: 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ons] > 0} then {
ed00: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d  eval lappend com
ed10: 6d 61 6e 64 20 24 6f 70 74 69 6f 6e 73 7d 0d 0a  mand $options}..
ed20: 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f  ..    lappend co
ed30: 6d 6d 61 6e 64 20 2d 2d 0d 0a 0d 0a 20 20 20 20  mmand --....    
ed40: 23 0d 0a 20 20 20 20 23 20 48 41 43 4b 3a 20 41  #..    # HACK: A
ed50: 73 73 75 6d 65 20 74 68 61 74 20 4d 6f 6e 6f 20  ssume that Mono 
ed60: 69 73 20 73 6f 6d 65 77 68 65 72 65 20 61 6c 6f  is somewhere alo
ed70: 6e 67 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20  ng the PATH...  
ed80: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73    #..    if {[is
ed90: 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Mono]} then {.. 
eda0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
edb0: 6d 61 6e 64 20 6d 6f 6e 6f 20 5c 0d 0a 20 20 20  mand mono \..   
edc0: 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
edd0: 67 73 20 5c 22 20 5b 66 69 6c 65 20 6e 61 74 69  gs \" [file nati
ede0: 76 65 6e 61 6d 65 20 24 63 6f 6d 6d 61 6e 64 4e  vename $commandN
edf0: 61 6d 65 5d 20 5c 22 5d 0d 0a 20 20 20 20 7d 20  ame] \"]..    } 
ee00: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d  else {..      #.
ee10: 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57  .      # HACK: W
ee20: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e  hen running on .
ee30: 4e 45 54 20 43 6f 72 65 2c 20 6e 65 65 64 20 74  NET Core, need t
ee40: 6f 20 69 6e 73 65 72 74 20 22 64 6f 74 6e 65 74  o insert "dotnet
ee50: 20 65 78 65 63 22 0d 0a 20 20 20 20 20 20 23 20   exec"..      # 
ee60: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 6c 69        command li
ee70: 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 62 65 66  ne arguments bef
ee80: 6f 72 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ore command to e
ee90: 78 65 63 75 74 65 2e 0d 0a 20 20 20 20 20 20 23  xecute...      #
eea0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 44  ..      if {[isD
eeb0: 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e  otNetCore]} then
eec0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70   {..        lapp
eed0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 64 6f 74 6e  end command dotn
eee0: 65 74 20 65 78 65 63 20 5c 0d 0a 20 20 20 20 20  et exec \..     
eef0: 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
ef00: 67 73 20 5c 22 20 5b 66 69 6c 65 20 6e 61 74 69  gs \" [file nati
ef10: 76 65 6e 61 6d 65 20 24 63 6f 6d 6d 61 6e 64 4e  vename $commandN
ef20: 61 6d 65 5d 20 5c 22 5d 0d 0a 20 20 20 20 20 20  ame] \"]..      
ef30: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ef40: 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e    lappend comman
ef50: 64 20 24 63 6f 6d 6d 61 6e 64 4e 61 6d 65 0d 0a  d $commandName..
ef60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
ef70: 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67  ..    if {[lleng
ef80: 74 68 20 24 61 72 67 73 5d 20 3e 20 30 7d 20 74  th $args] > 0} t
ef90: 68 65 6e 20 7b 65 76 61 6c 20 6c 61 70 70 65 6e  hen {eval lappen
efa0: 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 7d  d command $args}
efb0: 0d 0a 20 20 20 20 73 65 74 20 70 72 6f 63 4e 61  ..    set procNa
efc0: 6d 65 20 5b 6c 69 6e 64 65 78 20 5b 69 6e 66 6f  me [lindex [info
efd0: 20 6c 65 76 65 6c 20 5b 69 6e 66 6f 20 6c 65 76   level [info lev
efe0: 65 6c 5d 5d 20 30 5d 0d 0a 0d 0a 20 20 20 20 69  el]] 0]....    i
eff0: 66 20 7b 21 5b 63 61 6e 54 65 73 74 45 78 65 63  f {![canTestExec
f000: 20 24 70 72 6f 63 4e 61 6d 65 5d 7d 20 74 68 65   $procName]} the
f010: 6e 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  n {..      tputs
f020: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f030: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
f040: 2d 2d 20 73 6b 69 70 70 69 6e 67 20 63 6f 6d 6d  -- skipping comm
f050: 61 6e 64 3a 20 22 20 24 63 6f 6d 6d 61 6e 64 20  and: " $command 
f060: 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 65 72 72  \n]....      err
f070: 6f 72 20 22 74 65 73 74 20 75 73 65 20 6f 66 20  or "test use of 
f080: 5c 5b 24 70 72 6f 63 4e 61 6d 65 5c 5d 20 68 61  \[$procName\] ha
f090: 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 22  s been disabled"
f0a0: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
f0b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
f0c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
f0d0: 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 72 75  endArgs "---- ru
f0e0: 6e 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 20 22  nning command: "
f0f0: 20 24 63 6f 6d 6d 61 6e 64 20 5c 6e 5d 0d 0a 0d   $command \n]...
f100: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75  .      return [u
f110: 70 6c 65 76 65 6c 20 31 20 24 63 6f 6d 6d 61 6e  plevel 1 $comman
f120: 64 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  d]..    }..  }..
f130: 0c 0d 0a 20 20 70 72 6f 63 20 65 78 65 63 54 65  ...  proc execTe
f140: 73 74 53 68 65 6c 6c 20 7b 20 6f 70 74 69 6f 6e  stShell { option
f150: 73 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20  s args } {..    
f160: 73 65 74 20 70 72 6f 63 4e 61 6d 65 20 5b 6c 69  set procName [li
f170: 6e 64 65 78 20 5b 69 6e 66 6f 20 6c 65 76 65 6c  ndex [info level
f180: 20 5b 69 6e 66 6f 20 6c 65 76 65 6c 5d 5d 20 30   [info level]] 0
f190: 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b 63  ]....    if {![c
f1a0: 61 6e 54 65 73 74 45 78 65 63 20 24 70 72 6f 63  anTestExec $proc
f1b0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
f1c0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f1d0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f1e0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f1f0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 69      "---- skippi
f200: 6e 67 20 6e 65 73 74 65 64 20 73 68 65 6c 6c 3a  ng nested shell:
f210: 20 65 78 65 63 20 22 20 5b 73 74 72 69 6e 67 20   exec " [string 
f220: 74 72 69 6d 20 5b 61 70 70 65 6e 64 41 72 67 73  trim [appendArgs
f230: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6f   \..          $o
f240: 70 74 69 6f 6e 73 20 22 20 22 20 2d 2d 20 22 20  ptions " " -- " 
f250: 5c 22 22 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66  \"" [info nameof
f260: 65 78 65 63 75 74 61 62 6c 65 5d 20 22 5c 22 20  executable] "\" 
f270: 22 20 24 61 72 67 73 5d 5d 20 5c 6e 5d 0d 0a 0d  " $args]] \n]...
f280: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 74 65  .      error "te
f290: 73 74 20 75 73 65 20 6f 66 20 5c 5b 24 70 72 6f  st use of \[$pro
f2a0: 63 4e 61 6d 65 5c 5d 20 68 61 73 20 62 65 65 6e  cName\] has been
f2b0: 20 64 69 73 61 62 6c 65 64 22 0d 0a 20 20 20 20   disabled"..    
f2c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f2d0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
f2e0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f2f0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
f300: 2d 2d 2d 2d 20 72 75 6e 6e 69 6e 67 20 6e 65 73  ---- running nes
f310: 74 65 64 20 73 68 65 6c 6c 3a 20 65 78 65 63 20  ted shell: exec 
f320: 22 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b  " [string trim [
f330: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
f340: 20 20 20 20 20 20 20 20 24 6f 70 74 69 6f 6e 73          $options
f350: 20 22 20 22 20 2d 2d 20 22 20 5c 22 22 20 5b 69   " " -- " \"" [i
f360: 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75 74  nfo nameofexecut
f370: 61 62 6c 65 5d 20 22 5c 22 20 22 20 24 61 72 67  able] "\" " $arg
f380: 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  s]] \n]....     
f390: 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c   return [uplevel
f3a0: 20 31 20 65 78 65 63 53 68 65 6c 6c 20 5b 6c 69   1 execShell [li
f3b0: 73 74 20 24 6f 70 74 69 6f 6e 73 5d 20 24 61 72  st $options] $ar
f3c0: 67 73 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  gs]..    }..  }.
f3d0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 69 73 52 61 6e  ....  proc isRan
f3e0: 64 6f 6d 4f 72 64 65 72 20 7b 7d 20 7b 0d 0a 20  domOrder {} {.. 
f3f0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
f400: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
f410: 74 65 73 74 5f 72 61 6e 64 6f 6d 5f 6f 72 64 65  test_random_orde
f420: 72 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  r] && \..       
f430: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
f440: 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73  ng is boolean -s
f450: 74 72 69 63 74 20 24 3a 3a 74 65 73 74 5f 72 61  trict $::test_ra
f460: 6e 64 6f 6d 5f 6f 72 64 65 72 5d 20 26 26 20 5c  ndom_order] && \
f470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f480: 20 20 20 20 24 3a 3a 74 65 73 74 5f 72 61 6e 64      $::test_rand
f490: 6f 6d 5f 6f 72 64 65 72 7d 5d 0d 0a 20 20 7d 0d  om_order}]..  }.
f4a0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 69 73 42 72 65  ....  proc isBre
f4b0: 61 6b 4f 6e 4c 65 61 6b 20 7b 7d 20 7b 0d 0a 20  akOnLeak {} {.. 
f4c0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
f4d0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
f4e0: 74 65 73 74 5f 62 72 65 61 6b 5f 6f 6e 5f 6c 65  test_break_on_le
f4f0: 61 6b 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ak] && \..      
f500: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
f510: 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d  ing is boolean -
f520: 73 74 72 69 63 74 20 24 3a 3a 74 65 73 74 5f 62  strict $::test_b
f530: 72 65 61 6b 5f 6f 6e 5f 6c 65 61 6b 5d 20 26 26  reak_on_leak] &&
f540: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f550: 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 62 72        $::test_br
f560: 65 61 6b 5f 6f 6e 5f 6c 65 61 6b 7d 5d 0d 0a 20  eak_on_leak}].. 
f570: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 69 73   }.....  proc is
f580: 42 72 65 61 6b 4f 6e 44 65 6d 61 6e 64 20 7b 7d  BreakOnDemand {}
f590: 20 7b 0d 0a 20 20 20 20 67 6c 6f 62 61 6c 20 65   {..    global e
f5a0: 6e 76 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e  nv....    return
f5b0: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
f5c0: 69 73 74 73 20 65 6e 76 28 69 73 42 72 65 61 6b  ists env(isBreak
f5d0: 4f 6e 44 65 6d 61 6e 64 29 5d 20 26 26 20 5c 0d  OnDemand)] && \.
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f5f0: 20 20 20 5b 73 74 72 69 6e 67 20 69 73 20 62 6f     [string is bo
f600: 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20 24 65  olean -strict $e
f610: 6e 76 28 69 73 42 72 65 61 6b 4f 6e 44 65 6d 61  nv(isBreakOnDema
f620: 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  nd)] && \..     
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 6e               $en
f640: 76 28 69 73 42 72 65 61 6b 4f 6e 44 65 6d 61 6e  v(isBreakOnDeman
f650: 64 29 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  d)}]..  }.....  
f660: 70 72 6f 63 20 69 73 53 74 6f 70 4f 6e 46 61 69  proc isStopOnFai
f670: 6c 75 72 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 72  lure {} {..    r
f680: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 69 6e  eturn [expr {[in
f690: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
f6a0: 5f 73 74 6f 70 5f 6f 6e 5f 66 61 69 6c 75 72 65  _stop_on_failure
f6b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
f6c0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
f6d0: 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73 74  g is boolean -st
f6e0: 72 69 63 74 20 24 3a 3a 74 65 73 74 5f 73 74 6f  rict $::test_sto
f6f0: 70 5f 6f 6e 5f 66 61 69 6c 75 72 65 5d 20 26 26  p_on_failure] &&
f700: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f710: 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 73 74        $::test_st
f720: 6f 70 5f 6f 6e 5f 66 61 69 6c 75 72 65 7d 5d 0d  op_on_failure}].
f730: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
f740: 69 73 53 74 6f 70 4f 6e 4c 65 61 6b 20 7b 7d 20  isStopOnLeak {} 
f750: 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65  {..    return [e
f760: 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  xpr {[info exist
f770: 73 20 3a 3a 74 65 73 74 5f 73 74 6f 70 5f 6f 6e  s ::test_stop_on
f780: 5f 6c 65 61 6b 5d 20 26 26 20 5c 0d 0a 20 20 20  _leak] && \..   
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
f7a0: 73 74 72 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61  string is boolea
f7b0: 6e 20 2d 73 74 72 69 63 74 20 24 3a 3a 74 65 73  n -strict $::tes
f7c0: 74 5f 73 74 6f 70 5f 6f 6e 5f 6c 65 61 6b 5d 20  t_stop_on_leak] 
f7d0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
f7e0: 20 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f          $::test_
f7f0: 73 74 6f 70 5f 6f 6e 5f 6c 65 61 6b 7d 5d 0d 0a  stop_on_leak}]..
f800: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 69    }.....  proc i
f810: 73 45 78 69 74 4f 6e 43 6f 6d 70 6c 65 74 65 20  sExitOnComplete 
f820: 7b 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e  {} {..    return
f830: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
f840: 69 73 74 73 20 3a 3a 74 65 73 74 5f 65 78 69 74  ists ::test_exit
f850: 5f 6f 6e 5f 63 6f 6d 70 6c 65 74 65 5d 20 26 26  _on_complete] &&
f860: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f870: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 69 73        [string is
f880: 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74   boolean -strict
f890: 20 24 3a 3a 74 65 73 74 5f 65 78 69 74 5f 6f 6e   $::test_exit_on
f8a0: 5f 63 6f 6d 70 6c 65 74 65 5d 20 26 26 20 5c 0d  _complete] && \.
f8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f8c0: 20 20 20 24 3a 3a 74 65 73 74 5f 65 78 69 74 5f     $::test_exit_
f8d0: 6f 6e 5f 63 6f 6d 70 6c 65 74 65 7d 5d 0d 0a 20  on_complete}].. 
f8e0: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 72 65   }.....  proc re
f8f0: 74 75 72 6e 49 6e 66 6f 53 63 72 69 70 74 20 7b  turnInfoScript {
f900: 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  } {..    return 
f910: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 0d 0a 20  [info script].. 
f920: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 72 75   }.....  proc ru
f930: 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d  nTestPrologue {}
f940: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
f950: 20 4e 4f 54 45 3a 20 56 65 72 69 66 79 20 74 68   NOTE: Verify th
f960: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 74 65  at the global te
f970: 73 74 20 70 61 74 68 20 76 61 72 69 61 62 6c 65  st path variable
f980: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
f990: 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21      #..    if {!
f9a0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
f9b0: 65 73 74 5f 70 61 74 68 5d 7d 20 74 68 65 6e 20  est_path]} then 
f9c0: 7b 0d 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22  {..      error "
f9d0: 63 61 6e 6e 6f 74 20 72 75 6e 20 74 65 73 74 20  cannot run test 
f9e0: 70 72 6f 6c 6f 67 75 65 2c 20 5c 22 3a 3a 74 65  prologue, \"::te
f9f0: 73 74 5f 70 61 74 68 5c 22 20 6d 75 73 74 20 62  st_path\" must b
fa00: 65 20 73 65 74 22 0d 0a 20 20 20 20 7d 0d 0a 0d  e set"..    }...
fa10: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
fa20: 54 45 3a 20 52 65 73 65 74 20 74 68 65 20 70 72  TE: Reset the pr
fa30: 69 6d 61 72 79 20 74 65 73 74 20 73 75 69 74 65  imary test suite
fa40: 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 75   file name to ou
fa50: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 23  r caller...    #
fa60: 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f  ..    if {![info
fa70: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 74 65 73   exists ::no(tes
fa80: 74 53 75 69 74 65 46 69 6c 65 29 5d 7d 20 74 68  tSuiteFile)]} th
fa90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20  en {..      set 
faa0: 3a 3a 74 65 73 74 5f 73 75 69 74 65 5f 66 69 6c  ::test_suite_fil
fab0: 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 0d  e [info script].
fac0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
fad0: 0a 20 20 20 20 23 20 48 41 43 4b 3a 20 57 65 20  .    # HACK: We 
fae0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 66  do not want to f
faf0: 6f 72 63 65 20 65 76 65 72 79 20 74 68 69 72 64  orce every third
fb00: 2d 70 61 72 74 79 20 74 65 73 74 20 73 75 69 74  -party test suit
fb10: 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74  e..    #       t
fb20: 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 61  o come up with a
fb30: 20 68 61 6c 66 2d 62 61 6b 65 64 20 73 6f 6c 75   half-baked solu
fb40: 74 69 6f 6e 20 74 6f 20 66 69 6e 64 69 6e 67 20  tion to finding 
fb50: 69 74 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20  its..    #      
fb60: 20 6f 77 6e 20 66 69 6c 65 73 2e 0d 0a 20 20 20   own files...   
fb70: 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e   #..    if {![in
fb80: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70  fo exists ::no(p
fb90: 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 20  rologue.eagle)] 
fba0: 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  && ![info exists
fbb0: 20 3a 3a 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b   ::path]} then {
fbc0: 0d 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 70 61  ..      set ::pa
fbd0: 74 68 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  th [file normali
fbe0: 7a 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ze [file dirname
fbf0: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 5d   [info script]]]
fc00: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
fc10: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76  ..    # NOTE: Ev
fc20: 61 6c 75 61 74 65 20 74 68 65 20 73 74 61 6e 64  aluate the stand
fc30: 61 72 64 20 74 65 73 74 20 70 72 6f 6c 6f 67 75  ard test prologu
fc40: 65 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  e in the context
fc50: 20 6f 66 0d 0a 20 20 20 20 23 20 20 20 20 20 20   of..    #      
fc60: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   the caller...  
fc70: 20 20 23 0d 0a 20 20 20 20 75 70 6c 65 76 65 6c    #..    uplevel
fc80: 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
fc90: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 74 65  [file join $::te
fca0: 73 74 5f 70 61 74 68 20 70 72 6f 6c 6f 67 75 65  st_path prologue
fcb0: 2e 65 61 67 6c 65 5d 5d 0d 0a 20 20 7d 0d 0a 0c  .eagle]]..  }...
fcc0: 0d 0a 20 20 70 72 6f 63 20 72 75 6e 54 65 73 74  ..  proc runTest
fcd0: 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
fce0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
fcf0: 3a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  : Verify that th
fd00: 65 20 67 6c 6f 62 61 6c 20 74 65 73 74 20 70 61  e global test pa
fd10: 74 68 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  th variable is a
fd20: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 23  vailable...    #
fd30: 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f  ..    if {![info
fd40: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70   exists ::test_p
fd50: 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ath]} then {..  
fd60: 20 20 20 20 65 72 72 6f 72 20 22 63 61 6e 6e 6f      error "canno
fd70: 74 20 72 75 6e 20 74 65 73 74 20 65 70 69 6c 6f  t run test epilo
fd80: 67 75 65 2c 20 5c 22 3a 3a 74 65 73 74 5f 70 61  gue, \"::test_pa
fd90: 74 68 5c 22 20 6d 75 73 74 20 62 65 20 73 65 74  th\" must be set
fda0: 22 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  "..    }....    
fdb0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  #..    # NOTE: R
fdc0: 65 73 65 74 20 74 68 65 20 70 72 69 6d 61 72 79  eset the primary
fdd0: 20 74 65 73 74 20 73 75 69 74 65 20 66 69 6c 65   test suite file
fde0: 20 6e 61 6d 65 20 74 6f 20 6f 75 72 20 63 61 6c   name to our cal
fdf0: 6c 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ler...    #..   
fe00: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
fe10: 74 73 20 3a 3a 6e 6f 28 74 65 73 74 53 75 69 74  ts ::no(testSuit
fe20: 65 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eFile)]} then {.
fe30: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73  .      set ::tes
fe40: 74 5f 73 75 69 74 65 5f 66 69 6c 65 20 5b 69 6e  t_suite_file [in
fe50: 66 6f 20 73 63 72 69 70 74 5d 0d 0a 20 20 20 20  fo script]..    
fe60: 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  }....    #..    
fe70: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
fe80: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 74 65   the standard te
fe90: 73 74 20 65 70 69 6c 6f 67 75 65 20 69 6e 20 74  st epilogue in t
fea0: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 0d 0a 20  he context of.. 
feb0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63     #       the c
fec0: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20  aller...    #.. 
fed0: 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
fee0: 73 74 20 73 6f 75 72 63 65 20 5b 66 69 6c 65 20  st source [file 
fef0: 6a 6f 69 6e 20 24 3a 3a 74 65 73 74 5f 70 61 74  join $::test_pat
ff00: 68 20 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65  h epilogue.eagle
ff10: 5d 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ]]....    #..   
ff20: 20 23 20 48 41 43 4b 3a 20 57 65 20 64 6f 20 6e   # HACK: We do n
ff30: 6f 74 20 77 61 6e 74 20 74 6f 20 66 6f 72 63 65  ot want to force
ff40: 20 65 76 65 72 79 20 74 68 69 72 64 2d 70 61 72   every third-par
ff50: 74 79 20 74 65 73 74 20 73 75 69 74 65 0d 0a 20  ty test suite.. 
ff60: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 63 6f     #       to co
ff70: 6d 65 20 75 70 20 77 69 74 68 20 61 20 68 61 6c  me up with a hal
ff80: 66 2d 62 61 6b 65 64 20 73 6f 6c 75 74 69 6f 6e  f-baked solution
ff90: 20 74 6f 20 66 69 6e 64 69 6e 67 20 69 74 73 0d   to finding its.
ffa0: 0a 20 20 20 20 23 20 20 20 20 20 20 20 6f 77 6e  .    #       own
ffb0: 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 23 0d 0a   files...    #..
ffc0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
ffd0: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f  xists ::no(epilo
ffe0: 67 75 65 2e 65 61 67 6c 65 29 5d 20 26 26 20 5b  gue.eagle)] && [
fff0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61  info exists ::pa
10000 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  th]} then {..   
10010 20 20 20 75 6e 73 65 74 20 3a 3a 70 61 74 68 0d     unset ::path.
10020 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
10030 20 20 70 72 6f 63 20 68 6f 6f 6b 50 75 74 73 20    proc hookPuts 
10040 7b 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20  {} {..    #..   
10050 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f   # NOTE: This co
10060 64 65 20 77 61 73 20 73 74 6f 6c 65 6e 20 66 72  de was stolen fr
10070 6f 6d 20 22 74 63 6c 74 65 73 74 22 20 61 6e 64  om "tcltest" and
10080 20 68 65 61 76 69 6c 79 20 6d 6f 64 69 66 69 65   heavily modifie
10090 64 20 74 6f 0d 0a 20 20 20 20 23 20 20 20 20 20  d to..    #     
100a0 20 20 77 6f 72 6b 20 77 69 74 68 20 45 61 67 6c    work with Eagl
100b0 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70  e...    #..    p
100c0 72 6f 63 20 5b 6e 61 6d 65 73 70 61 63 65 20 63  roc [namespace c
100d0 75 72 72 65 6e 74 5d 3a 3a 74 65 73 74 50 75 74  urrent]::testPut
100e0 73 20 7b 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20  s { args } {..  
100f0 20 20 20 20 73 77 69 74 63 68 20 5b 6c 6c 65 6e      switch [llen
10100 67 74 68 20 24 61 72 67 73 5d 20 7b 0d 0a 20 20  gth $args] {..  
10110 20 20 20 20 20 20 31 20 7b 0d 0a 20 20 20 20 20        1 {..     
10120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10130 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 6c 79 20 74    # NOTE: Only t
10140 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
10150 70 72 69 6e 74 65 64 20 69 73 20 73 70 65 63 69  printed is speci
10160 66 69 65 64 20 28 73 74 64 6f 75 74 29 2e 0d 0a  fied (stdout)...
10170 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
10180 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 74         return [t
10190 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
101a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
101b0 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
101c0 5d 20 5c 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ] \n]]..        
101d0 7d 0d 0a 20 20 20 20 20 20 20 20 32 20 7b 0d 0a  }..        2 {..
101e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
101f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45         # NOTE: E
10200 69 74 68 65 72 20 2d 6e 6f 6e 65 77 6c 69 6e 65  ither -nonewline
10210 20 6f 72 20 63 68 61 6e 6e 65 6c 49 64 20 68 61   or channelId ha
10220 73 20 62 65 65 6e 20 73 70 65 63 69 66 69 65 64  s been specified
10230 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10240 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
10250 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 65  index $args 0] e
10260 71 20 22 2d 6e 6f 6e 65 77 6c 69 6e 65 22 7d 20  q "-nonewline"} 
10270 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10280 20 20 20 20 72 65 74 75 72 6e 20 5b 74 70 75 74      return [tput
10290 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
102a0 6c 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  l [lindex $args 
102b0 65 6e 64 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  end]]..         
102c0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
102d0 20 20 20 20 20 20 20 73 65 74 20 63 68 61 6e 6e         set chann
102e0 65 6c 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73  el [lindex $args
102f0 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0]..           
10300 20 73 65 74 20 6e 65 77 4c 69 6e 65 20 5c 6e 0d   set newLine \n.
10310 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
10320 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10330 20 33 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   3 {..          
10340 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
10350 4f 54 45 3a 20 42 6f 74 68 20 2d 6e 6f 6e 65 77  OTE: Both -nonew
10360 6c 69 6e 65 20 61 6e 64 20 63 68 61 6e 6e 65 6c  line and channel
10370 49 64 20 61 72 65 20 73 70 65 63 69 66 69 65 64  Id are specified
10380 2c 20 75 6e 6c 65 73 73 0d 0a 20 20 20 20 20 20  , unless..      
10390 20 20 20 20 23 20 20 20 20 20 20 20 69 74 27 73      #       it's
103a0 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
103b0 2d 6e 6f 6e 65 77 6c 69 6e 65 20 6f 70 74 69 6f  -nonewline optio
103c0 6e 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  n is supposed to
103d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
103e0 20 20 20 20 62 65 20 61 72 67 76 5b 30 5d 2e 0d      be argv[0]..
103f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10400 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e          if {[lin
10410 64 65 78 20 24 61 72 67 73 20 30 5d 20 65 71 20  dex $args 0] eq 
10420 22 2d 6e 6f 6e 65 77 6c 69 6e 65 22 7d 20 74 68  "-nonewline"} th
10430 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10440 20 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 6c    set channel [l
10450 69 6e 64 65 78 20 24 61 72 67 73 20 31 5d 0d 0a  index $args 1]..
10460 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
10470 6e 65 77 4c 69 6e 65 20 22 22 0d 0a 20 20 20 20  newLine ""..    
10480 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10490 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
104a0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
104b0 78 69 73 74 73 20 63 68 61 6e 6e 65 6c 5d 20 26  xists channel] &
104c0 26 20 24 63 68 61 6e 6e 65 6c 20 65 71 20 22 73  & $channel eq "s
104d0 74 64 6f 75 74 22 7d 20 74 68 65 6e 20 7b 0d 0a  tdout"} then {..
104e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
104f0 20 20 20 23 20 4e 4f 54 45 3a 20 57 72 69 74 65     # NOTE: Write
10500 20 6f 75 74 70 75 74 20 66 6f 72 20 73 74 64 6f   output for stdo
10510 75 74 20 74 6f 20 74 68 65 20 74 65 73 74 20 63  ut to the test c
10520 68 61 6e 6e 65 6c 2e 0d 0a 20 20 20 20 20 20 20  hannel...       
10530 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
10540 72 6e 20 5b 74 70 75 74 73 20 24 3a 3a 74 65 73  rn [tputs $::tes
10550 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
10560 64 41 72 67 73 20 5b 6c 69 6e 64 65 78 20 24 61  dArgs [lindex $a
10570 72 67 73 20 65 6e 64 5d 20 5c 0d 0a 20 20 20 20  rgs end] \..    
10580 20 20 20 20 20 20 20 20 24 6e 65 77 4c 69 6e 65          $newLine
10590 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
105a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
105b0 4e 4f 54 45 3a 20 49 66 20 77 65 20 68 61 76 65  NOTE: If we have
105c0 6e 27 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  n't returned by 
105d0 6e 6f 77 2c 20 77 65 20 64 6f 6e 27 74 20 6b 6e  now, we don't kn
105e0 6f 77 20 68 6f 77 20 74 6f 0d 0a 20 20 20 20 20  ow how to..     
105f0 20 23 20 20 20 20 20 20 20 68 61 6e 64 6c 65 20   #       handle 
10600 74 68 65 20 69 6e 70 75 74 2e 20 20 4c 65 74 20  the input.  Let 
10610 70 75 74 73 20 68 61 6e 64 6c 65 20 69 74 2e 0d  puts handle it..
10620 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10630 72 65 74 75 72 6e 20 5b 65 76 61 6c 20 3a 3a 74  return [eval ::t
10640 63 6c 3a 3a 73 61 76 65 3a 3a 70 75 74 73 20 24  cl::save::puts $
10650 61 72 67 73 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  args]..    }....
10660 20 20 20 20 72 65 6e 61 6d 65 20 3a 3a 70 75 74      rename ::put
10670 73 20 3a 3a 74 63 6c 3a 3a 73 61 76 65 3a 3a 70  s ::tcl::save::p
10680 75 74 73 3b 20 23 20 73 61 76 65 20 54 63 6c 20  uts; # save Tcl 
10690 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 72 65 6e  command..    ren
106a0 61 6d 65 20 5b 6e 61 6d 65 73 70 61 63 65 20 63  ame [namespace c
106b0 75 72 72 65 6e 74 5d 3a 3a 74 65 73 74 50 75 74  urrent]::testPut
106c0 73 20 3a 3a 70 75 74 73 3b 20 23 20 69 6e 73 65  s ::puts; # inse
106d0 72 74 20 6f 75 72 20 70 72 6f 63 0d 0a 20 20 7d  rt our proc..  }
106e0 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 75 6e 68 6f  .....  proc unho
106f0 6f 6b 50 75 74 73 20 7b 7d 20 7b 0d 0a 20 20 20  okPuts {} {..   
10700 20 72 65 6e 61 6d 65 20 3a 3a 70 75 74 73 20 22   rename ::puts "
10710 22 3b 20 23 20 72 65 6d 6f 76 65 20 6f 75 72 20  "; # remove our 
10720 70 72 6f 63 0d 0a 20 20 20 20 72 65 6e 61 6d 65  proc..    rename
10730 20 3a 3a 74 63 6c 3a 3a 73 61 76 65 3a 3a 70 75   ::tcl::save::pu
10740 74 73 20 3a 3a 70 75 74 73 3b 20 23 20 72 65 73  ts ::puts; # res
10750 74 6f 72 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  tore Tcl command
10760 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
10770 20 72 75 6e 54 65 73 74 20 7b 20 73 63 72 69 70   runTest { scrip
10780 74 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  t } {..    #..  
10790 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 73    # NOTE: This s
107a0 68 6f 75 6c 64 20 77 6f 72 6b 20 70 72 6f 70 65  hould work prope
107b0 72 6c 79 20 69 6e 20 62 6f 74 68 20 54 63 6c 20  rly in both Tcl 
107c0 61 6e 64 20 45 61 67 6c 65 20 61 73 20 6c 6f 6e  and Eagle as lon
107d0 67 20 61 73 20 74 68 65 0d 0a 20 20 20 20 23 20  g as the..    # 
107e0 20 20 20 20 20 20 22 69 6e 69 74 22 20 73 63 72        "init" scr
107f0 69 70 74 20 68 61 73 20 62 65 65 6e 20 65 76 61  ipt has been eva
10800 6c 75 61 74 65 64 20 66 69 72 73 74 2e 0d 0a 20  luated first... 
10810 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b     #..    if {![
10820 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
10830 0d 0a 20 20 20 20 20 20 68 6f 6f 6b 50 75 74 73  ..      hookPuts
10840 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73  ..    }....    s
10850 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
10860 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70  uplevel 1 $scrip
10870 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  t} result]..    
10880 73 65 74 20 65 72 72 6f 72 20 5b 65 78 70 72 20  set error [expr 
10890 7b 24 63 6f 64 65 20 3d 3d 20 30 20 3f 20 66 61  {$code == 0 ? fa
108a0 6c 73 65 20 3a 20 74 72 75 65 7d 5d 0d 0a 0d 0a  lse : true}]....
108b0 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
108c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
108d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
108e0 3a 20 49 6e 69 74 69 61 6c 6c 79 2c 20 74 68 65  : Initially, the
108f0 20 63 61 6c 6c 20 74 6f 20 5b 74 72 65 73 75 6c   call to [tresul
10900 74 5d 20 28 69 2e 65 2e 20 5b 68 6f 73 74 20 72  t] (i.e. [host r
10910 65 73 75 6c 74 5d 29 20 77 69 6c 6c 0d 0a 20 20  esult]) will..  
10920 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
10930 74 68 65 20 61 63 74 75 61 6c 20 72 65 74 75 72  the actual retur
10940 6e 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  n code from the 
10950 74 65 73 74 20 63 6f 6d 6d 61 6e 64 3b 20 68 6f  test command; ho
10960 77 65 76 65 72 2c 0d 0a 20 20 20 20 20 20 23 20  wever,..      # 
10970 20 20 20 20 20 20 69 66 20 74 68 61 74 20 72 65        if that re
10980 74 75 72 6e 20 63 6f 64 65 20 77 61 73 20 33 20  turn code was 3 
10990 28 69 2e 65 2e 20 62 72 65 61 6b 29 2c 20 74 68  (i.e. break), th
109a0 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  at indicates the
109b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
109c0 74 65 73 74 20 72 65 73 75 6c 74 73 20 73 68 6f  test results sho
109d0 75 6c 64 20 62 65 20 68 69 67 68 6c 69 67 68 74  uld be highlight
109e0 65 64 20 69 6e 20 79 65 6c 6c 6f 77 20 2d 41 4e  ed in yellow -AN
109f0 44 2d 20 74 68 61 74 20 74 68 65 0d 0a 20 20 20  D- that the..   
10a00 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
10a10 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
10a20 63 6f 6e 73 69 64 65 72 65 64 20 73 75 63 63 65  considered succe
10a30 73 73 66 75 6c 20 65 76 65 6e 20 74 68 6f 75 67  ssful even thoug
10a40 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  h the..      #  
10a50 20 20 20 20 20 74 65 73 74 20 77 61 73 20 73 6b       test was sk
10a60 69 70 70 65 64 2e 20 20 49 66 20 74 68 65 20 72  ipped.  If the r
10a70 65 74 75 72 6e 20 63 6f 64 65 20 77 61 73 20 34  eturn code was 4
10a80 20 28 69 2e 65 2e 20 63 6f 6e 74 69 6e 75 65 29   (i.e. continue)
10a90 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
10aa0 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
10ab0 74 68 65 20 74 65 73 74 20 72 65 73 75 6c 74 73  the test results
10ac0 20 73 68 6f 75 6c 64 20 62 65 20 68 69 67 68 6c   should be highl
10ad0 69 67 68 74 65 64 20 69 6e 0d 0a 20 20 20 20 20  ighted in..     
10ae0 20 23 20 20 20 20 20 20 20 64 61 72 6b 20 79 65   #       dark ye
10af0 6c 6c 6f 77 20 2d 41 4e 44 2d 20 74 68 61 74 20  llow -AND- that 
10b00 74 68 65 20 74 65 73 74 20 73 68 6f 75 6c 64 20  the test should 
10b10 73 74 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65  still be conside
10b20 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  red..      #    
10b30 20 20 20 73 75 63 63 65 73 73 66 75 6c 20 62 65     successful be
10b40 63 61 75 73 65 20 66 61 69 6c 75 72 65 73 20 61  cause failures a
10b50 72 65 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  re being ignored
10b60 20 66 6f 72 20 69 74 2e 0d 0a 20 20 20 20 20 20   for it...      
10b70 23 0d 0a 20 20 20 20 20 20 73 65 74 20 74 72 65  #..      set tre
10b80 73 75 6c 74 43 6f 64 65 20 24 63 6f 64 65 0d 0a  sultCode $code..
10b90 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64  ..      if {$cod
10ba0 65 20 3d 3d 20 33 20 7c 7c 20 24 63 6f 64 65 20  e == 3 || $code 
10bb0 3d 3d 20 35 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 5} then {..  
10bc0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
10bd0 3b 20 73 65 74 20 65 72 72 6f 72 20 66 61 6c 73  ; set error fals
10be0 65 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  e..      } elsei
10bf0 66 20 7b 24 63 6f 64 65 20 3d 3d 20 34 7d 20 74  f {$code == 4} t
10c00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
10c10 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
10c20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
10c30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
10c40 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
10c50 66 72 6f 6d 20 74 68 65 20 74 65 73 74 20 63 6f  from the test co
10c60 6d 6d 61 6e 64 20 69 6e 64 69 63 61 74 65 73 20  mmand indicates 
10c70 73 75 63 63 65 73 73 0d 0a 20 20 20 20 20 20 23  success..      #
10c80 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 74         and the t
10c90 65 73 74 20 72 65 73 75 6c 74 73 20 63 6f 6e 74  est results cont
10ca0 61 69 6e 20 61 20 63 6c 65 61 72 20 69 6e 64 69  ain a clear indi
10cb0 63 61 74 69 6f 6e 20 6f 66 20 66 61 69 6c 75 72  cation of failur
10cc0 65 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e,..      #     
10cd0 20 20 72 65 73 65 74 20 62 6f 74 68 20 72 65 74    reset both ret
10ce0 75 72 6e 20 63 6f 64 65 73 20 74 6f 20 69 6e 64  urn codes to ind
10cf0 69 63 61 74 65 20 74 68 61 74 20 66 61 69 6c 75  icate that failu
10d00 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
10d10 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d      if {$code ==
10d20 20 30 20 26 26 20 5b 72 65 67 65 78 70 20 2d 2d   0 && [regexp --
10d30 20 7b 5c 73 3d 3d 3d 3d 20 28 2e 2a 3f 29 20 46   {\s==== (.*?) F
10d40 41 49 4c 45 44 5c 73 7d 20 24 72 65 73 75 6c 74  AILED\s} $result
10d50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10d60 20 20 20 73 65 74 20 63 6f 64 65 20 31 3b 20 73     set code 1; s
10d70 65 74 20 74 72 65 73 75 6c 74 43 6f 64 65 20 24  et tresultCode $
10d80 63 6f 64 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  code..      }...
10d90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10da0 23 20 4e 4f 54 45 3a 20 44 69 73 70 6c 61 79 20  # NOTE: Display 
10db0 61 6e 64 2f 6f 72 20 6c 6f 67 20 74 68 65 20 72  and/or log the r
10dc0 65 73 75 6c 74 73 20 66 6f 72 20 74 68 65 20 74  esults for the t
10dd0 65 73 74 20 74 68 61 74 20 77 65 20 6a 75 73 74  est that we just
10de0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10df0 63 6f 6d 70 6c 65 74 65 64 2e 0d 0a 20 20 20 20  completed...    
10e00 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
10e10 73 68 6f 75 6c 64 57 72 69 74 65 54 65 73 74 44  shouldWriteTestD
10e20 61 74 61 20 24 63 6f 64 65 5d 7d 20 74 68 65 6e  ata $code]} then
10e30 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 65 73   {..        tres
10e40 75 6c 74 20 24 74 72 65 73 75 6c 74 43 6f 64 65  ult $tresultCode
10e50 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
10e60 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10e70 20 20 74 6c 6f 67 20 24 72 65 73 75 6c 74 0d 0a    tlog $result..
10e80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10e90 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10ea0 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 66 61  : If the test fa
10eb0 69 6c 65 64 20 77 69 74 68 20 61 6e 20 61 63 74  iled with an act
10ec0 75 61 6c 20 65 72 72 6f 72 20 28 69 2e 65 2e 20  ual error (i.e. 
10ed0 6e 6f 74 20 6a 75 73 74 20 61 0d 0a 20 20 20 20  not just a..    
10ee0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 66    #       test f
10ef0 61 69 6c 75 72 65 29 2c 20 6d 61 6b 65 20 73 75  ailure), make su
10f00 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6f 62 73  re we do not obs
10f10 63 75 72 65 20 74 68 65 20 65 72 72 6f 72 0d 0a  cure the error..
10f20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 65        #       me
10f30 73 73 61 67 65 20 77 69 74 68 20 74 65 73 74 20  ssage with test 
10f40 73 75 69 74 65 20 6f 75 74 70 75 74 2e 0d 0a 20  suite output... 
10f50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
10f60 20 7b 24 65 72 72 6f 72 7d 20 74 68 65 6e 20 7b   {$error} then {
10f70 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
10f80 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
10f90 5c 6e 3b 20 23 20 65 6d 69 74 20 61 20 62 6c 61  \n; # emit a bla
10fa0 6e 6b 20 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20  nk line...      
10fb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
10fc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
10fd0 68 69 73 20 74 65 73 74 20 66 61 69 6c 65 64 20  his test failed 
10fe0 61 6e 64 20 74 68 65 20 73 74 6f 70 2d 6f 6e 2d  and the stop-on-
10ff0 66 61 69 6c 75 72 65 20 66 6c 61 67 20 69 73 20  failure flag is 
11000 73 65 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  set,..      #   
11010 20 20 20 20 72 61 69 73 65 20 61 6e 20 65 72 72      raise an err
11020 6f 72 20 6e 6f 77 2e 20 20 49 66 20 77 65 20 61  or now.  If we a
11030 72 65 20 62 65 69 6e 67 20 72 75 6e 20 66 72 6f  re being run fro
11040 6d 20 69 6e 73 69 64 65 0d 0a 20 20 20 20 20 20  m inside..      
11050 23 20 20 20 20 20 20 20 72 75 6e 41 6c 6c 54 65  #       runAllTe
11060 73 74 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 61  sts, this will a
11070 6c 73 6f 20 73 65 72 76 65 20 74 6f 20 73 69 67  lso serve to sig
11080 6e 61 6c 20 69 74 20 74 6f 20 73 74 6f 70 0d 0a  nal it to stop..
11090 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
110a0 6f 63 65 73 73 69 6e 67 20 66 75 72 74 68 65 72  ocessing further
110b0 20 74 65 73 74 20 66 69 6c 65 73 2e 0d 0a 20 20   test files...  
110c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
110d0 7b 24 63 6f 64 65 20 21 3d 20 30 20 26 26 20 5b  {$code != 0 && [
110e0 69 73 53 74 6f 70 4f 6e 46 61 69 6c 75 72 65 5d  isStopOnFailure]
110f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11100 20 20 74 72 65 73 75 6c 74 20 45 72 72 6f 72 20    tresult Error 
11110 22 4f 56 45 52 41 4c 4c 20 52 45 53 55 4c 54 3a  "OVERALL RESULT:
11120 20 53 54 4f 50 2d 4f 4e 2d 46 41 49 4c 55 52 45   STOP-ON-FAILURE
11130 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75  \n"....        u
11140 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
11150 20 3a 3a 74 65 73 74 5f 73 75 69 74 65 5f 72 75   ::test_suite_ru
11160 6e 6e 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 65  nning..        e
11170 72 72 6f 72 20 22 22 3b 20 23 20 6e 6f 20 6d 65  rror ""; # no me
11180 73 73 61 67 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  ssage..      }..
11190 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
111a0 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20   # NOTE: Unless 
111b0 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64  forbidden from d
111c0 6f 69 6e 67 20 73 6f 2c 20 61 74 74 65 6d 70 74  oing so, attempt
111d0 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
111e0 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
111f0 20 63 6c 65 61 6e 75 70 20 61 6e 79 20 73 74 61   cleanup any sta
11200 6c 65 20 28 65 2e 67 2e 20 74 65 6d 70 6f 72 61  le (e.g. tempora
11210 72 79 29 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ry) object refer
11220 65 6e 63 65 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  ences now...    
11230 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
11240 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
11250 6f 28 63 6c 65 61 6e 75 70 52 65 66 65 72 65 6e  o(cleanupReferen
11260 63 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ces)]} then {.. 
11270 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 6f 62         catch {ob
11280 6a 65 63 74 20 63 6c 65 61 6e 75 70 20 2d 72 65  ject cleanup -re
11290 66 65 72 65 6e 63 65 73 7d 0d 0a 20 20 20 20 20  ferences}..     
112a0 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   }..    } else {
112b0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 65 72 72  ..      if {$err
112c0 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  or} then {..    
112d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
112e0 20 48 41 43 4b 3a 20 50 72 65 76 65 6e 74 20 73   HACK: Prevent s
112f0 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 64  purious errors d
11300 65 61 6c 69 6e 67 20 77 69 74 68 20 5b 74 65 73  ealing with [tes
11310 74 5d 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f  t] command optio
11320 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ns..        #   
11330 20 20 20 20 74 68 61 74 20 61 72 65 20 6d 69 73      that are mis
11340 73 69 6e 67 20 66 72 6f 6d 20 6e 61 74 69 76 65  sing from native
11350 20 54 63 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23   Tcl...        #
11360 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 62 61  ..        set ba
11370 64 4f 70 74 69 6f 6e 50 61 74 74 65 72 6e 20 7b  dOptionPattern {
11380 5e 62 61 64 20 6f 70 74 69 6f 6e 20 22 2e 2a 3f  ^bad option ".*?
11390 22 3a 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ":\..           
113a0 20 6d 75 73 74 20 62 65 20 2d 62 6f 64 79 2c 20   must be -body, 
113b0 2d 63 6c 65 61 6e 75 70 2c 20 2d 63 6f 6e 73 74  -cleanup, -const
113c0 72 61 69 6e 74 73 2c 20 2d 65 72 72 6f 72 4f 75  raints, -errorOu
113d0 74 70 75 74 2c 5c 0d 0a 20 20 20 20 20 20 20 20  tput,\..        
113e0 20 20 20 20 2d 6d 61 74 63 68 2c 20 2d 6f 75 74      -match, -out
113f0 70 75 74 2c 20 2d 72 65 73 75 6c 74 2c 20 2d 72  put, -result, -r
11400 65 74 75 72 6e 43 6f 64 65 73 2c 20 6f 72 20 2d  eturnCodes, or -
11410 73 65 74 75 70 24 7d 0d 0a 0d 0a 20 20 20 20 20  setup$}....     
11420 20 20 20 73 65 74 20 62 61 64 4d 61 74 63 68 56     set badMatchV
11430 61 6c 75 65 50 61 74 74 65 72 6e 20 7b 5e 62 61  aluePattern {^ba
11440 64 20 2d 6d 61 74 63 68 20 76 61 6c 75 65 20 22  d -match value "
11450 2e 2a 3f 22 3a 20 6d 75 73 74 20 62 65 5c 0d 0a  .*?": must be\..
11460 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
11470 74 2c 20 67 6c 6f 62 2c 20 6f 72 20 72 65 67 65  t, glob, or rege
11480 78 70 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  xp$}....        
11490 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 20 7c 7c  if {[isEagle] ||
114a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
114b0 28 21 5b 72 65 67 65 78 70 20 2d 2d 20 24 62 61  (![regexp -- $ba
114c0 64 4f 70 74 69 6f 6e 50 61 74 74 65 72 6e 20 24  dOptionPattern $
114d0 72 65 73 75 6c 74 5d 20 26 26 20 5c 0d 0a 20 20  result] && \..  
114e0 20 20 20 20 20 20 20 20 20 20 20 21 5b 72 65 67             ![reg
114f0 65 78 70 20 2d 2d 20 24 62 61 64 4d 61 74 63 68  exp -- $badMatch
11500 56 61 6c 75 65 50 61 74 74 65 72 6e 20 24 72 65  ValuePattern $re
11510 73 75 6c 74 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  sult])} then {..
11520 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11530 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
11540 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 52               "ER
11560 52 4f 52 20 28 72 75 6e 54 65 73 74 29 3a 20 22  ROR (runTest): "
11570 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
11580 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
11590 0d 0a 0d 0a 20 20 20 20 20 20 75 6e 68 6f 6f 6b  ....      unhook
115a0 50 75 74 73 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  Puts..    }.... 
115b0 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41 43 4b     #..    # HACK
115c0 3a 20 52 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  : Return an empt
115d0 79 20 73 74 72 69 6e 67 20 68 65 72 65 20 6a 75  y string here ju
115e0 73 74 20 69 6e 20 63 61 73 65 20 77 65 20 61 72  st in case we ar
115f0 65 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0d 0a  e being called..
11600 20 20 20 20 23 20 20 20 20 20 20 20 76 69 61 20      #       via 
11610 74 68 65 20 5b 74 65 73 74 53 68 69 6d 5d 20 70  the [testShim] p
11620 72 6f 63 65 64 75 72 65 2e 20 20 44 6f 69 6e 67  rocedure.  Doing
11630 20 74 68 69 73 20 73 68 6f 75 6c 64 20 70 72 65   this should pre
11640 76 65 6e 74 20 61 6e 79 0d 0a 20 20 20 20 23 20  vent any..    # 
11650 20 20 20 20 20 20 73 75 70 65 72 66 6c 75 6f 75        superfluou
11660 73 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 62 65  s output from be
11670 69 6e 67 20 64 69 73 70 6c 61 79 65 64 20 76 69  ing displayed vi
11680 61 20 5b 68 6f 73 74 20 72 65 73 75 6c 74 5d 20  a [host result] 
11690 69 6e 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  in..    #       
116a0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 63 61  the outermost ca
116b0 6c 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65  ll to this proce
116c0 64 75 72 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  dure...    #..  
116d0 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 7d    return ""..  }
116e0 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 74 65 73 74  .....  proc test
116f0 53 68 69 6d 20 7b 20 61 72 67 73 20 7d 20 7b 0d  Shim { args } {.
11700 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
11710 54 45 3a 20 43 61 6c 6c 20 74 68 65 20 6f 72 69  TE: Call the ori
11720 67 69 6e 61 6c 20 28 73 61 76 65 64 29 20 5b 74  ginal (saved) [t
11730 65 73 74 5d 20 63 6f 6d 6d 61 6e 64 2c 20 77 72  est] command, wr
11740 61 70 70 69 6e 67 20 69 74 20 69 6e 0d 0a 20 20  apping it in..  
11750 20 20 23 20 20 20 20 20 20 20 6f 75 72 20 73 74    #       our st
11760 61 6e 64 61 72 64 20 5b 72 75 6e 54 65 73 74 5d  andard [runTest]
11770 20 77 72 61 70 70 65 72 2e 0d 0a 20 20 20 20 23   wrapper...    #
11780 0d 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20  ..    uplevel 1 
11790 5b 6c 69 73 74 20 72 75 6e 54 65 73 74 20 5b 63  [list runTest [c
117a0 6f 6e 63 61 74 20 3a 3a 73 61 76 65 64 54 65 73  oncat ::savedTes
117b0 74 20 24 61 72 67 73 5d 5d 3b 20 72 65 74 75 72  t $args]]; retur
117c0 6e 20 22 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  n ""..  }.....  
117d0 70 72 6f 63 20 74 73 6f 75 72 63 65 20 7b 20 66  proc tsource { f
117e0 69 6c 65 4e 61 6d 65 20 7b 70 72 6f 6c 6f 67 75  ileName {prologu
117f0 65 20 74 72 75 65 7d 20 7b 65 70 69 6c 6f 67 75  e true} {epilogu
11800 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
11810 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
11820 52 75 6e 20 74 68 65 20 74 65 73 74 20 70 72 6f  Run the test pro
11830 6c 6f 67 75 65 20 69 6e 20 74 68 65 20 63 6f 6e  logue in the con
11840 74 65 78 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  text of the call
11850 65 72 20 28 77 68 69 63 68 0d 0a 20 20 20 20 23  er (which..    #
11860 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 67         must be g
11870 6c 6f 62 61 6c 29 3f 0d 0a 20 20 20 20 23 0d 0a  lobal)?..    #..
11880 20 20 20 20 69 66 20 7b 24 70 72 6f 6c 6f 67 75      if {$prologu
11890 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
118a0 20 75 70 6c 65 76 65 6c 20 31 20 72 75 6e 54 65   uplevel 1 runTe
118b0 73 74 50 72 6f 6c 6f 67 75 65 0d 0a 20 20 20 20  stPrologue..    
118c0 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  }....    #..    
118d0 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
118e0 20 6f 72 69 67 69 6e 61 6c 20 5b 74 65 73 74 5d   original [test]
118f0 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 73 65 74   command and set
11900 75 70 20 6f 75 72 20 74 65 73 74 20 73 68 69 6d  up our test shim
11910 20 69 6e 0d 0a 20 20 20 20 23 20 20 20 20 20 20   in..    #      
11920 20 69 74 73 20 70 6c 61 63 65 2e 0d 0a 20 20 20   its place...   
11930 20 23 0d 0a 20 20 20 20 72 65 6e 61 6d 65 20 3a   #..    rename :
11940 3a 74 65 73 74 20 3a 3a 73 61 76 65 64 54 65 73  :test ::savedTes
11950 74 0d 0a 20 20 20 20 69 6e 74 65 72 70 20 61 6c  t..    interp al
11960 69 61 73 20 7b 7d 20 3a 3a 74 65 73 74 20 7b 7d  ias {} ::test {}
11970 20 74 65 73 74 53 68 69 6d 0d 0a 0d 0a 20 20 20   testShim....   
11980 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
11990 53 6f 75 72 63 65 20 74 68 65 20 73 70 65 63 69  Source the speci
119a0 66 69 65 64 20 74 65 73 74 20 66 69 6c 65 20 69  fied test file i
119b0 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
119c0 20 74 68 65 20 63 61 6c 6c 65 72 0d 0a 20 20 20   the caller..   
119d0 20 23 20 20 20 20 20 20 20 28 77 68 69 63 68 20   #       (which 
119e0 73 68 6f 75 6c 64 20 62 65 20 67 6c 6f 62 61 6c  should be global
119f0 29 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  )...    #..    s
11a00 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
11a10 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
11a20 73 6f 75 72 63 65 20 24 66 69 6c 65 4e 61 6d 65  source $fileName
11a30 5d 7d 20 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  ]} result]..    
11a40 73 65 74 20 65 72 72 6f 72 20 5b 65 78 70 72 20  set error [expr 
11a50 7b 24 63 6f 64 65 20 3d 3d 20 30 20 3f 20 66 61  {$code == 0 ? fa
11a60 6c 73 65 20 3a 20 74 72 75 65 7d 5d 0d 0a 0d 0a  lse : true}]....
11a70 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
11a80 45 3a 20 52 65 6d 6f 76 65 20 6f 75 72 20 74 65  E: Remove our te
11a90 73 74 20 73 68 69 6d 20 61 6e 64 20 72 65 73 74  st shim and rest
11aa0 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ore the original
11ab0 20 28 73 61 76 65 64 29 20 5b 74 65 73 74 5d 0d   (saved) [test].
11ac0 0a 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d  .    #       com
11ad0 6d 61 6e 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  mand...    #..  
11ae0 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b    interp alias {
11af0 7d 20 3a 3a 74 65 73 74 20 7b 7d 0d 0a 20 20 20  } ::test {}..   
11b00 20 72 65 6e 61 6d 65 20 3a 3a 73 61 76 65 64 54   rename ::savedT
11b10 65 73 74 20 3a 3a 74 65 73 74 0d 0a 0d 0a 20 20  est ::test....  
11b20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
11b30 20 52 75 6e 20 74 68 65 20 74 65 73 74 20 65 70   Run the test ep
11b40 69 6c 6f 67 75 65 20 69 6e 20 74 68 65 20 63 6f  ilogue in the co
11b50 6e 74 65 78 74 20 6f 66 20 74 68 65 20 63 61 6c  ntext of the cal
11b60 6c 65 72 20 28 77 68 69 63 68 0d 0a 20 20 20 20  ler (which..    
11b70 23 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20  #       must be 
11b80 67 6c 6f 62 61 6c 29 3f 0d 0a 20 20 20 20 23 0d  global)?..    #.
11b90 0a 20 20 20 20 69 66 20 7b 24 65 70 69 6c 6f 67  .    if {$epilog
11ba0 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ue} then {..    
11bb0 20 20 75 70 6c 65 76 65 6c 20 31 20 72 75 6e 54    uplevel 1 runT
11bc0 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a 20 20 20  estEpilogue..   
11bd0 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
11be0 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
11bf0 74 65 73 74 20 72 61 69 73 65 64 20 61 6e 20 65  test raised an e
11c00 72 72 6f 72 2c 20 72 65 2d 72 61 69 73 65 20 69  rror, re-raise i
11c10 74 20 6e 6f 77 3b 20 6f 74 68 65 72 77 69 73 65  t now; otherwise
11c20 2c 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 6a  ,..    #       j
11c30 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 72  ust return the r
11c40 65 73 75 6c 74 2e 0d 0a 20 20 20 20 23 0d 0a 20  esult...    #.. 
11c50 20 20 20 69 66 20 7b 24 65 72 72 6f 72 7d 20 74     if {$error} t
11c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73  hen {..      uns
11c70 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a  et -nocomplain :
11c80 3a 74 65 73 74 5f 73 75 69 74 65 5f 72 75 6e 6e  :test_suite_runn
11c90 69 6e 67 0d 0a 20 20 20 20 20 20 65 72 72 6f 72  ing..      error
11ca0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 20   $result..    } 
11cb0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 72 65  else {..      re
11cc0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
11cd0 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
11ce0 72 6f 63 20 72 65 63 6f 72 64 54 65 73 74 53 74  roc recordTestSt
11cf0 61 74 69 73 74 69 63 73 20 7b 20 76 61 72 4e 61  atistics { varNa
11d00 6d 65 20 69 6e 64 65 78 20 7d 20 7b 0d 0a 20 20  me index } {..  
11d10 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
11d20 20 52 65 63 6f 72 64 20 63 6f 75 6e 74 73 20 6f   Record counts o
11d30 66 20 61 6c 6c 20 6f 62 6a 65 63 74 20 74 79 70  f all object typ
11d40 65 73 20 74 68 61 74 20 77 65 20 74 72 61 63 6b  es that we track
11d50 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 75 70  ...    #..    up
11d60 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 61  var 1 $varName a
11d70 72 72 61 79 0d 0a 0d 0a 20 20 20 20 23 23 23 23  rray....    ####
11d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11da0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11db0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11dc0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 69  #######....    i
11dd0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
11de0 20 61 72 72 61 79 28 75 6e 63 6f 75 6e 74 65 64   array(uncounted
11df0 2c 24 69 6e 64 65 78 29 5d 7d 20 74 68 65 6e 20  ,$index)]} then 
11e00 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72 72  {..      set arr
11e10 61 79 28 75 6e 63 6f 75 6e 74 65 64 2c 24 69 6e  ay(uncounted,$in
11e20 64 65 78 29 20 5b 67 65 74 54 65 73 74 55 6e 63  dex) [getTestUnc
11e30 6f 75 6e 74 65 64 4c 65 61 6b 73 5d 0d 0a 20 20  ountedLeaks]..  
11e40 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 23 23 23 23    }....    #####
11e50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e90 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 73 65  ######....    se
11ea0 74 20 61 72 72 61 79 28 74 69 6d 65 2c 24 69 6e  t array(time,$in
11eb0 64 65 78 29 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  dex) [clock seco
11ec0 6e 64 73 5d 0d 0a 20 20 20 20 73 65 74 20 61 72  nds]..    set ar
11ed0 72 61 79 28 61 66 74 65 72 73 2c 24 69 6e 64 65  ray(afters,$inde
11ee0 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b 61 66 74  x) [llength [aft
11ef0 65 72 20 69 6e 66 6f 5d 5d 0d 0a 20 20 20 20 73  er info]]..    s
11f00 65 74 20 61 72 72 61 79 28 76 61 72 69 61 62 6c  et array(variabl
11f10 65 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e  es,$index) [llen
11f20 67 74 68 20 5b 69 6e 66 6f 20 67 6c 6f 62 61 6c  gth [info global
11f30 73 5d 5d 0d 0a 20 20 20 20 73 65 74 20 61 72 72  s]]..    set arr
11f40 61 79 28 63 6f 6d 6d 61 6e 64 73 2c 24 69 6e 64  ay(commands,$ind
11f50 65 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  ex) [llength [in
11f60 66 6f 20 63 6f 6d 6d 61 6e 64 73 5d 5d 0d 0a 20  fo commands]].. 
11f70 20 20 20 73 65 74 20 61 72 72 61 79 28 70 72 6f     set array(pro
11f80 63 65 64 75 72 65 73 2c 24 69 6e 64 65 78 29 20  cedures,$index) 
11f90 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 70  [llength [info p
11fa0 72 6f 63 73 5d 5d 0d 0a 20 20 20 20 73 65 74 20  rocs]]..    set 
11fb0 61 72 72 61 79 28 6e 61 6d 65 73 70 61 63 65 73  array(namespaces
11fc0 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67 74  ,$index) [llengt
11fd0 68 20 5b 6e 61 6d 65 73 70 61 63 65 20 63 68 69  h [namespace chi
11fe0 6c 64 72 65 6e 20 3a 3a 5d 5d 0d 0a 0d 0a 20 20  ldren ::]]....  
11ff0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
12000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12030 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
12040 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
12050 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 61 74  xists ::test_pat
12060 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  h]} then {..    
12070 20 20 73 65 74 20 61 72 72 61 79 28 66 69 6c 65    set array(file
12080 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67  s,$index) [lleng
12090 74 68 20 5b 67 65 74 46 69 6c 65 73 20 24 3a 3a  th [getFiles $::
120a0 74 65 73 74 5f 70 61 74 68 20 2a 5d 5d 0d 0a 20  test_path *]].. 
120b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
120c0 20 20 20 73 65 74 20 61 72 72 61 79 28 66 69 6c     set array(fil
120d0 65 73 2c 24 69 6e 64 65 78 29 20 30 3b 20 23 20  es,$index) 0; # 
120e0 4e 4f 54 45 3a 20 49 6e 66 6f 72 6d 61 74 69 6f  NOTE: Informatio
120f0 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  n not available.
12100 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
12110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12130 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12150 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
12160 20 20 73 65 74 20 61 72 72 61 79 28 74 65 6d 70    set array(temp
12170 6f 72 61 72 79 46 69 6c 65 73 2c 24 69 6e 64 65  oraryFiles,$inde
12180 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b 67 65 74  x) [llength [get
12190 46 69 6c 65 73 20 5b 67 65 74 54 65 6d 70 6f 72  Files [getTempor
121a0 61 72 79 50 61 74 68 5d 20 2a 5d 5d 0d 0a 20 20  aryPath] *]]..  
121b0 20 20 73 65 74 20 61 72 72 61 79 28 63 68 61 6e    set array(chan
121c0 6e 65 6c 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c  nels,$index) [ll
121d0 65 6e 67 74 68 20 5b 66 69 6c 65 20 63 68 61 6e  ength [file chan
121e0 6e 65 6c 73 5d 5d 0d 0a 20 20 20 20 73 65 74 20  nels]]..    set 
121f0 61 72 72 61 79 28 61 6c 69 61 73 65 73 2c 24 69  array(aliases,$i
12200 6e 64 65 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b  ndex) [llength [
12210 69 6e 74 65 72 70 20 61 6c 69 61 73 65 73 5d 5d  interp aliases]]
12220 0d 0a 20 20 20 20 73 65 74 20 61 72 72 61 79 28  ..    set array(
12230 69 6e 74 65 72 70 72 65 74 65 72 73 2c 24 69 6e  interpreters,$in
12240 64 65 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b 69  dex) [llength [i
12250 6e 74 65 72 70 20 73 6c 61 76 65 73 5d 5d 0d 0a  nterp slaves]]..
12260 20 20 20 20 73 65 74 20 61 72 72 61 79 28 65 6e      set array(en
12270 76 69 72 6f 6e 6d 65 6e 74 2c 24 69 6e 64 65 78  vironment,$index
12280 29 20 5b 6c 6c 65 6e 67 74 68 20 5b 61 72 72 61  ) [llength [arra
12290 79 20 6e 61 6d 65 73 20 65 6e 76 5d 5d 0d 0a 20  y names env]].. 
122a0 20 20 20 73 65 74 20 61 72 72 61 79 28 6c 6f 61     set array(loa
122b0 64 65 64 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65  ded,$index) [lle
122c0 6e 67 74 68 20 5b 69 6e 66 6f 20 6c 6f 61 64 65  ngth [info loade
122d0 64 5d 5d 0d 0a 0d 0a 20 20 20 20 23 23 23 23 23  d]]....    #####
122e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
122f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12320 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 23 0d  ######....    #.
12330 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65  .    # NOTE: The
12340 73 65 20 6e 61 74 69 76 65 20 72 65 73 6f 75 72  se native resour
12350 63 65 20 74 79 70 65 73 20 63 61 6e 6e 6f 74 20  ce types cannot 
12360 62 65 20 70 6f 73 69 74 69 76 65 6c 79 20 63 68  be positively ch
12370 65 63 6b 65 64 0d 0a 20 20 20 20 23 20 20 20 20  ecked..    #    
12380 20 20 20 66 6f 72 20 6c 65 61 6b 73 20 28 69 2e     for leaks (i.
12390 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 22  e. because the "
123a0 6c 65 61 6b 22 20 6d 61 79 20 62 65 20 66 72 6f  leak" may be fro
123b0 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 0d 0a 20  m an external.. 
123c0 20 20 20 23 20 20 20 20 20 20 20 70 72 6f 63 65     #       proce
123d0 73 73 29 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ss)...    #..   
123e0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
123f0 74 73 20 3a 3a 6e 6f 28 75 6e 63 6f 75 6e 74 65  ts ::no(uncounte
12400 64 54 65 6d 70 6f 72 61 72 79 46 69 6c 65 73 29  dTemporaryFiles)
12410 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12420 20 6c 61 70 70 65 6e 64 20 61 72 72 61 79 28 75   lappend array(u
12430 6e 63 6f 75 6e 74 65 64 2c 24 69 6e 64 65 78 29  ncounted,$index)
12440 20 74 65 6d 70 6f 72 61 72 79 46 69 6c 65 73 0d   temporaryFiles.
12450 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 23  .    }....    ##
12460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
124a0 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
124b0 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20   if {[isEagle]} 
124c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
124d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
124e0 75 70 70 6f 72 74 20 66 6f 72 20 73 6f 6d 65 20  upport for some 
124f0 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  of all of these 
12500 65 6e 74 69 74 79 20 74 79 70 65 73 20 6d 61 79  entity types may
12510 20 6e 6f 74 20 62 65 0d 0a 20 20 20 20 20 20 23   not be..      #
12520 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
12530 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
12540 72 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  r, initialize al
12550 6c 20 74 68 65 73 65 20 63 6f 75 6e 74 73 0d 0a  l these counts..
12560 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
12570 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 6e 20 74   zero and then t
12580 72 79 20 74 6f 20 71 75 65 72 79 20 65 61 63 68  ry to query each
12590 20 6f 6e 65 20 69 6e 64 69 76 69 64 75 61 6c 6c   one individuall
125a0 79 20 62 65 6c 6f 77 0d 0a 20 20 20 20 20 20 23  y below..      #
125b0 20 20 20 20 20 20 20 77 72 61 70 70 65 64 20 69         wrapped i
125c0 6e 20 61 20 63 61 74 63 68 2e 0d 0a 20 20 20 20  n a catch...    
125d0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61    #..      set a
125e0 72 72 61 79 28 70 72 65 76 69 6f 75 73 50 69 64  rray(previousPid
125f0 2c 24 69 6e 64 65 78 29 20 30 0d 0a 20 20 20 20  ,$index) 0..    
12600 20 20 73 65 74 20 61 72 72 61 79 28 73 63 6f 70    set array(scop
12610 65 73 2c 24 69 6e 64 65 78 29 20 30 0d 0a 20 20  es,$index) 0..  
12620 20 20 20 20 73 65 74 20 61 72 72 61 79 28 61 73      set array(as
12630 73 65 6d 62 6c 69 65 73 2c 24 69 6e 64 65 78 29  semblies,$index)
12640 20 30 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72   0..      set ar
12650 72 61 79 28 70 72 6f 63 65 73 73 65 73 2c 24 69  ray(processes,$i
12660 6e 64 65 78 29 20 30 0d 0a 20 20 20 20 20 20 73  ndex) 0..      s
12670 65 74 20 61 72 72 61 79 28 6f 62 6a 65 63 74 73  et array(objects
12680 2c 24 69 6e 64 65 78 29 20 30 0d 0a 20 20 20 20  ,$index) 0..    
12690 20 20 73 65 74 20 61 72 72 61 79 28 6f 62 6a 65    set array(obje
126a0 63 74 43 61 6c 6c 62 61 63 6b 73 2c 24 69 6e 64  ctCallbacks,$ind
126b0 65 78 29 20 30 0d 0a 20 20 20 20 20 20 73 65 74  ex) 0..      set
126c0 20 61 72 72 61 79 28 6f 62 6a 65 63 74 54 79 70   array(objectTyp
126d0 65 73 2c 24 69 6e 64 65 78 29 20 30 0d 0a 20 20  es,$index) 0..  
126e0 20 20 20 20 73 65 74 20 61 72 72 61 79 28 6f 62      set array(ob
126f0 6a 65 63 74 49 6e 74 65 72 66 61 63 65 73 2c 24  jectInterfaces,$
12700 69 6e 64 65 78 29 20 30 0d 0a 20 20 20 20 20 20  index) 0..      
12710 73 65 74 20 61 72 72 61 79 28 6f 62 6a 65 63 74  set array(object
12720 4e 61 6d 65 73 70 61 63 65 73 2c 24 69 6e 64 65  Namespaces,$inde
12730 78 29 20 30 0d 0a 0d 0a 20 20 20 20 20 20 63 61  x) 0....      ca
12740 74 63 68 20 7b 73 65 74 20 61 72 72 61 79 28 70  tch {set array(p
12750 72 65 76 69 6f 75 73 50 69 64 2c 24 69 6e 64 65  reviousPid,$inde
12760 78 29 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20  x) [expr {[info 
12770 70 72 65 76 69 6f 75 73 70 69 64 5d 20 21 3d 20  previouspid] != 
12780 30 7d 5d 7d 0d 0a 20 20 20 20 20 20 63 61 74 63  0}]}..      catc
12790 68 20 7b 73 65 74 20 61 72 72 61 79 28 73 63 6f  h {set array(sco
127a0 70 65 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65  pes,$index) [lle
127b0 6e 67 74 68 20 5b 73 63 6f 70 65 20 6c 69 73 74  ngth [scope list
127c0 5d 5d 7d 0d 0a 20 20 20 20 20 20 63 61 74 63 68  ]]}..      catch
127d0 20 7b 73 65 74 20 61 72 72 61 79 28 61 73 73 65   {set array(asse
127e0 6d 62 6c 69 65 73 2c 24 69 6e 64 65 78 29 20 5b  mblies,$index) [
127f0 6c 6c 65 6e 67 74 68 20 5b 6f 62 6a 65 63 74 20  llength [object 
12800 61 73 73 65 6d 62 6c 69 65 73 5d 5d 7d 0d 0a 20  assemblies]]}.. 
12810 20 20 20 20 20 63 61 74 63 68 20 7b 73 65 74 20       catch {set 
12820 61 72 72 61 79 28 70 72 6f 63 65 73 73 65 73 2c  array(processes,
12830 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67 74 68  $index) [llength
12840 20 5b 67 65 74 50 72 6f 63 65 73 73 65 73 20 22   [getProcesses "
12850 22 5d 5d 7d 0d 0a 20 20 20 20 20 20 63 61 74 63  "]]}..      catc
12860 68 20 7b 73 65 74 20 61 72 72 61 79 28 6f 62 6a  h {set array(obj
12870 65 63 74 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c  ects,$index) [ll
12880 65 6e 67 74 68 20 5b 69 6e 66 6f 20 6f 62 6a 65  ength [info obje
12890 63 74 73 5d 5d 7d 0d 0a 20 20 20 20 20 20 63 61  cts]]}..      ca
128a0 74 63 68 20 7b 73 65 74 20 61 72 72 61 79 28 6f  tch {set array(o
128b0 62 6a 65 63 74 43 61 6c 6c 62 61 63 6b 73 2c 24  bjectCallbacks,$
128c0 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67 74 68 20  index) [llength 
128d0 5b 69 6e 66 6f 20 63 61 6c 6c 62 61 63 6b 73 5d  [info callbacks]
128e0 5d 7d 0d 0a 20 20 20 20 20 20 63 61 74 63 68 20  ]}..      catch 
128f0 7b 73 65 74 20 61 72 72 61 79 28 6f 62 6a 65 63  {set array(objec
12900 74 54 79 70 65 73 2c 24 69 6e 64 65 78 29 20 5b  tTypes,$index) [
12910 6c 6c 65 6e 67 74 68 20 5b 6f 62 6a 65 63 74 20  llength [object 
12920 74 79 70 65 73 5d 5d 7d 0d 0a 20 20 20 20 20 20  types]]}..      
12930 63 61 74 63 68 20 7b 73 65 74 20 61 72 72 61 79  catch {set array
12940 28 6f 62 6a 65 63 74 49 6e 74 65 72 66 61 63 65  (objectInterface
12950 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67  s,$index) [lleng
12960 74 68 20 5b 6f 62 6a 65 63 74 20 69 6e 74 65 72  th [object inter
12970 66 61 63 65 73 5d 5d 7d 0d 0a 20 20 20 20 20 20  faces]]}..      
12980 63 61 74 63 68 20 7b 73 65 74 20 61 72 72 61 79  catch {set array
12990 28 6f 62 6a 65 63 74 4e 61 6d 65 73 70 61 63 65  (objectNamespace
129a0 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67  s,$index) [lleng
129b0 74 68 20 5b 6f 62 6a 65 63 74 20 6e 61 6d 65 73  th [object names
129c0 70 61 63 65 73 5d 5d 7d 0d 0a 0d 0a 20 20 20 20  paces]]}....    
129d0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
129e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
129f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a10 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
12a20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12a30 4e 4f 54 45 3a 20 53 75 70 70 6f 72 74 20 66 6f  NOTE: Support fo
12a40 72 20 73 6f 6d 65 20 6f 66 20 61 6c 6c 20 6f 66  r some of all of
12a50 20 74 68 65 73 65 20 65 6e 74 69 74 79 20 74 79   these entity ty
12a60 70 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 0d 0a  pes may not be..
12a70 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
12a80 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 74  esent in the int
12a90 65 72 70 72 65 74 65 72 2c 20 69 6e 69 74 69 61  erpreter, initia
12aa0 6c 69 7a 65 20 61 6c 6c 20 74 68 65 73 65 20 63  lize all these c
12ab0 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 23 20 20  ounts..      #  
12ac0 20 20 20 20 20 74 6f 20 7a 65 72 6f 20 61 6e 64       to zero and
12ad0 20 74 68 65 6e 20 74 72 79 20 74 6f 20 71 75 65   then try to que
12ae0 72 79 20 65 61 63 68 20 6f 6e 65 20 69 6e 64 69  ry each one indi
12af0 76 69 64 75 61 6c 6c 79 20 62 65 6c 6f 77 0d 0a  vidually below..
12b00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 72        #       wr
12b10 61 70 70 65 64 20 69 6e 20 61 20 63 61 74 63 68  apped in a catch
12b20 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12b30 20 20 73 65 74 20 61 72 72 61 79 28 63 6f 6e 6e    set array(conn
12b40 65 63 74 69 6f 6e 73 2c 24 69 6e 64 65 78 29 20  ections,$index) 
12b50 30 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72 72  0..      set arr
12b60 61 79 28 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  ay(transactions,
12b70 24 69 6e 64 65 78 29 20 30 0d 0a 20 20 20 20 20  $index) 0..     
12b80 20 73 65 74 20 61 72 72 61 79 28 6d 6f 64 75 6c   set array(modul
12b90 65 73 2c 24 69 6e 64 65 78 29 20 30 0d 0a 20 20  es,$index) 0..  
12ba0 20 20 20 20 73 65 74 20 61 72 72 61 79 28 64 65      set array(de
12bb0 6c 65 67 61 74 65 73 2c 24 69 6e 64 65 78 29 20  legates,$index) 
12bc0 30 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72 72  0..      set arr
12bd0 61 79 28 74 63 6c 2c 24 69 6e 64 65 78 29 20 30  ay(tcl,$index) 0
12be0 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72 72 61  ..      set arra
12bf0 79 28 74 63 6c 49 6e 74 65 72 70 73 2c 24 69 6e  y(tclInterps,$in
12c00 64 65 78 29 20 30 0d 0a 20 20 20 20 20 20 73 65  dex) 0..      se
12c10 74 20 61 72 72 61 79 28 74 63 6c 54 68 72 65 61  t array(tclThrea
12c20 64 73 2c 24 69 6e 64 65 78 29 20 30 0d 0a 20 20  ds,$index) 0..  
12c30 20 20 20 20 73 65 74 20 61 72 72 61 79 28 74 63      set array(tc
12c40 6c 43 6f 6d 6d 61 6e 64 73 2c 24 69 6e 64 65 78  lCommands,$index
12c50 29 20 30 0d 0a 20 20 20 20 20 20 73 65 74 20 61  ) 0..      set a
12c60 72 72 61 79 28 73 63 72 69 70 74 54 68 72 65 61  rray(scriptThrea
12c70 64 73 2c 24 69 6e 64 65 78 29 20 30 0d 0a 0d 0a  ds,$index) 0....
12c80 20 20 20 20 20 20 63 61 74 63 68 20 7b 73 65 74        catch {set
12c90 20 61 72 72 61 79 28 63 6f 6e 6e 65 63 74 69 6f   array(connectio
12ca0 6e 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e  ns,$index) [llen
12cb0 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63  gth [info connec
12cc0 74 69 6f 6e 73 5d 5d 7d 0d 0a 20 20 20 20 20 20  tions]]}..      
12cd0 63 61 74 63 68 20 7b 73 65 74 20 61 72 72 61 79  catch {set array
12ce0 28 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 24 69  (transactions,$i
12cf0 6e 64 65 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b  ndex) [llength [
12d00 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  info transaction
12d10 73 5d 5d 7d 0d 0a 20 20 20 20 20 20 63 61 74 63  s]]}..      catc
12d20 68 20 7b 73 65 74 20 61 72 72 61 79 28 6d 6f 64  h {set array(mod
12d30 75 6c 65 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c  ules,$index) [ll
12d40 65 6e 67 74 68 20 5b 69 6e 66 6f 20 6d 6f 64 75  ength [info modu
12d50 6c 65 73 5d 5d 7d 0d 0a 20 20 20 20 20 20 63 61  les]]}..      ca
12d60 74 63 68 20 7b 73 65 74 20 61 72 72 61 79 28 64  tch {set array(d
12d70 65 6c 65 67 61 74 65 73 2c 24 69 6e 64 65 78 29  elegates,$index)
12d80 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20   [llength [info 
12d90 64 65 6c 65 67 61 74 65 73 5d 5d 7d 0d 0a 0d 0a  delegates]]}....
12da0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
12db0 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
12dc0 73 20 74 63 6c 5d 5d 20 3e 20 30 7d 20 74 68 65  s tcl]] > 0} the
12dd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 74  n {..        cat
12de0 63 68 20 7b 73 65 74 20 61 72 72 61 79 28 74 63  ch {set array(tc
12df0 6c 2c 24 69 6e 64 65 78 29 20 5b 74 63 6c 20 72  l,$index) [tcl r
12e00 65 61 64 79 5d 7d 0d 0a 20 20 20 20 20 20 20 20  eady]}..        
12e10 63 61 74 63 68 20 7b 73 65 74 20 61 72 72 61 79  catch {set array
12e20 28 74 63 6c 49 6e 74 65 72 70 73 2c 24 69 6e 64  (tclInterps,$ind
12e30 65 78 29 20 5b 6c 6c 65 6e 67 74 68 20 5b 74 63  ex) [llength [tc
12e40 6c 20 69 6e 74 65 72 70 73 5d 5d 7d 0d 0a 20 20  l interps]]}..  
12e50 20 20 20 20 20 20 63 61 74 63 68 20 7b 73 65 74        catch {set
12e60 20 61 72 72 61 79 28 74 63 6c 54 68 72 65 61 64   array(tclThread
12e70 73 2c 24 69 6e 64 65 78 29 20 5b 6c 6c 65 6e 67  s,$index) [lleng
12e80 74 68 20 5b 74 63 6c 20 74 68 72 65 61 64 73 5d  th [tcl threads]
12e90 5d 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ]}..        catc
12ea0 68 20 7b 73 65 74 20 61 72 72 61 79 28 74 63 6c  h {set array(tcl
12eb0 43 6f 6d 6d 61 6e 64 73 2c 24 69 6e 64 65 78 29  Commands,$index)
12ec0 20 5b 6c 6c 65 6e 67 74 68 20 5b 74 63 6c 20 63   [llength [tcl c
12ed0 6f 6d 6d 61 6e 64 20 6c 69 73 74 5d 5d 7d 0d 0a  ommand list]]}..
12ee0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12ef0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12f00 3a 20 47 72 61 62 20 74 68 65 20 6e 75 6d 62 65  : Grab the numbe
12f10 72 20 6f 66 20 61 63 74 69 76 65 20 74 68 72 65  r of active thre
12f20 61 64 73 20 74 68 61 74 20 61 72 65 20 61 63 74  ads that are act
12f30 69 76 65 20 62 65 63 61 75 73 65 0d 0a 20 20 20  ive because..   
12f40 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 63     #       of Sc
12f50 72 69 70 74 54 68 72 65 61 64 20 6f 62 6a 65 63  riptThread objec
12f60 74 20 69 6e 73 74 61 6e 63 65 73 2e 20 20 54 68  t instances.  Th
12f70 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  is only works if
12f80 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20   Eagle..      # 
12f90 20 20 20 20 20 20 69 73 20 42 65 74 61 20 33 31        is Beta 31
12fa0 20 6f 72 20 68 69 67 68 65 72 2e 0d 0a 20 20 20   or higher...   
12fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 63 61 74 63     #..      catc
12fc0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
12fd0 20 61 72 72 61 79 28 73 63 72 69 70 74 54 68 72   array(scriptThr
12fe0 65 61 64 73 2c 24 69 6e 64 65 78 29 20 5c 0d 0a  eads,$index) \..
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
13000 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
13010 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 63 72  s +NonPublic Scr
13020 69 70 74 54 68 72 65 61 64 20 61 63 74 69 76 65  iptThread active
13030 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 7d 0d  Count]..      }.
13040 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23  ...      #######
13050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13090 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ##....      #.. 
130a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
130b0 73 65 20 6d 61 6e 61 67 65 64 20 72 65 73 6f 75  se managed resou
130c0 72 63 65 20 74 79 70 65 73 20 63 61 6e 6e 6f 74  rce types cannot
130d0 20 62 65 20 70 6f 73 69 74 69 76 65 6c 79 20 63   be positively c
130e0 68 65 63 6b 65 64 0d 0a 20 20 20 20 20 20 23 20  hecked..      # 
130f0 20 20 20 20 20 20 66 6f 72 20 6c 65 61 6b 73 20        for leaks 
13100 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68  (i.e. because th
13110 65 20 22 6c 65 61 6b 22 20 6d 61 79 20 62 65 20  e "leak" may be 
13120 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
13130 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13140 70 72 6f 63 65 73 73 29 2e 0d 0a 20 20 20 20 20  process)...     
13150 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
13160 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
13170 28 75 6e 63 6f 75 6e 74 65 64 41 73 73 65 6d 62  (uncountedAssemb
13180 6c 69 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lies)]} then {..
13190 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
131a0 61 72 72 61 79 28 75 6e 63 6f 75 6e 74 65 64 2c  array(uncounted,
131b0 24 69 6e 64 65 78 29 20 61 73 73 65 6d 62 6c 69  $index) assembli
131c0 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
131d0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
131e0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 75 6e 63 6f  exists ::no(unco
131f0 75 6e 74 65 64 50 72 6f 63 65 73 73 65 73 29 5d  untedProcesses)]
13200 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13210 20 20 6c 61 70 70 65 6e 64 20 61 72 72 61 79 28    lappend array(
13220 75 6e 63 6f 75 6e 74 65 64 2c 24 69 6e 64 65 78  uncounted,$index
13230 29 20 70 72 6f 63 65 73 73 65 73 0d 0a 20 20 20  ) processes..   
13240 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d     }..    }..  }
13250 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 72 65 70 6f  .....  proc repo
13260 72 74 54 65 73 74 53 74 61 74 69 73 74 69 63 73  rtTestStatistics
13270 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
13280 61 6e 6e 65 6c 20 66 69 6c 65 4e 61 6d 65 20 73  annel fileName s
13290 74 6f 70 20 73 74 61 74 73 56 61 72 4e 61 6d 65  top statsVarName
132a0 20 66 69 6c 65 73 56 61 72 4e 61 6d 65 20 7b 71   filesVarName {q
132b0 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
132c0 0a 20 20 20 20 73 65 74 20 73 74 61 74 69 73 74  .    set statist
132d0 69 63 73 20 5b 6c 69 73 74 20 61 66 74 65 72 73  ics [list afters
132e0 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6d 6d 61   variables comma
132f0 6e 64 73 20 70 72 6f 63 65 64 75 72 65 73 20 6e  nds procedures n
13300 61 6d 65 73 70 61 63 65 73 20 5c 0d 0a 20 20 20  amespaces \..   
13310 20 20 20 20 20 66 69 6c 65 73 20 74 65 6d 70 6f       files tempo
13320 72 61 72 79 46 69 6c 65 73 20 63 68 61 6e 6e 65  raryFiles channe
13330 6c 73 20 61 6c 69 61 73 65 73 20 69 6e 74 65 72  ls aliases inter
13340 70 72 65 74 65 72 73 20 65 6e 76 69 72 6f 6e 6d  preters environm
13350 65 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 6c  ent \..        l
13360 6f 61 64 65 64 5d 0d 0a 0d 0a 20 20 20 20 69 66  oaded]....    if
13370 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
13380 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
13390 20 20 20 20 23 20 54 4f 44 4f 3a 20 46 6f 72 20      # TODO: For 
133a0 6e 6f 77 2c 20 74 72 61 63 6b 69 6e 67 20 22 6c  now, tracking "l
133b0 65 61 6b 65 64 22 20 61 73 73 65 6d 62 6c 69 65  eaked" assemblie
133c0 73 20 69 73 20 6d 65 61 6e 69 6e 67 6c 65 73 73  s is meaningless
133d0 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20   because..      
133e0 23 20 20 20 20 20 20 20 74 68 65 20 2e 4e 45 54  #       the .NET
133f0 20 46 72 61 6d 65 77 6f 72 6b 20 68 61 73 20 6e   Framework has n
13400 6f 20 77 61 79 20 74 6f 20 75 6e 6c 6f 61 64 20  o way to unload 
13410 74 68 65 6d 20 77 69 74 68 6f 75 74 20 74 65 61  them without tea
13420 72 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ring..      #   
13430 20 20 20 20 64 6f 77 6e 20 74 68 65 20 65 6e 74      down the ent
13440 69 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ire application 
13450 64 6f 6d 61 69 6e 2e 0d 0a 20 20 20 20 20 20 23  domain...      #
13460 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  ..      lappend 
13470 73 74 61 74 69 73 74 69 63 73 20 5c 0d 0a 20 20  statistics \..  
13480 20 20 20 20 20 20 20 20 70 72 65 76 69 6f 75 73          previous
13490 50 69 64 20 73 63 6f 70 65 73 20 61 73 73 65 6d  Pid scopes assem
134a0 62 6c 69 65 73 20 70 72 6f 63 65 73 73 65 73 20  blies processes 
134b0 6f 62 6a 65 63 74 73 20 6f 62 6a 65 63 74 43 61  objects objectCa
134c0 6c 6c 62 61 63 6b 73 20 5c 0d 0a 20 20 20 20 20  llbacks \..     
134d0 20 20 20 20 20 6f 62 6a 65 63 74 54 79 70 65 73       objectTypes
134e0 20 6f 62 6a 65 63 74 49 6e 74 65 72 66 61 63 65   objectInterface
134f0 73 20 6f 62 6a 65 63 74 4e 61 6d 65 73 70 61 63  s objectNamespac
13500 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5c  es connections \
13510 0d 0a 20 20 20 20 20 20 20 20 20 20 74 72 61 6e  ..          tran
13520 73 61 63 74 69 6f 6e 73 20 6d 6f 64 75 6c 65 73  sactions modules
13530 20 64 65 6c 65 67 61 74 65 73 20 74 63 6c 20 74   delegates tcl t
13540 63 6c 49 6e 74 65 72 70 73 20 74 63 6c 54 68 72  clInterps tclThr
13550 65 61 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  eads \..        
13560 20 20 74 63 6c 43 6f 6d 6d 61 6e 64 73 20 73 63    tclCommands sc
13570 72 69 70 74 54 68 72 65 61 64 73 0d 0a 20 20 20  riptThreads..   
13580 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
13590 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
135a0 61 74 20 6c 65 61 6b 65 64 2c 20 69 66 20 61 6e  at leaked, if an
135b0 79 74 68 69 6e 67 2e 0d 0a 20 20 20 20 23 0d 0a  ything...    #..
135c0 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 30 3b      set count 0;
135d0 20 75 70 76 61 72 20 31 20 24 73 74 61 74 73 56   upvar 1 $statsV
135e0 61 72 4e 61 6d 65 20 61 72 72 61 79 0d 0a 0d 0a  arName array....
135f0 20 20 20 20 66 6f 72 65 61 63 68 20 73 74 61 74      foreach stat
13600 69 73 74 69 63 20 24 73 74 61 74 69 73 74 69 63  istic $statistic
13610 73 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  s {..      if {!
13620 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 61 72 72  [info exists arr
13630 61 79 28 24 73 74 61 74 69 73 74 69 63 2c 61 66  ay($statistic,af
13640 74 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ter)]} then {.. 
13650 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13660 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13670 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13680 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13690 20 22 3d 3d 3d 3d 20 5c 22 22 20 24 66 69 6c 65   "==== \"" $file
136a0 4e 61 6d 65 20 22 5c 22 20 4d 49 53 53 49 4e 47  Name "\" MISSING
136b0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
136c0 20 20 20 20 24 73 74 61 74 69 73 74 69 63 20 22      $statistic "
136d0 20 41 46 54 45 52 5c 6e 22 5d 0d 0a 20 20 20 20   AFTER\n"]..    
136e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
136f0 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20   continue..     
13700 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
13710 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 61 72  ![info exists ar
13720 72 61 79 28 24 73 74 61 74 69 73 74 69 63 2c 62  ray($statistic,b
13730 65 66 6f 72 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  efore)]} then {.
13740 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
13750 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13760 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13770 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13780 67 73 20 22 3d 3d 3d 3d 20 5c 22 22 20 24 66 69  gs "==== \"" $fi
13790 6c 65 4e 61 6d 65 20 22 5c 22 20 4d 49 53 53 49  leName "\" MISSI
137a0 4e 47 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  NG " \..        
137b0 20 20 20 20 20 20 24 73 74 61 74 69 73 74 69 63        $statistic
137c0 20 22 20 42 45 46 4f 52 45 5c 6e 22 5d 0d 0a 20   " BEFORE\n"].. 
137d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
137e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20      continue..  
137f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
13800 66 20 7b 24 61 72 72 61 79 28 24 73 74 61 74 69  f {$array($stati
13810 73 74 69 63 2c 61 66 74 65 72 29 20 3e 20 24 61  stic,after) > $a
13820 72 72 61 79 28 24 73 74 61 74 69 73 74 69 63 2c  rray($statistic,
13830 62 65 66 6f 72 65 29 7d 20 74 68 65 6e 20 7b 0d  before)} then {.
13840 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
13850 20 61 72 72 61 79 28 73 74 61 74 69 73 74 69 63   array(statistic
13860 73 2c 6c 65 61 6b 65 64 29 20 24 73 74 61 74 69  s,leaked) $stati
13870 73 74 69 63 0d 0a 0d 0a 20 20 20 20 20 20 20 20  stic....        
13880 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13890 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
138a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
138b0 70 70 65 6e 64 41 72 67 73 20 22 3d 3d 3d 3d 20  ppendArgs "==== 
138c0 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 22 5c  \"" $fileName "\
138d0 22 20 4c 45 41 4b 45 44 20 22 20 5c 0d 0a 20 20  " LEAKED " \..  
138e0 20 20 20 20 20 20 20 20 20 20 20 20 24 73 74 61              $sta
138f0 74 69 73 74 69 63 20 5c 6e 5d 0d 0a 20 20 20 20  tistic \n]..    
13900 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13910 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
13920 73 20 61 72 72 61 79 28 24 73 74 61 74 69 73 74  s array($statist
13930 69 63 2c 62 65 66 6f 72 65 2c 6c 69 73 74 29 5d  ic,before,list)]
13940 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13950 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
13960 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13970 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13980 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13990 22 2d 2d 2d 2d 20 22 20 24 73 74 61 74 69 73 74  "---- " $statist
139a0 69 63 20 22 20 42 45 46 4f 52 45 3a 20 22 20 5c  ic " BEFORE: " \
139b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
139c0 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 24 61    [formatList $a
139d0 72 72 61 79 28 24 73 74 61 74 69 73 74 69 63 2c  rray($statistic,
139e0 62 65 66 6f 72 65 2c 6c 69 73 74 29 5d 20 5c 6e  before,list)] \n
139f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
13a00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
13a10 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
13a20 78 69 73 74 73 20 61 72 72 61 79 28 24 73 74 61  xists array($sta
13a30 74 69 73 74 69 63 2c 61 66 74 65 72 2c 6c 69 73  tistic,after,lis
13a40 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  t)]} then {..   
13a50 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13a60 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13a70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13a80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13a90 67 73 20 22 2d 2d 2d 2d 20 22 20 24 73 74 61 74  gs "---- " $stat
13aa0 69 73 74 69 63 20 22 20 41 46 54 45 52 3a 20 22  istic " AFTER: "
13ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13ac0 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20      [formatList 
13ad0 24 61 72 72 61 79 28 24 73 74 61 74 69 73 74 69  $array($statisti
13ae0 63 2c 61 66 74 65 72 2c 6c 69 73 74 29 5d 20 5c  c,after,list)] \
13af0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
13b00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13b10 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
13b20 65 78 69 73 74 73 20 61 72 72 61 79 28 75 6e 63  exists array(unc
13b30 6f 75 6e 74 65 64 2c 62 65 66 6f 72 65 29 5d 20  ounted,before)] 
13b40 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
13b50 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63    [lsearch -exac
13b60 74 20 24 61 72 72 61 79 28 75 6e 63 6f 75 6e 74  t $array(uncount
13b70 65 64 2c 62 65 66 6f 72 65 29 20 24 73 74 61 74  ed,before) $stat
13b80 69 73 74 69 63 5d 20 21 3d 20 2d 31 7d 20 74 68  istic] != -1} th
13b90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13ba0 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
13bb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
13bc0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
13bd0 61 72 72 61 79 28 75 6e 63 6f 75 6e 74 65 64 2c  array(uncounted,
13be0 61 66 74 65 72 29 5d 20 26 26 20 5c 0d 0a 20 20  after)] && \..  
13bf0 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72            [lsear
13c00 63 68 20 2d 65 78 61 63 74 20 24 61 72 72 61 79  ch -exact $array
13c10 28 75 6e 63 6f 75 6e 74 65 64 2c 61 66 74 65 72  (uncounted,after
13c20 29 20 24 73 74 61 74 69 73 74 69 63 5d 20 21 3d  ) $statistic] !=
13c30 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
13c40 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0d         continue.
13c50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13c60 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e 74        incr count
13c70 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
13c80 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
13c90 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
13ca0 20 74 68 69 73 20 66 69 6c 65 20 6e 61 6d 65 20   this file name 
13cb0 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74  is recorded in t
13cc0 68 65 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20  he list of file 
13cd0 6e 61 6d 65 73 20 77 69 74 68 0d 0a 20 20 20 20  names with..    
13ce0 23 20 20 20 20 20 20 20 6c 65 61 6b 69 6e 67 20  #       leaking 
13cf0 74 65 73 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  tests...    #.. 
13d00 20 20 20 75 70 76 61 72 20 31 20 24 66 69 6c 65     upvar 1 $file
13d10 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d  sVarName fileNam
13d20 65 73 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 24 63  es....    if {$c
13d30 6f 75 6e 74 20 3e 20 30 20 26 26 20 5c 0d 0a 20  ount > 0 && \.. 
13d40 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20         [lsearch 
13d50 2d 65 78 61 63 74 20 24 66 69 6c 65 4e 61 6d 65  -exact $fileName
13d60 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  s [file tail $fi
13d70 6c 65 4e 61 6d 65 5d 5d 20 3d 3d 20 2d 31 7d 20  leName]] == -1} 
13d80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 6c 61  then {..      la
13d90 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73 20  ppend fileNames 
13da0 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
13db0 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  Name]..    }....
13dc0 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
13dd0 45 3a 20 44 69 73 61 62 6c 65 20 74 65 73 74 20  E: Disable test 
13de0 73 75 69 74 65 20 69 6e 74 65 72 61 63 74 69 6f  suite interactio
13df0 6e 20 69 6e 20 22 71 75 69 65 74 22 20 6d 6f 64  n in "quiet" mod
13e00 65 2e 20 20 4a 75 73 74 20 72 65 74 75 72 6e 20  e.  Just return 
13e10 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  the..    #      
13e20 20 6c 65 61 6b 20 63 6f 75 6e 74 2e 0d 0a 20 20   leak count...  
13e30 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 24 71    #..    if {!$q
13e40 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13e50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13e60 4f 54 45 3a 20 49 66 20 77 65 20 61 72 65 20 73  OTE: If we are s
13e70 75 70 70 6f 73 65 64 20 74 6f 20 73 74 6f 70 20  upposed to stop 
13e80 6f 72 20 62 72 65 61 6b 20 69 6e 74 6f 20 74 68  or break into th
13e90 65 20 64 65 62 75 67 67 65 72 20 77 68 65 6e 65  e debugger whene
13ea0 76 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ver..      #    
13eb0 20 20 20 61 20 6c 65 61 6b 20 69 73 20 64 65 74     a leak is det
13ec0 65 63 74 65 64 2c 20 64 6f 20 69 74 20 6e 6f 77  ected, do it now
13ed0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13ee0 20 20 69 66 20 7b 24 63 6f 75 6e 74 20 3e 20 30    if {$count > 0
13ef0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13f00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
13f10 55 47 46 49 58 3a 20 49 73 20 77 65 20 61 72 65  UGFIX: Is we are
13f20 20 61 6c 72 65 61 64 79 20 73 74 6f 70 70 69 6e   already stoppin
13f30 67 20 28 65 2e 67 2e 20 64 75 65 20 74 6f 20 61  g (e.g. due to a
13f40 20 74 65 73 74 20 66 61 69 6c 75 72 65 29 2c 0d   test failure),.
13f50 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13f60 20 20 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f     do not try to
13f70 20 73 74 6f 70 20 61 67 61 69 6e 2e 0d 0a 20 20   stop again...  
13f80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13f90 20 69 66 20 7b 21 24 73 74 6f 70 20 26 26 20 5b   if {!$stop && [
13fa0 69 73 53 74 6f 70 4f 6e 4c 65 61 6b 5d 7d 20 74  isStopOnLeak]} t
13fb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13fc0 20 74 72 65 73 75 6c 74 20 45 72 72 6f 72 20 22   tresult Error "
13fd0 4f 56 45 52 41 4c 4c 20 52 45 53 55 4c 54 3a 20  OVERALL RESULT: 
13fe0 53 54 4f 50 2d 4f 4e 2d 4c 45 41 4b 5c 6e 22 0d  STOP-ON-LEAK\n".
13ff0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  ...          uns
14000 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a  et -nocomplain :
14010 3a 74 65 73 74 5f 73 75 69 74 65 5f 72 75 6e 6e  :test_suite_runn
14020 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 65  ing..          e
14030 72 72 6f 72 20 22 22 3b 20 23 20 6e 6f 20 6d 65  rror ""; # no me
14040 73 73 61 67 65 0d 0a 20 20 20 20 20 20 20 20 7d  ssage..        }
14050 20 65 6c 73 65 69 66 20 7b 5b 69 73 42 72 65 61   elseif {[isBrea
14060 6b 4f 6e 4c 65 61 6b 5d 7d 20 74 68 65 6e 20 7b  kOnLeak]} then {
14070 0d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ..          test
14080 44 65 62 75 67 42 72 65 61 6b 0d 0a 20 20 20 20  DebugBreak..    
14090 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
140a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74      }....    ret
140b0 75 72 6e 20 5b 6c 69 73 74 20 6c 65 61 6b 20 24  urn [list leak $
140c0 63 6f 75 6e 74 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  count]..  }.....
140d0 20 20 70 72 6f 63 20 66 6f 72 6d 61 74 4c 69 73    proc formatLis
140e0 74 20 7b 20 6c 69 73 74 20 7b 64 65 66 61 75 6c  t { list {defaul
140f0 74 20 22 22 7d 20 7b 63 6f 6c 75 6d 6e 73 20 31  t ""} {columns 1
14100 7d 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b  } } {..    if {[
14110 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 73  catch {..      s
14120 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a 20 20  et result ""..  
14130 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 31 0d      set count 1.
14140 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
14150 20 69 74 65 6d 20 24 6c 69 73 74 20 7b 0d 0a 20   item $list {.. 
14160 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 63 72         if {[incr
14170 20 63 6f 75 6e 74 20 2d 31 5d 20 3d 3d 20 30 7d   count -1] == 0}
14180 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14190 20 20 20 73 65 74 20 63 6f 75 6e 74 20 24 63 6f     set count $co
141a0 6c 75 6d 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  lumns..         
141b0 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c   append result \
141c0 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
141d0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
141e0 65 73 75 6c 74 20 5c 74 0d 0a 0d 0a 20 20 20 20  esult \t....    
141f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
14200 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
14210 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
14220 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
14230 6c 74 20 24 69 74 65 6d 0d 0a 20 20 20 20 20 20  lt $item..      
14240 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14250 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
14260 75 6c 74 20 3c 6e 6f 49 74 65 6d 3e 0d 0a 20 20  ult <noItem>..  
14270 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14280 0d 0a 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74  ..    }] == 0} t
14290 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74  hen {..      ret
142a0 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  urn [expr {[stri
142b0 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c  ng length $resul
142c0 74 5d 20 3e 20 30 20 3f 20 24 72 65 73 75 6c 74  t] > 0 ? $result
142d0 20 3a 20 24 64 65 66 61 75 6c 74 7d 5d 0d 0a 20   : $default}].. 
142e0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
142f0 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
14300 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
14310 72 6f 63 20 66 6f 72 6d 61 74 4c 69 73 74 41 73  roc formatListAs
14320 44 69 63 74 20 7b 20 6c 69 73 74 20 7b 64 65 66  Dict { list {def
14330 61 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ault ""} } {..  
14340 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
14350 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
14360 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72   ""....      for
14370 65 61 63 68 20 7b 6e 61 6d 65 20 76 61 6c 75 65  each {name value
14380 7d 20 24 6c 69 73 74 20 7b 0d 0a 20 20 20 20 20  } $list {..     
14390 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
143a0 20 5c 6e 5c 74 0d 0a 0d 0a 20 20 20 20 20 20 20   \n\t....       
143b0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
143c0 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
143d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
143e0 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20    append result 
143f0 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d  $name..        }
14400 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
14410 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
14420 20 3c 6e 6f 4e 61 6d 65 3e 0d 0a 20 20 20 20 20   <noName>..     
14430 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14440 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 22 3a  append result ":
14450 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   "....        if
14460 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
14470 20 24 76 61 6c 75 65 5d 20 3e 20 30 7d 20 74 68   $value] > 0} th
14480 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14490 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76  append result $v
144a0 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alue..        } 
144b0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
144c0 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20    append result 
144d0 3c 6e 6f 56 61 6c 75 65 3e 0d 0a 20 20 20 20 20  <noValue>..     
144e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
144f0 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
14500 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
14510 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
14520 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
14530 3e 20 30 20 3f 20 24 72 65 73 75 6c 74 20 3a 20  > 0 ? $result : 
14540 24 64 65 66 61 75 6c 74 7d 5d 0d 0a 20 20 20 20  $default}]..    
14550 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14560 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
14570 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
14580 20 70 61 74 68 54 6f 52 65 67 65 78 70 20 7b 20   pathToRegexp { 
14590 70 61 74 68 20 7b 6c 69 73 74 20 66 61 6c 73 65  path {list false
145a0 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  } } {..    #..  
145b0 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
145c0 72 6f 63 65 64 75 72 65 20 6e 65 65 64 73 20 74  rocedure needs t
145d0 6f 20 65 73 63 61 70 65 20 61 6c 6c 20 63 68 61  o escape all cha
145e0 72 61 63 74 65 72 73 20 74 68 61 74 0d 0a 20 20  racters that..  
145f0 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20 61    #       have a
14600 6e 79 20 73 70 65 63 69 61 6c 20 6d 65 61 6e 69  ny special meani
14610 6e 67 20 74 6f 20 74 68 65 20 72 65 67 75 6c 61  ng to the regula
14620 72 20 65 78 70 72 65 73 73 69 6f 6e 0d 0a 20 20  r expression..  
14630 20 20 23 20 20 20 20 20 20 20 65 6e 67 69 6e 65    #       engine
14640 2e 20 20 54 79 70 69 63 61 6c 6c 79 2c 20 74 68  .  Typically, th
14650 65 20 6f 6e 6c 79 20 63 68 61 72 61 63 74 65 72  e only character
14660 73 20 77 65 20 6e 65 65 64 20 74 6f 0d 0a 20 20  s we need to..  
14670 20 20 23 20 20 20 20 20 20 20 72 65 61 6c 6c 79    #       really
14680 20 77 6f 72 72 79 20 61 62 6f 75 74 20 61 72 65   worry about are
14690 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
146a0 65 70 61 72 61 74 6f 72 20 61 6e 64 0d 0a 20 20  eparator and..  
146b0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66 69    #       the fi
146c0 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 73 65 70  le extension sep
146d0 61 72 61 74 6f 72 20 28 65 2e 67 2e 20 62 61 63  arator (e.g. bac
146e0 6b 73 6c 61 73 68 20 61 6e 64 0d 0a 20 20 20 20  kslash and..    
146f0 23 20 20 20 20 20 20 20 70 65 72 69 6f 64 20 6f  #       period o
14700 6e 20 57 69 6e 64 6f 77 73 20 61 6e 64 2f 6f 72  n Windows and/or
14710 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20 61   forward slash a
14720 6e 64 20 70 65 72 69 6f 64 0d 0a 20 20 20 20 23  nd period..    #
14730 20 20 20 20 20 20 20 6f 6e 20 55 6e 69 78 29 2e         on Unix).
14740 20 20 53 69 6e 63 65 20 74 68 65 20 66 6f 72 77    Since the forw
14750 61 72 64 20 73 6c 61 73 68 20 68 61 73 20 6e 6f  ard slash has no
14760 20 73 70 65 63 69 61 6c 0d 0a 20 20 20 20 23 20   special..    # 
14770 20 20 20 20 20 20 6d 65 61 6e 69 6e 67 20 74 6f        meaning to
14780 20 74 68 65 20 72 65 67 75 6c 61 72 20 65 78 70   the regular exp
14790 72 65 73 73 69 6f 6e 20 65 6e 67 69 6e 65 2c 20  ression engine, 
147a0 57 69 6e 64 6f 77 73 0d 0a 20 20 20 20 23 20 20  Windows..    #  
147b0 20 20 20 20 20 69 73 20 73 6f 6d 65 77 68 61 74       is somewhat
147c0 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
147d0 74 6f 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  to handle...    
147e0 23 0d 0a 20 20 20 20 73 65 74 20 6d 61 70 20 5b  #..    set map [
147f0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
14800 5c 5c 20 5c 5c 5c 5c 20 5c 24 20 5c 5c 5c 24 20  \\ \\\\ \$ \\\$ 
14810 28 20 5c 5c 28 20 29 20 5c 5c 29 20 2a 20 5c 5c  ( \\( ) \\) * \\
14820 2a 20 2b 20 5c 5c 2b 20 2d 20 5c 5c 2d 20 2e 20  * + \\+ - \\- . 
14830 5c 5c 2e 20 5c 0d 0a 20 20 20 20 20 20 20 20 3f  \\. \..        ?
14840 20 5c 5c 3f 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d 20   \\? \[ \\\[ \] 
14850 5c 5c 5c 5d 20 5e 20 5c 5c 5e 20 5c 7b 20 5c 5c  \\\] ^ \\^ \{ \\
14860 5c 7b 20 5c 7d 20 5c 5c 5c 7d 5d 0d 0a 0d 0a 20  \{ \} \\\}].... 
14870 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e     return [strin
14880 67 20 6d 61 70 20 24 6d 61 70 20 5b 65 78 70 72  g map $map [expr
14890 20 7b 24 6c 69 73 74 20 3f 20 5b 6c 69 73 74 20   {$list ? [list 
148a0 24 70 61 74 68 5d 20 3a 20 24 70 61 74 68 7d 5d  $path] : $path}]
148b0 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  ]..  }.....  pro
148c0 63 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65 54 6f  c assemblyNameTo
148d0 52 65 67 65 78 70 20 7b 20 61 73 73 65 6d 62 6c  Regexp { assembl
148e0 79 4e 61 6d 65 20 7b 6c 69 73 74 20 66 61 6c 73  yName {list fals
148f0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  e} } {..    #.. 
14900 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
14910 70 72 6f 63 65 64 75 72 65 20 6e 65 65 64 73 20  procedure needs 
14920 74 6f 20 65 73 63 61 70 65 20 61 6c 6c 20 63 68  to escape all ch
14930 61 72 61 63 74 65 72 73 20 74 68 61 74 0d 0a 20  aracters that.. 
14940 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
14950 61 6e 79 20 73 70 65 63 69 61 6c 20 6d 65 61 6e  any special mean
14960 69 6e 67 20 74 6f 20 74 68 65 20 72 65 67 75 6c  ing to the regul
14970 61 72 20 65 78 70 72 65 73 73 69 6f 6e 0d 0a 20  ar expression.. 
14980 20 20 20 23 20 20 20 20 20 20 20 65 6e 67 69 6e     #       engin
14990 65 20 2d 41 4e 44 2d 20 74 68 61 74 20 63 61 6e  e -AND- that can
149a0 20 61 63 74 75 61 6c 6c 79 20 61 70 70 65 61 72   actually appear
149b0 20 69 6e 20 61 20 6c 65 67 61 6c 0d 0a 20 20 20   in a legal..   
149c0 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
149d0 79 20 6e 61 6d 65 2e 20 20 4e 6f 72 6d 61 6c 6c  y name.  Normall
149e0 79 2c 20 74 68 69 73 20 77 6f 75 6c 64 20 6f 6e  y, this would on
149f0 6c 79 20 69 6e 63 6c 75 64 65 0d 0a 20 20 20 20  ly include..    
14a00 23 20 20 20 20 20 20 20 74 68 65 20 70 65 72 69  #       the peri
14a10 6f 64 20 63 68 61 72 61 63 74 65 72 2e 0d 0a 20  od character... 
14a20 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41 43 4b     #..    # HACK
14a30 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20  : For now, just 
14a40 61 62 75 73 65 20 74 68 65 20 5b 70 61 74 68 54  abuse the [pathT
14a50 6f 52 65 67 65 78 70 5d 20 70 72 6f 63 65 64 75  oRegexp] procedu
14a60 72 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  re..    #       
14a70 66 6f 72 20 74 68 69 73 2e 0d 0a 20 20 20 20 23  for this...    #
14a80 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 70 61  ..    return [pa
14a90 74 68 54 6f 52 65 67 65 78 70 20 24 61 73 73 65  thToRegexp $asse
14aa0 6d 62 6c 79 4e 61 6d 65 20 24 6c 69 73 74 5d 0d  mblyName $list].
14ab0 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
14ac0 69 6e 76 65 72 73 65 4c 73 65 61 72 63 68 47 6c  inverseLsearchGl
14ad0 6f 62 20 7b 20 6e 6f 43 61 73 65 20 70 61 74 74  ob { noCase patt
14ae0 65 72 6e 73 20 65 6c 65 6d 65 6e 74 20 7d 20 7b  erns element } {
14af0 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
14b00 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 74 68 65  OTE: Perform the
14b10 20 69 6e 76 65 72 73 65 20 6f 66 20 5b 6c 73 65   inverse of [lse
14b20 61 72 63 68 20 2d 67 6c 6f 62 5d 2c 20 61 74 74  arch -glob], att
14b30 65 6d 70 74 0d 0a 20 20 20 20 23 20 20 20 20 20  empt..    #     
14b40 20 20 74 6f 20 6d 61 74 63 68 20 61 6e 20 65 6c    to match an el
14b50 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 61 20  ement against a 
14b60 6c 69 73 74 20 6f 66 20 70 61 74 74 65 72 6e 73  list of patterns
14b70 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65  ...    #..    se
14b80 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20  t command [list 
14b90 73 74 72 69 6e 67 20 6d 61 74 63 68 5d 0d 0a 20  string match].. 
14ba0 20 20 20 69 66 20 7b 24 6e 6f 43 61 73 65 7d 20     if {$noCase} 
14bb0 74 68 65 6e 20 7b 6c 61 70 70 65 6e 64 20 63 6f  then {lappend co
14bc0 6d 6d 61 6e 64 20 2d 6e 6f 63 61 73 65 7d 0d 0a  mmand -nocase}..
14bd0 0d 0a 20 20 20 20 73 65 74 20 6c 65 6e 67 74 68  ..    set length
14be0 20 5b 6c 6c 65 6e 67 74 68 20 24 70 61 74 74 65   [llength $patte
14bf0 72 6e 73 5d 0d 0a 0d 0a 20 20 20 20 66 6f 72 20  rns]....    for 
14c00 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24  {set index 0} {$
14c10 69 6e 64 65 78 20 3c 20 24 6c 65 6e 67 74 68 7d  index < $length}
14c20 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
14c30 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65  .      set patte
14c40 72 6e 20 5b 6c 69 6e 64 65 78 20 24 70 61 74 74  rn [lindex $patt
14c50 65 72 6e 73 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a  erns $index]....
14c60 20 20 20 20 20 20 69 66 20 7b 5b 65 76 61 6c 20        if {[eval 
14c70 24 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 24  $command [list $
14c80 70 61 74 74 65 72 6e 5d 20 5b 6c 69 73 74 20 24  pattern] [list $
14c90 65 6c 65 6d 65 6e 74 5d 5d 7d 20 74 68 65 6e 20  element]]} then 
14ca0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
14cb0 6e 20 24 69 6e 64 65 78 0d 0a 20 20 20 20 20 20  n $index..      
14cc0 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
14cd0 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 7d 0d 0a  return -1..  }..
14ce0 0c 0d 0a 20 20 70 72 6f 63 20 72 65 6d 6f 76 65  ...  proc remove
14cf0 50 61 74 68 46 72 6f 6d 46 69 6c 65 4e 61 6d 65  PathFromFileName
14d00 73 20 7b 20 70 61 74 68 20 66 69 6c 65 4e 61 6d  s { path fileNam
14d10 65 73 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20  es } {..    set 
14d20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
14d30 0a 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c  .    foreach fil
14d40 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73  eName $fileNames
14d50 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66   {..      if {[f
14d60 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66  ile normalize [f
14d70 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 69 6c  ile dirname $fil
14d80 65 4e 61 6d 65 5d 5d 20 65 71 20 5c 0d 0a 20 20  eName]] eq \..  
14d90 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6e 6f          [file no
14da0 72 6d 61 6c 69 7a 65 20 24 70 61 74 68 5d 7d 20  rmalize $path]} 
14db0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14dc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14dd0 45 3a 20 53 74 72 69 70 20 74 68 65 20 70 61 74  E: Strip the pat
14de0 68 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 69 73  h name from this
14df0 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
14e00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14e10 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
14e20 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
14e30 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ame]..      } el
14e40 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  se {..        la
14e50 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 66 69  ppend result $fi
14e60 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
14e70 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65  .    }....    re
14e80 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
14e90 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 66 6f 72  }.....  proc for
14ea0 6d 61 74 44 65 63 69 6d 61 6c 20 7b 20 76 61 6c  matDecimal { val
14eb0 75 65 20 7b 70 6c 61 63 65 73 20 34 7d 20 7b 7a  ue {places 4} {z
14ec0 65 72 6f 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  eros false} } {.
14ed0 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
14ee0 54 45 3a 20 49 66 20 74 68 65 20 76 61 6c 75 65  TE: If the value
14ef0 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
14f00 69 6e 67 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 20  ing, do nothing 
14f10 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  and return an em
14f20 70 74 79 0d 0a 20 20 20 20 23 20 20 20 20 20 20  pty..    #      
14f30 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 23 0d   string...    #.
14f40 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
14f50 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20   length $value] 
14f60 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14f70 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
14f80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20     }....    #.. 
14f90 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
14fa0 6f 77 2c 20 75 73 65 20 73 6c 69 67 68 74 6c 79  ow, use slightly
14fb0 20 64 69 66 66 65 72 65 6e 74 20 6d 65 74 68 6f   different metho
14fc0 64 73 20 66 6f 72 20 66 6f 72 6d 61 74 74 69 6e  ds for formattin
14fd0 67 20 66 6c 6f 61 74 69 6e 67 0d 0a 20 20 20 20  g floating..    
14fe0 23 20 20 20 20 20 20 20 70 6f 69 6e 74 65 72 20  #       pointer 
14ff0 6e 75 6d 62 65 72 73 20 66 6f 72 20 6e 61 74 69  numbers for nati
15000 76 65 20 54 63 6c 20 61 6e 64 20 45 61 67 6c 65  ve Tcl and Eagle
15010 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ...    #..    if
15020 20 7b 5b 69 73 45 61 67 6c 65 5d 20 26 26 20 5b   {[isEagle] && [
15030 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f  llength [info co
15040 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20  mmands object]] 
15050 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
15060 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41     #..      # HA
15070 43 4b 3a 20 54 68 69 73 20 77 6f 72 6b 73 3b 20  CK: This works; 
15080 68 6f 77 65 76 65 72 2c 20 69 6e 20 6f 72 64 65  however, in orde
15090 72 20 74 6f 20 64 6f 20 74 68 69 73 20 6b 69 6e  r to do this kin
150a0 64 20 6f 66 20 74 68 69 6e 67 20 63 6c 65 61 6e  d of thing clean
150b0 6c 79 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ly,..      #    
150c0 20 20 20 77 65 20 72 65 61 6c 6c 79 20 6e 65 65     we really nee
150d0 64 20 74 68 65 20 54 63 6c 20 5b 66 6f 72 6d 61  d the Tcl [forma
150e0 74 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  t] command...   
150f0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
15100 72 65 73 75 6c 74 20 5b 6f 62 6a 65 63 74 20 69  result [object i
15110 6e 76 6f 6b 65 20 53 74 72 69 6e 67 20 46 6f 72  nvoke String For
15120 6d 61 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  mat [appendArgs 
15130 22 7b 30 3a 30 2e 22 20 5c 0d 0a 20 20 20 20 20  "{0:0." \..     
15140 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72 65 70       [string rep
15150 65 61 74 20 5b 65 78 70 72 20 7b 24 7a 65 72 6f  eat [expr {$zero
15160 73 20 3f 20 22 30 22 20 3a 20 22 23 22 7d 5d 20  s ? "0" : "#"}] 
15170 24 70 6c 61 63 65 73 5d 20 22 7d 22 5d 20 5c 0d  $places] "}"] \.
15180 0a 20 20 20 20 20 20 20 20 20 20 5b 73 65 74 20  .          [set 
15190 6f 62 6a 65 63 74 20 5b 6f 62 6a 65 63 74 20 69  object [object i
151a0 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 6f  nvoke -create Do
151b0 75 62 6c 65 20 50 61 72 73 65 20 24 76 61 6c 75  uble Parse $valu
151c0 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 75 6e  e]]]....      un
151d0 73 65 74 20 6f 62 6a 65 63 74 3b 20 23 20 64 69  set object; # di
151e0 73 70 6f 73 65 0d 0a 20 20 20 20 7d 20 65 6c 73  spose..    } els
151f0 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e {..      #..  
15200 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 2c      # NOTE: See,
15210 20 6e 69 63 65 20 61 6e 64 20 63 6c 65 61 6e 20   nice and clean 
15220 77 68 65 6e 20 64 6f 6e 65 20 69 6e 20 54 63 6c  when done in Tcl
15230 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
15240 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 6f    set result [fo
15250 72 6d 61 74 20 5b 61 70 70 65 6e 64 41 72 67 73  rmat [appendArgs
15260 20 25 2e 20 24 70 6c 61 63 65 73 20 66 5d 20 24   %. $places f] $
15270 76 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  value]....      
15280 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a  #..      # HACK:
15290 20 53 69 6e 63 65 20 6e 61 74 69 76 65 20 54 63   Since native Tc
152a0 6c 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  l does not appea
152b0 72 20 74 6f 20 65 78 70 6f 73 65 20 61 20 6d 65  r to expose a me
152c0 74 68 6f 64 20 74 6f 20 6f 6e 6c 79 0d 0a 20 20  thod to only..  
152d0 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73      #       pres
152e0 65 72 76 65 20 6e 6f 6e 2d 7a 65 72 6f 20 74 72  erve non-zero tr
152f0 61 69 6c 69 6e 67 20 64 69 67 69 74 73 2c 20 77  ailing digits, w
15300 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 6d 61  e may need to ma
15310 6e 75 61 6c 6c 79 0d 0a 20 20 20 20 20 20 23 20  nually..      # 
15320 20 20 20 20 20 20 72 65 6d 6f 76 65 20 65 78 74        remove ext
15330 72 61 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f  ra trailing zero
15340 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
15350 20 20 20 69 66 20 7b 21 24 7a 65 72 6f 73 7d 20     if {!$zeros} 
15360 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15370 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15380 45 3a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 72  E: Remove all tr
15390 61 69 6c 69 6e 67 20 7a 65 72 6f 73 20 61 6e 64  ailing zeros and
153a0 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 64 65   the trailing de
153b0 63 69 6d 61 6c 20 70 6f 69 6e 74 2c 0d 0a 20 20  cimal point,..  
153c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66        #       if
153d0 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20   necessary...   
153e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
153f0 73 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72 69  set result [stri
15400 6e 67 20 74 72 69 6d 72 69 67 68 74 20 5b 73 74  ng trimright [st
15410 72 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20 24  ring trimright $
15420 72 65 73 75 6c 74 20 30 5d 20 2e 5d 0d 0a 20 20  result 0] .]..  
15430 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
15440 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
15450 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  lt..  }.....  pr
15460 6f 63 20 63 6c 65 61 72 54 65 73 74 50 65 72 63  oc clearTestPerc
15470 65 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ent { channel } 
15480 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61  {..    if {[isEa
15490 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gle]} then {..  
154a0 20 20 20 20 68 6f 73 74 20 74 69 74 6c 65 20 22      host title "
154b0 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  "..    }..  }...
154c0 0d 0a 20 20 70 72 6f 63 20 72 65 70 6f 72 74 54  ..  proc reportT
154d0 65 73 74 50 65 72 63 65 6e 74 20 7b 0d 0a 20 20  estPercent {..  
154e0 20 20 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20          channel 
154f0 70 65 72 63 65 6e 74 20 64 6f 6e 65 46 69 6c 65  percent doneFile
15500 73 20 74 6f 74 61 6c 46 69 6c 65 73 20 66 61 69  s totalFiles fai
15510 6c 65 64 46 69 6c 65 73 20 6c 65 61 6b 65 64 46  ledFiles leakedF
15520 69 6c 65 73 20 7d 20 7b 0d 0a 20 20 20 20 69 66  iles } {..    if
15530 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
15540 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 74  n {..      set t
15550 6f 74 61 6c 54 65 73 74 73 20 24 3a 3a 65 61 67  otalTests $::eag
15560 6c 65 5f 74 65 73 74 73 28 54 6f 74 61 6c 29 0d  le_tests(Total).
15570 0a 20 20 20 20 20 20 73 65 74 20 66 61 69 6c 65  .      set faile
15580 64 54 65 73 74 73 20 24 3a 3a 65 61 67 6c 65 5f  dTests $::eagle_
15590 74 65 73 74 73 28 46 61 69 6c 65 64 29 0d 0a 20  tests(Failed).. 
155a0 20 20 20 20 20 73 65 74 20 73 6b 69 70 70 65 64       set skipped
155b0 54 65 73 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74  Tests $::eagle_t
155c0 65 73 74 73 28 53 6b 69 70 70 65 64 29 0d 0a 20  ests(Skipped).. 
155d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
155e0 20 20 20 73 65 74 20 74 6f 74 61 6c 54 65 73 74     set totalTest
155f0 73 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 6e 75  s $::tcltest::nu
15600 6d 54 65 73 74 73 28 54 6f 74 61 6c 29 0d 0a 20  mTests(Total).. 
15610 20 20 20 20 20 73 65 74 20 66 61 69 6c 65 64 54       set failedT
15620 65 73 74 73 20 24 3a 3a 74 63 6c 74 65 73 74 3a  ests $::tcltest:
15630 3a 6e 75 6d 54 65 73 74 73 28 46 61 69 6c 65 64  :numTests(Failed
15640 29 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6b 69  )..      set ski
15650 70 70 65 64 54 65 73 74 73 20 24 3a 3a 74 63 6c  ppedTests $::tcl
15660 74 65 73 74 3a 3a 6e 75 6d 54 65 73 74 73 28 53  test::numTests(S
15670 6b 69 70 70 65 64 29 0d 0a 20 20 20 20 7d 0d 0a  kipped)..    }..
15680 0d 0a 20 20 20 20 73 65 74 20 73 74 61 74 75 73  ..    set status
15690 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
156a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 74 65          "---- te
156b0 73 74 20 73 75 69 74 65 20 72 75 6e 6e 69 6e 67  st suite running
156c0 2c 20 61 62 6f 75 74 20 22 20 24 70 65 72 63 65  , about " $perce
156d0 6e 74 20 22 25 20 63 6f 6d 70 6c 65 74 65 20 28  nt "% complete (
156e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 74 6f  " \..        $to
156f0 74 61 6c 54 65 73 74 73 20 22 20 74 65 73 74 73  talTests " tests
15700 20 74 6f 74 61 6c 2c 20 22 20 24 66 61 69 6c 65   total, " $faile
15710 64 54 65 73 74 73 20 22 20 74 65 73 74 73 20 66  dTests " tests f
15720 61 69 6c 65 64 2c 20 22 20 5c 0d 0a 20 20 20 20  ailed, " \..    
15730 20 20 20 20 24 73 6b 69 70 70 65 64 54 65 73 74      $skippedTest
15740 73 20 22 20 74 65 73 74 73 20 73 6b 69 70 70 65  s " tests skippe
15750 64 2c 20 22 20 24 64 6f 6e 65 46 69 6c 65 73 20  d, " $doneFiles 
15760 22 20 66 69 6c 65 73 20 64 6f 6e 65 2c 20 22 20  " files done, " 
15770 5c 0d 0a 20 20 20 20 20 20 20 20 24 74 6f 74 61  \..        $tota
15780 6c 46 69 6c 65 73 20 22 20 66 69 6c 65 73 20 74  lFiles " files t
15790 6f 74 61 6c 2c 20 22 20 24 66 61 69 6c 65 64 46  otal, " $failedF
157a0 69 6c 65 73 20 22 20 66 69 6c 65 73 20 66 61 69  iles " files fai
157b0 6c 65 64 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20  led, " \..      
157c0 20 20 24 6c 65 61 6b 65 64 46 69 6c 65 73 20 22    $leakedFiles "
157d0 20 66 69 6c 65 73 20 6c 65 61 6b 65 64 29 2e 2e   files leaked)..
157e0 2e 22 5d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73  ."]....    tputs
157f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15800 64 41 72 67 73 20 24 73 74 61 74 75 73 20 5c 6e  dArgs $status \n
15810 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73  ]....    if {[is
15820 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Eagle]} then {..
15830 20 20 20 20 20 20 68 6f 73 74 20 74 69 74 6c 65        host title
15840 20 24 73 74 61 74 75 73 0d 0a 20 20 20 20 7d 0d   $status..    }.
15850 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
15860 72 65 70 6f 72 74 41 72 72 61 79 47 65 74 20 7b  reportArrayGet {
15870 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20   varName } {..  
15880 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
15890 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d  ngth $varName] =
158a0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
158b0 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 5d     return [list]
158c0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 75  ..    }....    u
158d0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
158e0 61 72 72 61 79 0d 0a 0d 0a 20 20 20 20 69 66 20  array....    if 
158f0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
15900 3a 6e 6f 28 72 65 70 6f 72 74 41 72 72 61 79 47  :no(reportArrayG
15910 65 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  et)]} then {..  
15920 20 20 20 20 73 65 74 20 6c 69 73 74 28 31 29 20      set list(1) 
15930 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
15940 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20 76 61  foreach {name va
15950 6c 75 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20  lue} [array get 
15960 61 72 72 61 79 5d 20 7b 0d 0a 20 20 20 20 20 20  array] {..      
15970 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 28 31    lappend list(1
15980 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76  ) [list $name $v
15990 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  alue]..      }..
159a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
159b0 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20 61 73   # HACK: This as
159c0 73 75 6d 65 73 20 74 68 61 74 20 77 65 20 61 72  sumes that we ar
159d0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 69  e dealing with i
159e0 6e 74 65 67 65 72 20 76 61 6c 75 65 73 2e 0d 0a  nteger values...
159f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
15a00 65 74 20 6c 69 73 74 28 32 29 20 5b 6c 73 6f 72  et list(2) [lsor
15a10 74 20 2d 69 6e 64 65 78 20 31 20 2d 69 6e 74 65  t -index 1 -inte
15a20 67 65 72 20 2d 64 65 63 72 65 61 73 69 6e 67 20  ger -decreasing 
15a30 24 6c 69 73 74 28 31 29 5d 0d 0a 20 20 20 20 20  $list(1)]..     
15a40 20 73 65 74 20 6c 69 73 74 28 33 29 20 5b 6c 69   set list(3) [li
15a50 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  st]....      for
15a60 65 61 63 68 20 70 61 69 72 20 24 6c 69 73 74 28  each pair $list(
15a70 32 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  2) {..        la
15a80 70 70 65 6e 64 20 6c 69 73 74 28 33 29 20 5b 6c  ppend list(3) [l
15a90 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 20 5b  index $pair 0] [
15aa0 6c 69 6e 64 65 78 20 24 70 61 69 72 20 31 5d 0d  lindex $pair 1].
15ab0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
15ac0 20 20 72 65 74 75 72 6e 20 24 6c 69 73 74 28 33    return $list(3
15ad0 29 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  )..    } else {.
15ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61  .      return [a
15af0 72 72 61 79 20 67 65 74 20 61 72 72 61 79 5d 0d  rray get array].
15b00 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
15b10 20 20 70 72 6f 63 20 72 65 70 6f 72 74 54 65 73    proc reportTes
15b20 74 53 74 61 74 69 73 74 69 63 43 6f 75 6e 74 73  tStatisticCounts
15b30 20 7b 20 63 68 61 6e 6e 65 6c 20 73 74 61 74 73   { channel stats
15b40 56 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  VarName } {..   
15b50 20 75 70 76 61 72 20 31 20 24 73 74 61 74 73 56   upvar 1 $statsV
15b60 61 72 4e 61 6d 65 20 61 72 72 61 79 0d 0a 0d 0a  arName array....
15b70 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
15b80 45 3a 20 57 65 72 65 20 61 6e 79 20 63 6f 75 6e  E: Were any coun
15b90 74 73 20 72 65 63 6f 72 64 65 64 20 64 75 72 69  ts recorded duri
15ba0 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 3f 0d  ng the testing?.
15bb0 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
15bc0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 61 72 72  [info exists arr
15bd0 61 79 28 73 74 61 74 69 73 74 69 63 73 2c 6c 65  ay(statistics,le
15be0 61 6b 65 64 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  aked)]} then {..
15bf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15c00 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73 20 65   NOTE: Process e
15c10 61 63 68 20 6c 65 61 6b 20 74 79 70 65 20 69 6e  ach leak type in
15c20 20 74 68 65 20 6c 69 73 74 2c 20 72 65 63 6f 72   the list, recor
15c30 64 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61  ding any duplica
15c40 74 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tes..      #    
15c50 20 20 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72     in the tempor
15c60 61 72 79 20 63 6f 75 6e 74 20 61 72 72 61 79 2e  ary count array.
15c70 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15c80 20 66 6f 72 65 61 63 68 20 73 74 61 74 69 73 74   foreach statist
15c90 69 63 20 24 61 72 72 61 79 28 73 74 61 74 69 73  ic $array(statis
15ca0 74 69 63 73 2c 6c 65 61 6b 65 64 29 20 7b 0d 0a  tics,leaked) {..
15cb0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
15cc0 6f 20 65 78 69 73 74 73 20 63 6f 75 6e 74 28 24  o exists count($
15cd0 73 74 61 74 69 73 74 69 63 29 5d 7d 20 74 68 65  statistic)]} the
15ce0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
15cf0 6e 63 72 20 63 6f 75 6e 74 28 24 73 74 61 74 69  ncr count($stati
15d00 73 74 69 63 29 0d 0a 20 20 20 20 20 20 20 20 7d  stic)..        }
15d10 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
15d20 20 20 20 73 65 74 20 63 6f 75 6e 74 28 24 73 74     set count($st
15d30 61 74 69 73 74 69 63 29 20 31 0d 0a 20 20 20 20  atistic) 1..    
15d40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
15d50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15d60 20 23 20 4e 4f 54 45 3a 20 46 6c 61 74 74 65 6e   # NOTE: Flatten
15d70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   the temporary c
15d80 6f 75 6e 74 20 61 72 72 61 79 20 69 6e 74 6f 20  ount array into 
15d90 61 20 64 69 63 74 69 6f 6e 61 72 79 20 66 6f 72  a dictionary for
15da0 6d 61 74 74 65 64 0d 0a 20 20 20 20 20 20 23 20  matted..      # 
15db0 20 20 20 20 20 20 6c 69 73 74 20 61 6e 64 20 74        list and t
15dc0 68 65 6e 20 70 6f 73 73 69 62 6c 79 20 64 69 73  hen possibly dis
15dd0 70 6c 61 79 20 69 74 20 28 69 2e 65 2e 20 69 66  play it (i.e. if
15de0 20 69 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e   it actually con
15df0 74 61 69 6e 73 0d 0a 20 20 20 20 20 20 23 20 20  tains..      #  
15e00 20 20 20 20 20 61 6e 79 20 64 61 74 61 29 2e 0d       any data)..
15e10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15e20 73 65 74 20 73 74 61 74 69 73 74 69 63 73 20 5b  set statistics [
15e30 72 65 70 6f 72 74 41 72 72 61 79 47 65 74 20 63  reportArrayGet c
15e40 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  ount]....      i
15e50 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 73 74 61 74  f {[llength stat
15e60 69 73 74 69 63 73 5d 20 3e 20 30 7d 20 74 68 65  istics] > 0} the
15e70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
15e80 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15e90 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 74 79  endArgs "---- ty
15ea0 70 65 73 20 6f 66 20 6c 65 61 6b 73 20 64 65 74  pes of leaks det
15eb0 65 63 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20  ected: " \..    
15ec0 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c          [formatL
15ed0 69 73 74 41 73 44 69 63 74 20 24 73 74 61 74 69  istAsDict $stati
15ee0 73 74 69 63 73 5d 20 5c 6e 5d 0d 0a 20 20 20 20  stics] \n]..    
15ef0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
15f00 0a 0c 0d 0a 20 20 70 72 6f 63 20 72 75 6e 41 6c  ....  proc runAl
15f10 6c 54 65 73 74 73 20 7b 0d 0a 20 20 20 20 20 20  lTests {..      
15f20 20 20 20 20 63 68 61 6e 6e 65 6c 20 70 61 74 68      channel path
15f30 20 66 69 6c 65 4e 61 6d 65 73 20 73 6b 69 70 46   fileNames skipF
15f40 69 6c 65 4e 61 6d 65 73 20 73 74 61 72 74 46 69  ileNames startFi
15f50 6c 65 4e 61 6d 65 73 20 73 74 6f 70 46 69 6c 65  leNames stopFile
15f60 4e 61 6d 65 73 20 7d 20 7b 0d 0a 20 20 20 20 23  Names } {..    #
15f70 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72  ..    # NOTE: Ar
15f80 65 20 77 65 20 63 6f 6e 66 69 67 75 72 65 64 20  e we configured 
15f90 74 6f 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  to run the test 
15fa0 66 69 6c 65 73 20 69 6e 20 72 61 6e 64 6f 6d 20  files in random 
15fb0 6f 72 64 65 72 3f 0d 0a 20 20 20 20 23 0d 0a 20  order?..    #.. 
15fc0 20 20 20 69 66 20 7b 5b 69 73 52 61 6e 64 6f 6d     if {[isRandom
15fd0 4f 72 64 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Order]} then {..
15fe0 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
15ff0 6d 65 73 20 5b 6c 73 68 75 66 66 6c 65 20 24 66  mes [lshuffle $f
16000 69 6c 65 4e 61 6d 65 73 5d 0d 0a 20 20 20 20 7d  ileNames]..    }
16010 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
16020 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
16030 65 78 61 63 74 20 61 72 67 75 6d 65 6e 74 73 20  exact arguments 
16040 77 65 20 72 65 63 65 69 76 65 64 20 73 69 6e 63  we received sinc
16050 65 20 74 68 65 79 20 6d 61 79 20 6e 6f 74 0d 0a  e they may not..
16060 20 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65      #       have
16070 20 62 65 65 6e 20 64 69 73 70 6c 61 79 65 64 20   been displayed 
16080 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28 6f  by the caller (o
16090 72 20 61 6e 79 62 6f 64 79 20 65 6c 73 65 29 2e  r anybody else).
160a0 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
160b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
160c0 3a 6e 6f 28 72 75 6e 4d 65 74 61 64 61 74 61 29  :no(runMetadata)
160d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
160e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
160f0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
16100 2d 20 74 65 73 74 20 72 75 6e 20 70 61 74 68 3a  - test run path:
16110 20 5c 22 22 20 24 70 61 74 68 20 5c 22 5c 6e 5d   \"" $path \"\n]
16120 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
16130 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
16140 41 72 67 73 20 22 2d 2d 2d 2d 20 74 65 73 74 20  Args "---- test 
16150 72 75 6e 20 66 69 6c 65 20 6e 61 6d 65 73 3a 20  run file names: 
16160 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  " \..          [
16170 66 6f 72 6d 61 74 4c 69 73 74 20 5b 72 65 6d 6f  formatList [remo
16180 76 65 50 61 74 68 46 72 6f 6d 46 69 6c 65 4e 61  vePathFromFileNa
16190 6d 65 73 20 24 70 61 74 68 20 24 66 69 6c 65 4e  mes $path $fileN
161a0 61 6d 65 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  ames]] \n]....  
161b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
161c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
161d0 2d 2d 2d 2d 20 74 65 73 74 20 72 75 6e 20 73 6b  ---- test run sk
161e0 69 70 20 66 69 6c 65 20 6e 61 6d 65 73 3a 20 22  ip file names: "
161f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
16200 6f 72 6d 61 74 4c 69 73 74 20 24 73 6b 69 70 46  ormatList $skipF
16210 69 6c 65 4e 61 6d 65 73 5d 20 5c 6e 5d 0d 0a 20  ileNames] \n].. 
16220 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20     }....    #.. 
16230 20 20 20 23 20 4e 4f 54 45 3a 20 4b 65 65 70 20     # NOTE: Keep 
16240 67 6f 69 6e 67 20 75 6e 6c 65 73 73 20 74 68 69  going unless thi
16250 73 20 62 65 63 6f 6d 65 73 20 74 72 75 65 20 28  s becomes true (
16260 69 2e 65 2e 20 69 66 20 6f 6e 65 20 6f 66 20 74  i.e. if one of t
16270 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  he..    #       
16280 74 65 73 74 20 66 69 6c 65 73 20 73 69 67 6e 61  test files signa
16290 6c 73 20 75 73 20 74 6f 20 73 74 6f 70 29 2e 0d  ls us to stop)..
162a0 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20  .    #..    set 
162b0 73 74 6f 70 20 66 61 6c 73 65 0d 0a 0d 0a 20 20  stop false....  
162c0 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
162d0 20 53 6f 20 66 61 72 2c 20 77 65 20 68 61 76 65   So far, we have
162e0 20 72 75 6e 20 6e 6f 20 74 65 73 74 73 2e 0d 0a   run no tests...
162f0 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 63      #..    set c
16300 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 23 0d  ount 0....    #.
16310 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6f 20  .    # NOTE: So 
16320 66 61 72 2c 20 6e 6f 20 66 69 6c 65 73 20 68 61  far, no files ha
16330 76 65 20 68 61 64 20 66 61 69 6c 69 6e 67 20 6f  ve had failing o
16340 72 20 6c 65 61 6b 69 6e 67 20 74 65 73 74 73 2e  r leaking tests.
16350 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74  ..    #..    set
16360 20 66 61 69 6c 65 64 20 5b 6c 69 73 74 5d 0d 0a   failed [list]..
16370 20 20 20 20 73 65 74 20 6c 65 61 6b 65 64 20 5b      set leaked [
16380 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a  list]....    #..
16390 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 63      # NOTE: Proc
163a0 65 73 73 20 65 61 63 68 20 66 69 6c 65 20 6e 61  ess each file na
163b0 6d 65 20 77 65 20 68 61 76 65 20 62 65 65 6e 20  me we have been 
163c0 67 69 76 65 6e 20 62 79 20 74 68 65 20 63 61 6c  given by the cal
163d0 6c 65 72 2e 2e 2e 0d 0a 20 20 20 20 23 0d 0a 20  ler.....    #.. 
163e0 20 20 20 73 65 74 20 74 6f 74 61 6c 20 5b 6c 6c     set total [ll
163f0 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 73  ength $fileNames
16400 5d 3b 20 73 65 74 20 6c 61 73 74 50 65 72 63 65  ]; set lastPerce
16410 6e 74 20 2d 31 0d 0a 0d 0a 20 20 20 20 66 6f 72  nt -1....    for
16420 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66  each fileName $f
16430 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
16440 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16450 45 3a 20 49 66 20 63 6f 6e 66 69 67 75 72 65 64  E: If configured
16460 20 74 6f 20 62 72 65 61 6b 20 69 6e 74 6f 20 74   to break into t
16470 68 65 20 64 65 62 75 67 67 65 72 20 62 65 66 6f  he debugger befo
16480 72 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 0d 0a  re running the..
16490 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
164a0 73 74 20 66 69 6c 65 2c 20 64 6f 20 69 74 20 6e  st file, do it n
164b0 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
164c0 20 20 20 20 69 66 20 7b 5b 69 73 42 72 65 61 6b      if {[isBreak
164d0 4f 6e 44 65 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  OnDemand]} then 
164e0 7b 0d 0a 20 20 20 20 20 20 20 20 74 65 73 74 44  {..        testD
164f0 65 62 75 67 42 72 65 61 6b 0d 0a 20 20 20 20 20  ebugBreak..     
16500 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
16510 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20       # NOTE: In 
16520 74 65 72 6d 73 20 6f 66 20 66 69 6c 65 73 2c 20  terms of files, 
16530 6e 6f 74 20 74 65 73 74 73 2c 20 77 68 61 74 20  not tests, what 
16540 70 65 72 63 65 6e 74 20 64 6f 6e 65 20 61 72 65  percent done are
16550 20 77 65 20 6e 6f 77 3f 0d 0a 20 20 20 20 20 20   we now?..      
16560 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70 65 72  #..      set per
16570 63 65 6e 74 20 5b 66 6f 72 6d 61 74 44 65 63 69  cent [formatDeci
16580 6d 61 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  mal \..         
16590 20 5b 65 78 70 72 20 7b 24 74 6f 74 61 6c 20 21   [expr {$total !
165a0 3d 20 30 20 3f 20 31 30 30 2e 30 20 2a 20 28 24  = 0 ? 100.0 * ($
165b0 63 6f 75 6e 74 20 2f 20 64 6f 75 62 6c 65 28 24  count / double($
165c0 74 6f 74 61 6c 29 29 20 3a 20 30 7d 5d 5d 0d 0a  total)) : 0}]]..
165d0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 65 72  ..      if {$per
165e0 63 65 6e 74 20 21 3d 20 24 6c 61 73 74 50 65 72  cent != $lastPer
165f0 63 65 6e 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  cent} then {..  
16600 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
16610 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75 6e   exists ::no(run
16620 50 65 72 63 65 6e 74 29 5d 7d 20 74 68 65 6e 20  Percent)]} then 
16630 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 70  {..          rep
16640 6f 72 74 54 65 73 74 50 65 72 63 65 6e 74 20 24  ortTestPercent $
16650 63 68 61 6e 6e 65 6c 20 24 70 65 72 63 65 6e 74  channel $percent
16660 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16670 20 20 24 63 6f 75 6e 74 20 24 74 6f 74 61 6c 20    $count $total 
16680 5b 6c 6c 65 6e 67 74 68 20 24 66 61 69 6c 65 64  [llength $failed
16690 5d 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 65 61 6b  ] [llength $leak
166a0 65 64 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ed]..        }..
166b0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c 61  ..        set la
166c0 73 74 50 65 72 63 65 6e 74 20 24 70 65 72 63 65  stPercent $perce
166d0 6e 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  nt..      }.... 
166e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
166f0 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73 74 61  NOTE: If the sta
16700 72 74 69 6e 67 20 66 69 6c 65 20 6e 61 6d 65 73  rting file names
16710 20 68 61 76 65 20 62 65 65 6e 20 73 70 65 63 69   have been speci
16720 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  fied by the call
16730 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  er,..      #    
16740 20 20 20 73 6b 69 70 20 6f 76 65 72 20 61 6c 6c     skip over all
16750 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 73 20   the file names 
16760 62 65 66 6f 72 65 20 6f 6e 65 20 6f 66 20 74 68  before one of th
16770 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
16780 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
16790 20 24 73 74 61 72 74 46 69 6c 65 4e 61 6d 65 73   $startFileNames
167a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
167b0 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 76 65         if {[inve
167c0 72 73 65 4c 73 65 61 72 63 68 47 6c 6f 62 20 66  rseLsearchGlob f
167d0 61 6c 73 65 20 24 73 74 61 72 74 46 69 6c 65 4e  alse $startFileN
167e0 61 6d 65 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  ames \..        
167f0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
16800 66 69 6c 65 4e 61 6d 65 5d 5d 20 21 3d 20 2d 31  fileName]] != -1
16810 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16820 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16830 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 74 68 61   # NOTE: Now tha
16840 74 20 77 65 20 66 6f 75 6e 64 20 74 68 65 20 73  t we found the s
16850 74 61 72 74 69 6e 67 20 74 65 73 74 20 66 69 6c  tarting test fil
16860 65 20 6e 61 6d 65 2c 20 64 6f 20 6e 6f 74 0d 0a  e name, do not..
16870 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
16880 20 20 73 6b 69 70 20 61 6e 79 20 6d 6f 72 65 20    skip any more 
16890 74 65 73 74 20 66 69 6c 65 73 2e 0d 0a 20 20 20  test files...   
168a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
168b0 20 20 20 20 73 65 74 20 73 74 61 72 74 46 69 6c      set startFil
168c0 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 20  eNames [list].. 
168d0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
168e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
168f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16900 57 65 20 68 61 76 65 20 6e 6f 74 20 66 6f 75 6e  We have not foun
16910 64 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 74  d the starting t
16920 65 73 74 20 66 69 6c 65 20 6e 61 6d 65 20 79 65  est file name ye
16930 74 2c 20 73 6b 69 70 0d 0a 20 20 20 20 20 20 20  t, skip..       
16940 20 20 20 23 20 20 20 20 20 20 20 6f 76 65 72 20     #       over 
16950 74 68 69 73 20 74 65 73 74 20 66 69 6c 65 2e 0d  this test file..
16960 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
16970 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
16980 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
16990 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
169a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
169b0 66 20 74 68 65 20 73 74 6f 70 70 69 6e 67 20 66  f the stopping f
169c0 69 6c 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62  ile names have b
169d0 65 65 6e 20 73 70 65 63 69 66 69 65 64 20 62 79  een specified by
169e0 20 74 68 65 20 63 61 6c 6c 65 72 2c 0d 0a 20 20   the caller,..  
169f0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
16a00 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 20 66 69   over all the fi
16a10 6c 65 20 6e 61 6d 65 73 20 61 66 74 65 72 20 6f  le names after o
16a20 6e 65 20 6f 66 20 74 68 65 6d 2e 0d 0a 20 20 20  ne of them...   
16a30 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
16a40 5b 6c 6c 65 6e 67 74 68 20 24 73 74 6f 70 46 69  [llength $stopFi
16a50 6c 65 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68  leNames] > 0} th
16a60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
16a70 20 7b 5b 69 6e 76 65 72 73 65 4c 73 65 61 72 63   {[inverseLsearc
16a80 68 47 6c 6f 62 20 66 61 6c 73 65 20 24 73 74 6f  hGlob false $sto
16a90 70 46 69 6c 65 4e 61 6d 65 73 20 5c 0d 0a 20 20  pFileNames \..  
16aa0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
16ab0 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
16ac0 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
16ad0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16ae0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
16af0 6f 77 20 74 68 61 74 20 77 65 20 66 6f 75 6e 64  ow that we found
16b00 20 74 68 65 20 73 74 6f 70 70 69 6e 67 20 74 65   the stopping te
16b10 73 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 64 6f  st file name, do
16b20 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20   not..          
16b30 23 20 20 20 20 20 20 20 72 75 6e 20 61 6e 79 20  #       run any 
16b40 6d 6f 72 65 20 74 65 73 74 20 66 69 6c 65 73 2e  more test files.
16b50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
16b60 20 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f           set sto
16b70 70 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  pFileNames [list
16b80 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ]....          #
16b90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
16ba0 54 45 3a 20 54 68 69 73 20 77 69 6c 6c 20 74 65  TE: This will te
16bb0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
16bc0 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
16bd0 20 74 65 73 74 20 66 69 6c 65 0d 0a 20 20 20 20   test file..    
16be0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6c        #       cl
16bf0 65 61 6e 75 70 20 63 6f 64 65 20 28 69 2e 65 2e  eanup code (i.e.
16c00 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
16c10 66 20 74 68 65 20 6c 6f 6f 70 29 2e 0d 0a 20 20  f the loop)...  
16c20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16c30 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 74 72       set stop tr
16c40 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ue..        }.. 
16c50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16c60 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
16c70 20 53 6b 69 70 70 69 6e 67 20 6f 76 65 72 20 61   Skipping over a
16c80 6e 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 68 61  ny file name tha
16c90 74 20 6d 61 74 63 68 65 73 20 61 20 70 61 74 74  t matches a patt
16ca0 65 72 6e 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ern in the..    
16cb0 20 20 23 20 20 20 20 20 20 20 6c 69 73 74 20 6f    #       list o
16cc0 66 20 66 69 6c 65 20 6e 61 6d 65 73 20 74 6f 20  f file names to 
16cd0 73 6b 69 70 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  skip...      #..
16ce0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 76 65 72        if {[inver
16cf0 73 65 4c 73 65 61 72 63 68 47 6c 6f 62 20 66 61  seLsearchGlob fa
16d00 6c 73 65 20 24 73 6b 69 70 46 69 6c 65 4e 61 6d  lse $skipFileNam
16d10 65 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  es \..          
16d20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
16d30 4e 61 6d 65 5d 5d 20 3d 3d 20 2d 31 7d 20 74 68  Name]] == -1} th
16d40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
16d50 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
16d60 20 44 6f 65 73 20 74 68 65 20 66 69 6c 65 20 6e   Does the file n
16d70 61 6d 65 20 63 6f 6e 74 61 69 6e 20 64 69 72 65  ame contain dire
16d80 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
16d90 6e 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n?..        #.. 
16da0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
16db0 6e 67 20 6c 65 6e 67 74 68 20 5b 66 69 6c 65 20  ng length [file 
16dc0 64 69 72 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  dirname $fileNam
16dd0 65 5d 5d 20 3c 3d 20 31 7d 20 74 68 65 6e 20 7b  e]] <= 1} then {
16de0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
16df0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
16e00 20 49 66 20 6e 6f 74 2c 20 61 73 73 75 6d 65 20   If not, assume 
16e10 69 74 20 69 73 20 75 6e 64 65 72 20 74 68 65 20  it is under the 
16e20 73 75 70 70 6c 69 65 64 20 74 65 73 74 20 70 61  supplied test pa
16e30 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  th...          #
16e40 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
16e50 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
16e60 6f 72 6d 61 6c 69 7a 65 20 5b 66 69 6c 65 20 6a  ormalize [file j
16e70 6f 69 6e 20 24 70 61 74 68 20 24 66 69 6c 65 4e  oin $path $fileN
16e80 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ame]]..        }
16e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
16ea0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
16eb0 68 65 20 22 6d 61 67 69 63 22 20 70 61 74 74 65  he "magic" patte
16ec0 72 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  rn we are lookin
16ed0 67 20 66 6f 72 20 74 6f 20 64 65 74 65 72 6d 69  g for to determi
16ee0 6e 65 20 69 66 0d 0a 20 20 20 20 20 20 20 20 23  ne if..        #
16ef0 20 20 20 20 20 20 20 61 20 67 69 76 65 6e 20 66         a given f
16f00 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ile is part of t
16f10 68 65 20 66 6f 72 6d 61 6c 20 74 65 73 74 20 73  he formal test s
16f20 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
16f30 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 61  ..        set pa
16f40 74 74 65 72 6e 20 7b 5e 28 5c 73 29 2a 72 75 6e  ttern {^(\s)*run
16f50 54 65 73 74 20 2e 2a 24 7d 0d 0a 0d 0a 20 20 20  Test .*$}....   
16f60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16f70 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 66 69 6c  # NOTE: Skip fil
16f80 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
16f90 70 61 72 74 20 6f 66 20 74 68 65 20 74 65 73 74  part of the test
16fa0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
16fb0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
16fc0 64 61 74 61 20 5b 72 65 61 64 46 69 6c 65 20 24  data [readFile $
16fd0 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
16fe0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16ff0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
17000 72 20 61 20 6d 61 74 63 68 2e 0d 0a 20 20 20 20  r a match...    
17010 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
17020 65 74 20 6d 61 74 63 68 20 5b 72 65 67 65 78 70  et match [regexp
17030 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
17040 72 6e 20 24 64 61 74 61 5d 0d 0a 0d 0a 20 20 20  rn $data]....   
17050 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17060 23 20 4e 4f 54 45 3a 20 46 61 69 6c 69 6e 67 20  # NOTE: Failing 
17070 74 68 61 74 2c 20 69 6e 20 45 61 67 6c 65 20 6f  that, in Eagle o
17080 6e 6c 79 2c 20 63 68 65 63 6b 20 69 66 20 74 68  nly, check if th
17090 65 20 64 61 74 61 2c 20 77 68 65 6e 0d 0a 20 20  e data, when..  
170a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
170b0 74 65 72 70 72 65 74 65 64 20 61 73 20 55 6e 69  terpreted as Uni
170c0 63 6f 64 65 2c 20 6d 61 74 63 68 65 73 20 74 68  code, matches th
170d0 65 20 70 61 74 74 65 72 6e 2e 0d 0a 20 20 20 20  e pattern...    
170e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
170f0 66 20 7b 21 24 6d 61 74 63 68 20 26 26 20 5b 69  f {!$match && [i
17100 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
17110 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
17120 61 74 63 68 20 5b 72 65 67 65 78 70 20 2d 6c 69  atch [regexp -li
17130 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 5c  ne -- $pattern \
17140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17150 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72  [encoding conver
17160 74 66 72 6f 6d 20 75 6e 69 63 6f 64 65 20 24 64  tfrom unicode $d
17170 61 74 61 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ata]]..        }
17180 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
17190 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
171a0 6f 65 73 20 74 68 69 73 20 22 6c 6f 6f 6b 22 20  oes this "look" 
171b0 6c 69 6b 65 20 61 6e 20 61 63 74 75 61 6c 20 74  like an actual t
171c0 65 73 74 20 73 75 69 74 65 20 66 69 6c 65 3f 0d  est suite file?.
171d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
171e0 20 20 20 20 69 66 20 7b 24 6d 61 74 63 68 7d 20      if {$match} 
171f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
17210 20 42 55 47 46 49 58 3a 20 55 6e 73 65 74 20 74   BUGFIX: Unset t
17220 68 65 20 63 75 72 72 65 6e 74 20 74 65 73 74 20  he current test 
17230 66 69 6c 65 20 6e 61 6d 65 20 73 6f 20 74 68 61  file name so tha
17240 74 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  t variable..    
17250 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
17260 61 63 63 6f 75 6e 74 69 6e 67 20 77 6f 72 6b 73  accounting works
17270 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20   correctly.  It 
17280 77 69 6c 6c 20 62 65 20 72 65 73 65 74 20 62 65  will be reset be
17290 6c 6f 77 0d 0a 20 20 20 20 20 20 20 20 20 20 23  low..          #
172a0 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 20 74           prior t
172b0 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 61 63  o running any ac
172c0 74 75 61 6c 20 74 65 73 74 28 73 29 2e 0d 0a 20  tual test(s)... 
172d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
172e0 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
172f0 6f 6d 70 6c 61 69 6e 20 3a 3a 74 65 73 74 5f 66  omplain ::test_f
17300 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ile....         
17310 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
17320 4e 4f 54 45 3a 20 49 73 20 72 65 73 6f 75 72 63  NOTE: Is resourc
17330 65 20 6c 65 61 6b 20 63 68 65 63 6b 69 6e 67 20  e leak checking 
17340 65 78 70 6c 69 63 69 74 6c 79 20 64 69 73 61 62  explicitly disab
17350 6c 65 64 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  led?..          
17360 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
17370 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17380 3a 6e 6f 28 6c 65 61 6b 29 5d 7d 20 74 68 65 6e  :no(leak)]} then
17390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
173a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
173b0 20 4e 4f 54 45 3a 20 47 65 74 20 22 62 65 66 6f   NOTE: Get "befo
173c0 72 65 22 20 72 65 73 6f 75 72 63 65 20 63 6f 75  re" resource cou
173d0 6e 74 73 20 66 6f 72 20 6c 65 61 6b 20 74 72 61  nts for leak tra
173e0 63 6b 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  cking...        
173f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17400 20 20 20 72 65 63 6f 72 64 54 65 73 74 53 74 61     recordTestSta
17410 74 69 73 74 69 63 73 20 6c 65 61 6b 73 20 62 65  tistics leaks be
17420 66 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  fore..          
17430 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
17440 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
17450 54 45 3a 20 4c 65 74 20 74 68 65 20 74 65 73 74  TE: Let the test
17460 20 70 72 6f 6c 6f 67 75 65 20 63 6f 64 65 20 6b   prologue code k
17470 6e 6f 77 20 77 68 69 63 68 20 66 69 6c 65 20 77  now which file w
17480 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  e are..         
17490 20 23 20 20 20 20 20 20 20 65 76 61 6c 75 61 74   #       evaluat
174a0 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
174b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
174c0 20 3a 3a 74 65 73 74 5f 66 69 6c 65 20 24 66 69   ::test_file $fi
174d0 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20  leName....      
174e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
174f0 20 23 20 4e 4f 54 45 3a 20 52 65 63 6f 72 64 20   # NOTE: Record 
17500 66 61 69 6c 65 64 20 74 65 73 74 20 63 6f 75 6e  failed test coun
17510 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  t before this fi
17520 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
17530 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
17540 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20  [isEagle]} then 
17550 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
17560 65 74 20 62 65 66 6f 72 65 20 24 3a 3a 65 61 67  et before $::eag
17570 6c 65 5f 74 65 73 74 73 28 46 61 69 6c 65 64 29  le_tests(Failed)
17580 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
17590 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
175a0 20 20 73 65 74 20 62 65 66 6f 72 65 20 24 3a 3a    set before $::
175b0 74 63 6c 74 65 73 74 3a 3a 6e 75 6d 54 65 73 74  tcltest::numTest
175c0 73 28 46 61 69 6c 65 64 29 0d 0a 20 20 20 20 20  s(Failed)..     
175d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
175e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
175f0 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
17600 65 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 2c  e the test file,
17610 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 77 61 69 74   optionally wait
17620 69 6e 67 20 66 6f 72 20 61 20 63 65 72 74 61 69  ing for a certai
17630 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  n..          #  
17640 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 6d       number of m
17650 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
17660 72 65 20 61 6e 64 2f 6f 72 20 61 66 74 65 72 20  re and/or after 
17670 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20  doing so...     
17680 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17690 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
176a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
176b0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
176c0 45 3a 20 41 72 65 20 77 65 20 62 65 69 6e 67 20  E: Are we being 
176d0 70 72 65 76 65 6e 74 65 64 20 66 72 6f 6d 20 77  prevented from w
176e0 61 69 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68  aiting before th
176f0 65 20 66 69 6c 65 3f 0d 0a 20 20 20 20 20 20 20  e file?..       
17700 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17710 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
17720 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 65 57 61  xists ::no(preWa
17730 69 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  it)]} then {..  
17740 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17750 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
17760 65 73 74 5f 77 61 69 74 28 70 72 65 29 5d 20 26  est_wait(pre)] &
17770 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
17780 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 69         [string i
17790 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
177a0 74 20 24 3a 3a 74 65 73 74 5f 77 61 69 74 28 70  t $::test_wait(p
177b0 72 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  re)]} then {..  
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
177d0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
177e0 3a 3a 6e 6f 28 72 75 6e 4d 65 74 61 64 61 74 61  ::no(runMetadata
177f0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
17810 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17820 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 22 2d 2d 2d 2d 20 77 61 69 74 69 6e 67 20    "---- waiting 
17850 66 6f 72 20 22 20 24 3a 3a 74 65 73 74 5f 77 61  for " $::test_wa
17860 69 74 28 70 72 65 29 20 5c 0d 0a 20 20 20 20 20  it(pre) \..     
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20   " milliseconds 
17890 62 65 66 6f 72 65 20 74 65 73 74 20 66 69 6c 65  before test file
178a0 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ...\n"]..       
178b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
178d0 74 65 72 20 24 3a 3a 74 65 73 74 5f 77 61 69 74  ter $::test_wait
178e0 28 70 72 65 29 3b 20 23 20 4e 4f 54 45 3a 20 53  (pre); # NOTE: S
178f0 6c 65 65 70 2e 0d 0a 20 20 20 20 20 20 20 20 20  leep...         
17900 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17910 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17920 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17930 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 67 20      # NOTE: Log 
17940 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 66  that this test f
17950 69 6c 65 20 68 61 73 20 73 74 61 72 74 65 64 2e  ile has started.
17960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
17970 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17980 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17990 3a 6e 6f 28 72 75 6e 53 74 61 72 74 46 69 6c 65  :no(runStartFile
179a0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
179b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
179c0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
179d0 41 72 67 73 20 22 3d 3d 3d 3d 20 5c 22 22 20 24  Args "==== \"" $
179e0 66 69 6c 65 4e 61 6d 65 20 22 5c 22 20 53 54 41  fileName "\" STA
179f0 52 54 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  RT\n"]..        
17a00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17a10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17a20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
17a30 75 61 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e  uate the file in
17a40 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
17a50 74 68 65 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20  the caller,..   
17a60 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17a70 20 63 61 74 63 68 69 6e 67 20 61 6e 79 20 65 72   catching any er
17a80 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
17a90 6f 72 20 69 73 20 72 61 69 73 65 64 20 61 6e 64  or is raised and
17aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
17ab0 20 20 20 20 20 20 74 68 65 20 73 74 6f 70 2d 6f        the stop-o
17ac0 6e 2d 66 61 69 6c 75 72 65 20 66 6c 61 67 20 69  n-failure flag i
17ad0 73 20 73 65 74 2c 20 61 73 73 75 6d 65 20 69 74  s set, assume it
17ae0 20 77 61 73 0d 0a 20 20 20 20 20 20 20 20 20 20   was..          
17af0 20 20 23 20 20 20 20 20 20 20 61 20 74 65 73 74    #       a test
17b00 20 66 61 69 6c 75 72 65 20 61 6e 64 20 74 68 61   failure and tha
17b10 74 20 77 65 20 6e 65 65 64 20 74 6f 20 73 74 6f  t we need to sto
17b20 70 20 61 6e 79 20 61 6e 64 0d 0a 20 20 20 20 20  p any and..     
17b30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
17b40 6c 6c 20 66 75 72 74 68 65 72 20 70 72 6f 63 65  ll further proce
17b50 73 73 69 6e 67 20 6f 66 20 74 65 73 74 20 66 69  ssing of test fi
17b60 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  les...          
17b70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17b80 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
17b90 20 73 6f 75 72 63 65 20 24 66 69 6c 65 4e 61 6d   source $fileNam
17ba0 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
17bb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17bc0 20 23 20 4e 4f 54 45 3a 20 4c 6f 67 20 74 68 61   # NOTE: Log tha
17bd0 74 20 74 68 69 73 20 74 65 73 74 20 66 69 6c 65  t this test file
17be0 20 68 61 73 20 65 6e 64 65 64 2e 0d 0a 20 20 20   has ended...   
17bf0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17c00 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17c10 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 72  fo exists ::no(r
17c20 75 6e 45 6e 64 46 69 6c 65 29 5d 7d 20 74 68 65  unEndFile)]} the
17c30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17c40 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17c50 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 3d  l [appendArgs "=
17c60 3d 3d 3d 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  === \"" $fileNam
17c70 65 20 22 5c 22 20 45 4e 44 5c 6e 22 5d 0d 0a 20  e "\" END\n"].. 
17c80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17c90 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17ca0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
17cb0 45 3a 20 41 72 65 20 77 65 20 62 65 69 6e 67 20  E: Are we being 
17cc0 70 72 65 76 65 6e 74 65 64 20 66 72 6f 6d 20 77  prevented from w
17cd0 61 69 74 69 6e 67 20 61 66 74 65 72 20 74 68 65  aiting after the
17ce0 20 66 69 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20   file?..        
17cf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17d00 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17d10 69 73 74 73 20 3a 3a 6e 6f 28 70 6f 73 74 57 61  ists ::no(postWa
17d20 69 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  it)]} then {..  
17d30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17d40 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
17d50 65 73 74 5f 77 61 69 74 28 70 6f 73 74 29 5d 20  est_wait(post)] 
17d60 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
17d70 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
17d80 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69  is integer -stri
17d90 63 74 20 24 3a 3a 74 65 73 74 5f 77 61 69 74 28  ct $::test_wait(
17da0 70 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  post)]} then {..
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dc0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17dd0 73 20 3a 3a 6e 6f 28 72 75 6e 4d 65 74 61 64 61  s ::no(runMetada
17de0 74 61 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ta)]} then {..  
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17e10 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 20 20 22 2d 2d 2d 2d 20 77 61 69 74 69 6e      "---- waitin
17e40 67 20 66 6f 72 20 22 20 24 3a 3a 74 65 73 74 5f  g for " $::test_
17e50 77 61 69 74 28 70 6f 73 74 29 20 5c 0d 0a 20 20  wait(post) \..  
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 20 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e      " millisecon
17e80 64 73 20 61 66 74 65 72 20 74 65 73 74 20 66 69  ds after test fi
17e90 6c 65 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20  le...\n"]..     
17ea0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 61 66 74 65 72 20 24 3a 3a 74 65 73 74 5f 77 61  after $::test_wa
17ed0 69 74 28 70 6f 73 74 29 3b 20 23 20 4e 4f 54 45  it(post); # NOTE
17ee0 3a 20 53 6c 65 65 70 2e 0d 0a 20 20 20 20 20 20  : Sleep...      
17ef0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17f00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17f10 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
17f20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17f30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17f40 20 23 20 4e 4f 54 45 3a 20 4d 6f 73 74 20 6c 69   # NOTE: Most li
17f50 6b 65 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  kely, this error
17f60 20 77 61 73 20 63 61 75 73 65 64 20 62 79 20 6d   was caused by m
17f70 61 6c 66 6f 72 6d 65 64 20 6f 72 0d 0a 20 20 20  alformed or..   
17f80 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17f90 20 69 6e 63 6f 72 72 65 63 74 20 63 6f 64 65 20   incorrect code 
17fa0 69 6e 2d 62 65 74 77 65 65 6e 20 74 68 65 20 74  in-between the t
17fb0 65 73 74 73 20 74 68 65 6d 73 65 6c 76 65 73 2e  ests themselves.
17fc0 20 20 57 65 0d 0a 20 20 20 20 20 20 20 20 20 20    We..          
17fd0 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 20 74    #       need t
17fe0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 2e 0d 0a  o report this...
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18000 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
18010 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
18020 6f 28 72 75 6e 45 72 72 6f 72 46 69 6c 65 29 5d  o(runErrorFile)]
18030 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18040 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
18050 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18060 67 73 20 22 3d 3d 3d 3d 20 5c 22 22 20 24 66 69  gs "==== \"" $fi
18070 6c 65 4e 61 6d 65 20 22 5c 22 20 45 52 52 4f 52  leName "\" ERROR
18080 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
18090 20 20 20 20 20 20 20 20 20 20 24 65 72 72 6f 72            $error
180a0 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
180b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
180c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
180d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 70      # NOTE: Stop
180e0 20 66 75 72 74 68 65 72 20 70 72 6f 63 65 73 73   further process
180f0 69 6e 67 20 61 66 74 65 72 20 74 68 69 73 20 6c  ing after this l
18100 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 3f 0d 0a  oop iteration?..
18110 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18120 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18130 69 73 53 74 6f 70 4f 6e 46 61 69 6c 75 72 65 5d  isStopOnFailure]
18140 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18150 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18160 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18170 20 54 68 69 73 20 77 69 6c 6c 20 74 65 72 6d 69   This will termi
18180 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 72 69  nate the loop ri
18190 67 68 74 20 61 66 74 65 72 20 74 68 65 20 74 65  ght after the te
181a0 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
181b0 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 63    #       file c
181c0 6c 65 61 6e 75 70 20 63 6f 64 65 20 28 69 2e 65  leanup code (i.e
181d0 2e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  . at the bottom 
181e0 6f 66 20 74 68 65 20 6c 6f 6f 70 29 2e 0d 0a 20  of the loop)... 
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
18210 74 20 73 74 6f 70 20 74 72 75 65 0d 0a 0d 0a 20  t stop true.... 
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18240 42 55 47 46 49 58 3a 20 49 66 20 74 68 65 72 65  BUGFIX: If there
18250 20 61 72 65 20 6e 6f 20 61 63 74 75 61 6c 20 74   are no actual t
18260 65 73 74 20 66 61 69 6c 75 72 65 73 20 72 65 63  est failures rec
18270 6f 72 64 65 64 20 79 65 74 2c 0d 0a 20 20 20 20  orded yet,..    
18280 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18290 20 20 20 20 6d 61 6b 65 20 73 75 72 65 20 74 68      make sure th
182a0 65 72 65 20 69 73 20 6f 6e 65 20 6e 6f 77 2e 20  ere is one now. 
182b0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
182c0 72 79 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 20  ry to..         
182d0 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 68       #         h
182e0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 77  andle the case w
182f0 68 65 72 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  here an error oc
18300 63 75 72 73 20 69 6e 20 61 20 74 65 73 74 0d 0a  curs in a test..
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18320 20 20 20 20 20 20 20 20 66 69 6c 65 20 74 68 61          file tha
18330 74 20 64 6f 65 73 20 6e 6f 74 20 64 69 72 65 63  t does not direc
18340 74 6c 79 20 63 61 75 73 65 20 61 74 20 6c 65 61  tly cause at lea
18350 73 74 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  st one of..     
18360 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
18370 20 20 20 69 74 73 20 63 6f 6e 74 61 69 6e 65 64     its contained
18380 20 74 65 73 74 73 20 74 6f 20 66 61 69 6c 2e 20   tests to fail. 
18390 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
183a0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  test..          
183b0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75      #         su
183c0 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62  ite will still b
183d0 65 20 73 74 6f 70 70 65 64 3b 20 68 6f 77 65 76  e stopped; howev
183e0 65 72 2c 20 61 6e 20 6f 76 65 72 61 6c 6c 0d 0a  er, an overall..
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18400 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f          result o
18410 66 20 73 75 63 63 65 73 73 20 77 69 6c 6c 20 62  f success will b
18420 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
18430 65 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  e process...    
18440 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18450 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18460 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
18470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18480 20 20 69 66 20 7b 24 3a 3a 65 61 67 6c 65 5f 74    if {$::eagle_t
18490 65 73 74 73 28 46 61 69 6c 65 64 29 20 3d 3d 20  ests(Failed) == 
184a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63               inc
184c0 72 20 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28  r ::eagle_tests(
184d0 54 6f 74 61 6c 29 0d 0a 20 20 20 20 20 20 20 20  Total)..        
184e0 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 3a            incr :
184f0 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 46 61 69  :eagle_tests(Fai
18500 6c 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20  led)..          
18510 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18520 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
18530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18540 20 69 66 20 7b 24 3a 3a 74 63 6c 74 65 73 74 3a   if {$::tcltest:
18550 3a 6e 75 6d 54 65 73 74 73 28 46 61 69 6c 65 64  :numTests(Failed
18560 29 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ) == 0} then {..
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 69 6e 63 72 20 3a 3a 74 63 6c 74 65 73 74    incr ::tcltest
18590 3a 3a 6e 75 6d 54 65 73 74 73 28 54 6f 74 61 6c  ::numTests(Total
185a0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
185b0 20 20 20 20 20 69 6e 63 72 20 3a 3a 74 63 6c 74       incr ::tclt
185c0 65 73 74 3a 3a 6e 75 6d 54 65 73 74 73 28 46 61  est::numTests(Fa
185d0 69 6c 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  iled)..         
185e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
185f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18600 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
18610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18630 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20  # NOTE: At this 
18640 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
18650 68 65 20 74 65 73 74 20 66 69 6c 65 20 68 61 64  he test file had
18660 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74 0d 0a   an error that..
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18680 20 20 20 20 20 20 70 72 6f 62 61 62 6c 79 20 63        probably c
18690 61 75 73 65 64 20 69 74 20 74 6f 20 73 6b 69 70  aused it to skip
186a0 20 61 20 62 75 6e 63 68 20 6f 66 20 74 65 73 74   a bunch of test
186b0 73 20 2d 41 4e 44 2d 20 74 68 65 0d 0a 20 20 20  s -AND- the..   
186c0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
186d0 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20 73 74 6f     option to sto
186e0 70 2d 74 65 73 74 69 6e 67 2d 6f 6e 2d 65 72 72  p-testing-on-err
186f0 6f 72 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  or is not enable
18700 64 2e 20 20 54 68 61 74 0d 0a 20 20 20 20 20 20  d.  That..      
18710 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18720 62 65 69 6e 67 20 73 61 69 64 2c 20 77 65 20 6d  being said, we m
18730 75 73 74 20 6e 6f 74 20 73 69 6d 70 6c 79 20 69  ust not simply i
18740 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e  gnore the error.
18750 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 20    The..         
18760 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 76 65       #       ove
18770 72 61 6c 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  rall results of 
18780 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 72  the test suite r
18790 75 6e 20 6d 75 73 74 20 6e 6f 77 20 72 65 66 6c  un must now refl
187a0 65 63 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ect..           
187b0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
187c0 61 69 6c 75 72 65 2e 20 20 53 65 74 20 61 20 73  ailure.  Set a s
187d0 70 65 63 69 61 6c 20 76 61 72 69 61 62 6c 65 20  pecial variable 
187e0 66 6f 72 20 74 68 65 20 65 70 69 6c 6f 67 75 65  for the epilogue
187f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18800 23 20 20 20 20 20 20 20 74 6f 20 70 69 63 6b 20  #       to pick 
18810 75 70 20 6f 6e 20 28 6c 61 74 65 72 29 2e 0d 0a  up on (later)...
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
18840 61 70 70 65 6e 64 20 3a 3a 74 65 73 74 5f 73 75  append ::test_su
18850 69 74 65 5f 65 72 72 6f 72 73 20 5b 6c 69 73 74  ite_errors [list
18860 20 24 66 69 6c 65 4e 61 6d 65 20 24 65 72 72 6f   $fileName $erro
18870 72 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r]..            
18880 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
18890 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
188a0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
188b0 20 52 65 63 6f 72 64 20 66 61 69 6c 65 64 20 74   Record failed t
188c0 65 73 74 20 63 6f 75 6e 74 20 61 66 74 65 72 20  est count after 
188d0 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20  this file...    
188e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
188f0 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
18900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18910 20 20 20 20 20 20 73 65 74 20 61 66 74 65 72 20        set after 
18920 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 46  $::eagle_tests(F
18930 61 69 6c 65 64 29 0d 0a 20 20 20 20 20 20 20 20  ailed)..        
18940 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18950 20 20 20 20 20 20 20 20 73 65 74 20 61 66 74 65          set afte
18960 72 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 6e 75  r $::tcltest::nu
18970 6d 54 65 73 74 73 28 46 61 69 6c 65 64 29 0d 0a  mTests(Failed)..
18980 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
18990 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
189a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69        # NOTE: Di
189b0 64 20 74 68 69 73 20 66 69 6c 65 20 68 61 76 65  d this file have
189c0 20 61 6e 79 20 66 61 69 6c 69 6e 67 20 74 65 73   any failing tes
189d0 74 73 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts?..          #
189e0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
189f0 24 61 66 74 65 72 20 3e 20 24 62 65 66 6f 72 65  $after > $before
18a00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18a10 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 66 61        lappend fa
18a20 69 6c 65 64 20 5b 66 69 6c 65 20 74 61 69 6c 20  iled [file tail 
18a30 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
18a40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18a50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18a60 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 74 65 72    # NOTE: In ter
18a70 6d 73 20 6f 66 20 66 69 6c 65 73 2c 20 6e 6f 74  ms of files, not
18a80 20 74 65 73 74 73 2c 20 77 68 61 74 20 70 65 72   tests, what per
18a90 63 65 6e 74 20 64 6f 6e 65 20 61 72 65 20 77 65  cent done are we
18aa0 20 6e 6f 77 3f 0d 0a 20 20 20 20 20 20 20 20 20   now?..         
18ab0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
18ac0 74 20 70 65 72 63 65 6e 74 20 5b 66 6f 72 6d 61  t percent [forma
18ad0 74 44 65 63 69 6d 61 6c 20 5c 0d 0a 20 20 20 20  tDecimal \..    
18ae0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
18af0 7b 24 74 6f 74 61 6c 20 21 3d 20 30 20 3f 20 31  {$total != 0 ? 1
18b00 30 30 2e 30 20 2a 20 28 24 63 6f 75 6e 74 20 2f  00.0 * ($count /
18b10 20 64 6f 75 62 6c 65 28 24 74 6f 74 61 6c 29 29   double($total))
18b20 20 3a 20 30 7d 5d 5d 0d 0a 0d 0a 20 20 20 20 20   : 0}]]....     
18b30 20 20 20 20 20 69 66 20 7b 24 70 65 72 63 65 6e       if {$percen
18b40 74 20 21 3d 20 24 6c 61 73 74 50 65 72 63 65 6e  t != $lastPercen
18b50 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
18b60 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
18b70 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75  o exists ::no(ru
18b80 6e 50 65 72 63 65 6e 74 29 5d 7d 20 74 68 65 6e  nPercent)]} then
18b90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18ba0 20 20 72 65 70 6f 72 74 54 65 73 74 50 65 72 63    reportTestPerc
18bb0 65 6e 74 20 24 63 68 61 6e 6e 65 6c 20 24 70 65  ent $channel $pe
18bc0 72 63 65 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  rcent \..       
18bd0 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 75 6e             $coun
18be0 74 20 24 74 6f 74 61 6c 20 5b 6c 6c 65 6e 67 74  t $total [llengt
18bf0 68 20 24 66 61 69 6c 65 64 5d 20 5b 6c 6c 65 6e  h $failed] [llen
18c00 67 74 68 20 24 6c 65 61 6b 65 64 5d 0d 0a 20 20  gth $leaked]..  
18c10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
18c20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c             set l
18c30 61 73 74 50 65 72 63 65 6e 74 20 24 70 65 72 63  astPercent $perc
18c40 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ent..          }
18c50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
18c60 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
18c70 45 3a 20 55 6e 73 65 74 20 74 68 65 20 63 75 72  E: Unset the cur
18c80 72 65 6e 74 20 74 65 73 74 20 66 69 6c 65 20 6e  rent test file n
18c90 61 6d 65 2c 20 69 74 20 69 73 20 6e 6f 20 6c 6f  ame, it is no lo
18ca0 6e 67 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  nger..          
18cb0 23 20 20 20 20 20 20 20 6e 65 65 64 65 64 2e 0d  #       needed..
18cc0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
18cd0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
18ce0 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 74 65 73 74  ocomplain ::test
18cf0 5f 66 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20  _file....       
18d00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18d10 23 20 4e 4f 54 45 3a 20 49 73 20 72 65 73 6f 75  # NOTE: Is resou
18d20 72 63 65 20 6c 65 61 6b 20 63 68 65 63 6b 69 6e  rce leak checkin
18d30 67 20 65 78 70 6c 69 63 69 74 6c 79 20 64 69 73  g explicitly dis
18d40 61 62 6c 65 64 3f 0d 0a 20 20 20 20 20 20 20 20  abled?..        
18d50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
18d60 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
18d70 20 3a 3a 6e 6f 28 6c 65 61 6b 29 5d 7d 20 74 68   ::no(leak)]} th
18d80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18d90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18da0 20 23 20 4e 4f 54 45 3a 20 47 65 74 20 22 61 66   # NOTE: Get "af
18db0 74 65 72 22 20 72 65 73 6f 75 72 63 65 20 63 6f  ter" resource co
18dc0 75 6e 74 73 20 66 6f 72 20 6c 65 61 6b 20 74 72  unts for leak tr
18dd0 61 63 6b 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  acking...       
18de0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18df0 20 20 20 20 72 65 63 6f 72 64 54 65 73 74 53 74      recordTestSt
18e00 61 74 69 73 74 69 63 73 20 6c 65 61 6b 73 20 61  atistics leaks a
18e10 66 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fter....        
18e20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
18e30 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75 6e 53 74  xists ::no(runSt
18e40 61 74 69 73 74 69 63 73 29 5d 7d 20 74 68 65 6e  atistics)]} then
18e50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18e60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18e70 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
18e80 6d 69 6e 65 20 69 66 20 61 6e 79 20 72 65 73 6f  mine if any reso
18e90 75 72 63 65 20 6c 65 61 6b 73 20 68 61 76 65 20  urce leaks have 
18ea0 6f 63 63 75 72 72 65 64 20 61 6e 64 0d 0a 20 20  occurred and..  
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
18ec0 20 20 20 20 6f 75 74 70 75 74 20 64 69 61 67 6e      output diagn
18ed0 6f 73 74 69 63 73 20 61 73 20 6e 65 63 65 73 73  ostics as necess
18ee0 61 72 79 20 69 66 20 74 68 65 79 20 68 61 76 65  ary if they have
18ef0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
18f00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
18f10 20 20 72 65 70 6f 72 74 54 65 73 74 53 74 61 74    reportTestStat
18f20 69 73 74 69 63 73 20 24 63 68 61 6e 6e 65 6c 20  istics $channel 
18f30 24 66 69 6c 65 4e 61 6d 65 20 24 73 74 6f 70 20  $fileName $stop 
18f40 6c 65 61 6b 73 20 6c 65 61 6b 65 64 0d 0a 20 20  leaks leaked..  
18f50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18f60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18f70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18f80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18f90 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
18fa0 65 6e 74 69 72 65 20 66 69 6c 65 20 68 61 73 20  entire file has 
18fb0 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 20 20 52  been skipped.  R
18fc0 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
18fd0 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  in the..        
18fe0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
18ff0 75 69 74 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  uite log file...
19000 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19010 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
19020 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75  o exists ::no(ru
19030 6e 4e 6f 6e 54 65 73 74 46 69 6c 65 29 5d 7d 20  nNonTestFile)]} 
19040 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19050 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
19060 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
19070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19080 20 20 22 3d 3d 3d 3d 20 5c 22 22 20 24 66 69 6c    "==== \"" $fil
19090 65 4e 61 6d 65 20 22 5c 22 20 4e 4f 4e 5f 54 45  eName "\" NON_TE
190a0 53 54 5f 46 49 4c 45 5c 6e 22 5d 0d 0a 20 20 20  ST_FILE\n"]..   
190b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
190c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
190d0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
190e0 3a 20 41 6e 6f 74 68 65 72 20 66 69 6c 65 20 6f  : Another file o
190f0 66 20 73 6f 6d 65 20 6b 69 6e 64 20 77 61 73 20  f some kind was 
19100 70 72 6f 63 65 73 73 65 64 2e 20 20 49 74 20 6d  processed.  It m
19110 61 79 20 68 61 76 65 20 62 65 65 6e 0d 0a 20 20  ay have been..  
19120 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
19130 69 70 70 65 64 3b 20 68 6f 77 65 76 65 72 2c 20  ipped; however, 
19140 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
19150 74 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  tter...        #
19160 0d 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 63  ..        incr c
19170 6f 75 6e 74 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ount....        
19180 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19190 45 3a 20 49 6e 20 74 65 72 6d 73 20 6f 66 20 66  E: In terms of f
191a0 69 6c 65 73 2c 20 6e 6f 74 20 74 65 73 74 73 2c  iles, not tests,
191b0 20 77 68 61 74 20 70 65 72 63 65 6e 74 20 64 6f   what percent do
191c0 6e 65 20 61 72 65 20 77 65 20 6e 6f 77 3f 0d 0a  ne are we now?..
191d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
191e0 20 20 20 73 65 74 20 70 65 72 63 65 6e 74 20 5b     set percent [
191f0 66 6f 72 6d 61 74 44 65 63 69 6d 61 6c 20 5c 0d  formatDecimal \.
19200 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
19210 70 72 20 7b 24 74 6f 74 61 6c 20 21 3d 20 30 20  pr {$total != 0 
19220 3f 20 31 30 30 2e 30 20 2a 20 28 24 63 6f 75 6e  ? 100.0 * ($coun
19230 74 20 2f 20 64 6f 75 62 6c 65 28 24 74 6f 74 61  t / double($tota
19240 6c 29 29 20 3a 20 30 7d 5d 5d 0d 0a 0d 0a 20 20  l)) : 0}]]....  
19250 20 20 20 20 20 20 69 66 20 7b 24 70 65 72 63 65        if {$perce
19260 6e 74 20 21 3d 20 24 6c 61 73 74 50 65 72 63 65  nt != $lastPerce
19270 6e 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  nt} then {..    
19280 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
19290 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75 6e   exists ::no(run
192a0 50 65 72 63 65 6e 74 29 5d 7d 20 74 68 65 6e 20  Percent)]} then 
192b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
192c0 65 70 6f 72 74 54 65 73 74 50 65 72 63 65 6e 74  eportTestPercent
192d0 20 24 63 68 61 6e 6e 65 6c 20 24 70 65 72 63 65   $channel $perce
192e0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
192f0 20 20 20 20 20 20 24 63 6f 75 6e 74 20 24 74 6f        $count $to
19300 74 61 6c 20 5b 6c 6c 65 6e 67 74 68 20 24 66 61  tal [llength $fa
19310 69 6c 65 64 5d 20 5b 6c 6c 65 6e 67 74 68 20 24  iled] [llength $
19320 6c 65 61 6b 65 64 5d 0d 0a 20 20 20 20 20 20 20  leaked]..       
19330 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19340 20 20 73 65 74 20 6c 61 73 74 50 65 72 63 65 6e    set lastPercen
19350 74 20 24 70 65 72 63 65 6e 74 0d 0a 20 20 20 20  t $percent..    
19360 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19370 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19380 54 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20  TE: If the test 
19390 66 69 6c 65 20 72 61 69 73 65 64 20 61 6e 20 65  file raised an e
193a0 72 72 6f 72 20 28 69 2e 65 2e 20 74 6f 20 69 6e  rror (i.e. to in
193b0 64 69 63 61 74 65 20 61 0d 0a 20 20 20 20 20 20  dicate a..      
193c0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 66    #       test f
193d0 61 69 6c 75 72 65 20 77 69 74 68 20 74 68 65 20  ailure with the 
193e0 73 74 6f 70 2d 6f 6e 2d 66 61 69 6c 75 72 65 20  stop-on-failure 
193f0 66 6c 61 67 20 65 6e 61 62 6c 65 64 29 2c 0d 0a  flag enabled),..
19400 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19410 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
19420 20 74 65 73 74 20 6c 6f 6f 70 20 6e 6f 77 2e 0d   test loop now..
19430 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19440 20 20 20 20 69 66 20 7b 24 73 74 6f 70 7d 20 74      if {$stop} t
19450 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19460 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20   break..        
19470 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
19480 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19490 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
194a0 69 73 20 65 6e 74 69 72 65 20 66 69 6c 65 20 68  is entire file h
194b0 61 73 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e  as been skipped.
194c0 20 20 52 65 63 6f 72 64 20 74 68 61 74 20 66 61    Record that fa
194d0 63 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ct in the..     
194e0 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
194f0 73 75 69 74 65 20 6c 6f 67 20 66 69 6c 65 2e 0d  suite log file..
19500 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19510 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
19520 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75 6e 53 6b  xists ::no(runSk
19530 69 70 70 65 64 46 69 6c 65 29 5d 7d 20 74 68 65  ippedFile)]} the
19540 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
19550 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19560 70 70 65 6e 64 41 72 67 73 20 22 3d 3d 3d 3d 20  ppendArgs "==== 
19570 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 22 5c  \"" $fileName "\
19580 22 20 53 4b 49 50 50 45 44 5c 6e 22 5d 0d 0a 20  " SKIPPED\n"].. 
19590 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
195a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
195b0 20 4e 4f 54 45 3a 20 54 68 69 73 20 66 69 6c 65   NOTE: This file
195c0 20 77 61 73 20 73 6b 69 70 70 65 64 2e 0d 0a 20   was skipped... 
195d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
195e0 20 20 69 6e 63 72 20 63 6f 75 6e 74 0d 0a 20 20    incr count..  
195f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
19600 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19610 49 6e 20 74 65 72 6d 73 20 6f 66 20 66 69 6c 65  In terms of file
19620 73 2c 20 6e 6f 74 20 74 65 73 74 73 2c 20 77 68  s, not tests, wh
19630 61 74 20 70 65 72 63 65 6e 74 20 64 6f 6e 65 20  at percent done 
19640 61 72 65 20 77 65 20 6e 6f 77 3f 0d 0a 20 20 20  are we now?..   
19650 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
19660 70 65 72 63 65 6e 74 20 5b 66 6f 72 6d 61 74 44  percent [formatD
19670 65 63 69 6d 61 6c 20 5c 0d 0a 20 20 20 20 20 20  ecimal \..      
19680 20 20 20 20 5b 65 78 70 72 20 7b 24 74 6f 74 61      [expr {$tota
19690 6c 20 21 3d 20 30 20 3f 20 31 30 30 2e 30 20 2a  l != 0 ? 100.0 *
196a0 20 28 24 63 6f 75 6e 74 20 2f 20 64 6f 75 62 6c   ($count / doubl
196b0 65 28 24 74 6f 74 61 6c 29 29 20 3a 20 30 7d 5d  e($total)) : 0}]
196c0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  ]....      if {$
196d0 70 65 72 63 65 6e 74 20 21 3d 20 24 6c 61 73 74  percent != $last
196e0 50 65 72 63 65 6e 74 7d 20 74 68 65 6e 20 7b 0d  Percent} then {.
196f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
19700 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
19710 72 75 6e 50 65 72 63 65 6e 74 29 5d 7d 20 74 68  runPercent)]} th
19720 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19730 72 65 70 6f 72 74 54 65 73 74 50 65 72 63 65 6e  reportTestPercen
19740 74 20 24 63 68 61 6e 6e 65 6c 20 24 70 65 72 63  t $channel $perc
19750 65 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ent \..         
19760 20 20 20 20 20 24 63 6f 75 6e 74 20 24 74 6f 74       $count $tot
19770 61 6c 20 5b 6c 6c 65 6e 67 74 68 20 24 66 61 69  al [llength $fai
19780 6c 65 64 5d 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  led] [llength $l
19790 65 61 6b 65 64 5d 0d 0a 20 20 20 20 20 20 20 20  eaked]..        
197a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
197b0 20 6c 61 73 74 50 65 72 63 65 6e 74 20 24 70 65   lastPercent $pe
197c0 72 63 65 6e 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  rcent..      }..
197d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a      }....    #..
197e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 73 65      # NOTE: Rese
197f0 74 20 74 68 65 20 68 6f 73 74 20 74 69 74 6c 65  t the host title
19800 20 62 65 63 61 75 73 65 20 77 65 20 6d 61 79 20   because we may 
19810 68 61 76 65 20 63 68 61 6e 67 65 64 20 69 74 20  have changed it 
19820 69 6e 20 74 68 65 20 66 6f 72 0d 0a 20 20 20 20  in the for..    
19830 23 20 20 20 20 20 20 20 6c 6f 6f 70 20 28 61 62  #       loop (ab
19840 6f 76 65 29 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ove)...    #..  
19850 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
19860 73 74 73 20 3a 3a 6e 6f 28 72 75 6e 50 65 72 63  sts ::no(runPerc
19870 65 6e 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ent)]} then {.. 
19880 20 20 20 20 20 63 6c 65 61 72 54 65 73 74 50 65       clearTestPe
19890 72 63 65 6e 74 20 24 63 68 61 6e 6e 65 6c 0d 0a  rcent $channel..
198a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20      }....    if 
198b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
198c0 3a 6e 6f 28 72 75 6e 4d 65 74 61 64 61 74 61 29  :no(runMetadata)
198d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
198e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
198f0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
19900 2d 20 73 6f 75 72 63 65 64 20 22 20 24 63 6f 75  - sourced " $cou
19910 6e 74 20 22 20 74 65 73 74 20 22 20 5c 0d 0a 20  nt " test " \.. 
19920 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
19930 24 63 6f 75 6e 74 20 3e 20 31 20 3f 20 22 66 69  $count > 1 ? "fi
19940 6c 65 73 22 20 3a 20 22 66 69 6c 65 22 7d 5d 20  les" : "file"}] 
19950 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  \n]....      #..
19960 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
19970 6f 77 20 74 68 65 20 66 69 6c 65 73 20 74 68 61  ow the files tha
19980 74 20 68 61 64 20 66 61 69 6c 69 6e 67 20 61 6e  t had failing an
19990 64 2f 6f 72 20 6c 65 61 6b 69 6e 67 20 74 65 73  d/or leaking tes
199a0 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
199b0 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
199c0 20 24 66 61 69 6c 65 64 5d 20 3e 20 30 7d 20 74   $failed] > 0} t
199d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
199e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
199f0 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
19a00 66 69 6c 65 73 20 77 69 74 68 20 66 61 69 6c 69  files with faili
19a10 6e 67 20 74 65 73 74 73 3a 20 22 20 5c 0d 0a 20  ng tests: " \.. 
19a20 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
19a30 61 74 4c 69 73 74 20 24 66 61 69 6c 65 64 5d 20  atList $failed] 
19a40 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
19a50 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
19a60 74 68 20 24 6c 65 61 6b 65 64 5d 20 3e 20 30 7d  th $leaked] > 0}
19a70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19a80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19a90 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
19aa0 2d 20 66 69 6c 65 73 20 77 69 74 68 20 6c 65 61  - files with lea
19ab0 6b 69 6e 67 20 74 65 73 74 73 3a 20 22 20 5c 0d  king tests: " \.
19ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f  .            [fo
19ad0 72 6d 61 74 4c 69 73 74 20 24 6c 65 61 6b 65 64  rmatList $leaked
19ae0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
19af0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20      }....    if 
19b00 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
19b10 3a 6e 6f 28 72 75 6e 53 74 61 74 69 73 74 69 63  :no(runStatistic
19b20 43 6f 75 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  Counts)]} then {
19b30 0d 0a 20 20 20 20 20 20 72 65 70 6f 72 74 54 65  ..      reportTe
19b40 73 74 53 74 61 74 69 73 74 69 63 43 6f 75 6e 74  stStatisticCount
19b50 73 20 24 63 68 61 6e 6e 65 6c 20 6c 65 61 6b 73  s $channel leaks
19b60 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
19b70 0a 20 20 70 72 6f 63 20 69 73 54 65 73 74 53 75  .  proc isTestSu
19b80 69 74 65 52 75 6e 6e 69 6e 67 20 7b 7d 20 7b 0d  iteRunning {} {.
19b90 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
19ba0 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  TE: Return non-z
19bb0 65 72 6f 20 69 66 20 74 68 65 20 74 65 73 74 20  ero if the test 
19bc0 73 75 69 74 65 20 61 70 70 65 61 72 73 20 74 6f  suite appears to
19bd0 20 62 65 20 72 75 6e 6e 69 6e 67 2e 0d 0a 20 20   be running...  
19be0 20 20 23 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    #..    return 
19bf0 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69  [expr {[info exi
19c00 73 74 73 20 3a 3a 74 65 73 74 5f 73 75 69 74 65  sts ::test_suite
19c10 5f 72 75 6e 6e 69 6e 67 5d 20 26 26 20 5c 0d 0a  _running] && \..
19c20 20 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f          $::test_
19c30 73 75 69 74 65 5f 72 75 6e 6e 69 6e 67 7d 5d 0d  suite_running}].
19c40 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
19c50 67 65 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72  getTestChannelOr
19c60 44 65 66 61 75 6c 74 20 7b 7d 20 7b 0d 0a 20 20  Default {} {..  
19c70 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
19c80 74 73 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  ts ::test_channe
19c90 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l]} then {..    
19ca0 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
19cb0 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 7d 0d  _channel..    }.
19cc0 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74  ...    return st
19cd0 64 6f 75 74 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  dout; # TODO: Go
19ce0 6f 64 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 7d  od default?..  }
19cf0 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 74 72 79 56  .....  proc tryV
19d00 65 72 69 66 79 54 65 73 74 50 61 74 68 20 7b 7d  erifyTestPath {}
19d10 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
19d20 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
19d30 73 74 20 70 61 74 68 20 76 61 72 69 61 62 6c 65  st path variable
19d40 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
19d50 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
19d60 74 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 70  t..    #       p
19d70 6f 69 6e 74 73 20 74 6f 20 64 6f 65 73 20 6e 6f  oints to does no
19d80 74 20 65 78 69 73 74 20 28 6f 72 20 69 73 20 6e  t exist (or is n
19d90 6f 74 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65  ot really a dire
19da0 63 74 6f 72 79 29 2c 20 6f 72 0d 0a 20 20 20 20  ctory), or..    
19db0 23 20 20 20 20 20 20 20 69 74 20 61 70 70 65 61  #       it appea
19dc0 72 73 20 74 6f 20 62 65 20 61 6e 20 65 6d 70 74  rs to be an empt
19dd0 79 20 64 69 72 65 63 74 6f 72 79 2c 20 72 65 74  y directory, ret
19de0 75 72 6e 20 66 61 6c 73 65 3b 20 6f 74 68 65 72  urn false; other
19df0 77 69 73 65 2c 0d 0a 20 20 20 20 23 20 20 20 20  wise,..    #    
19e00 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0d     return true..
19e10 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
19e20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
19e30 74 65 73 74 5f 70 61 74 68 5d 20 7c 7c 20 5c 0d  test_path] || \.
19e40 0a 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20  .        ![file 
19e50 65 78 69 73 74 73 20 24 3a 3a 74 65 73 74 5f 70  exists $::test_p
19e60 61 74 68 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ath] || \..     
19e70 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
19e80 63 74 6f 72 79 20 24 3a 3a 74 65 73 74 5f 70 61  ctory $::test_pa
19e90 74 68 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  th] || \..      
19ea0 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 67 65 74 46    [llength [getF
19eb0 69 6c 65 73 20 24 3a 3a 74 65 73 74 5f 70 61 74  iles $::test_pat
19ec0 68 20 2a 5d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  h *]] == 0} then
19ed0 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
19ee0 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   false..    }...
19ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65  .    return true
19f00 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
19f10 20 63 68 65 63 6b 46 6f 72 41 6e 64 53 65 74 54   checkForAndSetT
19f20 65 73 74 50 61 74 68 20 7b 20 77 68 61 74 49 66  estPath { whatIf
19f30 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
19f40 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
19f50 20 4e 4f 54 45 3a 20 45 76 65 72 79 74 68 69 6e   NOTE: Everythin
19f60 67 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 64  g in this proced
19f70 75 72 65 20 72 65 71 75 69 72 65 73 20 61 63 63  ure requires acc
19f80 65 73 73 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ess to the file 
19f90 73 79 73 74 65 6d 3b 0d 0a 20 20 20 20 23 20 20  system;..    #  
19fa0 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
19fb0 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
19fc0 64 20 69 6e 20 61 20 73 74 6f 63 6b 20 22 73 61  d in a stock "sa
19fd0 66 65 22 20 69 6e 74 65 72 70 72 65 74 65 72 2e  fe" interpreter.
19fe0 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
19ff0 7b 21 5b 69 6e 74 65 72 70 20 69 73 73 61 66 65  {![interp issafe
1a000 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] && ![info exis
1a010 74 73 20 3a 3a 74 65 73 74 5f 70 61 74 68 5d 7d  ts ::test_path]}
1a020 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
1a030 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a040 47 72 61 62 20 74 68 65 20 6e 61 6d 65 20 6f 66  Grab the name of
1a050 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 63 72   the current scr
1a060 69 70 74 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ipt file.  If th
1a070 69 73 20 69 73 20 61 6e 20 65 6d 70 74 79 0d 0a  is is an empty..
1a080 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
1a090 72 69 6e 67 2c 20 6d 61 6e 79 20 74 65 73 74 20  ring, many test 
1a0a0 70 61 74 68 20 63 68 65 63 6b 73 20 77 69 6c 6c  path checks will
1a0b0 20 68 61 76 65 20 74 6f 20 62 65 20 73 6b 69 70   have to be skip
1a0c0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
1a0d0 20 20 20 20 20 73 65 74 20 73 63 72 69 70 74 20       set script 
1a0e0 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 0d 0a 0d  [info script]...
1a0f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a100 23 20 4e 4f 54 45 3a 20 45 61 67 6c 65 20 61 6e  # NOTE: Eagle an
1a110 64 20 6e 61 74 69 76 65 20 54 63 6c 20 68 61 76  d native Tcl hav
1a120 65 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 75  e different requ
1a130 69 72 65 6d 65 6e 74 73 20 61 6e 64 20 70 6f 73  irements and pos
1a140 73 69 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  sible..      #  
1a150 20 20 20 20 20 6c 6f 63 61 74 69 6f 6e 73 20 66       locations f
1a160 6f 72 20 74 68 65 20 74 65 73 74 20 70 61 74 68  or the test path
1a170 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 68 61 6e  ; therefore, han
1a180 64 6c 65 20 74 68 65 6d 20 73 65 70 61 72 61 74  dle them separat
1a190 65 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ely...      #.. 
1a1a0 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c       if {[isEagl
1a1b0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1a1c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a1d0 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
1a1e0 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 61  base directory a
1a1f0 6e 64 20 74 68 65 20 6c 69 62 72 61 72 79 20 64  nd the library d
1a200 69 72 65 63 74 6f 72 79 2e 20 20 57 69 74 68 6f  irectory.  Witho
1a210 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ut..        #   
1a220 20 20 20 20 74 68 65 73 65 2c 20 73 65 76 65 72      these, sever
1a230 61 6c 20 74 65 73 74 20 70 61 74 68 20 63 68 65  al test path che
1a240 63 6b 73 20 77 69 6c 6c 20 62 65 20 73 6b 69 70  cks will be skip
1a250 70 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ped...        #.
1a260 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c 69 62  .        set lib
1a270 72 61 72 79 20 5b 67 65 74 54 65 73 74 4c 69 62  rary [getTestLib
1a280 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d 3b 20  raryDirectory]; 
1a290 73 65 74 20 62 61 73 65 20 5b 69 6e 66 6f 20 62  set base [info b
1a2a0 61 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ase]....        
1a2b0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1a2c0 74 68 20 24 6c 69 62 72 61 72 79 5d 20 3e 20 30  th $library] > 0
1a2d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a2e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a2f0 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 68 65   # NOTE: Try the
1a300 20 73 6f 75 72 63 65 20 72 65 6c 65 61 73 65 20   source release 
1a310 64 69 72 65 63 74 6f 72 79 20 73 74 72 75 63 74  directory struct
1a320 75 72 65 2e 20 20 46 6f 72 20 74 68 69 73 0d 0a  ure.  For this..
1a330 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1a340 20 20 63 61 73 65 2c 20 74 68 65 20 66 69 6e 61    case, the fina
1a350 6c 20 74 65 73 74 20 70 61 74 68 20 77 6f 75 6c  l test path woul
1a360 64 20 62 65 3a 0d 0a 20 20 20 20 20 20 20 20 20  d be:..         
1a370 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1a380 20 20 20 20 20 20 20 20 20 20 24 6c 69 62 72 61            $libra
1a390 72 79 2f 2e 2e 2f 2e 2e 2f 4c 69 62 72 61 72 79  ry/../../Library
1a3a0 2f 54 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20  /Tests..        
1a3b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1a3c0 65 74 20 3a 3a 74 65 73 74 5f 70 61 74 68 20 5b  et ::test_path [
1a3d0 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b  file normalize [
1a3e0 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20  file join [file 
1a3f0 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 5c 0d  dirname [file \.
1a400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
1a410 69 72 6e 61 6d 65 20 24 6c 69 62 72 61 72 79 5d  irname $library]
1a420 5d 20 4c 69 62 72 61 72 79 20 54 65 73 74 73 5d  ] Library Tests]
1a430 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
1a440 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1a450 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a460 74 71 70 75 74 73 20 5b 67 65 74 54 65 73 74 43  tqputs [getTestC
1a470 68 61 6e 6e 65 6c 4f 72 44 65 66 61 75 6c 74 5d  hannelOrDefault]
1a480 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 23  "---- checking #
1a4b0 31 20 66 6f 72 20 45 61 67 6c 65 20 74 65 73 74  1 for Eagle test
1a4c0 20 70 61 74 68 20 61 74 20 5c 22 22 20 5c 0d 0a   path at \"" \..
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 24 3a 3a 74 65 73 74 5f 70 61 74 68 20 5c 22 2e  $::test_path \".
1a4f0 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ..\n]..         
1a500 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1a510 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
1a520 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 62 61 73  ring length $bas
1a530 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  e] > 0 && \..   
1a540 20 20 20 20 20 20 20 20 20 28 24 77 68 61 74 49           ($whatI
1a550 66 20 7c 7c 20 21 5b 74 72 79 56 65 72 69 66 79  f || ![tryVerify
1a560 54 65 73 74 50 61 74 68 5d 29 7d 20 74 68 65 6e  TestPath])} then
1a570 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1a580 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1a590 45 3a 20 54 72 79 20 74 68 65 20 73 6f 75 72 63  E: Try the sourc
1a5a0 65 20 72 65 6c 65 61 73 65 20 64 69 72 65 63 74  e release direct
1a5b0 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 61 67  ory structure ag
1a5c0 61 69 6e 3b 20 74 68 69 73 0d 0a 20 20 20 20 20  ain; this..     
1a5d0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 69 6d       #       tim
1a5e0 65 2c 20 61 73 73 75 6d 65 20 6f 6e 6c 79 20 74  e, assume only t
1a5f0 68 65 20 65 6d 62 65 64 64 65 64 20 73 63 72 69  he embedded scri
1a600 70 74 20 6c 69 62 72 61 72 79 20 77 61 73 20 75  pt library was u
1a610 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  sed...          
1a620 23 20 20 20 20 20 20 20 46 6f 72 20 74 68 69 73  #       For this
1a630 20 63 61 73 65 2c 20 74 68 65 20 66 69 6e 61 6c   case, the final
1a640 20 74 65 73 74 20 70 61 74 68 20 77 6f 75 6c 64   test path would
1a650 20 62 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20   be:..          
1a660 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  #..          #  
1a670 20 20 20 20 20 20 20 20 20 24 62 61 73 65 2f 4c           $base/L
1a680 69 62 72 61 72 79 2f 54 65 73 74 73 0d 0a 20 20  ibrary/Tests..  
1a690 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a6a0 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
1a6b0 70 61 74 68 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  path [file norma
1a6c0 6c 69 7a 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  lize [file join 
1a6d0 24 62 61 73 65 20 4c 69 62 72 61 72 79 20 54 65  $base Library Te
1a6e0 73 74 73 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sts]]....       
1a6f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1a700 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a710 20 20 20 20 74 71 70 75 74 73 20 5b 67 65 74 54      tqputs [getT
1a720 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65 66 61  estChannelOrDefa
1a730 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41 72 67 73  ult] [appendArgs
1a740 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a750 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
1a760 6e 67 20 23 32 20 66 6f 72 20 45 61 67 6c 65 20  ng #2 for Eagle 
1a770 74 65 73 74 20 70 61 74 68 20 61 74 20 5c 22 22  test path at \""
1a780 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a790 20 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 74 68      $::test_path
1a7a0 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
1a7b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1a7c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1a7d0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1a7e0 24 73 63 72 69 70 74 5d 20 3e 20 30 20 26 26 20  $script] > 0 && 
1a7f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  \..            (
1a800 24 77 68 61 74 49 66 20 7c 7c 20 21 5b 74 72 79  $whatIf || ![try
1a810 56 65 72 69 66 79 54 65 73 74 50 61 74 68 5d 29  VerifyTestPath])
1a820 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a830 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a840 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 66 6f 72   # NOTE: Try for
1a850 20 74 68 65 20 74 65 73 74 20 70 61 63 6b 61 67   the test packag
1a860 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 6f  e directory.  Fo
1a870 72 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  r this case, the
1a880 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1a890 20 20 20 20 66 69 6e 61 6c 20 74 65 73 74 20 70      final test p
1a8a0 61 74 68 20 77 6f 75 6c 64 20 62 65 3a 0d 0a 20  ath would be:.. 
1a8b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a8c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1a8d0 20 20 24 73 63 72 69 70 74 2f 2e 2e 2f 54 65 73    $script/../Tes
1a8e0 74 31 2e 30 0d 0a 20 20 20 20 20 20 20 20 20 20  t1.0..          
1a8f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
1a900 20 3a 3a 74 65 73 74 5f 70 61 74 68 20 5b 66 69   ::test_path [fi
1a910 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69  le normalize [fi
1a920 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
1a930 72 6e 61 6d 65 20 5b 66 69 6c 65 20 5c 0d 0a 20  rname [file \.. 
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72               dir
1a950 6e 61 6d 65 20 24 73 63 72 69 70 74 5d 5d 20 5b  name $script]] [
1a960 61 70 70 65 6e 64 41 72 67 73 20 54 65 73 74 20  appendArgs Test 
1a970 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 56 65 72  [info engine Ver
1a980 73 69 6f 6e 5d 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  sion]]]]....    
1a990 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1a9a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1a9b0 20 20 20 20 20 20 20 74 71 70 75 74 73 20 5b 67         tqputs [g
1a9c0 65 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44  etTestChannelOrD
1a9d0 65 66 61 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41  efault] [appendA
1a9e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1a9f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
1aa00 63 6b 69 6e 67 20 23 33 20 66 6f 72 20 45 61 67  cking #3 for Eag
1aa10 6c 65 20 74 65 73 74 20 70 61 74 68 20 61 74 20  le test path at 
1aa20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1aa30 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 70         $::test_p
1aa40 61 74 68 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ath \"...\n]..  
1aa50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1aa60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1aa70 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1aa80 74 68 20 24 62 61 73 65 5d 20 3e 20 30 20 26 26  th $base] > 0 &&
1aa90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1aaa0 28 24 77 68 61 74 49 66 20 7c 7c 20 21 5b 74 72  ($whatIf || ![tr
1aab0 79 56 65 72 69 66 79 54 65 73 74 50 61 74 68 5d  yVerifyTestPath]
1aac0 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
1aad0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1aae0 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 66 6f    # NOTE: Try fo
1aaf0 72 20 74 68 65 20 74 65 73 74 20 70 61 63 6b 61  r the test packa
1ab00 67 65 20 64 69 72 65 63 74 6f 72 79 20 61 67 61  ge directory aga
1ab10 69 6e 3b 20 74 68 69 73 20 74 69 6d 65 2c 20 75  in; this time, u
1ab20 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  se..          # 
1ab30 20 20 20 20 20 20 74 68 65 20 62 61 73 65 20 70        the base p
1ab40 61 74 68 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ath and assume t
1ab50 68 65 20 73 6f 75 72 63 65 20 72 65 6c 65 61 73  he source releas
1ab60 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e directory..   
1ab70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
1ab80 74 72 75 63 74 75 72 65 2e 20 20 46 6f 72 20 74  tructure.  For t
1ab90 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 66 69  his case, the fi
1aba0 6e 61 6c 20 74 65 73 74 20 70 61 74 68 20 77 6f  nal test path wo
1abb0 75 6c 64 20 62 65 3a 0d 0a 20 20 20 20 20 20 20  uld be:..       
1abc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1abd0 23 20 20 20 20 20 20 20 20 20 20 20 24 62 61 73  #           $bas
1abe0 65 2f 6c 69 62 2f 54 65 73 74 31 2e 30 0d 0a 20  e/lib/Test1.0.. 
1abf0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ac00 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
1ac10 5f 70 61 74 68 20 5b 66 69 6c 65 20 6e 6f 72 6d  _path [file norm
1ac20 61 6c 69 7a 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  alize [file join
1ac30 20 24 62 61 73 65 20 6c 69 62 20 5b 61 70 70 65   $base lib [appe
1ac40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1ac50 20 20 20 20 20 20 20 20 54 65 73 74 20 5b 69 6e          Test [in
1ac60 66 6f 20 65 6e 67 69 6e 65 20 56 65 72 73 69 6f  fo engine Versio
1ac70 6e 5d 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  n]]]]....       
1ac80 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1ac90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1aca0 20 20 20 20 74 71 70 75 74 73 20 5b 67 65 74 54      tqputs [getT
1acb0 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65 66 61  estChannelOrDefa
1acc0 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41 72 67 73  ult] [appendArgs
1acd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ace0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
1acf0 6e 67 20 23 34 20 66 6f 72 20 45 61 67 6c 65 20  ng #4 for Eagle 
1ad00 74 65 73 74 20 70 61 74 68 20 61 74 20 5c 22 22  test path at \""
1ad10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ad20 20 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 74 68      $::test_path
1ad30 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
1ad40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ad50 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1ad60 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1ad70 24 62 61 73 65 5d 20 3e 20 30 20 26 26 20 5c 0d  $base] > 0 && \.
1ad80 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 24 77  .            ($w
1ad90 68 61 74 49 66 20 7c 7c 20 21 5b 74 72 79 56 65  hatIf || ![tryVe
1ada0 72 69 66 79 54 65 73 74 50 61 74 68 5d 29 7d 20  rifyTestPath])} 
1adb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1adc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1add0 20 4e 4f 54 45 3a 20 54 72 79 20 66 6f 72 20 74   NOTE: Try for t
1ade0 68 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20  he test package 
1adf0 64 69 72 65 63 74 6f 72 79 20 61 67 61 69 6e 3b  directory again;
1ae00 20 74 68 69 73 20 74 69 6d 65 2c 20 75 73 65 0d   this time, use.
1ae10 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ae20 20 20 20 74 68 65 20 62 61 73 65 20 70 61 74 68     the base path
1ae30 2e 20 20 46 6f 72 20 74 68 69 73 20 63 61 73 65  .  For this case
1ae40 2c 20 74 68 65 20 66 69 6e 61 6c 20 74 65 73 74  , the final test
1ae50 20 70 61 74 68 20 77 6f 75 6c 64 0d 0a 20 20 20   path would..   
1ae60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
1ae70 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e:..          #.
1ae80 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ae90 20 20 20 20 20 20 20 24 62 61 73 65 2f 54 65 73         $base/Tes
1aea0 74 31 2e 30 0d 0a 20 20 20 20 20 20 20 20 20 20  t1.0..          
1aeb0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
1aec0 20 3a 3a 74 65 73 74 5f 70 61 74 68 20 5b 66 69   ::test_path [fi
1aed0 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69  le normalize [fi
1aee0 6c 65 20 6a 6f 69 6e 20 24 62 61 73 65 20 5b 61  le join $base [a
1aef0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1af00 20 20 20 20 20 20 20 20 20 20 20 54 65 73 74 20             Test 
1af10 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 56 65 72  [info engine Ver
1af20 73 69 6f 6e 5d 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  sion]]]]....    
1af30 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1af40 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1af50 20 20 20 20 20 20 20 74 71 70 75 74 73 20 5b 67         tqputs [g
1af60 65 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44  etTestChannelOrD
1af70 65 66 61 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41  efault] [appendA
1af80 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1af90 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
1afa0 63 6b 69 6e 67 20 23 35 20 66 6f 72 20 45 61 67  cking #5 for Eag
1afb0 6c 65 20 74 65 73 74 20 70 61 74 68 20 61 74 20  le test path at 
1afc0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1afd0 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 70         $::test_p
1afe0 61 74 68 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ath \"...\n]..  
1aff0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b000 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b010 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1b020 74 68 20 24 6c 69 62 72 61 72 79 5d 20 3e 20 30  th $library] > 0
1b030 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1b040 20 20 20 28 24 77 68 61 74 49 66 20 7c 7c 20 21     ($whatIf || !
1b050 5b 74 72 79 56 65 72 69 66 79 54 65 73 74 50 61  [tryVerifyTestPa
1b060 74 68 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  th])} then {..  
1b070 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b080 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
1b090 73 20 6d 75 73 74 20 62 65 20 61 20 62 69 6e 61  s must be a bina
1b0a0 72 79 20 72 65 6c 65 61 73 65 2c 20 6e 6f 20 22  ry release, no "
1b0b0 4c 69 62 72 61 72 79 22 20 64 69 72 65 63 74 6f  Library" directo
1b0c0 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ry..          # 
1b0d0 20 20 20 20 20 20 74 68 65 6e 2e 20 20 41 6c 73        then.  Als
1b0e0 6f 2c 20 62 69 6e 61 72 79 20 72 65 6c 65 61 73  o, binary releas
1b0f0 65 73 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  es have an upper
1b100 2d 63 61 73 65 20 22 54 65 73 74 73 22 0d 0a 20  -case "Tests".. 
1b110 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1b120 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20   directory name 
1b130 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
1b140 66 72 6f 6d 20 74 68 65 20 22 75 70 64 61 74 65  from the "update
1b150 2e 62 61 74 22 0d 0a 20 20 20 20 20 20 20 20 20  .bat"..         
1b160 20 23 20 20 20 20 20 20 20 74 6f 6f 6c 2e 20 20   #       tool.  
1b170 54 68 69 73 20 6d 75 73 74 20 6d 61 74 63 68 20  This must match 
1b180 74 68 65 20 63 61 73 69 6e 67 20 75 73 65 64 20  the casing used 
1b190 69 6e 20 22 75 70 64 61 74 65 2e 62 61 74 22 2e  in "update.bat".
1b1a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1b1b0 20 20 20 20 46 6f 72 20 74 68 69 73 20 63 61 73      For this cas
1b1c0 65 2c 20 74 68 65 20 66 69 6e 61 6c 20 74 65 73  e, the final tes
1b1d0 74 20 70 61 74 68 20 77 6f 75 6c 64 20 62 65 3a  t path would be:
1b1e0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b1f0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1b200 20 20 20 20 20 24 6c 69 62 72 61 72 79 2f 2e 2e       $library/..
1b210 2f 2e 2e 2f 54 65 73 74 73 0d 0a 20 20 20 20 20  /../Tests..     
1b220 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b230 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 61 74    set ::test_pat
1b240 68 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a  h [file normaliz
1b250 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69  e [file join [fi
1b260 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65  le dirname [file
1b270 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b280 20 20 64 69 72 6e 61 6d 65 20 24 6c 69 62 72 61    dirname $libra
1b290 72 79 5d 5d 20 54 65 73 74 73 5d 5d 0d 0a 0d 0a  ry]] Tests]]....
1b2a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1b2b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1b2c0 20 20 20 20 20 20 20 20 20 20 20 74 71 70 75 74             tqput
1b2d0 73 20 5b 67 65 74 54 65 73 74 43 68 61 6e 6e 65  s [getTestChanne
1b2e0 6c 4f 72 44 65 66 61 75 6c 74 5d 20 5b 61 70 70  lOrDefault] [app
1b2f0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1b300 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b310 20 63 68 65 63 6b 69 6e 67 20 23 36 20 66 6f 72   checking #6 for
1b320 20 45 61 67 6c 65 20 74 65 73 74 20 70 61 74 68   Eagle test path
1b330 20 61 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   at \"" \..     
1b340 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 65             $::te
1b350 73 74 5f 70 61 74 68 20 5c 22 2e 2e 2e 5c 6e 5d  st_path \"...\n]
1b360 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b370 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b380 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1b390 6c 65 6e 67 74 68 20 24 62 61 73 65 5d 20 3e 20  length $base] > 
1b3a0 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
1b3b0 20 20 20 20 28 24 77 68 61 74 49 66 20 7c 7c 20      ($whatIf || 
1b3c0 21 5b 74 72 79 56 65 72 69 66 79 54 65 73 74 50  ![tryVerifyTestP
1b3d0 61 74 68 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ath])} then {.. 
1b3e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b3f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
1b400 6c 6c 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20  llback to using 
1b410 74 68 65 20 62 61 73 65 20 64 69 72 65 63 74 6f  the base directo
1b420 72 79 20 61 6e 64 20 63 68 65 63 6b 69 6e 67 20  ry and checking 
1b430 66 6f 72 20 61 0d 0a 20 20 20 20 20 20 20 20 20  for a..         
1b440 20 23 20 20 20 20 20 20 20 22 54 65 73 74 73 22   #       "Tests"
1b450 20 64 69 72 65 63 74 6f 72 79 20 62 65 6e 65 61   directory benea
1b460 74 68 20 69 74 2e 20 20 46 6f 72 20 74 68 69 73  th it.  For this
1b470 20 63 61 73 65 2c 20 74 68 65 20 66 69 6e 61 6c   case, the final
1b480 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1b490 20 20 20 20 74 65 73 74 20 70 61 74 68 20 77 6f      test path wo
1b4a0 75 6c 64 20 62 65 3a 0d 0a 20 20 20 20 20 20 20  uld be:..       
1b4b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b4c0 23 20 20 20 20 20 20 20 20 20 20 20 24 62 61 73  #           $bas
1b4d0 65 2f 54 65 73 74 73 0d 0a 20 20 20 20 20 20 20  e/Tests..       
1b4e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b4f0 73 65 74 20 3a 3a 74 65 73 74 5f 70 61 74 68 20  set ::test_path 
1b500 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
1b510 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 62 61 73 65  [file join $base
1b520 20 54 65 73 74 73 5d 5d 0d 0a 0d 0a 20 20 20 20   Tests]]....    
1b530 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1b540 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1b550 20 20 20 20 20 20 20 74 71 70 75 74 73 20 5b 67         tqputs [g
1b560 65 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44  etTestChannelOrD
1b570 65 66 61 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41  efault] [appendA
1b580 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b590 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
1b5a0 63 6b 69 6e 67 20 23 37 20 66 6f 72 20 45 61 67  cking #7 for Eag
1b5b0 6c 65 20 74 65 73 74 20 70 61 74 68 20 61 74 20  le test path at 
1b5c0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1b5d0 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 70         $::test_p
1b5e0 61 74 68 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ath \"...\n]..  
1b5f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b600 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b610 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1b620 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1b630 71 70 75 74 73 20 5b 67 65 74 54 65 73 74 43 68  qputs [getTestCh
1b640 61 6e 6e 65 6c 4f 72 44 65 66 61 75 6c 74 5d 20  annelOrDefault] 
1b650 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1b670 2d 2d 20 66 69 6e 61 6c 20 45 61 67 6c 65 20 74  -- final Eagle t
1b680 65 73 74 20 70 61 74 68 20 69 73 20 5c 22 22 20  est path is \"" 
1b690 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b6a0 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
1b6b0 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 61 74 68  ists ::test_path
1b6c0 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] ? \..         
1b6d0 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 74       $::test_pat
1b6e0 68 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  h : "<none>"}] \
1b6f0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  "\n]..        }.
1b700 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1b710 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
1b720 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 63 72  ring length $scr
1b730 69 70 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ipt] > 0} then {
1b740 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b750 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b760 20 54 72 79 20 74 68 65 20 73 6f 75 72 63 65 20   Try the source 
1b770 72 65 6c 65 61 73 65 20 64 69 72 65 63 74 6f 72  release director
1b780 79 20 73 74 72 75 63 74 75 72 65 2e 20 20 46 6f  y structure.  Fo
1b790 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
1b7a0 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20    #       case, 
1b7b0 74 68 65 20 66 69 6e 61 6c 20 74 65 73 74 20 70  the final test p
1b7c0 61 74 68 20 77 6f 75 6c 64 20 62 65 3a 0d 0a 20  ath would be:.. 
1b7d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b7e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1b7f0 20 20 24 73 63 72 69 70 74 2f 2e 2e 2f 2e 2e 2f    $script/../../
1b800 4c 69 62 72 61 72 79 2f 54 65 73 74 73 0d 0a 20  Library/Tests.. 
1b810 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b820 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
1b830 5f 70 61 74 68 20 5b 66 69 6c 65 20 6e 6f 72 6d  _path [file norm
1b840 61 6c 69 7a 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  alize [file join
1b850 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
1b860 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
1b870 20 20 20 20 20 20 64 69 72 6e 61 6d 65 20 5b 66        dirname [f
1b880 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 73 63 72  ile dirname $scr
1b890 69 70 74 5d 5d 5d 20 4c 69 62 72 61 72 79 20 54  ipt]]] Library T
1b8a0 65 73 74 73 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ests]]....      
1b8b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1b8c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b8d0 20 20 20 20 20 74 71 70 75 74 73 20 5b 67 65 74       tqputs [get
1b8e0 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65 66  TestChannelOrDef
1b8f0 61 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41 72 67  ault] [appendArg
1b900 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1b910 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
1b920 69 6e 67 20 23 31 20 66 6f 72 20 54 63 6c 20 74  ing #1 for Tcl t
1b930 65 73 74 20 70 61 74 68 20 61 74 20 5c 22 22 20  est path at \"" 
1b940 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b950 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 74 68 20     $::test_path 
1b960 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
1b970 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1b980 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1b990 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b9a0 73 63 72 69 70 74 5d 20 3e 20 30 20 26 26 20 5c  script] > 0 && \
1b9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 24  ..            ($
1b9c0 77 68 61 74 49 66 20 7c 7c 20 21 5b 74 72 79 56  whatIf || ![tryV
1b9d0 65 72 69 66 79 54 65 73 74 50 61 74 68 5d 29 7d  erifyTestPath])}
1b9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b9f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1ba00 23 20 4e 4f 54 45 3a 20 54 72 79 20 66 6f 72 20  # NOTE: Try for 
1ba10 74 68 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  the test package
1ba20 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 6f 72   directory.  For
1ba30 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 0d   this case, the.
1ba40 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ba50 20 20 20 66 69 6e 61 6c 20 74 65 73 74 20 70 61     final test pa
1ba60 74 68 20 77 6f 75 6c 64 20 62 65 3a 0d 0a 20 20  th would be:..  
1ba70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ba80 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
1ba90 20 24 73 63 72 69 70 74 2f 2e 2e 2f 54 65 73 74   $script/../Test
1baa0 31 2e 30 0d 0a 20 20 20 20 20 20 20 20 20 20 23  1.0..          #
1bab0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1bac0 3a 3a 74 65 73 74 5f 70 61 74 68 20 5b 66 69 6c  ::test_path [fil
1bad0 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69 6c  e normalize [fil
1bae0 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72  e join [file dir
1baf0 6e 61 6d 65 20 5b 66 69 6c 65 20 5c 0d 0a 20 20  name [file \..  
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72 6e              dirn
1bb10 61 6d 65 20 24 73 63 72 69 70 74 5d 5d 20 54 65  ame $script]] Te
1bb20 73 74 31 2e 30 5d 5d 0d 0a 0d 0a 20 20 20 20 20  st1.0]]....     
1bb30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1bb40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bb50 20 20 20 20 20 20 74 71 70 75 74 73 20 5b 67 65        tqputs [ge
1bb60 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65  tTestChannelOrDe
1bb70 66 61 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41 72  fault] [appendAr
1bb80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1bb90 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
1bba0 6b 69 6e 67 20 23 32 20 66 6f 72 20 54 63 6c 20  king #2 for Tcl 
1bbb0 74 65 73 74 20 70 61 74 68 20 61 74 20 5c 22 22  test path at \""
1bbc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bbd0 20 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 74 68      $::test_path
1bbe0 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
1bbf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1bc00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1bc10 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1bc20 24 73 63 72 69 70 74 5d 20 3e 20 30 20 26 26 20  $script] > 0 && 
1bc30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  \..            (
1bc40 24 77 68 61 74 49 66 20 7c 7c 20 21 5b 74 72 79  $whatIf || ![try
1bc50 56 65 72 69 66 79 54 65 73 74 50 61 74 68 5d 29  VerifyTestPath])
1bc60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bc70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1bc80 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 6d 75   # NOTE: This mu
1bc90 73 74 20 62 65 20 61 20 62 69 6e 61 72 79 20 72  st be a binary r
1bca0 65 6c 65 61 73 65 2c 20 6e 6f 20 22 4c 69 62 72  elease, no "Libr
1bcb0 61 72 79 22 20 64 69 72 65 63 74 6f 72 79 0d 0a  ary" directory..
1bcc0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1bcd0 20 20 74 68 65 6e 2e 20 20 41 6c 73 6f 2c 20 62    then.  Also, b
1bce0 69 6e 61 72 79 20 72 65 6c 65 61 73 65 73 20 68  inary releases h
1bcf0 61 76 65 20 61 6e 20 75 70 70 65 72 2d 63 61 73  ave an upper-cas
1bd00 65 20 22 54 65 73 74 73 22 0d 0a 20 20 20 20 20  e "Tests"..     
1bd10 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
1bd20 65 63 74 6f 72 79 20 6e 61 6d 65 20 74 68 61 74  ectory name that
1bd30 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
1bd40 20 74 68 65 20 22 75 70 64 61 74 65 2e 62 61 74   the "update.bat
1bd50 22 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  "..          #  
1bd60 20 20 20 20 20 74 6f 6f 6c 2e 20 20 54 68 69 73       tool.  This
1bd70 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
1bd80 63 61 73 69 6e 67 20 75 73 65 64 20 69 6e 20 22  casing used in "
1bd90 75 70 64 61 74 65 2e 62 61 74 22 2e 0d 0a 20 20  update.bat"...  
1bda0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1bdb0 46 6f 72 20 74 68 69 73 20 63 61 73 65 2c 20 74  For this case, t
1bdc0 68 65 20 66 69 6e 61 6c 20 74 65 73 74 20 70 61  he final test pa
1bdd0 74 68 20 77 6f 75 6c 64 20 62 65 3a 0d 0a 20 20  th would be:..  
1bde0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bdf0 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
1be00 20 24 73 63 72 69 70 74 2f 2e 2e 2f 2e 2e 2f 54   $script/../../T
1be10 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ests..          
1be20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
1be30 20 3a 3a 74 65 73 74 5f 70 61 74 68 20 5b 66 69   ::test_path [fi
1be40 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69  le normalize [fi
1be50 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
1be60 72 6e 61 6d 65 20 5b 66 69 6c 65 20 5c 0d 0a 20  rname [file \.. 
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72               dir
1be80 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
1be90 6d 65 20 24 73 63 72 69 70 74 5d 5d 5d 20 54 65  me $script]]] Te
1bea0 73 74 73 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sts]]....       
1beb0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1bec0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bed0 20 20 20 20 74 71 70 75 74 73 20 5b 67 65 74 54      tqputs [getT
1bee0 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65 66 61  estChannelOrDefa
1bef0 75 6c 74 5d 20 5b 61 70 70 65 6e 64 41 72 67 73  ult] [appendArgs
1bf00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bf10 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
1bf20 6e 67 20 23 33 20 66 6f 72 20 54 63 6c 20 74 65  ng #3 for Tcl te
1bf30 73 74 20 70 61 74 68 20 61 74 20 5c 22 22 20 5c  st path at \"" \
1bf40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bf50 20 20 24 3a 3a 74 65 73 74 5f 70 61 74 68 20 5c    $::test_path \
1bf60 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "...\n]..       
1bf70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1bf80 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
1bf90 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1bfa0 20 20 20 20 20 20 20 20 20 20 74 71 70 75 74 73            tqputs
1bfb0 20 5b 67 65 74 54 65 73 74 43 68 61 6e 6e 65 6c   [getTestChannel
1bfc0 4f 72 44 65 66 61 75 6c 74 5d 20 5b 61 70 70 65  OrDefault] [appe
1bfd0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1bfe0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1bff0 6e 61 6c 20 54 63 6c 20 74 65 73 74 20 70 61 74  nal Tcl test pat
1c000 68 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20  h is \"" \..    
1c010 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
1c020 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1c030 74 65 73 74 5f 70 61 74 68 5d 20 3f 20 5c 0d 0a  test_path] ? \..
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 3a                $:
1c050 3a 74 65 73 74 5f 70 61 74 68 20 3a 20 22 3c 6e  :test_path : "<n
1c060 6f 6e 65 3e 22 7d 5d 20 5c 22 5c 6e 5d 0d 0a 20  one>"}] \"\n].. 
1c070 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c080 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  }..    }..  }...
1c090 0d 0a 20 20 70 72 6f 63 20 63 6f 6e 66 69 67 75  ..  proc configu
1c0a0 72 65 54 63 6c 74 65 73 74 20 7b 20 76 65 72 62  reTcltest { verb
1c0b0 6f 73 65 20 6d 61 74 63 68 20 73 6b 69 70 20 63  ose match skip c
1c0c0 6f 6e 73 74 72 61 69 6e 74 73 20 69 6d 70 6f 72  onstraints impor
1c0d0 74 73 20 66 6f 72 63 65 20 7d 20 7b 0d 0a 20 20  ts force } {..  
1c0e0 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
1c0f0 20 45 61 67 6c 65 20 61 6e 64 20 6e 61 74 69 76   Eagle and nativ
1c100 65 20 54 63 6c 20 68 61 76 65 20 64 69 66 66 65  e Tcl have diffe
1c110 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69  rent configurati
1c120 6f 6e 20 72 65 71 75 69 72 65 6d 65 6e 74 73 0d  on requirements.
1c130 0a 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72  .    #       for
1c140 20 74 68 65 20 22 74 63 6c 74 65 73 74 22 20 70   the "tcltest" p
1c150 61 63 6b 61 67 65 2e 20 20 46 6f 72 20 45 61 67  ackage.  For Eag
1c160 6c 65 2c 20 74 68 65 20 6e 65 63 65 73 73 61 72  le, the necessar
1c170 79 20 74 65 73 74 69 6e 67 0d 0a 20 20 20 20 23  y testing..    #
1c180 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 61         functiona
1c190 6c 69 74 79 20 69 73 20 62 75 69 6c 74 2d 69 6e  lity is built-in
1c1a0 2e 20 20 49 6e 20 6e 61 74 69 76 65 20 54 63 6c  .  In native Tcl
1c1b0 2c 20 74 68 65 20 70 61 63 6b 61 67 65 20 6d 75  , the package mu
1c1c0 73 74 20 62 65 0d 0a 20 20 20 20 23 20 20 20 20  st be..    #    
1c1d0 20 20 20 6c 6f 61 64 65 64 20 6e 6f 77 20 61 6e     loaded now an
1c1e0 64 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  d that cannot be
1c1f0 20 64 6f 6e 65 20 69 6e 20 61 20 22 73 61 66 65   done in a "safe
1c200 22 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  " interpreter...
1c210 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
1c220 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
1c230 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c240 20 23 20 48 41 43 4b 3a 20 46 6c 61 67 20 74 68   # HACK: Flag th
1c250 65 20 22 74 65 73 74 22 20 61 6e 64 20 22 72 75  e "test" and "ru
1c260 6e 54 65 73 74 22 20 73 63 72 69 70 74 20 6c 69  nTest" script li
1c270 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73  brary procedures
1c280 20 73 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   so..      #    
1c290 20 20 20 74 68 61 74 20 74 68 65 79 20 75 73 65     that they use
1c2a0 20 74 68 65 20 73 63 72 69 70 74 20 6c 6f 63 61   the script loca
1c2b0 74 69 6f 6e 20 6f 66 20 74 68 65 69 72 20 63 61  tion of their ca
1c2c0 6c 6c 65 72 20 61 6e 64 20 6e 6f 74 0d 0a 20 20  ller and not..  
1c2d0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 69      #       thei
1c2e0 72 20 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 23 0d  r own...      #.
1c2f0 0a 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a  .      # BUGBUG:
1c300 20 45 76 65 6e 20 74 68 69 73 20 64 6f 65 73 20   Even this does 
1c310 6e 6f 74 20 79 65 74 20 66 69 78 20 74 68 65 20  not yet fix the 
1c320 73 63 72 69 70 74 20 6c 6f 63 61 74 69 6f 6e 20  script location 
1c330 69 73 73 75 65 73 20 69 6e 0d 0a 20 20 20 20 20  issues in..     
1c340 20 23 20 20 20 20 20 20 20 20 20 74 68 65 20 74   #         the t
1c350 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20  est suite:..    
1c360 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
1c370 20 20 20 20 20 64 65 62 75 67 20 70 72 6f 63 65       debug proce
1c380 64 75 72 65 66 6c 61 67 73 20 74 65 73 74 20 2b  dureflags test +
1c390 53 63 72 69 70 74 4c 6f 63 61 74 69 6f 6e 0d 0a  ScriptLocation..
1c3a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1c3b0 64 65 62 75 67 20 70 72 6f 63 65 64 75 72 65 66  debug proceduref
1c3c0 6c 61 67 73 20 72 75 6e 54 65 73 74 20 2b 53 63  lags runTest +Sc
1c3d0 72 69 70 74 4c 6f 63 61 74 69 6f 6e 0d 0a 20 20  riptLocation..  
1c3e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1c3f0 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 6e  OTE: Setup the n
1c400 65 63 65 73 73 61 72 79 20 63 6f 6d 70 61 74 69  ecessary compati
1c410 62 69 6c 69 74 79 20 73 68 69 6d 73 20 66 6f 72  bility shims for
1c420 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
1c430 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c440 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20   namespace eval 
1c450 3a 3a 74 63 6c 74 65 73 74 20 7b 7d 3b 20 23 20  ::tcltest {}; # 
1c460 48 41 43 4b 3a 20 46 6f 72 63 65 20 6e 61 6d 65  HACK: Force name
1c470 73 70 61 63 65 20 63 72 65 61 74 69 6f 6e 20 6e  space creation n
1c480 6f 77 2e 0d 0a 20 20 20 20 20 20 73 65 74 75 70  ow...      setup
1c490 54 65 73 74 53 68 69 6d 73 20 74 72 75 65 20 5b  TestShims true [
1c4a0 65 78 70 72 20 7b 21 5b 69 73 54 65 73 74 53 75  expr {![isTestSu
1c4b0 69 74 65 52 75 6e 6e 69 6e 67 5d 7d 5d 0d 0a 0d  iteRunning]}]...
1c4c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c4d0 23 20 4e 4f 54 45 3a 20 46 61 6b 65 20 68 61 76  # NOTE: Fake hav
1c4e0 69 6e 67 20 74 68 65 20 70 61 63 6b 61 67 65 20  ing the package 
1c4f0 61 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  as the functiona
1c500 6c 69 74 79 20 69 73 20 62 75 69 6c 74 2d 69 6e  lity is built-in
1c510 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c520 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64    package provid
1c530 65 20 74 63 6c 74 65 73 74 20 32 2e 32 2e 31 30  e tcltest 2.2.10
1c540 3b 20 23 20 54 63 6c 20 38 2e 34 0d 0a 20 20 20  ; # Tcl 8.4..   
1c550 20 7d 20 65 6c 73 65 69 66 20 7b 21 5b 69 6e 74   } elseif {![int
1c560 65 72 70 20 69 73 73 61 66 65 5d 7d 20 74 68 65  erp issafe]} the
1c570 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
1c580 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1c590 6d 70 74 20 74 6f 20 64 65 74 65 63 74 20 69 66  mpt to detect if
1c5a0 20 74 68 65 20 70 61 63 6b 61 67 65 20 69 73 20   the package is 
1c5b0 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 2e 0d  already loaded..
1c5c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c5d0 73 65 74 20 6c 6f 61 64 65 64 20 5b 65 78 70 72  set loaded [expr
1c5e0 20 7b 5b 63 61 74 63 68 20 7b 70 61 63 6b 61 67   {[catch {packag
1c5f0 65 20 70 72 65 73 65 6e 74 20 74 63 6c 74 65 73  e present tcltes
1c600 74 7d 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20  t}] == 0}]....  
1c610 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1c620 4f 54 45 3a 20 41 6c 77 61 79 73 20 61 74 74 65  OTE: Always atte
1c630 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
1c640 70 61 63 6b 61 67 65 2e 0d 0a 20 20 20 20 20 20  package...      
1c650 23 0d 0a 20 20 20 20 20 20 70 61 63 6b 61 67 65  #..      package
1c660 20 72 65 71 75 69 72 65 20 74 63 6c 74 65 73 74   require tcltest
1c670 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1c680 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69     # NOTE: Confi
1c690 67 75 72 65 20 69 74 20 66 6f 72 20 6f 75 72 20  gure it for our 
1c6a0 75 73 65 20 28 6f 6e 6c 79 20 77 68 65 6e 20 69  use (only when i
1c6b0 74 20 77 61 73 20 6e 6f 74 20 6c 6f 61 64 65 64  t was not loaded
1c6c0 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
1c6d0 20 20 20 69 66 20 7b 21 24 6c 6f 61 64 65 64 7d     if {!$loaded}
1c6e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c6f0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1c700 67 74 68 20 24 76 65 72 62 6f 73 65 5d 20 3e 20  gth $verbose] > 
1c710 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1c720 20 20 20 20 20 3a 3a 74 63 6c 74 65 73 74 3a 3a       ::tcltest::
1c730 63 6f 6e 66 69 67 75 72 65 20 2d 76 65 72 62 6f  configure -verbo
1c740 73 65 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  se $verbose..   
1c750 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c760 20 20 20 20 20 20 20 20 20 3a 3a 74 63 6c 74 65           ::tclte
1c770 73 74 3a 3a 63 6f 6e 66 69 67 75 72 65 20 2d 76  st::configure -v
1c780 65 72 62 6f 73 65 20 70 62 73 74 65 0d 0a 20 20  erbose pbste..  
1c790 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1c7a0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1c7b0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 6e 65     # NOTE: We ne
1c7c0 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 45  ed to copy the E
1c7d0 61 67 6c 65 20 74 65 73 74 20 6e 61 6d 65 73 20  agle test names 
1c7e0 74 6f 20 6d 61 74 63 68 20 6f 76 65 72 20 74 6f  to match over to
1c7f0 20 54 63 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   Tcl...      #..
1c800 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
1c810 74 68 20 24 6d 61 74 63 68 5d 20 3e 20 30 7d 20  th $match] > 0} 
1c820 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c830 3a 3a 74 63 6c 74 65 73 74 3a 3a 63 6f 6e 66 69  ::tcltest::confi
1c840 67 75 72 65 20 2d 6d 61 74 63 68 20 24 6d 61 74  gure -match $mat
1c850 63 68 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ch..      }.... 
1c860 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1c870 4e 4f 54 45 3a 20 57 65 20 6e 65 65 64 20 74 6f  NOTE: We need to
1c880 20 63 6f 70 79 20 74 68 65 20 45 61 67 6c 65 20   copy the Eagle 
1c890 74 65 73 74 20 6e 61 6d 65 73 20 74 6f 20 73 6b  test names to sk
1c8a0 69 70 20 6f 76 65 72 20 74 6f 20 54 63 6c 2e 0d  ip over to Tcl..
1c8b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c8c0 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 73 6b  if {[llength $sk
1c8d0 69 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ip] > 0} then {.
1c8e0 0a 20 20 20 20 20 20 20 20 3a 3a 74 63 6c 74 65  .        ::tclte
1c8f0 73 74 3a 3a 63 6f 6e 66 69 67 75 72 65 20 2d 73  st::configure -s
1c900 6b 69 70 20 24 73 6b 69 70 0d 0a 20 20 20 20 20  kip $skip..     
1c910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1c920 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1c930 6e 65 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65  need to copy the
1c940 20 45 61 67 6c 65 20 74 65 73 74 20 63 6f 6e 73   Eagle test cons
1c950 74 72 61 69 6e 74 73 20 6f 76 65 72 20 74 6f 20  traints over to 
1c960 54 63 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  Tcl...      #.. 
1c970 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
1c980 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 73 5d 20  h $constraints] 
1c990 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1c9a0 20 20 20 20 20 3a 3a 74 63 6c 74 65 73 74 3a 3a       ::tcltest::
1c9b0 63 6f 6e 66 69 67 75 72 65 20 2d 63 6f 6e 73 74  configure -const
1c9c0 72 61 69 6e 74 73 20 24 63 6f 6e 73 74 72 61 69  raints $constrai
1c9d0 6e 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nts..      }....
1c9e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1c9f0 20 4e 4f 54 45 3a 20 46 6f 72 20 74 68 65 20 62   NOTE: For the b
1ca00 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 45 61  enefit of the Ea
1ca10 67 6c 65 20 74 65 73 74 20 73 75 69 74 65 2c 20  gle test suite, 
1ca20 61 6c 77 61 79 73 20 61 64 64 20 74 68 65 0d 0a  always add the..
1ca30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 73        #       ps
1ca40 65 75 64 6f 2d 63 6f 6e 73 74 72 61 69 6e 74 73  eudo-constraints
1ca50 20 22 66 61 69 6c 2e 66 61 6c 73 65 22 20 61 6e   "fail.false" an
1ca60 64 20 22 66 61 69 6c 2e 74 72 75 65 22 2e 0d 0a  d "fail.true"...
1ca70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 3a        #..      :
1ca80 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f  :tcltest::testCo
1ca90 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 2e 66 61  nstraint fail.fa
1caa0 6c 73 65 20 31 0d 0a 20 20 20 20 20 20 3a 3a 74  lse 1..      ::t
1cab0 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e 73  cltest::testCons
1cac0 74 72 61 69 6e 74 20 66 61 69 6c 2e 74 72 75 65  traint fail.true
1cad0 20 31 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   1....      #.. 
1cae0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1caf0 6e 65 65 64 20 74 68 65 20 5b 74 65 73 74 5d 20  need the [test] 
1cb00 63 6f 6d 6d 61 6e 64 20 69 6e 20 74 68 65 20 67  command in the g
1cb10 6c 6f 62 61 6c 20 6e 61 6d 65 73 70 61 63 65 2e  lobal namespace.
1cb20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1cb30 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 69   if {[llength $i
1cb40 6d 70 6f 72 74 73 5d 20 3e 20 30 7d 20 74 68 65  mports] > 0} the
1cb50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
1cb60 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 6e   command [list n
1cb70 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 5d  amespace import]
1cb80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1cb90 24 66 6f 72 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  $force} then {..
1cba0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
1cbb0 64 20 63 6f 6d 6d 61 6e 64 20 2d 66 6f 72 63 65  d command -force
1cbc0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1cbd0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 69         foreach i
1cbe0 6d 70 6f 72 74 20 24 69 6d 70 6f 72 74 73 20 7b  mport $imports {
1cbf0 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
1cc00 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 5b 61 70 70  end command [app
1cc10 65 6e 64 41 72 67 73 20 3a 3a 74 63 6c 74 65 73  endArgs ::tcltes
1cc20 74 3a 3a 20 24 69 6d 70 6f 72 74 5d 0d 0a 20 20  t:: $import]..  
1cc30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1cc40 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61     namespace eva
1cc50 6c 20 3a 3a 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20  l :: $command.. 
1cc60 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20       }..    }.. 
1cc70 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 6d 61   }.....  proc ma
1cc80 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
1cc90 7b 20 6d 61 63 68 69 6e 65 20 7b 61 72 63 68 69  { machine {archi
1cca0 74 65 63 74 75 72 65 20 66 61 6c 73 65 7d 20 7d  tecture false} }
1ccb0 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
1ccc0 20 4e 4f 54 45 3a 20 43 61 6e 6e 6f 74 20 75 73   NOTE: Cannot us
1ccd0 65 20 22 2d 6e 6f 63 61 73 65 22 20 6f 70 74 69  e "-nocase" opti
1cce0 6f 6e 20 68 65 72 65 20 62 65 63 61 75 73 65 20  on here because 
1ccf0 54 63 6c 20 38 2e 34 20 64 6f 65 73 20 6e 6f 74  Tcl 8.4 does not
1cd00 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 73 75  ..    #       su
1cd10 70 70 6f 72 74 20 69 74 20 28 69 2e 65 2e 20 62  pport it (i.e. b
1cd20 65 63 61 75 73 65 20 69 74 20 69 73 20 70 72 65  ecause it is pre
1cd30 2d 54 49 50 20 23 32 34 31 29 2e 0d 0a 20 20 20  -TIP #241)...   
1cd40 20 23 0d 0a 20 20 20 20 73 77 69 74 63 68 20 2d   #..    switch -
1cd50 65 78 61 63 74 20 2d 2d 20 5b 73 74 72 69 6e 67  exact -- [string
1cd60 20 74 6f 6c 6f 77 65 72 20 24 6d 61 63 68 69 6e   tolower $machin
1cd70 65 5d 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 65  e] {..      inte
1cd80 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  l {..        if 
1cd90 7b 21 24 61 72 63 68 69 74 65 63 74 75 72 65 20  {!$architecture 
1cda0 26 26 20 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  && [isWindows]} 
1cdb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1cdc0 20 20 72 65 74 75 72 6e 20 57 69 6e 33 32 0d 0a    return Win32..
1cdd0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1cde0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
1cdf0 72 6e 20 78 38 36 0d 0a 20 20 20 20 20 20 20 20  rn x86..        
1ce00 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1ce10 20 20 61 72 6d 20 7b 0d 0a 20 20 20 20 20 20 20    arm {..       
1ce20 20 72 65 74 75 72 6e 20 61 72 6d 0d 0a 20 20 20   return arm..   
1ce30 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 61 36 34     }..      ia64
1ce40 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
1ce50 72 6e 20 69 74 61 6e 69 75 6d 0d 0a 20 20 20 20  rn itanium..    
1ce60 20 20 7d 0d 0a 20 20 20 20 20 20 6d 73 69 6c 20    }..      msil 
1ce70 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
1ce80 6e 20 63 6c 72 0d 0a 20 20 20 20 20 20 7d 0d 0a  n clr..      }..
1ce90 20 20 20 20 20 20 61 6d 64 36 34 20 7b 0d 0a 20        amd64 {.. 
1cea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 78 36         return x6
1ceb0 34 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  4..      }..    
1cec0 20 20 69 61 33 32 5f 6f 6e 5f 77 69 6e 36 34 20    ia32_on_win64 
1ced0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
1cee0 6e 20 77 6f 77 36 34 0d 0a 20 20 20 20 20 20 7d  n wow64..      }
1cef0 0d 0a 20 20 20 20 20 20 61 72 6d 36 34 20 7b 0d  ..      arm64 {.
1cf00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1cf10 61 72 6d 36 34 0d 0a 20 20 20 20 20 20 7d 0d 0a  arm64..      }..
1cf20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
1cf30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1cf40 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 7d  unknown..      }
1cf50 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
1cf60 0a 20 20 70 72 6f 63 20 61 72 63 68 69 74 65 63  .  proc architec
1cf70 74 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20  tureForPlatform 
1cf80 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a  { platform } {..
1cf90 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
1cfa0 45 3a 20 43 61 6e 6e 6f 74 20 75 73 65 20 22 2d  E: Cannot use "-
1cfb0 6e 6f 63 61 73 65 22 20 6f 70 74 69 6f 6e 20 68  nocase" option h
1cfc0 65 72 65 20 62 65 63 61 75 73 65 20 54 63 6c 20  ere because Tcl 
1cfd0 38 2e 34 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  8.4 does not..  
1cfe0 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f 72    #       suppor
1cff0 74 20 69 74 20 28 69 2e 65 2e 20 62 65 63 61 75  t it (i.e. becau
1d000 73 65 20 69 74 20 69 73 20 70 72 65 2d 54 49 50  se it is pre-TIP
1d010 20 23 32 34 31 29 2e 0d 0a 20 20 20 20 23 0d 0a   #241)...    #..
1d020 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
1d030 74 20 2d 2d 20 5b 73 74 72 69 6e 67 20 74 6f 6c  t -- [string tol
1d040 6f 77 65 72 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ower $platform] 
1d050 7b 0d 0a 20 20 20 20 20 20 69 6e 74 65 6c 20 2d  {..      intel -
1d060 0d 0a 20 20 20 20 20 20 77 69 6e 33 32 20 2d 0d  ..      win32 -.
1d070 0a 20 20 20 20 20 20 78 38 36 20 7b 0d 0a 20 20  .      x86 {..  
1d080 20 20 20 20 20 20 72 65 74 75 72 6e 20 78 38 36        return x86
1d090 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
1d0a0 20 61 72 6d 20 7b 0d 0a 20 20 20 20 20 20 20 20   arm {..        
1d0b0 72 65 74 75 72 6e 20 61 72 6d 0d 0a 20 20 20 20  return arm..    
1d0c0 20 20 7d 0d 0a 20 20 20 20 20 20 69 61 36 34 20    }..      ia64 
1d0d0 2d 0d 0a 20 20 20 20 20 20 69 74 61 6e 69 75 6d  -..      itanium
1d0e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
1d0f0 72 6e 20 69 61 36 34 0d 0a 20 20 20 20 20 20 7d  rn ia64..      }
1d100 0d 0a 20 20 20 20 20 20 6d 73 69 6c 20 2d 0d 0a  ..      msil -..
1d110 20 20 20 20 20 20 63 6c 72 20 7b 0d 0a 20 20 20        clr {..   
1d120 20 20 20 20 20 72 65 74 75 72 6e 20 6d 73 69 6c       return msil
1d130 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
1d140 20 61 6d 64 36 34 20 2d 0d 0a 20 20 20 20 20 20   amd64 -..      
1d150 78 36 34 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  x64 {..        r
1d160 65 74 75 72 6e 20 78 36 34 0d 0a 20 20 20 20 20  eturn x64..     
1d170 20 7d 0d 0a 20 20 20 20 20 20 69 61 33 32 5f 6f   }..      ia32_o
1d180 6e 5f 77 69 6e 36 34 20 2d 0d 0a 20 20 20 20 20  n_win64 -..     
1d190 20 77 6f 77 36 34 20 7b 0d 0a 20 20 20 20 20 20   wow64 {..      
1d1a0 20 20 72 65 74 75 72 6e 20 69 61 33 32 5f 6f 6e    return ia32_on
1d1b0 5f 77 69 6e 36 34 0d 0a 20 20 20 20 20 20 7d 0d  _win64..      }.
1d1c0 0a 20 20 20 20 20 20 61 72 6d 36 34 20 7b 0d 0a  .      arm64 {..
1d1d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
1d1e0 72 6d 36 34 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  rm64..      }.. 
1d1f0 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a       default {..
1d200 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1d210 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 7d 0d  nknown..      }.
1d220 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
1d230 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
1d240 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 23 23 23   then {..    ###
1d250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d290 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
1d2a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d2b0 23 23 23 23 23 23 23 23 23 23 20 42 45 47 49 4e  ########## BEGIN
1d2c0 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23   Eagle ONLY ####
1d2d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d2e0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
1d2f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d330 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1d340 20 20 70 72 6f 63 20 69 6e 69 74 69 61 6c 69 7a    proc initializ
1d350 65 54 65 73 74 73 20 7b 7d 20 7b 0d 0a 20 20 20  eTests {} {..   
1d360 20 20 20 75 70 6c 65 76 65 6c 20 23 30 20 7b 0d     uplevel #0 {.
1d370 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1d380 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 73 65      # NOTE: Rese
1d390 74 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  t the informatio
1d3a0 6e 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20  n in the global 
1d3b0 22 74 65 73 74 73 22 20 61 72 72 61 79 2c 20 77  "tests" array, w
1d3c0 68 69 63 68 20 69 73 0d 0a 20 20 20 20 20 20 20  hich is..       
1d3d0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74 6f   #       used to
1d3e0 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 20   interface with 
1d3f0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  the internal tes
1d400 74 20 74 72 61 63 6b 69 6e 67 20 69 6e 66 6f 72  t tracking infor
1d410 6d 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  mation..        
1d420 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 69  #       in the i
1d430 6e 74 65 72 70 72 65 74 65 72 20 76 69 61 20 61  nterpreter via a
1d440 20 76 61 72 69 61 62 6c 65 20 74 72 61 63 65 2e   variable trace.
1d450 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d460 20 20 20 20 20 73 65 74 20 65 61 67 6c 65 5f 74       set eagle_t
1d470 65 73 74 73 28 54 6f 74 61 6c 29 20 30 0d 0a 20  ests(Total) 0.. 
1d480 20 20 20 20 20 20 20 73 65 74 20 65 61 67 6c 65         set eagle
1d490 5f 74 65 73 74 73 28 53 6b 69 70 70 65 64 29 20  _tests(Skipped) 
1d4a0 30 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  0..        set e
1d4b0 61 67 6c 65 5f 74 65 73 74 73 28 50 61 73 73 65  agle_tests(Passe
1d4c0 64 29 20 30 0d 0a 20 20 20 20 20 20 20 20 73 65  d) 0..        se
1d4d0 74 20 65 61 67 6c 65 5f 74 65 73 74 73 28 46 61  t eagle_tests(Fa
1d4e0 69 6c 65 64 29 20 30 0d 0a 0d 0a 20 20 20 20 20  iled) 0....     
1d4f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1d500 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
1d510 6c 69 73 74 73 20 6f 66 20 70 61 74 74 65 72 6e  lists of pattern
1d520 73 20 74 6f 20 6d 61 74 63 68 20 74 65 73 74 20  s to match test 
1d530 6e 61 6d 65 73 20 61 67 61 69 6e 73 74 2e 20 20  names against.  
1d540 49 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  In..        #   
1d550 20 20 20 20 45 61 67 6c 65 2c 20 74 68 65 73 65      Eagle, these
1d560 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
1d570 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1d580 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 61   arguments and a
1d590 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
1d5a0 20 20 20 20 70 61 73 73 65 64 20 74 6f 20 74 68      passed to th
1d5b0 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 76 69  e interpreter vi
1d5c0 61 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 61  a this virtual a
1d5d0 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  rray...        #
1d5e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
1d5f0 6e 66 6f 20 65 78 69 73 74 73 20 74 65 73 74 5f  nfo exists test_
1d600 66 6c 61 67 73 28 2d 6d 61 74 63 68 29 5d 7d 20  flags(-match)]} 
1d610 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d620 20 20 73 65 74 20 65 61 67 6c 65 5f 74 65 73 74    set eagle_test
1d630 73 28 4d 61 74 63 68 4e 61 6d 65 73 29 20 24 74  s(MatchNames) $t
1d640 65 73 74 5f 66 6c 61 67 73 28 2d 6d 61 74 63 68  est_flags(-match
1d650 29 3b 20 23 20 72 75 6e 20 74 68 65 73 65 20 74  ); # run these t
1d660 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 7d  ests...        }
1d670 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d680 20 20 20 73 65 74 20 65 61 67 6c 65 5f 74 65 73     set eagle_tes
1d690 74 73 28 4d 61 74 63 68 4e 61 6d 65 73 29 20 5b  ts(MatchNames) [
1d6a0 6c 69 73 74 20 2a 5d 3b 20 23 20 64 65 66 61 75  list *]; # defau
1d6b0 6c 74 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6c  lt to running al
1d6c0 6c 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  l tests...      
1d6d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
1d6e0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1d6f0 74 65 73 74 5f 66 6c 61 67 73 28 2d 73 6b 69 70  test_flags(-skip
1d700 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1d710 20 20 20 20 20 20 73 65 74 20 65 61 67 6c 65 5f        set eagle_
1d720 74 65 73 74 73 28 53 6b 69 70 4e 61 6d 65 73 29  tests(SkipNames)
1d730 20 24 74 65 73 74 5f 66 6c 61 67 73 28 2d 73 6b   $test_flags(-sk
1d740 69 70 29 3b 20 23 20 73 6b 69 70 20 74 68 65 73  ip); # skip thes
1d750 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  e tests...      
1d760 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1d770 20 20 20 20 20 20 73 65 74 20 65 61 67 6c 65 5f        set eagle_
1d780 74 65 73 74 73 28 53 6b 69 70 4e 61 6d 65 73 29  tests(SkipNames)
1d790 20 5b 6c 69 73 74 5d 3b 20 23 20 64 65 66 61 75   [list]; # defau
1d7a0 6c 74 20 74 6f 20 73 6b 69 70 70 69 6e 67 20 6e  lt to skipping n
1d7b0 6f 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  o tests...      
1d7c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1d7d0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d7e0 3a 20 57 68 61 74 20 74 65 73 74 73 20 68 61 76  : What tests hav
1d7f0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2c 20  e been skipped, 
1d800 69 66 20 61 6e 79 3f 0d 0a 20 20 20 20 20 20 20  if any?..       
1d810 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1d820 65 61 67 6c 65 5f 74 65 73 74 73 28 53 6b 69 70  eagle_tests(Skip
1d830 70 65 64 4e 61 6d 65 73 29 20 5b 6c 69 73 74 5d  pedNames) [list]
1d840 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1d850 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
1d860 68 61 74 20 74 65 73 74 73 20 68 61 76 65 20 66  hat tests have f
1d870 61 69 6c 65 64 2c 20 69 66 20 61 6e 79 3f 0d 0a  ailed, if any?..
1d880 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d890 20 20 20 73 65 74 20 65 61 67 6c 65 5f 74 65 73     set eagle_tes
1d8a0 74 73 28 46 61 69 6c 65 64 4e 61 6d 65 73 29 20  ts(FailedNames) 
1d8b0 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
1d8c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1d8d0 4f 54 45 3a 20 49 6e 69 74 69 61 6c 69 7a 65 20  OTE: Initialize 
1d8e0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 63 74 69  the list of acti
1d8f0 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ve test constrai
1d900 6e 74 73 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20  nts from the..  
1d910 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 6e        #       en
1d920 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1d930 6c 65 20 61 6e 64 2f 6f 72 20 74 68 65 20 74 65  le and/or the te
1d940 73 74 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  st flags...     
1d950 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1d960 74 20 65 61 67 6c 65 5f 74 65 73 74 73 28 43 6f  t eagle_tests(Co
1d970 6e 73 74 72 61 69 6e 74 73 29 20 5b 67 65 74 45  nstraints) [getE
1d980 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1d990 6c 65 20 74 65 73 74 43 6f 6e 73 74 72 61 69 6e  le testConstrain
1d9a0 74 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ts]....        i
1d9b0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1d9c0 74 65 73 74 5f 66 6c 61 67 73 28 2d 63 6f 6e 73  test_flags(-cons
1d9d0 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
1d9e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 76 61  {..          eva
1d9f0 6c 20 6c 61 70 70 65 6e 64 20 65 61 67 6c 65 5f  l lappend eagle_
1da00 74 65 73 74 73 28 43 6f 6e 73 74 72 61 69 6e 74  tests(Constraint
1da10 73 29 20 24 74 65 73 74 5f 66 6c 61 67 73 28 2d  s) $test_flags(-
1da20 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20  constraints)..  
1da30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1da40 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
1da50 6c 61 69 6e 20 74 65 73 74 5f 76 65 72 62 6f 73  lain test_verbos
1da60 65 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  e..        set t
1da70 65 73 74 5f 76 65 72 62 6f 73 65 20 5b 67 65 74  est_verbose [get
1da80 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1da90 62 6c 65 20 74 65 73 74 56 65 72 62 6f 73 65 5d  ble testVerbose]
1daa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1dab0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1dac0 74 65 73 74 5f 76 65 72 62 6f 73 65 5d 20 3d 3d  test_verbose] ==
1dad0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1dae0 20 20 20 20 20 20 73 65 74 20 74 65 73 74 5f 76        set test_v
1daf0 65 72 62 6f 73 65 20 44 65 66 61 75 6c 74 0d 0a  erbose Default..
1db00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1db10 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1db20 78 69 73 74 73 20 74 65 73 74 5f 66 6c 61 67 73  xists test_flags
1db30 28 2d 76 65 72 62 6f 73 65 29 5d 20 26 26 20 5c  (-verbose)] && \
1db40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ..            [s
1db50 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 65  tring length $te
1db60 73 74 5f 66 6c 61 67 73 28 2d 76 65 72 62 6f 73  st_flags(-verbos
1db70 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  e)] > 0} then {.
1db80 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1db90 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1dba0 4d 61 70 20 61 6c 6c 20 74 65 73 74 20 76 65 72  Map all test ver
1dbb0 62 6f 73 69 74 79 20 66 6c 61 67 73 20 77 65 20  bosity flags we 
1dbc0 73 75 70 70 6f 72 74 20 66 6f 72 20 73 63 72 69  support for scri
1dbd0 70 74 20 75 73 61 67 65 0d 0a 20 20 20 20 20 20  pt usage..      
1dbe0 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
1dbf0 68 65 69 72 20 61 62 62 72 65 76 69 61 74 65 64  heir abbreviated
1dc00 20 6e 61 6d 65 73 20 28 77 68 69 63 68 20 61 72   names (which ar
1dc10 65 20 61 6c 6c 20 6f 6e 65 20 6c 65 74 74 65 72  e all one letter
1dc20 29 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 20  ) and..         
1dc30 20 23 20 20 20 20 20 20 20 74 68 65 6e 20 73 70   #       then sp
1dc40 6c 69 74 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  lit them into a 
1dc50 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  list...         
1dc60 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1dc70 74 20 74 65 73 74 5f 76 65 72 62 6f 73 65 20 5b  t test_verbose [
1dc80 73 70 6c 69 74 20 5b 73 74 72 69 6e 67 20 6d 61  split [string ma
1dc90 70 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  p [list \..     
1dca0 20 20 20 20 20 20 20 20 20 42 6f 64 79 20 42 20           Body B 
1dcb0 50 61 73 73 20 50 20 53 6b 69 70 20 53 20 53 74  Pass P Skip S St
1dcc0 61 72 74 20 54 20 45 72 72 6f 72 20 45 20 4c 69  art T Error E Li
1dcd0 6e 65 20 4c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ne L \..        
1dce0 20 20 20 20 20 20 46 61 69 6c 20 46 20 52 65 61        Fail F Rea
1dcf0 73 6f 6e 20 52 20 54 69 6d 65 20 49 20 45 78 69  son R Time I Exi
1dd00 74 20 58 20 53 74 64 4f 75 74 20 4f 20 53 74 64  t X StdOut O Std
1dd10 45 72 72 20 44 5d 20 5c 0d 0a 20 20 20 20 20 20  Err D] \..      
1dd20 20 20 20 20 20 20 20 20 24 74 65 73 74 5f 66 6c          $test_fl
1dd30 61 67 73 28 2d 76 65 72 62 6f 73 65 29 5d 20 22  ags(-verbose)] "
1dd40 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
1dd50 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 61 67  .        set eag
1dd60 6c 65 5f 74 65 73 74 73 28 56 65 72 62 6f 73 65  le_tests(Verbose
1dd70 29 20 24 74 65 73 74 5f 76 65 72 62 6f 73 65 3b  ) $test_verbose;
1dd80 20 75 6e 73 65 74 20 74 65 73 74 5f 76 65 72 62   unset test_verb
1dd90 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ose..      }..  
1dda0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1ddb0 20 73 65 74 75 70 54 65 73 74 53 68 69 6d 73 20   setupTestShims 
1ddc0 7b 20 73 65 74 75 70 20 7b 71 75 69 65 74 20 66  { setup {quiet f
1ddd0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1dde0 20 69 66 20 7b 24 73 65 74 75 70 7d 20 74 68 65   if {$setup} the
1ddf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1de00 20 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20          # HACK: 
1de10 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 73 68  Compatibility sh
1de20 69 6d 28 73 29 20 66 6f 72 20 75 73 65 20 77 69  im(s) for use wi
1de30 74 68 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  th various tests
1de40 20 69 6e 20 74 68 65 20 54 63 6c 0d 0a 20 20 20   in the Tcl..   
1de50 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1de60 74 20 73 75 69 74 65 2e 20 20 4d 61 6b 65 20 73  t suite.  Make s
1de70 75 72 65 20 74 68 65 73 65 20 63 6f 6d 6d 61 6e  ure these comman
1de80 64 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61 64  ds do not alread
1de90 79 20 65 78 69 73 74 0d 0a 20 20 20 20 20 20 20  y exist..       
1dea0 20 23 20 20 20 20 20 20 20 70 72 69 6f 72 20 74   #       prior t
1deb0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 64 64  o attempt to add
1dec0 69 6e 67 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20  ing them...     
1ded0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1dee0 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
1def0 20 63 6f 6d 6d 61 6e 64 73 20 74 65 73 74 43 6f   commands testCo
1df00 6e 73 74 72 61 69 6e 74 5d 5d 20 3d 3d 20 30 7d  nstraint]] == 0}
1df10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1df20 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
1df30 7b 7d 20 74 65 73 74 43 6f 6e 73 74 72 61 69 6e  {} testConstrain
1df40 74 20 7b 7d 20 68 61 76 65 4f 72 41 64 64 43 6f  t {} haveOrAddCo
1df50 6e 73 74 72 61 69 6e 74 0d 0a 0d 0a 20 20 20 20  nstraint....    
1df60 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1df70 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1df80 20 20 20 20 20 20 20 74 71 70 75 74 73 20 5b 67         tqputs [g
1df90 65 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44  etTestChannelOrD
1dfa0 65 66 61 75 6c 74 5d 20 5c 0d 0a 20 20 20 20 20  efault] \..     
1dfb0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1dfc0 20 61 64 64 65 64 20 5c 22 74 65 73 74 43 6f 6e   added \"testCon
1dfd0 73 74 72 61 69 6e 74 5c 22 20 61 6c 69 61 73 5c  straint\" alias\
1dfe0 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n"..          }.
1dff0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1e000 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
1e010 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
1e020 73 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73  s ::tcltest::tes
1e030 74 43 6f 6e 73 74 72 61 69 6e 74 5d 5d 20 3d 3d  tConstraint]] ==
1e040 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1e050 20 20 20 20 20 20 69 6e 74 65 72 70 20 61 6c 69        interp ali
1e060 61 73 20 7b 7d 20 3a 3a 74 63 6c 74 65 73 74 3a  as {} ::tcltest:
1e070 3a 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74 20  :testConstraint 
1e080 7b 7d 20 68 61 76 65 4f 72 41 64 64 43 6f 6e 73  {} haveOrAddCons
1e090 74 72 61 69 6e 74 0d 0a 0d 0a 20 20 20 20 20 20  traint....      
1e0a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1e0b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e0c0 20 20 20 20 20 74 71 70 75 74 73 20 5b 67 65 74       tqputs [get
1e0d0 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65 66  TestChannelOrDef
1e0e0 61 75 6c 74 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ault] \..       
1e0f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61           "---- a
1e100 64 64 65 64 20 5c 22 3a 3a 74 63 6c 74 65 73 74  dded \"::tcltest
1e110 3a 3a 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74  ::testConstraint
1e120 5c 22 20 61 6c 69 61 73 5c 6e 22 0d 0a 20 20 20  \" alias\n"..   
1e130 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e140 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1e150 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1e160 3a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64  : This is needed
1e170 20 62 79 20 6d 6f 73 74 20 74 65 73 74 73 20 69   by most tests i
1e180 6e 20 74 68 65 20 54 63 6c 20 74 65 73 74 20 73  n the Tcl test s
1e190 75 69 74 65 2e 20 20 4d 61 6b 65 0d 0a 20 20 20  uite.  Make..   
1e1a0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 72       #       sur
1e1b0 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 64  e this command d
1e1c0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1e1d0 65 78 69 73 74 20 70 72 69 6f 72 20 74 6f 20 61  exist prior to a
1e1e0 64 64 69 6e 67 20 69 74 2e 0d 0a 20 20 20 20 20  dding it...     
1e1f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1e200 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
1e210 20 63 6f 6d 6d 61 6e 64 73 20 3a 3a 74 63 6c 74   commands ::tclt
1e220 65 73 74 3a 3a 63 6c 65 61 6e 75 70 54 65 73 74  est::cleanupTest
1e230 73 5d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  s]] == 0} then {
1e240 0d 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 63  ..          proc
1e250 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 63 6c 65 61   ::tcltest::clea
1e260 6e 75 70 54 65 73 74 73 20 7b 20 61 72 67 73 20  nupTests { args 
1e270 7d 20 7b 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  } {}....        
1e280 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1e290 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e2a0 20 20 20 74 71 70 75 74 73 20 5b 67 65 74 54 65     tqputs [getTe
1e2b0 73 74 43 68 61 6e 6e 65 6c 4f 72 44 65 66 61 75  stChannelOrDefau
1e2c0 6c 74 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lt] \..         
1e2d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 64 64         "---- add
1e2e0 65 64 20 5c 22 3a 3a 74 63 6c 74 65 73 74 3a 3a  ed \"::tcltest::
1e2f0 63 6c 65 61 6e 75 70 54 65 73 74 73 5c 22 20 70  cleanupTests\" p
1e300 72 6f 63 65 64 75 72 65 5c 6e 22 0d 0a 20 20 20  rocedure\n"..   
1e310 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e320 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1e330 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1e340 3a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64  : This is needed
1e350 20 62 79 20 73 6f 6d 65 20 74 65 73 74 73 20 69   by some tests i
1e360 6e 20 74 68 65 20 54 63 6c 20 74 65 73 74 20 73  n the Tcl test s
1e370 75 69 74 65 2e 20 20 4d 61 6b 65 0d 0a 20 20 20  uite.  Make..   
1e380 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 72       #       sur
1e390 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 64  e this command d
1e3a0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1e3b0 65 78 69 73 74 20 70 72 69 6f 72 20 74 6f 20 61  exist prior to a
1e3c0 64 64 69 6e 67 20 69 74 2e 0d 0a 20 20 20 20 20  dding it...     
1e3d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1e3e0 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
1e3f0 20 63 6f 6d 6d 61 6e 64 73 20 5c 0d 0a 20 20 20   commands \..   
1e400 20 20 20 20 20 20 20 20 20 3a 3a 74 63 6c 74 65           ::tclte
1e410 73 74 3a 3a 6c 6f 61 64 54 65 73 74 65 64 43 6f  st::loadTestedCo
1e420 6d 6d 61 6e 64 73 5d 5d 20 3d 3d 20 30 7d 20 74  mmands]] == 0} t
1e430 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e440 20 70 72 6f 63 20 3a 3a 74 63 6c 74 65 73 74 3a   proc ::tcltest:
1e450 3a 6c 6f 61 64 54 65 73 74 65 64 43 6f 6d 6d 61  :loadTestedComma
1e460 6e 64 73 20 7b 20 61 72 67 73 20 7d 20 7b 7d 0d  nds { args } {}.
1e470 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1e480 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1e490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 71  ..            tq
1e4a0 70 75 74 73 20 5b 67 65 74 54 65 73 74 43 68 61  puts [getTestCha
1e4b0 6e 6e 65 6c 4f 72 44 65 66 61 75 6c 74 5d 20 5c  nnelOrDefault] \
1e4c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e4d0 20 20 22 2d 2d 2d 2d 20 61 64 64 65 64 20 5c 22    "---- added \"
1e4e0 3a 3a 74 63 6c 74 65 73 74 3a 3a 6c 6f 61 64 54  ::tcltest::loadT
1e4f0 65 73 74 65 64 43 6f 6d 6d 61 6e 64 73 5c 22 20  estedCommands\" 
1e500 70 72 6f 63 65 64 75 72 65 5c 6e 22 0d 0a 20 20  procedure\n"..  
1e510 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e520 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1e530 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1e540 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1e550 20 52 65 6d 6f 76 65 20 74 68 65 20 63 6f 6d 70   Remove the comp
1e560 61 74 69 62 69 6c 69 74 79 20 73 68 69 6d 20 63  atibility shim c
1e570 6f 6d 6d 61 6e 64 20 61 6c 69 61 73 65 73 20 74  ommand aliases t
1e580 68 61 74 20 77 65 20 73 65 74 75 70 0d 0a 20 20  hat we setup..  
1e590 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61        #       ea
1e5a0 72 6c 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  rlier...        
1e5b0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
1e5c0 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f  llength [info co
1e5d0 6d 6d 61 6e 64 73 20 5c 0d 0a 20 20 20 20 20 20  mmands \..      
1e5e0 20 20 20 20 20 20 3a 3a 74 63 6c 74 65 73 74 3a        ::tcltest:
1e5f0 3a 6c 6f 61 64 54 65 73 74 65 64 43 6f 6d 6d 61  :loadTestedComma
1e600 6e 64 73 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  nds]] > 0} then 
1e610 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e  {..          ren
1e620 61 6d 65 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 6c  ame ::tcltest::l
1e630 6f 61 64 54 65 73 74 65 64 43 6f 6d 6d 61 6e 64  oadTestedCommand
1e640 73 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s ""....        
1e650 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1e660 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e670 20 20 20 74 71 70 75 74 73 20 24 3a 3a 74 65 73     tqputs $::tes
1e680 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1e6a0 2d 2d 20 72 65 6d 6f 76 65 64 20 5c 22 3a 3a 74  -- removed \"::t
1e6b0 63 6c 74 65 73 74 3a 3a 6c 6f 61 64 54 65 73 74  cltest::loadTest
1e6c0 65 64 43 6f 6d 6d 61 6e 64 73 5c 22 20 70 72 6f  edCommands\" pro
1e6d0 63 65 64 75 72 65 5c 6e 22 0d 0a 20 20 20 20 20  cedure\n"..     
1e6e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e6f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1e700 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
1e710 63 6f 6d 6d 61 6e 64 73 20 3a 3a 74 63 6c 74 65  commands ::tclte
1e720 73 74 3a 3a 63 6c 65 61 6e 75 70 54 65 73 74 73  st::cleanupTests
1e730 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1e740 20 20 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65            rename
1e750 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 63 6c 65 61   ::tcltest::clea
1e760 6e 75 70 54 65 73 74 73 20 22 22 0d 0a 0d 0a 20  nupTests "".... 
1e770 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e780 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e790 20 20 20 20 20 20 20 20 20 20 74 71 70 75 74 73            tqputs
1e7a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e7b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e7c0 20 20 20 20 22 2d 2d 2d 2d 20 72 65 6d 6f 76 65      "---- remove
1e7d0 64 20 5c 22 3a 3a 74 63 6c 74 65 73 74 3a 3a 63  d \"::tcltest::c
1e7e0 6c 65 61 6e 75 70 54 65 73 74 73 5c 22 20 70 72  leanupTests\" pr
1e7f0 6f 63 65 64 75 72 65 5c 6e 22 0d 0a 20 20 20 20  ocedure\n"..    
1e800 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e810 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1e820 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 74 65   {[llength [inte
1e830 72 70 20 61 6c 69 61 73 65 73 20 3a 3a 74 63 6c  rp aliases ::tcl
1e840 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e 73 74 72  test::testConstr
1e850 61 69 6e 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e  aint]] > 0} then
1e860 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e   {..          in
1e870 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 3a 3a  terp alias {} ::
1e880 74 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e  tcltest::testCon
1e890 73 74 72 61 69 6e 74 20 7b 7d 20 7b 7d 0d 0a 0d  straint {} {}...
1e8a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1e8b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 74 71 70 75              tqpu
1e8d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1e8e0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1e8f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 6d 6f        "---- remo
1e900 76 65 64 20 5c 22 3a 3a 74 63 6c 74 65 73 74 3a  ved \"::tcltest:
1e910 3a 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74 5c  :testConstraint\
1e920 22 20 61 6c 69 61 73 5c 6e 22 0d 0a 20 20 20 20  " alias\n"..    
1e930 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e940 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1e950 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 74 65   {[llength [inte
1e960 72 70 20 61 6c 69 61 73 65 73 20 74 65 73 74 43  rp aliases testC
1e970 6f 6e 73 74 72 61 69 6e 74 5d 5d 20 3e 20 30 7d  onstraint]] > 0}
1e980 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e990 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
1e9a0 7b 7d 20 74 65 73 74 43 6f 6e 73 74 72 61 69 6e  {} testConstrain
1e9b0 74 20 7b 7d 20 7b 7d 0d 0a 0d 0a 20 20 20 20 20  t {} {}....     
1e9c0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e9d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e9e0 20 20 20 20 20 20 74 71 70 75 74 73 20 24 3a 3a        tqputs $::
1e9f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 22 2d 2d 2d 2d 20 72 65 6d 6f 76 65 64 20 5c 22  "---- removed \"
1ea20 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74 5c 22  testConstraint\"
1ea30 20 61 6c 69 61 73 5c 6e 22 0d 0a 20 20 20 20 20   alias\n"..     
1ea40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ea50 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1ea60 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1ea70 68 6f 75 6c 64 57 72 69 74 65 54 65 73 74 44 61  houldWriteTestDa
1ea80 74 61 20 7b 20 63 6f 64 65 20 7d 20 7b 0d 0a 20  ta { code } {.. 
1ea90 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
1eaa0 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
1eab0 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 20 26 26   object]] > 0 &&
1eac0 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20   [catch {..     
1ead0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1eae0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1eaf0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1eb00 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
1eb10 6e 74 73 2e 50 72 69 76 61 74 65 2e 54 65 73 74  nts.Private.Test
1eb20 4f 70 73 20 53 68 6f 75 6c 64 57 72 69 74 65 54  Ops ShouldWriteT
1eb30 65 73 74 44 61 74 61 20 22 22 20 24 63 6f 64 65  estData "" $code
1eb40 0d 0a 20 20 20 20 20 20 7d 20 77 72 69 74 65 54  ..      } writeT
1eb50 65 73 74 44 61 74 61 5d 20 3d 3d 20 30 20 26 26  estData] == 0 &&
1eb60 20 24 77 72 69 74 65 54 65 73 74 44 61 74 61 7d   $writeTestData}
1eb70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1eb80 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
1eb90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1eba0 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
1ebb0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1ebc0 70 72 6f 62 65 46 6f 72 53 63 72 69 70 74 46 69  probeForScriptFi
1ebd0 6c 65 4e 61 6d 65 20 7b 20 7b 65 78 63 6c 75 64  leName { {exclud
1ebe0 65 50 61 74 74 65 72 6e 73 20 22 22 7d 20 7b 6f  ePatterns ""} {o
1ebf0 76 65 72 72 69 64 65 50 61 74 74 65 72 6e 73 20  verridePatterns 
1ec00 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
1ec10 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
1ec20 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
1ec30 74 5d 5d 20 3e 20 30 20 26 26 20 5b 63 61 74 63  t]] > 0 && [catc
1ec40 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
1ec50 20 6c 6f 63 61 74 69 6f 6e 73 20 5b 6f 62 6a 65   locations [obje
1ec60 63 74 20 69 6e 76 6f 6b 65 20 2d 61 6c 69 61 73  ct invoke -alias
1ec70 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1ec80 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1ec90 20 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65    Interpreter.Ge
1eca0 74 41 63 74 69 76 65 20 53 63 72 69 70 74 4c 6f  tActive ScriptLo
1ecb0 63 61 74 69 6f 6e 73 5d 0d 0a 0d 0a 20 20 20 20  cations]....    
1ecc0 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 5b 24      set count [$
1ecd0 6c 6f 63 61 74 69 6f 6e 73 20 43 6f 75 6e 74 5d  locations Count]
1ece0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ....        for 
1ecf0 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24  {set index 0} {$
1ed00 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20  index < $count} 
1ed10 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
1ed20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c 6f            set lo
1ed30 63 61 74 69 6f 6e 20 5b 24 6c 6f 63 61 74 69 6f  cation [$locatio
1ed40 6e 73 20 2d 61 6c 69 61 73 20 50 65 65 6b 20 24  ns -alias Peek $
1ed50 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20  index]....      
1ed60 20 20 20 20 69 66 20 7b 5b 69 73 4e 6f 6e 4e 75      if {[isNonNu
1ed70 6c 6c 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24  llObjectHandle $
1ed80 6c 6f 63 61 74 69 6f 6e 5d 7d 20 74 68 65 6e 20  location]} then 
1ed90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
1eda0 65 74 20 6c 6f 63 61 74 69 6f 6e 46 69 6c 65 4e  et locationFileN
1edb0 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  ame [file normal
1edc0 69 7a 65 20 5b 24 6c 6f 63 61 74 69 6f 6e 20 46  ize [$location F
1edd0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20  ileName]]....   
1ede0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
1edf0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 6f 63  ring length $loc
1ee00 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 5d 20 3e  ationFileName] >
1ee10 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ee20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
1ee30 6c 65 6e 67 74 68 20 24 6f 76 65 72 72 69 64 65  length $override
1ee40 50 61 74 74 65 72 6e 73 5d 20 3e 20 30 20 26 26  Patterns] > 0 &&
1ee50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ee60 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d        [lsearch -
1ee70 69 6e 76 65 72 73 65 20 2d 67 6c 6f 62 20 2d 2d  inverse -glob --
1ee80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ee90 20 20 20 20 20 20 20 20 20 20 24 6f 76 65 72 72            $overr
1eea0 69 64 65 50 61 74 74 65 72 6e 73 20 24 6c 6f 63  idePatterns $loc
1eeb0 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 5d 20 21  ationFileName] !
1eec0 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1eee0 74 75 72 6e 20 24 6c 6f 63 61 74 69 6f 6e 46 69  turn $locationFi
1eef0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1ef00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ef10 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
1ef20 65 6e 67 74 68 20 24 65 78 63 6c 75 64 65 50 61  ength $excludePa
1ef30 74 74 65 72 6e 73 5d 20 3d 3d 20 30 20 7c 7c 20  tterns] == 0 || 
1ef40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ef50 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 69       [lsearch -i
1ef60 6e 76 65 72 73 65 20 2d 67 6c 6f 62 20 2d 2d 20  nverse -glob -- 
1ef70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ef80 20 20 20 20 20 20 20 20 20 24 65 78 63 6c 75 64           $exclud
1ef90 65 50 61 74 74 65 72 6e 73 20 24 6c 6f 63 61 74  ePatterns $locat
1efa0 69 6f 6e 46 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  ionFileName] == 
1efb0 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1efd0 72 6e 20 24 6c 6f 63 61 74 69 6f 6e 46 69 6c 65  rn $locationFile
1efe0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1eff0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f000 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1f010 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1f020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
1f030 22 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75 6c  "..      } resul
1f040 74 5d 20 69 6e 20 5b 6c 69 73 74 20 30 20 32 5d  t] in [list 0 2]
1f050 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f060 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
1f070 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1f080 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
1f090 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f0a0 20 74 72 65 73 75 6c 74 20 7b 20 63 6f 64 65 20   tresult { code 
1f0b0 72 65 73 75 6c 74 20 7d 20 7b 0d 0a 20 20 20 20  result } {..    
1f0c0 20 20 68 6f 73 74 20 72 65 73 75 6c 74 20 24 63    host result $c
1f0d0 6f 64 65 20 24 72 65 73 75 6c 74 3b 20 74 6c 6f  ode $result; tlo
1f0e0 67 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  g $result..    }
1f0f0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1f100 74 50 61 73 73 65 64 50 65 72 63 65 6e 74 61 67  tPassedPercentag
1f110 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e {} {..      if
1f120 20 7b 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73   {$::eagle_tests
1f130 28 54 6f 74 61 6c 29 20 3e 20 30 7d 20 74 68 65  (Total) > 0} the
1f140 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
1f150 75 72 6e 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  urn [expr \..   
1f160 20 20 20 20 20 20 20 20 20 7b 31 30 30 2e 30 20           {100.0 
1f170 2a 20 28 28 24 3a 3a 65 61 67 6c 65 5f 74 65 73  * (($::eagle_tes
1f180 74 73 28 50 61 73 73 65 64 29 20 2b 20 5c 0d 0a  ts(Passed) + \..
1f190 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65              $::e
1f1a0 61 67 6c 65 5f 74 65 73 74 73 28 53 6b 69 70 70  agle_tests(Skipp
1f1b0 65 64 29 29 20 2f 20 5c 0d 0a 20 20 20 20 20 20  ed)) / \..      
1f1c0 20 20 20 20 20 20 64 6f 75 62 6c 65 28 24 3a 3a        double($::
1f1d0 65 61 67 6c 65 5f 74 65 73 74 73 28 54 6f 74 61  eagle_tests(Tota
1f1e0 6c 29 29 29 7d 5d 0d 0a 20 20 20 20 20 20 7d 0d  l)))}]..      }.
1f1f0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1f200 30 3b 20 23 20 6e 6f 20 74 65 73 74 73 20 77 65  0; # no tests we
1f210 72 65 20 72 75 6e 2c 20 65 74 63 2e 0d 0a 20 20  re run, etc...  
1f220 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f230 20 67 65 74 53 6b 69 70 70 65 64 50 65 72 63 65   getSkippedPerce
1f240 6e 74 61 67 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  ntage {} {..    
1f250 20 20 69 66 20 7b 24 3a 3a 65 61 67 6c 65 5f 74    if {$::eagle_t
1f260 65 73 74 73 28 54 6f 74 61 6c 29 20 3e 20 30 7d  ests(Total) > 0}
1f270 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f280 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 5c 0d   return [expr \.
1f290 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 30  .            {10
1f2a0 30 2e 30 20 2a 20 28 24 3a 3a 65 61 67 6c 65 5f  0.0 * ($::eagle_
1f2b0 74 65 73 74 73 28 53 6b 69 70 70 65 64 29 20 2f  tests(Skipped) /
1f2c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f2d0 64 6f 75 62 6c 65 28 24 3a 3a 65 61 67 6c 65 5f  double($::eagle_
1f2e0 74 65 73 74 73 28 54 6f 74 61 6c 29 29 29 7d 5d  tests(Total)))}]
1f2f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1f300 20 20 20 72 65 74 75 72 6e 20 30 3b 20 23 20 6e     return 0; # n
1f310 6f 20 74 65 73 74 73 20 77 65 72 65 20 72 75 6e  o tests were run
1f320 2c 20 65 74 63 2e 0d 0a 20 20 20 20 7d 0d 0a 0c  , etc...    }...
1f330 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 69  ..    proc getDi
1f340 73 61 62 6c 65 64 50 65 72 63 65 6e 74 61 67 65  sabledPercentage
1f350 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
1f360 7b 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28  {$::eagle_tests(
1f370 54 6f 74 61 6c 29 20 3e 20 30 7d 20 74 68 65 6e  Total) > 0} then
1f380 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
1f390 72 6e 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20  rn [expr \..    
1f3a0 20 20 20 20 20 20 20 20 7b 31 30 30 2e 30 20 2a          {100.0 *
1f3b0 20 28 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73   ($::eagle_tests
1f3c0 28 44 69 73 61 62 6c 65 64 29 20 2f 20 5c 0d 0a  (Disabled) / \..
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
1f3e0 6c 65 28 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74  le($::eagle_test
1f3f0 73 28 54 6f 74 61 6c 29 29 29 7d 5d 0d 0a 20 20  s(Total)))}]..  
1f400 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
1f410 65 74 75 72 6e 20 30 3b 20 23 20 6e 6f 20 74 65  eturn 0; # no te
1f420 73 74 73 20 77 65 72 65 20 72 75 6e 2c 20 65 74  sts were run, et
1f430 63 2e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  c...    }.....  
1f440 20 20 70 72 6f 63 20 74 65 73 74 4f 62 6a 65 63    proc testObjec
1f450 74 4d 65 6d 62 65 72 73 20 7b 20 61 72 67 73 20  tMembers { args 
1f460 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
1f470 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d  llength $args] =
1f480 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1f490 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65       error [appe
1f4a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f4b0 20 20 20 20 20 20 22 77 72 6f 6e 67 20 23 20 61        "wrong # a
1f4c0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1f4d0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1f4e0 20 20 5b 6c 69 6e 64 65 78 20 5b 69 6e 66 6f 20    [lindex [info 
1f4f0 6c 65 76 65 6c 20 5b 69 6e 66 6f 20 6c 65 76 65  level [info leve
1f500 6c 5d 5d 20 30 5d 20 5c 0d 0a 20 20 20 20 20 20  l]] 0] \..      
1f510 20 20 20 20 20 20 22 20 3f 6f 70 74 69 6f 6e 73        " ?options
1f520 3f 20 6f 62 6a 65 63 74 5c 22 22 5d 0d 0a 20 20  ? object\""]..  
1f530 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
1f540 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74  et command [list
1f550 20 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 5d   object members]
1f560 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70  ..      eval lap
1f570 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72  pend command $ar
1f580 67 73 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75  gs....      retu
1f590 72 6e 20 5b 6c 73 6f 72 74 20 5b 75 70 6c 65 76  rn [lsort [uplev
1f5a0 65 6c 20 31 20 24 63 6f 6d 6d 61 6e 64 5d 5d 0d  el 1 $command]].
1f5b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1f5c0 72 6f 63 20 63 72 65 61 74 65 54 68 72 65 61 64  roc createThread
1f5d0 20 7b 20 73 63 72 69 70 74 20 7b 70 61 72 61 6d   { script {param
1f5e0 65 74 65 72 69 7a 65 64 20 66 61 6c 73 65 7d 20  eterized false} 
1f5f0 7b 6d 61 78 53 74 61 63 6b 53 69 7a 65 20 22 22  {maxStackSize ""
1f600 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
1f610 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d 7d  {[isDotNetCore]}
1f620 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f630 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 48 41   #..        # HA
1f640 43 4b 3a 20 54 68 69 73 20 73 65 65 6d 73 20 74  CK: This seems t
1f650 6f 20 6d 61 6b 65 20 2e 4e 45 54 20 43 6f 72 65  o make .NET Core
1f660 20 68 61 70 70 69 65 72 20 66 6f 72 20 72 65 61   happier for rea
1f670 73 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  sons..        # 
1f680 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 6e        that are n
1f690 6f 74 20 65 6e 74 69 72 65 6c 79 20 63 6c 65 61  ot entirely clea
1f6a0 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
1f6b0 20 20 20 20 20 20 20 73 65 74 20 74 79 70 65 4e         set typeN
1f6c0 61 6d 65 20 22 53 79 73 74 65 6d 2e 54 68 72 65  ame "System.Thre
1f6d0 61 64 69 6e 67 2e 54 68 72 65 61 64 2c 20 6d 73  ading.Thread, ms
1f6e0 63 6f 72 6c 69 62 22 0d 0a 20 20 20 20 20 20 7d  corlib"..      }
1f6f0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1f700 20 73 65 74 20 74 79 70 65 4e 61 6d 65 20 53 79   set typeName Sy
1f710 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54  stem.Threading.T
1f720 68 72 65 61 64 0d 0a 20 20 20 20 20 20 7d 0d 0a  hread..      }..
1f730 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 61 72  ..      if {$par
1f740 61 6d 65 74 65 72 69 7a 65 64 7d 20 74 68 65 6e  ameterized} then
1f750 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1f760 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f770 6d 61 78 53 74 61 63 6b 53 69 7a 65 5d 20 3e 20  maxStackSize] > 
1f780 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f790 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a       return [obj
1f7a0 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
1f7b0 73 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  s -objectflags +
1f7c0 4e 6f 52 65 74 75 72 6e 52 65 66 65 72 65 6e 63  NoReturnReferenc
1f7d0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1f7e0 20 20 20 2d 70 61 72 61 6d 65 74 65 72 74 79 70     -parametertyp
1f7f0 65 73 20 5b 6c 69 73 74 20 53 79 73 74 65 6d 2e  es [list System.
1f800 54 68 72 65 61 64 69 6e 67 2e 50 61 72 61 6d 65  Threading.Parame
1f810 74 65 72 69 7a 65 64 54 68 72 65 61 64 53 74 61  terizedThreadSta
1f820 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
1f830 20 20 20 20 53 79 73 74 65 6d 2e 49 6e 74 33 32      System.Int32
1f840 5d 20 24 74 79 70 65 4e 61 6d 65 20 24 73 63 72  ] $typeName $scr
1f850 69 70 74 20 24 6d 61 78 53 74 61 63 6b 53 69 7a  ipt $maxStackSiz
1f860 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  e]..        } el
1f870 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1f880 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 63  return [object c
1f890 72 65 61 74 65 20 2d 61 6c 69 61 73 20 2d 6f 62  reate -alias -ob
1f8a0 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 52 65 74  jectflags +NoRet
1f8b0 75 72 6e 52 65 66 65 72 65 6e 63 65 20 5c 0d 0a  urnReference \..
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 70                -p
1f8d0 61 72 61 6d 65 74 65 72 74 79 70 65 73 20 5b 6c  arametertypes [l
1f8e0 69 73 74 20 53 79 73 74 65 6d 2e 54 68 72 65 61  ist System.Threa
1f8f0 64 69 6e 67 2e 50 61 72 61 6d 65 74 65 72 69 7a  ding.Parameteriz
1f900 65 64 54 68 72 65 61 64 53 74 61 72 74 5d 20 5c  edThreadStart] \
1f910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f920 24 74 79 70 65 4e 61 6d 65 20 24 73 63 72 69 70  $typeName $scrip
1f930 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  t]..        }.. 
1f940 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1f950 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1f960 6e 67 20 6c 65 6e 67 74 68 20 24 6d 61 78 53 74  ng length $maxSt
1f970 61 63 6b 53 69 7a 65 5d 20 3e 20 30 7d 20 74 68  ackSize] > 0} th
1f980 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f990 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 63  return [object c
1f9a0 72 65 61 74 65 20 2d 61 6c 69 61 73 20 2d 6f 62  reate -alias -ob
1f9b0 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 52 65 74  jectflags +NoRet
1f9c0 75 72 6e 52 65 66 65 72 65 6e 63 65 20 5c 0d 0a  urnReference \..
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 70                -p
1f9e0 61 72 61 6d 65 74 65 72 74 79 70 65 73 20 5b 6c  arametertypes [l
1f9f0 69 73 74 20 53 79 73 74 65 6d 2e 54 68 72 65 61  ist System.Threa
1fa00 64 69 6e 67 2e 54 68 72 65 61 64 53 74 61 72 74  ding.ThreadStart
1fa10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fa20 20 20 53 79 73 74 65 6d 2e 49 6e 74 33 32 5d 20    System.Int32] 
1fa30 24 74 79 70 65 4e 61 6d 65 20 24 73 63 72 69 70  $typeName $scrip
1fa40 74 20 24 6d 61 78 53 74 61 63 6b 53 69 7a 65 5d  t $maxStackSize]
1fa50 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1fa60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
1fa70 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 63 72 65  turn [object cre
1fa80 61 74 65 20 2d 61 6c 69 61 73 20 2d 6f 62 6a 65  ate -alias -obje
1fa90 63 74 66 6c 61 67 73 20 2b 4e 6f 52 65 74 75 72  ctflags +NoRetur
1faa0 6e 52 65 66 65 72 65 6e 63 65 20 5c 0d 0a 20 20  nReference \..  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2d 70 61 72              -par
1fac0 61 6d 65 74 65 72 74 79 70 65 73 20 5b 6c 69 73  ametertypes [lis
1fad0 74 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69  t System.Threadi
1fae0 6e 67 2e 54 68 72 65 61 64 53 74 61 72 74 5d 20  ng.ThreadStart] 
1faf0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fb00 20 24 74 79 70 65 4e 61 6d 65 20 24 73 63 72 69   $typeName $scri
1fb10 70 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  pt]..        }..
1fb20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1fb30 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 74 61 72  ...    proc star
1fb40 74 54 68 72 65 61 64 20 7b 20 74 68 72 65 61 64  tThread { thread
1fb50 20 7b 70 61 72 61 6d 65 74 65 72 69 7a 65 64 20   {parameterized 
1fb60 66 61 6c 73 65 7d 20 7b 70 61 72 61 6d 65 74 65  false} {paramete
1fb70 72 20 6e 75 6c 6c 7d 20 7d 20 7b 0d 0a 20 20 20  r null} } {..   
1fb80 20 20 20 69 66 20 7b 24 70 61 72 61 6d 65 74 65     if {$paramete
1fb90 72 69 7a 65 64 7d 20 74 68 65 6e 20 7b 0d 0a 20  rized} then {.. 
1fba0 20 20 20 20 20 20 20 24 74 68 72 65 61 64 20 53         $thread S
1fbb0 74 61 72 74 20 24 70 61 72 61 6d 65 74 65 72 0d  tart $parameter.
1fbc0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1fbd0 0a 20 20 20 20 20 20 20 20 24 74 68 72 65 61 64  .        $thread
1fbe0 20 53 74 61 72 74 0d 0a 20 20 20 20 20 20 7d 0d   Start..      }.
1fbf0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1fc00 72 6f 63 20 63 6c 65 61 6e 75 70 54 68 72 65 61  roc cleanupThrea
1fc10 64 20 7b 20 74 68 72 65 61 64 20 7b 74 69 6d 65  d { thread {time
1fc20 6f 75 74 20 32 30 30 30 7d 20 7d 20 7b 0d 0a 20  out 2000} } {.. 
1fc30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1fc40 48 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69  HACK: When runni
1fc50 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c  ng on .NET Core,
1fc60 20 69 74 20 73 65 65 6d 73 20 74 68 61 74 20 75   it seems that u
1fc70 73 69 6e 67 20 74 68 65 20 49 6e 74 65 72 72 75  sing the Interru
1fc80 70 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  pt..      #     
1fc90 20 20 6d 65 74 68 6f 64 20 63 61 6e 20 72 65 73    method can res
1fca0 75 6c 74 20 69 6e 20 61 20 68 65 6c 64 20 6c 6f  ult in a held lo
1fcb0 63 6b 20 62 65 69 6e 67 20 6c 6f 73 74 2c 20 65  ck being lost, e
1fcc0 76 65 6e 20 77 68 65 6e 20 75 73 69 6e 67 0d 0a  ven when using..
1fcd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20        #       a 
1fce0 6c 6f 63 6b 20 73 74 61 74 65 6d 65 6e 74 2c 20  lock statement, 
1fcf0 77 68 69 63 68 20 73 68 6f 75 6c 64 20 68 61 76  which should hav
1fd00 65 20 74 72 79 20 2f 20 66 69 6e 61 6c 6c 79 20  e try / finally 
1fd10 73 65 6d 61 6e 74 69 63 73 2e 0d 0a 20 20 20 20  semantics...    
1fd20 20 20 23 20 20 20 20 20 20 20 54 68 65 72 65 66    #       Theref
1fd30 6f 72 65 2c 20 69 6e 20 74 68 61 74 20 63 61 73  ore, in that cas
1fd40 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 77 61  e, attempt to wa
1fd50 69 74 20 6f 6e 20 74 68 65 20 74 68 72 65 61 64  it on the thread
1fd60 20 70 72 69 6f 72 0d 0a 20 20 20 20 20 20 23 20   prior..      # 
1fd70 20 20 20 20 20 20 74 6f 20 61 74 74 65 6d 70 74        to attempt
1fd80 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 49  ing to use the I
1fd90 6e 74 65 72 72 75 70 74 20 6d 65 74 68 6f 64 2e  nterrupt method.
1fda0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1fdb0 20 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f   if {[isDotNetCo
1fdc0 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  re]} then {..   
1fdd0 20 20 20 20 20 69 66 20 7b 5b 24 74 68 72 65 61       if {[$threa
1fde0 64 20 49 73 41 6c 69 76 65 5d 7d 20 74 68 65 6e  d IsAlive]} then
1fdf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1fe00 20 7b 5b 63 61 74 63 68 20 7b 24 74 68 72 65 61   {[catch {$threa
1fe10 64 20 4a 6f 69 6e 20 24 74 69 6d 65 6f 75 74 7d  d Join $timeout}
1fe20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1fe30 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1fe40 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1fe50 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1fe60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fe70 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
1fe80 6f 20 70 72 65 2d 6a 6f 69 6e 20 74 65 73 74 20  o pre-join test 
1fe90 74 68 72 65 61 64 20 5c 22 22 20 24 74 68 72 65  thread \"" $thre
1fea0 61 64 20 22 5c 22 3a 20 22 20 5c 0d 0a 20 20 20  ad "\": " \..   
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72               $er
1fec0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1fed0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 65 72     } elseif {$er
1fee0 72 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ror} then {..   
1fef0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ff00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ff10 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1ff30 2d 2d 2d 20 70 72 65 2d 6a 6f 69 6e 65 64 20 74  --- pre-joined t
1ff40 65 73 74 20 74 68 72 65 61 64 20 5c 22 22 20 24  est thread \"" $
1ff50 74 68 72 65 61 64 20 5c 22 5c 6e 5d 0d 0a 20 20  thread \"\n]..  
1ff60 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1ff70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1ff80 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1ff90 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ffa0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ffb0 20 20 20 22 2d 2d 2d 2d 20 74 69 6d 65 6f 75 74     "---- timeout
1ffc0 20 70 72 65 2d 6a 6f 69 6e 69 6e 67 20 74 65 73   pre-joining tes
1ffd0 74 20 74 68 72 65 61 64 20 5c 22 22 20 24 74 68  t thread \"" $th
1ffe0 72 65 61 64 20 22 20 28 22 20 5c 0d 0a 20 20 20  read " (" \..   
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 69               $ti
20000 6d 65 6f 75 74 20 22 20 6d 69 6c 6c 69 73 65 63  meout " millisec
20010 6f 6e 64 73 29 5c 22 5c 6e 22 5d 0d 0a 20 20 20  onds)\"\n"]..   
20020 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20030 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
20040 20 20 20 20 20 20 69 66 20 7b 5b 24 74 68 72 65        if {[$thre
20050 61 64 20 49 73 41 6c 69 76 65 5d 7d 20 74 68 65  ad IsAlive]} the
20060 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
20070 7b 5b 63 61 74 63 68 20 7b 24 74 68 72 65 61 64  {[catch {$thread
20080 20 49 6e 74 65 72 72 75 70 74 7d 20 65 72 72 6f   Interrupt} erro
20090 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
200a0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
200b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
200c0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
200d0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
200e0 61 69 6c 65 64 20 74 6f 20 69 6e 74 65 72 72 75  ailed to interru
200f0 70 74 20 74 65 73 74 20 74 68 72 65 61 64 20 5c  pt test thread \
20100 22 22 20 24 74 68 72 65 61 64 20 22 5c 22 3a 20  "" $thread "\": 
20110 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
20120 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20     $error \n].. 
20130 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20140 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
20150 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20160 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
20170 2d 2d 20 74 65 73 74 20 74 68 72 65 61 64 20 5c  -- test thread \
20180 22 22 20 24 74 68 72 65 61 64 20 5c 0d 0a 20 20  "" $thread \..  
20190 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
201a0 69 6e 74 65 72 72 75 70 74 65 64 5c 6e 22 5d 0d  interrupted\n"].
201b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
201c0 20 20 20 20 20 20 69 66 20 7b 5b 24 74 68 72 65        if {[$thre
201d0 61 64 20 49 73 41 6c 69 76 65 5d 7d 20 74 68 65  ad IsAlive]} the
201e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
201f0 66 20 7b 5b 63 61 74 63 68 20 7b 24 74 68 72 65  f {[catch {$thre
20200 61 64 20 4a 6f 69 6e 20 24 74 69 6d 65 6f 75 74  ad Join $timeout
20210 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
20220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
20230 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
20240 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20250 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20260 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
20270 74 6f 20 6a 6f 69 6e 20 74 65 73 74 20 74 68 72  to join test thr
20280 65 61 64 20 5c 22 22 20 24 74 68 72 65 61 64 20  ead \"" $thread 
20290 22 5c 22 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  "\": " \..      
202a0 20 20 20 20 20 20 20 20 20 20 24 65 72 72 6f 72            $error
202b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
202c0 7d 20 65 6c 73 65 69 66 20 7b 24 65 72 72 6f 72  } elseif {$error
202d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
202e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
202f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
20300 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 6a 6f  endArgs "---- jo
20310 69 6e 65 64 20 74 65 73 74 20 74 68 72 65 61 64  ined test thread
20320 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
20330 20 20 20 20 20 20 20 20 24 74 68 72 65 61 64 20          $thread 
20340 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
20350 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
20360 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
20370 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
20380 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
20390 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
203a0 2d 20 74 69 6d 65 6f 75 74 20 6a 6f 69 6e 69 6e  - timeout joinin
203b0 67 20 74 65 73 74 20 74 68 72 65 61 64 20 5c 22  g test thread \"
203c0 22 20 24 74 68 72 65 61 64 20 22 20 28 22 20 5c  " $thread " (" \
203d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
203e0 20 20 24 74 69 6d 65 6f 75 74 20 22 20 6d 69 6c    $timeout " mil
203f0 6c 69 73 65 63 6f 6e 64 73 29 5c 22 5c 6e 22 5d  liseconds)\"\n"]
20400 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
20410 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
20420 24 74 68 72 65 61 64 20 49 73 41 6c 69 76 65 5d  $thread IsAlive]
20430 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20440 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
20450 20 7b 24 74 68 72 65 61 64 20 41 62 6f 72 74 7d   {$thread Abort}
20460 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
20470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
20480 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
20490 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
204a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
204b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
204c0 65 64 20 74 6f 20 61 62 6f 72 74 20 74 65 73 74  ed to abort test
204d0 20 74 68 72 65 61 64 20 5c 22 22 20 24 74 68 72   thread \"" $thr
204e0 65 61 64 20 22 5c 22 3a 20 22 20 5c 0d 0a 20 20  ead "\": " \..  
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20500 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
20510 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20530 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
20540 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20550 73 20 22 2d 2d 2d 2d 20 74 65 73 74 20 74 68 72  s "---- test thr
20560 65 61 64 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ead \"" \..     
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 68               $th
20580 72 65 61 64 20 22 5c 22 20 61 62 6f 72 74 65 64  read "\" aborted
20590 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
205a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
205b0 20 20 20 69 66 20 7b 5b 24 74 68 72 65 61 64 20     if {[$thread 
205c0 49 73 41 6c 69 76 65 5d 7d 20 74 68 65 6e 20 7b  IsAlive]} then {
205d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
205e0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
205f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20600 73 20 22 2d 2d 2d 2d 20 74 65 73 74 20 74 68 72  s "---- test thr
20610 65 61 64 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ead \"" \..     
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 68               $th
20630 72 65 61 64 20 22 5c 22 20 61 70 70 65 61 72 73  read "\" appears
20640 20 74 6f 20 62 65 20 61 20 7a 6f 6d 62 69 65 5c   to be a zombie\
20650 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
20660 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
20670 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
20680 74 72 75 65 3b 20 23 20 61 62 6f 72 74 65 64 3f  true; # aborted?
20690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
206a0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
206b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
206c0 20 72 65 74 75 72 6e 20 74 72 75 65 3b 20 23 20   return true; # 
206d0 6a 6f 69 6e 65 64 3f 0d 0a 20 20 20 20 20 20 20  joined?..       
206e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
206f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
20700 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 20 23    return true; #
20710 20 69 6e 74 65 72 72 75 70 74 65 64 3f 0d 0a 20   interrupted?.. 
20720 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20730 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
20740 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 20 23    return true; #
20750 20 61 6c 72 65 61 64 79 20 64 65 61 64 3f 0d 0a   already dead?..
20760 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20770 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 20 23   return false; #
20780 20 73 74 69 6c 6c 20 61 6c 69 76 65 20 28 6f 72   still alive (or
20790 20 65 72 72 6f 72 29 2e 0d 0a 20 20 20 20 7d 0d   error)...    }.
207a0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
207b0 6f 72 74 54 65 73 74 43 6f 6e 73 74 72 61 69 6e  ortTestConstrain
207c0 74 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65  tCounts { channe
207d0 6c 20 73 6b 69 70 70 65 64 4e 61 6d 65 73 20 7d  l skippedNames }
207e0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
207f0 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 63 65     # NOTE: Proce
20800 73 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  ss the list of s
20810 6b 69 70 70 65 64 20 74 65 73 74 73 2c 20 77 68  kipped tests, wh
20820 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
20830 64 69 63 74 69 6f 6e 61 72 79 0d 0a 20 20 20 20  dictionary..    
20840 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 65 73    #       of tes
20850 74 20 6e 61 6d 65 73 20 74 6f 20 74 68 65 20 6c  t names to the l
20860 69 73 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ist of constrain
20870 74 73 20 74 68 61 74 20 63 61 75 73 65 64 20 74  ts that caused t
20880 68 65 6d 20 74 6f 20 62 65 0d 0a 20 20 20 20 20  hem to be..     
20890 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
208a0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 22 72  .  We need to "r
208b0 6f 6c 6c 20 74 68 65 6d 20 75 70 22 2c 20 6f 6e  oll them up", on
208c0 20 61 20 70 65 72 2d 63 6f 6e 73 74 72 61 69 6e   a per-constrain
208d0 74 20 62 61 73 69 73 2c 0d 0a 20 20 20 20 20 20  t basis,..      
208e0 23 20 20 20 20 20 20 20 61 6e 64 20 70 72 6f 64  #       and prod
208f0 75 63 65 20 63 6f 75 6e 74 73 20 66 6f 72 20 65  uce counts for e
20900 61 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  ach constraint. 
20910 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
20920 65 2c 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20  e, we..      #  
20930 20 20 20 20 20 6e 65 65 64 20 74 6f 20 6b 65 65       need to kee
20940 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
20950 61 78 69 6d 75 6d 20 63 6f 75 6e 74 20 73 65 65  aximum count see
20960 6e 2c 20 74 6f 20 68 65 6c 70 20 61 6c 69 67 6e  n, to help align
20970 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
20980 20 20 20 20 66 69 6e 61 6c 20 6f 75 74 70 75 74      final output
20990 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
209a0 20 20 73 65 74 20 6d 61 78 69 6d 75 6d 20 30 0d    set maximum 0.
209b0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
209c0 20 7b 74 65 73 74 4e 61 6d 65 20 63 6f 6e 73 74   {testName const
209d0 72 61 69 6e 74 4e 61 6d 65 73 7d 20 24 73 6b 69  raintNames} $ski
209e0 70 70 65 64 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  ppedNames {..   
209f0 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e       foreach con
20a00 73 74 72 61 69 6e 74 4e 61 6d 65 20 24 63 6f 6e  straintName $con
20a10 73 74 72 61 69 6e 74 4e 61 6d 65 73 20 7b 0d 0a  straintNames {..
20a20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
20a30 6e 66 6f 20 65 78 69 73 74 73 20 73 6b 69 70 70  nfo exists skipp
20a40 65 64 43 6f 75 6e 74 73 28 24 63 6f 6e 73 74 72  edCounts($constr
20a50 61 69 6e 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e  aintName)]} then
20a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20a70 69 6e 63 72 20 73 6b 69 70 70 65 64 43 6f 75 6e  incr skippedCoun
20a80 74 73 28 24 63 6f 6e 73 74 72 61 69 6e 74 4e 61  ts($constraintNa
20a90 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me)..          }
20aa0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
20ab0 20 20 20 20 20 73 65 74 20 73 6b 69 70 70 65 64       set skipped
20ac0 43 6f 75 6e 74 73 28 24 63 6f 6e 73 74 72 61 69  Counts($constrai
20ad0 6e 74 4e 61 6d 65 29 20 31 0d 0a 20 20 20 20 20  ntName) 1..     
20ae0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20af0 20 20 20 20 69 66 20 7b 24 73 6b 69 70 70 65 64      if {$skipped
20b00 43 6f 75 6e 74 73 28 24 63 6f 6e 73 74 72 61 69  Counts($constrai
20b10 6e 74 4e 61 6d 65 29 20 3e 20 24 6d 61 78 69 6d  ntName) > $maxim
20b20 75 6d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  um} then {..    
20b30 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 78 69          set maxi
20b40 6d 75 6d 20 24 73 6b 69 70 70 65 64 43 6f 75 6e  mum $skippedCoun
20b50 74 73 28 24 63 6f 6e 73 74 72 61 69 6e 74 4e 61  ts($constraintNa
20b60 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me)..          }
20b70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
20b80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
20b90 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50  .      # NOTE: P
20ba0 72 6f 64 75 63 65 20 74 68 65 20 66 69 6e 61 6c  roduce the final
20bb0 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
20bc0 6e 63 6c 75 64 65 73 20 61 20 73 69 6e 67 6c 65  ncludes a single
20bd0 20 6c 69 6e 65 20 68 65 61 64 65 72 0d 0a 20 20   line header..  
20be0 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 6c 6c      #       foll
20bf0 6f 77 65 64 20 62 79 20 6f 6e 65 20 6c 69 6e 65  owed by one line
20c00 20 70 65 72 20 74 65 73 74 20 63 6f 6e 73 74 72   per test constr
20c10 61 69 6e 74 20 73 65 65 6e 2e 0d 0a 20 20 20 20  aint seen...    
20c20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
20c30 6d 61 78 69 6d 75 6d 20 3e 20 30 20 26 26 20 5b  maximum > 0 && [
20c40 61 72 72 61 79 20 73 69 7a 65 20 73 6b 69 70 70  array size skipp
20c50 65 64 43 6f 75 6e 74 73 5d 20 3e 20 30 7d 20 74  edCounts] > 0} t
20c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
20c70 65 74 20 70 6c 61 63 65 73 20 5b 65 78 70 72 20  et places [expr 
20c80 7b 69 6e 74 28 6c 6f 67 31 30 28 24 6d 61 78 69  {int(log10($maxi
20c90 6d 75 6d 29 29 20 2b 20 31 7d 5d 0d 0a 0d 0a 20  mum)) + 1}].... 
20ca0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
20cb0 61 6e 6e 65 6c 20 22 4e 75 6d 62 65 72 20 6f 66  annel "Number of
20cc0 20 74 65 73 74 73 20 73 6b 69 70 70 65 64 20 66   tests skipped f
20cd0 6f 72 20 65 61 63 68 20 63 6f 6e 73 74 72 61 69  or each constrai
20ce0 6e 74 3a 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  nt:\n"....      
20cf0 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20    foreach {name 
20d00 76 61 6c 75 65 7d 20 5b 72 65 70 6f 72 74 41 72  value} [reportAr
20d10 72 61 79 47 65 74 20 73 6b 69 70 70 65 64 43 6f  rayGet skippedCo
20d20 75 6e 74 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  unts] {..       
20d30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20d40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  .              \
20d60 74 20 5b 66 6f 72 6d 61 74 20 5b 61 70 70 65 6e  t [format [appen
20d70 64 41 72 67 73 20 25 20 24 70 6c 61 63 65 73 20  dArgs % $places 
20d80 73 5d 20 24 76 61 6c 75 65 5d 20 5c 74 20 24 6e  s] $value] \t $n
20d90 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
20da0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
20db0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 6e 0d  uts $channel \n.
20dc0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
20dd0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 70 75 72  ....    proc pur
20de0 67 65 41 6e 64 43 6c 65 61 6e 75 70 20 7b 20 63  geAndCleanup { c
20df0 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
20e00 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 75 70  .      catch {up
20e10 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
20e20 62 75 67 20 70 75 72 67 65 5d 7d 20 72 65 73 75  bug purge]} resu
20e30 6c 74 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  lt....      tput
20e40 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
20e50 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
20e60 20 20 20 20 22 2d 2d 2d 2d 20 70 75 72 67 65 20      "---- purge 
20e70 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 72 65  \"" $name "\" re
20e80 73 75 6c 74 73 3a 20 22 20 24 72 65 73 75 6c 74  sults: " $result
20e90 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 63 61   \n]....      ca
20ea0 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b  tch {uplevel 1 [
20eb0 6c 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e  list debug clean
20ec0 75 70 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 65  up {..        De
20ed0 66 61 75 6c 74 20 2d 4d 69 73 63 65 6c 6c 61 6e  fault -Miscellan
20ee0 65 6f 75 73 0d 0a 20 20 20 20 20 20 7d 5d 7d 20  eous..      }]} 
20ef0 72 65 73 75 6c 74 0d 0a 0d 0a 20 20 20 20 20 20  result....      
20f00 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
20f10 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
20f20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c          "---- cl
20f30 65 61 6e 75 70 20 5c 22 22 20 24 6e 61 6d 65 20  eanup \"" $name 
20f40 22 5c 22 20 72 65 73 75 6c 74 73 3a 20 22 20 24  "\" results: " $
20f50 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 0d 0a 20 20  result \n]....  
20f60 20 20 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76      catch {uplev
20f70 65 6c 20 31 20 5b 6c 69 73 74 20 6f 62 6a 65 63  el 1 [list objec
20f80 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
20f90 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
20fa0 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43          Eagle._C
20fb0 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74  omponents.Privat
20fc0 65 2e 50 72 6f 63 65 73 73 4f 70 73 20 43 6c 65  e.ProcessOps Cle
20fd0 61 72 4f 75 74 70 75 74 43 61 63 68 65 5d 7d 20  arOutputCache]} 
20fe0 72 65 73 75 6c 74 0d 0a 0d 0a 20 20 20 20 20 20  result....      
20ff0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21000 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21010 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 50 72          "---- Pr
21020 6f 63 65 73 73 4f 70 73 20 63 6c 65 61 6e 75 70  ocessOps cleanup
21030 20 72 65 73 75 6c 74 73 3a 20 22 20 24 72 65 73   results: " $res
21040 75 6c 74 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ult \n]....     
21050 20 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20   catch {uplevel 
21060 31 20 5b 6c 69 73 74 20 6f 62 6a 65 63 74 20 69  1 [list object i
21070 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
21080 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
21090 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70       Eagle._Comp
210a0 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 45  onents.Private.E
210b0 6e 75 6d 4f 70 73 20 43 6c 65 61 72 45 6e 75 6d  numOps ClearEnum
210c0 43 61 63 68 65 5d 7d 20 72 65 73 75 6c 74 0d 0a  Cache]} result..
210d0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
210e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
210f0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
21100 22 2d 2d 2d 2d 20 45 6e 75 6d 4f 70 73 20 63 6c  "---- EnumOps cl
21110 65 61 6e 75 70 20 72 65 73 75 6c 74 73 3a 20 22  eanup results: "
21120 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 0d 0a   $result \n]....
21130 20 20 20 20 20 20 63 61 74 63 68 20 7b 75 70 6c        catch {upl
21140 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6f 62 6a  evel 1 [list obj
21150 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
21160 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
21170 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e            Eagle.
21180 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76  _Components.Priv
21190 61 74 65 2e 48 65 6c 70 4f 70 73 20 43 6c 65 61  ate.HelpOps Clea
211a0 72 48 65 6c 70 43 61 63 68 65 5d 7d 20 72 65 73  rHelpCache]} res
211b0 75 6c 74 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  ult....      tpu
211c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
211d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
211e0 20 20 20 20 20 22 2d 2d 2d 2d 20 48 65 6c 70 4f       "---- HelpO
211f0 70 73 20 63 6c 65 61 6e 75 70 20 72 65 73 75 6c  ps cleanup resul
21200 74 73 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ts: " $result \n
21210 5d 0d 0a 0d 0a 20 20 20 20 20 20 63 61 74 63 68  ]....      catch
21220 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   {uplevel 1 [lis
21230 74 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  t object invoke 
21240 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
21250 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45  c \..          E
21260 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  agle._Components
21270 2e 50 72 69 76 61 74 65 2e 53 74 72 69 6e 67 4f  .Private.StringO
21280 70 73 20 43 6c 65 61 72 50 72 65 61 6d 62 6c 65  ps ClearPreamble
21290 45 6e 63 6f 64 69 6e 67 73 5d 7d 20 72 65 73 75  Encodings]} resu
212a0 6c 74 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  lt....      tput
212b0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
212c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
212d0 20 20 20 20 22 2d 2d 2d 2d 20 53 74 72 69 6e 67      "---- String
212e0 4f 70 73 20 63 6c 65 61 6e 75 70 20 72 65 73 75  Ops cleanup resu
212f0 6c 74 73 3a 20 22 20 24 72 65 73 75 6c 74 20 5c  lts: " $result \
21300 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 63 61 74 63  n]....      catc
21310 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  h {uplevel 1 [li
21320 73 74 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  st object invoke
21330 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
21340 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
21350 45 61 67 6c 65 2e 5f 43 6f 6d 70 61 72 65 72 73  Eagle._Comparers
21360 2e 46 69 6c 65 4e 61 6d 65 20 43 6c 65 61 72 43  .FileName ClearC
21370 61 63 68 65 5d 7d 20 72 65 73 75 6c 74 0d 0a 0d  ache]} result...
21380 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
21390 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
213a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
213b0 2d 2d 2d 2d 20 43 6f 6d 70 61 72 65 72 73 2e 46  ---- Comparers.F
213c0 69 6c 65 4e 61 6d 65 20 63 6c 65 61 6e 75 70 20  ileName cleanup 
213d0 72 65 73 75 6c 74 73 3a 20 22 20 24 72 65 73 75  results: " $resu
213e0 6c 74 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  lt \n]....      
213f0 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
21400 20 5b 6c 69 73 74 20 6f 62 6a 65 63 74 20 69 6e   [list object in
21410 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
21420 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
21430 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f      Eagle._Compo
21440 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 48 61  nents.Private.Ha
21450 73 68 4f 70 73 20 43 6c 65 61 6e 75 70 5d 7d 20  shOps Cleanup]} 
21460 72 65 73 75 6c 74 0d 0a 0d 0a 20 20 20 20 20 20  result....      
21470 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21480 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21490 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 48 61          "---- Ha
214a0 73 68 4f 70 73 20 63 6c 65 61 6e 75 70 20 72 65  shOps cleanup re
214b0 73 75 6c 74 73 3a 20 22 20 24 72 65 73 75 6c 74  sults: " $result
214c0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 63 61   \n]....      ca
214d0 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b  tch {uplevel 1 [
214e0 6c 69 73 74 20 6f 62 6a 65 63 74 20 69 6e 76 6f  list object invo
214f0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
21500 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
21510 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
21520 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 61 63 74  nts.Private.Fact
21530 6f 72 79 4f 70 73 20 43 6c 65 61 6e 75 70 5d 7d  oryOps Cleanup]}
21540 20 72 65 73 75 6c 74 0d 0a 0d 0a 20 20 20 20 20   result....     
21550 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
21560 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21570 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 46           "---- F
21580 61 63 74 6f 72 79 4f 70 73 20 63 6c 65 61 6e 75  actoryOps cleanu
21590 70 20 72 65 73 75 6c 74 73 3a 20 22 20 24 72 65  p results: " $re
215a0 73 75 6c 74 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  sult \n]....    
215b0 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c    catch {uplevel
215c0 20 31 20 5b 6c 69 73 74 20 6f 62 6a 65 63 74 20   1 [list object 
215d0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
215e0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
215f0 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
21600 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
21610 53 63 72 69 70 74 4f 70 73 20 43 6c 65 61 72 49  ScriptOps ClearI
21620 6e 74 65 72 70 72 65 74 65 72 43 61 63 68 65 5d  nterpreterCache]
21630 7d 20 72 65 73 75 6c 74 0d 0a 0d 0a 20 20 20 20  } result....    
21640 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21650 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21660 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
21670 53 63 72 69 70 74 4f 70 73 20 63 6c 65 61 6e 75  ScriptOps cleanu
21680 70 20 72 65 73 75 6c 74 73 3a 20 22 20 24 72 65  p results: " $re
21690 73 75 6c 74 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  sult \n]....    
216a0 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c    catch {uplevel
216b0 20 31 20 5b 6c 69 73 74 20 6f 62 6a 65 63 74 20   1 [list object 
216c0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
216d0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
216e0 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
216f0 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
21700 53 79 6e 74 61 78 4f 70 73 20 43 6c 65 61 72 43  SyntaxOps ClearC
21710 61 63 68 65 5d 7d 20 72 65 73 75 6c 74 0d 0a 0d  ache]} result...
21720 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
21730 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21740 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
21750 2d 2d 2d 2d 20 53 79 6e 74 61 78 4f 70 73 20 63  ---- SyntaxOps c
21760 6c 65 61 6e 75 70 20 72 65 73 75 6c 74 73 3a 20  leanup results: 
21770 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
21780 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
21790 63 20 65 76 61 6c 57 69 74 68 54 69 6d 65 6f 75  c evalWithTimeou
217a0 74 20 7b 20 73 63 72 69 70 74 20 7b 6d 69 6c 6c  t { script {mill
217b0 69 73 65 63 6f 6e 64 73 20 32 30 30 30 7d 20 7b  iseconds 2000} {
217c0 72 65 73 75 6c 74 56 61 72 4e 61 6d 65 20 22 22  resultVarName ""
217d0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
217e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 56 65        # NOTE: Ve
217f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
21800 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
21810 6f 6e 64 73 20 72 65 71 75 65 73 74 65 64 20 69  onds requested i
21820 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0d 0a  s greater than..
21830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 7a 65        #       ze
21840 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ro...      #..  
21850 20 20 20 20 69 66 20 7b 24 6d 69 6c 6c 69 73 65      if {$millise
21860 63 6f 6e 64 73 20 3c 3d 20 30 7d 20 74 68 65 6e  conds <= 0} then
21870 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 72 72 6f   {..        erro
21880 72 20 22 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  r "number of mil
21890 6c 69 73 65 63 6f 6e 64 73 20 6d 75 73 74 20 62  liseconds must b
218a0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
218b0 65 72 6f 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ero"..      }...
218c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
218d0 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
218e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
218f0 63 72 69 70 74 20 69 6e 20 74 68 65 20 63 6f 6e  cript in the con
21900 74 65 78 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  text of the call
21910 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  er,..      #    
21920 20 20 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65     returning the
21930 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 63   result to the c
21940 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
21950 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
21960 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c  ng length $resul
21970 74 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  tVarName] > 0} t
21980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
21990 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 56 61  pvar 1 $resultVa
219a0 72 4e 61 6d 65 20 72 65 73 75 6c 74 0d 0a 20 20  rName result..  
219b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
219c0 65 74 75 72 6e 20 5b 63 61 74 63 68 20 7b 0d 0a  eturn [catch {..
219d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
219e0 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
219f0 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ate the script i
21a00 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
21a10 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 66 6f 72   the caller, for
21a20 63 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  cing..        # 
21a30 20 20 20 20 20 20 61 6e 79 20 5b 76 77 61 69 74        any [vwait
21a40 5d 20 74 68 61 74 20 6d 61 79 20 62 65 20 69 6e  ] that may be in
21a50 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 64 20 73   the contained s
21a60 63 72 69 70 74 20 74 6f 20 73 74 6f 70 0d 0a 20  cript to stop.. 
21a70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
21a80 68 65 6e 20 69 74 20 68 69 74 73 20 61 20 73 63  hen it hits a sc
21a90 72 69 70 74 20 63 61 6e 63 65 6c 6c 61 74 69 6f  ript cancellatio
21aa0 6e 20 2d 41 4e 44 2d 20 72 65 73 65 74 20 74 68  n -AND- reset th
21ab0 65 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20  e script..      
21ac0 20 20 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c    #       cancel
21ad0 6c 61 74 69 6f 6e 20 66 6c 61 67 73 20 75 70 6f  lation flags upo
21ae0 6e 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 28 69 2e  n completion (i.
21af0 65 2e 20 69 6d 70 6f 72 74 61 6e 74 20 64 75 65  e. important due
21b00 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
21b10 20 20 20 20 20 74 68 65 20 75 73 65 20 6f 66 20       the use of 
21b20 73 63 72 69 70 74 20 63 61 6e 63 65 6c 6c 61 74  script cancellat
21b30 69 6f 6e 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  ion to enforce t
21b40 68 65 20 74 69 6d 65 6f 75 74 29 2e 0d 0a 20 20  he timeout)...  
21b50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21b60 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
21b70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21b80 64 65 62 75 67 20 73 65 63 75 72 65 65 76 61 6c  debug secureeval
21b90 20 2d 6e 6f 63 61 6e 63 65 6c 20 74 72 75 65 20   -nocancel true 
21ba0 2d 73 74 6f 70 6f 6e 65 72 72 6f 72 20 74 72 75  -stoponerror tru
21bb0 65 20 2d 74 69 6d 65 6f 75 74 20 5c 0d 0a 20 20  e -timeout \..  
21bc0 20 20 20 20 20 20 20 20 20 20 24 6d 69 6c 6c 69            $milli
21bd0 73 65 63 6f 6e 64 73 20 7b 7d 20 24 73 63 72 69  seconds {} $scri
21be0 70 74 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73  pt]..      } res
21bf0 75 6c 74 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ult]..    }.....
21c00 20 20 20 20 70 72 6f 63 20 76 77 61 69 74 57 69      proc vwaitWi
21c10 74 68 54 69 6d 65 6f 75 74 20 7b 20 76 61 72 4e  thTimeout { varN
21c20 61 6d 65 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64  ame {millisecond
21c30 73 20 32 30 30 30 7d 20 7d 20 7b 0d 0a 20 20 20  s 2000} } {..   
21c40 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
21c50 54 45 3a 20 56 65 72 69 66 79 20 74 68 61 74 20  TE: Verify that 
21c60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
21c70 6c 6c 69 73 65 63 6f 6e 64 73 20 72 65 71 75 65  lliseconds reque
21c80 73 74 65 64 20 69 73 20 70 6f 73 69 74 69 76 65  sted is positive
21c90 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
21ca0 6f 72 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20  or zero...      
21cb0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6d 69  #..      if {$mi
21cc0 6c 6c 69 73 65 63 6f 6e 64 73 20 3c 20 30 7d 20  lliseconds < 0} 
21cd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21ce0 65 72 72 6f 72 20 22 6e 75 6d 62 65 72 20 6f 66  error "number of
21cf0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 63 61   milliseconds ca
21d00 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65  nnot be negative
21d10 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
21d20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
21d30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21d40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
21d50 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
21d60 69 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ied variable in 
21d70 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
21d80 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ur..        #   
21d90 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20      caller...   
21da0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21db0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
21dc0 20 76 61 72 69 61 62 6c 65 0d 0a 0d 0a 20 20 20   variable....   
21dd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21de0 23 20 4e 4f 54 45 3a 20 57 61 69 74 20 66 6f 72  # NOTE: Wait for
21df0 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 74 6f   the variable to
21e00 20 62 65 20 63 68 61 6e 67 65 64 20 2d 4f 52 2d   be changed -OR-
21e10 20 66 6f 72 20 74 68 65 20 77 61 69 74 0d 0a 20   for the wait.. 
21e20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
21e30 6f 20 62 65 20 63 61 6e 63 65 6c 65 64 2e 0d 0a  o be canceled...
21e40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21e50 20 20 20 76 77 61 69 74 20 2d 65 76 65 6e 74 77     vwait -eventw
21e60 61 69 74 66 6c 61 67 73 20 7b 2b 4e 6f 42 67 45  aitflags {+NoBgE
21e70 72 72 6f 72 20 53 74 6f 70 4f 6e 45 72 72 6f 72  rror StopOnError
21e80 7d 20 2d 66 6f 72 63 65 20 2d 74 69 6d 65 6f 75  } -force -timeou
21e90 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
21ea0 20 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2d   $milliseconds -
21eb0 2d 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  - variable..    
21ec0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
21ed0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21ee0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
21ef0 4f 54 45 3a 20 54 68 65 20 77 61 69 74 20 63 6f  OTE: The wait co
21f00 6d 70 6c 65 74 65 64 20 73 75 63 63 65 73 73 66  mpleted successf
21f10 75 6c 6c 79 2c 20 74 68 65 20 76 61 72 69 61 62  ully, the variab
21f20 6c 65 20 6d 61 79 20 68 61 76 65 0d 0a 20 20 20  le may have..   
21f30 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65       #       bee
21f40 6e 20 63 68 61 6e 67 65 64 2e 0d 0a 20 20 20 20  n changed...    
21f50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
21f60 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
21f70 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21f80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21f90 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 77 61    # NOTE: The wa
21fa0 69 74 20 66 61 69 6c 65 64 20 69 6e 20 73 6f 6d  it failed in som
21fb0 65 20 77 61 79 2c 20 69 74 20 6d 61 79 20 68 61  e way, it may ha
21fc0 76 65 20 62 65 65 6e 20 63 61 6e 63 65 6c 65 64  ve been canceled
21fd0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
21fe0 20 20 61 6e 64 20 74 68 65 20 76 61 72 69 61 62    and the variab
21ff0 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
22000 74 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e  t have been chan
22010 67 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ged...        #.
22020 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22030 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
22040 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
22050 6f 63 20 74 63 6c 4c 6f 61 64 46 6f 72 54 65 73  oc tclLoadForTes
22060 74 20 7b 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  t { {varName ""}
22070 20 7b 66 69 6e 64 46 6c 61 67 73 20 22 22 7d 20   {findFlags ""} 
22080 7b 6c 6f 61 64 46 6c 61 67 73 20 22 22 7d 20 7d  {loadFlags ""} }
22090 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
220a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
220b0 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
220c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
220d0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 6c 6f 61  r 1 $varName loa
220e0 64 65 64 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ded..      }....
220f0 20 20 20 20 20 20 73 65 74 20 6c 6f 61 64 65 64        set loaded
22100 20 30 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   0....      if {
22110 21 5b 74 63 6c 20 72 65 61 64 79 5d 7d 20 74 68  ![tcl ready]} th
22120 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
22130 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20  t command [list 
22140 74 63 6c 20 6c 6f 61 64 5d 0d 0a 0d 0a 20 20 20  tcl load]....   
22150 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
22160 20 6c 65 6e 67 74 68 20 24 66 69 6e 64 46 6c 61   length $findFla
22170 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
22180 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
22190 6e 64 20 63 6f 6d 6d 61 6e 64 20 2d 66 69 6e 64  nd command -find
221a0 66 6c 61 67 73 20 24 66 69 6e 64 46 6c 61 67 73  flags $findFlags
221b0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
221c0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
221d0 6e 67 20 6c 65 6e 67 74 68 20 24 6c 6f 61 64 46  ng length $loadF
221e0 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  lags] > 0} then 
221f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70  {..          lap
22200 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 2d 6c 6f  pend command -lo
22210 61 64 66 6c 61 67 73 20 24 6c 6f 61 64 46 6c 61  adflags $loadFla
22220 67 73 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  gs..        }...
22230 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
22240 20 31 20 24 63 6f 6d 6d 61 6e 64 3b 20 73 65 74   1 $command; set
22250 20 6c 6f 61 64 65 64 20 31 0d 0a 0d 0a 20 20 20   loaded 1....   
22260 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 20       set module 
22270 5b 74 63 6c 20 6d 6f 64 75 6c 65 5d 0d 0a 20 20  [tcl module]..  
22280 20 20 20 20 20 20 73 65 74 20 69 6e 74 65 72 70        set interp
22290 20 5b 74 63 6c 20 6d 61 73 74 65 72 5d 0d 0a 0d   [tcl master]...
222a0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
222b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
222c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
222d0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
222e0 6e 61 74 69 76 65 20 54 63 6c 20 6c 6f 61 64 65  native Tcl loade
222f0 64 2c 20 6d 6f 64 75 6c 65 20 5c 22 22 20 24 6d  d, module \"" $m
22300 6f 64 75 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  odule \..       
22310 20 20 20 20 20 22 5c 22 2c 20 69 6e 74 65 72 70       "\", interp
22320 72 65 74 65 72 20 5c 22 22 20 24 69 6e 74 65 72  reter \"" $inter
22330 70 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  p \"\n]..      }
22340 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
22350 70 72 6f 63 20 74 63 6c 55 6e 6c 6f 61 64 46 6f  proc tclUnloadFo
22360 72 54 65 73 74 20 7b 20 7b 66 6f 72 63 65 20 66  rTest { {force f
22370 61 6c 73 65 7d 20 7b 76 61 72 4e 61 6d 65 20 22  alse} {varName "
22380 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
22390 74 20 75 6e 6c 6f 61 64 20 66 61 6c 73 65 0d 0a  t unload false..
223a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72  ..      if {$for
223b0 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ce} then {..    
223c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
223d0 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6e 6e   NOTE: This cann
223e0 6f 74 20 63 68 65 63 6b 20 5b 74 63 6c 20 72 65  ot check [tcl re
223f0 61 64 79 5d 20 61 73 20 73 6f 6d 65 20 74 65 73  ady] as some tes
22400 74 73 20 61 63 74 75 61 6c 6c 79 0d 0a 20 20 20  ts actually..   
22410 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
22420 79 20 75 70 6f 6e 20 65 72 72 6f 72 73 20 66 72  y upon errors fr
22430 6f 6d 20 74 68 65 20 5b 74 63 6c 20 75 6e 6c 6f  om the [tcl unlo
22440 61 64 5d 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 2e  ad] sub-command.
22450 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22460 20 20 20 20 20 73 65 74 20 75 6e 6c 6f 61 64 20       set unload 
22470 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
22480 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
22490 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
224a0 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
224b0 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31  .        upvar 1
224c0 20 24 76 61 72 4e 61 6d 65 20 6c 6f 61 64 65 64   $varName loaded
224d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
224e0 24 6c 6f 61 64 65 64 20 26 26 20 21 24 75 6e 6c  $loaded && !$unl
224f0 6f 61 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  oad} then {..   
22500 20 20 20 20 20 20 20 73 65 74 20 75 6e 6c 6f 61         set unloa
22510 64 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  d true..        
22520 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  }....        uns
22530 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6c  et -nocomplain l
22540 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 7d 0d 0a  oaded..      }..
22550 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75 6e 6c  ..      if {$unl
22560 6f 61 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  oad} then {..   
22570 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 20       set module 
22580 5b 74 63 6c 20 6d 6f 64 75 6c 65 5d 0d 0a 20 20  [tcl module]..  
22590 20 20 20 20 20 20 73 65 74 20 69 6e 74 65 72 70        set interp
225a0 20 5b 74 63 6c 20 6d 61 73 74 65 72 5d 0d 0a 0d   [tcl master]...
225b0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
225c0 20 31 20 5b 6c 69 73 74 20 74 63 6c 20 75 6e 6c   1 [list tcl unl
225d0 6f 61 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  oad]....        
225e0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
225f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
22600 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22610 20 22 2d 2d 2d 2d 20 6e 61 74 69 76 65 20 54 63   "---- native Tc
22620 6c 20 22 20 5b 65 78 70 72 20 7b 24 66 6f 72 63  l " [expr {$forc
22630 65 20 3f 20 22 66 6f 72 63 69 62 6c 79 20 22 20  e ? "forcibly " 
22640 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
22650 20 20 20 20 20 20 22 75 6e 6c 6f 61 64 65 64 2c        "unloaded,
22660 20 6d 6f 64 75 6c 65 20 5c 22 22 20 24 6d 6f 64   module \"" $mod
22670 75 6c 65 20 22 5c 22 2c 20 69 6e 74 65 72 70 72  ule "\", interpr
22680 65 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  eter \"" \..    
22690 20 20 20 20 20 20 20 20 24 69 6e 74 65 72 70 20          $interp 
226a0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
226b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
226c0 6f 63 20 67 65 6e 65 72 61 74 65 55 6e 69 71 75  oc generateUniqu
226d0 65 49 64 20 7b 20 7b 74 65 78 74 20 22 22 7d 20  eId { {text ""} 
226e0 7b 6c 65 6e 67 74 68 20 31 36 7d 20 7d 20 7b 0d  {length 16} } {.
226f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
22700 23 20 48 41 43 4b 3a 20 54 68 69 73 20 73 68 6f  # HACK: This sho
22710 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20 72  uld generate a r
22720 65 61 73 6f 6e 61 62 6c 79 20 72 61 6e 64 6f 6d  easonably random
22730 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69   unique identifi
22740 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  er..      #     
22750 20 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 6e    suitable for n
22760 6f 6e 2d 63 72 79 70 74 6f 67 72 61 70 68 69 63  on-cryptographic
22770 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
22780 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
22790 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
227a0 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 65 78 74  ing length $text
227b0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
227c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73         return [s
227d0 74 72 69 6e 67 20 72 61 6e 67 65 20 5c 0d 0a 20  tring range \.. 
227e0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
227f0 6e 67 20 74 6f 6c 6f 77 65 72 20 5b 68 61 73 68  ng tolower [hash
22800 20 6e 6f 72 6d 61 6c 20 73 68 61 35 31 32 20 24   normal sha512 $
22810 74 65 78 74 5d 5d 20 30 20 24 6c 65 6e 67 74 68  text]] 0 $length
22820 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
22830 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
22840 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  n [string range 
22850 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22860 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 5b  string tolower [
22870 68 61 73 68 20 6e 6f 72 6d 61 6c 20 73 68 61 35  hash normal sha5
22880 31 32 20 5b 61 70 70 65 6e 64 41 72 67 73 20 75  12 [appendArgs u
22890 6e 69 71 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  niq \..         
228a0 20 20 20 5b 69 6e 66 6f 20 63 6f 6e 74 65 78 74     [info context
228b0 5d 20 5b 69 6e 66 6f 20 74 69 64 5d 20 5b 70 69  ] [info tid] [pi
228c0 64 5d 20 5b 63 6c 6f 63 6b 20 63 6c 69 63 6b 73  d] [clock clicks
228d0 5d 20 5b 63 6c 6f 63 6b 20 5c 0d 0a 20 20 20 20  ] [clock \..    
228e0 20 20 20 20 20 20 20 20 6e 6f 77 5d 5d 5d 5d 20          now]]]] 
228f0 30 20 24 6c 65 6e 67 74 68 5d 0d 0a 20 20 20 20  0 $length]..    
22900 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
22910 20 20 20 70 72 6f 63 20 74 65 73 74 45 78 65 63     proc testExec
22920 54 63 6c 53 63 72 69 70 74 20 7b 20 73 63 72 69  TclScript { scri
22930 70 74 20 7b 73 68 65 6c 6c 20 22 22 7d 20 7b 76  pt {shell ""} {v
22940 65 72 62 6f 73 65 20 30 7d 20 7d 20 7b 0d 0a 20  erbose 0} } {.. 
22950 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20       try {..    
22960 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
22970 20 4e 4f 54 45 3a 20 47 65 74 20 61 20 74 65 6d   NOTE: Get a tem
22980 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
22990 20 66 6f 72 20 74 68 65 20 73 63 72 69 70 74 20   for the script 
229a0 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 0d  we are going to.
229b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
229c0 20 75 73 65 20 74 6f 20 71 75 65 72 79 20 74 68   use to query th
229d0 65 20 6d 61 63 68 69 6e 65 20 74 79 70 65 20 66  e machine type f
229e0 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20 54 63  or the native Tc
229f0 6c 20 73 68 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  l shell...      
22a00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
22a10 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
22a20 74 65 6d 70 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  tempname]....   
22a30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22a40 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
22a50 65 20 6e 61 74 69 76 65 20 54 63 6c 20 73 68 65  e native Tcl she
22a60 6c 6c 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  ll cannot simply
22a70 20 65 76 61 6c 75 61 74 65 20 61 20 73 74 72 69   evaluate a stri
22a80 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ng..        #   
22a90 20 20 20 20 73 75 70 70 6c 69 65 64 20 76 69 61      supplied via
22aa0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
22ab0 65 2c 20 77 72 69 74 65 20 74 68 65 20 73 63 72  e, write the scr
22ac0 69 70 74 20 74 6f 20 62 65 0d 0a 20 20 20 20 20  ipt to be..     
22ad0 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c 75     #       evalu
22ae0 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 6d 70  ated to the temp
22af0 6f 72 61 72 79 20 66 69 6c 65 2e 0d 0a 20 20 20  orary file...   
22b00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22b10 77 72 69 74 65 46 69 6c 65 20 24 66 69 6c 65 4e  writeFile $fileN
22b20 61 6d 65 20 24 73 63 72 69 70 74 0d 0a 0d 0a 20  ame $script.... 
22b30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22b40 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
22b50 65 20 73 70 65 63 69 66 69 65 64 20 73 68 65 6c  e specified shel
22b60 6c 2c 20 69 66 20 69 74 20 69 73 20 76 61 6c 69  l, if it is vali
22b70 64 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  d; otherwise, us
22b80 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
22b90 20 20 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65     the configure
22ba0 64 20 54 63 6c 20 73 68 65 6c 6c 2e 0d 0a 20 20  d Tcl shell...  
22bb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22bc0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
22bd0 67 74 68 20 24 73 68 65 6c 6c 5d 20 3d 3d 20 30  gth $shell] == 0
22be0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22bf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22c00 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f 72 65 20   # NOTE: Before 
22c10 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 75 73  attempting to us
22c20 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  e the configured
22c30 20 54 63 6c 20 73 68 65 6c 6c 2c 20 6d 61 6b 65   Tcl shell, make
22c40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
22c50 20 20 20 20 73 75 72 65 20 69 74 20 68 61 73 20      sure it has 
22c60 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 73 65  actually been se
22c70 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
22c80 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
22c90 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
22ca0 73 74 5f 74 63 6c 73 68 5d 20 26 26 20 5c 0d 0a  st_tclsh] && \..
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
22cc0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
22cd0 74 65 73 74 5f 74 63 6c 73 68 5d 20 3e 20 30 7d  test_tclsh] > 0}
22ce0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22cf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22d00 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
22d10 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  the currently co
22d20 6e 66 69 67 75 72 65 64 20 54 63 6c 20 73 68 65  nfigured Tcl she
22d30 6c 6c 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  ll, which may or
22d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
22d50 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 61 63        may not ac
22d60 74 75 61 6c 6c 79 20 65 78 69 73 74 2e 0d 0a 20  tually exist... 
22d70 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
22d80 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 68            set sh
22d90 65 6c 6c 20 24 3a 3a 74 65 73 74 5f 74 63 6c 73  ell $::test_tcls
22da0 68 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  h..          } e
22db0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
22dc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
22dd0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 63 61 6e    # NOTE: We can
22de0 6e 6f 74 20 65 78 65 63 75 74 65 20 74 68 65 20  not execute the 
22df0 6e 61 74 69 76 65 20 54 63 6c 20 73 68 65 6c 6c  native Tcl shell
22e00 20 62 65 63 61 75 73 65 20 6f 6e 65 0d 0a 20 20   because one..  
22e10 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
22e20 20 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73    has not been s
22e30 70 65 63 69 66 69 65 64 2c 20 6e 6f 72 20 63 6f  pecified, nor co
22e40 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20  nfigured...     
22e50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22e60 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72 20        set error 
22e70 22 65 72 72 6f 72 3a 20 5c 22 3a 3a 74 65 73 74  "error: \"::test
22e80 5f 74 63 6c 73 68 5c 22 20 76 61 72 69 61 62 6c  _tclsh\" variabl
22e90 65 20 69 73 20 6d 69 73 73 69 6e 67 22 0d 0a 0d  e is missing"...
22ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22eb0 7b 24 76 65 72 62 6f 73 65 20 3e 20 30 7d 20 74  {$verbose > 0} t
22ec0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22ed0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22ee0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
22ef0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
22f00 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22f10 2d 20 6e 61 74 69 76 65 20 54 63 6c 20 73 63 72  - native Tcl scr
22f20 69 70 74 20 65 72 72 6f 72 3a 20 22 20 24 65 72  ipt error: " $er
22f30 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
22f40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
22f60 70 72 20 7b 24 76 65 72 62 6f 73 65 20 3e 20 33  pr {$verbose > 3
22f70 20 3f 20 24 65 72 72 6f 72 20 3a 20 22 65 72 72   ? $error : "err
22f80 6f 72 22 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20  or"}]..         
22f90 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
22fa0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22fb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 65 6e 65      # NOTE: Gene
22fc0 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 69 64  rate a unique id
22fd0 65 6e 74 69 66 69 65 72 20 74 6f 20 6d 61 6b 65  entifier to make
22fe0 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 6c 6f   it easier to lo
22ff0 63 61 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  cate..        # 
23000 20 20 20 20 20 20 74 68 69 73 20 73 63 72 69 70        this scrip
23010 74 20 61 6e 64 20 69 74 73 20 72 65 73 75 6c 74  t and its result
23020 73 20 69 6e 20 74 68 65 20 74 65 73 74 20 6c 6f  s in the test lo
23030 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  g file...       
23040 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
23050 24 76 65 72 62 6f 73 65 20 3e 20 31 7d 20 74 68  $verbose > 1} th
23060 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23070 73 65 74 20 69 64 20 5b 67 65 6e 65 72 61 74 65  set id [generate
23080 55 6e 69 71 75 65 49 64 20 24 73 63 72 69 70 74  UniqueId $script
23090 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
230a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
230b0 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
230c0 69 6e 20 22 75 6c 74 72 61 2d 76 65 72 62 6f 73  in "ultra-verbos
230d0 65 22 20 6d 6f 64 65 2c 20 65 6d 69 74 20 6e 61  e" mode, emit na
230e0 74 69 76 65 20 54 63 6c 20 73 63 72 69 70 74 20  tive Tcl script 
230f0 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
23100 20 20 20 20 74 68 65 20 6c 6f 67 20 66 69 6c 65      the log file
23110 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23120 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
23130 73 65 20 3e 20 32 7d 20 74 68 65 6e 20 7b 0d 0a  se > 2} then {..
23140 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23150 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23160 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
23180 2d 2d 20 6e 61 74 69 76 65 20 54 63 6c 20 73 63  -- native Tcl sc
23190 72 69 70 74 20 28 22 20 24 69 64 20 22 29 20 74  ript (" $id ") t
231a0 65 78 74 3a 20 22 20 5b 73 74 72 69 6e 67 20 74  ext: " [string t
231b0 72 69 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rim \..         
231c0 20 20 20 20 20 24 73 63 72 69 70 74 5d 20 5c 6e       $script] \n
231d0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
231e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
231f0 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
23200 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 75  ate the script u
23210 73 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  sing the native 
23220 54 63 6c 20 73 68 65 6c 6c 2c 20 74 72 69 6d 20  Tcl shell, trim 
23230 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
23240 20 20 20 20 20 65 78 63 65 73 73 20 77 68 69 74       excess whit
23250 65 73 70 61 63 65 20 66 72 6f 6d 20 74 68 65 20  espace from the 
23260 6f 75 74 70 75 74 2c 20 61 6e 64 20 72 65 74 75  output, and retu
23270 72 6e 20 69 74 20 74 6f 20 74 68 65 0d 0a 20 20  rn it to the..  
23280 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
23290 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  ller...        #
232a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
232b0 61 74 63 68 20 7b 73 74 72 69 6e 67 20 74 72 69  atch {string tri
232c0 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m \..           
232d0 20 5b 74 65 73 74 45 78 65 63 20 24 73 68 65 6c   [testExec $shel
232e0 6c 20 5b 6c 69 73 74 20 2d 73 75 63 63 65 73 73  l [list -success
232f0 20 53 75 63 63 65 73 73 5d 20 5c 0d 0a 20 20 20   Success] \..   
23300 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
23310 41 72 67 73 20 5c 22 20 24 66 69 6c 65 4e 61 6d  Args \" $fileNam
23320 65 20 5c 22 5d 5d 7d 20 72 65 73 75 6c 74 5d 20  e \"]]} result] 
23330 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
23340 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23350 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65       # NOTE: Whe
23360 6e 20 69 6e 20 22 73 75 70 65 72 2d 76 65 72 62  n in "super-verb
23370 6f 73 65 22 20 6d 6f 64 65 2c 20 65 6d 69 74 20  ose" mode, emit 
23380 6e 61 74 69 76 65 20 54 63 6c 20 73 63 72 69 70  native Tcl scrip
23390 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
233a0 20 20 20 20 20 72 65 73 75 6c 74 73 20 74 6f 20       results to 
233b0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20  the log file... 
233c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
233d0 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
233e0 73 65 20 3e 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  se > 1} then {..
233f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23400 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
23410 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
23420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23430 20 22 2d 2d 2d 2d 20 6e 61 74 69 76 65 20 54 63   "---- native Tc
23440 6c 20 73 63 72 69 70 74 20 28 22 20 24 69 64 20  l script (" $id 
23450 22 29 20 72 65 73 75 6c 74 3a 20 22 20 24 72 65  ") result: " $re
23460 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
23470 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23480 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
23490 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c  # NOTE: Success,
234a0 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
234b0 6c 74 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  lt to the caller
234c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
234d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
234e0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
234f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23500 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23510 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 63 6f     # NOTE: We co
23520 75 6c 64 20 6e 6f 74 20 65 78 65 63 75 74 65 20  uld not execute 
23530 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c 20 73  the native Tcl s
23540 68 65 6c 6c 20 28 70 65 72 68 61 70 73 20 6f 6e  hell (perhaps on
23550 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
23560 20 20 20 20 20 69 73 20 6e 6f 74 20 61 76 61 69       is not avai
23570 6c 61 62 6c 65 3f 29 2e 0d 0a 20 20 20 20 20 20  lable?)...      
23580 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
23590 20 73 65 74 20 65 72 72 6f 72 20 5b 61 70 70 65   set error [appe
235a0 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22  ndArgs "error: "
235b0 20 24 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20   $result]....   
235c0 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
235d0 6f 73 65 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ose > 0} then {.
235e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
235f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
23600 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
23610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23620 20 20 22 2d 2d 2d 2d 20 6e 61 74 69 76 65 20 54    "---- native T
23630 63 6c 20 73 63 72 69 70 74 20 65 72 72 6f 72 3a  cl script error:
23640 20 22 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20   " $error \n].. 
23650 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
23660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
23670 65 78 70 72 20 7b 24 76 65 72 62 6f 73 65 20 3e  expr {$verbose >
23680 20 33 20 3f 20 24 65 72 72 6f 72 20 3a 20 22 65   3 ? $error : "e
23690 72 72 6f 72 22 7d 5d 0d 0a 20 20 20 20 20 20 20  rror"}]..       
236a0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61   }..      } fina
236b0 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lly {..        #
236c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
236d0 3a 20 53 68 6f 75 6c 64 20 77 65 20 64 65 6c 65  : Should we dele
236e0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
236f0 20 66 69 6c 65 20 77 65 20 63 72 65 61 74 65 64   file we created
23700 2c 20 69 66 20 61 6e 79 3f 0d 0a 20 20 20 20 20  , if any?..     
23710 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
23720 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
23730 3a 3a 6e 6f 28 64 65 6c 65 74 65 54 65 73 74 45  ::no(deleteTestE
23740 78 65 63 54 63 6c 46 69 6c 65 29 5d 7d 20 74 68  xecTclFile)]} th
23750 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23760 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
23770 4f 54 45 3a 20 44 69 64 20 77 65 20 63 72 65 61  OTE: Did we crea
23780 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
23790 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ile to hold the 
237a0 54 63 6c 20 73 63 72 69 70 74 3f 0d 0a 20 20 20  Tcl script?..   
237b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
237c0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
237d0 69 73 74 73 20 66 69 6c 65 4e 61 6d 65 5d 20 26  ists fileName] &
237e0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
237f0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
23800 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  h $fileName] > 0
23810 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
23820 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73 74       [file exist
23830 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
23840 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
23860 20 23 20 4e 4f 54 45 3a 20 44 65 6c 65 74 65 20   # NOTE: Delete 
23870 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
23880 6c 65 20 77 65 20 75 73 65 64 20 74 6f 20 71 75  le we used to qu
23890 65 72 79 20 74 68 65 20 6d 61 63 68 69 6e 65 0d  ery the machine.
238a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
238b0 20 20 20 20 20 74 79 70 65 20 66 6f 72 20 74 68       type for th
238c0 65 20 6e 61 74 69 76 65 20 54 63 6c 20 73 68 65  e native Tcl she
238d0 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll...           
238e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
238f0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
23900 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 0d 0a 20  te $fileName}.. 
23910 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23920 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
23930 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
23940 6f 63 20 67 65 74 54 63 6c 53 68 65 6c 6c 56 65  oc getTclShellVe
23950 72 62 6f 73 69 74 79 20 7b 7d 20 7b 0d 0a 20 20  rbosity {} {..  
23960 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
23970 69 73 74 73 20 3a 3a 74 65 73 74 5f 74 63 6c 73  ists ::test_tcls
23980 68 5f 76 65 72 62 6f 73 65 5d 20 26 26 20 5c 0d  h_verbose] && \.
23990 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
239a0 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
239b0 74 72 69 63 74 20 24 3a 3a 74 65 73 74 5f 74 63  trict $::test_tc
239c0 6c 73 68 5f 76 65 72 62 6f 73 65 5d 7d 20 74 68  lsh_verbose]} th
239d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
239e0 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 74 63 6c  turn $::test_tcl
239f0 73 68 5f 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  sh_verbose..    
23a00 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23a10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 23 20      return 0; # 
23a20 54 4f 44 4f 3a 20 47 6f 6f 64 20 64 65 66 61 75  TODO: Good defau
23a30 6c 74 3f 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  lt?..      }..  
23a40 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
23a50 20 67 65 74 54 63 6c 56 65 72 73 69 6f 6e 46 6f   getTclVersionFo
23a60 72 54 63 6c 53 68 65 6c 6c 20 7b 20 7b 73 68 65  rTclShell { {she
23a70 6c 6c 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  ll ""} {verbose 
23a80 30 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65  0} } {..      re
23a90 74 75 72 6e 20 5b 74 65 73 74 45 78 65 63 54 63  turn [testExecTc
23aa0 6c 53 63 72 69 70 74 20 7b 0d 0a 20 20 20 20 20  lScript {..     
23ab0 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
23ac0 6e 65 20 73 74 64 6f 75 74 20 5b 69 6e 66 6f 20  ne stdout [info 
23ad0 74 63 6c 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20  tclversion]..   
23ae0 20 20 20 7d 20 24 73 68 65 6c 6c 20 24 76 65 72     } $shell $ver
23af0 62 6f 73 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  bose]..    }....
23b00 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d  .    proc getCom
23b10 6d 61 6e 64 73 46 6f 72 54 63 6c 53 68 65 6c 6c  mandsForTclShell
23b20 20 7b 20 7b 73 68 65 6c 6c 20 22 22 7d 20 7b 76   { {shell ""} {v
23b30 65 72 62 6f 73 65 20 30 7d 20 7d 20 7b 0d 0a 20  erbose 0} } {.. 
23b40 20 20 20 20 20 72 65 74 75 72 6e 20 5b 74 65 73       return [tes
23b50 74 45 78 65 63 54 63 6c 53 63 72 69 70 74 20 7b  tExecTclScript {
23b60 0d 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 2d  ..        puts -
23b70 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64 6f 75 74  nonewline stdout
23b80 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 5d   [info commands]
23b90 0d 0a 20 20 20 20 20 20 7d 20 24 73 68 65 6c 6c  ..      } $shell
23ba0 20 24 76 65 72 62 6f 73 65 5d 0d 0a 20 20 20 20   $verbose]..    
23bb0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
23bc0 65 74 4d 61 63 68 69 6e 65 46 6f 72 54 63 6c 53  etMachineForTclS
23bd0 68 65 6c 6c 20 7b 20 7b 73 68 65 6c 6c 20 22 22  hell { {shell ""
23be0 7d 20 7b 76 65 72 62 6f 73 65 20 30 7d 20 7d 20  } {verbose 0} } 
23bf0 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
23c00 5b 74 65 73 74 45 78 65 63 54 63 6c 53 63 72 69  [testExecTclScri
23c10 70 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 70 75  pt {..        pu
23c20 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73 74  ts -nonewline st
23c30 64 6f 75 74 20 24 74 63 6c 5f 70 6c 61 74 66 6f  dout $tcl_platfo
23c40 72 6d 28 6d 61 63 68 69 6e 65 29 0d 0a 20 20 20  rm(machine)..   
23c50 20 20 20 7d 20 24 73 68 65 6c 6c 20 24 76 65 72     } $shell $ver
23c60 62 6f 73 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  bose]..    }....
23c70 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 63 6c  .    proc getTcl
23c80 45 78 65 63 75 74 61 62 6c 65 46 6f 72 54 63 6c  ExecutableForTcl
23c90 53 68 65 6c 6c 20 7b 20 7b 73 68 65 6c 6c 20 22  Shell { {shell "
23ca0 22 7d 20 7b 76 65 72 62 6f 73 65 20 30 7d 20 7d  "} {verbose 0} }
23cb0 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
23cc0 20 5b 74 65 73 74 45 78 65 63 54 63 6c 53 63 72   [testExecTclScr
23cd0 69 70 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 70  ipt {..        p
23ce0 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73  uts -nonewline s
23cf0 74 64 6f 75 74 20 5b 69 6e 66 6f 20 6e 61 6d 65  tdout [info name
23d00 6f 66 65 78 65 63 75 74 61 62 6c 65 5d 0d 0a 20  ofexecutable].. 
23d10 20 20 20 20 20 7d 20 24 73 68 65 6c 6c 20 24 76       } $shell $v
23d20 65 72 62 6f 73 65 5d 0d 0a 20 20 20 20 7d 0d 0a  erbose]..    }..
23d30 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
23d40 6b 56 65 72 73 69 6f 6e 46 6f 72 54 63 6c 53 68  kVersionForTclSh
23d50 65 6c 6c 20 7b 20 7b 73 68 65 6c 6c 20 22 22 7d  ell { {shell ""}
23d60 20 7b 76 65 72 62 6f 73 65 20 30 7d 20 7d 20 7b   {verbose 0} } {
23d70 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
23d80 74 65 73 74 45 78 65 63 54 63 6c 53 63 72 69 70  testExecTclScrip
23d90 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 70 75 74  t {..        put
23da0 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64  s -nonewline std
23db0 6f 75 74 20 5b 70 61 63 6b 61 67 65 20 72 65 71  out [package req
23dc0 75 69 72 65 20 54 6b 5d 3b 20 65 78 69 74 0d 0a  uire Tk]; exit..
23dd0 20 20 20 20 20 20 7d 20 24 73 68 65 6c 6c 20 24        } $shell $
23de0 76 65 72 62 6f 73 65 5d 0d 0a 20 20 20 20 7d 0d  verbose]..    }.
23df0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 76 61  ....    proc eva
23e00 6c 57 69 74 68 54 63 6c 53 68 65 6c 6c 20 7b 20  lWithTclShell { 
23e10 73 63 72 69 70 74 20 7b 72 61 77 20 66 61 6c 73  script {raw fals
23e20 65 7d 20 7b 73 68 65 6c 6c 20 22 22 7d 20 7b 76  e} {shell ""} {v
23e30 65 72 62 6f 73 65 20 30 7d 20 7d 20 7b 0d 0a 20  erbose 0} } {.. 
23e40 20 20 20 20 20 72 65 74 75 72 6e 20 5b 74 65 73       return [tes
23e50 74 45 78 65 63 54 63 6c 53 63 72 69 70 74 20 5b  tExecTclScript [
23e60 73 74 72 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20  string map \..  
23e70 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 25 73          [list %s
23e80 63 72 69 70 74 25 20 24 73 63 72 69 70 74 20 25  cript% $script %
23e90 72 61 77 25 20 24 72 61 77 5d 20 7b 0d 0a 20 20  raw% $raw] {..  
23ea0 20 20 20 20 20 20 69 66 20 7b 25 72 61 77 25 7d        if {%raw%}
23eb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23ec0 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74     set code [cat
23ed0 63 68 20 7b 25 73 63 72 69 70 74 25 7d 20 72 65  ch {%script%} re
23ee0 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  sult]..         
23ef0 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
23f00 20 73 74 64 6f 75 74 20 5b 6c 69 73 74 20 24 63   stdout [list $c
23f10 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
23f20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
23f30 20 20 20 20 20 20 20 20 20 20 70 75 74 73 20 2d            puts -
23f40 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64 6f 75 74  nonewline stdout
23f50 20 5b 65 76 61 6c 20 7b 25 73 63 72 69 70 74 25   [eval {%script%
23f60 7d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  }]..        }.. 
23f70 20 20 20 20 20 7d 5d 20 24 73 68 65 6c 6c 20 24       }] $shell $
23f80 76 65 72 62 6f 73 65 5d 0d 0a 20 20 20 20 7d 0d  verbose]..    }.
23f90 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
23fa0 47 61 72 75 64 61 44 6c 6c 20 7b 20 7b 6d 61 63  GarudaDll { {mac
23fb0 68 69 6e 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  hine ""} } {..  
23fc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
23fd0 4f 54 45 3a 20 47 65 74 20 74 68 65 20 47 61 72  OTE: Get the Gar
23fe0 75 64 61 20 44 4c 4c 20 6f 66 20 74 68 65 20 73  uda DLL of the s
23ff0 61 6d 65 20 70 6c 61 74 66 6f 72 6d 20 28 69 2e  ame platform (i.
24000 65 2e 20 6d 61 63 68 69 6e 65 20 74 79 70 65 29  e. machine type)
24010 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
24020 61 73 20 74 68 65 20 6e 61 74 69 76 65 20 54 63  as the native Tc
24030 6c 20 73 68 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  l shell...      
24040 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
24050 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 61 73 65  fo exists ::base
24060 5f 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a  _path]} then {..
24070 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24080 20 20 20 23 20 4e 4f 54 45 3a 20 47 65 74 20 74     # NOTE: Get t
24090 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 73  he effective tes
240a0 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  t configuration.
240b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
240c0 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75       set configu
240d0 72 61 74 69 6f 6e 20 5b 67 65 74 54 65 73 74 43  ration [getTestC
240e0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
240f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24100 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
24110 68 65 72 65 20 69 73 20 6e 6f 20 65 66 66 65 63  here is no effec
24120 74 69 76 65 20 74 65 73 74 20 63 6f 6e 66 69 67  tive test config
24130 75 72 61 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c  uration availabl
24140 65 2c 20 77 65 0d 0a 20 20 20 20 20 20 20 20 23  e, we..        #
24150 20 20 20 20 20 20 20 63 61 6e 6e 6f 74 20 63 6f         cannot co
24160 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20  ntinue...       
24170 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
24180 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
24190 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3d  configuration] =
241a0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
241b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
241c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
241d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
241e0 20 20 23 20 4e 4f 54 45 3a 20 47 65 74 20 74 68    # NOTE: Get th
241f0 65 20 65 66 66 65 63 74 69 76 65 20 74 65 73 74  e effective test
24200 20 73 75 66 66 69 78 2e 20 20 54 68 69 73 20 69   suffix.  This i
24210 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  s allowed to be 
24220 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  an..        #   
24230 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67      empty string
24240 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24250 20 20 20 20 20 20 73 65 74 20 73 75 66 66 69 78        set suffix
24260 20 5b 67 65 74 54 65 73 74 53 75 66 66 69 78 5d   [getTestSuffix]
24270 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
24280 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
24290 66 20 6e 65 63 65 73 73 61 72 79 2c 20 61 75 74  f necessary, aut
242a0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63  omatically detec
242b0 74 20 74 68 65 20 6d 61 63 68 69 6e 65 20 66 6f  t the machine fo
242c0 72 20 74 68 65 20 54 63 6c 0d 0a 20 20 20 20 20  r the Tcl..     
242d0 20 20 20 23 20 20 20 20 20 20 20 73 68 65 6c 6c     #       shell
242e0 20 74 68 61 74 20 77 65 20 70 6c 61 6e 20 6f 6e   that we plan on
242f0 20 75 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20   using...       
24300 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
24310 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
24320 6d 61 63 68 69 6e 65 5d 20 3d 3d 20 30 20 26 26  machine] == 0 &&
24330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24340 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
24350 6e 6f 28 67 65 74 4d 61 63 68 69 6e 65 46 6f 72  no(getMachineFor
24360 54 63 6c 53 68 65 6c 6c 29 5d 7d 20 74 68 65 6e  TclShell)]} then
24370 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
24380 74 20 6d 61 63 68 69 6e 65 20 5b 67 65 74 4d 61  t machine [getMa
24390 63 68 69 6e 65 46 6f 72 54 63 6c 53 68 65 6c 6c  chineForTclShell
243a0 20 22 22 20 5b 67 65 74 54 63 6c 53 68 65 6c 6c   "" [getTclShell
243b0 56 65 72 62 6f 73 69 74 79 5d 5d 0d 0a 20 20 20  Verbosity]]..   
243c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
243d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
243e0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
243f0 75 6c 6c 20 70 61 74 68 20 61 6e 64 20 66 69 6c  ull path and fil
24400 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 47 61  e name of the Ga
24410 72 75 64 61 20 44 4c 4c 2c 20 75 73 69 6e 67 0d  ruda DLL, using.
24420 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24430 20 74 68 65 20 45 61 67 6c 65 20 62 61 73 65 20   the Eagle base 
24440 70 61 74 68 2e 20 20 43 75 72 72 65 6e 74 6c 79  path.  Currently
24450 2c 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79  , this will only
24460 20 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20 20 23   work..        #
24470 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79         correctly
24480 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
24490 74 65 20 69 73 20 62 65 69 6e 67 20 72 75 6e 20  te is being run 
244a0 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 68 65 0d  from inside the.
244b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
244c0 20 73 6f 75 72 63 65 20 74 72 65 65 2e 0d 0a 20   source tree... 
244d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
244e0 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a    return [file j
244f0 6f 69 6e 20 24 3a 3a 62 61 73 65 5f 70 61 74 68  oin $::base_path
24500 20 62 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20   bin \..        
24510 20 20 20 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c      [machineToPl
24520 61 74 66 6f 72 6d 20 24 6d 61 63 68 69 6e 65 5d  atform $machine]
24530 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 63 6f   [appendArgs $co
24540 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 6c 6c 20  nfiguration Dll 
24550 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
24560 73 75 66 66 69 78 5d 20 5b 61 70 70 65 6e 64 41  suffix] [appendA
24570 72 67 73 20 47 61 72 75 64 61 20 5b 69 6e 66 6f  rgs Garuda [info
24580 20 73 68 61 72 65 64 6c 69 62 65 78 74 65 6e 73   sharedlibextens
24590 69 6f 6e 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  ion]]]..      } 
245a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
245b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
245c0 45 3a 20 57 65 20 61 72 65 20 6d 69 73 73 69 6e  E: We are missin
245d0 67 20 74 68 65 20 62 61 73 65 20 70 61 74 68 2c  g the base path,
245e0 20 72 65 74 75 72 6e 20 6e 6f 74 68 69 6e 67 2e   return nothing.
245f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24600 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
24610 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24620 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61  ...    proc clea
24630 6e 75 70 45 78 63 65 6c 20 7b 7d 20 7b 0d 0a 20  nupExcel {} {.. 
24640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
24650 54 4f 44 4f 3a 20 54 68 65 73 65 20 6d 61 79 20  TODO: These may 
24660 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
24670 65 64 20 69 6e 20 6c 61 74 65 72 20 45 78 63 65  ed in later Exce
24680 6c 20 76 65 72 73 69 6f 6e 73 2e 0d 0a 20 20 20  l versions...   
24690 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65     #..      obje
246a0 63 74 20 75 6e 64 65 63 6c 61 72 65 20 2d 64 65  ct undeclare -de
246b0 63 6c 61 72 65 70 61 74 74 65 72 6e 20 4d 69 63  clarepattern Mic
246c0 72 6f 73 6f 66 74 2e 4f 66 66 69 63 65 2e 49 6e  rosoft.Office.In
246d0 74 65 72 6f 70 2e 45 78 63 65 6c 2a 0d 0a 20 20  terop.Excel*..  
246e0 20 20 20 20 6f 62 6a 65 63 74 20 75 6e 69 6d 70      object unimp
246f0 6f 72 74 20 2d 69 6d 70 6f 72 74 70 61 74 74 65  ort -importpatte
24700 72 6e 20 4d 69 63 72 6f 73 6f 66 74 2e 4f 66 66  rn Microsoft.Off
24710 69 63 65 2e 49 6e 74 65 72 6f 70 2e 45 78 63 65  ice.Interop.Exce
24720 6c 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  l..    }.....   
24730 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 56 69 73   proc cleanupVis
24740 75 61 6c 42 61 73 69 63 20 7b 7d 20 7b 0d 0a 20  ualBasic {} {.. 
24750 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
24760 54 4f 44 4f 3a 20 54 68 65 73 65 20 6d 61 79 20  TODO: These may 
24770 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
24780 65 64 20 69 6e 20 6c 61 74 65 72 20 66 72 61 6d  ed in later fram
24790 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 73 2e 0d  ework versions..
247a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
247b0 6f 62 6a 65 63 74 20 75 6e 69 6d 70 6f 72 74 20  object unimport 
247c0 2d 69 6d 70 6f 72 74 70 61 74 74 65 72 6e 20 4d  -importpattern M
247d0 69 63 72 6f 73 6f 66 74 2e 56 69 73 75 61 6c 42  icrosoft.VisualB
247e0 61 73 69 63 2a 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  asic*..    }....
247f0 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
24800 70 58 6d 6c 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  pXml {} {..     
24810 20 23 0d 0a 20 20 20 20 20 20 23 20 54 4f 44 4f   #..      # TODO
24820 3a 20 54 68 65 73 65 20 6d 61 79 20 6e 65 65 64  : These may need
24830 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 69   to be changed i
24840 6e 20 6c 61 74 65 72 20 66 72 61 6d 65 77 6f 72  n later framewor
24850 6b 20 76 65 72 73 69 6f 6e 73 2e 0d 0a 20 20 20  k versions...   
24860 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65     #..      obje
24870 63 74 20 75 6e 69 6d 70 6f 72 74 20 2d 69 6d 70  ct unimport -imp
24880 6f 72 74 70 61 74 74 65 72 6e 20 53 79 73 74 65  ortpattern Syste
24890 6d 2e 58 6d 6c 2a 0d 0a 20 20 20 20 7d 0d 0a 0c  m.Xml*..    }...
248a0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
248b0 75 70 57 69 6e 46 6f 72 6d 73 20 7b 7d 20 7b 0d  upWinForms {} {.
248c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
248d0 23 20 54 4f 44 4f 3a 20 54 68 65 73 65 20 6d 61  # TODO: These ma
248e0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  y need to be cha
248f0 6e 67 65 64 20 69 6e 20 6c 61 74 65 72 20 66 72  nged in later fr
24900 61 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 73  amework versions
24910 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
24920 20 20 6f 62 6a 65 63 74 20 75 6e 69 6d 70 6f 72    object unimpor
24930 74 20 2d 69 6d 70 6f 72 74 70 61 74 74 65 72 6e  t -importpattern
24940 20 53 79 73 74 65 6d 2e 52 65 73 6f 75 72 63 65   System.Resource
24950 73 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  s..      object 
24960 75 6e 69 6d 70 6f 72 74 20 2d 69 6d 70 6f 72 74  unimport -import
24970 70 61 74 74 65 72 6e 20 53 79 73 74 65 6d 2e 57  pattern System.W
24980 69 6e 64 6f 77 73 2e 46 6f 72 6d 73 0d 0a 20 20  indows.Forms..  
24990 20 20 20 20 6f 62 6a 65 63 74 20 75 6e 69 6d 70      object unimp
249a0 6f 72 74 20 2d 69 6d 70 6f 72 74 70 61 74 74 65  ort -importpatte
249b0 72 6e 20 53 79 73 74 65 6d 2e 57 69 6e 64 6f 77  rn System.Window
249c0 73 2e 46 6f 72 6d 73 2e 41 75 74 6f 6d 61 74 69  s.Forms.Automati
249d0 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65  on....      obje
249e0 63 74 20 75 6e 69 6d 70 6f 72 74 20 2d 69 6d 70  ct unimport -imp
249f0 6f 72 74 70 61 74 74 65 72 6e 20 5c 0d 0a 20 20  ortpattern \..  
24a00 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 57          System.W
24a10 69 6e 64 6f 77 73 2e 46 6f 72 6d 73 2e 43 6f 6d  indows.Forms.Com
24a20 70 6f 6e 65 6e 74 4d 6f 64 65 6c 2e 43 6f 6d 32  ponentModel.Com2
24a30 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20  Interop....     
24a40 20 6f 62 6a 65 63 74 20 75 6e 69 6d 70 6f 72 74   object unimport
24a50 20 2d 69 6d 70 6f 72 74 70 61 74 74 65 72 6e 20   -importpattern 
24a60 53 79 73 74 65 6d 2e 57 69 6e 64 6f 77 73 2e 46  System.Windows.F
24a70 6f 72 6d 73 2e 44 65 73 69 67 6e 0d 0a 20 20 20  orms.Design..   
24a80 20 20 20 6f 62 6a 65 63 74 20 75 6e 69 6d 70 6f     object unimpo
24a90 72 74 20 2d 69 6d 70 6f 72 74 70 61 74 74 65 72  rt -importpatter
24aa0 6e 20 53 79 73 74 65 6d 2e 57 69 6e 64 6f 77 73  n System.Windows
24ab0 2e 46 6f 72 6d 73 2e 4c 61 79 6f 75 74 0d 0a 20  .Forms.Layout.. 
24ac0 20 20 20 20 20 6f 62 6a 65 63 74 20 75 6e 69 6d       object unim
24ad0 70 6f 72 74 20 2d 69 6d 70 6f 72 74 70 61 74 74  port -importpatt
24ae0 65 72 6e 20 53 79 73 74 65 6d 2e 57 69 6e 64 6f  ern System.Windo
24af0 77 73 2e 46 6f 72 6d 73 2e 50 72 6f 70 65 72 74  ws.Forms.Propert
24b00 79 47 72 69 64 49 6e 74 65 72 6e 61 6c 0d 0a 20  yGridInternal.. 
24b10 20 20 20 20 20 6f 62 6a 65 63 74 20 75 6e 69 6d       object unim
24b20 70 6f 72 74 20 2d 69 6d 70 6f 72 74 70 61 74 74  port -importpatt
24b30 65 72 6e 20 53 79 73 74 65 6d 2e 57 69 6e 64 6f  ern System.Windo
24b40 77 73 2e 46 6f 72 6d 73 2e 56 69 73 75 61 6c 53  ws.Forms.VisualS
24b50 74 79 6c 65 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  tyles..    }....
24b60 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 73  .    proc getTes
24b70 74 4c 69 62 72 61 72 79 44 69 72 65 63 74 6f 72  tLibraryDirector
24b80 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
24b90 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
24ba0 69 72 73 74 2c 20 71 75 65 72 79 20 74 68 65 20  irst, query the 
24bb0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
24bc0 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 2e 20  script library. 
24bd0 20 54 68 69 73 20 77 69 6c 6c 0d 0a 20 20 20 20   This will..    
24be0 20 20 23 20 20 20 20 20 20 20 6e 6f 74 20 77 6f    #       not wo
24bf0 72 6b 20 72 69 67 68 74 20 69 6e 20 61 20 22 73  rk right in a "s
24c00 61 66 65 22 20 69 6e 74 65 72 70 72 65 74 65 72  afe" interpreter
24c10 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
24c20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 69 6e    if {[catch {in
24c30 66 6f 20 6c 69 62 72 61 72 79 7d 20 72 65 73 75  fo library} resu
24c40 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
24c50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24c60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78       # NOTE: Nex
24c70 74 2c 20 49 66 20 74 68 65 20 73 63 72 69 70 74  t, If the script
24c80 20 6c 69 62 72 61 72 79 20 69 73 20 65 6d 62 65   library is embe
24c90 64 64 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  dded within the 
24ca0 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
24cb0 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 69 74        library it
24cc0 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 73  self (i.e. the s
24cd0 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 6c 6f  cript library lo
24ce0 63 61 74 69 6f 6e 20 72 65 66 65 72 73 0d 0a 20  cation refers.. 
24cf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
24d00 6f 20 61 20 66 69 6c 65 2c 20 6e 6f 74 20 61 20  o a file, not a 
24d10 64 69 72 65 63 74 6f 72 79 29 2c 20 73 74 72 69  directory), stri
24d20 70 20 6f 66 66 20 74 68 65 20 66 69 6c 65 20 6e  p off the file n
24d30 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
24d40 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
24d50 6c 65 20 65 78 69 73 74 73 20 24 72 65 73 75 6c  le exists $resul
24d60 74 5d 20 26 26 20 5b 66 69 6c 65 20 69 73 66 69  t] && [file isfi
24d70 6c 65 20 24 72 65 73 75 6c 74 5d 7d 20 74 68 65  le $result]} the
24d80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
24d90 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c 65 20  et result [file 
24da0 64 69 72 6e 61 6d 65 20 24 72 65 73 75 6c 74 5d  dirname $result]
24db0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
24dc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24dd0 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c    # NOTE: Finall
24de0 79 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  y, return the re
24df0 73 75 6c 74 69 6e 67 20 73 63 72 69 70 74 20 6c  sulting script l
24e00 69 62 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  ibrary directory
24e10 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
24e30 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  sult..      }...
24e40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
24e50 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
24e60 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  #..    # NOTE: C
24e70 68 65 63 6b 20 66 6f 72 20 74 68 65 20 74 65 73  heck for the tes
24e80 74 20 70 61 74 68 20 69 6e 20 74 68 65 20 76 61  t path in the va
24e90 72 69 6f 75 73 20 77 65 6c 6c 2d 6b 6e 6f 77 6e  rious well-known
24ea0 20 6c 6f 63 61 74 69 6f 6e 73 0d 0a 20 20 20 20   locations..    
24eb0 23 20 20 20 20 20 20 20 61 6e 64 20 73 65 74 20  #       and set 
24ec0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 76  the associated v
24ed0 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 23 0d  ariable...    #.
24ee0 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
24ef0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 68 65 63  exists ::no(chec
24f00 6b 46 6f 72 41 6e 64 53 65 74 54 65 73 74 50 61  kForAndSetTestPa
24f10 74 68 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  th)]} then {..  
24f20 20 20 20 20 63 68 65 63 6b 46 6f 72 41 6e 64 53      checkForAndS
24f30 65 74 54 65 73 74 50 61 74 68 20 66 61 6c 73 65  etTestPath false
24f40 20 5b 65 78 70 72 20 7b 21 5b 69 73 54 65 73 74   [expr {![isTest
24f50 53 75 69 74 65 52 75 6e 6e 69 6e 67 5d 7d 5d 0d  SuiteRunning]}].
24f60 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
24f70 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6b  .    # NOTE: Fak
24f80 65 20 6c 6f 61 64 69 6e 67 20 61 6e 64 20 63 6f  e loading and co
24f90 6e 66 69 67 75 72 69 6e 67 20 74 68 65 20 22 74  nfiguring the "t
24fa0 63 6c 74 65 73 74 22 20 70 61 63 6b 61 67 65 20  cltest" package 
24fb0 75 6e 6c 65 73 73 20 77 65 0d 0a 20 20 20 20 23  unless we..    #
24fc0 20 20 20 20 20 20 20 61 72 65 20 70 72 65 76 65         are preve
24fd0 6e 74 65 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  nted...    #..  
24fe0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
24ff0 73 74 73 20 3a 3a 6e 6f 28 63 6f 6e 66 69 67 75  sts ::no(configu
25000 72 65 54 63 6c 74 65 73 74 29 5d 7d 20 74 68 65  reTcltest)]} the
25010 6e 20 7b 0d 0a 20 20 20 20 20 20 63 6f 6e 66 69  n {..      confi
25020 67 75 72 65 54 63 6c 74 65 73 74 20 22 22 20 5b  gureTcltest "" [
25030 6c 69 73 74 5d 20 5b 6c 69 73 74 5d 20 5b 6c 69  list] [list] [li
25040 73 74 5d 20 5b 6c 69 73 74 5d 20 66 61 6c 73 65  st] [list] false
25050 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
25060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
250a0 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
250b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
250c0 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
250d0 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23  D Eagle ONLY ###
250e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
250f0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
25100 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
25110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25130 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25140 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
25150 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 23 23  } else {..    ##
25160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25190 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
251a0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
251b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
251c0 23 23 23 23 23 23 23 23 23 23 23 23 20 42 45 47  ############ BEG
251d0 49 4e 20 54 63 6c 20 4f 4e 4c 59 20 23 23 23 23  IN Tcl ONLY ####
251e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
251f0 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
25200 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25210 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25220 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25230 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25240 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
25250 20 20 20 70 72 6f 63 20 67 65 74 50 61 73 73 65     proc getPasse
25260 64 50 65 72 63 65 6e 74 61 67 65 20 7b 7d 20 7b  dPercentage {} {
25270 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 3a 3a 74  ..      if {$::t
25280 63 6c 74 65 73 74 3a 3a 6e 75 6d 54 65 73 74 73  cltest::numTests
25290 28 54 6f 74 61 6c 29 20 3e 20 30 7d 20 74 68 65  (Total) > 0} the
252a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
252b0 75 72 6e 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  urn [expr \..   
252c0 20 20 20 20 20 20 20 20 20 7b 31 30 30 2e 30 20           {100.0 
252d0 2a 20 28 28 24 3a 3a 74 63 6c 74 65 73 74 3a 3a  * (($::tcltest::
252e0 6e 75 6d 54 65 73 74 73 28 50 61 73 73 65 64 29  numTests(Passed)
252f0 20 2b 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   + \..          
25300 20 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 6e 75    $::tcltest::nu
25310 6d 54 65 73 74 73 28 53 6b 69 70 70 65 64 29 29  mTests(Skipped))
25320 20 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   / \..          
25330 20 20 64 6f 75 62 6c 65 28 24 3a 3a 74 63 6c 74    double($::tclt
25340 65 73 74 3a 3a 6e 75 6d 54 65 73 74 73 28 54 6f  est::numTests(To
25350 74 61 6c 29 29 29 7d 5d 0d 0a 20 20 20 20 20 20  tal)))}]..      
25360 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
25370 6e 20 30 3b 20 23 20 6e 6f 20 74 65 73 74 73 20  n 0; # no tests 
25380 77 65 72 65 20 72 75 6e 2c 20 65 74 63 2e 0d 0a  were run, etc...
25390 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
253a0 6f 63 20 67 65 74 53 6b 69 70 70 65 64 50 65 72  oc getSkippedPer
253b0 63 65 6e 74 61 67 65 20 7b 7d 20 7b 0d 0a 20 20  centage {} {..  
253c0 20 20 20 20 69 66 20 7b 24 3a 3a 74 63 6c 74 65      if {$::tclte
253d0 73 74 3a 3a 6e 75 6d 54 65 73 74 73 28 54 6f 74  st::numTests(Tot
253e0 61 6c 29 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  al) > 0} then {.
253f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25400 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20  [expr \..       
25410 20 20 20 20 20 7b 31 30 30 2e 30 20 2a 20 28 24       {100.0 * ($
25420 3a 3a 74 63 6c 74 65 73 74 3a 3a 6e 75 6d 54 65  ::tcltest::numTe
25430 73 74 73 28 53 6b 69 70 70 65 64 29 20 2f 20 5c  sts(Skipped) / \
25440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  ..            do
25450 75 62 6c 65 28 24 3a 3a 74 63 6c 74 65 73 74 3a  uble($::tcltest:
25460 3a 6e 75 6d 54 65 73 74 73 28 54 6f 74 61 6c 29  :numTests(Total)
25470 29 29 7d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ))}]..      }...
25480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
25490 20 23 20 6e 6f 20 74 65 73 74 73 20 77 65 72 65   # no tests were
254a0 20 72 75 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20   run, etc...    
254b0 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20  }.....    #..   
254c0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
254d0 6f 72 20 74 68 65 20 74 65 73 74 20 70 61 74 68  or the test path
254e0 20 69 6e 20 74 68 65 20 76 61 72 69 6f 75 73 20   in the various 
254f0 77 65 6c 6c 2d 6b 6e 6f 77 6e 20 6c 6f 63 61 74  well-known locat
25500 69 6f 6e 73 0d 0a 20 20 20 20 23 20 20 20 20 20  ions..    #     
25510 20 20 61 6e 64 20 73 65 74 20 74 68 65 20 61 73    and set the as
25520 73 6f 63 69 61 74 65 64 20 76 61 72 69 61 62 6c  sociated variabl
25530 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  e...    #..    i
25540 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
25550 20 3a 3a 6e 6f 28 63 68 65 63 6b 46 6f 72 41 6e   ::no(checkForAn
25560 64 53 65 74 54 65 73 74 50 61 74 68 29 5d 7d 20  dSetTestPath)]} 
25570 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 63 68  then {..      ch
25580 65 63 6b 46 6f 72 41 6e 64 53 65 74 54 65 73 74  eckForAndSetTest
25590 50 61 74 68 20 66 61 6c 73 65 20 5b 65 78 70 72  Path false [expr
255a0 20 7b 21 5b 69 73 54 65 73 74 53 75 69 74 65 52   {![isTestSuiteR
255b0 75 6e 6e 69 6e 67 5d 7d 5d 0d 0a 20 20 20 20 7d  unning]}]..    }
255c0 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
255d0 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 61 6e 64 20   NOTE: Load and 
255e0 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 22 74  configure the "t
255f0 63 6c 74 65 73 74 22 20 70 61 63 6b 61 67 65 20  cltest" package 
25600 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 70 72  unless we are pr
25610 65 76 65 6e 74 65 64 2e 0d 0a 20 20 20 20 23 0d  evented...    #.
25620 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
25630 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 6e 66  exists ::no(conf
25640 69 67 75 72 65 54 63 6c 74 65 73 74 29 5d 7d 20  igureTcltest)]} 
25650 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 63 6f  then {..      co
25660 6e 66 69 67 75 72 65 54 63 6c 74 65 73 74 20 22  nfigureTcltest "
25670 22 20 5b 6c 69 73 74 5d 20 5b 6c 69 73 74 5d 20  " [list] [list] 
25680 5b 6c 69 73 74 5d 20 5b 6c 69 73 74 20 74 65 73  [list] [list tes
25690 74 20 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74  t testConstraint
256a0 5d 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  ] false..    }..
256b0 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
256c0 4f 54 45 3a 20 57 65 20 6e 65 65 64 20 73 65 76  OTE: We need sev
256d0 65 72 61 6c 20 6f 66 20 6f 75 72 20 74 65 73 74  eral of our test
256e0 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64   related command
256f0 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 0d  s in the global.
25700 0a 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d  .    #       nam
25710 65 73 70 61 63 65 20 61 73 20 77 65 6c 6c 2e 0d  espace as well..
25720 0a 20 20 20 20 23 0d 0a 20 20 20 20 65 78 70 6f  .    #..    expo
25730 72 74 41 6e 64 49 6d 70 6f 72 74 50 61 63 6b 61  rtAndImportPacka
25740 67 65 43 6f 6d 6d 61 6e 64 73 20 5b 6e 61 6d 65  geCommands [name
25750 73 70 61 63 65 20 63 75 72 72 65 6e 74 5d 20 5b  space current] [
25760 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
25770 64 75 6d 70 53 74 61 74 65 20 74 72 61 77 70 75  dumpState trawpu
25780 74 73 20 74 70 75 74 73 20 74 74 63 6c 4c 6f 67  ts tputs ttclLog
25790 20 64 6f 65 73 54 65 73 74 4c 6f 67 46 69 6c 65   doesTestLogFile
257a0 45 78 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  Exist \..       
257b0 20 67 65 74 54 65 73 74 4c 6f 67 53 74 61 72 74   getTestLogStart
257c0 53 65 6e 74 72 79 20 65 78 74 72 61 63 74 54 65  Sentry extractTe
257d0 73 74 52 75 6e 49 64 46 72 6f 6d 4c 6f 67 53 74  stRunIdFromLogSt
257e0 61 72 74 53 65 6e 74 72 79 20 5c 0d 0a 20 20 20  artSentry \..   
257f0 20 20 20 20 20 64 6f 65 73 54 65 73 74 4c 6f 67       doesTestLog
25800 48 61 76 65 53 74 61 72 74 53 65 6e 74 72 79 20  HaveStartSentry 
25810 64 69 64 54 65 73 74 4c 6f 67 48 61 76 65 53 74  didTestLogHaveSt
25820 61 72 74 53 65 6e 74 72 79 20 5c 0d 0a 20 20 20  artSentry \..   
25830 20 20 20 20 20 73 65 74 54 65 73 74 4c 6f 67 53       setTestLogS
25840 74 61 72 74 53 65 6e 74 72 79 20 74 6c 6f 67 20  tartSentry tlog 
25850 67 65 74 53 6f 66 74 77 61 72 65 52 65 67 69 73  getSoftwareRegis
25860 74 72 79 4b 65 79 20 68 61 76 65 43 6f 6e 73 74  tryKey haveConst
25870 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  raint \..       
25880 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 68   addConstraint h
25890 61 76 65 4f 72 41 64 64 43 6f 6e 73 74 72 61 69  aveOrAddConstrai
258a0 6e 74 20 67 65 74 43 6f 6e 73 74 72 61 69 6e 74  nt getConstraint
258b0 73 20 67 65 74 43 61 63 68 65 64 43 6f 6e 73 74  s getCachedConst
258c0 72 61 69 6e 74 73 20 5c 0d 0a 20 20 20 20 20 20  raints \..      
258d0 20 20 75 73 65 43 61 63 68 65 64 43 6f 6e 73 74    useCachedConst
258e0 72 61 69 6e 74 73 20 72 65 6d 6f 76 65 43 6f 6e  raints removeCon
258f0 73 74 72 61 69 6e 74 20 66 69 78 43 6f 6e 73 74  straint fixConst
25900 72 61 69 6e 74 73 20 5c 0d 0a 20 20 20 20 20 20  raints \..      
25910 20 20 66 69 78 54 69 6d 69 6e 67 43 6f 6e 73 74    fixTimingConst
25920 72 61 69 6e 74 73 20 74 65 73 74 44 65 62 75 67  raints testDebug
25930 42 72 65 61 6b 20 74 65 73 74 41 72 72 61 79 47  Break testArrayG
25940 65 74 20 74 65 73 74 41 72 72 61 79 47 65 74 32  et testArrayGet2
25950 20 5c 0d 0a 20 20 20 20 20 20 20 20 74 65 73 74   \..        test
25960 52 65 73 75 6c 74 47 65 74 20 74 65 73 74 56 61  ResultGet testVa
25970 6c 75 65 47 65 74 20 67 65 74 46 69 72 73 74 4c  lueGet getFirstL
25980 69 6e 65 4f 66 45 72 72 6f 72 20 63 61 6c 63 75  ineOfError calcu
25990 6c 61 74 65 42 6f 67 6f 43 6f 70 73 20 5c 0d 0a  lateBogoCops \..
259a0 20 20 20 20 20 20 20 20 63 61 6c 63 75 6c 61 74          calculat
259b0 65 52 65 6c 61 74 69 76 65 50 65 72 66 6f 72 6d  eRelativePerform
259c0 61 6e 63 65 20 66 6f 72 6d 61 74 54 69 6d 65 53  ance formatTimeS
259d0 74 61 6d 70 20 66 6f 72 6d 61 74 45 6c 61 70 73  tamp formatElaps
259e0 65 64 54 69 6d 65 20 5c 0d 0a 20 20 20 20 20 20  edTime \..      
259f0 20 20 73 6f 75 72 63 65 49 66 56 61 6c 69 64 20    sourceIfValid 
25a00 70 72 6f 63 65 73 73 54 65 73 74 41 72 67 75 6d  processTestArgum
25a10 65 6e 74 73 20 67 65 74 54 63 6c 53 68 65 6c 6c  ents getTclShell
25a20 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
25a30 20 20 20 20 67 65 74 54 65 6d 70 6f 72 61 72 79      getTemporary
25a40 50 61 74 68 20 67 65 74 54 65 6d 70 6f 72 61 72  Path getTemporar
25a50 79 46 69 6c 65 4e 61 6d 65 20 67 65 74 46 69 6c  yFileName getFil
25a60 65 73 20 67 65 74 54 65 73 74 46 69 6c 65 73 20  es getTestFiles 
25a70 5c 0d 0a 20 20 20 20 20 20 20 20 67 65 74 54 65  \..        getTe
25a80 73 74 52 75 6e 49 64 20 67 65 74 4e 65 77 54 65  stRunId getNewTe
25a90 73 74 52 75 6e 49 64 20 67 65 74 44 65 66 61 75  stRunId getDefau
25aa0 6c 74 54 65 73 74 4c 6f 67 50 61 74 68 20 67 65  ltTestLogPath ge
25ab0 74 54 65 73 74 4c 6f 67 50 61 74 68 20 5c 0d 0a  tTestLogPath \..
25ac0 20 20 20 20 20 20 20 20 67 65 74 54 65 73 74 4c          getTestL
25ad0 6f 67 49 64 20 67 65 74 44 65 66 61 75 6c 74 54  ogId getDefaultT
25ae0 65 73 74 4c 6f 67 20 67 65 74 54 65 73 74 4c 6f  estLog getTestLo
25af0 67 20 67 65 74 4c 61 73 74 54 65 73 74 4c 6f 67  g getLastTestLog
25b00 20 5c 0d 0a 20 20 20 20 20 20 20 20 67 65 74 54   \..        getT
25b10 65 73 74 53 75 69 74 65 20 67 65 74 54 65 73 74  estSuite getTest
25b20 53 75 69 74 65 46 75 6c 6c 4e 61 6d 65 20 67 65  SuiteFullName ge
25b30 74 54 65 73 74 4d 61 63 68 69 6e 65 20 67 65 74  tTestMachine get
25b40 54 65 73 74 50 6c 61 74 66 6f 72 6d 20 5c 0d 0a  TestPlatform \..
25b50 20 20 20 20 20 20 20 20 67 65 74 54 65 73 74 43          getTestC
25b60 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 67 65 74  onfiguration get
25b70 54 65 73 74 4e 61 6d 65 50 72 65 66 69 78 20 67  TestNamePrefix g
25b80 65 74 54 65 73 74 53 75 66 66 69 78 20 5c 0d 0a  etTestSuffix \..
25b90 20 20 20 20 20 20 20 20 67 65 74 54 65 73 74 55          getTestU
25ba0 6e 63 6f 75 6e 74 65 64 4c 65 61 6b 73 20 67 65  ncountedLeaks ge
25bb0 74 52 75 6e 74 69 6d 65 41 73 73 65 6d 62 6c 79  tRuntimeAssembly
25bc0 4e 61 6d 65 20 67 65 74 54 65 73 74 41 73 73 65  Name getTestAsse
25bd0 6d 62 6c 79 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  mblyName \..    
25be0 20 20 20 20 63 61 6e 54 65 73 74 45 78 65 63 20      canTestExec 
25bf0 74 65 73 74 45 78 65 63 20 74 65 73 74 43 6c 72  testExec testClr
25c00 45 78 65 63 20 65 78 65 63 54 65 73 74 53 68 65  Exec execTestShe
25c10 6c 6c 20 69 73 52 61 6e 64 6f 6d 4f 72 64 65 72  ll isRandomOrder
25c20 20 5c 0d 0a 20 20 20 20 20 20 20 20 69 73 42 72   \..        isBr
25c30 65 61 6b 4f 6e 44 65 6d 61 6e 64 20 69 73 42 72  eakOnDemand isBr
25c40 65 61 6b 4f 6e 4c 65 61 6b 20 69 73 53 74 6f 70  eakOnLeak isStop
25c50 4f 6e 46 61 69 6c 75 72 65 20 69 73 53 74 6f 70  OnFailure isStop
25c60 4f 6e 4c 65 61 6b 20 5c 0d 0a 20 20 20 20 20 20  OnLeak \..      
25c70 20 20 69 73 45 78 69 74 4f 6e 43 6f 6d 70 6c 65    isExitOnComple
25c80 74 65 20 72 65 74 75 72 6e 49 6e 66 6f 53 63 72  te returnInfoScr
25c90 69 70 74 20 72 75 6e 54 65 73 74 50 72 6f 6c 6f  ipt runTestProlo
25ca0 67 75 65 20 72 75 6e 54 65 73 74 45 70 69 6c 6f  gue runTestEpilo
25cb0 67 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 68  gue \..        h
25cc0 6f 6f 6b 50 75 74 73 20 75 6e 68 6f 6f 6b 50 75  ookPuts unhookPu
25cd0 74 73 20 72 75 6e 54 65 73 74 20 74 65 73 74 53  ts runTest testS
25ce0 68 69 6d 20 74 73 6f 75 72 63 65 20 72 65 63 6f  him tsource reco
25cf0 72 64 54 65 73 74 53 74 61 74 69 73 74 69 63 73  rdTestStatistics
25d00 20 5c 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   \..        repo
25d10 72 74 54 65 73 74 53 74 61 74 69 73 74 69 63 73  rtTestStatistics
25d20 20 66 6f 72 6d 61 74 4c 69 73 74 20 66 6f 72 6d   formatList form
25d30 61 74 4c 69 73 74 41 73 44 69 63 74 20 70 61 74  atListAsDict pat
25d40 68 54 6f 52 65 67 65 78 70 20 5c 0d 0a 20 20 20  hToRegexp \..   
25d50 20 20 20 20 20 61 73 73 65 6d 62 6c 79 4e 61 6d       assemblyNam
25d60 65 54 6f 52 65 67 65 78 70 20 69 6e 76 65 72 73  eToRegexp invers
25d70 65 4c 73 65 61 72 63 68 47 6c 6f 62 20 72 65 6d  eLsearchGlob rem
25d80 6f 76 65 50 61 74 68 46 72 6f 6d 46 69 6c 65 4e  ovePathFromFileN
25d90 61 6d 65 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  ames \..        
25da0 66 6f 72 6d 61 74 44 65 63 69 6d 61 6c 20 63 6c  formatDecimal cl
25db0 65 61 72 54 65 73 74 50 65 72 63 65 6e 74 20 72  earTestPercent r
25dc0 65 70 6f 72 74 54 65 73 74 50 65 72 63 65 6e 74  eportTestPercent
25dd0 20 72 65 70 6f 72 74 41 72 72 61 79 47 65 74 20   reportArrayGet 
25de0 5c 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72  \..        repor
25df0 74 54 65 73 74 53 74 61 74 69 73 74 69 63 43 6f  tTestStatisticCo
25e00 75 6e 74 73 20 72 75 6e 41 6c 6c 54 65 73 74 73  unts runAllTests
25e10 20 69 73 54 65 73 74 53 75 69 74 65 52 75 6e 6e   isTestSuiteRunn
25e20 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 67  ing \..        g
25e30 65 74 54 65 73 74 43 68 61 6e 6e 65 6c 4f 72 44  etTestChannelOrD
25e40 65 66 61 75 6c 74 20 74 72 79 56 65 72 69 66 79  efault tryVerify
25e50 54 65 73 74 50 61 74 68 20 63 68 65 63 6b 46 6f  TestPath checkFo
25e60 72 41 6e 64 53 65 74 54 65 73 74 50 61 74 68 20  rAndSetTestPath 
25e70 5c 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 66 69  \..        confi
25e80 67 75 72 65 54 63 6c 74 65 73 74 20 6d 61 63 68  gureTcltest mach
25e90 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 61 72  ineToPlatform ar
25ea0 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61  chitectureForPla
25eb0 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
25ec0 20 67 65 74 50 61 73 73 65 64 50 65 72 63 65 6e   getPassedPercen
25ed0 74 61 67 65 20 67 65 74 53 6b 69 70 70 65 64 50  tage getSkippedP
25ee0 65 72 63 65 6e 74 61 67 65 5d 20 66 61 6c 73 65  ercentage] false
25ef0 20 66 61 6c 73 65 0d 0a 0d 0a 20 20 20 20 23 23   false....    ##
25f00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25f10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25f20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25f30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25f40 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
25f50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25f60 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
25f70 44 20 54 63 6c 20 4f 4e 4c 59 20 23 23 23 23 23  D Tcl ONLY #####
25f80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25f90 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
25fa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25fb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25fc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25fd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25fe0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d  ###########..  }
25ff0 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  .....  #..  # NO
26000 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20  TE: Provide the 
26010 45 61 67 6c 65 20 22 74 65 73 74 22 20 70 61 63  Eagle "test" pac
26020 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65  kage to the inte
26030 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20  rpreter...  #.. 
26040 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65   package provide
26050 20 45 61 67 6c 65 2e 54 65 73 74 20 5c 0d 0a 20   Eagle.Test \.. 
26060 20 20 20 5b 65 78 70 72 20 7b 5b 69 73 45 61 67     [expr {[isEag
26070 6c 65 5d 20 3f 20 5b 69 6e 66 6f 20 65 6e 67 69  le] ? [info engi
26080 6e 65 20 50 61 74 63 68 4c 65 76 65 6c 5d 20 3a  ne PatchLevel] :
26090 20 22 31 2e 30 22 7d 5d 0d 0a 7d 0d 0a 0c         "1.0"}]..}...