System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 68d01d3de4e85fb714650f5bc174009714f16531:


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 63 6f 6e 73 74 72 61 69 6e 74  .#..# constraint
0060: 73 2e 65 61 67 6c 65 20 2d 2d 0d 0a 23 0d 0a 23  s.eagle --..#..#
0070: 20 45 78 74 65 6e 73 69 62 6c 65 20 41 64 61 70   Extensible Adap
0080: 74 61 62 6c 65 20 47 65 6e 65 72 61 6c 69 7a 65  table Generalize
0090: 64 20 4c 6f 67 69 63 20 45 6e 67 69 6e 65 20 28  d Logic Engine (
00a0: 45 61 67 6c 65 29 0d 0a 23 20 45 61 67 6c 65 20  Eagle)..# Eagle 
00b0: 54 65 73 74 20 43 6f 6e 73 74 72 61 69 6e 74 73  Test Constraints
00c0: 20 50 61 63 6b 61 67 65 20 46 69 6c 65 0d 0a 23   Package File..#
00d0: 0d 0a 23 20 43 6f 70 79 72 69 67 68 74 20 28 63  ..# Copyright (c
00e0: 29 20 32 30 30 37 2d 32 30 31 32 20 62 79 20 4a  ) 2007-2012 by J
00f0: 6f 65 20 4d 69 73 74 61 63 68 6b 69 6e 2e 20 20  oe Mistachkin.  
0100: 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65 72  All rights reser
0110: 76 65 64 2e 0d 0a 23 0d 0a 23 20 53 65 65 20 74  ved...#..# See t
0120: 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65  he file "license
0130: 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f  .terms" for info
0140: 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65  rmation on usage
0150: 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 74   and redistribut
0160: 69 6f 6e 20 6f 66 0d 0a 23 20 74 68 69 73 20 66  ion of..# this f
0170: 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44  ile, and for a D
0180: 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c  ISCLAIMER OF ALL
0190: 20 57 41 52 52 41 4e 54 49 45 53 2e 0d 0a 23 0d   WARRANTIES...#.
01a0: 0a 23 20 52 43 53 3a 20 40 28 23 29 20 24 49 64  .# RCS: @(#) $Id
01b0: 3a 20 24 0d 0a 23 0d 0a 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 23 23 23 23 23 23 23 23 23 23 23 23  ################
0200: 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23 20  #######....#..# 
0210: 4e 4f 54 45 3a 20 55 73 65 20 6f 75 72 20 6f 77  NOTE: Use our ow
0220: 6e 20 6e 61 6d 65 73 70 61 63 65 20 68 65 72 65  n namespace here
0230: 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74 68   because even th
0240: 6f 75 67 68 20 77 65 20 64 6f 20 6e 6f 74 20 64  ough we do not d
0250: 69 72 65 63 74 6c 79 0d 0a 23 20 20 20 20 20 20  irectly..#      
0260: 20 73 75 70 70 6f 72 74 20 6e 61 6d 65 73 70 61   support namespa
0270: 63 65 73 20 6f 75 72 73 65 6c 76 65 73 2c 20 77  ces ourselves, w
0280: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
0290: 20 70 6f 6c 6c 75 74 65 20 74 68 65 20 67 6c 6f   pollute the glo
02a0: 62 61 6c 0d 0a 23 20 20 20 20 20 20 20 6e 61 6d  bal..#       nam
02b0: 65 73 70 61 63 65 20 69 66 20 74 68 69 73 20 73  espace if this s
02c0: 63 72 69 70 74 20 61 63 74 75 61 6c 6c 79 20 65  cript actually e
02d0: 6e 64 73 20 75 70 20 62 65 69 6e 67 20 65 76 61  nds up being eva
02e0: 6c 75 61 74 65 64 20 69 6e 20 54 63 6c 2e 0d 0a  luated in Tcl...
02f0: 23 0d 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61  #..namespace eva
0300: 6c 20 3a 3a 45 61 67 6c 65 20 7b 0d 0a 20 20 70  l ::Eagle {..  p
0310: 72 6f 63 20 67 65 74 4b 6e 6f 77 6e 42 75 69 6c  roc getKnownBuil
0320: 64 54 79 70 65 73 20 7b 7d 20 7b 0d 0a 20 20 20  dTypes {} {..   
0330: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d   return [list \.
0340: 0a 20 20 20 20 20 20 20 20 4e 65 74 46 78 32 30  .        NetFx20
0350: 20 4e 65 74 46 78 33 35 20 4e 65 74 46 78 34 30   NetFx35 NetFx40
0360: 20 4e 65 74 46 78 34 35 20 4e 65 74 46 78 34 35   NetFx45 NetFx45
0370: 31 20 4e 65 74 46 78 34 35 32 20 5c 0d 0a 20 20  1 NetFx452 \..  
0380: 20 20 20 20 20 20 4e 65 74 46 78 34 36 20 4e 65        NetFx46 Ne
0390: 74 46 78 34 36 31 20 4e 65 74 46 78 34 36 32 20  tFx461 NetFx462 
03a0: 4e 65 74 46 78 34 37 20 4e 65 74 46 78 34 37 31  NetFx47 NetFx471
03b0: 20 42 61 72 65 20 5c 0d 0a 20 20 20 20 20 20 20   Bare \..       
03c0: 20 4c 65 61 6e 41 6e 64 4d 65 61 6e 20 44 61 74   LeanAndMean Dat
03d0: 61 62 61 73 65 20 4d 6f 6e 6f 4f 6e 55 6e 69 78  abase MonoOnUnix
03e0: 20 44 65 76 65 6c 6f 70 6d 65 6e 74 5d 0d 0a 20   Development].. 
03f0: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65   }.....  proc ge
0400: 74 4b 6e 6f 77 6e 43 6f 6d 70 69 6c 65 4f 70 74  tKnownCompileOpt
0410: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 72  ions {} {..    r
0420: 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20  eturn [list \.. 
0430: 20 20 20 20 20 20 20 41 50 50 44 4f 4d 41 49 4e         APPDOMAIN
0440: 53 20 41 50 50 52 4f 56 45 44 5f 56 45 52 42 53  S APPROVED_VERBS
0450: 20 41 52 47 55 4d 45 4e 54 5f 43 41 43 48 45 20   ARGUMENT_CACHE 
0460: 41 52 4d 20 41 52 4d 36 34 20 41 53 53 45 4d 42  ARM ARM64 ASSEMB
0470: 4c 59 5f 44 41 54 45 54 49 4d 45 20 5c 0d 0a 20  LY_DATETIME \.. 
0480: 20 20 20 20 20 20 20 41 53 53 45 4d 42 4c 59 5f         ASSEMBLY_
0490: 52 45 4c 45 41 53 45 20 41 53 53 45 4d 42 4c 59  RELEASE ASSEMBLY
04a0: 5f 53 54 52 4f 4e 47 5f 4e 41 4d 45 5f 54 41 47  _STRONG_NAME_TAG
04b0: 20 41 53 53 45 4d 42 4c 59 5f 54 41 47 20 41 53   ASSEMBLY_TAG AS
04c0: 53 45 4d 42 4c 59 5f 54 45 58 54 20 5c 0d 0a 20  SEMBLY_TEXT \.. 
04d0: 20 20 20 20 20 20 20 41 53 53 45 4d 42 4c 59 5f         ASSEMBLY_
04e0: 55 52 49 20 42 52 45 41 4b 5f 4f 4e 5f 45 58 49  URI BREAK_ON_EXI
04f0: 54 49 4e 47 20 42 52 45 41 4b 50 4f 49 4e 54 53  TING BREAKPOINTS
0500: 20 43 41 43 48 45 5f 41 52 47 55 4d 45 4e 54 5f   CACHE_ARGUMENT_
0510: 54 4f 53 54 52 49 4e 47 20 5c 0d 0a 20 20 20 20  TOSTRING \..    
0520: 20 20 20 20 43 41 43 48 45 5f 41 52 47 55 4d 45      CACHE_ARGUME
0530: 4e 54 4c 49 53 54 5f 54 4f 53 54 52 49 4e 47 20  NTLIST_TOSTRING 
0540: 43 41 43 48 45 5f 44 49 43 54 49 4f 4e 41 52 59  CACHE_DICTIONARY
0550: 20 43 41 43 48 45 5f 52 45 53 55 4c 54 5f 54 4f   CACHE_RESULT_TO
0560: 53 54 52 49 4e 47 20 5c 0d 0a 20 20 20 20 20 20  STRING \..      
0570: 20 20 43 41 43 48 45 5f 53 54 41 54 49 53 54 49    CACHE_STATISTI
0580: 43 53 20 43 41 43 48 45 5f 53 54 52 49 4e 47 4c  CS CACHE_STRINGL
0590: 49 53 54 5f 54 4f 53 54 52 49 4e 47 20 43 41 4c  IST_TOSTRING CAL
05a0: 4c 42 41 43 4b 5f 51 55 45 55 45 20 43 41 53 5f  LBACK_QUEUE CAS_
05b0: 50 4f 4c 49 43 59 20 5c 0d 0a 20 20 20 20 20 20  POLICY \..      
05c0: 20 20 43 45 52 54 49 46 49 43 41 54 45 5f 50 4c    CERTIFICATE_PL
05d0: 55 47 49 4e 20 43 45 52 54 49 46 49 43 41 54 45  UGIN CERTIFICATE
05e0: 5f 50 4f 4c 49 43 59 20 43 45 52 54 49 46 49 43  _POLICY CERTIFIC
05f0: 41 54 45 5f 52 45 4e 45 57 41 4c 20 5c 0d 0a 20  ATE_RENEWAL \.. 
0600: 20 20 20 20 20 20 20 43 4f 44 45 5f 41 4e 41 4c         CODE_ANAL
0610: 59 53 49 53 20 43 4f 4d 5f 54 59 50 45 5f 43 41  YSIS COM_TYPE_CA
0620: 43 48 45 20 43 4f 4e 53 4f 4c 45 20 44 41 45 4d  CHE CONSOLE DAEM
0630: 4f 4e 20 44 41 54 41 20 44 45 41 44 5f 43 4f 44  ON DATA DEAD_COD
0640: 45 20 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20  E DEBUG \..     
0650: 20 20 20 44 45 42 55 47 47 45 52 20 44 45 42 55     DEBUGGER DEBU
0660: 47 47 45 52 5f 41 52 47 55 4d 45 4e 54 53 20 44  GGER_ARGUMENTS D
0670: 45 42 55 47 47 45 52 5f 45 4e 47 49 4e 45 20 44  EBUGGER_ENGINE D
0680: 45 42 55 47 47 45 52 5f 45 58 45 43 55 54 45 20  EBUGGER_EXECUTE 
0690: 5c 0d 0a 20 20 20 20 20 20 20 20 44 45 42 55 47  \..        DEBUG
06a0: 47 45 52 5f 45 58 50 52 45 53 53 49 4f 4e 20 44  GER_EXPRESSION D
06b0: 45 42 55 47 47 45 52 5f 56 41 52 49 41 42 4c 45  EBUGGER_VARIABLE
06c0: 20 44 45 42 55 47 5f 54 52 41 43 45 20 44 45 42   DEBUG_TRACE DEB
06d0: 55 47 5f 57 52 49 54 45 20 5c 0d 0a 20 20 20 20  UG_WRITE \..    
06e0: 20 20 20 20 44 45 4d 4f 5f 45 44 49 54 49 4f 4e      DEMO_EDITION
06f0: 20 44 52 41 57 49 4e 47 20 44 59 4e 41 4d 49 43   DRAWING DYNAMIC
0700: 20 45 41 47 4c 45 20 45 4d 42 45 44 44 45 44 5f   EAGLE EMBEDDED_
0710: 4c 49 42 52 41 52 59 20 5c 0d 0a 20 20 20 20 20  LIBRARY \..     
0720: 20 20 20 45 4d 42 45 44 5f 43 45 52 54 49 46 49     EMBED_CERTIFI
0730: 43 41 54 45 53 20 45 4e 54 45 52 50 52 49 53 45  CATES ENTERPRISE
0740: 5f 4c 4f 43 4b 44 4f 57 4e 20 45 58 45 43 55 54  _LOCKDOWN EXECUT
0750: 45 5f 43 41 43 48 45 20 45 58 50 52 45 53 53 49  E_CACHE EXPRESSI
0760: 4f 4e 5f 46 4c 41 47 53 20 5c 0d 0a 20 20 20 20  ON_FLAGS \..    
0770: 20 20 20 20 46 41 53 54 5f 45 52 52 4f 52 43 4f      FAST_ERRORCO
0780: 44 45 20 46 41 53 54 5f 45 52 52 4f 52 49 4e 46  DE FAST_ERRORINF
0790: 4f 20 46 4f 52 5f 54 45 53 54 5f 55 53 45 5f 4f  O FOR_TEST_USE_O
07a0: 4e 4c 59 20 48 41 56 45 5f 53 49 5a 45 4f 46 20  NLY HAVE_SIZEOF 
07b0: 48 49 53 54 4f 52 59 20 5c 0d 0a 20 20 20 20 20  HISTORY \..     
07c0: 20 20 20 49 41 36 34 20 49 4e 54 45 52 41 43 54     IA64 INTERACT
07d0: 49 56 45 5f 43 4f 4d 4d 41 4e 44 53 20 49 4e 54  IVE_COMMANDS INT
07e0: 45 52 4e 41 4c 53 5f 56 49 53 49 42 4c 45 5f 54  ERNALS_VISIBLE_T
07f0: 4f 20 49 53 4f 4c 41 54 45 44 5f 49 4e 54 45 52  O ISOLATED_INTER
0800: 50 52 45 54 45 52 53 20 5c 0d 0a 20 20 20 20 20  PRETERS \..     
0810: 20 20 20 49 53 4f 4c 41 54 45 44 5f 50 4c 55 47     ISOLATED_PLUG
0820: 49 4e 53 20 4c 49 42 52 41 52 59 20 4c 49 43 45  INS LIBRARY LICE
0830: 4e 53 49 4e 47 20 4c 49 43 45 4e 53 45 5f 4d 41  NSING LICENSE_MA
0840: 4e 41 47 45 52 20 4c 49 4d 49 54 45 44 5f 45 44  NAGER LIMITED_ED
0850: 49 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  ITION \..       
0860: 20 4c 49 53 54 5f 43 41 43 48 45 20 4d 4f 4e 4f   LIST_CACHE MONO
0870: 20 4d 4f 4e 4f 5f 42 55 49 4c 44 20 4d 4f 4e 4f   MONO_BUILD MONO
0880: 5f 48 41 43 4b 53 20 4d 4f 4e 4f 5f 4c 45 47 41  _HACKS MONO_LEGA
0890: 43 59 20 4e 41 54 49 56 45 20 5c 0d 0a 20 20 20  CY NATIVE \..   
08a0: 20 20 20 20 20 4e 41 54 49 56 45 5f 50 41 43 4b       NATIVE_PACK
08b0: 41 47 45 20 4e 41 54 49 56 45 5f 54 48 52 45 41  AGE NATIVE_THREA
08c0: 44 5f 49 44 20 4e 41 54 49 56 45 5f 55 54 49 4c  D_ID NATIVE_UTIL
08d0: 49 54 59 20 4e 41 54 49 56 45 5f 55 54 49 4c 49  ITY NATIVE_UTILI
08e0: 54 59 5f 42 53 54 52 20 5c 0d 0a 20 20 20 20 20  TY_BSTR \..     
08f0: 20 20 20 4e 45 54 57 4f 52 4b 20 4e 45 54 5f 32     NETWORK NET_2
0900: 30 20 4e 45 54 5f 32 30 5f 46 41 53 54 5f 45 4e  0 NET_20_FAST_EN
0910: 55 4d 20 4e 45 54 5f 32 30 5f 4f 4e 4c 59 20 4e  UM NET_20_ONLY N
0920: 45 54 5f 32 30 5f 53 50 31 20 4e 45 54 5f 32 30  ET_20_SP1 NET_20
0930: 5f 53 50 32 20 5c 0d 0a 20 20 20 20 20 20 20 20  _SP2 \..        
0940: 4e 45 54 5f 33 30 20 4e 45 54 5f 33 35 20 4e 45  NET_30 NET_35 NE
0950: 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f  T_40 NET_45 NET_
0960: 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54 5f  451 NET_452 NET_
0970: 34 36 20 4e 45 54 5f 34 36 31 20 4e 45 54 5f 34  46 NET_461 NET_4
0980: 36 32 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e 45  62 \..        NE
0990: 54 5f 34 37 20 4e 45 54 5f 34 37 31 20 4e 4f 4e  T_47 NET_471 NON
09a0: 5f 57 4f 52 4b 49 4e 47 5f 43 4f 44 45 20 4e 4f  _WORKING_CODE NO
09b0: 54 49 46 59 20 4e 4f 54 49 46 59 5f 41 43 54 49  TIFY NOTIFY_ACTI
09c0: 56 45 20 4e 4f 54 49 46 59 5f 41 52 47 55 4d 45  VE NOTIFY_ARGUME
09d0: 4e 54 53 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e  NTS \..        N
09e0: 4f 54 49 46 59 5f 45 58 43 45 50 54 49 4f 4e 20  OTIFY_EXCEPTION 
09f0: 4e 4f 54 49 46 59 5f 45 58 45 43 55 54 45 20 4e  NOTIFY_EXECUTE N
0a00: 4f 54 49 46 59 5f 45 58 50 52 45 53 53 49 4f 4e  OTIFY_EXPRESSION
0a10: 20 4e 4f 54 49 46 59 5f 47 4c 4f 42 41 4c 20 5c   NOTIFY_GLOBAL \
0a20: 0d 0a 20 20 20 20 20 20 20 20 4e 4f 54 49 46 59  ..        NOTIFY
0a30: 5f 4f 42 4a 45 43 54 20 4f 42 53 4f 4c 45 54 45  _OBJECT OBSOLETE
0a40: 20 4f 42 46 55 53 43 41 54 49 4f 4e 20 4f 46 46   OBFUSCATION OFF
0a50: 49 43 49 41 4c 20 50 41 52 53 45 5f 43 41 43 48  ICIAL PARSE_CACH
0a60: 45 20 50 41 54 43 48 4c 45 56 45 4c 20 5c 0d 0a  E PATCHLEVEL \..
0a70: 20 20 20 20 20 20 20 20 50 4c 55 47 49 4e 5f 43          PLUGIN_C
0a80: 4f 4d 4d 41 4e 44 53 20 50 4f 4c 49 43 59 5f 54  OMMANDS POLICY_T
0a90: 52 41 43 45 20 50 52 45 56 49 4f 55 53 5f 52 45  RACE PREVIOUS_RE
0aa0: 53 55 4c 54 20 52 41 4e 44 4f 4d 49 5a 45 5f 49  SULT RANDOMIZE_I
0ab0: 44 20 52 45 4d 4f 54 49 4e 47 20 5c 0d 0a 20 20  D REMOTING \..  
0ac0: 20 20 20 20 20 20 52 45 53 55 4c 54 5f 4c 49 4d        RESULT_LIM
0ad0: 49 54 53 20 53 41 4d 50 4c 45 20 53 45 43 55 52  ITS SAMPLE SECUR
0ae0: 49 54 59 20 53 45 52 49 41 4c 49 5a 41 54 49 4f  ITY SERIALIZATIO
0af0: 4e 20 53 48 41 52 45 44 5f 49 44 5f 50 4f 4f 4c  N SHARED_ID_POOL
0b00: 20 53 48 45 4c 4c 20 5c 0d 0a 20 20 20 20 20 20   SHELL \..      
0b10: 20 20 53 4f 55 52 43 45 5f 49 44 20 53 4f 55 52    SOURCE_ID SOUR
0b20: 43 45 5f 54 49 4d 45 53 54 41 4d 50 20 53 54 41  CE_TIMESTAMP STA
0b30: 54 49 43 20 54 43 4c 20 54 43 4c 5f 4b 49 54 53  TIC TCL TCL_KITS
0b40: 20 54 43 4c 5f 54 48 52 45 41 44 45 44 20 5c 0d   TCL_THREADED \.
0b50: 0a 20 20 20 20 20 20 20 20 54 43 4c 5f 54 48 52  .        TCL_THR
0b60: 45 41 44 53 20 54 43 4c 5f 55 4e 49 43 4f 44 45  EADS TCL_UNICODE
0b70: 20 54 43 4c 5f 57 52 41 50 50 45 52 20 54 45 53   TCL_WRAPPER TES
0b80: 54 20 54 45 53 54 5f 50 4c 55 47 49 4e 20 54 48  T TEST_PLUGIN TH
0b90: 52 45 41 44 49 4e 47 20 5c 0d 0a 20 20 20 20 20  READING \..     
0ba0: 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50     THROW_ON_DISP
0bb0: 4f 53 45 44 20 54 52 41 43 45 20 54 59 50 45 5f  OSED TRACE TYPE_
0bc0: 43 41 43 48 45 20 55 4e 49 58 20 55 53 45 5f 41  CACHE UNIX USE_A
0bd0: 50 50 44 4f 4d 41 49 4e 5f 46 4f 52 5f 49 44 20  PPDOMAIN_FOR_ID 
0be0: 5c 0d 0a 20 20 20 20 20 20 20 20 55 53 45 5f 4e  \..        USE_N
0bf0: 41 4d 45 53 50 41 43 45 53 20 56 45 52 42 4f 53  AMESPACES VERBOS
0c00: 45 20 57 45 42 20 57 49 4e 44 4f 57 53 20 57 49  E WEB WINDOWS WI
0c10: 4e 46 4f 52 4d 53 20 57 49 58 5f 33 30 20 57 49  NFORMS WIX_30 WI
0c20: 58 5f 33 35 20 57 49 58 5f 33 36 20 5c 0d 0a 20  X_35 WIX_36 \.. 
0c30: 20 20 20 20 20 20 20 57 49 58 5f 33 37 20 57 49         WIX_37 WI
0c40: 58 5f 33 38 20 57 49 58 5f 33 39 20 57 49 58 5f  X_38 WIX_39 WIX_
0c50: 33 31 30 20 57 49 58 5f 33 31 31 20 58 36 34 20  310 WIX_311 X64 
0c60: 58 38 36 20 58 4d 4c 5d 0d 0a 20 20 7d 0d 0a 0c  X86 XML]..  }...
0c70: 0d 0a 20 20 70 72 6f 63 20 67 65 74 4b 6e 6f 77  ..  proc getKnow
0c80: 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e 73 20 7b 20  nMonoVersions { 
0c90: 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20  {force false} } 
0ca0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
0cb0: 4e 4f 54 45 3a 20 54 68 69 73 20 6a 6f 62 20 6f  NOTE: This job o
0cc0: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
0cd0: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 20 74 68   is to return th
0ce0: 65 20 6c 69 73 74 20 6f 66 20 22 6b 6e 6f 77 6e  e list of "known
0cf0: 22 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 76  "..    #       v
0d00: 65 72 73 69 6f 6e 73 20 6f 66 20 4d 6f 6e 6f 20  ersions of Mono 
0d10: 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65  supported by the
0d20: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
0d30: 61 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20  astructure...   
0d40: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
0d50: 4f 74 68 65 72 20 74 68 61 6e 20 76 65 72 73 69  Other than versi
0d60: 6f 6e 20 32 2e 31 31 20 28 77 68 69 63 68 20 77  on 2.11 (which w
0d70: 61 73 20 6f 66 66 69 63 69 61 6c 6c 79 20 61 6e  as officially an
0d80: 6e 6f 75 6e 63 65 64 20 61 6e 64 0d 0a 20 20 20  nounced and..   
0d90: 20 23 20 20 20 20 20 20 20 72 65 6c 65 61 73 65   #       release
0da0: 64 29 2c 20 61 6c 6c 20 6f 66 20 74 68 65 73 65  d), all of these
0db0: 20 72 65 6c 65 61 73 65 73 20 61 72 65 20 6c 69   releases are li
0dc0: 73 74 65 64 20 6f 6e 20 74 68 65 20 6f 66 66 69  sted on the offi
0dd0: 63 69 61 6c 0d 0a 20 20 20 20 23 20 20 20 20 20  cial..    #     
0de0: 20 20 72 65 6c 65 61 73 65 20 68 69 73 74 6f 72    release histor
0df0: 79 20 70 61 67 65 73 3a 0d 0a 20 20 20 20 23 0d  y pages:..    #.
0e00: 0a 20 20 20 20 23 20 20 20 20 20 20 20 68 74 74  .    #       htt
0e10: 70 73 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69  ps://en.wikipedi
0e20: 61 2e 6f 72 67 2f 77 69 6b 69 2f 4d 6f 6e 6f 5f  a.org/wiki/Mono_
0e30: 25 32 38 73 6f 66 74 77 61 72 65 25 32 39 0d 0a  %28software%29..
0e40: 20 20 20 20 23 20 20 20 20 20 20 20 68 74 74 70      #       http
0e50: 73 3a 2f 2f 77 77 77 2e 6d 6f 6e 6f 2d 70 72 6f  s://www.mono-pro
0e60: 6a 65 63 74 2e 63 6f 6d 2f 64 6f 63 73 2f 61 62  ject.com/docs/ab
0e70: 6f 75 74 2d 6d 6f 6e 6f 2f 72 65 6c 65 61 73 65  out-mono/release
0e80: 73 2f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  s/..    #..    #
0e90: 20 54 4f 44 4f 3a 20 54 68 69 73 20 6c 69 73 74   TODO: This list
0ea0: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 6e 75 61   should be manua
0eb0: 6c 6c 79 20 75 70 64 61 74 65 64 20 77 68 65 6e  lly updated when
0ec0: 20 61 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f   a new version o
0ed0: 66 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74  f..    #       t
0ee0: 68 65 20 4d 6f 6e 6f 20 72 75 6e 74 69 6d 65 20  he Mono runtime 
0ef0: 69 73 20 72 65 6c 65 61 73 65 64 2e 0d 0a 20 20  is released...  
0f00: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 24 66 6f    #..    if {$fo
0f10: 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
0f20: 69 73 74 73 20 3a 3a 6e 6f 28 6d 6f 6e 6f 56 65  ists ::no(monoVe
0f30: 72 73 69 6f 6e 73 29 5d 7d 20 74 68 65 6e 20 7b  rsions)]} then {
0f40: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
0f50: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
0f60: 20 20 5b 6c 69 73 74 20 32 20 30 5d 20 5b 6c 69    [list 2 0] [li
0f70: 73 74 20 32 20 32 5d 20 5b 6c 69 73 74 20 32 20  st 2 2] [list 2 
0f80: 34 5d 20 5b 6c 69 73 74 20 32 20 36 5d 20 5b 6c  4] [list 2 6] [l
0f90: 69 73 74 20 32 20 38 5d 20 5b 6c 69 73 74 20 32  ist 2 8] [list 2
0fa0: 20 31 30 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20   10] \..        
0fb0: 20 20 5b 6c 69 73 74 20 32 20 31 31 5d 20 5b 6c    [list 2 11] [l
0fc0: 69 73 74 20 33 20 30 5d 20 5b 6c 69 73 74 20 33  ist 3 0] [list 3
0fd0: 20 31 5d 20 5b 6c 69 73 74 20 33 20 32 5d 20 5b   1] [list 3 2] [
0fe0: 6c 69 73 74 20 33 20 34 5d 20 5b 6c 69 73 74 20  list 3 4] [list 
0ff0: 33 20 36 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  3 6] \..        
1000: 20 20 5b 6c 69 73 74 20 33 20 38 5d 20 5b 6c 69    [list 3 8] [li
1010: 73 74 20 33 20 31 30 5d 20 5b 6c 69 73 74 20 33  st 3 10] [list 3
1020: 20 31 32 5d 20 5b 6c 69 73 74 20 34 20 30 5d 20   12] [list 4 0] 
1030: 5b 6c 69 73 74 20 34 20 32 5d 20 5b 6c 69 73 74  [list 4 2] [list
1040: 20 34 20 34 5d 20 5c 0d 0a 20 20 20 20 20 20 20   4 4] \..       
1050: 20 20 20 5b 6c 69 73 74 20 34 20 36 5d 20 5b 6c     [list 4 6] [l
1060: 69 73 74 20 34 20 38 5d 20 5b 6c 69 73 74 20 35  ist 4 8] [list 5
1070: 20 30 5d 20 5b 6c 69 73 74 20 35 20 32 5d 20 5b   0] [list 5 2] [
1080: 6c 69 73 74 20 35 20 34 5d 5d 0d 0a 20 20 20 20  list 5 4]]..    
1090: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10a0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 5d 0d 0a 20  return [list].. 
10b0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
10c0: 70 72 6f 63 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e  proc addKnownMon
10d0: 6f 43 6f 6e 73 74 72 61 69 6e 74 73 20 7b 20 67  oConstraints { g
10e0: 65 6e 65 72 69 63 20 7d 20 7b 0d 0a 20 20 20 20  eneric } {..    
10f0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  #..    # NOTE: D
1100: 6f 65 73 20 74 68 65 20 63 61 6c 6c 65 72 20 77  oes the caller w
1110: 61 6e 74 20 74 6f 20 61 64 64 20 74 68 65 20 76  ant to add the v
1120: 65 72 73 69 6f 6e 2d 73 70 65 63 69 66 69 63 20  ersion-specific 
1130: 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 20  constraints..   
1140: 20 23 20 20 20 20 20 20 20 6f 72 20 74 68 65 20   #       or the 
1150: 67 65 6e 65 72 69 63 20 6f 6e 65 73 3f 0d 0a 20  generic ones?.. 
1160: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 24     #..    if {!$
1170: 67 65 6e 65 72 69 63 7d 20 74 68 65 6e 20 7b 0d  generic} then {.
1180: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1190: 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
11a0: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 73 74 72  necessary constr
11b0: 61 69 6e 74 73 20 66 6f 72 20 65 61 63 68 20 76  aints for each v
11c0: 65 72 73 69 6f 6e 20 6f 66 20 4d 6f 6e 6f 20 74  ersion of Mono t
11d0: 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hat..      #    
11e0: 20 20 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74     we know about
11f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1200: 20 20 66 6f 72 65 61 63 68 20 6d 6f 6e 6f 56 65    foreach monoVe
1210: 72 73 69 6f 6e 20 5b 67 65 74 4b 6e 6f 77 6e 4d  rsion [getKnownM
1220: 6f 6e 6f 56 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a  onoVersions] {..
1230: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 73          set cons
1240: 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 5b 6a  traintVersion [j
1250: 6f 69 6e 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e  oin $monoVersion
1260: 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   ""]....        
1270: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
1280: 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 54 6f  ppendArgs monoTo
1290: 44 6f 20 24 63 6f 6e 73 74 72 61 69 6e 74 56 65  Do $constraintVe
12a0: 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  rsion]..        
12b0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
12c0: 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 54 6f  ppendArgs monoTo
12d0: 44 6f 20 24 63 6f 6e 73 74 72 61 69 6e 74 56 65  Do $constraintVe
12e0: 72 73 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a 20 20 20  rsion Only]..   
12f0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1300: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d  nt [appendArgs m
1310: 6f 6e 6f 42 75 67 20 24 63 6f 6e 73 74 72 61 69  onoBug $constrai
1320: 6e 74 56 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20  ntVersion]..    
1330: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1340: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f  t [appendArgs mo
1350: 6e 6f 42 75 67 20 24 63 6f 6e 73 74 72 61 69 6e  noBug $constrain
1360: 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a  tVersion Only]..
1370: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1380: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1390: 73 20 6d 6f 6e 6f 43 72 61 73 68 20 24 63 6f 6e  s monoCrash $con
13a0: 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 5d 0d  straintVersion].
13b0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
13c0: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
13d0: 67 73 20 6d 6f 6e 6f 43 72 61 73 68 20 24 63 6f  gs monoCrash $co
13e0: 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20  nstraintVersion 
13f0: 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Only]..      }..
1400: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1410: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1420: 4f 54 45 3a 20 41 6c 73 6f 20 61 64 64 20 6a 75  OTE: Also add ju
1430: 73 74 20 74 68 65 20 67 65 6e 65 72 69 63 20 4d  st the generic M
1440: 6f 6e 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ono constraints 
1450: 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
1460: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1470: 61 20 74 72 61 69 6c 69 6e 67 20 76 65 72 73 69  a trailing versi
1480: 6f 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  on...      #..  
1490: 20 20 20 20 73 65 74 20 63 6f 6e 73 74 72 61 69      set constrai
14a0: 6e 74 73 20 5b 6c 69 73 74 20 6d 6f 6e 6f 54 6f  nts [list monoTo
14b0: 44 6f 20 6d 6f 6e 6f 42 75 67 20 6d 6f 6e 6f 43  Do monoBug monoC
14c0: 72 61 73 68 5d 0d 0a 0d 0a 20 20 20 20 20 20 66  rash]....      f
14d0: 6f 72 65 61 63 68 20 63 6f 6e 73 74 72 61 69 6e  oreach constrain
14e0: 74 20 24 63 6f 6e 73 74 72 61 69 6e 74 73 20 7b  t $constraints {
14f0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1500: 73 74 72 61 69 6e 74 20 24 63 6f 6e 73 74 72 61  straint $constra
1510: 69 6e 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  int..      }..  
1520: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
1530: 72 6f 63 20 67 65 74 4b 6e 6f 77 6e 54 63 6c 56  roc getKnownTclV
1540: 65 72 73 69 6f 6e 73 20 7b 20 7b 66 6f 72 63 65  ersions { {force
1550: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
1560: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
1570: 54 68 69 73 20 6a 6f 62 20 6f 66 20 74 68 69 73  This job of this
1580: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 74 6f   procedure is to
1590: 20 72 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74   return the list
15a0: 20 6f 66 20 22 6b 6e 6f 77 6e 22 0d 0a 20 20 20   of "known"..   
15b0: 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
15c0: 73 20 6f 66 20 54 63 6c 2f 54 6b 20 73 75 70 70  s of Tcl/Tk supp
15d0: 6f 72 74 65 64 20 62 79 20 74 68 65 20 74 65 73  orted by the tes
15e0: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
15f0: 75 63 74 75 72 65 2e 0d 0a 20 20 20 20 23 0d 0a  ucture...    #..
1600: 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
1610: 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  | ![info exists 
1620: 3a 3a 6e 6f 28 74 63 6c 56 65 72 73 69 6f 6e 73  ::no(tclVersions
1630: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1640: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5b    return [list [
1650: 6c 69 73 74 20 38 20 34 5d 20 5b 6c 69 73 74 20  list 8 4] [list 
1660: 38 20 35 5d 20 5b 6c 69 73 74 20 38 20 36 5d 20  8 5] [list 8 6] 
1670: 5b 6c 69 73 74 20 38 20 37 5d 5d 0d 0a 20 20 20  [list 8 7]]..   
1680: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1690: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 5d 0d 0a   return [list]..
16a0: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
16b0: 20 70 72 6f 63 20 66 69 6c 74 65 72 4b 6e 6f 77   proc filterKnow
16c0: 6e 56 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20 20  nVersions {..   
16d0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 73 20         versions 
16e0: 7b 6d 69 6e 69 6d 75 6d 56 65 72 73 69 6f 6e 20  {minimumVersion 
16f0: 22 22 7d 20 7b 6d 61 78 69 6d 75 6d 56 65 72 73  ""} {maximumVers
1700: 69 6f 6e 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ion ""} } {..   
1710: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1720: 67 74 68 20 24 6d 69 6e 69 6d 75 6d 56 65 72 73  gth $minimumVers
1730: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
1740: 0d 0a 20 20 20 20 20 20 73 65 74 20 64 6f 74 4d  ..      set dotM
1750: 69 6e 69 6d 75 6d 56 65 72 73 69 6f 6e 20 5b 67  inimumVersion [g
1760: 65 74 44 6f 74 74 65 64 56 65 72 73 69 6f 6e 20  etDottedVersion 
1770: 24 6d 69 6e 69 6d 75 6d 56 65 72 73 69 6f 6e 5d  $minimumVersion]
1780: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
1790: 20 20 20 20 20 20 73 65 74 20 64 6f 74 4d 69 6e        set dotMin
17a0: 69 6d 75 6d 56 65 72 73 69 6f 6e 20 22 22 0d 0a  imumVersion ""..
17b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20      }....    if 
17c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
17d0: 24 6d 61 78 69 6d 75 6d 56 65 72 73 69 6f 6e 5d  $maximumVersion]
17e0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
17f0: 20 20 20 20 73 65 74 20 64 6f 74 4d 61 78 69 6d      set dotMaxim
1800: 75 6d 56 65 72 73 69 6f 6e 20 5b 67 65 74 44 6f  umVersion [getDo
1810: 74 74 65 64 56 65 72 73 69 6f 6e 20 24 6d 61 78  ttedVersion $max
1820: 69 6d 75 6d 56 65 72 73 69 6f 6e 5d 0d 0a 20 20  imumVersion]..  
1830: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1840: 20 20 73 65 74 20 64 6f 74 4d 61 78 69 6d 75 6d    set dotMaximum
1850: 56 65 72 73 69 6f 6e 20 22 22 0d 0a 20 20 20 20  Version ""..    
1860: 7d 0d 0a 0d 0a 20 20 20 20 73 65 74 20 72 65 73  }....    set res
1870: 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
1880: 20 20 66 6f 72 65 61 63 68 20 76 65 72 73 69 6f    foreach versio
1890: 6e 20 24 76 65 72 73 69 6f 6e 73 20 7b 0d 0a 20  n $versions {.. 
18a0: 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72 73       set dotVers
18b0: 69 6f 6e 20 5b 67 65 74 44 6f 74 74 65 64 56 65  ion [getDottedVe
18c0: 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e 5d 0d  rsion $version].
18d0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
18e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 6f 74  ring length $dot
18f0: 4d 69 6e 69 6d 75 6d 56 65 72 73 69 6f 6e 5d 20  MinimumVersion] 
1900: 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
1910: 20 20 20 20 24 64 6f 74 56 65 72 73 69 6f 6e 20      $dotVersion 
1920: 3c 20 24 64 6f 74 4d 69 6e 69 6d 75 6d 56 65 72  < $dotMinimumVer
1930: 73 69 6f 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  sion} then {..  
1940: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0d 0a        continue..
1950: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1960: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1970: 67 74 68 20 24 64 6f 74 4d 61 78 69 6d 75 6d 56  gth $dotMaximumV
1980: 65 72 73 69 6f 6e 5d 20 3e 20 30 20 26 26 20 5c  ersion] > 0 && \
1990: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 6f 74  ..          $dot
19a0: 56 65 72 73 69 6f 6e 20 3e 20 24 64 6f 74 4d 61  Version > $dotMa
19b0: 78 69 6d 75 6d 56 65 72 73 69 6f 6e 7d 20 74 68  ximumVersion} th
19c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
19d0: 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 7d 0d  ntinue..      }.
19e0: 0a 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64  ...      lappend
19f0: 20 72 65 73 75 6c 74 20 24 76 65 72 73 69 6f 6e   result $version
1a00: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72  ..    }....    r
1a10: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
1a20: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65   }.....  proc ge
1a30: 74 44 6f 74 74 65 64 56 65 72 73 69 6f 6e 20 7b  tDottedVersion {
1a40: 20 76 65 72 73 69 6f 6e 20 7d 20 7b 0d 0a 20 20   version } {..  
1a50: 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 24    return [join $
1a60: 76 65 72 73 69 6f 6e 20 2e 5d 0d 0a 20 20 7d 0d  version .]..  }.
1a70: 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 44 6f  ....  proc getDo
1a80: 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 7b 20 76  tlessVersion { v
1a90: 65 72 73 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20  ersion } {..    
1aa0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 66 69 72 73  if {[string firs
1ab0: 74 20 2e 20 24 76 65 72 73 69 6f 6e 5d 20 21 3d  t . $version] !=
1ac0: 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
1ad0: 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e     return [strin
1ae0: 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e 20 22 22  g map [list . ""
1af0: 5d 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20  ] $version]..   
1b00: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1b10: 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 24 76   return [join $v
1b20: 65 72 73 69 6f 6e 20 22 22 5d 0d 0a 20 20 20 20  ersion ""]..    
1b30: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
1b40: 63 20 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56  c getMajorMinorV
1b50: 65 72 73 69 6f 6e 20 7b 20 76 65 72 73 69 6f 6e  ersion { version
1b60: 20 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e   } {..    return
1b70: 20 5b 6a 6f 69 6e 20 5b 6c 72 61 6e 67 65 20 5b   [join [lrange [
1b80: 73 70 6c 69 74 20 24 76 65 72 73 69 6f 6e 20 2e  split $version .
1b90: 5d 20 30 20 31 5d 20 2e 5d 0d 0a 20 20 7d 0d 0a  ] 0 1] .]..  }..
1ba0: 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
1bb0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
1bc0: 20 77 61 73 20 61 64 61 70 74 65 64 20 66 72 6f   was adapted fro
1bd0: 6d 20 74 68 65 20 6f 6e 65 20 6c 69 73 74 65 64  m the one listed
1be0: 20 6f 6e 20 74 68 65 20 54 63 6c 20 57 69 6b 69   on the Tcl Wiki
1bf0: 20 70 61 67 65 0d 0a 20 20 23 20 20 20 20 20 20   page..  #      
1c00: 20 61 74 20 22 68 74 74 70 73 3a 2f 2f 77 69 6b   at "https://wik
1c10: 69 2e 74 63 6c 2e 74 6b 2f 34 33 22 2e 20 20 49  i.tcl.tk/43".  I
1c20: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 74 65 6e 64  t is only intend
1c30: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 6f 6e  ed to be used on
1c40: 20 76 65 72 79 0d 0a 20 20 23 20 20 20 20 20 20   very..  #      
1c50: 20 73 6d 61 6c 6c 20 6c 69 73 74 73 20 62 65 63   small lists bec
1c60: 61 75 73 65 20 6f 66 20 69 74 73 20 68 65 61 76  ause of its heav
1c70: 79 20 75 73 65 20 6f 66 20 72 65 63 75 72 73 69  y use of recursi
1c80: 6f 6e 20 61 6e 64 20 63 6f 6d 70 6c 65 78 69 74  on and complexit
1c90: 79 20 6f 6e 0d 0a 20 20 23 20 20 20 20 20 20 20  y on..  #       
1ca0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 4f 28 4e  the order of O(N
1cb0: 21 29 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63  !)...  #..  proc
1cc0: 20 6c 70 65 72 6d 75 74 65 20 7b 20 6c 69 73 74   lpermute { list
1cd0: 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20 6c 65   } {..    set le
1ce0: 6e 67 74 68 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  ngth [llength $l
1cf0: 69 73 74 5d 0d 0a 20 20 20 20 69 66 20 7b 24 6c  ist]..    if {$l
1d00: 65 6e 67 74 68 20 3c 20 32 7d 20 7b 0d 0a 20 20  ength < 2} {..  
1d10: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
1d20: 20 24 6c 69 73 74 5d 0d 0a 20 20 20 20 7d 0d 0a   $list]..    }..
1d30: 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 30 0d      set index 0.
1d40: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 65 6c 65  .    foreach ele
1d50: 6d 65 6e 74 31 20 24 6c 69 73 74 20 7b 0d 0a 20  ment1 $list {.. 
1d60: 20 20 20 20 20 69 66 20 7b 24 69 6e 64 65 78 20       if {$index 
1d70: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1d80: 20 20 20 20 20 20 73 65 74 20 72 65 73 74 20 5b        set rest [
1d90: 6c 72 61 6e 67 65 20 24 6c 69 73 74 20 31 20 65  lrange $list 1 e
1da0: 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  nd]..      } els
1db0: 65 69 66 20 7b 24 69 6e 64 65 78 20 3d 3d 20 24  eif {$index == $
1dc0: 6c 65 6e 67 74 68 20 2d 20 31 7d 20 74 68 65 6e  length - 1} then
1dd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1de0: 72 65 73 74 20 5b 6c 72 61 6e 67 65 20 24 6c 69  rest [lrange $li
1df0: 73 74 20 30 20 65 6e 64 2d 31 5d 0d 0a 20 20 20  st 0 end-1]..   
1e00: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1e10: 20 20 20 20 20 73 65 74 20 72 65 73 74 20 5b 63       set rest [c
1e20: 6f 6e 63 61 74 20 5c 0d 0a 20 20 20 20 20 20 20  oncat \..       
1e30: 20 20 20 20 20 5b 6c 72 61 6e 67 65 20 24 6c 69       [lrange $li
1e40: 73 74 20 30 20 5b 65 78 70 72 20 7b 24 69 6e 64  st 0 [expr {$ind
1e50: 65 78 20 2d 20 31 7d 5d 5d 20 5c 0d 0a 20 20 20  ex - 1}]] \..   
1e60: 20 20 20 20 20 20 20 20 20 5b 6c 72 61 6e 67 65           [lrange
1e70: 20 24 6c 69 73 74 20 5b 65 78 70 72 20 7b 24 69   $list [expr {$i
1e80: 6e 64 65 78 20 2b 20 31 7d 5d 20 65 6e 64 5d 5d  ndex + 1}] end]]
1e90: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
1ea0: 20 69 6e 63 72 20 69 6e 64 65 78 0d 0a 20 20 20   incr index..   
1eb0: 20 20 20 66 6f 72 65 61 63 68 20 6c 69 73 74 32     foreach list2
1ec0: 20 5b 6c 70 65 72 6d 75 74 65 20 24 72 65 73 74   [lpermute $rest
1ed0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  ] {..        lap
1ee0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 63 6f 6e  pend result [con
1ef0: 63 61 74 20 5b 6c 69 73 74 20 24 65 6c 65 6d 65  cat [list $eleme
1f00: 6e 74 31 5d 20 24 6c 69 73 74 32 5d 0d 0a 20 20  nt1] $list2]..  
1f10: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
1f20: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
1f30: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
1f40: 20 61 6c 77 61 79 73 46 75 6c 6c 49 6e 74 65 72   alwaysFullInter
1f50: 70 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20  pReady {} {..   
1f60: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
1f70: 54 68 65 20 5b 69 6e 74 65 72 70 20 72 65 61 64  The [interp read
1f80: 79 6c 69 6d 69 74 5d 20 73 75 62 2d 63 6f 6d 6d  ylimit] sub-comm
1f90: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 69 6e 20 45  and is only in E
1fa0: 61 67 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  agle...    #..  
1fb0: 20 20 69 66 20 7b 21 5b 69 73 45 61 67 6c 65 5d    if {![isEagle]
1fc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1fd0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
1fe0: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
1ff0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 69 73   # NOTE: If this
2000: 20 45 61 67 6c 65 20 76 65 72 73 69 6f 6e 20 6c   Eagle version l
2010: 61 63 6b 73 20 5b 69 6e 74 65 72 70 20 72 65 61  acks [interp rea
2020: 64 79 6c 69 6d 69 74 5d 20 2d 4f 52 2d 20 69 74  dylimit] -OR- it
2030: 20 68 61 73 0d 0a 20 20 20 20 23 20 20 20 20 20   has..    #     
2040: 20 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61    the default va
2050: 6c 75 65 20 28 69 2e 65 2e 20 69 74 20 61 6c 77  lue (i.e. it alw
2060: 61 79 73 20 66 75 6c 6c 79 20 63 68 65 63 6b 73  ays fully checks
2070: 20 72 65 61 64 69 6e 65 73 73 29 2c 0d 0a 20 20   readiness),..  
2080: 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
2090: 20 74 72 75 65 2e 0d 0a 20 20 20 20 23 0d 0a 20   true...    #.. 
20a0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
20b0: 7b 0d 0a 20 20 20 20 20 20 5b 63 61 74 63 68 20  {..      [catch 
20c0: 7b 69 6e 74 65 72 70 20 72 65 61 64 79 6c 69 6d  {interp readylim
20d0: 69 74 20 7b 7d 7d 20 72 65 61 64 79 6c 69 6d 69  it {}} readylimi
20e0: 74 5d 20 7c 7c 20 24 72 65 61 64 79 6c 69 6d 69  t] || $readylimi
20f0: 74 20 3d 3d 20 30 0d 0a 20 20 20 20 7d 5d 0d 0a  t == 0..    }]..
2100: 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23    }.....  #..  #
2110: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
2120: 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65 74  edure should ret
2130: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
2140: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2150: 73 74 65 6d 0d 0a 20 20 23 20 20 20 20 20 20 20  stem..  #       
2160: 73 68 65 6c 6c 20 6d 61 79 20 62 65 20 65 78 65  shell may be exe
2170: 63 75 74 65 64 20 62 79 20 74 68 65 20 74 65 73  cuted by the tes
2180: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
2190: 75 63 74 75 72 65 20 6f 75 74 73 69 64 65 0d 0a  ucture outside..
21a0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63 6f    #       the co
21b0: 6e 74 65 78 74 20 6f 66 20 61 6e 79 20 73 70 65  ntext of any spe
21c0: 63 69 66 69 63 20 74 65 73 74 73 2e 20 20 54 68  cific tests.  Th
21d0: 65 20 73 70 65 63 69 66 69 63 20 74 65 73 74 73  e specific tests
21e0: 20 74 68 65 6d 73 65 6c 76 65 73 0d 0a 20 20 23   themselves..  #
21f0: 20 20 20 20 20 20 20 6d 75 73 74 20 6d 61 6b 65         must make
2200: 20 75 73 65 20 6f 66 20 74 68 65 69 72 20 6f 77   use of their ow
2210: 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  n constraints to
2220: 20 70 72 65 76 65 6e 74 20 69 74 73 20 65 78 65   prevent its exe
2230: 63 75 74 69 6f 6e 2e 0d 0a 20 20 23 0d 0a 20 20  cution...  #..  
2240: 70 72 6f 63 20 63 61 6e 45 78 65 63 43 6f 6d 53  proc canExecComS
2250: 70 65 63 20 7b 7d 20 7b 0d 0a 20 20 20 20 69 66  pec {} {..    if
2260: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2270: 3a 6e 6f 28 65 78 65 63 29 5d 7d 20 74 68 65 6e  :no(exec)]} then
2280: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
2290: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   false..    }...
22a0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
22b0: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 6d 53 70  xists ::no(comSp
22c0: 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ec)]} then {..  
22d0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
22e0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
22f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2300: 3a 3a 6e 6f 28 63 61 6e 45 78 65 63 43 6f 6d 53  ::no(canExecComS
2310: 70 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pec)]} then {.. 
2320: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
2330: 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  e..    }....    
2340: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 7d  return true..  }
2350: 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  .....  #..  # NO
2360: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
2370: 72 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  re should return
2380: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2390: 20 22 77 68 6f 61 6d 69 22 20 63 6f 6d 6d 61 6e   "whoami" comman
23a0: 64 20 6d 61 79 0d 0a 20 20 23 20 20 20 20 20 20  d may..  #      
23b0: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
23c0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69  the test suite i
23d0: 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 6f 75  nfrastructure ou
23e0: 74 73 69 64 65 20 74 68 65 20 63 6f 6e 74 65 78  tside the contex
23f0: 74 0d 0a 20 20 23 20 20 20 20 20 20 20 6f 66 20  t..  #       of 
2400: 61 6e 79 20 73 70 65 63 69 66 69 63 20 74 65 73  any specific tes
2410: 74 73 2e 20 20 54 68 65 20 73 70 65 63 69 66 69  ts.  The specifi
2420: 63 20 74 65 73 74 73 20 74 68 65 6d 73 65 6c 76  c tests themselv
2430: 65 73 20 6d 75 73 74 20 6d 61 6b 65 0d 0a 20 20  es must make..  
2440: 23 20 20 20 20 20 20 20 75 73 65 20 6f 66 20 74  #       use of t
2450: 68 65 69 72 20 6f 77 6e 20 63 6f 6e 73 74 72 61  heir own constra
2460: 69 6e 74 73 20 74 6f 20 70 72 65 76 65 6e 74 20  ints to prevent 
2470: 69 74 73 20 65 78 65 63 75 74 69 6f 6e 2e 0d 0a  its execution...
2480: 20 20 23 0d 0a 20 20 70 72 6f 63 20 63 61 6e 45    #..  proc canE
2490: 78 65 63 57 68 6f 41 6d 49 20 7b 7d 20 7b 0d 0a  xecWhoAmI {} {..
24a0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24b0: 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d  ists ::no(exec)]
24c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24d0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
24e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b    }....    if {[
24f0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2500: 28 77 68 6f 61 6d 69 29 5d 7d 20 74 68 65 6e 20  (whoami)]} then 
2510: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
2520: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  false..    }....
2530: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2540: 69 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 45 78 65  ists ::no(canExe
2550: 63 57 68 6f 41 6d 49 29 5d 7d 20 74 68 65 6e 20  cWhoAmI)]} then 
2560: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
2570: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  false..    }....
2580: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
2590: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20  .  }.....  #..  
25a0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
25b0: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65  cedure should re
25c0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
25d0: 20 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c 20   the native Tcl 
25e0: 73 68 65 6c 6c 20 6d 61 79 0d 0a 20 20 23 20 20  shell may..  #  
25f0: 20 20 20 20 20 62 65 20 65 78 65 63 75 74 65 64       be executed
2600: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
2610: 74 65 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  te infrastructur
2620: 65 20 6f 75 74 73 69 64 65 20 74 68 65 20 63 6f  e outside the co
2630: 6e 74 65 78 74 0d 0a 20 20 23 20 20 20 20 20 20  ntext..  #      
2640: 20 6f 66 20 61 6e 79 20 73 70 65 63 69 66 69 63   of any specific
2650: 20 74 65 73 74 73 2e 20 20 54 68 65 20 73 70 65   tests.  The spe
2660: 63 69 66 69 63 20 74 65 73 74 73 20 74 68 65 6d  cific tests them
2670: 73 65 6c 76 65 73 20 6d 75 73 74 20 6d 61 6b 65  selves must make
2680: 0d 0a 20 20 23 20 20 20 20 20 20 20 75 73 65 20  ..  #       use 
2690: 6f 66 20 74 68 65 69 72 20 6f 77 6e 20 63 6f 6e  of their own con
26a0: 73 74 72 61 69 6e 74 73 20 74 6f 20 70 72 65 76  straints to prev
26b0: 65 6e 74 20 69 74 73 20 65 78 65 63 75 74 69 6f  ent its executio
26c0: 6e 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20  n...  #..  proc 
26d0: 63 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c 20  canExecTclShell 
26e0: 7b 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69  {} {..    if {[i
26f0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2700: 65 78 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  exec)]} then {..
2710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2720: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
2730: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2740: 73 20 3a 3a 6e 6f 28 74 63 6c 29 5d 7d 20 74 68  s ::no(tcl)]} th
2750: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75  en {..      retu
2760: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
2770: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
2780: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 61 6e   exists ::no(can
2790: 45 78 65 63 54 63 6c 53 68 65 6c 6c 29 5d 7d 20  ExecTclShell)]} 
27a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65  then {..      re
27b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
27c0: 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  }....    return 
27d0: 74 72 75 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  true..  }.....  
27e0: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
27f0: 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  s procedure shou
2800: 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ld return non-ze
2810: 72 6f 20 69 66 20 46 6f 73 73 69 6c 20 6d 61 79  ro if Fossil may
2820: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 0d   be executed by.
2830: 0a 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74  .  #       the t
2840: 65 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73  est suite infras
2850: 74 72 75 63 74 75 72 65 20 6f 75 74 73 69 64 65  tructure outside
2860: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
2870: 61 6e 79 20 73 70 65 63 69 66 69 63 0d 0a 20 20  any specific..  
2880: 23 20 20 20 20 20 20 20 74 65 73 74 73 2e 20 20  #       tests.  
2890: 54 68 65 20 73 70 65 63 69 66 69 63 20 74 65 73  The specific tes
28a0: 74 73 20 74 68 65 6d 73 65 6c 76 65 73 20 6d 75  ts themselves mu
28b0: 73 74 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74  st make use of t
28c0: 68 65 69 72 20 6f 77 6e 0d 0a 20 20 23 20 20 20  heir own..  #   
28d0: 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
28e0: 74 6f 20 70 72 65 76 65 6e 74 20 69 74 73 20 65  to prevent its e
28f0: 78 65 63 75 74 69 6f 6e 2e 0d 0a 20 20 23 0d 0a  xecution...  #..
2900: 20 20 70 72 6f 63 20 63 61 6e 45 78 65 63 46 6f    proc canExecFo
2910: 73 73 69 6c 20 7b 7d 20 7b 0d 0a 20 20 20 20 69  ssil {} {..    i
2920: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2930: 3a 3a 6e 6f 28 65 78 65 63 29 5d 7d 20 74 68 65  ::no(exec)]} the
2940: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
2950: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
2960: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
2970: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 66 6f 73 73  exists ::no(foss
2980: 69 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  il)]} then {..  
2990: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
29a0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
29b0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
29c0: 3a 3a 6e 6f 28 63 61 6e 45 78 65 63 46 6f 73 73  ::no(canExecFoss
29d0: 69 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  il)]} then {..  
29e0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
29f0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72  ..    }....    r
2a00: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 7d 0d  eturn true..  }.
2a10: 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
2a20: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
2a30: 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  e should return 
2a40: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2a50: 22 76 73 77 68 65 72 65 22 20 74 6f 6f 6c 20 6d  "vswhere" tool m
2a60: 61 79 20 62 65 0d 0a 20 20 23 20 20 20 20 20 20  ay be..  #      
2a70: 20 65 78 65 63 75 74 65 64 20 62 79 20 74 68 65   executed by the
2a80: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
2a90: 61 73 74 72 75 63 74 75 72 65 20 6f 75 74 73 69  astructure outsi
2aa0: 64 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  de the context o
2ab0: 66 0d 0a 20 20 23 20 20 20 20 20 20 20 61 6e 79  f..  #       any
2ac0: 20 73 70 65 63 69 66 69 63 20 74 65 73 74 73 2e   specific tests.
2ad0: 20 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74    The specific t
2ae0: 65 73 74 73 20 74 68 65 6d 73 65 6c 76 65 73 20  ests themselves 
2af0: 6d 75 73 74 20 6d 61 6b 65 20 75 73 65 0d 0a 20  must make use.. 
2b00: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 69   #       of thei
2b10: 72 20 6f 77 6e 20 63 6f 6e 73 74 72 61 69 6e 74  r own constraint
2b20: 73 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 73  s to prevent its
2b30: 20 65 78 65 63 75 74 69 6f 6e 2e 0d 0a 20 20 23   execution...  #
2b40: 0d 0a 20 20 70 72 6f 63 20 63 61 6e 45 78 65 63  ..  proc canExec
2b50: 56 73 57 68 65 72 65 20 7b 7d 20 7b 0d 0a 20 20  VsWhere {} {..  
2b60: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2b70: 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 7d 20  ts ::no(exec)]} 
2b80: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65  then {..      re
2b90: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
2ba0: 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  }....    if {[in
2bb0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76  fo exists ::no(v
2bc0: 73 77 68 65 72 65 29 5d 7d 20 74 68 65 6e 20 7b  swhere)]} then {
2bd0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
2be0: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  alse..    }.... 
2bf0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2c00: 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 45 78 65 63  sts ::no(canExec
2c10: 56 73 57 68 65 72 65 29 5d 7d 20 74 68 65 6e 20  VsWhere)]} then 
2c20: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
2c30: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  false..    }....
2c40: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
2c50: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20  .  }.....  #..  
2c60: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
2c70: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65  cedure should re
2c80: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
2c90: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
2ca0: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 23 20 20  should be..  #  
2cb0: 20 20 20 20 20 63 6f 6e 73 69 64 65 72 65 64 20       considered 
2cc0: 74 6f 20 62 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  to be running on
2cd0: 20 4d 6f 6e 6f 2e 0d 0a 20 20 23 0d 0a 20 20 70   Mono...  #..  p
2ce0: 72 6f 63 20 69 73 54 65 73 74 4d 6f 6e 6f 20 7b  roc isTestMono {
2cf0: 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  } {..    return 
2d00: 5b 65 78 70 72 20 7b 21 5b 69 6e 66 6f 20 65 78  [expr {![info ex
2d10: 69 73 74 73 20 3a 3a 6e 6f 28 6d 6f 6e 6f 29 5d  ists ::no(mono)]
2d20: 20 26 26 20 5b 69 73 4d 6f 6e 6f 5d 7d 5d 0d 0a   && [isMono]}]..
2d30: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 69    }.....  proc i
2d40: 73 54 65 73 74 41 64 6d 69 6e 69 73 74 72 61 74  sTestAdministrat
2d50: 6f 72 20 7b 20 7b 66 6f 72 63 65 20 66 61 6c 73  or { {force fals
2d60: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  e} } {..    #.. 
2d70: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
2d80: 69 73 20 61 20 77 6f 72 6b 61 72 6f 75 6e 64 20  is a workaround 
2d90: 66 6f 72 20 74 68 65 20 5b 69 73 41 64 6d 69 6e  for the [isAdmin
2da0: 69 73 74 72 61 74 6f 72 5d 20 70 72 6f 63 65 64  istrator] proced
2db0: 75 72 65 20 62 65 69 6e 67 0d 0a 20 20 20 20 23  ure being..    #
2dc0: 20 20 20 20 20 20 20 69 6e 61 63 63 75 72 61 74         inaccurat
2dd0: 65 20 66 6f 72 20 4d 6f 6e 6f 20 6f 6e 20 57 69  e for Mono on Wi
2de0: 6e 64 6f 77 73 2c 20 70 72 69 6d 61 72 69 6c 79  ndows, primarily
2df0: 20 64 75 65 20 74 6f 20 74 68 65 20 69 6e 61 62   due to the inab
2e00: 69 6c 69 74 79 0d 0a 20 20 20 20 23 20 20 20 20  ility..    #    
2e10: 20 20 20 6f 66 20 4d 6f 6e 6f 20 74 6f 20 63 61     of Mono to ca
2e20: 6c 6c 20 61 20 50 2f 49 6e 76 6f 6b 65 20 6d 65  ll a P/Invoke me
2e30: 74 68 6f 64 20 62 79 20 6f 72 64 69 6e 61 6c 2e  thod by ordinal.
2e40: 20 20 41 6c 73 6f 2c 20 74 68 69 73 20 63 61 6e    Also, this can
2e50: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 62 65  ..    #       be
2e60: 20 75 73 65 64 20 66 6f 72 20 6e 61 74 69 76 65   used for native
2e70: 20 54 63 6c 20 6f 6e 20 57 69 6e 64 6f 77 73 2e   Tcl on Windows.
2e80: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
2e90: 73 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 0d 0a 20  s on Windows... 
2ea0: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69     #..    if {[i
2eb0: 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20  sWindows]} then 
2ec0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
2ed0: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c    # NOTE: Normal
2ee0: 6c 79 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  ly, this is only
2ef0: 20 75 73 65 64 20 66 6f 72 20 6e 61 74 69 76 65   used for native
2f00: 20 54 63 6c 20 6f 72 20 45 61 67 6c 65 20 6f 6e   Tcl or Eagle on
2f10: 20 4d 6f 6e 6f 3b 0d 0a 20 20 20 20 20 20 23 20   Mono;..      # 
2f20: 20 20 20 20 20 20 68 6f 77 65 76 65 72 2c 20 69        however, i
2f30: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  t can be used fo
2f40: 72 20 45 61 67 6c 65 20 6f 6e 20 74 68 65 20 2e  r Eagle on the .
2f50: 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 66  NET Framework if
2f60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2f70: 66 6f 72 63 65 64 2e 0d 0a 20 20 20 20 20 20 23  forced...      #
2f80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72  ..      if {$for
2f90: 63 65 20 7c 7c 20 21 5b 69 73 45 61 67 6c 65 5d  ce || ![isEagle]
2fa0: 20 7c 7c 20 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d   || [isTestMono]
2fb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fc0: 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63 57 68    if {[canExecWh
2fd0: 6f 41 6d 49 5d 20 26 26 20 5c 0d 0a 20 20 20 20  oAmI] && \..    
2fe0: 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
2ff0: 65 78 65 63 20 2d 2d 20 77 68 6f 61 6d 69 20 2f  exec -- whoami /
3000: 67 72 6f 75 70 73 7d 20 67 72 6f 75 70 73 5d 20  groups} groups] 
3010: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
3020: 20 20 20 20 20 20 20 20 73 65 74 20 67 72 6f 75          set grou
3030: 70 73 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  ps [string map [
3040: 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 24 67  list \r\n \n] $g
3050: 72 6f 75 70 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  roups]....      
3060: 20 20 20 20 66 6f 72 65 61 63 68 20 67 72 6f 75      foreach grou
3070: 70 20 5b 73 70 6c 69 74 20 24 67 72 6f 75 70 73  p [split $groups
3080: 20 5c 6e 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   \n] {..        
3090: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
30a0: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 74 63 68     # NOTE: Match
30b0: 20 74 68 69 73 20 67 72 6f 75 70 20 6c 69 6e 65   this group line
30c0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 77 65   against the "we
30d0: 6c 6c 2d 6b 6e 6f 77 6e 22 20 53 49 44 20 66 6f  ll-known" SID fo
30e0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  r..            #
30f0: 20 20 20 20 20 20 20 74 68 65 20 22 41 64 6d 69         the "Admi
3100: 6e 69 73 74 72 61 74 6f 72 73 22 20 67 72 6f 75  nistrators" grou
3110: 70 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 0d 0a 20  p on Windows... 
3120: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3130: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72            if {[r
3140: 65 67 65 78 70 20 2d 2d 20 7b 5c 73 53 2d 31 2d  egexp -- {\sS-1-
3150: 35 2d 33 32 2d 35 34 34 5c 73 7d 20 24 67 72 6f  5-32-544\s} $gro
3160: 75 70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  up]} then {..   
3170: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
3190: 54 45 3a 20 4d 61 74 63 68 20 74 68 69 73 20 67  TE: Match this g
31a0: 72 6f 75 70 20 6c 69 6e 65 20 61 67 61 69 6e 73  roup line agains
31b0: 74 20 74 68 65 20 61 74 74 72 69 62 75 74 65 73  t the attributes
31c0: 20 63 6f 6c 75 6d 6e 0d 0a 20 20 20 20 20 20 20   column..       
31d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
31e0: 75 62 2d 76 61 6c 75 65 20 74 68 61 74 20 73 68  ub-value that sh
31f0: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
3200: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74  when running wit
3210: 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h..             
3220: 20 23 20 20 20 20 20 20 20 65 6c 65 76 61 74 65   #       elevate
3230: 64 20 61 64 6d 69 6e 69 73 74 72 61 74 6f 72 20  d administrator 
3240: 63 72 65 64 65 6e 74 69 61 6c 73 2e 0d 0a 20 20  credentials...  
3250: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3270: 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5c 73 45  {[regexp -- {\sE
3280: 6e 61 62 6c 65 64 20 67 72 6f 75 70 28 3f 3a 2c  nabled group(?:,
3290: 7c 5c 73 29 7d 20 24 67 72 6f 75 70 5d 7d 20 74  |\s)} $group]} t
32a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
32b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
32c0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
32d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
32e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
32f0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
3300: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
3310: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
3320: 20 57 65 20 6d 75 73 74 20 62 65 20 72 75 6e 6e   We must be runn
3330: 69 6e 67 20 69 6e 20 6e 61 74 69 76 65 20 54 63  ing in native Tc
3340: 6c 2c 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 55 6e  l, running on Un
3350: 69 78 2c 20 72 75 6e 6e 69 6e 67 20 69 6e 0d 0a  ix, running in..
3360: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
3370: 65 20 6f 6e 20 74 68 65 20 2e 4e 45 54 20 46 72  e on the .NET Fr
3380: 61 6d 65 77 6f 72 6b 2c 20 6f 72 20 75 6e 61 62  amework, or unab
3390: 6c 65 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  le to execute th
33a0: 65 20 22 77 68 6f 61 6d 69 22 0d 0a 20 20 20 20  e "whoami"..    
33b0: 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 2e  #       command.
33c0: 20 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20    If running in 
33d0: 45 61 67 6c 65 2c 20 77 65 20 63 61 6e 20 6a 75  Eagle, we can ju
33e0: 73 74 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 75  st fallback to u
33f0: 73 69 6e 67 0d 0a 20 20 20 20 23 20 20 20 20 20  sing..    #     
3400: 20 20 74 68 65 20 5b 69 73 41 64 6d 69 6e 69 73    the [isAdminis
3410: 74 72 61 74 6f 72 5d 20 70 72 6f 63 65 64 75 72  trator] procedur
3420: 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75  e; otherwise, ju
3430: 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  st return false.
3440: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 72 65 74  ..    #..    ret
3450: 75 72 6e 20 5b 65 78 70 72 20 7b 5b 69 73 45 61  urn [expr {[isEa
3460: 67 6c 65 5d 20 3f 20 5b 69 73 41 64 6d 69 6e 69  gle] ? [isAdmini
3470: 73 74 72 61 74 6f 72 5d 20 3a 20 66 61 6c 73 65  strator] : false
3480: 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  }]..  }.....  pr
3490: 6f 63 20 63 61 6e 50 69 6e 67 20 7b 20 7b 76 61  oc canPing { {va
34a0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
34b0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
34c0: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
34d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 70 72  y the caller, pr
34e0: 6f 76 69 64 65 20 61 20 72 65 61 73 6f 6e 20 77  ovide a reason w
34f0: 68 65 6e 65 76 65 72 20 66 61 6c 73 65 20 69 73  henever false is
3500: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 72 65  ..    #       re
3510: 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73  turned from this
3520: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
3530: 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72   #..    if {[str
3540: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
3550: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
3560: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
3570: 24 76 61 72 4e 61 6d 65 20 72 65 61 73 6f 6e 0d  $varName reason.
3580: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
3590: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 61 74  .    # NOTE: Nat
35a0: 69 76 65 20 54 63 6c 20 28 77 69 74 68 6f 75 74  ive Tcl (without
35b0: 20 65 78 74 72 61 20 70 61 63 6b 61 67 65 73 29   extra packages)
35c0: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64   does not provid
35d0: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 0d 0a 20  e support for.. 
35e0: 20 20 20 23 20 20 20 20 20 20 20 70 69 6e 67 69     #       pingi
35f0: 6e 67 20 61 20 6e 65 74 77 6f 72 6b 20 68 6f 73  ng a network hos
3600: 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  t...    #..    i
3610: 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68  f {[isEagle]} th
3620: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  en {..      if {
3630: 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68  [isTestMono]} th
3640: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3650: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3660: 20 55 73 69 6e 67 20 5b 75 72 69 20 70 69 6e 67   Using [uri ping
3670: 5d 20 6f 6e 20 74 68 65 20 4d 6f 6e 6f 20 33 2e  ] on the Mono 3.
3680: 33 2e 30 20 28 6f 72 20 33 2e 34 2e 30 3f 29 20  3.0 (or 3.4.0?) 
3690: 72 65 6c 65 61 73 65 20 77 69 6c 6c 0d 0a 20 20  release will..  
36a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
36b0: 63 6b 20 75 70 20 74 68 65 20 70 72 6f 63 65 73  ck up the proces
36c0: 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 73 6b  s; therefore, sk
36d0: 69 70 20 69 74 20 69 6e 20 74 68 61 74 20 63 61  ip it in that ca
36e0: 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  se...        #..
36f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
3700: 65 43 6f 6e 73 74 72 61 69 6e 74 20 6d 6f 6e 6f  eConstraint mono
3710: 33 33 5d 20 7c 7c 20 5b 68 61 76 65 43 6f 6e 73  33] || [haveCons
3720: 74 72 61 69 6e 74 20 6d 6f 6e 6f 33 34 5d 7d 20  traint mono34]} 
3730: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3740: 20 20 73 65 74 20 72 65 61 73 6f 6e 20 22 73 6b    set reason "sk
3750: 69 70 70 65 64 2c 20 6d 61 79 20 68 61 6e 67 20  ipped, may hang 
3760: 6f 6e 20 4d 6f 6e 6f 20 33 2e 33 2e 30 20 61 6e  on Mono 3.3.0 an
3770: 64 20 33 2e 34 2e 30 22 0d 0a 20 20 20 20 20 20  d 3.4.0"..      
3780: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3790: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
37a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37b0: 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 20    # NOTE: Other 
37c0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 6f 6e 6f  versions of Mono
37d0: 2c 20 65 2e 67 2e 20 33 2e 31 32 2c 20 61 70 70  , e.g. 3.12, app
37e0: 65 61 72 20 74 6f 20 72 65 71 75 69 72 65 20 65  ear to require e
37f0: 6c 65 76 61 74 65 64 0d 0a 20 20 20 20 20 20 20  levated..       
3800: 20 23 20 20 20 20 20 20 20 70 72 69 76 69 6c 65   #       privile
3810: 67 65 73 20 28 69 2e 65 2e 20 66 75 6c 6c 20 61  ges (i.e. full a
3820: 64 6d 69 6e 69 73 74 72 61 74 6f 72 29 20 69 6e  dministrator) in
3830: 20 6f 72 64 65 72 20 74 6f 20 73 75 63 63 65 73   order to succes
3840: 73 66 75 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  sfully..        
3850: 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65 20  #       execute 
3860: 5b 75 72 69 20 70 69 6e 67 5d 2e 20 20 54 68 69  [uri ping].  Thi
3870: 73 20 68 61 73 20 62 65 65 6e 20 76 65 72 69 66  s has been verif
3880: 69 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 0d  ied on Windows..
3890: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
38a0: 20 20 20 20 69 66 20 7b 21 5b 69 73 54 65 73 74      if {![isTest
38b0: 41 64 6d 69 6e 69 73 74 72 61 74 6f 72 5d 7d 20  Administrator]} 
38c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
38d0: 20 20 73 65 74 20 72 65 61 73 6f 6e 20 22 73 6b    set reason "sk
38e0: 69 70 70 65 64 2c 20 6e 65 65 64 20 61 64 6d 69  ipped, need admi
38f0: 6e 69 73 74 72 61 74 6f 72 20 70 72 69 76 69 6c  nistrator privil
3900: 65 67 65 73 22 0d 0a 20 20 20 20 20 20 20 20 20  eges"..         
3910: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
3920: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3930: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3940: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 61 67 6c      # NOTE: Eagl
3950: 65 2c 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e, when running 
3960: 6f 6e 20 74 68 65 20 4d 69 63 72 6f 73 6f 66 74  on the Microsoft
3970: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2c   .NET Framework,
3980: 20 73 75 70 70 6f 72 74 73 0d 0a 20 20 20 20 20   supports..     
3990: 20 23 20 20 20 20 20 20 20 70 69 6e 67 69 6e 67   #       pinging
39a0: 20 61 20 6e 65 74 77 6f 72 6b 20 68 6f 73 74 20   a network host 
39b0: 61 73 20 6c 6f 6e 67 20 61 73 20 69 74 20 77 61  as long as it wa
39c0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
39d0: 6e 65 74 77 6f 72 6b 0d 0a 20 20 20 20 20 20 23  network..      #
39e0: 20 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 28         support (
39f0: 77 68 69 63 68 20 74 68 69 73 20 70 72 6f 63 65  which this proce
3a00: 64 75 72 65 20 70 75 72 70 6f 73 65 6c 79 20 64  dure purposely d
3a10: 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 29 2e 20  oes not check). 
3a20: 20 54 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20   That..      #  
3a30: 20 20 20 20 20 69 73 20 64 6f 6e 65 20 75 73 69       is done usi
3a40: 6e 67 20 5b 63 68 65 63 6b 46 6f 72 43 6f 6d 70  ng [checkForComp
3a50: 69 6c 65 4f 70 74 69 6f 6e 5d 2c 20 62 79 20 74  ileOption], by t
3a60: 68 65 20 74 65 73 74 20 70 72 6f 6c 6f 67 75 65  he test prologue
3a70: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3a80: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
3a90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65 74 20     }....    set 
3aa0: 72 65 61 73 6f 6e 20 22 73 6b 69 70 70 65 64 2c  reason "skipped,
3ab0: 20 6e 65 65 64 20 45 61 67 6c 65 22 0d 0a 20 20   need Eagle"..  
3ac0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3ad0: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
3ae0: 6c 65 61 6e 43 6f 6e 73 74 72 61 69 6e 74 4e 61  leanConstraintNa
3af0: 6d 65 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  me { name } {.. 
3b00: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
3b10: 3a 20 53 74 61 72 74 20 77 69 74 68 20 74 68 65  : Start with the
3b20: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 73 74 72   original constr
3b30: 61 69 6e 74 20 6e 61 6d 65 2c 20 72 65 6d 6f 76  aint name, remov
3b40: 69 6e 67 20 73 75 72 72 6f 75 6e 64 69 6e 67 0d  ing surrounding.
3b50: 0a 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69  .    #       whi
3b60: 74 65 73 70 61 63 65 2e 20 20 49 66 20 74 68 69  tespace.  If thi
3b70: 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  s results in an 
3b80: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 77 65  empty string, we
3b90: 20 61 72 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20   are done...    
3ba0: 23 0d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  #..    set resul
3bb0: 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  t [string trim $
3bc0: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 69 66 20  name]....    if 
3bd0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3be0: 24 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74  $result] == 0} t
3bf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74  hen {..      ret
3c00: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
3c10: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
3c20: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 63 6f 6e   # NOTE: The con
3c30: 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 20 74  straints for a t
3c40: 65 73 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79  est are actually
3c50: 20 61 20 6c 69 73 74 3b 20 74 68 65 72 65 66 6f   a list; therefo
3c60: 72 65 2c 20 77 65 0d 0a 20 20 20 20 23 20 20 20  re, we..    #   
3c70: 20 20 20 20 6d 75 73 74 20 72 65 6d 6f 76 65 20      must remove 
3c80: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 6d 69  anything that mi
3c90: 67 68 74 20 63 6f 6e 66 75 73 65 20 74 68 65 20  ght confuse the 
3ca0: 6c 69 73 74 20 70 61 72 73 65 72 2e 0d 0a 20 20  list parser...  
3cb0: 20 20 23 0d 0a 20 20 20 20 73 65 74 20 72 65 73    #..    set res
3cc0: 75 6c 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  ult [string map 
3cd0: 5b 6c 69 73 74 20 5c 22 20 22 22 20 5c 5c 20 22  [list \" "" \\ "
3ce0: 22 20 5c 7b 20 22 22 20 5c 7d 20 22 22 5d 20 24  " \{ "" \} ""] $
3cf0: 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 23  result]....    #
3d00: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e  ..    # NOTE: In
3d10: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
3d20: 73 65 6d 61 6e 74 69 63 20 63 6f 6e 66 75 73 69  semantic confusi
3d30: 6f 6e 2c 20 72 65 6d 6f 76 65 20 6f 74 68 65 72  on, remove other
3d40: 20 63 68 61 72 61 63 74 65 72 73 0d 0a 20 20 20   characters..   
3d50: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6d 61   #       that ma
3d60: 79 20 62 65 20 72 65 73 65 72 76 65 64 20 62 79  y be reserved by
3d70: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
3d80: 73 75 62 73 79 73 74 65 6d 73 2e 0d 0a 20 20 20  subsystems...   
3d90: 20 23 0d 0a 20 20 20 20 73 65 74 20 72 65 73 75   #..    set resu
3da0: 6c 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  lt [string map [
3db0: 6c 69 73 74 20 21 20 22 22 20 23 20 22 22 20 5c  list ! "" # "" \
3dc0: 24 20 22 22 20 5c 3b 20 22 22 20 5c 5b 20 22 22  $ "" \; "" \[ ""
3dd0: 20 5c 5d 20 22 22 5d 20 24 72 65 73 75 6c 74 5d   \] ""] $result]
3de0: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
3df0: 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20   NOTE: Finally, 
3e00: 72 65 6d 6f 76 65 20 61 6c 6c 20 72 65 6d 61 69  remove all remai
3e10: 6e 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 2e  ning whitespace.
3e20: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 72 65 67  ..    #..    reg
3e30: 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 7d  sub -all -- {\s}
3e40: 20 24 72 65 73 75 6c 74 20 22 22 20 72 65 73 75   $result "" resu
3e50: 6c 74 3b 20 72 65 74 75 72 6e 20 24 72 65 73 75  lt; return $resu
3e60: 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  lt..  }.....  pr
3e70: 6f 63 20 63 6c 65 61 6e 50 61 63 6b 61 67 65 4e  oc cleanPackageN
3e80: 61 6d 65 20 7b 20 70 61 63 6b 61 67 65 20 66 75  ame { package fu
3e90: 6c 6c 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  ll } {..    #.. 
3ea0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
3eb0: 20 6f 75 74 20 77 69 74 68 20 74 68 65 20 6f 72   out with the or
3ec0: 69 67 69 6e 61 6c 20 70 61 63 6b 61 67 65 20 6e  iginal package n
3ed0: 61 6d 65 2c 20 72 65 6d 6f 76 69 6e 67 20 73 75  ame, removing su
3ee0: 72 72 6f 75 6e 64 69 6e 67 0d 0a 20 20 20 20 23  rrounding..    #
3ef0: 20 20 20 20 20 20 20 77 68 69 74 65 73 70 61 63         whitespac
3f00: 65 2e 20 20 49 66 20 74 68 69 73 20 72 65 73 75  e.  If this resu
3f10: 6c 74 73 20 69 6e 20 61 6e 20 65 6d 70 74 79 20  lts in an empty 
3f20: 73 74 72 69 6e 67 2c 20 77 65 20 61 72 65 20 64  string, we are d
3f30: 6f 6e 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  one...    #..   
3f40: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72   set result [str
3f50: 69 6e 67 20 74 72 69 6d 20 24 70 61 63 6b 61 67  ing trim $packag
3f60: 65 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73  e]....    if {[s
3f70: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65  tring length $re
3f80: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
3f90: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
3fa0: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
3fb0: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
3fc0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 66 75 6c  NOTE: If the ful
3fd0: 6c 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 20 69  l package name i
3fe0: 73 20 4e 4f 54 20 77 61 6e 74 65 64 2c 20 75 73  s NOT wanted, us
3ff0: 65 20 74 68 65 20 73 68 6f 72 74 20 6e 61 6d 65  e the short name
4000: 2e 20 20 49 74 0d 0a 20 20 20 20 23 20 20 20 20  .  It..    #    
4010: 20 20 20 77 69 6c 6c 20 62 65 20 77 68 61 74 65     will be whate
4020: 76 65 72 20 6f 63 63 75 72 73 20 62 65 66 6f 72  ver occurs befor
4030: 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  e the first comm
4040: 61 2e 20 20 49 66 20 74 68 69 73 20 72 65 73 75  a.  If this resu
4050: 6c 74 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20  lts..    #      
4060: 20 69 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72   in an empty str
4070: 69 6e 67 2c 20 77 65 20 61 72 65 20 64 6f 6e 65  ing, we are done
4080: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ...    #..    if
4090: 20 7b 21 24 66 75 6c 6c 7d 20 74 68 65 6e 20 7b   {!$full} then {
40a0: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
40b0: 6c 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  lt [string trim 
40c0: 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24  [lindex [split $
40d0: 72 65 73 75 6c 74 20 2c 5d 20 30 5d 5d 0d 0a 0d  result ,] 0]]...
40e0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
40f0: 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c  ng length $resul
4100: 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
4110: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4120: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d  $result..      }
4130: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
4140: 0d 0a 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68  ..    # HACK: Th
4150: 69 73 20 69 73 20 74 68 65 20 6c 69 73 74 20 6f  is is the list o
4160: 66 20 22 73 70 65 63 69 61 6c 22 20 63 68 61 72  f "special" char
4170: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20  acters that are 
4180: 64 6f 63 75 6d 65 6e 74 65 64 20 74 6f 0d 0a 20  documented to.. 
4190: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 75 73     #       be us
41a0: 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
41b0: 74 69 6e 67 20 66 75 6c 6c 79 20 71 75 61 6c 69  ting fully quali
41c0: 66 69 65 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  fied .NET Framew
41d0: 6f 72 6b 20 74 79 70 65 0d 0a 20 20 20 20 23 20  ork type..    # 
41e0: 20 20 20 20 20 20 6e 61 6d 65 73 2e 20 20 46 6f        names.  Fo
41f0: 72 20 6e 6f 77 2c 20 74 68 65 79 20 61 72 65 20  r now, they are 
4200: 61 6c 6c 20 72 65 70 6c 61 63 65 64 20 77 69 74  all replaced wit
4210: 68 20 75 6e 64 65 72 73 63 6f 72 65 73 20 62 79  h underscores by
4220: 20 74 68 69 73 0d 0a 20 20 20 20 23 20 20 20 20   this..    #    
4230: 20 20 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41     procedure.  A
4240: 6e 79 20 65 78 69 73 74 69 6e 67 20 75 6e 64 65  ny existing unde
4250: 72 73 63 6f 72 65 73 20 69 6e 20 74 68 65 20 73  rscores in the s
4260: 74 72 69 6e 67 20 61 72 65 20 64 6f 75 62 6c 65  tring are double
4270: 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  d...    #..    s
4280: 65 74 20 63 68 61 72 4d 61 70 20 5b 6c 69 73 74  et charMap [list
4290: 20 5f 20 5f 5f 20 22 20 22 20 5f 20 2b 20 5f 20   _ __ " " _ + _ 
42a0: 2c 20 5f 20 2e 20 5f 20 3d 20 5f 20 5c 5b 20 5f  , _ . _ = _ \[ _
42b0: 20 5c 5c 20 5f 20 5c 5d 20 5f 20 60 20 5f 5d 0d   \\ _ \] _ ` _].
42c0: 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 73  ...    return [s
42d0: 74 72 69 6e 67 20 6d 61 70 20 24 63 68 61 72 4d  tring map $charM
42e0: 61 70 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 7d  ap $result]..  }
42f0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 68 61 76 65  .....  proc have
4300: 54 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74  TclPlatformOsExt
4310: 72 61 55 70 64 61 74 65 4e 61 6d 65 20 7b 20 6e  raUpdateName { n
4320: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20  ame } {..    if 
4330: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
4340: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 45  tcl_platform(osE
4350: 78 74 72 61 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  xtra)]} then {..
4360: 20 20 20 20 20 20 73 65 74 20 75 70 64 61 74 65        set update
4370: 4e 61 6d 65 73 20 5b 67 65 74 44 69 63 74 69 6f  Names [getDictio
4380: 6e 61 72 79 56 61 6c 75 65 20 24 3a 3a 74 63 6c  naryValue $::tcl
4390: 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 45 78 74 72  _platform(osExtr
43a0: 61 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  a) \..          
43b0: 55 70 64 61 74 65 4e 61 6d 65 73 5d 0d 0a 0d 0a  UpdateNames]....
43c0: 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
43d0: 63 68 20 2d 65 78 61 63 74 20 24 75 70 64 61 74  ch -exact $updat
43e0: 65 4e 61 6d 65 73 20 24 6e 61 6d 65 5d 20 21 3d  eNames $name] !=
43f0: 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
4400: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4410: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
4420: 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 66  ....    return f
4430: 61 6c 73 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  alse..  }.....  
4440: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65 73  proc checkForTes
4450: 74 53 75 69 74 65 46 69 6c 65 73 20 7b 20 63 68  tSuiteFiles { ch
4460: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
4470: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
4480: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
4490: 20 74 65 73 74 20 73 75 69 74 65 20 66 69 6c 65   test suite file
44a0: 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d  s... "....    #.
44b0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61  .    # NOTE: Sta
44c0: 72 74 20 6f 75 74 20 77 69 74 68 20 6e 6f 20 74  rt out with no t
44d0: 65 73 74 20 73 75 69 74 65 20 66 69 6c 65 73 20  est suite files 
44e0: 74 6f 20 63 68 65 63 6b 2e 0d 0a 20 20 20 20 23  to check...    #
44f0: 0d 0a 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61  ..    set fileNa
4500: 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  mes [list]....  
4510: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
4520: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 62 61   Check if the ba
4530: 73 65 20 70 61 63 6b 61 67 65 20 70 61 74 68 20  se package path 
4540: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
4550: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69     #..    if {[i
4560: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
4570: 74 5f 70 61 63 6b 61 67 65 5f 70 61 74 68 5d 7d  t_package_path]}
4580: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
4590: 0d 0a 20 20 20 20 20 20 23 20 54 4f 44 4f 3a 20  ..      # TODO: 
45a0: 49 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65  If additional te
45b0: 73 74 20 73 75 69 74 65 20 66 69 6c 65 73 20 61  st suite files a
45c0: 72 65 20 61 64 64 65 64 20 77 69 74 68 69 6e 20  re added within 
45d0: 74 68 65 20 62 61 73 65 0d 0a 20 20 20 20 20 20  the base..      
45e0: 23 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20  #       package 
45f0: 70 61 74 68 2c 20 61 64 64 20 74 68 65 6d 20 68  path, add them h
4600: 65 72 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ere as well...  
4610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72      #..      for
4620: 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
4630: 79 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  y [list \..     
4640: 20 20 20 20 20 61 75 78 69 6c 69 61 72 79 2e 65       auxiliary.e
4650: 61 67 6c 65 20 63 6f 6d 70 61 74 2e 65 61 67 6c  agle compat.eagl
4660: 65 20 63 73 68 61 72 70 2e 65 61 67 6c 65 20 64  e csharp.eagle d
4670: 61 74 61 62 61 73 65 2e 65 61 67 6c 65 20 5c 0d  atabase.eagle \.
4680: 0a 20 20 20 20 20 20 20 20 20 20 65 6d 62 65 64  .          embed
4690: 2e 65 61 67 6c 65 20 65 78 65 63 2e 65 61 67 6c  .eagle exec.eagl
46a0: 65 20 66 69 6c 65 31 2e 65 61 67 6c 65 20 66 69  e file1.eagle fi
46b0: 6c 65 32 2e 65 61 67 6c 65 20 5c 0d 0a 20 20 20  le2.eagle \..   
46c0: 20 20 20 20 20 20 20 66 69 6c 65 33 2e 65 61 67         file3.eag
46d0: 6c 65 20 69 6e 66 6f 2e 65 61 67 6c 65 20 69 6e  le info.eagle in
46e0: 69 74 2e 65 61 67 6c 65 20 6c 69 73 74 2e 65 61  it.eagle list.ea
46f0: 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  gle \..         
4700: 20 6f 62 6a 65 63 74 2e 65 61 67 6c 65 20 70 6b   object.eagle pk
4710: 67 49 6e 64 65 78 2e 65 61 67 6c 65 20 70 6b 67  gIndex.eagle pkg
4720: 49 6e 64 65 78 2e 74 63 6c 20 70 6b 67 74 2e 65  Index.tcl pkgt.e
4730: 61 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  agle \..        
4740: 20 20 70 6c 61 74 66 6f 72 6d 2e 65 61 67 6c 65    platform.eagle
4750: 20 70 72 6f 63 65 73 73 2e 65 61 67 6c 65 20 72   process.eagle r
4760: 75 6e 6f 70 74 2e 65 61 67 6c 65 20 73 61 66 65  unopt.eagle safe
4770: 2e 65 61 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20  .eagle \..      
4780: 20 20 20 20 73 68 65 6c 6c 2e 65 61 67 6c 65 20      shell.eagle 
4790: 73 68 69 6d 2e 65 61 67 6c 65 20 74 65 73 74 2e  shim.eagle test.
47a0: 65 61 67 6c 65 20 74 65 73 74 6c 6f 67 2e 65 61  eagle testlog.ea
47b0: 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  gle \..         
47c0: 20 75 6e 6b 6f 62 6a 2e 65 61 67 6c 65 20 75 6e   unkobj.eagle un
47d0: 7a 69 70 2e 65 61 67 6c 65 20 75 70 64 61 74 65  zip.eagle update
47e0: 2e 65 61 67 6c 65 20 76 65 6e 64 6f 72 2e 65 61  .eagle vendor.ea
47f0: 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  gle \..         
4800: 20 77 6f 72 64 2e 74 63 6c 5d 20 7b 0d 0a 20 20   word.tcl] {..  
4810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4820: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
4830: 63 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  check if the fil
4840: 65 20 72 65 73 69 64 65 73 20 69 6e 20 74 68 65  e resides in the
4850: 20 45 61 67 6c 65 2d 73 70 65 63 69 66 69 63 0d   Eagle-specific.
4860: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4870: 20 70 61 63 6b 61 67 65 20 73 75 62 2d 64 69 72   package sub-dir
4880: 65 63 74 6f 72 79 2e 20 20 46 61 69 6c 69 6e 67  ectory.  Failing
4890: 20 74 68 61 74 2c 20 66 61 6c 6c 62 61 63 6b 20   that, fallback 
48a0: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
48b0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 62 61    #       the ba
48c0: 73 65 20 70 61 63 6b 61 67 65 20 70 61 74 68 20  se package path 
48d0: 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20  itself...       
48e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
48f0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
4900: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
4910: 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 63 6b 61     $::test_packa
4920: 67 65 5f 70 61 74 68 20 45 61 67 6c 65 31 2e 30  ge_path Eagle1.0
4930: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d   $fileNameOnly].
4940: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
4950: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
4960: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
4970: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66  .          set f
4980: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
4990: 69 6e 20 24 3a 3a 74 65 73 74 5f 70 61 63 6b 61  in $::test_packa
49a0: 67 65 5f 70 61 74 68 20 24 66 69 6c 65 4e 61 6d  ge_path $fileNam
49b0: 65 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20  eOnly]..        
49c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
49d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
49e0: 49 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  If the test suit
49f0: 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  e file exists, a
4a00: 64 64 20 69 74 20 74 6f 20 74 68 65 20 6c 69 73  dd it to the lis
4a10: 74 20 6f 66 20 66 69 6c 65 0d 0a 20 20 20 20 20  t of file..     
4a20: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73     #       names
4a30: 20 74 6f 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20   to process...  
4a40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4a50: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
4a60: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
4a70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
4a80: 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65  lappend fileName
4a90: 73 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  s $fileName..   
4aa0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
4ab0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
4ac0: 20 20 23 20 54 4f 44 4f 3a 20 49 66 20 61 64 64    # TODO: If add
4ad0: 69 74 69 6f 6e 61 6c 20 74 65 73 74 20 73 75 69  itional test sui
4ae0: 74 65 20 66 69 6c 65 73 20 61 72 65 20 61 64 64  te files are add
4af0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 65  ed within the te
4b00: 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
4b10: 20 20 70 61 63 6b 61 67 65 20 70 61 74 68 2c 20    package path, 
4b20: 61 64 64 20 74 68 65 6d 20 68 65 72 65 20 61 73  add them here as
4b30: 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 23 0d   well...      #.
4b40: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
4b50: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 6c 69 73  ileNameOnly [lis
4b60: 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 61  t \..          a
4b70: 6c 6c 2e 65 61 67 6c 65 20 63 6f 6e 73 74 72 61  ll.eagle constra
4b80: 69 6e 74 73 2e 65 61 67 6c 65 20 65 70 69 6c 6f  ints.eagle epilo
4b90: 67 75 65 2e 65 61 67 6c 65 20 70 6b 67 49 6e 64  gue.eagle pkgInd
4ba0: 65 78 2e 65 61 67 6c 65 20 5c 0d 0a 20 20 20 20  ex.eagle \..    
4bb0: 20 20 20 20 20 20 70 6b 67 49 6e 64 65 78 2e 74        pkgIndex.t
4bc0: 63 6c 20 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c  cl prologue.eagl
4bd0: 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  e] {..        #.
4be0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4bf0: 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66   First, check if
4c00: 20 74 68 65 20 66 69 6c 65 20 72 65 73 69 64 65   the file reside
4c10: 73 20 69 6e 20 74 68 65 20 45 61 67 6c 65 2d 73  s in the Eagle-s
4c20: 70 65 63 69 66 69 63 0d 0a 20 20 20 20 20 20 20  pecific..       
4c30: 20 23 20 20 20 20 20 20 20 70 61 63 6b 61 67 65   #       package
4c40: 20 73 75 62 2d 64 69 72 65 63 74 6f 72 79 2e 20   sub-directory. 
4c50: 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 66   Failing that, f
4c60: 61 6c 6c 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  allback to using
4c70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4c80: 20 20 74 68 65 20 62 61 73 65 20 70 61 63 6b 61    the base packa
4c90: 67 65 20 70 61 74 68 20 69 74 73 65 6c 66 2e 0d  ge path itself..
4ca0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4cb0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
4cc0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
4cd0: 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 65             $::te
4ce0: 73 74 5f 70 61 63 6b 61 67 65 5f 70 61 74 68 20  st_package_path 
4cf0: 54 65 73 74 31 2e 30 20 24 66 69 6c 65 4e 61 6d  Test1.0 $fileNam
4d00: 65 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  eOnly]....      
4d10: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
4d20: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
4d30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
4d40: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
4d50: 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 74 65 73  file join $::tes
4d60: 74 5f 70 61 63 6b 61 67 65 5f 70 61 74 68 20 24  t_package_path $
4d70: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d 0a 20  fileNameOnly].. 
4d80: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
4d90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4da0: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
4db0: 73 74 20 73 75 69 74 65 20 66 69 6c 65 20 65 78  st suite file ex
4dc0: 69 73 74 73 2c 20 61 64 64 20 69 74 20 74 6f 20  ists, add it to 
4dd0: 74 68 65 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  the list of file
4de0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4df0: 20 20 6e 61 6d 65 73 20 74 6f 20 70 72 6f 63 65    names to proce
4e00: 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss...        #..
4e10: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
4e20: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
4e30: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
4e40: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 66         lappend f
4e50: 69 6c 65 4e 61 6d 65 73 20 24 66 69 6c 65 4e 61  ileNames $fileNa
4e60: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  me..        }.. 
4e70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
4e80: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
4e90: 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
4ea0: 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 70 61   test package pa
4eb0: 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  th is available.
4ec0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
4ed0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
4ee0: 74 65 73 74 5f 70 61 74 68 5d 7d 20 74 68 65 6e  test_path]} then
4ef0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
4f00: 20 20 20 23 20 54 4f 44 4f 3a 20 49 66 20 61 64     # TODO: If ad
4f10: 64 69 74 69 6f 6e 61 6c 20 74 65 73 74 20 73 75  ditional test su
4f20: 69 74 65 20 66 69 6c 65 73 20 61 72 65 20 61 64  ite files are ad
4f30: 64 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 74  ded within the t
4f40: 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  est..      #    
4f50: 20 20 20 73 75 69 74 65 20 70 61 74 68 2c 20 61     suite path, a
4f60: 64 64 20 74 68 65 6d 20 68 65 72 65 20 61 73 20  dd them here as 
4f70: 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  well...      #..
4f80: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
4f90: 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 6c 69 73 74  leNameOnly [list
4fa0: 20 61 6c 6c 2e 65 61 67 6c 65 20 65 70 69 6c 6f   all.eagle epilo
4fb0: 67 75 65 2e 65 61 67 6c 65 20 70 72 6f 6c 6f 67  gue.eagle prolog
4fc0: 75 65 2e 65 61 67 6c 65 5d 20 7b 0d 0a 20 20 20  ue.eagle] {..   
4fd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4fe0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
4ff0: 20 74 68 65 20 66 69 6c 65 20 72 65 73 69 64 65   the file reside
5000: 73 20 69 6e 20 74 68 65 20 74 65 73 74 20 70 61  s in the test pa
5010: 63 6b 61 67 65 20 64 69 72 65 63 74 6f 72 79 2e  ckage directory.
5020: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5030: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5040: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a  e [file join $::
5050: 74 65 73 74 5f 70 61 74 68 20 24 66 69 6c 65 4e  test_path $fileN
5060: 61 6d 65 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20  ameOnly]....    
5070: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5080: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
5090: 73 74 20 73 75 69 74 65 20 66 69 6c 65 20 65 78  st suite file ex
50a0: 69 73 74 73 2c 20 61 64 64 20 69 74 20 74 6f 20  ists, add it to 
50b0: 74 68 65 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  the list of file
50c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
50d0: 20 20 6e 61 6d 65 73 20 74 6f 20 70 72 6f 63 65    names to proce
50e0: 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss...        #..
50f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
5100: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
5110: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5120: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 66         lappend f
5130: 69 6c 65 4e 61 6d 65 73 20 24 66 69 6c 65 4e 61  ileNames $fileNa
5140: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  me..        }.. 
5150: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
5160: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
5170: 54 45 3a 20 44 69 64 20 77 65 20 66 69 6e 64 20  TE: Did we find 
5180: 61 6e 79 20 74 65 73 74 20 73 75 69 74 65 20 66  any test suite f
5190: 69 6c 65 73 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  iles?..    #..  
51a0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
51b0: 66 69 6c 65 4e 61 6d 65 73 5d 20 3e 20 30 7d 20  fileNames] > 0} 
51c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
51d0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
51e0: 61 67 6c 65 20 68 61 73 20 61 20 62 75 69 6c 74  agle has a built
51f0: 2d 69 6e 20 68 61 73 68 69 6e 67 20 63 6f 6d 6d  -in hashing comm
5200: 61 6e 64 3b 20 68 6f 77 65 76 65 72 2c 20 54 63  and; however, Tc
5210: 6c 20 72 65 71 75 69 72 65 73 0d 0a 20 20 20 20  l requires..    
5220: 20 20 23 20 20 20 20 20 20 20 61 20 70 61 63 6b    #       a pack
5230: 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  age.  Make sure 
5240: 77 65 20 63 61 6e 20 68 61 73 68 20 63 6f 6e 74  we can hash cont
5250: 65 6e 74 20 62 65 66 6f 72 65 20 70 72 6f 63 65  ent before proce
5260: 65 64 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  eding...      #.
5270: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61  .      if {[isEa
5280: 67 6c 65 5d 20 7c 7c 20 5b 63 61 74 63 68 20 7b  gle] || [catch {
5290: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
52a0: 73 68 61 31 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  sha1}] == 0} the
52b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
52c0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
52d0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  n....        for
52e0: 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66  each fileName $f
52f0: 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
5300: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67        if {[isEag
5310: 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  le]} then {..   
5320: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5330: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5340: 55 73 65 20 74 68 65 20 72 65 6c 61 74 69 76 65  Use the relative
5350: 6c 79 20 6e 65 77 20 2d 66 69 6c 65 6e 61 6d 65  ly new -filename
5360: 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 45   option to the E
5370: 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  agle..          
5380: 20 20 23 20 20 20 20 20 20 20 5b 68 61 73 68 5d    #       [hash]
5390: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
53a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
53b0: 20 20 20 20 20 20 73 65 74 20 73 68 61 31 20 5b        set sha1 [
53c0: 68 61 73 68 20 6e 6f 72 6d 61 6c 20 2d 66 69 6c  hash normal -fil
53d0: 65 6e 61 6d 65 20 73 68 61 31 20 24 66 69 6c 65  ename sha1 $file
53e0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
53f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5400: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5410: 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a 20        # BUGBUG: 
5420: 41 70 70 61 72 65 6e 74 6c 79 2c 20 74 68 65 20  Apparently, the 
5430: 41 63 74 69 76 65 53 74 61 74 65 20 74 63 6c 6c  ActiveState tcll
5440: 69 62 20 73 68 61 31 20 70 61 63 6b 61 67 65 20  ib sha1 package 
5450: 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  may..           
5460: 20 23 20 20 20 20 20 20 20 20 20 68 61 76 65 20   #         have 
5470: 61 20 62 75 67 20 74 68 61 74 20 70 72 6f 64 75  a bug that produ
5480: 63 65 73 20 74 68 65 20 77 72 6f 6e 67 20 76 61  ces the wrong va
5490: 6c 75 65 73 20 68 65 72 65 2e 20 20 4e 6f 0d 0a  lues here.  No..
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
54b0: 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 69 73        attempt is
54c0: 20 6d 61 64 65 20 68 65 72 65 20 74 6f 20 77 6f   made here to wo
54d0: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 79 20 73 75  rk around any su
54e0: 63 68 20 62 75 67 2e 0d 0a 20 20 20 20 20 20 20  ch bug...       
54f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 46       #         F
5500: 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
5510: 6d 61 74 69 6f 6e 2c 20 70 6c 65 61 73 65 20 73  mation, please s
5520: 65 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ee:..           
5530: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
5540: 23 20 20 20 20 20 20 20 20 20 68 74 74 70 73 3a  #         https:
5550: 2f 2f 63 6f 72 65 2e 74 63 6c 2e 74 6b 2f 74 63  //core.tcl.tk/tc
5560: 6c 6c 69 62 2f 69 6e 66 6f 2f 61 64 32 30 34 35  llib/info/ad2045
5570: 34 30 32 33 0d 0a 20 20 20 20 20 20 20 20 20 20  4023..          
5580: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
5590: 20 73 65 74 20 73 68 61 31 20 5b 73 68 61 31 3a   set sha1 [sha1:
55a0: 3a 73 68 61 31 20 2d 68 65 78 20 2d 66 69 6c 65  :sha1 -hex -file
55b0: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
55c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
55d0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
55e0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
55f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5600: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
5610: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 22   \"" $fileName "
5620: 5c 22 2e 2e 2e 20 73 68 61 31 20 28 22 20 24 73  \"... sha1 (" $s
5630: 68 61 31 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  ha1 ")\n"]..    
5640: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
5650: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5660: 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
5670: 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
5680: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5690: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
56a0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
56b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
56c0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d  el no\n..  }....
56d0: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
56e0: 50 6c 61 74 66 6f 72 6d 20 7b 20 63 68 61 6e 6e  Platform { chann
56f0: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
5700: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
5710: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 70 6c   checking for pl
5720: 61 74 66 6f 72 6d 2e 2e 2e 20 22 0d 0a 0d 0a 20  atform... ".... 
5730: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
5740: 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
5750: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 5d 7d 20 74  rm(platform)]} t
5760: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64  hen {..      add
5770: 43 6f 6e 73 74 72 61 69 6e 74 20 24 3a 3a 74 63  Constraint $::tc
5780: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
5790: 6f 72 6d 29 0d 0a 0d 0a 20 20 20 20 20 20 74 70  orm)....      tp
57a0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
57b0: 70 65 6e 64 41 72 67 73 20 24 3a 3a 74 63 6c 5f  pendArgs $::tcl_
57c0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
57d0: 6d 29 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c  m) \n]..    } el
57e0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  se {..      tput
57f0: 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  s $channel unkno
5800: 77 6e 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  wn\n..    }.... 
5810: 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
5820: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
5860: 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 73 45 61  ..    if {![isEa
5870: 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gle]} then {..  
5880: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 42      #..      # B
5890: 55 47 46 49 58 3a 20 57 65 20 64 6f 20 6e 6f 74  UGFIX: We do not
58a0: 20 6e 6f 72 6d 61 6c 6c 79 20 77 61 6e 74 20 74   normally want t
58b0: 6f 20 73 6b 69 70 20 61 6e 79 20 4d 6f 6e 6f 20  o skip any Mono 
58c0: 62 75 67 73 20 69 6e 20 6e 61 74 69 76 65 20 54  bugs in native T
58d0: 63 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  cl...      #..  
58e0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
58f0: 78 69 73 74 73 20 3a 3a 6e 6f 28 72 75 6e 74 69  xists ::no(runti
5900: 6d 65 56 65 72 73 69 6f 6e 29 5d 7d 20 74 68 65  meVersion)]} the
5910: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  n {..        add
5920: 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61  KnownMonoConstra
5930: 69 6e 74 73 20 74 72 75 65 3b 20 23 20 72 75 6e  ints true; # run
5940: 6e 69 6e 67 20 69 6e 20 6e 61 74 69 76 65 20 54  ning in native T
5950: 63 6c 2e 0d 0a 20 20 20 20 20 20 20 20 61 64 64  cl...        add
5960: 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61  KnownMonoConstra
5970: 69 6e 74 73 20 66 61 6c 73 65 3b 20 23 20 72 75  ints false; # ru
5980: 6e 6e 69 6e 67 20 69 6e 20 6e 61 74 69 76 65 20  nning in native 
5990: 54 63 6c 2e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  Tcl...      }.. 
59a0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
59b0: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 57 69 6e  proc checkForWin
59c0: 64 6f 77 73 56 65 72 73 69 6f 6e 20 7b 20 63 68  dowsVersion { ch
59d0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
59e0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
59f0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
5a00: 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f 6e   Windows version
5a10: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
5a20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20      # NOTE: Are 
5a30: 77 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69  we running on Wi
5a40: 6e 64 6f 77 73 20 61 74 20 61 6c 6c 3f 0d 0a 20  ndows at all?.. 
5a50: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69     #..    if {[i
5a60: 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20  sWindows]} then 
5a70: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
5a80: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
5a90: 20 73 70 65 63 69 66 69 63 20 4f 53 20 6e 61 6d   specific OS nam
5aa0: 65 20 61 6e 64 20 76 65 72 73 69 6f 6e 20 6e 75  e and version nu
5ab0: 6d 62 65 72 20 61 76 61 69 6c 61 62 6c 65 3f 0d  mber available?.
5ac0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5ad0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
5ae0: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
5af0: 6f 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  os)] && \..     
5b00: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
5b10: 67 74 68 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  gth $::tcl_platf
5b20: 6f 72 6d 28 6f 73 29 5d 20 3e 20 30 20 26 26 20  orm(os)] > 0 && 
5b30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e  \..          [in
5b40: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
5b50: 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69  platform(osVersi
5b60: 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  on)] && \..     
5b70: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
5b80: 67 74 68 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  gth $::tcl_platf
5b90: 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d 20  orm(osVersion)] 
5ba0: 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
5bb0: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b      [regexp -- {
5bc0: 5e 5c 64 2b 5c 2e 5c 64 2b 24 7d 20 24 3a 3a 74  ^\d+\.\d+$} $::t
5bd0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
5be0: 72 73 69 6f 6e 29 5d 7d 20 74 68 65 6e 20 7b 0d  rsion)]} then {.
5bf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
5c10: 20 74 68 65 20 72 65 70 6f 72 74 65 64 20 57 69   the reported Wi
5c20: 6e 64 6f 77 73 20 76 65 72 73 69 6f 6e 2e 0d 0a  ndows version...
5c30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5c40: 20 20 20 73 65 74 20 6f 73 56 65 72 73 69 6f 6e     set osVersion
5c50: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
5c60: 28 6f 73 56 65 72 73 69 6f 6e 29 0d 0a 0d 0a 20  (osVersion).... 
5c70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5c80: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 75 62 6c 65    # NOTE: Double
5c90: 20 63 68 65 63 6b 20 74 68 61 74 20 77 65 20 61   check that we a
5ca0: 72 65 20 6e 6f 74 20 62 65 69 6e 67 20 6c 69 65  re not being lie
5cb0: 64 20 74 6f 20 62 79 20 57 69 6e 64 6f 77 73 0d  d to by Windows.
5cc0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5cd0: 20 61 62 6f 75 74 20 69 74 73 20 72 65 61 6c 20   about its real 
5ce0: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d  version number..
5cf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5d00: 20 20 20 20 73 65 74 20 65 78 74 72 61 20 22 22      set extra ""
5d10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5d20: 5b 63 61 6e 45 78 65 63 43 6f 6d 53 70 65 63 5d  [canExecComSpec]
5d30: 20 26 26 20 5b 69 6e 66 6f 20 65 78 69 73 74 73   && [info exists
5d40: 20 3a 3a 65 6e 76 28 43 6f 6d 53 70 65 63 29 5d   ::env(ComSpec)]
5d50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5d60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
5d70: 20 23 20 4e 4f 54 45 3a 20 54 61 6b 65 20 61 64   # NOTE: Take ad
5d80: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 57  vantage of the W
5d90: 69 6e 64 6f 77 73 20 63 6f 6d 6d 61 6e 64 20 70  indows command p
5da0: 72 6f 63 65 73 73 6f 72 20 74 6f 0d 0a 20 20 20  rocessor to..   
5db0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
5dc0: 75 6e 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  un its internal 
5dd0: 56 45 52 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69  VER command, whi
5de0: 63 68 20 61 70 70 65 61 72 73 20 74 6f 20 61 6c  ch appears to al
5df0: 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ways..          
5e00: 23 20 20 20 20 20 20 20 72 65 70 6f 72 74 20 74  #       report t
5e10: 68 65 20 72 65 61 6c 20 57 69 6e 64 6f 77 73 20  he real Windows 
5e20: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d  version number..
5e30: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
5e40: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
5e50: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
5e60: 20 20 65 78 65 63 20 24 3a 3a 65 6e 76 28 43 6f    exec $::env(Co
5e70: 6d 53 70 65 63 29 20 2f 43 20 56 45 52 0d 0a 20  mSpec) /C VER.. 
5e80: 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 53 70           } comSp
5e90: 65 63 56 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20  ecVersion] == 0 
5ea0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
5eb0: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b      [regexp -- {
5ec0: 56 65 72 73 69 6f 6e 20 28 5c 64 2b 5c 2e 5c 64  Version (\d+\.\d
5ed0: 2b 29 7d 20 24 63 6f 6d 53 70 65 63 56 65 72 73  +)} $comSpecVers
5ee0: 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
5ef0: 20 20 20 20 20 64 75 6d 6d 79 20 63 6f 6d 53 70       dummy comSp
5f00: 65 63 56 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e  ecVersion]} then
5f10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5f20: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
5f30: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 76 61   NOTE: If the va
5f40: 6c 75 65 20 72 65 70 6f 72 74 65 64 20 74 6f 20  lue reported to 
5f50: 74 68 65 20 70 72 6f 63 65 73 73 20 64 6f 65 73  the process does
5f60: 20 6e 6f 74 20 6d 61 74 63 68 0d 0a 20 20 20 20   not match..    
5f70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5f80: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
5f90: 65 64 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64  ed from the Wind
5fa0: 6f 77 73 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 63  ows command proc
5fb0: 65 73 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20 20  essor,..        
5fc0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6c      #       repl
5fd0: 61 63 65 20 69 74 2e 20 20 57 65 20 6d 75 73 74  ace it.  We must
5fe0: 20 6b 6e 6f 77 20 74 68 65 20 72 65 61 6c 20 57   know the real W
5ff0: 69 6e 64 6f 77 73 20 76 65 72 73 69 6f 6e 2e 0d  indows version..
6000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
6010: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
6020: 24 6f 73 56 65 72 73 69 6f 6e 20 65 71 20 24 63  $osVersion eq $c
6030: 6f 6d 53 70 65 63 56 65 72 73 69 6f 6e 7d 20 74  omSpecVersion} t
6040: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6050: 20 20 20 20 20 73 65 74 20 65 78 74 72 61 20 22       set extra "
6060: 2d 2d 2d 2d 20 72 65 70 6f 72 74 65 64 20 61 6e  ---- reported an
6070: 64 20 64 65 74 65 63 74 65 64 20 57 69 6e 64 6f  d detected Windo
6080: 77 73 20 76 65 72 73 69 6f 6e 73 20 6d 61 74 63  ws versions matc
6090: 68 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  h\n"..          
60a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
60b0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65 78            set ex
60c0: 74 72 61 20 5b 61 70 70 65 6e 64 41 72 67 73 20  tra [appendArgs 
60d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
60e0: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
60f0: 4e 47 3a 20 72 65 70 6f 72 74 65 64 20 61 6e 64  NG: reported and
6100: 20 64 65 74 65 63 74 65 64 20 57 69 6e 64 6f 77   detected Window
6110: 73 20 76 65 72 73 69 6f 6e 73 20 22 20 5c 0d 0a  s versions " \..
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 22 64 6f 20 6e 6f 74 20 6d 61 74 63 68 3a    "do not match:
6140: 20 22 20 24 6f 73 56 65 72 73 69 6f 6e 20 22 20   " $osVersion " 
6150: 76 65 72 73 75 73 20 22 20 24 63 6f 6d 53 70 65  versus " $comSpe
6160: 63 56 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20  cVersion \..    
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
6180: 20 72 65 73 65 74 74 69 6e 67 2e 2e 2e 5c 6e 22   resetting...\n"
6190: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
61a0: 20 20 20 73 65 74 20 6f 73 56 65 72 73 69 6f 6e     set osVersion
61b0: 20 24 63 6f 6d 53 70 65 63 56 65 72 73 69 6f 6e   $comSpecVersion
61c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
61d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
61e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
61f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6200: 4e 4f 54 45 3a 20 53 74 61 72 74 20 6f 75 74 20  NOTE: Start out 
6210: 77 69 74 68 20 74 68 65 20 4f 53 20 6e 61 6d 65  with the OS name
6220: 2c 20 72 65 6d 6f 76 69 6e 67 20 61 6c 6c 20 73  , removing all s
6230: 70 61 63 65 73 20 61 6e 64 20 74 68 65 6e 0d 0a  paces and then..
6240: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6250: 61 70 70 65 6e 64 20 74 68 65 20 72 65 70 6f 72  append the repor
6260: 74 65 64 20 28 6f 72 20 64 65 74 65 63 74 65 64  ted (or detected
6270: 29 20 4f 53 20 76 65 72 73 69 6f 6e 20 6e 75 6d  ) OS version num
6280: 62 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ber...        #.
6290: 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72  .        set ver
62a0: 73 69 6f 6e 20 5b 61 70 70 65 6e 64 41 72 67 73  sion [appendArgs
62b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
62c0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
62d0: 74 20 22 20 22 20 22 22 5d 20 24 3a 3a 74 63 6c  t " " ""] $::tcl
62e0: 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 5d 20 5f  _platform(os)] _
62f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6300: 24 6f 73 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20  $osVersion].... 
6310: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6320: 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 63 6f    # NOTE: Add co
6330: 6e 73 74 72 61 69 6e 74 20 63 6f 6e 74 61 69 6e  nstraint contain
6340: 69 6e 67 20 74 68 65 20 4f 53 20 6e 61 6d 65 20  ing the OS name 
6350: 61 6e 64 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  and version numb
6360: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
6370: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
6380: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
6390: 73 20 6f 73 56 65 72 73 69 6f 6e 2e 20 24 76 65  s osVersion. $ve
63a0: 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  rsion]....      
63b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
63c0: 4f 54 45 3a 20 53 68 6f 77 20 77 68 61 74 20 77  OTE: Show what w
63d0: 65 20 66 6f 75 6e 64 20 66 6f 72 20 74 68 65 20  e found for the 
63e0: 4f 53 20 6e 61 6d 65 20 61 6e 64 20 76 65 72 73  OS name and vers
63f0: 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d 0a 20 20 20  ion number...   
6400: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6410: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
6420: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
6430: 20 20 20 20 20 20 20 20 20 20 22 79 65 73 20 28            "yes (
6440: 22 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  " $::tcl_platfor
6450: 6d 28 6f 73 29 20 22 20 76 22 20 24 6f 73 56 65  m(os) " v" $osVe
6460: 72 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  rsion ")\n"]....
6470: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6480: 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 67 20 61     # NOTE: Log a
6490: 6e 79 20 65 78 74 72 61 20 6d 65 73 73 61 67 65  ny extra message
64a0: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
64b0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
64c0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
64d0: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
64e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
64f0: 73 20 24 63 68 61 6e 6e 65 6c 20 24 65 78 74 72  s $channel $extr
6500: 61 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  a..        }....
6510: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6520: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
6530: 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
6540: 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
6550: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6560: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  urn..      }..  
6570: 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73    }....    tputs
6580: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
6590: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
65a0: 68 65 63 6b 46 6f 72 4f 70 65 72 61 74 69 6e 67  heckForOperating
65b0: 53 79 73 74 65 6d 55 70 64 61 74 65 20 7b 20 63  SystemUpdate { c
65c0: 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
65d0: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
65e0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
65f0: 5c 0d 0a 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  \..        "----
6600: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6f 70   checking for op
6610: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75  erating system u
6620: 70 64 61 74 65 20 5c 22 22 20 5c 0d 0a 20 20 20  pdate \"" \..   
6630: 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e       $name "\"..
6640: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20  . "]....    #.. 
6650: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
6660: 65 20 73 70 65 63 69 66 69 63 20 4f 53 20 75 70  e specific OS up
6670: 64 61 74 65 20 63 75 72 72 65 6e 74 6c 79 20 69  date currently i
6680: 6e 73 74 61 6c 6c 65 64 3f 0d 0a 20 20 20 20 23  nstalled?..    #
6690: 0d 0a 20 20 20 20 69 66 20 7b 5b 68 61 76 65 54  ..    if {[haveT
66a0: 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74 72  clPlatformOsExtr
66b0: 61 55 70 64 61 74 65 4e 61 6d 65 20 24 6e 61 6d  aUpdateName $nam
66c0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
66d0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
66e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 6f 73 55 70  [appendArgs osUp
66f0: 64 61 74 65 20 2e 20 5b 63 6c 65 61 6e 43 6f 6e  date . [cleanCon
6700: 73 74 72 61 69 6e 74 4e 61 6d 65 20 24 6e 61 6d  straintName $nam
6710: 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  e]]....      tpu
6720: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
6730: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
6740: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
6750: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
6760: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
6770: 63 20 63 68 65 63 6b 46 6f 72 53 63 72 69 70 74  c checkForScript
6780: 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65  Library { channe
6790: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
67a0: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
67b0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 63 72  checking for scr
67c0: 69 70 74 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22  ipt library... "
67d0: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
67e0: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
67f0: 65 20 76 61 72 69 61 62 6c 65 20 63 6f 6e 74 61  e variable conta
6800: 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ining the script
6810: 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 69 6f   library locatio
6820: 6e 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 65  n..    #       e
6830: 78 69 73 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  xists...    #.. 
6840: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
6850: 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  sts ::tcl_librar
6860: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
6870: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
6880: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20  $::tcl_library] 
6890: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
68a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
68b0: 54 45 3a 20 4e 6f 77 20 73 65 65 20 69 66 20 74  TE: Now see if t
68c0: 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  he script librar
68d0: 79 20 69 73 20 65 78 74 65 72 6e 61 6c 20 6f 72  y is external or
68e0: 20 65 6d 62 65 64 64 65 64 2e 0d 0a 20 20 20 20   embedded...    
68f0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
6900: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
6910: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
6920: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6930: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6940: 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70  OTE: Yes, it app
6950: 65 61 72 73 20 74 6f 20 62 65 20 61 20 64 69 72  ears to be a dir
6960: 65 63 74 6f 72 79 20 6e 61 6d 65 2c 20 77 68 69  ectory name, whi
6970: 63 68 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20  ch should..     
6980: 20 20 20 23 20 20 20 20 20 20 20 6d 65 61 6e 20     #       mean 
6990: 74 68 61 74 20 74 68 65 20 6e 65 63 65 73 73 61  that the necessa
69a0: 72 79 20 66 69 6c 65 73 20 61 72 65 20 70 68 79  ry files are phy
69b0: 73 69 63 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  sically containe
69c0: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
69d0: 20 20 20 77 69 74 68 69 6e 20 69 74 2e 0d 0a 20     within it... 
69e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
69f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6a00: 74 63 6c 5f 6c 69 62 72 61 72 79 5f 65 78 74 65  tcl_library_exte
6a10: 72 6e 61 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rnal....        
6a20: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
6a30: 79 65 73 20 28 65 78 74 65 72 6e 61 6c 29 5c 6e  yes (external)\n
6a40: 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  "....        #..
6a50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6a60: 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65  We are done here
6a70: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20  , return now... 
6a80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6a90: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
6aa0: 7d 20 65 6c 73 65 69 66 20 7b 5b 66 69 6c 65 20  } elseif {[file 
6ab0: 69 73 66 69 6c 65 20 24 3a 3a 74 63 6c 5f 6c 69  isfile $::tcl_li
6ac0: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
6ad0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6ae0: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
6af0: 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  it appears to be
6b00: 20 61 20 66 69 6c 65 20 6e 61 6d 65 2c 20 77 68   a file name, wh
6b10: 69 63 68 20 73 68 6f 75 6c 64 20 6d 65 61 6e 0d  ich should mean.
6b20: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6b30: 20 74 68 61 74 20 74 68 65 20 6e 65 63 65 73 73   that the necess
6b40: 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 70 68  ary files are ph
6b50: 79 73 69 63 61 6c 6c 79 20 65 6d 62 65 64 64 65  ysically embedde
6b60: 64 20 77 69 74 68 69 6e 0d 0a 20 20 20 20 20 20  d within..      
6b70: 20 20 23 20 20 20 20 20 20 20 69 74 2e 0d 0a 20    #       it... 
6b80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6b90: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6ba0: 74 63 6c 5f 6c 69 62 72 61 72 79 5f 65 6d 62 65  tcl_library_embe
6bb0: 64 64 65 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dded....        
6bc0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
6bd0: 79 65 73 20 28 65 6d 62 65 64 64 65 64 29 5c 6e  yes (embedded)\n
6be0: 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  "....        #..
6bf0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6c00: 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65  We are done here
6c10: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20  , return now... 
6c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6c30: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
6c40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
6c50: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
6c60: 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  o\n..  }.....  p
6c70: 72 6f 63 20 63 68 65 63 6b 46 6f 72 56 61 72 69  roc checkForVari
6c80: 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  able { channel n
6c90: 61 6d 65 20 7b 6e 6f 74 45 6d 70 74 79 20 74 72  ame {notEmpty tr
6ca0: 75 65 7d 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20  ue} {constraint 
6cb0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  ""} } {..    tpu
6cc0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
6cd0: 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
6ce0: 65 63 6b 69 6e 67 20 66 6f 72 20 76 61 72 69 61  ecking for varia
6cf0: 62 6c 65 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d  ble \"" $name \.
6d00: 0a 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20  .        "\"... 
6d10: 22 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  "]....    #..   
6d20: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
6d30: 6e 6f 72 6d 61 6c 69 7a 65 20 74 68 65 20 76 61  normalize the va
6d40: 72 69 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 62  riable name to b
6d50: 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20  e in the global 
6d60: 73 63 6f 70 65 2e 0d 0a 20 20 20 20 23 0d 0a 20  scope...    #.. 
6d70: 20 20 20 73 65 74 20 6e 65 77 4e 61 6d 65 20 5b     set newName [
6d80: 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 5b 73  appendArgs :: [s
6d90: 74 72 69 6e 67 20 74 72 69 6d 6c 65 66 74 20 24  tring trimleft $
6da0: 6e 61 6d 65 20 3a 5d 5d 0d 0a 0d 0a 20 20 20 20  name :]]....    
6db0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e  #..    # NOTE: N
6dc0: 65 78 74 2c 20 61 6c 77 61 79 73 20 63 68 65 63  ext, always chec
6dd0: 6b 20 69 66 20 69 74 20 61 63 74 75 61 6c 6c 79  k if it actually
6de0: 20 65 78 69 73 74 73 20 28 61 73 20 6f 66 20 72   exists (as of r
6df0: 69 67 68 74 20 6e 6f 77 29 2e 0d 0a 20 20 20 20  ight now)...    
6e00: 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  #..    if {[info
6e10: 20 65 78 69 73 74 73 20 24 6e 65 77 4e 61 6d 65   exists $newName
6e20: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
6e30: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6e40: 3a 20 4e 65 78 74 2c 20 6f 70 74 69 6f 6e 61 6c  : Next, optional
6e50: 6c 79 20 63 68 65 63 6b 20 69 66 20 69 74 20 63  ly check if it c
6e60: 6f 6e 73 74 61 69 6e 73 20 61 6e 79 74 68 69 6e  onstains anythin
6e70: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
6e80: 20 20 20 69 66 20 7b 21 24 6e 6f 74 45 6d 70 74     if {!$notEmpt
6e90: 79 20 7c 7c 20 5b 73 74 72 69 6e 67 20 6c 65 6e  y || [string len
6ea0: 67 74 68 20 5b 73 65 74 20 24 6e 65 77 4e 61 6d  gth [set $newNam
6eb0: 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  e]] > 0} then {.
6ec0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6ed0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
6ee0: 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 73 20  variable exists 
6ef0: 61 6e 64 20 69 74 20 65 69 74 68 65 72 20 63 6f  and it either co
6f00: 6e 74 61 69 6e 73 20 73 6f 6d 65 74 68 69 6e 67  ntains something
6f10: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6f20: 20 20 6f 72 20 77 65 20 64 6f 20 6e 6f 74 20 63    or we do not c
6f30: 61 72 65 20 61 62 6f 75 74 20 69 74 73 20 63 6f  are about its co
6f40: 6e 74 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ntents...       
6f50: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
6f60: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6f70: 63 6f 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d  constraint] > 0}
6f80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6f90: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
6fa0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 76 61 72   [appendArgs var
6fb0: 69 61 62 6c 65 5f 20 24 63 6f 6e 73 74 72 61 69  iable_ $constrai
6fc0: 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  nt]..        } e
6fd0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
6fe0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
6ff0: 61 70 70 65 6e 64 41 72 67 73 20 76 61 72 69 61  appendArgs varia
7000: 62 6c 65 5f 20 5b 73 74 72 69 6e 67 20 74 72 69  ble_ [string tri
7010: 6d 6c 65 66 74 20 24 6e 65 77 4e 61 6d 65 20 3a  mleft $newName :
7020: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
7030: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7040: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
7050: 20 74 68 61 74 20 77 65 20 66 6f 75 6e 64 20 74   that we found t
7060: 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  he variable and 
7070: 77 68 65 74 68 65 72 20 69 74 20 61 63 74 75 61  whether it actua
7080: 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lly..        #  
7090: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 61       contained a
70a0: 6e 79 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nything...      
70b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
70c0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
70d0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
70e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
70f0: 65 78 70 72 20 7b 24 6e 6f 74 45 6d 70 74 79 20  expr {$notEmpty 
7100: 3f 20 22 65 78 69 73 74 73 2c 20 6e 6f 74 20 65  ? "exists, not e
7110: 6d 70 74 79 22 20 3a 20 22 65 78 69 73 74 73 22  mpty" : "exists"
7120: 7d 5d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  }] ")\n"]....   
7130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7140: 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  # NOTE: We are d
7150: 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e  one here, return
7160: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
7170: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7180: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
7190: 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63  ....    tputs $c
71a0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d  hannel no\n..  }
71b0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
71c0: 6b 46 6f 72 54 63 6c 4f 70 74 69 6f 6e 73 20 7b  kForTclOptions {
71d0: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
71e0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
71f0: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
7200: 66 6f 72 20 54 63 6c 20 6f 70 74 69 6f 6e 73 2e  for Tcl options.
7210: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  .. "....    if {
7220: 21 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e  ![isEagle]} then
7230: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
7240: 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
7250: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7260: 4e 4f 54 45 3a 20 54 68 69 73 20 74 65 73 74 20  NOTE: This test 
7270: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 65  constraint is ne
7280: 65 64 65 64 20 62 79 20 74 65 73 74 20 22 62 65  eded by test "be
7290: 6e 63 68 6d 61 72 6b 2d 31 2e 32 32 22 2e 0d 0a  nchmark-1.22"...
72a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
72b0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
72c0: 20 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 4e 61 74   ::no(compileNat
72d0: 69 76 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ive)]} then {.. 
72e0: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
72f0: 65 73 75 6c 74 20 63 6f 6d 70 69 6c 65 2e 4e 41  esult compile.NA
7300: 54 49 56 45 0d 0a 20 20 20 20 20 20 20 20 61 64  TIVE..        ad
7310: 64 43 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70  dConstraint comp
7320: 69 6c 65 2e 4e 41 54 49 56 45 0d 0a 20 20 20 20  ile.NATIVE..    
7330: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
7340: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
7350: 69 73 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  is test constrai
7360: 6e 74 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  nt is needed by 
7370: 74 65 73 74 20 22 62 65 6e 63 68 6d 61 72 6b 2d  test "benchmark-
7380: 31 2e 32 32 22 2e 0d 0a 20 20 20 20 20 20 23 0d  1.22"...      #.
7390: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
73a0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
73b0: 6d 70 69 6c 65 57 69 6e 64 6f 77 73 29 5d 7d 20  mpileWindows)]} 
73c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
73d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
73e0: 45 3a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  E: If the curren
73f0: 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 57 69  t platform is Wi
7400: 6e 64 6f 77 73 20 74 68 65 20 54 63 6c 20 62 69  ndows the Tcl bi
7410: 6e 61 72 79 20 6d 75 73 74 20 68 61 76 65 0d 0a  nary must have..
7420: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7430: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 66 6f  been compiled fo
7440: 72 20 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20 20  r Windows...    
7450: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
7460: 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  f {[isWindows]} 
7470: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7480: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
7490: 20 63 6f 6d 70 69 6c 65 2e 57 49 4e 44 4f 57 53   compile.WINDOWS
74a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
74b0: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70 69 6c  onstraint compil
74c0: 65 2e 57 49 4e 44 4f 57 53 0d 0a 20 20 20 20 20  e.WINDOWS..     
74d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
74e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
74f0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 74 65 73  # NOTE: This tes
7500: 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
7510: 6e 65 65 64 65 64 20 62 79 20 74 65 73 74 73 20  needed by tests 
7520: 22 73 6f 63 6b 65 74 2d 2a 2e 2a 22 2e 0d 0a 20  "socket-*.*"... 
7530: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7540: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
7550: 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 4e 65 74 77  ::no(compileNetw
7560: 6f 72 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ork)]} then {.. 
7570: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
7580: 65 73 75 6c 74 20 63 6f 6d 70 69 6c 65 2e 4e 45  esult compile.NE
7590: 54 57 4f 52 4b 0d 0a 20 20 20 20 20 20 20 20 61  TWORK..        a
75a0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d  ddConstraint com
75b0: 70 69 6c 65 2e 4e 45 54 57 4f 52 4b 0d 0a 20 20  pile.NETWORK..  
75c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
75d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
75e0: 4a 75 73 74 20 66 61 6b 65 20 74 68 65 20 69 6e  Just fake the in
75f0: 76 61 72 69 61 6e 74 20 63 75 6c 74 75 72 65 20  variant culture 
7600: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  when running in 
7610: 6e 61 74 69 76 65 20 54 63 6c 2e 0d 0a 20 20 20  native Tcl...   
7620: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
7630: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
7640: 6e 6f 28 63 75 6c 74 75 72 65 29 5d 7d 20 74 68  no(culture)]} th
7650: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  en {..        la
7660: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 63 75 6c  ppend result cul
7670: 74 75 72 65 2e 69 6e 76 61 72 69 61 6e 74 0d 0a  ture.invariant..
7680: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
7690: 72 61 69 6e 74 20 63 75 6c 74 75 72 65 2e 69 6e  raint culture.in
76a0: 76 61 72 69 61 6e 74 0d 0a 20 20 20 20 20 20 7d  variant..      }
76b0: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
76c0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
76d0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 72 65  Args "yes (" $re
76e0: 73 75 6c 74 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  sult ")\n"]..   
76f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7700: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
7710: 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  no\n..    }..  }
7720: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
7730: 6b 46 6f 72 57 69 6e 64 6f 77 73 43 6f 6d 6d 61  kForWindowsComma
7740: 6e 64 50 72 6f 63 65 73 73 6f 72 20 7b 20 63 68  ndProcessor { ch
7750: 61 6e 6e 65 6c 20 70 61 74 74 65 72 6e 20 7b 63  annel pattern {c
7760: 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7d 20  onstraint ""} } 
7770: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
7780: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
7790: 6b 69 6e 67 20 66 6f 72 20 57 69 6e 64 6f 77 73  king for Windows
77a0: 20 43 6f 6d 6d 61 6e 64 20 50 72 6f 63 65 73 73   Command Process
77b0: 6f 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69  or... "....    i
77c0: 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  f {[isWindows]} 
77d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
77e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47  .      # NOTE: G
77f0: 72 61 62 20 74 68 65 20 22 43 6f 6d 53 70 65 63  rab the "ComSpec
7800: 22 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  " from the Windo
7810: 77 73 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61  ws environment a
7820: 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74 0d  nd make sure it.
7830: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
7840: 61 74 63 68 65 73 20 74 68 65 20 66 69 6c 65 20  atches the file 
7850: 70 61 74 74 65 72 6e 20 73 75 70 70 6c 69 65 64  pattern supplied
7860: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28   by the caller (
7870: 65 2e 67 2e 20 22 63 6d 64 2e 65 78 65 22 29 2e  e.g. "cmd.exe").
7880: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7890: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
78a0: 73 20 3a 3a 65 6e 76 28 43 6f 6d 53 70 65 63 29  s ::env(ComSpec)
78b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
78c0: 20 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20    [string match 
78d0: 2d 6e 6f 63 61 73 65 20 24 70 61 74 74 65 72 6e  -nocase $pattern
78e0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 65   [file tail $::e
78f0: 6e 76 28 43 6f 6d 53 70 65 63 29 5d 5d 7d 20 74  nv(ComSpec)]]} t
7900: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7910: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7920: 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  : We are running
7930: 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
7940: 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 63 65 73 73   command process
7950: 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  or...        #..
7960: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
7970: 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73  ing length $cons
7980: 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20 74 68 65  traint] > 0} the
7990: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61  n {..          a
79a0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
79b0: 70 65 6e 64 41 72 67 73 20 63 6f 6d 53 70 65 63  pendArgs comSpec
79c0: 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 0d 0a  _ $constraint]..
79d0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
79e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
79f0: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
7a00: 64 41 72 67 73 20 63 6f 6d 53 70 65 63 5f 20 5c  dArgs comSpec_ \
7a10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7a20: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
7a30: 74 20 2a 20 5f 20 2d 20 5f 20 3f 20 5f 20 5c 5b  t * _ - _ ? _ \[
7a40: 20 5f 20 5c 5c 20 5f 20 5c 5d 20 5f 5d 20 24 70   _ \\ _ \] _] $p
7a50: 61 74 74 65 72 6e 5d 5d 0d 0a 20 20 20 20 20 20  attern]]..      
7a60: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74    }....        t
7a70: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
7a80: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
7a90: 5c 22 22 20 24 3a 3a 65 6e 76 28 43 6f 6d 53 70  \"" $::env(ComSp
7aa0: 65 63 29 20 22 5c 22 29 5c 6e 22 5d 0d 0a 0d 0a  ec) "\")\n"]....
7ab0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7ac0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
7ad0: 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
7ae0: 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
7af0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
7b00: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  urn..      }..  
7b10: 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73    }....    tputs
7b20: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
7b30: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
7b40: 68 65 63 6b 46 6f 72 50 61 63 6b 61 67 65 20 7b  heckForPackage {
7b50: 20 63 68 61 6e 6e 65 6c 20 70 61 74 74 65 72 6e   channel pattern
7b60: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
7b70: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
7b80: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
7b90: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
7ba0: 6f 72 20 6c 6f 61 64 65 64 20 70 61 63 6b 61 67  or loaded packag
7bb0: 65 20 6d 61 74 63 68 69 6e 67 20 5c 22 22 20 5c  e matching \"" \
7bc0: 0d 0a 20 20 20 20 20 20 20 20 24 70 61 74 74 65  ..        $patte
7bd0: 72 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  rn "\"... "]....
7be0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7bf0: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
7c00: 6c 6f 61 64 65 64 20 5b 69 6e 66 6f 20 6c 6f 61  loaded [info loa
7c10: 64 65 64 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ded] {..        
7c20: 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24  if {[regexp -- $
7c30: 70 61 74 74 65 72 6e 20 5b 6c 69 6e 64 65 78 20  pattern [lindex 
7c40: 24 6c 6f 61 64 65 64 20 65 6e 64 5d 5d 7d 20 74  $loaded end]]} t
7c50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7c60: 20 73 65 74 20 70 61 63 6b 61 67 65 20 5b 6c 69   set package [li
7c70: 6e 64 65 78 20 24 6c 6f 61 64 65 64 20 31 5d 3b  ndex $loaded 1];
7c80: 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20   break..        
7c90: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
7ca0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
7cb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7cc0: 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
7cd0: 65 20 74 68 61 74 20 61 20 6d 61 74 63 68 69 6e  e that a matchin
7ce0: 67 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 20 77  g package name w
7cf0: 61 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  as found...     
7d00: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
7d10: 6e 66 6f 20 65 78 69 73 74 73 20 70 61 63 6b 61  nfo exists packa
7d20: 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ge]} then {..   
7d30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7d40: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
7d50: 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
7d60: 69 73 20 6c 6f 61 64 65 64 2e 0d 0a 20 20 20 20  is loaded...    
7d70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
7d80: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
7d90: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7da0: 20 20 20 20 20 20 20 20 6c 6f 61 64 65 64 2e 6e          loaded.n
7db0: 61 6d 65 2e 20 5b 63 6c 65 61 6e 50 61 63 6b 61  ame. [cleanPacka
7dc0: 67 65 4e 61 6d 65 20 24 70 61 63 6b 61 67 65 20  geName $package 
7dd0: 66 61 6c 73 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  false]]....     
7de0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
7df0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 61 64              load
7e10: 65 64 2e 66 75 6c 6c 4e 61 6d 65 2e 20 5b 63 6c  ed.fullName. [cl
7e20: 65 61 6e 50 61 63 6b 61 67 65 4e 61 6d 65 20 24  eanPackageName $
7e30: 70 61 63 6b 61 67 65 20 74 72 75 65 5d 5d 0d 0a  package true]]..
7e40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7e50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
7e60: 77 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 63  w that the sub-c
7e70: 6f 6d 6d 61 6e 64 20 77 61 73 20 66 6f 75 6e 64  ommand was found
7e80: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7e90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
7ea0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
7eb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7ec0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
7ed0: 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72  done here, retur
7ee0: 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  n now...        
7ef0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7f00: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
7f10: 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24  }....    tputs $
7f20: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
7f30: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
7f40: 63 6b 46 6f 72 46 6f 73 73 69 6c 20 7b 20 63 68  ckForFossil { ch
7f50: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
7f60: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
7f70: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
7f80: 20 46 6f 73 73 69 6c 2e 2e 2e 20 22 0d 0a 0d 0a   Fossil... "....
7f90: 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63      if {[canExec
7fa0: 46 6f 73 73 69 6c 5d 20 26 26 20 5c 0d 0a 20 20  Fossil] && \..  
7fb0: 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 65 78        [catch {ex
7fc0: 65 63 20 2d 2d 20 66 6f 73 73 69 6c 20 76 65 72  ec -- fossil ver
7fd0: 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d  sion} version] =
7fe0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
7ff0: 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b     set version [
8000: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 76 65 72  string trim $ver
8010: 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 73  sion]....      s
8020: 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 54 68 69  et pattern {^Thi
8030: 73 20 69 73 20 66 6f 73 73 69 6c 20 76 65 72 73  s is fossil vers
8040: 69 6f 6e 20 28 2e 2a 29 20 5c 5b 28 5b 30 2d 39  ion (.*) \[([0-9
8050: 61 2d 66 5d 2b 29 5c 5d 5c 0d 0a 20 20 20 20 20  a-f]+)\]\..     
8060: 20 20 20 20 20 5c 64 7b 34 7d 2d 5c 64 7b 32 7d       \d{4}-\d{2}
8070: 2d 5c 64 7b 32 7d 20 5c 64 7b 32 7d 3a 5c 64 7b  -\d{2} \d{2}:\d{
8080: 32 7d 3a 5c 64 7b 32 7d 20 55 54 43 24 7d 0d 0a  2}:\d{2} UTC$}..
8090: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67  ..      if {[reg
80a0: 65 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  exp -- $pattern 
80b0: 24 76 65 72 73 69 6f 6e 20 64 75 6d 6d 79 20 76  $version dummy v
80c0: 65 72 73 69 6f 6e 20 73 6f 75 72 63 65 49 64 5d  ersion sourceId]
80d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
80e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
80f0: 4f 54 45 3a 20 41 64 64 20 61 20 63 6f 6e 73 74  OTE: Add a const
8100: 72 61 69 6e 74 20 74 6f 20 73 68 6f 77 20 74 68  raint to show th
8110: 61 74 20 74 68 65 20 46 6f 73 73 69 6c 20 65 78  at the Fossil ex
8120: 65 63 75 74 61 62 6c 65 0d 0a 20 20 20 20 20 20  ecutable..      
8130: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
8140: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
8150: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8160: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
8170: 20 66 6f 73 73 69 6c 5f 76 65 72 73 69 6f 6e 0d   fossil_version.
8180: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8190: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70        # NOTE: Ap
81a0: 70 65 6e 64 20 74 68 65 20 76 65 72 73 69 6f 6e  pend the version
81b0: 20 6f 66 20 46 6f 73 73 69 6c 20 63 75 72 72 65   of Fossil curre
81c0: 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0d 0a 20 20  ntly in use...  
81d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
81e0: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 76   append result v
81f0: 65 72 73 69 6f 6e 20 22 20 22 20 24 76 65 72 73  ersion " " $vers
8200: 69 6f 6e 20 22 20 5c 5b 22 20 24 73 6f 75 72 63  ion " \[" $sourc
8210: 65 49 64 20 5c 5d 0d 0a 0d 0a 20 20 20 20 20 20  eId \]....      
8220: 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63 46 6f    if {[canExecFo
8230: 73 73 69 6c 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ssil] && \..    
8240: 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
8250: 65 78 65 63 20 2d 2d 20 66 6f 73 73 69 6c 20 72  exec -- fossil r
8260: 65 6d 6f 74 65 2d 75 72 6c 7d 20 72 65 6d 6f 74  emote-url} remot
8270: 65 55 72 6c 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  eUrl] == 0} then
8280: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
8290: 74 20 72 65 6d 6f 74 65 55 72 6c 20 5b 73 74 72  t remoteUrl [str
82a0: 69 6e 67 20 74 72 69 6d 20 24 72 65 6d 6f 74 65  ing trim $remote
82b0: 55 72 6c 5d 3b 20 73 65 74 20 76 61 6c 69 64 55  Url]; set validU
82c0: 72 6c 20 66 61 6c 73 65 0d 0a 0d 0a 20 20 20 20  rl false....    
82d0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67        if {[isEag
82e0: 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  le]} then {..   
82f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8300: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8310: 57 69 74 68 20 45 61 67 6c 65 2c 20 77 65 20 63  With Eagle, we c
8320: 61 6e 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  an actually vali
8330: 64 61 74 65 20 74 68 65 20 55 52 4c 2e 0d 0a 20  date the URL... 
8340: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
8350: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 75            if {[u
8360: 72 69 20 69 73 76 61 6c 69 64 20 24 72 65 6d 6f  ri isvalid $remo
8370: 74 65 55 72 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a  teUrl]} then {..
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
8390: 74 20 76 61 6c 69 64 55 72 6c 20 74 72 75 65 0d  t validUrl true.
83a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
83b0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
83c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
83d0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
83e0: 20 48 41 43 4b 3a 20 43 75 72 72 65 6e 74 6c 79   HACK: Currently
83f0: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 69  , there is no si
8400: 6d 70 6c 65 20 77 61 79 20 74 6f 20 76 61 6c 69  mple way to vali
8410: 64 61 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  date..          
8420: 20 20 23 20 20 20 20 20 20 20 61 6e 20 61 72 62    #       an arb
8430: 69 74 72 61 72 79 20 55 52 4c 20 77 69 74 68 20  itrary URL with 
8440: 54 63 6c 20 28 69 2e 65 2e 20 77 69 74 68 6f 75  Tcl (i.e. withou
8450: 74 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20  t using..       
8460: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 6d       #       som
8470: 65 20 68 69 64 65 6f 75 73 6c 79 20 63 6f 6d 70  e hideously comp
8480: 6c 65 78 20 72 65 67 75 6c 61 72 20 65 78 70 72  lex regular expr
8490: 65 73 73 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ession)...      
84a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
84b0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
84c0: 20 6c 65 6e 67 74 68 20 24 72 65 6d 6f 74 65 55   length $remoteU
84d0: 72 6c 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rl] > 0} then {.
84e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
84f0: 65 74 20 76 61 6c 69 64 55 72 6c 20 74 72 75 65  et validUrl true
8500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8510: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
8520: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
8530: 61 6c 69 64 55 72 6c 7d 20 74 68 65 6e 20 7b 0d  alidUrl} then {.
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
8550: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
8560: 54 45 3a 20 41 64 64 20 61 20 63 6f 6e 73 74 72  TE: Add a constr
8570: 61 69 6e 74 20 74 6f 20 73 68 6f 77 20 74 68 61  aint to show tha
8580: 74 20 61 20 76 61 6c 69 64 20 46 6f 73 73 69 6c  t a valid Fossil
8590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
85a0: 20 20 20 20 20 20 72 65 70 6f 73 69 74 6f 72 79        repository
85b0: 20 55 52 4c 20 61 70 70 65 61 72 73 20 74 6f 20   URL appears to 
85c0: 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  be available... 
85d0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
85e0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
85f0: 73 74 72 61 69 6e 74 20 66 6f 73 73 69 6c 5f 72  straint fossil_r
8600: 65 70 6f 73 69 74 6f 72 79 5f 75 72 6c 0d 0a 0d  epository_url...
8610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
8620: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
8630: 54 45 3a 20 49 66 20 77 65 20 61 72 65 20 6e 6f  TE: If we are no
8640: 74 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f 6d  t prevented from
8650: 20 64 6f 69 6e 67 20 73 6f 2c 20 73 61 76 65 0d   doing so, save.
8660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
8670: 20 20 20 20 20 74 68 65 20 74 65 73 74 20 72 65       the test re
8680: 70 6f 73 69 74 6f 72 79 20 55 52 4c 20 74 6f 20  pository URL to 
8690: 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 0d 0a  the repository..
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
86b0: 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20 69 6e      currently in
86c0: 20 75 73 65 20 74 6f 20 61 20 73 75 69 74 61 62   use to a suitab
86d0: 6c 79 20 6e 61 6d 65 64 20 67 6c 6f 62 61 6c 0d  ly named global.
86e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
86f0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 2e 0d 0a       variable...
8700: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
8710: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
8720: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
8730: 6f 28 73 65 74 52 65 70 6f 73 69 74 6f 72 79 55  o(setRepositoryU
8740: 72 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rl)]} then {..  
8750: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
8760: 3a 3a 74 65 73 74 5f 72 65 70 6f 73 69 74 6f 72  ::test_repositor
8770: 79 5f 75 72 6c 20 24 72 65 6d 6f 74 65 55 72 6c  y_url $remoteUrl
8780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8790: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
87a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
87b0: 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 74 68 65  NOTE: Append the
87c0: 20 72 65 70 6f 73 69 74 6f 72 79 20 55 52 4c 20   repository URL 
87d0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
87e0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
87f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 70  ..            ap
8800: 70 65 6e 64 20 72 65 73 75 6c 74 20 22 2c 20 72  pend result ", r
8810: 65 6d 6f 74 65 20 55 52 4c 20 5c 22 22 20 24 72  emote URL \"" $r
8820: 65 6d 6f 74 65 55 72 6c 20 5c 22 0d 0a 20 20 20  emoteUrl \"..   
8830: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8840: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
8850: 66 20 7b 5b 63 61 6e 45 78 65 63 46 6f 73 73 69  f {[canExecFossi
8860: 6c 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  l] && \..       
8870: 20 20 20 20 20 5b 63 61 74 63 68 20 7b 65 78 65       [catch {exe
8880: 63 20 2d 2d 20 66 6f 73 73 69 6c 20 69 6e 66 6f  c -- fossil info
8890: 7d 20 69 6e 66 6f 5d 20 3d 3d 20 30 7d 20 74 68  } info] == 0} th
88a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
88b0: 73 65 74 20 69 6e 66 6f 20 5b 73 74 72 69 6e 67  set info [string
88c0: 20 74 72 69 6d 20 24 69 6e 66 6f 5d 3b 20 73 65   trim $info]; se
88d0: 74 20 76 61 6c 69 64 46 69 6c 65 20 66 61 6c 73  t validFile fals
88e0: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e....          i
88f0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
8900: 68 20 24 69 6e 66 6f 5d 20 3e 20 30 7d 20 74 68  h $info] > 0} th
8910: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8920: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
8930: 72 65 70 6f 73 69 74 6f 72 79 3a 5c 73 2b 28 2e  repository:\s+(.
8940: 2a 3f 29 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20  *?)$}....       
8950: 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70       if {[regexp
8960: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
8970: 72 6e 20 24 69 6e 66 6f 20 64 75 6d 6d 79 20 72  rn $info dummy r
8980: 65 70 6f 73 69 74 6f 72 79 5d 7d 20 74 68 65 6e  epository]} then
8990: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
89a0: 20 20 73 65 74 20 72 65 70 6f 73 69 74 6f 72 79    set repository
89b0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 72   [string trim $r
89c0: 65 70 6f 73 69 74 6f 72 79 5d 0d 0a 0d 0a 20 20  epository]....  
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
89e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 72 65  [file exists $re
89f0: 70 6f 73 69 74 6f 72 79 5d 7d 20 74 68 65 6e 20  pository]} then 
8a00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8a10: 20 20 20 73 65 74 20 76 61 6c 69 64 46 69 6c 65     set validFile
8a20: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
8a30: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
8a40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8a50: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
8a60: 69 66 20 7b 24 76 61 6c 69 64 46 69 6c 65 7d 20  if {$validFile} 
8a70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8a80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
8a90: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61     # NOTE: Add a
8aa0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 73   constraint to s
8ab0: 68 6f 77 20 74 68 61 74 20 61 20 76 61 6c 69 64  how that a valid
8ac0: 20 46 6f 73 73 69 6c 0d 0a 20 20 20 20 20 20 20   Fossil..       
8ad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 70       #       rep
8ae0: 6f 73 69 74 6f 72 79 20 66 69 6c 65 20 61 70 70  ository file app
8af0: 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c  ears to be avail
8b00: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
8b10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8b20: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
8b30: 66 6f 73 73 69 6c 5f 72 65 70 6f 73 69 74 6f 72  fossil_repositor
8b40: 79 5f 66 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  y_file....      
8b50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8b60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
8b70: 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  e sure the file 
8b80: 6e 61 6d 65 20 69 73 20 66 75 6c 6c 79 20 6e 6f  name is fully no
8b90: 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20  rmalized...     
8ba0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8bb0: 20 20 20 20 20 20 73 65 74 20 72 65 70 6f 73 69        set reposi
8bc0: 74 6f 72 79 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  tory [file norma
8bd0: 6c 69 7a 65 20 24 72 65 70 6f 73 69 74 6f 72 79  lize $repository
8be0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
8bf0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
8c00: 23 20 4e 4f 54 45 3a 20 49 66 20 77 65 20 61 72  # NOTE: If we ar
8c10: 65 20 6e 6f 74 20 70 72 65 76 65 6e 74 65 64 20  e not prevented 
8c20: 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 73  from doing so, s
8c30: 61 76 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ave..           
8c40: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
8c50: 74 20 72 65 70 6f 73 69 74 6f 72 79 20 66 69 6c  t repository fil
8c60: 65 20 66 6f 72 20 74 68 65 20 72 65 70 6f 73 69  e for the reposi
8c70: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  tory..          
8c80: 20 20 23 20 20 20 20 20 20 20 63 75 72 72 65 6e    #       curren
8c90: 74 6c 79 20 69 6e 20 75 73 65 20 74 6f 20 61 20  tly in use to a 
8ca0: 73 75 69 74 61 62 6c 79 20 6e 61 6d 65 64 20 67  suitably named g
8cb0: 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 20  lobal..         
8cc0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
8cd0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
8ce0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8cf0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
8d00: 74 73 20 3a 3a 6e 6f 28 73 65 74 52 65 70 6f 73  ts ::no(setRepos
8d10: 69 74 6f 72 79 46 69 6c 65 29 5d 7d 20 74 68 65  itoryFile)]} the
8d20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
8d30: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 72 65     set ::test_re
8d40: 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 20 24 72  pository_file $r
8d50: 65 70 6f 73 69 74 6f 72 79 0d 0a 20 20 20 20 20  epository..     
8d60: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
8d70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8d80: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
8d90: 70 70 65 6e 64 20 74 68 65 20 72 65 70 6f 73 69  ppend the reposi
8da0: 74 6f 72 79 20 66 69 6c 65 20 63 75 72 72 65 6e  tory file curren
8db0: 74 6c 79 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20  tly in use...   
8dc0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8dd0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
8de0: 65 73 75 6c 74 20 22 2c 20 6c 6f 63 61 6c 20 66  esult ", local f
8df0: 69 6c 65 20 5c 22 22 20 24 72 65 70 6f 73 69 74  ile \"" $reposit
8e00: 6f 72 79 20 5c 22 0d 0a 20 20 20 20 20 20 20 20  ory \"..        
8e10: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
8e20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8e30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
8e40: 77 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  w the result of 
8e50: 74 68 65 20 63 68 65 63 6b 69 6e 67 2e 0d 0a 20  the checking... 
8e60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8e70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
8e80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
8e90: 73 20 28 22 20 24 72 65 73 75 6c 74 20 22 29 5c  s (" $result ")\
8ea0: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  n"]....        #
8eb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8ec0: 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65  : We are done he
8ed0: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d  re, return now..
8ee0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8ef0: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
8f00: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
8f10: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
8f20: 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20   no\n..  }..... 
8f30: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 56 69   proc checkForVi
8f40: 73 75 61 6c 53 74 75 64 69 6f 56 69 61 56 73 57  sualStudioViaVsW
8f50: 68 65 72 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  here { channel }
8f60: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
8f70: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
8f80: 63 6b 69 6e 67 20 66 6f 72 20 56 69 73 75 61 6c  cking for Visual
8f90: 20 53 74 75 64 69 6f 20 75 73 69 6e 67 20 5c 22   Studio using \"
8fa0: 76 73 77 68 65 72 65 5c 22 2e 2e 2e 20 22 0d 0a  vswhere\"... "..
8fb0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
8fc0: 4f 54 45 3a 20 49 6e 69 74 69 61 6c 6c 79 2c 20  OTE: Initially, 
8fd0: 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 56  no versions of V
8fe0: 69 73 75 61 6c 20 53 74 75 64 69 6f 20 68 61 76  isual Studio hav
8ff0: 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0d 0a 20  e been found... 
9000: 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 76 69     #..    set vi
9010: 73 75 61 6c 53 74 75 64 69 6f 56 65 72 73 69 6f  sualStudioVersio
9020: 6e 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  ns [list]....   
9030: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
9040: 55 73 65 20 6f 66 20 74 68 65 20 22 76 73 77 68  Use of the "vswh
9050: 65 72 65 22 20 74 6f 6f 6c 20 6d 75 73 74 20 62  ere" tool must b
9060: 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 75 73  e enabled for us
9070: 20 74 6f 20 64 65 74 65 63 74 0d 0a 20 20 20 20   to detect..    
9080: 23 20 20 20 20 20 20 20 61 6e 79 20 69 6e 73 74  #       any inst
9090: 61 6e 63 65 73 20 6f 66 20 56 69 73 75 61 6c 20  ances of Visual 
90a0: 53 74 75 64 69 6f 2e 0d 0a 20 20 20 20 23 0d 0a  Studio...    #..
90b0: 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63      if {[canExec
90c0: 56 73 57 68 65 72 65 5d 7d 20 74 68 65 6e 20 7b  VsWhere]} then {
90d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
90e0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 65 72   # NOTE: The ver
90f0: 73 69 6f 6e 73 20 6f 66 20 56 69 73 75 61 6c 20  sions of Visual 
9100: 53 74 75 64 69 6f 20 74 68 61 74 20 77 65 20 73  Studio that we s
9110: 75 70 70 6f 72 74 20 64 65 74 65 63 74 69 6f 6e  upport detection
9120: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9130: 6f 66 20 75 73 69 6e 67 20 74 68 65 20 22 76 73  of using the "vs
9140: 77 68 65 72 65 22 20 74 6f 6f 6c 2e 0d 0a 20 20  where" tool...  
9150: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
9160: 20 76 65 72 73 69 6f 6e 73 20 5b 6c 69 73 74 20   versions [list 
9170: 5b 6c 69 73 74 20 31 35 2e 30 20 32 30 31 37 5d  [list 15.0 2017]
9180: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
9190: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
91a0: 6b 20 65 61 63 68 20 76 65 72 73 69 6f 6e 20 61  k each version a
91b0: 6e 64 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  nd keep track of
91c0: 20 74 68 65 20 6f 6e 65 73 20 77 65 20 66 69 6e   the ones we fin
91d0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
91e0: 20 20 20 66 6f 72 65 61 63 68 20 76 65 72 73 69     foreach versi
91f0: 6f 6e 20 24 76 65 72 73 69 6f 6e 73 20 7b 0d 0a  on $versions {..
9200: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9210: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
9220: 70 74 20 74 6f 20 66 65 74 63 68 20 56 69 73 75  pt to fetch Visu
9230: 61 6c 20 53 74 75 64 69 6f 20 69 6e 73 74 61 6c  al Studio instal
9240: 6c 20 64 69 72 65 63 74 6f 72 69 65 73 0d 0a 20  l directories.. 
9250: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
9260: 61 6c 75 65 20 75 73 69 6e 67 20 74 68 65 20 22  alue using the "
9270: 76 73 77 68 65 72 65 22 20 74 6f 6f 6c 2e 0d 0a  vswhere" tool...
9280: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9290: 20 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63 56     if {[canExecV
92a0: 73 57 68 65 72 65 5d 20 26 26 20 5b 63 61 74 63  sWhere] && [catc
92b0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  h {..          e
92c0: 78 65 63 20 2d 6e 6f 63 61 72 72 69 61 67 65 72  xec -nocarriager
92d0: 65 74 75 72 6e 73 20 2d 2d 20 76 73 77 68 65 72  eturns -- vswher
92e0: 65 20 2d 70 72 6f 64 75 63 74 73 20 2a 20 5c 0d  e -products * \.
92f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  .              -
9300: 76 65 72 73 69 6f 6e 20 5b 6c 69 6e 64 65 78 20  version [lindex 
9310: 24 76 65 72 73 69 6f 6e 20 30 5d 20 2d 70 72 6f  $version 0] -pro
9320: 70 65 72 74 79 20 69 6e 73 74 61 6c 6c 61 74 69  perty installati
9330: 6f 6e 50 61 74 68 0d 0a 20 20 20 20 20 20 20 20  onPath..        
9340: 7d 20 69 6e 73 74 61 6c 6c 61 74 69 6f 6e 50 61  } installationPa
9350: 74 68 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ths] == 0} then 
9360: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
9370: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
9380: 3a 20 43 68 65 63 6b 20 65 61 63 68 20 56 69 73  : Check each Vis
9390: 75 61 6c 20 53 74 75 64 69 6f 20 69 6e 73 74 61  ual Studio insta
93a0: 6c 6c 20 64 69 72 65 63 74 6f 72 79 2c 20 69 6e  ll directory, in
93b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
93c0: 23 20 20 20 20 20 20 20 6f 72 64 65 72 20 74 68  #       order th
93d0: 65 79 20 77 65 72 65 20 72 65 74 75 72 6e 65 64  ey were returned
93e0: 2c 20 61 66 74 65 72 20 73 70 6c 69 74 74 69 6e  , after splittin
93f0: 67 20 74 68 65 6d 20 69 6e 74 6f 0d 0a 20 20 20  g them into..   
9400: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
9410: 20 70 72 6f 70 65 72 20 54 63 6c 20 6c 69 73 74   proper Tcl list
9420: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
9430: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e            set in
9440: 73 74 61 6c 6c 61 74 69 6f 6e 50 61 74 68 73 20  stallationPaths 
9450: 5b 73 70 6c 69 74 20 5c 0d 0a 20 20 20 20 20 20  [split \..      
9460: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
9470: 74 72 69 6d 20 24 69 6e 73 74 61 6c 6c 61 74 69  trim $installati
9480: 6f 6e 50 61 74 68 73 5d 20 5c 6e 5d 0d 0a 0d 0a  onPaths] \n]....
9490: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
94a0: 68 20 69 6e 73 74 61 6c 6c 61 74 69 6f 6e 50 61  h installationPa
94b0: 74 68 20 24 69 6e 73 74 61 6c 6c 61 74 69 6f 6e  th $installation
94c0: 50 61 74 68 73 20 7b 0d 0a 20 20 20 20 20 20 20  Paths {..       
94d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
94e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f      # NOTE: Remo
94f0: 76 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  ve the trailing 
9500: 62 61 63 6b 73 6c 61 73 68 2c 20 69 66 20 61 6e  backslash, if an
9510: 79 2e 20 20 44 6f 65 73 20 74 68 65 0d 0a 20 20  y.  Does the..  
9520: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
9530: 20 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65    directory name
9540: 20 6c 6f 6f 6b 20 76 61 6c 69 64 20 61 6e 64 20   look valid and 
9550: 64 6f 65 73 20 69 74 20 61 63 74 75 61 6c 6c 79  does it actually
9560: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
9570: 20 20 20 20 20 20 65 78 69 73 74 3f 0d 0a 20 20        exist?..  
9580: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9590: 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
95a0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
95b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
95c0: 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72 69 6d      [string trim
95d0: 72 69 67 68 74 20 24 69 6e 73 74 61 6c 6c 61 74  right $installat
95e0: 69 6f 6e 50 61 74 68 20 5c 5c 5d 20 43 6f 6d 6d  ionPath \\] Comm
95f0: 6f 6e 37 20 49 44 45 20 5c 0d 0a 20 20 20 20 20  on7 IDE \..     
9600: 20 20 20 20 20 20 20 20 20 20 20 6d 73 65 6e 76             msenv
9610: 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .dll]....       
9620: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 69       if {[file i
9630: 73 66 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 5d  sfile $fileName]
9640: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9650: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9660: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9670: 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
9680: 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69   that it is avai
9690: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
96a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
96b0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
96c0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
96d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
96e0: 20 20 20 20 20 20 76 69 73 75 61 6c 53 74 75 64        visualStud
96f0: 69 6f 20 5b 6c 69 6e 64 65 78 20 24 76 65 72 73  io [lindex $vers
9700: 69 6f 6e 20 31 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ion 1]]....     
9710: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9720: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
9730: 3a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  : Keep track of 
9740: 61 6c 6c 20 74 68 65 20 76 65 72 73 69 6f 6e 73  all the versions
9750: 20 74 68 61 74 20 77 65 20 66 69 6e 64 2e 0d 0a   that we find...
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
9770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
9780: 61 70 70 65 6e 64 20 76 69 73 75 61 6c 53 74 75  append visualStu
9790: 64 69 6f 56 65 72 73 69 6f 6e 73 20 5b 6c 69 6e  dioVersions [lin
97a0: 64 65 78 20 24 76 65 72 73 69 6f 6e 20 31 5d 0d  dex $version 1].
97b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
97c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
97d0: 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
97e0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  he directory for
97f0: 20 6c 61 74 65 72 20 75 73 61 67 65 20 62 79 20   later usage by 
9800: 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20  the test..      
9810: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9820: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9850: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
9860: 3a 3a 6e 6f 28 73 65 74 56 69 73 75 61 6c 53 74  ::no(setVisualSt
9870: 75 64 69 6f 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  udio)]} then {..
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 73 65 74 20 3a 3a 74 65 73 74 5f 76 69 73 75 61  set ::test_visua
98a0: 6c 5f 73 74 75 64 69 6f 20 5b 66 69 6c 65 20 64  l_studio [file d
98b0: 69 72 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  irname $fileName
98c0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
98d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
98e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
98f0: 20 20 20 20 20 23 20 48 41 43 4b 3a 20 53 74 6f       # HACK: Sto
9900: 70 20 61 66 74 65 72 20 77 65 20 66 69 6e 64 20  p after we find 
9910: 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
9920: 63 65 20 6f 66 20 56 69 73 75 61 6c 0d 0a 20 20  ce of Visual..  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
9940: 20 20 20 20 53 74 75 64 69 6f 20 77 69 74 68 20      Studio with 
9950: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 76 65  the requested ve
9960: 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  rsion...        
9970: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9980: 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20         break..  
9990: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
99a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
99b0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
99c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b    }....    if {[
99d0: 6c 6c 65 6e 67 74 68 20 24 76 69 73 75 61 6c 53  llength $visualS
99e0: 74 75 64 69 6f 56 65 72 73 69 6f 6e 73 5d 20 3e  tudioVersions] >
99f0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
9a00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9a10: 45 3a 20 53 68 6f 77 20 77 68 65 72 65 20 77 65  E: Show where we
9a20: 20 66 6f 75 6e 64 20 74 68 65 20 6c 61 74 65 73   found the lates
9a30: 74 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20  t version...    
9a40: 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73    #..      tputs
9a50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
9a60: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9a70: 20 20 20 22 79 65 73 20 28 22 20 24 76 69 73 75     "yes (" $visu
9a80: 61 6c 53 74 75 64 69 6f 56 65 72 73 69 6f 6e 73  alStudioVersions
9a90: 20 22 2c 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   ", \"" \..     
9aa0: 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 69 6e 66       [expr {[inf
9ab0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
9ac0: 76 69 73 75 61 6c 5f 73 74 75 64 69 6f 5d 20 3f  visual_studio] ?
9ad0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9ae0: 20 20 24 3a 3a 74 65 73 74 5f 76 69 73 75 61 6c    $::test_visual
9af0: 5f 73 74 75 64 69 6f 20 3a 20 22 3c 6e 6f 6e 65  _studio : "<none
9b00: 3e 22 7d 5d 20 22 5c 22 29 5c 6e 22 5d 0d 0a 20  >"}] "\")\n"].. 
9b10: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9b20: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
9b30: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
9b40: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
9b50: 65 63 6b 46 6f 72 45 61 67 6c 65 20 7b 20 63 68  eckForEagle { ch
9b60: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
9b70: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
9b80: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
9b90: 20 45 61 67 6c 65 2e 2e 2e 20 22 0d 0a 0d 0a 20   Eagle... ".... 
9ba0: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
9bb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9bc0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9bd0: 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   We are running 
9be0: 69 6e 73 69 64 65 20 45 61 67 6c 65 2e 0d 0a 20  inside Eagle... 
9bf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 64       #..      ad
9c00: 64 43 6f 6e 73 74 72 61 69 6e 74 20 65 61 67 6c  dConstraint eagl
9c10: 65 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e....      #..  
9c20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64      # NOTE: We d
9c30: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 73 6b  o not want to sk
9c40: 69 70 20 62 75 67 73 20 6f 72 20 63 72 61 73 68  ip bugs or crash
9c50: 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
9c60: 20 20 20 69 73 73 75 65 73 20 66 6f 72 20 54 63     issues for Tc
9c70: 6c 20 73 69 6e 63 65 20 77 65 20 61 72 65 20 6e  l since we are n
9c80: 6f 74 20 72 75 6e 6e 69 6e 67 0d 0a 20 20 20 20  ot running..    
9c90: 20 20 23 20 20 20 20 20 20 20 69 6e 20 54 63 6c    #       in Tcl
9ca0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9cb0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
9cc0: 74 63 6c 42 75 67 0d 0a 20 20 20 20 20 20 61 64  tclBug..      ad
9cd0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 43  dConstraint tclC
9ce0: 72 61 73 68 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rash....      #.
9cf0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
9d00: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
9d10: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
9d20: 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20   each..      #  
9d30: 20 20 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20       version of 
9d40: 54 63 6c 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75  Tcl we know abou
9d50: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
9d60: 20 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56 65     foreach tclVe
9d70: 72 73 69 6f 6e 20 5b 67 65 74 4b 6e 6f 77 6e 54  rsion [getKnownT
9d80: 63 6c 56 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a 20  clVersions] {.. 
9d90: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
9da0: 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65  on [getDotlessVe
9db0: 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f  rsion $tclVersio
9dc0: 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61 64  n]....        ad
9dd0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
9de0: 65 6e 64 41 72 67 73 20 74 63 6c 42 75 67 20 24  endArgs tclBug $
9df0: 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  version]..      
9e00: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
9e10: 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c 43  [appendArgs tclC
9e20: 72 61 73 68 20 24 76 65 72 73 69 6f 6e 5d 0d 0a  rash $version]..
9e30: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
9e40: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
9e50: 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73  yes\n..    } els
9e60: 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e {..      #..  
9e70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
9e80: 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 73 69 64  re running insid
9e90: 65 20 54 63 6c 2e 0d 0a 20 20 20 20 20 20 23 0d  e Tcl...      #.
9ea0: 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72  .      addConstr
9eb0: 61 69 6e 74 20 74 63 6c 0d 0a 0d 0a 20 20 20 20  aint tcl....    
9ec0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9ed0: 45 3a 20 45 61 63 68 20 54 63 6c 20 62 75 67 20  E: Each Tcl bug 
9ee0: 61 6e 64 20 63 72 61 73 68 20 63 6f 6e 73 74 72  and crash constr
9ef0: 61 69 6e 74 20 69 73 20 73 65 74 0d 0a 20 20 20  aint is set..   
9f00: 20 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64     #       based
9f10: 20 6f 6e 20 74 68 65 20 65 78 61 63 74 20 54 63   on the exact Tc
9f20: 6c 20 76 65 72 73 69 6f 6e 20 28 69 2e 65 2e 20  l version (i.e. 
9f30: 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  not..      #    
9f40: 20 20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20     greater than 
9f50: 6f 72 20 65 71 75 61 6c 20 74 6f 29 2e 0d 0a 20  or equal to)... 
9f60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9f70: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9f80: 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 5d 7d 20 74  :tcl_version]} t
9f90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
9fa0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9fb0: 3a 20 46 6f 72 20 65 61 63 68 20 54 63 6c 20 76  : For each Tcl v
9fc0: 65 72 73 69 6f 6e 20 77 65 20 6b 6e 6f 77 20 61  ersion we know a
9fd0: 62 6f 75 74 2c 0d 0a 20 20 20 20 20 20 20 20 23  bout,..        #
9fe0: 20 20 20 20 20 20 20 63 68 65 63 6b 20 69 74 20         check it 
9ff0: 61 67 61 69 6e 73 74 20 74 68 65 20 63 75 72 72  against the curr
a000: 65 6e 74 6c 79 20 72 75 6e 6e 69 6e 67 0d 0a 20  ently running.. 
a010: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54         #       T
a020: 63 6c 20 76 65 72 73 69 6f 6e 2e 20 20 49 66 20  cl version.  If 
a030: 74 68 65 20 74 77 6f 20 61 72 65 20 6e 6f 74 20  the two are not 
a040: 65 71 75 61 6c 2c 0d 0a 20 20 20 20 20 20 20 20  equal,..        
a050: 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
a060: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
a070: 20 74 68 61 74 20 70 72 65 76 65 6e 74 0d 0a 20   that prevent.. 
a080: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
a090: 6b 69 70 70 69 6e 67 20 74 68 6f 73 65 20 74 65  kipping those te
a0a0: 73 74 73 20 74 68 61 74 20 61 72 65 20 62 75 67  sts that are bug
a0b0: 67 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  gy..        #   
a0c0: 20 20 20 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65      only for the
a0d0: 20 70 61 72 74 69 63 75 6c 61 72 20 76 65 72 73   particular vers
a0e0: 69 6f 6e 20 6f 66 20 54 63 6c 2e 0d 0a 20 20 20  ion of Tcl...   
a0f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a100: 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72 73 69  foreach tclVersi
a110: 6f 6e 20 5b 67 65 74 4b 6e 6f 77 6e 54 63 6c 56  on [getKnownTclV
a120: 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ersions] {..    
a130: 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72        set dotVer
a140: 73 69 6f 6e 20 5b 67 65 74 44 6f 74 74 65 64 56  sion [getDottedV
a150: 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69  ersion $tclVersi
a160: 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
a170: 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 76 65 72 73   if {$::tcl_vers
a180: 69 6f 6e 20 6e 65 20 24 64 6f 74 56 65 72 73 69  ion ne $dotVersi
a190: 6f 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  on} then {..    
a1a0: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
a1b0: 69 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73 73 56  ion [getDotlessV
a1c0: 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69  ersion $tclVersi
a1d0: 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
a1e0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
a1f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c   [appendArgs tcl
a200: 42 75 67 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 20  Bug $version].. 
a210: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
a220: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
a230: 41 72 67 73 20 74 63 6c 43 72 61 73 68 20 24 76  Args tclCrash $v
a240: 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ersion]..       
a250: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
a260: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a270: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a280: 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  E: We do not wan
a290: 74 20 74 6f 20 73 6b 69 70 20 62 75 67 73 20 6f  t to skip bugs o
a2a0: 72 20 63 72 61 73 68 69 6e 67 0d 0a 20 20 20 20  r crashing..    
a2b0: 20 20 23 20 20 20 20 20 20 20 69 73 73 75 65 73    #       issues
a2c0: 20 66 6f 72 20 45 61 67 6c 65 20 73 69 6e 63 65   for Eagle since
a2d0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
a2e0: 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
a2f0: 20 20 20 69 6e 20 45 61 67 6c 65 2e 0d 0a 20 20     in Eagle...  
a300: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 64 64      #..      add
a310: 43 6f 6e 73 74 72 61 69 6e 74 20 65 61 67 6c 65  Constraint eagle
a320: 42 75 67 0d 0a 20 20 20 20 20 20 61 64 64 43 6f  Bug..      addCo
a330: 6e 73 74 72 61 69 6e 74 20 65 61 67 6c 65 43 72  nstraint eagleCr
a340: 61 73 68 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  ash....      tpu
a350: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
a360: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
a370: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
a380: 53 79 6d 62 6f 6c 73 20 7b 20 63 68 61 6e 6e 65  Symbols { channe
a390: 6c 20 6e 61 6d 65 20 7b 63 6f 6e 73 74 72 61 69  l name {constrai
a3a0: 6e 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  nt ""} } {..    
a3b0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
a3c0: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 61 70  le normalize [ap
a3d0: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72  pendArgs [file r
a3e0: 6f 6f 74 6e 61 6d 65 20 24 6e 61 6d 65 5d 20 2e  ootname $name] .
a3f0: 70 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 74 70 75  pdb]]....    tpu
a400: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a410: 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
a420: 65 63 6b 69 6e 67 20 66 6f 72 20 73 79 6d 62 6f  ecking for symbo
a430: 6c 73 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  ls \"" $fileName
a440: 20 5c 0d 0a 20 20 20 20 20 20 20 20 22 5c 22 2e   \..        "\".
a450: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69 66 20  .. "]....    if 
a460: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
a470: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
a480: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a490: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
a4a0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 68 61 76  e appears to hav
a4b0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 73 79 6d  e associated sym
a4c0: 62 6f 6c 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  bols available..
a4d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a4e0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
a4f0: 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 20  th $constraint] 
a500: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a510: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
a520: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73  nt [appendArgs s
a530: 79 6d 62 6f 6c 73 5f 20 24 63 6f 6e 73 74 72 61  ymbols_ $constra
a540: 69 6e 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  int]..      } el
a550: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  se {..        ad
a560: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
a570: 65 6e 64 41 72 67 73 20 73 79 6d 62 6f 6c 73 5f  endArgs symbols_
a580: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 61 6d   [file tail $nam
a590: 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
a5a0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a5b0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
a5c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a5d0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
a5e0: 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  o\n..    }..  }.
a5f0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
a600: 46 6f 72 4c 6f 67 46 69 6c 65 20 7b 20 63 68 61  ForLogFile { cha
a610: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
a620: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
a630: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
a640: 6c 6f 67 20 66 69 6c 65 2e 2e 2e 20 22 0d 0a 0d  log file... "...
a650: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
a660: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c 6f 67  xists ::test_log
a670: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
a680: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a690: 3a 3a 74 65 73 74 5f 6c 6f 67 5d 20 3e 20 30 20  ::test_log] > 0 
a6a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 66  && \..        [f
a6b0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 74 65  ile exists $::te
a6c0: 73 74 5f 6c 6f 67 5d 7d 20 74 68 65 6e 20 7b 0d  st_log]} then {.
a6d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a6e0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 67 20  # NOTE: The log 
a6f0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
a700: 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  be available... 
a710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 64       #..      ad
a720: 64 43 6f 6e 73 74 72 61 69 6e 74 20 6c 6f 67 46  dConstraint logF
a730: 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  ile....      tpu
a740: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
a750: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
a760: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
a770: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
a780: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
a790: 63 20 63 68 65 63 6b 46 6f 72 47 61 72 75 64 61  c checkForGaruda
a7a0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
a7b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
a7c0: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
a7d0: 67 20 66 6f 72 20 47 61 72 75 64 61 2e 2e 2e 20  g for Garuda... 
a7e0: 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 68 61  "....    if {[ha
a7f0: 76 65 47 61 72 75 64 61 20 70 61 63 6b 61 67 65  veGaruda package
a800: 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  Id]} then {..   
a810: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
a820: 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69  TE: We are runni
a830: 6e 67 20 77 69 74 68 20 6f 72 20 76 69 61 20 47  ng with or via G
a840: 61 72 75 64 61 2e 0d 0a 20 20 20 20 20 20 23 0d  aruda...      #.
a850: 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72  .      addConstr
a860: 61 69 6e 74 20 67 61 72 75 64 61 0d 0a 0d 0a 20  aint garuda.... 
a870: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
a880: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a890: 22 79 65 73 20 28 22 20 24 70 61 63 6b 61 67 65  "yes (" $package
a8a0: 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 7d  Id ")\n"]..    }
a8b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
a8c0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
a8d0: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
a8e0: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
a8f0: 6f 72 53 68 65 6c 6c 20 7b 20 63 68 61 6e 6e 65  orShell { channe
a900: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
a910: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
a920: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 68 65  checking for she
a930: 6c 6c 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 73  ll... "....    s
a940: 65 74 20 6e 61 6d 65 20 5b 66 69 6c 65 20 72 6f  et name [file ro
a950: 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
a960: 6c 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78  l [info nameofex
a970: 65 63 75 74 61 62 6c 65 5d 5d 5d 0d 0a 0d 0a 20  ecutable]]].... 
a980: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
a990: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a9a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a9b0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 75 73 65   By default, use
a9c0: 20 73 74 72 69 63 74 20 6d 61 74 63 68 69 6e 67   strict matching
a9d0: 20 6f 66 20 74 68 65 20 73 68 65 6c 6c 20 65 78   of the shell ex
a9e0: 65 63 75 74 61 62 6c 65 0d 0a 20 20 20 20 20 20  ecutable..      
a9f0: 23 20 20 20 20 20 20 20 6e 61 6d 65 20 28 65 78  #       name (ex
aa00: 61 63 74 29 3b 20 6f 74 68 65 72 77 69 73 65 2c  act); otherwise,
aa10: 20 6d 61 74 63 68 20 61 6e 79 20 65 78 65 63 75   match any execu
aa20: 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 68 61 74  table names that
aa30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
aa40: 73 74 61 72 74 20 77 69 74 68 20 22 45 61 67 6c  start with "Eagl
aa50: 65 22 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e"...      #..  
aa60: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
aa70: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 74 72 69 63  xists ::no(stric
aa80: 74 43 68 65 63 6b 46 6f 72 53 68 65 6c 6c 29 5d  tCheckForShell)]
aa90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
aaa0: 20 20 73 65 74 20 6d 61 74 63 68 20 5b 65 78 70    set match [exp
aab0: 72 20 7b 24 6e 61 6d 65 20 65 71 20 22 45 61 67  r {$name eq "Eag
aac0: 6c 65 22 20 7c 7c 20 24 6e 61 6d 65 20 65 71 20  le" || $name eq 
aad0: 22 45 61 67 6c 65 53 68 65 6c 6c 22 7d 5d 0d 0a  "EagleShell"}]..
aae0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
aaf0: 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 74 63          set matc
ab00: 68 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20  h [string match 
ab10: 45 61 67 6c 65 2a 20 24 6e 61 6d 65 5d 0d 0a 20  Eagle* $name].. 
ab20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ab30: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ab40: 20 44 6f 65 73 20 74 68 65 20 6e 61 6d 65 20 6f   Does the name o
ab50: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
ab60: 20 66 69 6c 65 20 61 70 70 65 61 72 20 74 6f 20   file appear to 
ab70: 62 65 20 61 20 6d 61 74 63 68 0d 0a 20 20 20 20  be a match..    
ab80: 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 6f 6e    #       for on
ab90: 65 20 6f 66 20 74 68 65 20 22 77 65 6c 6c 2d 6b  e of the "well-k
aba0: 6e 6f 77 6e 22 20 73 68 65 6c 6c 73 3f 0d 0a 20  nown" shells?.. 
abb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
abc0: 20 7b 24 6d 61 74 63 68 7d 20 74 68 65 6e 20 7b   {$match} then {
abd0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
abe0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
abf0: 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 45  are running in E
ac00: 61 67 6c 65 20 76 69 61 20 74 68 65 20 45 61 67  agle via the Eag
ac10: 6c 65 53 68 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  leShell...      
ac20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
ac30: 43 6f 6e 73 74 72 61 69 6e 74 20 73 68 65 6c 6c  Constraint shell
ac40: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
ac50: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
ac60: 72 67 73 20 73 68 65 6c 6c 2e 20 24 6e 61 6d 65  rgs shell. $name
ac70: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
ac80: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 79 65 73  ts $channel "yes
ac90: 20 28 45 61 67 6c 65 29 5c 6e 22 0d 0a 0d 0a 20   (Eagle)\n".... 
aca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
acb0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
acc0: 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
acd0: 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  rn now...       
ace0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
acf0: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  rn..      }..   
ad00: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
ad10: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
ad20: 63 68 20 74 63 6c 73 68 2a 20 24 6e 61 6d 65 5d  ch tclsh* $name]
ad30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ad40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ad50: 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e  OTE: We are runn
ad60: 69 6e 67 20 69 6e 20 54 63 6c 20 76 69 61 20 74  ing in Tcl via t
ad70: 63 6c 73 68 2e 0d 0a 20 20 20 20 20 20 20 20 23  clsh...        #
ad80: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
ad90: 73 74 72 61 69 6e 74 20 73 68 65 6c 6c 0d 0a 20  straint shell.. 
ada0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
adb0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
adc0: 20 73 68 65 6c 6c 2e 20 24 6e 61 6d 65 5d 0d 0a   shell. $name]..
add0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
ade0: 24 63 68 61 6e 6e 65 6c 20 22 79 65 73 20 28 54  $channel "yes (T
adf0: 63 6c 29 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  cl)\n"....      
ae00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ae10: 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65  OTE: We are done
ae20: 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f   here, return no
ae30: 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
ae40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
ae50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
ae60: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
ae70: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c  nel no\n..  }...
ae80: 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
ae90: 72 4f 66 66 69 63 69 61 6c 53 74 61 62 6c 65 52  rOfficialStableR
aea0: 65 6c 65 61 73 65 49 6e 50 72 6f 67 72 65 73 73  eleaseInProgress
aeb0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
aec0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
aed0: 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 73 20  E: If the tests 
aee0: 61 70 70 65 61 72 20 74 6f 20 62 65 20 72 75 6e  appear to be run
aef0: 6e 69 6e 67 20 61 73 20 70 61 72 74 20 6f 66 20  ning as part of 
af00: 74 68 65 20 6f 66 66 69 63 69 61 6c 20 73 74 61  the official sta
af10: 62 6c 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  ble..    #      
af20: 20 72 65 6c 65 61 73 65 20 70 72 6f 63 65 73 73   release process
af30: 20 66 6f 72 20 45 61 67 6c 65 2c 20 74 68 65 6e   for Eagle, then
af40: 20 61 64 64 20 74 68 65 20 74 65 73 74 20 63 6f   add the test co
af50: 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 77 69  nstraint that wi
af60: 6c 6c 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  ll..    #       
af70: 62 65 20 63 68 65 63 6b 65 64 20 62 79 20 74 68  be checked by th
af80: 65 20 5b 66 69 78 54 69 6d 69 6e 67 43 6f 6e 73  e [fixTimingCons
af90: 74 72 61 69 6e 74 73 5d 20 70 72 6f 63 65 64 75  traints] procedu
afa0: 72 65 2c 20 73 6f 20 74 68 61 74 20 74 65 73 74  re, so that test
afb0: 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 75  s..    #       u
afc0: 73 69 6e 67 20 69 74 20 77 69 6c 6c 20 6e 6f 74  sing it will not
afd0: 20 62 65 20 63 6f 75 6e 74 65 64 20 61 67 61 69   be counted agai
afe0: 6e 73 74 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  nst the overall 
aff0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0d 0a  results of the..
b000: 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
b010: 20 72 75 6e 2e 0d 0a 20 20 20 20 23 0d 0a 20 20   run...    #..  
b020: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b030: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
b040: 66 6f 72 20 6f 66 66 69 63 69 61 6c 20 73 74 61  for official sta
b050: 62 6c 65 20 72 65 6c 65 61 73 65 20 69 6e 20 70  ble release in p
b060: 72 6f 67 72 65 73 73 2e 2e 2e 20 22 0d 0a 0d 0a  rogress... "....
b070: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
b080: 69 73 74 73 20 3a 3a 65 6e 76 28 4f 46 46 49 43  ists ::env(OFFIC
b090: 49 41 4c 29 5d 20 26 26 20 5b 69 6e 66 6f 20 65  IAL)] && [info e
b0a0: 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 54 41 42  xists ::env(STAB
b0b0: 4c 45 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  LE)]} then {..  
b0c0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
b0d0: 74 20 6f 66 66 69 63 69 61 6c 53 74 61 62 6c 65  t officialStable
b0e0: 52 65 6c 65 61 73 65 49 6e 50 72 6f 67 72 65 73  ReleaseInProgres
b0f0: 73 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  s....      tputs
b100: 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
b110: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
b120: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
b130: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
b140: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
b150: 63 68 65 63 6b 46 6f 72 44 65 62 75 67 20 7b 20  checkForDebug { 
b160: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
b170: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b180: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
b190: 6f 72 20 64 65 62 75 67 2e 2e 2e 20 22 0d 0a 0d  or debug... "...
b1a0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
b1b0: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
b1c0: 66 6f 72 6d 28 64 65 62 75 67 29 5d 20 26 26 20  form(debug)] && 
b1d0: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
b1e0: 64 65 62 75 67 29 7d 20 74 68 65 6e 20 7b 0d 0a  debug)} then {..
b1f0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
b200: 69 6e 74 20 64 65 62 75 67 0d 0a 0d 0a 20 20 20  int debug....   
b210: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
b220: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
b230: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
b240: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
b250: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
b260: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
b270: 54 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  Tk { channel } {
b280: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
b290: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
b2a0: 69 6e 67 20 66 6f 72 20 54 6b 2e 2e 2e 20 22 0d  ing for Tk... ".
b2b0: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
b2c0: 48 41 43 4b 3a 20 46 6f 72 20 6e 6f 77 2c 20 64  HACK: For now, d
b2d0: 69 73 61 62 6c 65 20 74 65 73 74 69 6e 67 20 54  isable testing T
b2e0: 6b 20 38 2e 34 2f 38 2e 35 20 77 68 65 6e 20 72  k 8.4/8.5 when r
b2f0: 75 6e 6e 69 6e 67 20 69 6e 20 45 61 67 6c 65 2e  unning in Eagle.
b300: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
b310: 7b 21 5b 69 73 45 61 67 6c 65 5d 20 7c 7c 20 5b  {![isEagle] || [
b320: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 74  haveConstraint t
b330: 63 6c 4c 69 62 72 61 72 79 38 36 5d 20 7c 7c 20  clLibrary86] || 
b340: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65  \..        [have
b350: 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 4c 69  Constraint tclLi
b360: 62 72 61 72 79 38 37 5d 7d 20 74 68 65 6e 20 7b  brary87]} then {
b370: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
b380: 72 61 69 6e 74 20 74 6b 0d 0a 0d 0a 20 20 20 20  raint tk....    
b390: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b3a0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c   yes\n..    } el
b3b0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  se {..      tput
b3c0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
b3d0: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
b3e0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 56    proc checkForV
b3f0: 65 72 73 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c  ersion { channel
b400: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
b410: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
b420: 68 65 63 6b 69 6e 67 20 66 6f 72 20 6c 61 6e 67  hecking for lang
b430: 75 61 67 65 20 76 65 72 73 69 6f 6e 2e 2e 2e 20  uage version... 
b440: 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  "....    if {[in
b450: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
b460: 76 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b  version]} then {
b470: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b480: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
b490: 6f 62 74 61 69 6e 20 74 68 65 20 6c 69 73 74 20  obtain the list 
b4a0: 6f 66 20 61 6c 6c 20 22 6b 6e 6f 77 6e 22 20 54  of all "known" T
b4b0: 63 6c 20 76 65 72 73 69 6f 6e 73 2e 0d 0a 20 20  cl versions...  
b4c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
b4d0: 20 74 63 6c 56 65 72 73 69 6f 6e 73 20 5b 67 65   tclVersions [ge
b4e0: 74 4b 6e 6f 77 6e 54 63 6c 56 65 72 73 69 6f 6e  tKnownTclVersion
b4f0: 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  s]....      #.. 
b500: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 2a 45 41       # NOTE: *EA
b510: 47 4c 45 2a 20 57 65 20 64 6f 20 77 61 6e 74 20  GLE* We do want 
b520: 74 6f 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 74  to include any t
b530: 65 73 74 73 20 74 68 61 74 20 74 61 72 67 65 74  ests that target
b540: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b550: 22 54 63 6c 20 38 2e 58 20 6f 72 20 68 69 67 68  "Tcl 8.X or high
b560: 65 72 22 20 66 65 61 74 75 72 65 73 20 62 65 63  er" features bec
b570: 61 75 73 65 20 74 68 6f 73 65 20 74 65 73 74 73  ause those tests
b580: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b590: 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 20  would not be in 
b5a0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69  the test suite i
b5b0: 66 20 77 65 20 64 69 64 20 6e 6f 74 20 73 75 70  f we did not sup
b5c0: 70 6f 72 74 0d 0a 20 20 20 20 20 20 23 20 20 20  port..      #   
b5d0: 20 20 20 20 74 68 61 74 20 70 61 72 74 69 63 75      that particu
b5e0: 6c 61 72 20 66 65 61 74 75 72 65 2c 20 72 65 67  lar feature, reg
b5f0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6c  ardless of the l
b600: 61 6e 67 75 61 67 65 0d 0a 20 20 20 20 20 20 23  anguage..      #
b610: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 2e 0d         version..
b620: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b630: 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74  if {[isEagle]} t
b640: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
b650: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
b660: 3a 20 50 72 6f 63 65 73 73 20 65 61 63 68 20 22  : Process each "
b670: 6b 6e 6f 77 6e 22 20 54 63 6c 20 76 65 72 73 69  known" Tcl versi
b680: 6f 6e 2c 20 61 64 64 69 6e 67 20 65 61 63 68 20  on, adding each 
b690: 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  of..        #   
b6a0: 20 20 20 20 74 68 65 20 22 66 65 61 74 75 72 65      the "feature
b6b0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 69  " constraints (i
b6c0: 2e 65 2e 20 73 69 6e 63 65 20 74 68 69 73 20 69  .e. since this i
b6d0: 73 20 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  s an..        # 
b6e0: 20 20 20 20 20 20 45 61 67 6c 65 20 74 65 73 74        Eagle test
b6f0: 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75   suite infrastru
b700: 63 74 75 72 65 20 70 61 63 6b 61 67 65 29 2e 0d  cture package)..
b710: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b720: 20 20 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56      foreach tclV
b730: 65 72 73 69 6f 6e 28 31 29 20 24 74 63 6c 56 65  ersion(1) $tclVe
b740: 72 73 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20  rsions {..      
b750: 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 28      set version(
b760: 31 29 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65  1) [getDotlessVe
b770: 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f  rsion $tclVersio
b780: 6e 28 31 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  n(1)]..         
b790: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
b7a0: 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c 20 24  appendArgs tcl $
b7b0: 76 65 72 73 69 6f 6e 28 31 29 20 46 65 61 74 75  version(1) Featu
b7c0: 72 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  re]..        }..
b7d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b7e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b7f0: 3a 20 50 72 6f 63 65 73 73 20 65 61 63 68 20 22  : Process each "
b800: 6b 6e 6f 77 6e 22 20 54 63 6c 20 76 65 72 73 69  known" Tcl versi
b810: 6f 6e 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  on, checking for
b820: 20 61 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   an..      #    
b830: 20 20 20 65 78 61 63 74 20 6d 61 74 63 68 20 77     exact match w
b840: 69 74 68 20 74 68 65 20 72 75 6e 6e 69 6e 67 20  ith the running 
b850: 54 63 6c 20 76 65 72 73 69 6f 6e 2e 20 20 57 68  Tcl version.  Wh
b860: 65 6e 20 61 6e 0d 0a 20 20 20 20 20 20 23 20 20  en an..      #  
b870: 20 20 20 20 20 65 78 61 63 74 20 6d 61 74 63 68       exact match
b880: 20 69 73 20 66 6f 75 6e 64 2c 20 61 64 64 20 61   is found, add a
b890: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6e 73 74  ppropriate const
b8a0: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 23  raints...      #
b8b0: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
b8c0: 74 63 6c 56 65 72 73 69 6f 6e 28 31 29 20 24 74  tclVersion(1) $t
b8d0: 63 6c 56 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20  clVersions {..  
b8e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b8f0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
b900: 65 20 72 75 6e 6e 69 6e 67 20 54 63 6c 20 76 65  e running Tcl ve
b910: 72 73 69 6f 6e 20 6d 61 74 63 68 20 74 68 69 73  rsion match this
b920: 20 22 6b 6e 6f 77 6e 22 0d 0a 20 20 20 20 20 20   "known"..      
b930: 20 20 23 20 20 20 20 20 20 20 54 63 6c 20 76 65    #       Tcl ve
b940: 72 73 69 6f 6e 20 65 78 61 63 74 6c 79 3f 0d 0a  rsion exactly?..
b950: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b960: 20 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 76 65     if {$::tcl_ve
b970: 72 73 69 6f 6e 20 65 71 20 5b 67 65 74 44 6f 74  rsion eq [getDot
b980: 74 65 64 56 65 72 73 69 6f 6e 20 24 74 63 6c 56  tedVersion $tclV
b990: 65 72 73 69 6f 6e 28 31 29 5d 7d 20 74 68 65 6e  ersion(1)]} then
b9a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
b9b0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
b9c0: 45 3a 20 59 65 73 2c 20 69 74 20 64 6f 65 73 2e  E: Yes, it does.
b9d0: 20 20 46 69 72 73 74 2c 20 61 64 64 20 74 68 65    First, add the
b9e0: 20 22 65 78 61 63 74 22 20 6d 61 74 63 68 0d 0a   "exact" match..
b9f0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
ba00: 20 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 54    constraint.  T
ba10: 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 6c 79  here can be only
ba20: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 2e 0d 0a   one of these...
ba30: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
ba40: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
ba50: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
ba60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ba70: 20 20 74 63 6c 20 5b 67 65 74 44 6f 74 6c 65 73    tcl [getDotles
ba80: 73 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72  sVersion $tclVer
ba90: 73 69 6f 6e 28 31 29 5d 5d 0d 0a 0d 0a 20 20 20  sion(1)]]....   
baa0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bab0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
bac0: 2c 20 70 72 6f 63 65 73 73 20 65 61 63 68 20 6f  , process each o
bad0: 66 20 74 68 65 20 22 6b 6e 6f 77 6e 22 20 54 63  f the "known" Tc
bae0: 6c 20 76 65 72 73 69 6f 6e 73 0d 0a 20 20 20 20  l versions..    
baf0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 65        #       le
bb00: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
bb10: 20 74 6f 20 74 68 65 20 72 75 6e 6e 69 6e 67 20   to the running 
bb20: 54 63 6c 20 76 65 72 73 69 6f 6e 2c 0d 0a 20 20  Tcl version,..  
bb30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
bb40: 77 68 69 6c 65 20 61 64 64 69 6e 67 20 62 6f 74  while adding bot
bb50: 68 20 74 68 65 20 22 66 65 61 74 75 72 65 22 20  h the "feature" 
bb60: 61 6e 64 20 22 6f 72 20 68 69 67 68 65 72 22 0d  and "or higher".
bb70: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
bb80: 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20     constraints. 
bb90: 20 54 68 65 72 65 20 77 69 6c 6c 20 61 6c 77 61   There will alwa
bba0: 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ys be at least o
bbb0: 6e 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ne..          # 
bbc0: 20 20 20 20 20 20 6f 66 20 74 68 65 73 65 2e 0d        of these..
bbd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
bbe0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
bbf0: 74 63 6c 56 65 72 73 69 6f 6e 28 32 29 20 5b 66  tclVersion(2) [f
bc00: 69 6c 74 65 72 4b 6e 6f 77 6e 56 65 72 73 69 6f  ilterKnownVersio
bc10: 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ns \..          
bc20: 20 20 20 20 24 74 63 6c 56 65 72 73 69 6f 6e 73      $tclVersions
bc30: 20 22 22 20 24 74 63 6c 56 65 72 73 69 6f 6e 28   "" $tclVersion(
bc40: 31 29 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  1)] {..         
bc50: 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 28 32     set version(2
bc60: 29 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65 72  ) [getDotlessVer
bc70: 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e  sion $tclVersion
bc80: 28 32 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  (2)]..          
bc90: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
bca0: 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c 20  [appendArgs tcl 
bcb0: 24 76 65 72 73 69 6f 6e 28 32 29 20 46 65 61 74  $version(2) Feat
bcc0: 75 72 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ure]..          
bcd0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
bce0: 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c 20  [appendArgs tcl 
bcf0: 24 76 65 72 73 69 6f 6e 28 32 29 20 4f 72 48 69  $version(2) OrHi
bd00: 67 68 65 72 5d 0d 0a 20 20 20 20 20 20 20 20 20  gher]..         
bd10: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
bd20: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
bd30: 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 70 72  OTE: Finally, pr
bd40: 6f 63 65 73 73 20 65 61 63 68 20 6f 66 20 74 68  ocess each of th
bd50: 65 20 22 6b 6e 6f 77 6e 22 20 54 63 6c 20 76 65  e "known" Tcl ve
bd60: 72 73 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  rsions..        
bd70: 20 20 23 20 20 20 20 20 20 20 67 72 65 61 74 65    #       greate
bd80: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
bd90: 74 6f 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 54  to the running T
bda0: 63 6c 20 76 65 72 73 69 6f 6e 2c 0d 0a 20 20 20  cl version,..   
bdb0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
bdc0: 68 69 6c 65 20 61 64 64 69 6e 67 20 74 68 65 20  hile adding the 
bdd0: 22 6f 72 20 6c 6f 77 65 72 22 20 63 6f 6e 73 74  "or lower" const
bde0: 72 61 69 6e 74 73 2e 20 20 54 68 65 72 65 0d 0a  raints.  There..
bdf0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
be00: 20 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65    will always be
be10: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
be20: 20 74 68 65 73 65 2e 0d 0a 20 20 20 20 20 20 20   these...       
be30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
be40: 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72 73 69  foreach tclVersi
be50: 6f 6e 28 33 29 20 5b 66 69 6c 74 65 72 4b 6e 6f  on(3) [filterKno
be60: 77 6e 56 65 72 73 69 6f 6e 73 20 5c 0d 0a 20 20  wnVersions \..  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 24 74 63 6c              $tcl
be80: 56 65 72 73 69 6f 6e 73 20 24 74 63 6c 56 65 72  Versions $tclVer
be90: 73 69 6f 6e 28 31 29 20 22 22 5d 20 7b 0d 0a 20  sion(1) ""] {.. 
bea0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
beb0: 65 72 73 69 6f 6e 28 33 29 20 5b 67 65 74 44 6f  ersion(3) [getDo
bec0: 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 24 74 63  tlessVersion $tc
bed0: 6c 56 65 72 73 69 6f 6e 28 33 29 5d 0d 0a 20 20  lVersion(3)]..  
bee0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
bef0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
bf00: 72 67 73 20 74 63 6c 20 24 76 65 72 73 69 6f 6e  rgs tcl $version
bf10: 28 33 29 20 4f 72 4c 6f 77 65 72 5d 0d 0a 20 20  (3) OrLower]..  
bf20: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
bf30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bf40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 72      # NOTE: Ther
bf50: 65 20 63 61 6e 20 62 65 20 6f 6e 6c 79 20 6f 6e  e can be only on
bf60: 65 20 65 78 61 63 74 20 54 63 6c 20 76 65 72 73  e exact Tcl vers
bf70: 69 6f 6e 20 6d 61 74 63 68 3b 0d 0a 20 20 20 20  ion match;..    
bf80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
bf90: 65 72 65 66 6f 72 65 2c 20 77 65 20 61 72 65 20  erefore, we are 
bfa0: 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  done...         
bfb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72   #..          br
bfc0: 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  eak..        }..
bfd0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
bfe0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
bff0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74  [appendArgs $::t
c000: 63 6c 5f 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  cl_version \n]..
c010: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c020: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c030: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
c040: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
c050: 68 65 63 6b 46 6f 72 43 6f 6d 6d 61 6e 64 20 7b  heckForCommand {
c060: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20   channel name } 
c070: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
c080: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c090: 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
c0a0: 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 20 5c 22 22   for command \""
c0b0: 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
c0c0: 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20    "\"... "].... 
c0d0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
c0e0: 3a 20 49 73 20 74 68 65 20 63 6f 6d 6d 61 6e 64  : Is the command
c0f0: 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20   available?..   
c100: 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65   #..    if {[lle
c110: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
c120: 6e 64 73 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 7d  nds $name]] > 0}
c130: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
c140: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c150: 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
c160: 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c  that it is avail
c170: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  able...      #..
c180: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
c190: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
c1a0: 63 6f 6d 6d 61 6e 64 2e 20 24 6e 61 6d 65 5d 0d  command. $name].
c1b0: 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
c1c0: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
c1d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c1e0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
c1f0: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
c200: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
c210: 65 63 6b 46 6f 72 53 75 62 43 6f 6d 6d 61 6e 64  eckForSubCommand
c220: 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 73   { channel names
c230: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
c240: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
c250: 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
c260: 69 6e 67 20 66 6f 72 20 73 75 62 2d 63 6f 6d 6d  ing for sub-comm
c270: 61 6e 64 20 5c 22 22 20 24 6e 61 6d 65 73 20 5c  and \"" $names \
c280: 0d 0a 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e  ..        "\"...
c290: 20 22 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20   "]....    #..  
c2a0: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
c2b0: 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 61 76 61   sub-command ava
c2c0: 69 6c 61 62 6c 65 3f 20 20 54 68 65 20 6c 69 73  ilable?  The lis
c2d0: 74 20 6f 66 20 6e 61 6d 65 73 20 6d 75 73 74 20  t of names must 
c2e0: 68 61 76 65 0d 0a 20 20 20 20 23 20 20 20 20 20  have..    #     
c2f0: 20 20 65 78 61 63 74 6c 79 20 74 77 6f 20 65 6c    exactly two el
c300: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 66 69 72  ements.  The fir
c310: 73 74 20 65 6c 65 6d 65 6e 74 20 6d 75 73 74 20  st element must 
c320: 62 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 0d 0a  be the command..
c330: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
c340: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
c350: 65 6c 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  element must be 
c360: 74 68 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20  the sub-command 
c370: 6e 61 6d 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  name...    #..  
c380: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
c390: 6e 61 6d 65 73 5d 20 3d 3d 20 32 7d 20 74 68 65  names] == 2} the
c3a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 63  n {..      set c
c3b0: 6f 6d 6d 61 6e 64 4e 61 6d 65 20 5b 6c 69 6e 64  ommandName [lind
c3c0: 65 78 20 24 6e 61 6d 65 73 20 30 5d 0d 0a 20 20  ex $names 0]..  
c3d0: 20 20 20 20 73 65 74 20 73 75 62 43 6f 6d 6d 61      set subComma
c3e0: 6e 64 4e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24  ndName [lindex $
c3f0: 6e 61 6d 65 73 20 31 5d 0d 0a 0d 0a 20 20 20 20  names 1]....    
c400: 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
c410: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c420: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
c430: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c440: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
c450: 72 20 45 61 67 6c 65 2c 20 75 73 65 20 74 68 65  r Eagle, use the
c460: 20 5b 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e   [info subcomman
c470: 64 73 5d 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 2e  ds] sub-command.
c480: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
c490: 20 20 20 20 20 20 20 20 20 69 6e 66 6f 20 73 75           info su
c4a0: 62 63 6f 6d 6d 61 6e 64 73 20 24 63 6f 6d 6d 61  bcommands $comma
c4b0: 6e 64 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  ndName..        
c4c0: 7d 20 73 75 62 43 6f 6d 6d 61 6e 64 73 5d 20 3d  } subCommands] =
c4d0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c4e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
c4f0: 72 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 73  rch -exact -- $s
c500: 75 62 43 6f 6d 6d 61 6e 64 73 20 24 73 75 62 43  ubCommands $subC
c510: 6f 6d 6d 61 6e 64 4e 61 6d 65 5d 20 21 3d 20 2d  ommandName] != -
c520: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
c530: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c540: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
c550: 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68  s, it appears th
c560: 61 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  at it is availab
c570: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
c580: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
c590: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
c5a0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62               sub
c5c0: 43 6f 6d 6d 61 6e 64 2e 20 24 63 6f 6d 6d 61 6e  Command. $comman
c5d0: 64 4e 61 6d 65 20 2e 20 24 73 75 62 43 6f 6d 6d  dName . $subComm
c5e0: 61 6e 64 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  andName]....    
c5f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c600: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
c610: 68 6f 77 20 74 68 61 74 20 74 68 65 20 73 75 62  how that the sub
c620: 2d 63 6f 6d 6d 61 6e 64 20 77 61 73 20 66 6f 75  -command was fou
c630: 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nd...           
c640: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
c650: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
c660: 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  es\n....        
c670: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c680: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
c690: 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
c6a0: 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
c6b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c6c0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
c6d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
c6e0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
c6f0: 65 69 66 20 7b 24 3a 3a 74 63 6c 5f 76 65 72 73  eif {$::tcl_vers
c700: 69 6f 6e 20 3e 3d 20 38 2e 35 7d 20 74 68 65 6e  ion >= 8.5} then
c710: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c720: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
c730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c740: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 54 63 6c   # NOTE: For Tcl
c750: 20 38 2e 35 2b 2c 20 75 73 65 20 74 68 65 20 5b   8.5+, use the [
c760: 6e 61 6d 65 73 70 61 63 65 20 65 6e 73 65 6d 62  namespace ensemb
c770: 6c 65 5d 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 2e  le] sub-command.
c780: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
c790: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61           namespa
c7a0: 63 65 20 65 6e 73 65 6d 62 6c 65 20 63 6f 6e 66  ce ensemble conf
c7b0: 69 67 75 72 65 20 24 63 6f 6d 6d 61 6e 64 4e 61  igure $commandNa
c7c0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 75  me..        } su
c7d0: 62 43 6f 6d 6d 61 6e 64 73 5d 20 3d 3d 20 30 7d  bCommands] == 0}
c7e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c7f0: 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65     foreach {name
c800: 20 76 61 6c 75 65 7d 20 5b 67 65 74 44 69 63 74   value} [getDict
c810: 69 6f 6e 61 72 79 56 61 6c 75 65 20 24 73 75 62  ionaryValue $sub
c820: 43 6f 6d 6d 61 6e 64 73 20 2d 6d 61 70 5d 20 7b  Commands -map] {
c830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
c840: 20 7b 24 6e 61 6d 65 20 65 71 20 24 73 75 62 43   {$name eq $subC
c850: 6f 6d 6d 61 6e 64 4e 61 6d 65 7d 20 74 68 65 6e  ommandName} then
c860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c870: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
c880: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
c890: 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
c8a0: 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
c8b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c8c0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
c8d0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
c8e0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 73 75 62 43 6f 6d 6d 61 6e 64 2e 20 24 63 6f 6d  subCommand. $com
c910: 6d 61 6e 64 4e 61 6d 65 20 2e 20 24 73 75 62 43  mandName . $subC
c920: 6f 6d 6d 61 6e 64 4e 61 6d 65 5d 0d 0a 0d 0a 20  ommandName].... 
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
c950: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
c960: 74 68 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20  the sub-command 
c970: 77 61 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20  was found...    
c980: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c990: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
c9a0: 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
c9b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
c9c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
c9d0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
c9e0: 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
c9f0: 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  rn now...       
ca00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ca10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
ca30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ca40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
ca50: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75      }....    tpu
ca60: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
ca70: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
ca80: 20 63 68 65 63 6b 46 6f 72 4e 61 6d 65 73 70 61   checkForNamespa
ca90: 63 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 71 75  ces { channel qu
caa0: 69 65 74 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  iet } {..    tpu
cab0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
cac0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6e  - checking for n
cad0: 61 6d 65 73 70 61 63 65 20 73 75 70 70 6f 72 74  amespace support
cae0: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20  ... "....    if 
caf0: 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e  {[isEagle]} then
cb00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
cb10: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
cb20: 20 69 66 20 6e 61 6d 65 73 70 61 63 65 20 73 75   if namespace su
cb30: 70 70 6f 72 74 20 77 61 73 20 63 6f 6d 70 69 6c  pport was compil
cb40: 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 65  ed into the core
cb50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
cb60: 6c 69 62 72 61 72 79 20 28 69 2e 65 2e 20 74 68  library (i.e. th
cb70: 69 73 20 69 73 20 62 65 74 61 20 33 30 20 6f 72  is is beta 30 or
cb80: 20 6c 61 74 65 72 29 2e 0d 0a 20 20 20 20 20 20   later)...      
cb90: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  #..      if {[ca
cba0: 74 63 68 20 7b 6e 61 6d 65 73 70 61 63 65 20 65  tch {namespace e
cbb0: 6e 61 62 6c 65 7d 20 65 6e 61 62 6c 65 64 5d 20  nable} enabled] 
cbc0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
cbd0: 20 20 20 20 20 20 73 65 74 20 61 76 61 69 6c 61        set availa
cbe0: 62 6c 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  ble true....    
cbf0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
cc00: 74 20 6e 61 6d 65 73 70 61 63 65 73 2e 61 76 61  t namespaces.ava
cc10: 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 7d 20  ilable..      } 
cc20: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
cc30: 73 65 74 20 61 76 61 69 6c 61 62 6c 65 20 66 61  set available fa
cc40: 6c 73 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61  lse....        a
cc50: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d  ddConstraint nam
cc60: 65 73 70 61 63 65 73 2e 75 6e 61 76 61 69 6c 61  espaces.unavaila
cc70: 62 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ble..      }....
cc80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cc90: 20 4e 4f 54 45 3a 20 57 65 20 77 65 72 65 20 61   NOTE: We were a
cca0: 62 6c 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ble to query for
ccb0: 20 6e 61 6d 65 73 70 61 63 65 20 73 75 70 70 6f   namespace suppo
ccc0: 72 74 20 28 69 2e 65 2e 20 74 68 69 73 0d 0a 20  rt (i.e. this.. 
ccd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 75 73       #       mus
cce0: 74 20 62 65 20 62 65 74 61 20 32 39 20 6f 72 20  t be beta 29 or 
ccf0: 6c 61 74 65 72 29 3b 20 68 6f 77 65 76 65 72 2c  later); however,
cd00: 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
cd10: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
cd20: 20 63 68 65 63 6b 20 69 66 20 69 74 20 68 61 73   check if it has
cd30: 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 20 61 74   been enabled at
cd40: 20 72 75 6e 74 69 6d 65 2e 0d 0a 20 20 20 20 20   runtime...     
cd50: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 65   #..      if {$e
cd60: 6e 61 62 6c 65 64 7d 20 74 68 65 6e 20 7b 0d 0a  nabled} then {..
cd70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cd80: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
cd90: 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
cda0: 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  it is available 
cdb0: 61 6e 64 20 65 6e 61 62 6c 65 64 2e 0d 0a 20 20  and enabled...  
cdc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cdd0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e   addConstraint n
cde0: 61 6d 65 73 70 61 63 65 73 0d 0a 0d 0a 20 20 20  amespaces....   
cdf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ce00: 6e 65 6c 20 65 6e 61 62 6c 65 64 5c 6e 0d 0a 20  nel enabled\n.. 
ce10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ce20: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ce30: 61 6e 6e 65 6c 20 64 69 73 61 62 6c 65 64 5c 6e  annel disabled\n
ce40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
ce50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
ce60: 68 65 63 6b 20 69 66 20 6e 61 6d 65 73 70 61 63  heck if namespac
ce70: 65 20 73 75 70 70 6f 72 74 20 77 61 73 20 63 6f  e support was co
ce80: 6d 70 69 6c 65 64 20 69 6e 74 6f 20 74 68 65 20  mpiled into the 
ce90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
cea0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 28 69        library (i
ceb0: 2e 65 2e 20 69 73 20 74 68 69 73 20 62 65 74 61  .e. is this beta
cec0: 20 33 30 20 6f 72 20 6c 61 74 65 72 29 2e 0d 0a   30 or later)...
ced0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cee0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 20 26     if {!$quiet &
cef0: 26 20 24 61 76 61 69 6c 61 62 6c 65 7d 20 74 68  & $available} th
cf00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
cf10: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
cf20: 4f 54 45 3a 20 54 68 65 20 74 65 73 74 73 20 73  OTE: The tests s
cf30: 65 65 6d 20 74 6f 20 62 65 20 72 75 6e 6e 69 6e  eem to be runnin
cf40: 67 20 77 69 74 68 20 6e 61 6d 65 73 70 61 63 65  g with namespace
cf50: 20 73 75 70 70 6f 72 74 0d 0a 20 20 20 20 20 20   support..      
cf60: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
cf70: 6c 61 62 6c 65 2c 20 62 75 74 20 64 69 73 61 62  lable, but disab
cf80: 6c 65 64 2e 20 20 45 6d 69 74 20 61 20 77 61 72  led.  Emit a war
cf90: 6e 69 6e 67 20 69 6e 74 6f 20 74 68 65 0d 0a 20  ning into the.. 
cfa0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
cfb0: 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
cfd0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
cfe0: 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
cff0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
d000: 52 4e 49 4e 47 3a 20 72 75 6e 6e 69 6e 67 20 77  RNING: running w
d010: 69 74 68 20 6e 61 6d 65 73 70 61 63 65 73 20 61  ith namespaces a
d020: 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 64 69 73  vailable and dis
d030: 61 62 6c 65 64 5c 6e 22 0d 0a 20 20 20 20 20 20  abled\n"..      
d040: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
d050: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
d060: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d070: 45 3a 20 41 6c 6c 20 73 75 70 70 6f 72 74 65 64  E: All supported
d080: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6e 61 74   versions of nat
d090: 69 76 65 20 54 63 6c 20 68 61 76 65 20 6e 61 6d  ive Tcl have nam
d0a0: 65 73 70 61 63 65 73 20 65 6e 61 62 6c 65 64 0d  espaces enabled.
d0b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
d0c0: 6e 64 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  nd available... 
d0d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 64       #..      ad
d0e0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65  dConstraint name
d0f0: 73 70 61 63 65 73 2e 61 76 61 69 6c 61 62 6c 65  spaces.available
d100: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
d110: 72 61 69 6e 74 20 6e 61 6d 65 73 70 61 63 65 73  raint namespaces
d120: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
d130: 24 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 64  $channel enabled
d140: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
d150: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
d160: 6f 72 54 65 73 74 45 78 65 63 20 7b 20 63 68 61  orTestExec { cha
d170: 6e 6e 65 6c 20 71 75 69 65 74 20 7d 20 7b 0d 0a  nnel quiet } {..
d180: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d190: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
d1a0: 67 20 66 6f 72 20 74 65 73 74 20 75 73 65 20 6f  g for test use o
d1b0: 66 20 5c 22 65 78 65 63 5c 22 20 63 6f 6d 6d 61  f \"exec\" comma
d1c0: 6e 64 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 73  nd... "....    s
d1d0: 65 74 20 70 72 6f 63 4e 61 6d 65 20 5b 6c 69 6e  et procName [lin
d1e0: 64 65 78 20 5b 69 6e 66 6f 20 6c 65 76 65 6c 20  dex [info level 
d1f0: 5b 69 6e 66 6f 20 6c 65 76 65 6c 5d 5d 20 30 5d  [info level]] 0]
d200: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e  ....    if {![in
d210: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 74  fo exists ::no(t
d220: 65 73 74 45 78 65 63 29 5d 20 26 26 20 5b 63 61  estExec)] && [ca
d230: 6e 54 65 73 74 45 78 65 63 20 24 70 72 6f 63 4e  nTestExec $procN
d240: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
d250: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
d260: 74 20 74 65 73 74 45 78 65 63 0d 0a 0d 0a 20 20  t testExec....  
d270: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d280: 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
d290: 20 20 69 66 20 7b 21 24 71 75 69 65 74 20 26 26    if {!$quiet &&
d2a0: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a   [info exists ::
d2b0: 6e 6f 28 65 78 65 63 29 5d 7d 20 74 68 65 6e 20  no(exec)]} then 
d2c0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d2d0: 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20   $channel \..   
d2e0: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
d2f0: 41 52 4e 49 4e 47 3a 20 72 75 6e 6e 69 6e 67 20  ARNING: running 
d300: 77 69 74 68 20 74 68 65 20 5c 22 74 65 73 74 45  with the \"testE
d310: 78 65 63 5c 22 20 70 72 6f 63 65 64 75 72 65 20  xec\" procedure 
d320: 64 69 73 61 62 6c 65 64 5c 6e 22 0d 0a 20 20 20  disabled\n"..   
d330: 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65     }..    } else
d340: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
d350: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
d360: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
d370: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65 73  proc checkForTes
d380: 74 4d 61 63 68 69 6e 65 20 7b 20 63 68 61 6e 6e  tMachine { chann
d390: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
d3a0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
d3b0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 65   checking for te
d3c0: 73 74 20 6d 61 63 68 69 6e 65 2e 2e 2e 20 22 0d  st machine... ".
d3d0: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
d3e0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d   exists ::test_m
d3f0: 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20  achine] && \..  
d400: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
d410: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63  ngth $::test_mac
d420: 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  hine] > 0} then 
d430: 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  {..      addCons
d440: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
d450: 67 73 20 6d 61 63 68 69 6e 65 2e 20 24 3a 3a 74  gs machine. $::t
d460: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 0d 0a 0d 0a  est_machine]....
d470: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
d480: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d490: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
d4a0: 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65   \n]..    } else
d4b0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
d4c0: 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  $channel unknown
d4d0: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
d4e0: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
d4f0: 6f 72 54 65 73 74 50 6c 61 74 66 6f 72 6d 20 7b  orTestPlatform {
d500: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
d510: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d520: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
d530: 66 6f 72 20 74 65 73 74 20 70 6c 61 74 66 6f 72  for test platfor
d540: 6d 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66  m... "....    if
d550: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
d560: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
d570: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73  && \..        [s
d580: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
d590: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e  test_platform] >
d5a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d5b0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d5c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 70 6c 61 74  [appendArgs plat
d5d0: 66 6f 72 6d 2e 20 24 3a 3a 74 65 73 74 5f 70 6c  form. $::test_pl
d5e0: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
d5f0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d600: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74  [appendArgs $::t
d610: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 5c 6e 5d  est_platform \n]
d620: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
d630: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
d640: 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
d650: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
d660: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65   proc checkForTe
d670: 73 74 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  stConfiguration 
d680: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
d690: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d6a0: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
d6b0: 20 66 6f 72 20 74 65 73 74 20 63 6f 6e 66 69 67   for test config
d6c0: 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a  uration... "....
d6d0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
d6e0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
d6f0: 69 67 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d  iguration] && \.
d700: 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67  .        [string
d710: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
d720: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
d730: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d740: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d750: 5b 61 70 70 65 6e 64 41 72 67 73 20 63 6f 6e 66  [appendArgs conf
d760: 69 67 75 72 61 74 69 6f 6e 2e 20 24 3a 3a 74 65  iguration. $::te
d770: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
d780: 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  ]....      tputs
d790: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
d7a0: 64 41 72 67 73 20 24 3a 3a 74 65 73 74 5f 63 6f  dArgs $::test_co
d7b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 6e 5d 0d  nfiguration \n].
d7c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
d7d0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d7e0: 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
d7f0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
d800: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65 73  proc checkForTes
d810: 74 53 75 66 66 69 78 20 7b 20 63 68 61 6e 6e 65  tSuffix { channe
d820: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
d830: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
d840: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 65 73  checking for tes
d850: 74 20 73 75 66 66 69 78 2e 2e 2e 20 22 0d 0a 0d  t suffix... "...
d860: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
d870: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 73 75 66  xists ::test_suf
d880: 66 69 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  fix] && \..     
d890: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
d8a0: 68 20 24 3a 3a 74 65 73 74 5f 73 75 66 66 69 78  h $::test_suffix
d8b0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
d8c0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d8d0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73  nt [appendArgs s
d8e0: 75 66 66 69 78 2e 20 24 3a 3a 74 65 73 74 5f 73  uffix. $::test_s
d8f0: 75 66 66 69 78 5d 0d 0a 0d 0a 20 20 20 20 20 20  uffix]....      
d900: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
d910: 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74 65  appendArgs $::te
d920: 73 74 5f 73 75 66 66 69 78 20 5c 6e 5d 0d 0a 20  st_suffix \n].. 
d930: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
d940: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d950: 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
d960: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
d970: 6f 63 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20  oc checkForFile 
d980: 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7b  { channel name {
d990: 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7d  constraint ""} }
d9a0: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
d9b0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
d9c0: 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  gs "---- checkin
d9d0: 67 20 66 6f 72 20 66 69 6c 65 20 5c 22 22 20 5c  g for file \"" \
d9e0: 0d 0a 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20  ..        [file 
d9f0: 6e 6f 72 6d 61 6c 69 7a 65 20 24 6e 61 6d 65 5d  normalize $name]
da00: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
da10: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
da20: 74 73 20 24 6e 61 6d 65 5d 7d 20 74 68 65 6e 20  ts $name]} then 
da30: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
da40: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
da50: 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
da60: 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
da70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
da80: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
da90: 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 20  th $constraint] 
daa0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
dab0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
dac0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
dad0: 69 6c 65 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74  ile_ $constraint
dae0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
daf0: 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
db00: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
db10: 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65  Args file_ [file
db20: 20 74 61 69 6c 20 24 6e 61 6d 65 5d 5d 0d 0a 20   tail $name]].. 
db30: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
db40: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
db50: 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65  es\n..    } else
db60: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
db70: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
db80: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
db90: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 50 61 74  proc checkForPat
dba0: 68 46 69 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20  hFile { channel 
dbb0: 6e 61 6d 65 20 7b 63 6f 6e 73 74 72 61 69 6e 74  name {constraint
dbc0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 74 70   ""} } {..    tp
dbd0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
dbe0: 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
dbf0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 69 6c 65  hecking for file
dc00: 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20   \"" $name \..  
dc10: 20 20 20 20 20 20 22 5c 22 20 61 6c 6f 6e 67 20        "\" along 
dc20: 50 41 54 48 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20  PATH... "]....  
dc30: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
dc40: 74 73 20 24 6e 61 6d 65 5d 7d 20 74 68 65 6e 20  ts $name]} then 
dc50: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
dc60: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
dc70: 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
dc80: 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 5b  t is available [
dc90: 69 6e 20 74 68 65 20 65 78 61 63 74 20 6c 6f 63  in the exact loc
dca0: 61 74 69 6f 6e 20 74 68 65 79 0d 0a 20 20 20 20  ation they..    
dcb0: 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69 66    #       specif
dcc0: 69 65 64 5d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ied]...      #..
dcd0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
dce0: 67 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73 74 72  g length $constr
dcf0: 61 69 6e 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  aint] > 0} then 
dd00: 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
dd10: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
dd20: 41 72 67 73 20 66 69 6c 65 5f 20 24 63 6f 6e 73  Args file_ $cons
dd30: 74 72 61 69 6e 74 5d 0d 0a 20 20 20 20 20 20 7d  traint]..      }
dd40: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
dd50: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
dd60: 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
dd70: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 61 6d   [file tail $nam
dd80: 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
dd90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
dda0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
ddb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ddc0: 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65  OTE: We are done
ddd0: 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f   here, return no
dde0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
ddf0: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 7d     return..    }
de00: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23   else {..      #
de10: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
de20: 55 73 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  Use the appropri
de30: 61 74 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ate environment 
de40: 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
de50: 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20   platform...    
de60: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
de70: 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
de80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
de90: 70 61 74 68 4e 61 6d 65 20 50 41 54 48 0d 0a 20  pathName PATH.. 
dea0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
deb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
dec0: 20 20 23 20 48 41 43 4b 3a 20 46 6f 72 20 73 68    # HACK: For sh
ded0: 61 72 65 64 20 6c 69 62 72 61 72 69 65 73 2c 20  ared libraries, 
dee0: 75 73 65 20 74 68 65 20 4c 44 5f 4c 49 42 52 41  use the LD_LIBRA
def0: 52 59 5f 50 41 54 48 2e 0d 0a 20 20 20 20 20 20  RY_PATH...      
df00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
df10: 7b 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e  {[file extension
df20: 20 24 6e 61 6d 65 5d 20 65 71 20 5b 69 6e 66 6f   $name] eq [info
df30: 20 73 68 61 72 65 64 6c 69 62 65 78 74 65 6e 73   sharedlibextens
df40: 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ion]} then {..  
df50: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 68          set path
df60: 4e 61 6d 65 20 4c 44 5f 4c 49 42 52 41 52 59 5f  Name LD_LIBRARY_
df70: 50 41 54 48 0d 0a 20 20 20 20 20 20 20 20 7d 20  PATH..        } 
df80: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
df90: 20 20 73 65 74 20 70 61 74 68 4e 61 6d 65 20 50    set pathName P
dfa0: 41 54 48 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ATH..        }..
dfb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dfc0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dfd0: 3a 20 49 73 20 74 68 65 20 72 65 71 75 69 72 65  : Is the require
dfe0: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
dff0: 72 69 61 62 6c 65 20 61 76 61 69 6c 61 62 6c 65  riable available
e000: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
e010: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
e020: 74 73 20 3a 3a 65 6e 76 28 24 70 61 74 68 4e 61  ts ::env($pathNa
e030: 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me)]} then {..  
e040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e050: 20 23 20 4e 4f 54 45 3a 20 4f 6b 2c 20 67 72 61   # NOTE: Ok, gra
e060: 62 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  b it now...     
e070: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
e080: 74 20 70 61 74 68 20 24 3a 3a 65 6e 76 28 24 70  t path $::env($p
e090: 61 74 68 4e 61 6d 65 29 0d 0a 0d 0a 20 20 20 20  athName)....    
e0a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e0b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 61   NOTE: Use the a
e0c0: 70 70 72 6f 70 72 69 61 74 65 20 70 61 74 68 20  ppropriate path 
e0d0: 73 65 70 61 72 61 74 6f 72 20 66 6f 72 20 74 68  separator for th
e0e0: 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20  e platform...   
e0f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e100: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
e110: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
e120: 70 61 74 68 53 65 70 61 72 61 74 6f 72 29 5d 7d  pathSeparator)]}
e130: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e140: 20 20 20 73 65 74 20 73 65 70 61 72 61 74 6f 72     set separator
e150: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
e160: 28 70 61 74 68 53 65 70 61 72 61 74 6f 72 29 0d  (pathSeparator).
e170: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69  .        } elsei
e180: 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  f {[isWindows]} 
e190: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e1a0: 20 20 73 65 74 20 73 65 70 61 72 61 74 6f 72 20    set separator 
e1b0: 5c 3b 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  \;..        } el
e1c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
e1d0: 73 65 74 20 73 65 70 61 72 61 74 6f 72 20 3a 0d  set separator :.
e1e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
e1f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e200: 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 6a 75   # NOTE: Grab ju
e210: 73 74 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  st the file name
e220: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 73 69 62   from the possib
e230: 6c 79 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ly fully qualifi
e240: 65 64 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ed file..       
e250: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 70 72   #       name pr
e260: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 61  ovided by the ca
e270: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  ller...        #
e280: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
e290: 69 6c 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e  il [file tail $n
e2a0: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
e2b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e2c0: 45 3a 20 43 68 65 63 6b 20 65 61 63 68 20 64 69  E: Check each di
e2d0: 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 50  rectory in the P
e2e0: 41 54 48 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ATH for the file
e2f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
e300: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
e310: 72 65 63 74 6f 72 79 20 5b 73 70 6c 69 74 20 24  rectory [split $
e320: 70 61 74 68 20 24 73 65 70 61 72 61 74 6f 72 5d  path $separator]
e330: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
e340: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
e350: 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
e360: 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 64 69   file in this di
e370: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 65  rectory containe
e380: 64 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  d in the PATH...
e390: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
e3a0: 20 20 54 68 69 73 20 73 74 72 69 70 73 20 74 68    This strips th
e3b0: 65 20 64 69 72 65 63 74 6f 72 79 20 70 6f 72 74  e directory port
e3c0: 69 6f 6e 20 6f 66 66 20 74 68 65 20 66 69 6c 65  ion off the file
e3d0: 20 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64 0d   name specified.
e3e0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
e3f0: 20 20 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72     by the caller
e400: 2c 20 69 66 20 61 6e 79 2c 20 62 65 66 6f 72 65  , if any, before
e410: 20 6a 6f 69 6e 69 6e 67 20 74 68 61 74 20 66 69   joining that fi
e420: 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 0d 0a  le name to the..
e430: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
e440: 20 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74    current direct
e450: 6f 72 79 20 6f 66 20 74 68 65 20 50 41 54 48 20  ory of the PATH 
e460: 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 0d  being searched..
e470: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
e480: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
e490: 65 20 65 78 69 73 74 73 20 5b 66 69 6c 65 20 6a  e exists [file j
e4a0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 24  oin $directory $
e4b0: 74 61 69 6c 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tail]]} then {..
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
e4e0: 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61  E: Yes, it appea
e4f0: 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76  rs that it is av
e500: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 50  ailable in the P
e510: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ATH...          
e520: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
e530: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
e540: 67 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d  gth $constraint]
e550: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
e560: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
e570: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
e580: 64 41 72 67 73 20 66 69 6c 65 5f 20 24 63 6f 6e  dArgs file_ $con
e590: 73 74 72 61 69 6e 74 5d 0d 0a 20 20 20 20 20 20  straint]..      
e5a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
e5c0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
e5d0: 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66  endArgs file_ [f
e5e0: 69 6c 65 20 74 61 69 6c 20 24 6e 61 6d 65 5d 5d  ile tail $name]]
e5f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
e600: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ...            t
e610: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
e620: 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  s\n....         
e630: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e640: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
e650: 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
e660: 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  rn now...       
e670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e680: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
e690: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e6a0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
e6b0: 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20   }....    tputs 
e6c0: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
e6d0: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
e6e0: 65 63 6b 46 6f 72 4e 61 74 69 76 65 43 6f 64 65  eckForNativeCode
e6f0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
e700: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
e710: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
e720: 67 20 66 6f 72 20 6e 61 74 69 76 65 20 63 6f 64  g for native cod
e730: 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66  e... "....    if
e740: 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
e750: 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  n {..      if {[
e760: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61  info exists ::ea
e770: 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6d  gle_platform(com
e780: 70 69 6c 65 4f 70 74 69 6f 6e 73 29 5d 20 26 26  pileOptions)] &&
e790: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69   \..          [i
e7a0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
e7b0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
e7c0: 72 6d 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  rm)] && \..     
e7d0: 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65       [lsearch -e
e7e0: 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 3a 3a  xact -nocase $::
e7f0: 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63  eagle_platform(c
e800: 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29 20 5c  ompileOptions) \
e810: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74  ..          $::t
e820: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
e830: 66 6f 72 6d 29 5d 20 21 3d 20 2d 31 7d 20 74 68  form)] != -1} th
e840: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
e850: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
e860: 20 59 65 73 2c 20 74 68 65 20 62 69 6e 61 72 79   Yes, the binary
e870: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 75 72   matches the cur
e880: 72 65 6e 74 20 70 6c 61 74 66 6f 72 6d 2c 0d 0a  rent platform,..
e890: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e8a0: 6e 61 74 69 76 65 20 63 6f 64 65 20 63 61 6e 20  native code can 
e8b0: 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  be used...      
e8c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
e8d0: 43 6f 6e 73 74 72 61 69 6e 74 20 6e 61 74 69 76  Constraint nativ
e8e0: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e....        tpu
e8f0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
e900: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
e910: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
e920: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
e930: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65        }..    } e
e940: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  lse {..      #..
e950: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 63        # NOTE: Tc
e960: 6c 20 69 73 20 61 6c 77 61 79 73 20 6e 61 74 69  l is always nati
e970: 76 65 20 63 6f 64 65 20 61 6e 64 20 63 61 6e 20  ve code and can 
e980: 61 6c 77 61 79 73 20 65 78 65 63 75 74 65 20 6e  always execute n
e990: 61 74 69 76 65 20 63 6f 64 65 2e 0d 0a 20 20 20  ative code...   
e9a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 61 64 64 43     #..      addC
e9b0: 6f 6e 73 74 72 61 69 6e 74 20 6e 61 74 69 76 65  onstraint native
e9c0: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
e9d0: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
e9e0: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
e9f0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69   proc checkForTi
ea00: 70 31 32 37 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  p127 { channel }
ea10: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
ea20: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
ea30: 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20 23 31  cking for TIP #1
ea40: 32 37 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23  27... "....    #
ea50: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73  ..    # NOTE: Is
ea60: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ea70: 20 54 49 50 20 23 31 32 37 20 72 65 61 64 79 3f   TIP #127 ready?
ea80: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
ea90: 7b 5b 63 61 74 63 68 20 7b 6c 73 65 61 72 63 68  {[catch {lsearch
eaa0: 20 2d 69 6e 64 65 78 20 30 20 30 20 30 7d 5d 20   -index 0 0 0}] 
eab0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
eac0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
ead0: 74 20 74 69 70 31 32 37 0d 0a 0d 0a 20 20 20 20  t tip127....    
eae0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
eaf0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c   yes\n..    } el
eb00: 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  se {..      tput
eb10: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
eb20: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
eb30: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54    proc checkForT
eb40: 69 70 31 39 34 20 7b 20 63 68 61 6e 6e 65 6c 20  ip194 { channel 
eb50: 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
eb60: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
eb70: 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20 23  ecking for TIP #
eb80: 31 39 34 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  194... "....    
eb90: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  #..    # NOTE: I
eba0: 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  s the interprete
ebb0: 72 20 54 49 50 20 23 31 39 34 20 72 65 61 64 79  r TIP #194 ready
ebc0: 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 63 61  ?..    #..    ca
ebd0: 74 63 68 20 7b 61 70 70 6c 79 7d 20 65 72 72 6f  tch {apply} erro
ebe0: 72 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 24 65 72  r....    if {$er
ebf0: 72 6f 72 20 6e 65 20 7b 69 6e 76 61 6c 69 64 20  ror ne {invalid 
ec00: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 22 61 70  command name "ap
ec10: 70 6c 79 22 7d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ply"}} then {.. 
ec20: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
ec30: 6e 74 20 74 69 70 31 39 34 0d 0a 0d 0a 20 20 20  nt tip194....   
ec40: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ec50: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
ec60: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
ec70: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
ec80: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
ec90: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
eca0: 54 69 70 32 30 37 20 7b 20 63 68 61 6e 6e 65 6c  Tip207 { channel
ecb0: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
ecc0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
ecd0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20  hecking for TIP 
ece0: 23 32 30 37 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  #207... "....   
ecf0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
ed00: 49 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  Is the interpret
ed10: 65 72 20 54 49 50 20 23 32 30 37 20 72 65 61 64  er TIP #207 read
ed20: 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 63  y?..    #..    c
ed30: 61 74 63 68 20 7b 69 6e 74 65 72 70 20 69 6e 76  atch {interp inv
ed40: 6f 6b 65 68 69 64 64 65 6e 20 7b 7d 20 2d 6e 61  okehidden {} -na
ed50: 6d 65 73 70 61 63 65 20 2d 2d 20 69 6e 66 6f 7d  mespace -- info}
ed60: 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 69 66   error....    if
ed70: 20 7b 21 5b 73 74 72 69 6e 67 20 6d 61 74 63 68   {![string match
ed80: 20 7b 62 61 64 20 6f 70 74 69 6f 6e 20 22 2d 6e   {bad option "-n
ed90: 61 6d 65 73 70 61 63 65 22 3a 20 2a 7d 20 24 65  amespace": *} $e
eda0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
edb0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
edc0: 6e 74 20 74 69 70 32 30 37 0d 0a 0d 0a 20 20 20  nt tip207....   
edd0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ede0: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
edf0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
ee00: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
ee10: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
ee20: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
ee30: 54 69 70 32 34 31 20 7b 20 63 68 61 6e 6e 65 6c  Tip241 { channel
ee40: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
ee50: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
ee60: 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20  hecking for TIP 
ee70: 23 32 34 31 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  #241... "....   
ee80: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
ee90: 49 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  Is the interpret
eea0: 65 72 20 54 49 50 20 23 32 34 31 20 72 65 61 64  er TIP #241 read
eeb0: 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  y?..    #..    i
eec0: 66 20 7b 5b 63 61 74 63 68 20 7b 6c 73 65 61 72  f {[catch {lsear
eed0: 63 68 20 2d 6e 6f 63 61 73 65 20 30 20 30 7d 5d  ch -nocase 0 0}]
eee0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
eef0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
ef00: 6e 74 20 74 69 70 32 34 31 0d 0a 0d 0a 20 20 20  nt tip241....   
ef10: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ef20: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
ef30: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
ef40: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
ef50: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
ef60: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
ef70: 54 69 70 32 38 35 20 7b 20 63 68 61 6e 6e 65 6c  Tip285 { channel
ef80: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
ef90: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
efa0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20  hecking for TIP 
efb0: 23 32 38 35 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  #285... "....   
efc0: 20 69 66 20 7b 5b 61 6c 77 61 79 73 46 75 6c 6c   if {[alwaysFull
efd0: 49 6e 74 65 72 70 52 65 61 64 79 5d 7d 20 74 68  InterpReady]} th
efe0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
eff0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
f000: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
f010: 54 49 50 20 23 32 38 35 20 72 65 61 64 79 3f 0d  TIP #285 ready?.
f020: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f030: 63 61 74 63 68 20 7b 69 6e 74 65 72 70 20 63 61  catch {interp ca
f040: 6e 63 65 6c 7d 20 65 72 72 6f 72 0d 0a 0d 0a 20  ncel} error.... 
f050: 20 20 20 20 20 69 66 20 7b 24 65 72 72 6f 72 20       if {$error 
f060: 65 71 20 22 65 76 61 6c 20 63 61 6e 63 65 6c 65  eq "eval cancele
f070: 64 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d"} then {..    
f080: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
f090: 74 20 74 69 70 32 38 35 0d 0a 0d 0a 20 20 20 20  t tip285....    
f0a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f0b0: 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
f0c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f0d0: 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f   NOTE: We are do
f0e0: 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20  ne here, return 
f0f0: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
f100: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
f110: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
f120: 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  ...    tputs $ch
f130: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d  annel no\n..  }.
f140: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
f150: 46 6f 72 54 69 70 34 30 35 20 7b 20 63 68 61 6e  ForTip405 { chan
f160: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  nel } {..    tpu
f170: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
f180: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54  - checking for T
f190: 49 50 20 23 34 30 35 2e 2e 2e 20 22 0d 0a 0d 0a  IP #405... "....
f1a0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
f1b0: 45 3a 20 44 6f 65 73 20 74 68 65 20 69 6e 74 65  E: Does the inte
f1c0: 72 70 72 65 74 65 72 20 68 61 76 65 20 54 49 50  rpreter have TIP
f1d0: 20 23 34 30 35 20 28 69 2e 65 2e 20 5b 6c 6d 61   #405 (i.e. [lma
f1e0: 70 5d 29 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20  p])?..    #..   
f1f0: 20 63 61 74 63 68 20 7b 6c 6d 61 70 7d 20 65 72   catch {lmap} er
f200: 72 6f 72 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 24  ror....    if {$
f210: 65 72 72 6f 72 20 6e 65 20 22 69 6e 76 61 6c 69  error ne "invali
f220: 64 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 5c  d command name \
f230: 22 6c 6d 61 70 5c 22 22 7d 20 74 68 65 6e 20 7b  "lmap\""} then {
f240: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
f250: 72 61 69 6e 74 20 74 69 70 34 30 35 0d 0a 0d 0a  raint tip405....
f260: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f270: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
f280: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f290: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
f2a0: 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  o\n..    }..  }.
f2b0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
f2c0: 46 6f 72 54 69 70 34 32 31 20 7b 20 63 68 61 6e  ForTip421 { chan
f2d0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  nel } {..    tpu
f2e0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
f2f0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54  - checking for T
f300: 49 50 20 23 34 32 31 2e 2e 2e 20 22 0d 0a 0d 0a  IP #421... "....
f310: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
f320: 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65 72 70  E: Is the interp
f330: 72 65 74 65 72 20 54 49 50 20 23 34 32 31 20 72  reter TIP #421 r
f340: 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  eady?..    #..  
f350: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
f360: 20 20 20 20 20 20 73 65 74 20 61 72 72 61 79 28        set array(
f370: 31 29 20 6f 6e 65 3b 20 73 65 74 20 6c 69 73 74  1) one; set list
f380: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
f390: 20 61 72 72 61 79 20 66 6f 72 20 7b 6e 61 6d 65   array for {name
f3a0: 20 76 61 6c 75 65 7d 20 61 72 72 61 79 20 7b 0d   value} array {.
f3b0: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
f3c0: 20 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 6c   list $name $val
f3d0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
f3e0: 20 20 20 20 20 73 65 74 20 6c 69 73 74 0d 0a 20       set list.. 
f3f0: 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
f400: 30 20 26 26 20 24 72 65 73 75 6c 74 20 65 71 20  0 && $result eq 
f410: 5b 6c 69 73 74 20 31 20 6f 6e 65 5d 7d 20 74 68  [list 1 one]} th
f420: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43  en {..      addC
f430: 6f 6e 73 74 72 61 69 6e 74 20 74 69 70 34 32 31  onstraint tip421
f440: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
f450: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
f460: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f470: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f480: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
f490: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
f4a0: 68 65 63 6b 46 6f 72 54 69 70 34 32 36 20 7b 20  heckForTip426 { 
f4b0: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
f4c0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f4d0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
f4e0: 6f 72 20 54 49 50 20 23 34 32 36 2e 2e 2e 20 22  or TIP #426... "
f4f0: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
f500: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e   NOTE: Is the in
f510: 74 65 72 70 72 65 74 65 72 20 54 49 50 20 23 34  terpreter TIP #4
f520: 32 36 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23  26 ready?..    #
f530: 0d 0a 20 20 20 20 63 61 74 63 68 20 7b 69 6e 66  ..    catch {inf
f540: 6f 20 63 6d 64 74 79 70 65 7d 20 65 72 72 6f 72  o cmdtype} error
f550: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 24 65 72 72  ....    if {$err
f560: 6f 72 20 65 71 20 7b 77 72 6f 6e 67 20 23 20 61  or eq {wrong # a
f570: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
f580: 69 6e 66 6f 20 63 6d 64 74 79 70 65 20 63 6f 6d  info cmdtype com
f590: 6d 61 6e 64 4e 61 6d 65 22 7d 7d 20 74 68 65 6e  mandName"}} then
f5a0: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
f5b0: 73 74 72 61 69 6e 74 20 74 69 70 34 32 36 0d 0a  straint tip426..
f5c0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
f5d0: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
f5e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f5f0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f600: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
f610: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
f620: 63 6b 46 6f 72 54 69 70 34 32 39 20 7b 20 63 68  ckForTip429 { ch
f630: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
f640: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
f650: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
f660: 20 54 49 50 20 23 34 32 39 2e 2e 2e 20 22 0d 0a   TIP #429... "..
f670: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
f680: 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65  OTE: Is the inte
f690: 72 70 72 65 74 65 72 20 54 49 50 20 23 34 32 39  rpreter TIP #429
f6a0: 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a   ready?..    #..
f6b0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
f6c0: 73 74 72 69 6e 67 20 63 61 74 7d 5d 20 3d 3d 20  string cat}] == 
f6d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f6e0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74   addConstraint t
f6f0: 69 70 34 32 39 0d 0a 0d 0a 20 20 20 20 20 20 74  ip429....      t
f700: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
f710: 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
f720: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
f730: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
f740: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
f750: 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 70 34  roc checkForTip4
f760: 34 30 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  40 { channel } {
f770: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
f780: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
f790: 69 6e 67 20 66 6f 72 20 54 49 50 20 23 34 34 30  ing for TIP #440
f7a0: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
f7b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
f7c0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 54  he interpreter T
f7d0: 49 50 20 23 34 34 30 20 72 65 61 64 79 3f 0d 0a  IP #440 ready?..
f7e0: 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
f7f0: 63 61 74 63 68 20 7b 73 65 74 20 3a 3a 74 63 6c  catch {set ::tcl
f800: 5f 70 6c 61 74 66 6f 72 6d 28 65 6e 67 69 6e 65  _platform(engine
f810: 29 7d 20 65 6e 67 69 6e 65 5d 20 3d 3d 20 30 7d  )} engine] == 0}
f820: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
f830: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70  ddConstraint tip
f840: 34 34 30 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  440....      tpu
f850: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
f860: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
f870: 24 65 6e 67 69 6e 65 20 22 29 5c 6e 22 5d 0d 0a  $engine ")\n"]..
f880: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f890: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f8a0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
f8b0: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
f8c0: 68 65 63 6b 46 6f 72 54 69 70 34 36 31 20 7b 20  heckForTip461 { 
f8d0: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
f8e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f8f0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
f900: 6f 72 20 54 49 50 20 23 34 36 31 2e 2e 2e 20 22  or TIP #461... "
f910: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
f920: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e   NOTE: Is the in
f930: 74 65 72 70 72 65 74 65 72 20 54 49 50 20 23 34  terpreter TIP #4
f940: 36 31 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23  61 ready?..    #
f950: 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68  ..    if {[catch
f960: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78   {..      set ex
f970: 70 72 28 67 65 29 20 7b 69 6e 74 28 22 61 62 63  pr(ge) {int("abc
f980: 22 20 67 65 20 22 61 62 63 22 29 7d 0d 0a 20 20  " ge "abc")}..  
f990: 20 20 20 20 73 65 74 20 65 78 70 72 28 67 74 29      set expr(gt)
f9a0: 20 7b 69 6e 74 28 22 61 62 63 22 20 67 74 20 22   {int("abc" gt "
f9b0: 61 62 63 22 29 7d 0d 0a 20 20 20 20 20 20 73 65  abc")}..      se
f9c0: 74 20 65 78 70 72 28 6c 65 29 20 7b 69 6e 74 28  t expr(le) {int(
f9d0: 22 61 62 63 22 20 6c 65 20 22 61 62 63 22 29 7d  "abc" le "abc")}
f9e0: 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 70 72  ..      set expr
f9f0: 28 6c 74 29 20 7b 69 6e 74 28 22 61 62 63 22 20  (lt) {int("abc" 
fa00: 6c 74 20 22 61 62 63 22 29 7d 0d 0a 0d 0a 20 20  lt "abc")}....  
fa10: 20 20 20 20 6c 69 73 74 20 5b 65 78 70 72 20 24      list [expr $
fa20: 65 78 70 72 28 67 65 29 5d 20 5b 65 78 70 72 20  expr(ge)] [expr 
fa30: 24 65 78 70 72 28 67 74 29 5d 20 5c 0d 0a 20 20  $expr(gt)] \..  
fa40: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 24 65          [expr $e
fa50: 78 70 72 28 6c 65 29 5d 20 5b 65 78 70 72 20 24  xpr(le)] [expr $
fa60: 65 78 70 72 28 6c 74 29 5d 0d 0a 20 20 20 20 7d  expr(lt)]..    }
fa70: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
fa80: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
fa90: 69 6e 74 20 74 69 70 34 36 31 0d 0a 0d 0a 20 20  int tip461....  
faa0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
fab0: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20  el yes\n..    } 
fac0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70  else {..      tp
fad0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
fae0: 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  n..    }..  }...
faf0: 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
fb00: 72 54 69 70 34 36 33 20 7b 20 63 68 61 6e 6e 65  rTip463 { channe
fb10: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
fb20: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
fb30: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50  checking for TIP
fb40: 20 23 34 36 33 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   #463... "....  
fb50: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
fb60: 20 49 73 20 74 68 65 20 69 6e 74 65 72 70 72 65   Is the interpre
fb70: 74 65 72 20 54 49 50 20 23 34 36 33 20 72 65 61  ter TIP #463 rea
fb80: 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  dy?..    #..    
fb90: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
fba0: 20 20 20 20 72 65 67 73 75 62 20 2d 63 6f 6d 6d      regsub -comm
fbb0: 61 6e 64 20 2e 20 2e 20 6c 69 73 74 0d 0a 20 20  and . . list..  
fbc0: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
fbd0: 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  {..      addCons
fbe0: 74 72 61 69 6e 74 20 74 69 70 34 36 33 0d 0a 0d  traint tip463...
fbf0: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
fc00: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
fc10: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
fc20: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
fc30: 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  no\n..    }..  }
fc40: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
fc50: 6b 46 6f 72 54 69 70 34 37 31 20 7b 20 63 68 61  kForTip471 { cha
fc60: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
fc70: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
fc80: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fc90: 54 49 50 20 23 34 37 31 2e 2e 2e 20 22 0d 0a 0d  TIP #471... "...
fca0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
fcb0: 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65 72  TE: Is the inter
fcc0: 70 72 65 74 65 72 20 54 49 50 20 23 34 37 31 20  preter TIP #471 
fcd0: 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20  ready?..    #.. 
fce0: 20 20 20 63 61 74 63 68 20 7b 69 6e 66 6f 20 6c     catch {info l
fcf0: 69 6e 6b 65 64 6e 61 6d 65 7d 20 65 72 72 6f 72  inkedname} error
fd00: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  ....    if {[str
fd10: 69 6e 67 20 6d 61 74 63 68 20 7b 77 72 6f 6e 67  ing match {wrong
fd20: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
fd30: 62 65 20 22 2a 7d 20 24 65 72 72 6f 72 5d 7d 20  be "*} $error]} 
fd40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
fd50: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70 34  dConstraint tip4
fd60: 37 31 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  71....      tput
fd70: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
fd80: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
fd90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fda0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d  nnel no\n..    }
fdb0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
fdc0: 20 63 68 65 63 6b 46 6f 72 54 69 6d 69 6e 67 20   checkForTiming 
fdd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  {..          cha
fde0: 6e 6e 65 6c 20 74 68 72 65 73 68 6f 6c 64 20 7b  nnel threshold {
fdf0: 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7b  constraint ""} {
fe00: 74 72 69 65 73 20 31 7d 20 7b 64 65 6c 61 79 20  tries 1} {delay 
fe10: 31 30 30 30 7d 0d 0a 20 20 20 20 20 20 20 20 20  1000}..         
fe20: 20 7b 61 76 65 72 61 67 65 20 66 61 6c 73 65 7d   {average false}
fe30: 20 7b 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66   {asynchronous f
fe40: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 74  alse} } {..    t
fe50: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
fe60: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
fe70: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
fe80: 69 6e 67 20 66 6f 72 20 70 72 65 63 69 73 69 6f  ing for precisio
fe90: 6e 20 74 69 6d 69 6e 67 20 28 74 68 72 65 73 68  n timing (thresh
fea0: 6f 6c 64 20 6f 66 20 22 20 24 74 68 72 65 73 68  old of " $thresh
feb0: 6f 6c 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 22  old \..        "
fec0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 20 5b   milliseconds" [
fed0: 65 78 70 72 20 7b 24 61 76 65 72 61 67 65 20 3f  expr {$average ?
fee0: 20 22 20 61 76 65 72 61 67 65 22 20 3a 20 22 22   " average" : ""
fef0: 7d 5d 20 22 2c 20 64 65 6c 61 79 20 6f 66 20 22  }] ", delay of "
ff00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 64 65 6c   \..        $del
ff10: 61 79 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  ay " millisecond
ff20: 73 29 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  s)... "]....    
ff30: 23 0d 0a 20 20 20 20 23 20 48 41 43 4b 3a 20 53  #..    # HACK: S
ff40: 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 66 69 72  ometimes the fir
ff50: 73 74 20 74 72 79 20 74 61 6b 65 73 20 71 75 69  st try takes qui
ff60: 74 65 20 61 20 62 69 74 20 6c 6f 6e 67 65 72 20  te a bit longer 
ff70: 74 68 61 6e 20 73 75 62 73 65 71 75 65 6e 74 0d  than subsequent.
ff80: 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 72 69  .    #       tri
ff90: 65 73 2e 20 20 57 65 20 61 74 74 65 6d 70 74 20  es.  We attempt 
ffa0: 74 6f 20 62 79 70 61 73 73 20 74 68 69 73 20 70  to bypass this p
ffb0: 72 6f 62 6c 65 6d 20 62 79 20 72 65 74 72 79 69  roblem by retryi
ffc0: 6e 67 20 61 20 73 65 74 20 6e 75 6d 62 65 72 0d  ng a set number.
ffd0: 0a 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20  .    #       of 
ffe0: 74 69 6d 65 73 20 28 77 68 69 63 68 20 63 61 6e  times (which can
fff0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
10000 79 20 74 68 65 20 63 61 6c 6c 65 72 29 20 62 65  y the caller) be
10010 66 6f 72 65 20 67 69 76 69 6e 67 20 75 70 2e 0d  fore giving up..
10020 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20  .    #..    set 
10030 74 6f 74 61 6c 20 30 0d 0a 20 20 20 20 73 65 74  total 0..    set
10040 20 64 69 66 66 65 72 65 6e 63 65 20 75 6e 6b 6e   difference unkn
10050 6f 77 6e 0d 0a 0d 0a 20 20 20 20 66 6f 72 20 7b  own....    for {
10060 73 65 74 20 74 72 79 20 30 7d 20 7b 24 74 72 79  set try 0} {$try
10070 20 3c 20 24 74 72 69 65 73 7d 20 7b 69 6e 63 72   < $tries} {incr
10080 20 74 72 79 7d 20 7b 0d 0a 20 20 20 20 20 20 23   try} {..      #
10090 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
100a0 43 72 65 61 74 65 20 61 20 73 63 72 69 70 74 20  Create a script 
100b0 74 68 61 74 20 77 69 6c 6c 20 73 65 74 20 74 68  that will set th
100c0 65 20 66 69 6e 61 6c 20 63 6c 69 63 6b 73 20 76  e final clicks v
100d0 61 6c 75 65 2e 20 20 54 68 69 73 20 6d 75 73 74  alue.  This must
100e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
100f0 75 73 65 20 61 20 67 6c 6f 62 61 6c 20 76 61 72  use a global var
10100 69 61 62 6c 65 20 64 75 65 20 74 6f 20 74 68 65  iable due to the
10110 20 6e 61 74 75 72 65 20 6f 66 20 5b 61 66 74 65   nature of [afte
10120 72 5d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  r]...      #..  
10130 20 20 20 20 73 65 74 20 73 74 6f 70 53 63 72 69      set stopScri
10140 70 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  pt {..        se
10150 74 20 3a 3a 73 74 6f 70 43 6c 69 63 6b 73 20 5b  t ::stopClicks [
10160 65 78 70 72 20 7b 5b 63 6c 6f 63 6b 20 63 6c 69  expr {[clock cli
10170 63 6b 73 20 2d 6d 69 6c 6c 69 73 65 63 6f 6e 64  cks -millisecond
10180 73 5d 20 26 20 30 78 37 66 66 66 66 66 66 66 7d  s] & 0x7fffffff}
10190 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
101a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
101b0 4f 54 45 3a 20 53 65 74 20 74 68 65 20 69 6e 69  OTE: Set the ini
101c0 74 69 61 6c 20 63 6c 69 63 6b 73 20 76 61 6c 75  tial clicks valu
101d0 65 20 61 6e 64 20 74 68 65 6e 20 61 74 74 65 6d  e and then attem
101e0 70 74 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61  pt to wait for a
101f0 62 6f 75 74 0d 0a 20 20 20 20 20 20 23 20 20 20  bout..      #   
10200 20 20 20 20 6f 6e 65 20 73 65 63 6f 6e 64 2c 20      one second, 
10210 65 69 74 68 65 72 20 73 79 6e 63 68 72 6f 6e 6f  either synchrono
10220 75 73 6c 79 20 6f 72 20 61 73 79 6e 63 68 72 6f  usly or asynchro
10230 6e 6f 75 73 6c 79 2c 20 64 65 70 65 6e 64 69 6e  nously, dependin
10240 67 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  g on..      #   
10250 20 20 20 20 74 68 65 20 70 72 65 66 65 72 65 6e      the preferen
10260 63 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ce of the caller
10270 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10280 20 20 73 65 74 20 73 74 61 72 74 20 5b 65 78 70    set start [exp
10290 72 20 7b 5b 63 6c 6f 63 6b 20 63 6c 69 63 6b 73  r {[clock clicks
102a0 20 2d 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5d 20   -milliseconds] 
102b0 26 20 30 78 37 66 66 66 66 66 66 66 7d 5d 0d 0a  & 0x7fffffff}]..
102c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 73 79  ..      if {$asy
102d0 6e 63 68 72 6f 6e 6f 75 73 7d 20 74 68 65 6e 20  nchronous} then 
102e0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  {..        set e
102f0 76 65 6e 74 20 5b 61 66 74 65 72 20 24 64 65 6c  vent [after $del
10300 61 79 20 24 73 74 6f 70 53 63 72 69 70 74 5d 3b  ay $stopScript];
10310 20 76 77 61 69 74 20 3a 3a 73 74 6f 70 43 6c 69   vwait ::stopCli
10320 63 6b 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  cks..      } els
10330 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 66 74  e {..        aft
10340 65 72 20 24 64 65 6c 61 79 3b 20 65 76 61 6c 20  er $delay; eval 
10350 24 73 74 6f 70 53 63 72 69 70 74 0d 0a 20 20 20  $stopScript..   
10360 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
10370 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d  .      # NOTE: M
10380 6f 76 65 20 74 68 65 20 66 69 6e 61 6c 20 63 6c  ove the final cl
10390 69 63 6b 73 20 76 61 6c 75 65 20 66 72 6f 6d 20  icks value from 
103a0 74 68 65 20 67 6c 6f 62 61 6c 20 66 72 61 6d 65  the global frame
103b0 20 74 6f 20 74 68 69 73 20 6f 6e 65 2e 0d 0a 20   to this one... 
103c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
103d0 74 20 73 74 6f 70 20 24 3a 3a 73 74 6f 70 43 6c  t stop $::stopCl
103e0 69 63 6b 73 3b 20 75 6e 73 65 74 20 3a 3a 73 74  icks; unset ::st
103f0 6f 70 43 6c 69 63 6b 73 0d 0a 0d 0a 20 20 20 20  opClicks....    
10400 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10410 45 3a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  E: Calculate the
10420 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
10430 65 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 61  een the actual a
10440 6e 64 20 65 78 70 65 63 74 65 64 0d 0a 20 20 20  nd expected..   
10450 20 20 20 23 20 20 20 20 20 20 20 6e 75 6d 62 65     #       numbe
10460 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
10470 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
10480 20 20 20 73 65 74 20 64 69 66 66 65 72 65 6e 63     set differenc
10490 65 20 5b 65 78 70 72 20 7b 61 62 73 28 24 73 74  e [expr {abs($st
104a0 6f 70 20 2d 20 24 73 74 61 72 74 20 2d 20 24 64  op - $start - $d
104b0 65 6c 61 79 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20  elay)}]....     
104c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
104d0 3a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  : Keep track of 
104e0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
104f0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
10500 20 65 6c 61 70 73 65 64 20 66 6f 72 0d 0a 20 20   elapsed for..  
10510 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 6c 20      #       all 
10520 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
10530 69 73 20 6c 6f 6f 70 2e 0d 0a 20 20 20 20 20 20  is loop...      
10540 23 0d 0a 20 20 20 20 20 20 69 6e 63 72 20 74 6f  #..      incr to
10550 74 61 6c 20 24 64 69 66 66 65 72 65 6e 63 65 0d  tal $difference.
10560 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10570 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 77 65 20    # NOTE: If we 
10580 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 61 76  are using the av
10590 65 72 61 67 65 20 64 69 66 66 65 72 65 6e 63 65  erage difference
105a0 2c 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6e 6f  , handle that no
105b0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
105c0 20 20 20 69 66 20 7b 24 61 76 65 72 61 67 65 20     if {$average 
105d0 26 26 20 24 74 72 69 65 73 20 3e 20 31 7d 20 74  && $tries > 1} t
105e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
105f0 65 74 20 64 69 66 66 65 72 65 6e 63 65 20 5b 65  et difference [e
10600 78 70 72 20 7b 24 74 6f 74 61 6c 20 2f 20 24 74  xpr {$total / $t
10610 72 69 65 73 7d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ries}]..      }.
10620 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10630 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65    # NOTE: Are we
10640 20 77 69 74 68 69 6e 20 74 68 65 20 74 68 72 65   within the thre
10650 73 68 6f 6c 64 20 73 70 65 63 69 66 69 65 64 20  shold specified 
10660 62 79 20 74 68 65 20 63 61 6c 6c 65 72 3f 0d 0a  by the caller?..
10670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
10680 66 20 7b 24 64 69 66 66 65 72 65 6e 63 65 20 3e  f {$difference >
10690 3d 20 30 20 26 26 20 24 64 69 66 66 65 72 65 6e  = 0 && $differen
106a0 63 65 20 3c 3d 20 24 74 68 72 65 73 68 6f 6c 64  ce <= $threshold
106b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
106c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
106d0 4f 54 45 3a 20 57 65 20 61 70 70 65 61 72 20 74  OTE: We appear t
106e0 6f 20 62 65 20 63 61 70 61 62 6c 65 20 6f 66 20  o be capable of 
106f0 66 61 69 72 6c 79 20 70 72 65 63 69 73 65 20 74  fairly precise t
10700 69 6d 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  iming...        
10710 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
10720 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63  string length $c
10730 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 3d 20 30 7d  onstraint] == 0}
10740 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10750 20 20 20 73 65 74 20 63 6f 6e 73 74 72 61 69 6e     set constrain
10760 74 20 74 69 6d 69 6e 67 0d 0a 20 20 20 20 20 20  t timing..      
10770 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61    }....        a
10780 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 24 63 6f  ddConstraint $co
10790 6e 73 74 72 61 69 6e 74 0d 0a 0d 0a 20 20 20 20  nstraint....    
107a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
107b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
107c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 79  ..            "y
107d0 65 73 20 28 30 20 3c 3d 20 22 20 24 64 69 66 66  es (0 <= " $diff
107e0 65 72 65 6e 63 65 20 22 20 3c 3d 20 22 20 24 74  erence " <= " $t
107f0 68 72 65 73 68 6f 6c 64 20 22 20 6d 69 6c 6c 69  hreshold " milli
10800 73 65 63 6f 6e 64 73 22 20 5c 0d 0a 20 20 20 20  seconds" \..    
10810 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
10820 61 76 65 72 61 67 65 20 3f 20 22 20 61 76 65 72  average ? " aver
10830 61 67 65 22 20 3a 20 22 22 7d 5d 20 22 2c 20 74  age" : ""}] ", t
10840 72 69 65 64 20 22 20 5b 65 78 70 72 20 7b 24 74  ried " [expr {$t
10850 72 79 20 2b 20 31 7d 5d 20 5c 0d 0a 20 20 20 20  ry + 1}] \..    
10860 20 20 20 20 20 20 20 20 22 20 6f 75 74 20 6f 66          " out of
10870 20 22 20 24 74 72 69 65 73 20 22 20 22 20 5b 65   " $tries " " [e
10880 78 70 72 20 7b 24 74 72 69 65 73 20 3e 20 31 20  xpr {$tries > 1 
10890 3f 20 22 74 69 6d 65 73 22 20 3a 20 22 74 69 6d  ? "times" : "tim
108a0 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e"}] \..        
108b0 20 20 20 20 22 2c 20 5c 22 22 20 24 63 6f 6e 73      ", \"" $cons
108c0 74 72 61 69 6e 74 20 22 5c 22 29 5c 6e 22 5d 0d  traint "\")\n"].
108d0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
108e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
108f0 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20   are done here, 
10900 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20  return now...   
10910 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10920 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
10930 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70  .    }....    tp
10940 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
10950 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10960 20 20 20 20 22 6e 6f 20 28 30 20 3c 3d 20 22 20      "no (0 <= " 
10970 24 64 69 66 66 65 72 65 6e 63 65 20 22 20 3e 20  $difference " > 
10980 22 20 24 74 68 72 65 73 68 6f 6c 64 20 22 20 6d  " $threshold " m
10990 69 6c 6c 69 73 65 63 6f 6e 64 73 22 20 5c 0d 0a  illiseconds" \..
109a0 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
109b0 61 76 65 72 61 67 65 20 3f 20 22 20 61 76 65 72  average ? " aver
109c0 61 67 65 22 20 3a 20 22 22 7d 5d 20 22 2c 20 74  age" : ""}] ", t
109d0 72 69 65 64 20 22 20 24 74 72 79 20 22 20 6f 75  ried " $try " ou
109e0 74 20 6f 66 20 22 20 5c 0d 0a 20 20 20 20 20 20  t of " \..      
109f0 20 20 24 74 72 69 65 73 20 22 20 22 20 5b 65 78    $tries " " [ex
10a00 70 72 20 7b 24 74 72 69 65 73 20 3e 20 31 20 3f  pr {$tries > 1 ?
10a10 20 22 74 69 6d 65 73 22 20 3a 20 22 74 69 6d 65   "times" : "time
10a20 22 7d 5d 20 22 29 5c 6e 22 5d 0d 0a 20 20 7d 0d  "}] ")\n"]..  }.
10a30 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
10a40 46 6f 72 50 65 72 66 6f 72 6d 61 6e 63 65 20 7b  ForPerformance {
10a50 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
10a60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10a70 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
10a80 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  for performance 
10a90 74 65 73 74 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a  testing... "....
10aa0 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
10ab0 45 3a 20 41 72 65 20 77 65 20 61 6c 6c 6f 77 65  E: Are we allowe
10ac0 64 20 74 6f 20 64 6f 20 70 65 72 66 6f 72 6d 61  d to do performa
10ad0 6e 63 65 20 74 65 73 74 69 6e 67 3f 0d 0a 20 20  nce testing?..  
10ae0 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69    #..    if {![i
10af0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
10b00 70 65 72 66 6f 72 6d 61 6e 63 65 29 5d 7d 20 74  performance)]} t
10b10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64  hen {..      add
10b20 43 6f 6e 73 74 72 61 69 6e 74 20 70 65 72 66 6f  Constraint perfo
10b30 72 6d 61 6e 63 65 0d 0a 0d 0a 20 20 20 20 20 20  rmance....      
10b40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
10b50 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65  es\n..    } else
10b60 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
10b70 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
10b80 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
10b90 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 42 69 67  proc checkForBig
10ba0 4c 69 73 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20  Lists { channel 
10bb0 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
10bc0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
10bd0 65 63 6b 69 6e 67 20 66 6f 72 20 62 69 67 20 6c  ecking for big l
10be0 69 73 74 20 74 65 73 74 69 6e 67 2e 2e 2e 20 22  ist testing... "
10bf0 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
10c00 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 61 6c   NOTE: Are we al
10c10 6c 6f 77 65 64 20 74 6f 20 64 6f 20 62 69 67 20  lowed to do big 
10c20 6c 69 73 74 20 74 65 73 74 69 6e 67 3f 0d 0a 20  list testing?.. 
10c30 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b     #..    if {![
10c40 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10c50 28 62 69 67 4c 69 73 74 73 29 5d 7d 20 74 68 65  (bigLists)]} the
10c60 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  n {..      if {[
10c70 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
10c80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c90 20 20 20 20 20 23 20 4d 4f 4e 4f 3a 20 55 73 69       # MONO: Usi
10ca0 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 75 74  ng the native ut
10cb0 69 6c 69 74 79 20 6c 69 62 72 61 72 79 20 77 68  ility library wh
10cc0 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d 6f  en running on Mo
10cd0 6e 6f 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23  no to..        #
10ce0 20 20 20 20 20 20 20 6a 6f 69 6e 20 62 69 67 20         join big 
10cf0 6c 69 73 74 73 20 73 65 65 6d 73 20 74 6f 20 63  lists seems to c
10d00 61 75 73 65 20 53 74 61 63 6b 4f 76 65 72 66 6c  ause StackOverfl
10d10 6f 77 45 78 63 65 70 74 69 6f 6e 20 74 6f 0d 0a  owException to..
10d20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10d30 62 65 20 74 68 72 6f 77 6e 2e 0d 0a 20 20 20 20  be thrown...    
10d40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
10d50 66 20 7b 21 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d  f {![isTestMono]
10d60 20 7c 7c 20 21 5b 68 61 76 65 43 6f 6e 73 74 72   || ![haveConstr
10d70 61 69 6e 74 20 6e 61 74 69 76 65 55 74 69 6c 69  aint nativeUtili
10d80 74 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ty]} then {..   
10d90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10da0 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
10db0 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
10dc0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
10dd0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10de0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
10df0 73 74 72 61 69 6e 74 20 62 69 67 4c 69 73 74 73  straint bigLists
10e00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
10e10 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
10e20 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  \n..        } el
10e30 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10e40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
10e50 6e 6f 2c 20 62 72 6f 6b 65 6e 20 6f 6e 20 4d 6f  no, broken on Mo
10e60 6e 6f 20 77 69 74 68 20 6e 61 74 69 76 65 20 75  no with native u
10e70 74 69 6c 69 74 79 5c 6e 22 0d 0a 20 20 20 20 20  tility\n"..     
10e80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
10e90 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  se {..        ad
10ea0 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 69 67 4c  dConstraint bigL
10eb0 69 73 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ists....        
10ec0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
10ed0 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  es\n..      }.. 
10ee0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10ef0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10f00 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
10f10 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
10f20 65 63 6b 46 6f 72 50 72 6f 63 65 73 73 6f 72 49  eckForProcessorI
10f30 6e 74 65 6e 73 69 76 65 20 7b 20 63 68 61 6e 6e  ntensive { chann
10f40 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
10f50 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
10f60 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 70 72   checking for pr
10f70 6f 63 65 73 73 6f 72 20 69 6e 74 65 6e 73 69 76  ocessor intensiv
10f80 65 20 74 65 73 74 69 6e 67 2e 2e 2e 20 22 0d 0a  e testing... "..
10f90 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
10fa0 4f 54 45 3a 20 41 72 65 20 77 65 20 61 6c 6c 6f  OTE: Are we allo
10fb0 77 65 64 20 74 6f 20 64 6f 20 70 72 6f 63 65 73  wed to do proces
10fc0 73 6f 72 20 69 6e 74 65 6e 73 69 76 65 20 74 65  sor intensive te
10fd0 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a 20  sting?..    #.. 
10fe0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
10ff0 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 63 65 73  ists ::no(proces
11000 73 6f 72 49 6e 74 65 6e 73 69 76 65 29 5d 7d 20  sorIntensive)]} 
11010 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
11020 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 62  dConstraint mayb
11030 65 50 72 6f 63 65 73 73 6f 72 49 6e 74 65 6e 73  eProcessorIntens
11040 69 76 65 0d 0a 20 20 20 20 20 20 61 64 64 43 6f  ive..      addCo
11050 6e 73 74 72 61 69 6e 74 20 70 72 6f 63 65 73 73  nstraint process
11060 6f 72 49 6e 74 65 6e 73 69 76 65 0d 0a 0d 0a 20  orIntensive.... 
11070 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11080 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
11090 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
110a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
110b0 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
110c0 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
110d0 6f 72 54 69 6d 65 49 6e 74 65 6e 73 69 76 65 20  orTimeIntensive 
110e0 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
110f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11100 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
11110 20 66 6f 72 20 74 69 6d 65 20 69 6e 74 65 6e 73   for time intens
11120 69 76 65 20 74 65 73 74 69 6e 67 2e 2e 2e 20 22  ive testing... "
11130 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
11140 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 61 6c   NOTE: Are we al
11150 6c 6f 77 65 64 20 74 6f 20 64 6f 20 74 69 6d 65  lowed to do time
11160 20 69 6e 74 65 6e 73 69 76 65 20 74 65 73 74 69   intensive testi
11170 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ng?..    #..    
11180 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
11190 73 20 3a 3a 6e 6f 28 74 69 6d 65 49 6e 74 65 6e  s ::no(timeInten
111a0 73 69 76 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  sive)]} then {..
111b0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
111c0 69 6e 74 20 6d 61 79 62 65 54 69 6d 65 49 6e 74  int maybeTimeInt
111d0 65 6e 73 69 76 65 0d 0a 20 20 20 20 20 20 61 64  ensive..      ad
111e0 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 6d 65  dConstraint time
111f0 49 6e 74 65 6e 73 69 76 65 0d 0a 0d 0a 20 20 20  Intensive....   
11200 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11210 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
11220 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
11230 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
11240 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
11250 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
11260 46 75 6c 6c 54 65 73 74 20 7b 20 63 68 61 6e 6e  FullTest { chann
11270 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
11280 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
11290 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
112a0 6c 6c 20 74 65 73 74 69 6e 67 2e 2e 2e 20 22 0d  ll testing... ".
112b0 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
112c0 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 61 6c 6c  NOTE: Are we all
112d0 6f 77 65 64 20 74 6f 20 64 6f 20 66 75 6c 6c 20  owed to do full 
112e0 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 6f  testing (i.e. to
112f0 20 72 75 6e 20 72 61 72 65 6c 79 0d 0a 20 20 20   run rarely..   
11300 20 23 20 20 20 20 20 20 20 6e 65 65 64 65 64 20   #       needed 
11310 74 65 73 74 73 29 3f 0d 0a 20 20 20 20 23 0d 0a  tests)?..    #..
11320 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
11330 78 69 73 74 73 20 3a 3a 6e 6f 28 66 75 6c 6c 54  xists ::no(fullT
11340 65 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  est)]} then {.. 
11350 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
11360 6e 74 20 66 75 6c 6c 54 65 73 74 0d 0a 0d 0a 20  nt fullTest.... 
11370 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11380 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
11390 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
113a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
113b0 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
113c0 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
113d0 6f 72 4d 65 6d 6f 72 79 49 6e 74 65 6e 73 69 76  orMemoryIntensiv
113e0 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  e { channel } {.
113f0 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
11400 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
11410 6e 67 20 66 6f 72 20 6d 65 6d 6f 72 79 20 69 6e  ng for memory in
11420 74 65 6e 73 69 76 65 20 74 65 73 74 69 6e 67 2e  tensive testing.
11430 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20  .. "....    #.. 
11440 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77     # NOTE: Are w
11450 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f 20  e allowed to do 
11460 6d 65 6d 6f 72 79 20 69 6e 74 65 6e 73 69 76 65  memory intensive
11470 20 74 65 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23   testing?..    #
11480 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f  ..    if {![info
11490 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6d 65 6d   exists ::no(mem
114a0 6f 72 79 49 6e 74 65 6e 73 69 76 65 29 5d 7d 20  oryIntensive)]} 
114b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
114c0 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d 65 6d 6f  dConstraint memo
114d0 72 79 49 6e 74 65 6e 73 69 76 65 0d 0a 0d 0a 20  ryIntensive.... 
114e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
114f0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
11500 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
11510 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11520 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
11530 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
11540 6f 72 53 74 61 63 6b 49 6e 74 65 6e 73 69 76 65  orStackIntensive
11550 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
11560 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11570 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
11580 67 20 66 6f 72 20 73 74 61 63 6b 20 69 6e 74 65  g for stack inte
11590 6e 73 69 76 65 20 74 65 73 74 69 6e 67 2e 2e 2e  nsive testing...
115a0 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   "....    #..   
115b0 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20   # NOTE: Are we 
115c0 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f 20 73 74  allowed to do st
115d0 61 63 6b 20 69 6e 74 65 6e 73 69 76 65 20 74 65  ack intensive te
115e0 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a 20  sting?..    #.. 
115f0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11600 69 73 74 73 20 3a 3a 6e 6f 28 73 74 61 63 6b 49  ists ::no(stackI
11610 6e 74 65 6e 73 69 76 65 29 5d 7d 20 74 68 65 6e  ntensive)]} then
11620 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
11630 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
11640 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11650 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
11660 6d 70 74 20 74 6f 20 71 75 65 72 79 20 66 6f 72  mpt to query for
11670 20 6e 61 74 69 76 65 20 73 74 61 63 6b 20 63 68   native stack ch
11680 65 63 6b 69 6e 67 20 69 6e 20 45 61 67 6c 65 2e  ecking in Eagle.
11690 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
116a0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
116b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
116c0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
116d0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 61                Ea
116f0 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e  gle._Components.
11700 50 72 69 76 61 74 65 2e 4e 61 74 69 76 65 53 74  Private.NativeSt
11710 61 63 6b 20 43 61 6e 51 75 65 72 79 54 68 72 65  ack CanQueryThre
11720 61 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 63 61  ad..        } ca
11730 6e 51 75 65 72 79 54 68 72 65 61 64 5d 20 3d 3d  nQueryThread] ==
11740 20 30 20 26 26 20 24 63 61 6e 51 75 65 72 79 54   0 && $canQueryT
11750 68 72 65 61 64 7d 20 74 68 65 6e 20 7b 0d 0a 20  hread} then {.. 
11760 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11770 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
11780 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68  s, it appears th
11790 61 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  at it is availab
117a0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
117b0 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
117c0 6f 6e 73 74 72 61 69 6e 74 20 73 74 61 63 6b 49  onstraint stackI
117d0 6e 74 65 6e 73 69 76 65 0d 0a 0d 0a 20 20 20 20  ntensive....    
117e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
117f0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
11800 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11810 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11820 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
11830 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
11840 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11850 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 74  addConstraint st
11860 61 63 6b 49 6e 74 65 6e 73 69 76 65 0d 0a 0d 0a  ackIntensive....
11870 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11880 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
11890 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73      }..    } els
118a0 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e {..      tputs
118b0 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
118c0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
118d0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 74   proc checkForSt
118e0 61 63 6b 53 69 7a 65 20 7b 20 63 68 61 6e 6e 65  ackSize { channe
118f0 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
11900 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
11910 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 74 61  checking for sta
11920 63 6b 20 73 69 7a 65 2e 2e 2e 20 22 0d 0a 0d 0a  ck size... "....
11930 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
11940 45 3a 20 41 72 65 20 77 65 20 61 6c 6c 6f 77 65  E: Are we allowe
11950 64 20 74 6f 20 64 6f 20 73 74 61 63 6b 20 73 69  d to do stack si
11960 7a 65 20 74 65 73 74 69 6e 67 3f 0d 0a 20 20 20  ze testing?..   
11970 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e   #..    if {![in
11980 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
11990 74 61 63 6b 53 69 7a 65 29 5d 7d 20 74 68 65 6e  tackSize)]} then
119a0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
119b0 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
119c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
119d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
119e0 6d 70 74 20 74 6f 20 71 75 65 72 79 20 66 6f 72  mpt to query for
119f0 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20   the executable 
11a00 73 74 61 63 6b 20 73 69 7a 65 2e 0d 0a 20 20 20  stack size...   
11a10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11a20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
11a30 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73 65          set rese
11a40 72 76 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  rve [object invo
11a50 6b 65 20 2d 63 72 65 61 74 65 20 55 49 6e 74 50  ke -create UIntP
11a60 74 72 20 5a 65 72 6f 5d 0d 0a 20 20 20 20 20 20  tr Zero]..      
11a70 20 20 20 20 73 65 74 20 63 6f 6d 6d 69 74 20 5b      set commit [
11a80 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63  object invoke -c
11a90 72 65 61 74 65 20 55 49 6e 74 50 74 72 20 5a 65  reate UIntPtr Ze
11aa0 72 6f 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ro]....         
11ab0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
11ac0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11ad0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11ae0 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
11af0 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 69 6c 65  nts.Private.File
11b00 4f 70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Ops \..         
11b10 20 20 20 20 20 47 65 74 50 65 46 69 6c 65 53 74       GetPeFileSt
11b20 61 63 6b 52 65 73 65 72 76 65 41 6e 64 43 6f 6d  ackReserveAndCom
11b30 6d 69 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  mit \..         
11b40 20 20 20 20 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f       [info nameo
11b50 66 65 78 65 63 75 74 61 62 6c 65 5d 20 72 65 73  fexecutable] res
11b60 65 72 76 65 20 63 6f 6d 6d 69 74 0d 0a 0d 0a 20  erve commit.... 
11b70 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73           set res
11b80 65 72 76 65 3b 20 23 20 70 72 69 6d 69 74 69 76  erve; # primitiv
11b90 65 2c 20 61 6c 72 65 61 64 79 20 6e 75 6d 65 72  e, already numer
11ba0 69 63 2e 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  ic...        } s
11bb0 74 61 63 6b 53 69 7a 65 5d 20 3d 3d 20 30 20 26  tackSize] == 0 &
11bc0 26 20 24 73 74 61 63 6b 53 69 7a 65 20 3e 20 30  & $stackSize > 0
11bd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11be0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
11bf0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 74  t [appendArgs st
11c00 61 63 6b 53 69 7a 65 2e 30 78 20 5b 66 6f 72 6d  ackSize.0x [form
11c10 61 74 20 25 78 20 24 73 74 61 63 6b 53 69 7a 65  at %x $stackSize
11c20 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
11c30 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
11c40 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
11c50 28 22 20 24 73 74 61 63 6b 53 69 7a 65 20 22 29  (" $stackSize ")
11c60 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  \n"]..        } 
11c70 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11c80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11c90 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
11ca0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
11cb0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
11cd0 72 65 20 69 73 20 6e 6f 20 63 72 6f 73 73 2d 70  re is no cross-p
11ce0 6c 61 74 66 6f 72 6d 20 77 61 79 20 74 6f 20 63  latform way to c
11cf0 68 65 63 6b 20 74 68 69 73 20 69 6e 0d 0a 20 20  heck this in..  
11d00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
11d10 74 69 76 65 20 54 63 6c 2e 0d 0a 20 20 20 20 20  tive Tcl...     
11d20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
11d30 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 74 61 63  dConstraint stac
11d40 6b 53 69 7a 65 2e 75 6e 6c 69 6d 69 74 65 64 3b  kSize.unlimited;
11d50 20 23 20 54 4f 44 4f 3a 20 46 69 78 20 6d 65 3f   # TODO: Fix me?
11d60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
11d70 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
11d80 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11d90 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
11da0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11db0 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
11dc0 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
11dd0 6f 72 49 6e 74 65 72 61 63 74 69 76 65 20 7b 20  orInteractive { 
11de0 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
11df0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11e00 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
11e10 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 75  or interactive u
11e20 73 65 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ser... "....    
11e30 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  #..    # NOTE: I
11e40 73 20 74 68 65 72 65 20 61 6e 20 69 6e 74 65 72  s there an inter
11e50 61 63 74 69 76 65 20 75 73 65 72 3f 0d 0a 20 20  active user?..  
11e60 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e    #..    if {[in
11e70 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
11e80 69 6e 74 65 72 61 63 74 69 76 65 5d 20 26 26 20  interactive] && 
11e90 24 3a 3a 74 63 6c 5f 69 6e 74 65 72 61 63 74 69  $::tcl_interacti
11ea0 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ve} then {..    
11eb0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
11ec0 69 6e 74 65 72 61 63 74 69 76 65 0d 0a 0d 0a 20  interactive.... 
11ed0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11ee0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
11ef0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
11f00 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11f10 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
11f20 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
11f30 6f 72 49 6e 74 65 72 61 63 74 69 76 65 43 6f 6d  orInteractiveCom
11f40 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  mand { channel n
11f50 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  ame } {..    tpu
11f60 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11f70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
11f80 65 63 6b 69 6e 67 20 66 6f 72 20 69 6e 74 65 72  ecking for inter
11f90 61 63 74 69 76 65 20 63 6f 6d 6d 61 6e 64 20 5c  active command \
11fa0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 6e  "" \..        $n
11fb0 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ame "\"... "]...
11fc0 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
11fd0 54 45 3a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6f  TE: Currently, o
11fe0 6e 6c 79 20 45 61 67 6c 65 20 68 61 73 20 22 69  nly Eagle has "i
11ff0 6e 74 65 72 61 63 74 69 76 65 20 63 6f 6d 6d 61  nteractive comma
12000 6e 64 73 22 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  nds"...    #..  
12010 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
12020 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
12030 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12040 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79  Attempt to query
12050 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 76 65   the interactive
12060 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 73 20 66   command names f
12070 72 6f 6d 20 45 61 67 6c 65 2e 0d 0a 20 20 20 20  rom Eagle...    
12080 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
12090 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
120a0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55   object invoke U
120b0 74 69 6c 69 74 79 20 47 65 74 49 6e 74 65 72 61  tility GetIntera
120c0 63 74 69 76 65 43 6f 6d 6d 61 6e 64 4e 61 6d 65  ctiveCommandName
120d0 73 20 22 22 20 24 6e 61 6d 65 20 66 61 6c 73 65  s "" $name false
120e0 0d 0a 20 20 20 20 20 20 7d 20 6e 61 6d 65 73 5d  ..      } names]
120f0 20 3d 3d 20 30 20 26 26 20 5b 6c 6c 65 6e 67 74   == 0 && [llengt
12100 68 20 24 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  h $names] > 0} t
12110 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
12120 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
12130 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
12140 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61  s that it is ava
12150 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
12160 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
12170 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
12180 64 41 72 67 73 20 69 6e 74 65 72 61 63 74 69 76  dArgs interactiv
12190 65 43 6f 6d 6d 61 6e 64 2e 20 24 6e 61 6d 65 5d  eCommand. $name]
121a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
121b0 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
121c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
121d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
121e0 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
121f0 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
12200 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12210 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
12220 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74  ..    }....    t
12230 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
12240 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  \n..  }.....  pr
12250 6f 63 20 63 68 65 63 6b 46 6f 72 55 73 65 72 49  oc checkForUserI
12260 6e 74 65 72 61 63 74 69 6f 6e 20 7b 20 63 68 61  nteraction { cha
12270 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
12280 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
12290 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
122a0 75 73 65 72 20 69 6e 74 65 72 61 63 74 69 6f 6e  user interaction
122b0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
122c0 20 20 20 20 23 20 48 41 43 4b 3a 20 46 6f 72 20      # HACK: For 
122d0 6e 6f 77 2c 20 64 6f 20 74 68 65 20 65 78 61 63  now, do the exac
122e0 74 20 73 61 6d 65 20 63 68 65 63 6b 20 61 73 20  t same check as 
122f0 63 68 65 63 6b 46 6f 72 49 6e 74 65 72 61 63 74  checkForInteract
12300 69 76 65 3b 20 68 6f 77 65 76 65 72 2c 0d 0a 20  ive; however,.. 
12310 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
12320 69 73 20 73 74 69 6c 6c 20 75 73 65 66 75 6c 20  is still useful 
12330 61 73 20 61 20 73 65 70 61 72 61 74 65 20 63 6f  as a separate co
12340 6e 73 74 72 61 69 6e 74 20 62 65 63 61 75 73 65  nstraint because
12350 20 69 74 20 63 61 6e 20 62 65 0d 0a 20 20 20 20   it can be..    
12360 23 20 20 20 20 20 20 20 69 6e 64 69 76 69 64 75  #       individu
12370 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 69 6e  ally disabled in
12380 20 22 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65   "prologue.eagle
12390 22 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  "...    #..    i
123a0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
123b0 3a 3a 74 63 6c 5f 69 6e 74 65 72 61 63 74 69 76  ::tcl_interactiv
123c0 65 5d 20 26 26 20 24 3a 3a 74 63 6c 5f 69 6e 74  e] && $::tcl_int
123d0 65 72 61 63 74 69 76 65 7d 20 74 68 65 6e 20 7b  eractive} then {
123e0 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
123f0 72 61 69 6e 74 20 75 73 65 72 49 6e 74 65 72 61  raint userIntera
12400 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 74  ction....      t
12410 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
12420 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
12430 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
12440 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
12450 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
12460 72 6f 63 20 63 68 65 63 6b 46 6f 72 4e 65 74 77  roc checkForNetw
12470 6f 72 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 68 6f  ork { channel ho
12480 73 74 20 74 69 6d 65 6f 75 74 20 7d 20 7b 0d 0a  st timeout } {..
12490 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
124a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
124b0 0d 0a 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20  ..        "---- 
124c0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6e 65 74  checking for net
124d0 77 6f 72 6b 20 63 6f 6e 6e 65 63 74 69 76 69 74  work connectivit
124e0 79 20 74 6f 20 68 6f 73 74 20 5c 22 22 20 24 68  y to host \"" $h
124f0 6f 73 74 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ost "\"... "]...
12500 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c  .    if {[isEagl
12510 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
12520 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12530 45 3a 20 52 75 6e 6e 69 6e 67 20 74 68 69 73 20  E: Running this 
12540 63 68 65 63 6b 20 6f 6e 20 74 68 65 20 4d 6f 6e  check on the Mon
12550 6f 20 33 2e 33 2e 30 20 28 6f 72 20 33 2e 34 2e  o 3.3.0 (or 3.4.
12560 30 3f 29 20 72 65 6c 65 61 73 65 20 62 75 69 6c  0?) release buil
12570 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
12580 20 77 69 6c 6c 20 6c 6f 63 6b 20 75 70 20 74 68   will lock up th
12590 65 20 70 72 6f 63 65 73 73 3b 20 74 68 65 72 65  e process; there
125a0 66 6f 72 65 2c 20 73 6b 69 70 20 69 74 20 69 6e  fore, skip it in
125b0 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20   that case...   
125c0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
125d0 72 65 61 73 6f 6e 20 75 6e 6b 6e 6f 77 6e 0d 0a  reason unknown..
125e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 6e  ..      if {[can
125f0 50 69 6e 67 20 72 65 61 73 6f 6e 5d 7d 20 74 68  Ping reason]} th
12600 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
12610 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 42 55  .        # BUGBU
12620 47 3a 20 54 63 6c 20 38 2e 34 20 64 6f 65 73 20  G: Tcl 8.4 does 
12630 6e 6f 74 20 6c 69 6b 65 20 74 68 69 73 20 65 78  not like this ex
12640 70 72 65 73 73 69 6f 6e 20 28 61 6e 64 20 54 63  pression (and Tc
12650 6c 20 74 72 69 65 73 20 74 6f 0d 0a 20 20 20 20  l tries to..    
12660 20 20 20 20 23 20 20 20 20 20 20 20 20 20 63 6f      #         co
12670 6d 70 69 6c 65 20 69 74 20 65 76 65 6e 20 74 68  mpile it even th
12680 6f 75 67 68 20 69 74 20 77 69 6c 6c 20 6f 6e 6c  ough it will onl
12690 79 20 61 63 74 75 61 6c 6c 79 20 65 76 65 72 20  y actually ever 
126a0 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
126b0 20 20 20 20 20 20 65 76 61 6c 75 61 74 65 64 20        evaluated 
126c0 69 6e 20 45 61 67 6c 65 29 2e 0d 0a 20 20 20 20  in Eagle)...    
126d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
126e0 65 74 20 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74  et expr {[llengt
126f0 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
12700 20 75 72 69 5d 5d 20 3e 20 30 20 26 26 20 5c 0d   uri]] > 0 && \.
12710 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 61  .            [ca
12720 74 63 68 20 7b 75 72 69 20 70 69 6e 67 20 24 68  tch {uri ping $h
12730 6f 73 74 20 24 74 69 6d 65 6f 75 74 7d 20 72 65  ost $timeout} re
12740 73 70 6f 6e 73 65 5d 20 3d 3d 20 30 20 26 26 20  sponse] == 0 && 
12750 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
12760 6c 69 6e 64 65 78 20 24 72 65 73 70 6f 6e 73 65  lindex $response
12770 20 30 5d 20 69 6e 20 5b 6c 69 73 74 20 53 75 63   0] in [list Suc
12780 63 65 73 73 20 54 69 6d 65 64 4f 75 74 5d 20 26  cess TimedOut] &
12790 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
127a0 20 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65   [string is inte
127b0 67 65 72 20 2d 73 74 72 69 63 74 20 5b 6c 69 6e  ger -strict [lin
127c0 64 65 78 20 24 72 65 73 70 6f 6e 73 65 20 31 5d  dex $response 1]
127d0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
127e0 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 72 65 73      [lindex $res
127f0 70 6f 6e 73 65 20 31 5d 20 3c 3d 20 24 74 69 6d  ponse 1] <= $tim
12800 65 6f 75 74 7d 0d 0a 0d 0a 20 20 20 20 20 20 20  eout}....       
12810 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12820 54 45 3a 20 44 6f 65 73 20 69 74 20 6c 6f 6f 6b  TE: Does it look
12830 20 6c 69 6b 65 20 77 65 20 61 72 65 20 61 62 6c   like we are abl
12840 65 20 74 6f 20 63 6f 6e 74 61 63 74 20 74 68 65  e to contact the
12850 20 6e 65 74 77 6f 72 6b 20 68 6f 73 74 3f 0d 0a   network host?..
12860 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12870 20 20 20 69 66 20 7b 5b 65 78 70 72 20 24 65 78     if {[expr $ex
12880 70 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  pr]} then {..   
12890 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
128a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
128b0 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
128c0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
128d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
128e0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
128f0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
12900 72 67 73 20 6e 65 74 77 6f 72 6b 5f 20 24 68 6f  rgs network_ $ho
12910 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  st]....         
12920 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12930 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
12940 20 28 22 20 24 72 65 73 70 6f 6e 73 65 20 22 29   (" $response ")
12950 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  \n"]..        } 
12960 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12970 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12980 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
12990 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
129a0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
129b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
129c0 41 72 67 73 20 24 72 65 61 73 6f 6e 20 5c 6e 5d  Args $reason \n]
129d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
129e0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23   else {..      #
129f0 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20  ..      # HACK: 
12a00 52 75 6e 6e 69 6e 67 20 69 6e 20 54 63 6c 2c 20  Running in Tcl, 
12a10 6a 75 73 74 20 61 73 73 75 6d 65 20 77 65 20 68  just assume we h
12a20 61 76 65 20 6e 65 74 77 6f 72 6b 20 61 63 63 65  ave network acce
12a30 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
12a40 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
12a50 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6e 65  t [appendArgs ne
12a60 74 77 6f 72 6b 5f 20 24 68 6f 73 74 5d 0d 0a 0d  twork_ $host]...
12a70 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
12a80 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
12a90 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
12aa0 6f 63 20 63 68 65 63 6b 46 6f 72 43 6f 6d 70 69  oc checkForCompi
12ab0 6c 65 4f 70 74 69 6f 6e 20 7b 20 63 68 61 6e 6e  leOption { chann
12ac0 65 6c 20 6f 70 74 69 6f 6e 20 7d 20 7b 0d 0a 20  el option } {.. 
12ad0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12ae0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
12af0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
12b00 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20   compile option 
12b10 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 24  \"" \..        $
12b20 6f 70 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d  option "\"... "]
12b30 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45  ....    if {[isE
12b40 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  agle]} then {.. 
12b50 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
12b60 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c  xists ::eagle_pl
12b70 61 74 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f 70  atform(compileOp
12b80 74 69 6f 6e 73 29 5d 20 26 26 20 5c 0d 0a 20 20  tions)] && \..  
12b90 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68          [lsearch
12ba0 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
12bb0 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
12bc0 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  m(compileOptions
12bd0 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) \..           
12be0 20 20 20 24 6f 70 74 69 6f 6e 5d 20 21 3d 20 2d     $option] != -
12bf0 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
12c00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12c10 4e 4f 54 45 3a 20 59 65 73 2c 20 73 75 70 70 6f  NOTE: Yes, suppo
12c20 72 74 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65  rt for the Eagle
12c30 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20   compile option 
12c40 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20  is present...   
12c50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12c60 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
12c70 70 70 65 6e 64 41 72 67 73 20 63 6f 6d 70 69 6c  ppendArgs compil
12c80 65 2e 20 24 6f 70 74 69 6f 6e 5d 0d 0a 0d 0a 20  e. $option].... 
12c90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12ca0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
12cb0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12cc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12cd0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
12ce0 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  }..    } else {.
12cf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12d00 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72  # NOTE: We are r
12d10 75 6e 6e 69 6e 67 20 69 6e 73 69 64 65 20 54 63  unning inside Tc
12d20 6c 3b 20 68 6f 77 65 76 65 72 2c 20 77 65 20 6e  l; however, we n
12d30 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72  eed to check for
12d40 20 61 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   an..      #    
12d50 20 20 20 45 61 67 6c 65 20 63 6f 6d 70 69 6c 65     Eagle compile
12d60 20 6f 70 74 69 6f 6e 2e 20 20 54 68 69 73 20 63   option.  This c
12d70 61 6e 20 6e 6f 77 20 62 65 20 61 63 63 6f 6d 70  an now be accomp
12d80 6c 69 73 68 65 64 20 76 69 61 20 74 68 65 0d 0a  lished via the..
12d90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 65        #       [e
12da0 61 67 6c 65 5d 20 63 6f 6d 6d 61 6e 64 20 73 75  agle] command su
12db0 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 45 61  pplied by the Ea
12dc0 67 6c 65 20 50 61 63 6b 61 67 65 20 66 6f 72 20  gle Package for 
12dd0 54 63 6c 2c 20 69 66 0d 0a 20 20 20 20 20 20 23  Tcl, if..      #
12de0 20 20 20 20 20 20 20 69 74 20 69 73 20 61 63 74         it is act
12df0 75 61 6c 6c 79 20 6c 6f 61 64 65 64 20 61 6e 64  ually loaded and
12e00 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
12e10 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12e20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
12e30 6f 6d 6d 61 6e 64 73 20 65 61 67 6c 65 5d 5d 20  ommands eagle]] 
12e40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
12e50 20 20 20 20 20 73 65 74 20 6f 70 74 69 6f 6e 73       set options
12e60 20 5b 65 61 67 6c 65 20 5b 6c 69 73 74 20 65 78   [eagle [list ex
12e70 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  pr {[info exists
12e80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12e90 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
12ea0 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29  (compileOptions)
12eb0 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] ? \..         
12ec0 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74     $::eagle_plat
12ed0 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69  form(compileOpti
12ee0 6f 6e 73 29 20 3a 20 5b 6c 69 73 74 5d 7d 5d 5d  ons) : [list]}]]
12ef0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
12f00 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
12f10 24 6f 70 74 69 6f 6e 73 20 24 6f 70 74 69 6f 6e  $options $option
12f20 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d  ] != -1} then {.
12f30 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
12f40 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12f50 59 65 73 2c 20 73 75 70 70 6f 72 74 20 66 6f 72  Yes, support for
12f60 20 74 68 65 20 45 61 67 6c 65 20 63 6f 6d 70 69   the Eagle compi
12f70 6c 65 20 6f 70 74 69 6f 6e 20 69 73 20 70 72 65  le option is pre
12f80 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  sent...         
12f90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
12fa0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
12fb0 65 6e 64 41 72 67 73 20 63 6f 6d 70 69 6c 65 2e  endArgs compile.
12fc0 20 24 6f 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20   $option]....   
12fd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12fe0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
12ff0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
13000 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
13010 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20   are done here, 
13020 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20  return now...   
13030 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13040 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
13050 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
13060 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
13070 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
13080 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
13090 6f 63 20 63 68 65 63 6b 46 6f 72 4b 6e 6f 77 6e  oc checkForKnown
130a0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 20 7b  CompileOptions {
130b0 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
130c0 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
130d0 20 43 68 65 63 6b 20 66 6f 72 20 61 6c 6c 20 22   Check for all "
130e0 6b 6e 6f 77 6e 22 20 63 6f 6d 70 69 6c 65 20 6f  known" compile o
130f0 70 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 23 0d 0a  ptions...    #..
13100 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13110 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
13120 67 20 66 6f 72 20 6b 6e 6f 77 6e 20 63 6f 6d 70  g for known comp
13130 69 6c 65 20 6f 70 74 69 6f 6e 73 2e 2e 2e 20 22  ile options... "
13140 0d 0a 0d 0a 20 20 20 20 73 65 74 20 6f 70 74 69  ....    set opti
13150 6f 6e 73 20 5b 67 65 74 4b 6e 6f 77 6e 43 6f 6d  ons [getKnownCom
13160 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 0d 0a 0d 0a  pileOptions]....
13170 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
13180 20 24 6f 70 74 69 6f 6e 73 5d 20 3e 20 30 7d 20   $options] > 0} 
13190 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 74 70  then {..      tp
131a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
131b0 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
131c0 20 5b 6c 6c 65 6e 67 74 68 20 24 6f 70 74 69 6f   [llength $optio
131d0 6e 73 5d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  ns] ")\n"]....  
131e0 20 20 20 20 66 6f 72 65 61 63 68 20 6f 70 74 69      foreach opti
131f0 6f 6e 20 24 6f 70 74 69 6f 6e 73 20 7b 0d 0a 20  on $options {.. 
13200 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
13210 6f 20 65 78 69 73 74 73 20 5b 61 70 70 65 6e 64  o exists [append
13220 41 72 67 73 20 3a 3a 6e 6f 28 63 6f 6d 70 69 6c  Args ::no(compil
13230 65 2e 20 24 6f 70 74 69 6f 6e 20 29 5d 5d 7d 20  e. $option )]]} 
13240 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13250 20 20 63 68 65 63 6b 46 6f 72 43 6f 6d 70 69 6c    checkForCompil
13260 65 4f 70 74 69 6f 6e 20 24 63 68 61 6e 6e 65 6c  eOption $channel
13270 20 24 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20   $option..      
13280 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
13290 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
132a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
132b0 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
132c0 7d 0d 0a 0c 0d 0a 20 20 69 66 20 7b 5b 69 73 45  }.....  if {[isE
132d0 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  agle]} then {.. 
132e0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
132f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
13330 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
13340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13350 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f 4e 4c   BEGIN Eagle ONL
13360 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  Y ##############
13370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
13380 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
13390 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133d0 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
133e0 63 6b 46 6f 72 53 65 63 75 72 69 74 79 20 7b 20  ckForSecurity { 
133f0 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
13400 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13410 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
13420 20 66 6f 72 20 73 65 63 75 72 69 74 79 2e 2e 2e   for security...
13430 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
13440 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
13450 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
13460 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
13470 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
13480 74 41 63 74 69 76 65 20 48 61 73 53 65 63 75 72  tActive HasSecur
13490 69 74 79 0d 0a 20 20 20 20 20 20 7d 20 73 65 63  ity..      } sec
134a0 75 72 69 74 79 5d 20 3d 3d 20 30 7d 20 74 68 65  urity] == 0} the
134b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
134c0 7b 24 73 65 63 75 72 69 74 79 7d 20 74 68 65 6e  {$security} then
134d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
134e0 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 65 63 75  dConstraint secu
134f0 72 69 74 79 2e 65 6e 61 62 6c 65 64 0d 0a 0d 0a  rity.enabled....
13500 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13510 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
13520 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
13530 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
13540 6f 6e 73 74 72 61 69 6e 74 20 73 65 63 75 72 69  onstraint securi
13550 74 79 2e 64 69 73 61 62 6c 65 64 0d 0a 0d 0a 20  ty.disabled.... 
13560 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13570 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
13580 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
13590 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
135a0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
135b0 65 63 75 72 69 74 79 2e 75 6e 61 76 61 69 6c 61  ecurity.unavaila
135c0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ble....        t
135d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e  puts $channel un
135e0 61 76 61 69 6c 61 62 6c 65 5c 6e 0d 0a 20 20 20  available\n..   
135f0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13600 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
13610 72 53 6f 66 74 77 61 72 65 55 70 64 61 74 65 54  rSoftwareUpdateT
13620 72 75 73 74 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  rust { channel }
13630 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
13640 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
13650 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 6f 66 74  hecking for soft
13660 77 61 72 65 20 75 70 64 61 74 65 20 74 72 75 73  ware update trus
13670 74 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  t... "....      
13680 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
13690 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 75 72 69 5d  fo commands uri]
136a0 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
136b0 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 75 72        [catch {ur
136c0 69 20 73 6f 66 74 77 61 72 65 75 70 64 61 74 65  i softwareupdate
136d0 73 7d 20 74 72 75 73 74 5d 20 3d 3d 20 30 20 26  s} trust] == 0 &
136e0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  & \..          $
136f0 74 72 75 73 74 20 65 71 20 22 73 6f 66 74 77 61  trust eq "softwa
13700 72 65 20 75 70 64 61 74 65 20 63 65 72 74 69 66  re update certif
13710 69 63 61 74 65 20 69 73 20 74 72 75 73 74 65 64  icate is trusted
13720 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
13730 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13740 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70  NOTE: Yes, it ap
13750 70 65 61 72 73 20 74 68 61 74 20 77 65 20 74 72  pears that we tr
13760 75 73 74 20 6f 75 72 20 73 6f 66 74 77 61 72 65  ust our software
13770 20 75 70 64 61 74 65 73 2e 0d 0a 20 20 20 20 20   updates...     
13780 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
13790 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 73   this setting is
137a0 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2c   off by default,
137b0 20 74 68 65 20 75 73 65 72 20 28 6f 72 0d 0a 20   the user (or.. 
137c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
137d0 20 73 63 72 69 70 74 20 65 76 61 6c 75 61 74 65   script evaluate
137e0 64 20 62 79 20 74 68 65 20 75 73 65 72 29 20 6d  d by the user) m
137f0 75 73 74 20 68 61 76 65 20 6d 61 6e 75 61 6c 6c  ust have manuall
13800 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
13810 20 20 20 74 75 72 6e 65 64 20 69 74 20 6f 6e 2e     turned it on.
13820 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13830 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
13840 6e 74 20 73 6f 66 74 77 61 72 65 55 70 64 61 74  nt softwareUpdat
13850 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e....        tpu
13860 74 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 73  ts $channel trus
13870 74 65 64 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  ted\n..      } e
13880 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
13890 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e  puts $channel un
138a0 74 72 75 73 74 65 64 5c 6e 0d 0a 20 20 20 20 20  trusted\n..     
138b0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
138c0 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 4d    proc checkForM
138d0 61 6e 61 67 65 64 44 65 62 75 67 67 69 6e 67 41  anagedDebuggingA
138e0 73 73 69 73 74 61 6e 74 73 20 7b 20 63 68 61 6e  ssistants { chan
138f0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  nel } {..      s
13900 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
13910 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 61 70 70  e normalize [app
13920 65 6e 64 41 72 67 73 20 5b 69 6e 66 6f 20 6e 61  endArgs [info na
13930 6d 65 6f 66 65 78 65 63 75 74 61 62 6c 65 5d 20  meofexecutable] 
13940 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 2e 6d 64  \..          .md
13950 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  a.config]]....  
13960 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13970 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13980 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
13990 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6d  - checking for m
139a0 61 6e 61 67 65 64 20 64 65 62 75 67 67 69 6e 67  anaged debugging
139b0 20 61 73 73 69 73 74 61 6e 74 73 20 65 6e 61 62   assistants enab
139c0 6c 65 64 20 76 69 61 20 5c 22 22 20 5c 0d 0a 20  led via \"" \.. 
139d0 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
139e0 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  me "\"... "]....
139f0 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
13a00 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
13a10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13a20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13a30 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 65 20  NOTE: Since the 
13a40 53 79 73 74 65 6d 2e 58 6d 6c 20 61 73 73 65 6d  System.Xml assem
13a50 62 6c 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c  bly may not be l
13a60 6f 61 64 65 64 2c 20 77 72 61 70 20 74 68 65 0d  oaded, wrap the.
13a70 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13a80 20 64 65 74 65 63 74 69 6f 6e 20 69 6e 20 61 20   detection in a 
13a90 5b 63 61 74 63 68 5d 20 62 6c 6f 63 6b 2e 0d 0a  [catch] block...
13aa0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13ab0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
13ac0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
13ad0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13ae0 43 72 65 61 74 65 20 61 6e 64 20 6c 6f 61 64 20  Create and load 
13af0 61 6e 20 58 4d 4c 20 64 6f 63 75 6d 65 6e 74 20  an XML document 
13b00 62 61 73 65 64 20 6f 6e 20 74 68 65 20 64 61 74  based on the dat
13b10 61 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20  a from the..    
13b20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4d 44        #       MD
13b30 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  A configuration 
13b40 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
13b50 77 69 74 68 20 74 68 65 20 65 78 65 63 75 74 61  with the executa
13b60 62 6c 65 20 74 68 61 74 0d 0a 20 20 20 20 20 20  ble that..      
13b70 20 20 20 20 23 20 20 20 20 20 20 20 73 74 61 72      #       star
13b80 74 65 64 20 74 68 69 73 20 70 72 6f 63 65 73 73  ted this process
13b90 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
13ba0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 6f            set do
13bb0 63 75 6d 65 6e 74 20 5b 6f 62 6a 65 63 74 20 63  cument [object c
13bc0 72 65 61 74 65 20 2d 61 6c 69 61 73 20 53 79 73  reate -alias Sys
13bd0 74 65 6d 2e 58 6d 6c 2e 58 6d 6c 44 6f 63 75 6d  tem.Xml.XmlDocum
13be0 65 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ent]..          
13bf0 24 64 6f 63 75 6d 65 6e 74 20 4c 6f 61 64 58 6d  $document LoadXm
13c00 6c 20 5b 72 65 61 64 46 69 6c 65 20 24 66 69 6c  l [readFile $fil
13c10 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
13c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
13c30 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74   # NOTE: Setup t
13c40 68 65 20 58 4d 4c 20 6e 61 6d 65 73 70 61 63 65  he XML namespace
13c50 20 6d 61 6e 61 67 65 72 20 66 6f 72 20 75 73 65   manager for use
13c60 20 77 68 65 6e 20 75 73 69 6e 67 20 58 50 61 74   when using XPat
13c70 68 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  h..          #  
13c80 20 20 20 20 20 74 6f 20 71 75 65 72 79 20 74 68       to query th
13c90 65 20 58 4d 4c 20 64 6f 63 75 6d 65 6e 74 2e 0d  e XML document..
13ca0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
13cb0 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
13cc0 54 61 62 6c 65 20 5b 24 64 6f 63 75 6d 65 6e 74  Table [$document
13cd0 20 4e 61 6d 65 54 61 62 6c 65 5d 0d 0a 0d 0a 20   NameTable].... 
13ce0 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d           set nam
13cf0 65 73 70 61 63 65 4d 61 6e 61 67 65 72 20 5b 6f  espaceManager [o
13d00 62 6a 65 63 74 20 63 72 65 61 74 65 20 5c 0d 0a  bject create \..
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 61                -a
13d20 6c 69 61 73 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  lias System.Xml.
13d30 58 6d 6c 4e 61 6d 65 73 70 61 63 65 4d 61 6e 61  XmlNamespaceMana
13d40 67 65 72 20 24 6e 61 6d 65 54 61 62 6c 65 5d 0d  ger $nameTable].
13d50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  ...          $na
13d60 6d 65 73 70 61 63 65 4d 61 6e 61 67 65 72 20 41  mespaceManager A
13d70 64 64 4e 61 6d 65 73 70 61 63 65 20 6d 64 61 20  ddNamespace mda 
13d80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13d90 20 68 74 74 70 3a 2f 2f 73 63 68 65 6d 61 73 2e   http://schemas.
13da0 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 43 4c  microsoft.com/CL
13db0 52 2f 32 30 30 34 2f 31 30 2f 6d 64 61 0d 0a 0d  R/2004/10/mda...
13dc0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
13dd0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13de0 53 65 6c 65 63 74 20 61 6c 6c 20 6e 6f 64 65 73  Select all nodes
13df0 20 75 6e 64 65 72 6e 65 61 74 68 20 74 68 65 20   underneath the 
13e00 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 20 74  location where t
13e10 68 65 79 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20  hey should..    
13e20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
13e30 73 69 64 65 20 69 6e 20 74 68 65 20 4d 44 41 20  side in the MDA 
13e40 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 58 4d  configuration XM
13e50 4c 20 64 6f 63 75 6d 65 6e 74 2e 0d 0a 20 20 20  L document...   
13e60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13e70 20 20 20 20 73 65 74 20 6e 6f 64 65 73 20 5b 24      set nodes [$
13e80 64 6f 63 75 6d 65 6e 74 20 53 65 6c 65 63 74 4e  document SelectN
13e90 6f 64 65 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  odes \..        
13ea0 20 20 20 20 20 20 2f 6d 64 61 3a 6d 64 61 43 6f        /mda:mdaCo
13eb0 6e 66 69 67 2f 6d 64 61 3a 61 73 73 69 73 74 61  nfig/mda:assista
13ec0 6e 74 73 2f 2a 20 24 6e 61 6d 65 73 70 61 63 65  nts/* $namespace
13ed0 4d 61 6e 61 67 65 72 5d 0d 0a 0d 0a 20 20 20 20  Manager]....    
13ee0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13ef0 20 20 20 23 20 4e 4f 54 45 3a 20 50 6f 70 75 6c     # NOTE: Popul
13f00 61 74 65 20 74 68 65 20 6c 6f 63 61 6c 20 72 65  ate the local re
13f10 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20 77 69  sult variable wi
13f20 74 68 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0d  th the names of.
13f30 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
13f40 20 20 20 61 6c 6c 20 74 68 65 20 58 4d 4c 20 6e     all the XML n
13f50 6f 64 65 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20  odes found...   
13f60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13f70 20 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6f      set names [o
13f80 62 6a 65 63 74 20 6c 6d 61 70 20 2d 61 6c 69 61  bject lmap -alia
13f90 73 20 6e 6f 64 65 20 24 6e 6f 64 65 73 20 7b 0d  s node $nodes {.
13fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 6f  .            $no
13fb0 64 65 20 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  de Name..       
13fc0 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 20 20 7d     }]..        }
13fd0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
13fe0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13ff0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
14000 6b 2c 20 74 68 65 20 58 4d 4c 20 63 6f 6e 66 69  k, the XML confi
14010 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 77 61  guration file wa
14020 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 70 61 72  s loaded and par
14030 73 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23  sed..          #
14040 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79         correctly
14050 2c 20 73 65 65 20 69 66 20 61 6e 79 20 6d 61 6e  , see if any man
14060 61 67 65 64 20 64 65 62 75 67 67 69 6e 67 20 61  aged debugging a
14070 73 73 69 73 74 61 6e 74 73 20 77 65 72 65 0d 0a  ssistants were..
14080 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14090 20 20 66 6f 75 6e 64 20 65 6e 61 62 6c 65 64 20    found enabled 
140a0 77 69 74 68 69 6e 20 69 74 2e 0d 0a 20 20 20 20  within it...    
140b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
140c0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
140d0 73 74 73 20 6e 61 6d 65 73 5d 20 26 26 20 5b 6c  sts names] && [l
140e0 6c 65 6e 67 74 68 20 24 6e 61 6d 65 73 5d 20 3e  length $names] >
140f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
14100 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14110 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14120 64 64 20 61 20 74 65 73 74 20 63 6f 6e 73 74 72  dd a test constr
14130 61 69 6e 74 20 66 6f 72 20 65 61 63 68 20 6d 61  aint for each ma
14140 6e 61 67 65 64 20 64 65 62 75 67 67 69 6e 67 0d  naged debugging.
14150 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
14160 20 20 20 20 20 61 73 73 69 73 74 61 6e 74 20 74       assistant t
14170 68 61 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  hat appears to b
14180 65 20 65 6e 61 62 6c 65 64 2e 0d 0a 20 20 20 20  e enabled...    
14190 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
141a0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
141b0 61 69 6e 74 20 6d 64 61 0d 0a 0d 0a 20 20 20 20  aint mda....    
141c0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
141d0 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20  name $names {.. 
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
141f0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
14200 6e 64 41 72 67 73 20 6d 64 61 2e 20 24 6e 61 6d  ndArgs mda. $nam
14210 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
14220 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
14230 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
14240 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
14250 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64   list of managed
14260 20 64 65 62 75 67 67 69 6e 67 20 61 73 73 69 73   debugging assis
14270 74 61 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20  tants for..     
14280 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
14290 61 74 65 72 20 75 73 65 20 62 79 20 74 68 65 20  ater use by the 
142a0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
142b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
142c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
142d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
142e0 65 74 4d 64 61 73 29 5d 7d 20 74 68 65 6e 20 7b  etMdas)]} then {
142f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14300 73 65 74 20 3a 3a 74 65 73 74 5f 6d 64 61 73 20  set ::test_mdas 
14310 24 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20  $names..        
14320 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
14330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14340 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
14350 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
14360 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 61   at least one ma
14370 6e 61 67 65 64 20 64 65 62 75 67 67 69 6e 67 0d  naged debugging.
14380 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
14390 20 20 20 20 20 61 73 73 69 73 74 61 6e 74 20 69       assistant i
143a0 73 20 65 6e 61 62 6c 65 64 2e 0d 0a 20 20 20 20  s enabled...    
143b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
143c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
143d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
143e0 73 20 22 79 65 73 20 28 22 20 24 6e 61 6d 65 73  s "yes (" $names
143f0 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
14400 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14410 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
14420 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20   are done here, 
14430 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20  return now...   
14440 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14450 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
14460 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14470 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
14480 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
14490 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
144a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
144b0 20 63 68 65 63 6b 46 6f 72 53 74 72 6f 6e 67 4e   checkForStrongN
144c0 61 6d 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ame { channel } 
144d0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
144e0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
144f0 65 63 6b 69 6e 67 20 66 6f 72 20 73 74 72 6f 6e  ecking for stron
14500 67 20 6e 61 6d 65 2e 2e 2e 20 22 0d 0a 0d 0a 20  g name... ".... 
14510 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
14520 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
14530 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
14540 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 47  eter.GetActive G
14550 65 74 53 74 72 6f 6e 67 4e 61 6d 65 0d 0a 20 20  etStrongName..  
14560 20 20 20 20 7d 20 73 74 72 6f 6e 67 4e 61 6d 65      } strongName
14570 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e  ] == 0 && [strin
14580 67 20 6c 65 6e 67 74 68 20 24 73 74 72 6f 6e 67  g length $strong
14590 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
145a0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
145b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
145c0 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68  s, it appears th
145d0 61 74 20 74 68 65 20 63 6f 72 65 20 6c 69 62 72  at the core libr
145e0 61 72 79 20 77 61 73 20 73 69 67 6e 65 64 20 77  ary was signed w
145f0 69 74 68 20 61 0d 0a 20 20 20 20 20 20 20 20 23  ith a..        #
14600 20 20 20 20 20 20 20 73 74 72 6f 6e 67 20 6e 61         strong na
14610 6d 65 20 6b 65 79 2e 0d 0a 20 20 20 20 20 20 20  me key...       
14620 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
14630 6f 6e 73 74 72 61 69 6e 74 20 73 74 72 6f 6e 67  onstraint strong
14640 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Name....        
14650 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
14660 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
14670 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
14680 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
14690 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
146a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
146b0 68 65 63 6b 46 6f 72 53 74 72 6f 6e 67 4e 61 6d  heckForStrongNam
146c0 65 4b 65 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  eKey { channel }
146d0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
146e0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
146f0 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 74 72 6f  hecking for stro
14700 6e 67 20 6e 61 6d 65 20 6b 65 79 2e 2e 2e 20 22  ng name key... "
14710 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
14720 61 74 63 68 20 7b 69 6e 66 6f 20 65 6e 67 69 6e  atch {info engin
14730 65 20 50 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e  e PublicKeyToken
14740 7d 20 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e  } publicKeyToken
14750 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20  ] == 0 && \..   
14760 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
14770 65 6e 67 74 68 20 24 70 75 62 6c 69 63 4b 65 79  ength $publicKey
14780 54 6f 6b 65 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  Token] > 0} then
14790 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
147a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
147b0 64 64 20 61 20 74 65 73 74 20 63 6f 6e 73 74 72  dd a test constr
147c0 61 69 6e 74 20 66 6f 72 20 74 68 69 73 20 73 70  aint for this sp
147d0 65 63 69 66 69 63 20 73 74 72 6f 6e 67 20 6e 61  ecific strong na
147e0 6d 65 20 6b 65 79 2e 0d 0a 20 20 20 20 20 20 20  me key...       
147f0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
14800 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
14810 64 41 72 67 73 20 73 74 72 6f 6e 67 4e 61 6d 65  dArgs strongName
14820 2e 20 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65  . $publicKeyToke
14830 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
14840 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
14850 20 53 68 6f 77 20 74 68 65 20 73 74 72 6f 6e 67   Show the strong
14860 20 6e 61 6d 65 20 6b 65 79 20 74 68 61 74 20 77   name key that w
14870 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  e found...      
14880 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
14890 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
148a0 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
148b0 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20  $publicKeyToken 
148c0 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ")\n"]....      
148d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
148e0 55 47 42 55 47 3a 20 54 63 6c 20 38 2e 34 20 64  UGBUG: Tcl 8.4 d
148f0 6f 65 73 20 6e 6f 74 20 73 65 65 6d 20 74 6f 20  oes not seem to 
14900 6c 69 6b 65 20 74 68 69 73 20 65 78 70 72 65 73  like this expres
14910 73 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0d  sion because it.
14920 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14930 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20     contains the 
14940 22 6e 69 22 20 6f 70 65 72 61 74 6f 72 20 61 64  "ni" operator ad
14950 64 65 64 20 69 6e 20 54 63 6c 20 38 2e 35 20 28  ded in Tcl 8.5 (
14960 61 6e 64 20 54 63 6c 20 38 2e 34 0d 0a 20 20 20  and Tcl 8.4..   
14970 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 74       #         t
14980 72 69 65 73 20 74 6f 20 63 6f 6d 70 69 6c 65 20  ries to compile 
14990 69 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  it even though i
149a0 74 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 65  t will only be e
149b0 76 61 6c 75 61 74 65 64 0d 0a 20 20 20 20 20 20  valuated..      
149c0 20 20 23 20 20 20 20 20 20 20 20 20 69 6e 20 45    #         in E
149d0 61 67 6c 65 29 2e 0d 0a 20 20 20 20 20 20 20 20  agle)...        
149e0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  #..        set e
149f0 78 70 72 20 7b 24 70 75 62 6c 69 63 4b 65 79 54  xpr {$publicKeyT
14a00 6f 6b 65 6e 20 6e 69 20 5c 0d 0a 20 20 20 20 20  oken ni \..     
14a10 20 20 20 20 20 20 20 22 32 39 63 36 32 39 37 36         "29c62976
14a20 33 30 62 65 30 35 65 62 20 31 65 32 32 65 63 36  30be05eb 1e22ec6
14a30 37 38 37 39 37 33 39 61 32 20 33 35 38 30 33 30  7879739a2 358030
14a40 30 36 33 61 38 33 32 62 63 33 22 7d 0d 0a 0d 0a  063a832bc3"}....
14a50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70          if {[exp
14a60 72 20 24 65 78 70 72 5d 7d 20 74 68 65 6e 20 7b  r $expr]} then {
14a70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
14a80 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
14a90 20 54 68 65 20 45 61 67 6c 65 20 63 6f 72 65 20   The Eagle core 
14aa0 6c 69 62 72 61 72 79 20 69 73 20 73 74 72 6f 6e  library is stron
14ab0 67 20 6e 61 6d 65 20 73 69 67 6e 65 64 20 77 69  g name signed wi
14ac0 74 68 20 61 20 6b 65 79 20 74 68 61 74 0d 0a 20  th a key that.. 
14ad0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14ae0 20 69 73 20 6e 6f 74 20 6f 66 66 69 63 69 61 6c   is not official
14af0 2e 20 20 54 68 69 73 20 69 73 20 61 6c 73 6f 20  .  This is also 
14b00 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2c 20 70 65  not an error, pe
14b10 72 20 73 65 3b 20 68 6f 77 65 76 65 72 2c 0d 0a  r se; however,..
14b20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14b30 20 20 69 74 20 6d 61 79 20 63 61 75 73 65 20 73    it may cause s
14b40 6f 6d 65 20 74 65 73 74 73 20 74 6f 20 66 61 69  ome tests to fai
14b50 6c 20 61 6e 64 20 69 74 20 73 68 6f 75 6c 64 20  l and it should 
14b60 62 65 20 72 65 70 6f 72 74 65 64 20 74 6f 0d 0a  be reported to..
14b70 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14b80 20 20 74 68 65 20 75 73 65 72 20 61 6e 64 20 6e    the user and n
14b90 6f 74 65 64 20 69 6e 20 74 68 65 20 74 65 73 74  oted in the test
14ba0 20 73 75 69 74 65 20 6c 6f 67 20 66 69 6c 65 2e   suite log file.
14bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
14bc0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
14bd0 74 72 61 69 6e 74 20 73 74 72 6f 6e 67 4e 61 6d  traint strongNam
14be0 65 2e 75 6e 6f 66 66 69 63 69 61 6c 0d 0a 0d 0a  e.unofficial....
14bf0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14c00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
14c10 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 2c  nless forbidden,
14c20 20 69 73 73 75 65 20 61 6e 64 20 6c 6f 67 20 61   issue and log a
14c30 20 77 61 72 6e 69 6e 67 2e 0d 0a 20 20 20 20 20   warning...     
14c40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14c50 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14c60 73 74 73 20 6e 6f 28 77 61 72 6e 69 6e 67 46 6f  sts no(warningFo
14c70 72 53 74 72 6f 6e 67 4e 61 6d 65 4b 65 79 29 5d  rStrongNameKey)]
14c80 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
14c90 20 20 20 20 20 21 5b 68 61 76 65 43 6f 6e 73 74       ![haveConst
14ca0 72 61 69 6e 74 20 71 75 69 65 74 5d 7d 20 74 68  raint quiet]} th
14cb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14cc0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14cd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 75  "==== WARNING: u
14d00 6e 6f 66 66 69 63 69 61 6c 20 45 61 67 6c 65 20  nofficial Eagle 
14d10 73 74 72 6f 6e 67 20 6e 61 6d 65 20 73 69 67 6e  strong name sign
14d20 61 74 75 72 65 20 22 20 5c 0d 0a 20 20 20 20 20  ature " \..     
14d30 20 20 20 20 20 20 20 20 20 20 20 22 64 65 74 65             "dete
14d40 63 74 65 64 3a 20 22 20 24 70 75 62 6c 69 63 4b  cted: " $publicK
14d50 65 79 54 6f 6b 65 6e 20 5c 6e 5d 0d 0a 20 20 20  eyToken \n]..   
14d60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14d70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14d90 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 76 65 72     # NOTE: Sever
14da0 61 6c 20 74 65 73 74 73 20 72 65 71 75 69 72 65  al tests require
14db0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 66 66 69   one of the offi
14dc0 63 69 61 6c 20 73 74 72 6f 6e 67 20 6e 61 6d 65  cial strong name
14dd0 20 6b 65 79 73 20 74 6f 0d 0a 20 20 20 20 20 20   keys to..      
14de0 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 75      #       be u
14df0 73 65 64 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  sed in order for
14e00 20 74 68 65 6d 20 74 6f 20 70 61 73 73 2e 0d 0a   them to pass...
14e10 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14e20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
14e30 61 69 6e 74 20 73 74 72 6f 6e 67 4e 61 6d 65 2e  aint strongName.
14e40 6f 66 66 69 63 69 61 6c 0d 0a 0d 0a 20 20 20 20  official....    
14e50 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
14e60 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
14e70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14e80 20 20 22 2d 2d 2d 2d 20 6f 66 66 69 63 69 61 6c    "---- official
14e90 20 45 61 67 6c 65 20 73 74 72 6f 6e 67 20 6e 61   Eagle strong na
14ea0 6d 65 20 73 69 67 6e 61 74 75 72 65 20 64 65 74  me signature det
14eb0 65 63 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20  ected: " \..    
14ec0 20 20 20 20 20 20 20 20 20 20 24 70 75 62 6c 69            $publi
14ed0 63 4b 65 79 54 6f 6b 65 6e 20 5c 6e 5d 0d 0a 20  cKeyToken \n].. 
14ee0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14ef0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14f00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14f10 4f 54 45 3a 20 54 68 65 20 45 61 67 6c 65 20 63  OTE: The Eagle c
14f20 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 6e  ore library is n
14f30 6f 74 20 73 69 67 6e 65 64 20 77 69 74 68 20 61  ot signed with a
14f40 20 73 74 72 6f 6e 67 20 6e 61 6d 65 20 6b 65 79   strong name key
14f50 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
14f60 20 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61     This is not a
14f70 6e 20 65 72 72 6f 72 2c 20 70 65 72 20 73 65 3b  n error, per se;
14f80 20 68 6f 77 65 76 65 72 2c 20 69 74 20 6d 61 79   however, it may
14f90 20 63 61 75 73 65 20 73 65 6c 65 63 74 65 64 0d   cause selected.
14fa0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14fb0 20 74 65 73 74 73 20 74 6f 20 66 61 69 6c 20 61   tests to fail a
14fc0 6e 64 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  nd it should be 
14fd0 72 65 70 6f 72 74 65 64 20 74 6f 20 74 68 65 20  reported to the 
14fe0 75 73 65 72 20 61 6e 64 20 6e 6f 74 65 64 0d 0a  user and noted..
14ff0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15000 69 6e 20 74 68 65 20 74 65 73 74 20 73 75 69 74  in the test suit
15010 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20  e log file...   
15020 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15030 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 74  addConstraint st
15040 72 6f 6e 67 4e 61 6d 65 2e 6e 6f 6e 65 0d 0a 0d  rongName.none...
15050 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15060 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
15070 20 74 68 61 74 20 77 65 20 64 69 64 20 6e 6f 74   that we did not
15080 20 66 69 6e 64 20 61 20 73 74 72 6f 6e 67 20 6e   find a strong n
15090 61 6d 65 20 6b 65 79 2e 0d 0a 20 20 20 20 20 20  ame key...      
150a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
150b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
150c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
150d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
150e0 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 2c  nless forbidden,
150f0 20 69 73 73 75 65 20 61 6e 64 20 6c 6f 67 20 61   issue and log a
15100 20 77 61 72 6e 69 6e 67 2e 0d 0a 20 20 20 20 20   warning...     
15110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
15120 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15130 6e 6f 28 77 61 72 6e 69 6e 67 46 6f 72 53 74 72  no(warningForStr
15140 6f 6e 67 4e 61 6d 65 4b 65 79 29 5d 20 26 26 20  ongNameKey)] && 
15150 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21  \..            !
15160 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
15170 71 75 69 65 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  quiet]} then {..
15180 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15190 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
151a0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
151b0 57 41 52 4e 49 4e 47 3a 20 6e 6f 20 45 61 67 6c  WARNING: no Eagl
151c0 65 20 73 74 72 6f 6e 67 20 6e 61 6d 65 20 73 69  e strong name si
151d0 67 6e 61 74 75 72 65 20 64 65 74 65 63 74 65 64  gnature detected
151e0 2e 2e 2e 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20  ...\n"..        
151f0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
15200 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
15210 68 65 63 6b 46 6f 72 43 65 72 74 69 66 69 63 61  heckForCertifica
15220 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  te { channel } {
15230 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
15240 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
15250 63 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  cking for certif
15260 69 63 61 74 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  icate... "....  
15270 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
15280 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
15290 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
152a0 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 47 65  ter.GetActive Ge
152b0 74 43 65 72 74 69 66 69 63 61 74 65 0d 0a 20 20  tCertificate..  
152c0 20 20 20 20 7d 20 63 65 72 74 69 66 69 63 61 74      } certificat
152d0 65 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69  e] == 0 && [stri
152e0 6e 67 20 6c 65 6e 67 74 68 20 24 63 65 72 74 69  ng length $certi
152f0 66 69 63 61 74 65 5d 20 3e 20 30 7d 20 74 68 65  ficate] > 0} the
15300 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
15310 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15320 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
15330 74 68 61 74 20 74 68 65 20 63 6f 72 65 20 6c 69  that the core li
15340 62 72 61 72 79 20 77 61 73 20 73 69 67 6e 65 64  brary was signed
15350 20 77 69 74 68 20 61 0d 0a 20 20 20 20 20 20 20   with a..       
15360 20 23 20 20 20 20 20 20 20 63 6f 64 65 2d 73 69   #       code-si
15370 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
15380 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
15390 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
153a0 61 69 6e 74 20 63 65 72 74 69 66 69 63 61 74 65  aint certificate
153b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
153c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
153d0 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20  ttempt to query 
153e0 74 68 65 20 73 75 62 6a 65 63 74 20 66 72 6f 6d  the subject from
153f0 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
15400 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15410 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
15420 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
15430 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 65 72  ject invoke $cer
15440 74 69 66 69 63 61 74 65 20 53 75 62 6a 65 63 74  tificate Subject
15450 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 75 62 6a  ..        } subj
15460 65 63 74 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20  ect] || [string 
15470 6c 65 6e 67 74 68 20 24 73 75 62 6a 65 63 74 5d  length $subject]
15480 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
15490 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
154a0 20 20 20 20 20 20 23 20 54 4f 44 4f 3a 20 4e 6f        # TODO: No
154b0 20 63 65 72 74 69 66 69 63 61 74 65 20 73 75 62   certificate sub
154c0 6a 65 63 74 2c 20 62 65 74 74 65 72 20 68 61 6e  ject, better han
154d0 64 6c 69 6e 67 20 68 65 72 65 3f 0d 0a 20 20 20  dling here?..   
154e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
154f0 20 20 20 20 73 65 74 20 73 75 62 6a 65 63 74 20      set subject 
15500 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
15510 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
15520 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
15530 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
15540 20 24 73 75 62 6a 65 63 74 20 22 29 5c 6e 22 5d   $subject ")\n"]
15550 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
15560 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
15570 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
15580 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
15590 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
155a0 46 6f 72 43 6f 6d 70 69 6c 65 43 53 68 61 72 70  ForCompileCSharp
155b0 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
155c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
155d0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
155e0 69 6e 67 20 66 6f 72 20 74 65 73 74 20 75 73 65  ing for test use
155f0 20 6f 66 20 43 23 20 63 6f 6d 70 69 6c 65 72 2e   of C# compiler.
15600 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
15610 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15620 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 43 53 68 61  ::no(compileCSha
15630 72 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rp)]} then {..  
15640 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
15650 69 6e 74 20 63 6f 6d 70 69 6c 65 43 53 68 61 72  int compileCShar
15660 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  p....        tpu
15670 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
15680 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
15690 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
156a0 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
156b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
156c0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
156d0 6b 46 6f 72 41 64 6d 69 6e 69 73 74 72 61 74 6f  kForAdministrato
156e0 72 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  r { channel } {.
156f0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
15700 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
15710 6b 69 6e 67 20 66 6f 72 20 61 64 6d 69 6e 69 73  king for adminis
15720 74 72 61 74 6f 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  trator... ".... 
15730 20 20 20 20 20 69 66 20 7b 5b 69 73 54 65 73 74       if {[isTest
15740 41 64 6d 69 6e 69 73 74 72 61 74 6f 72 5d 7d 20  Administrator]} 
15750 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15760 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 61 64  addConstraint ad
15770 6d 69 6e 69 73 74 72 61 74 6f 72 3b 20 23 20 72  ministrator; # r
15780 75 6e 6e 69 6e 67 20 61 73 20 66 75 6c 6c 20 61  unning as full a
15790 64 6d 69 6e 2e 0d 0a 0d 0a 20 20 20 20 20 20 20  dmin.....       
157a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
157b0 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  yes\n..      } e
157c0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
157d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
157e0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
157f0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
15800 63 68 65 63 6b 46 6f 72 48 6f 73 74 20 7b 20 63  checkForHost { c
15810 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
15820 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15830 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
15840 66 6f 72 20 68 6f 73 74 2e 2e 2e 20 22 0d 0a 0d  for host... "...
15850 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
15860 68 20 7b 68 6f 73 74 20 69 73 6f 70 65 6e 7d 20  h {host isopen} 
15870 6f 70 65 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  open] == 0} then
15880 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
15890 24 6f 70 65 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20  $open} then {.. 
158a0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
158b0 74 72 61 69 6e 74 20 68 6f 73 74 49 73 4f 70 65  traint hostIsOpe
158c0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n....          t
158d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6f 70  puts $channel op
158e0 65 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  en\n..        } 
158f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15900 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 68 6f    if {[catch {ho
15910 73 74 20 72 65 64 69 72 65 63 74 65 64 20 49 6e  st redirected In
15920 70 75 74 7d 20 72 65 64 69 72 65 63 74 65 64 5d  put} redirected]
15930 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
15940 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
15950 72 65 64 69 72 65 63 74 65 64 7d 20 74 68 65 6e  redirected} then
15960 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15970 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
15980 68 6f 73 74 49 6e 70 75 74 52 65 64 69 72 65 63  hostInputRedirec
15990 74 65 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ted....         
159a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
159b0 6e 65 6c 20 72 65 64 69 72 65 63 74 65 64 5c 6e  nel redirected\n
159c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
159d0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
159e0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
159f0 69 6e 74 20 68 6f 73 74 49 73 43 6c 6f 73 65 64  int hostIsClosed
15a00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15a10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15a20 20 63 6c 6f 73 65 64 5c 6e 0d 0a 20 20 20 20 20   closed\n..     
15a30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15a40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
15a50 20 20 20 20 20 20 20 20 20 20 74 6c 6f 67 20 24            tlog $
15a60 72 65 64 69 72 65 63 74 65 64 3b 20 74 70 75 74  redirected; tput
15a70 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72  s $channel error
15a80 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
15a90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15aa0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15ab0 20 20 20 20 74 6c 6f 67 20 24 6f 70 65 6e 3b 20      tlog $open; 
15ac0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65  tputs $channel e
15ad0 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  rror\n..      }.
15ae0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
15af0 72 6f 63 20 63 68 65 63 6b 46 6f 72 48 6f 73 74  roc checkForHost
15b00 54 79 70 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  Type { channel }
15b10 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
15b20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
15b30 68 65 63 6b 69 6e 67 20 66 6f 72 20 68 6f 73 74  hecking for host
15b40 20 74 79 70 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   type... "....  
15b50 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
15b60 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  e [catch {..    
15b70 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
15b80 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
15b90 74 41 63 74 69 76 65 2e 48 6f 73 74 2e 47 65 74  tActive.Host.Get
15ba0 54 79 70 65 20 54 6f 53 74 72 69 6e 67 0d 0a 20  Type ToString.. 
15bb0 20 20 20 20 20 7d 20 68 6f 73 74 54 79 70 65 5d       } hostType]
15bc0 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e  ] == 0 && [strin
15bd0 67 20 6c 65 6e 67 74 68 20 24 68 6f 73 74 54 79  g length $hostTy
15be0 70 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  pe] > 0} then {.
15bf0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
15c00 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
15c10 67 73 20 68 6f 73 74 54 79 70 65 2e 20 5b 73 74  gs hostType. [st
15c20 72 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20 20 20  ring map \..    
15c30 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 2c 20          [list , 
15c40 5f 20 2b 20 5f 20 26 20 5f 20 2a 20 5f 20 5c 5b  _ + _ & _ * _ \[
15c50 20 5f 20 5c 5d 20 5f 20 2e 20 5f 20 5c 5c 20 5f   _ \] _ . _ \\ _
15c60 5d 20 24 68 6f 73 74 54 79 70 65 5d 5d 0d 0a 0d  ] $hostType]]...
15c70 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
15c80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15c90 72 67 73 20 24 68 6f 73 74 54 79 70 65 20 5c 6e  rgs $hostType \n
15ca0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
15cb0 66 20 7b 24 63 6f 64 65 20 3d 3d 20 30 7d 20 74  f {$code == 0} t
15cc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
15cd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e  puts $channel un
15ce0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 7d  known\n..      }
15cf0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
15d00 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15d10 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d  error\n..      }
15d20 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15d30 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 50 72 69  proc checkForPri
15d40 6d 61 72 79 54 68 72 65 61 64 20 7b 20 63 68 61  maryThread { cha
15d50 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
15d60 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
15d70 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
15d80 72 20 70 72 69 6d 61 72 79 20 74 68 72 65 61 64  r primary thread
15d90 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
15da0 66 20 7b 5b 69 6e 66 6f 20 74 69 64 5d 20 3d 3d  f {[info tid] ==
15db0 20 5b 73 65 74 20 74 68 72 65 61 64 49 64 20 5b   [set threadId [
15dc0 69 6e 66 6f 20 70 74 69 64 5d 5d 7d 20 74 68 65  info ptid]]} the
15dd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  n {..        add
15de0 43 6f 6e 73 74 72 61 69 6e 74 20 70 72 69 6d 61  Constraint prima
15df0 72 79 54 68 72 65 61 64 0d 0a 0d 0a 20 20 20 20  ryThread....    
15e00 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
15e10 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
15e20 79 65 73 20 28 22 20 24 74 68 72 65 61 64 49 64  yes (" $threadId
15e30 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
15e40 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
15e50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15e60 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 20  [appendArgs "no 
15e70 28 22 20 24 74 68 72 65 61 64 49 64 20 22 29 5c  (" $threadId ")\
15e80 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n"]..      }..  
15e90 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15ea0 20 63 68 65 63 6b 46 6f 72 44 65 66 61 75 6c 74   checkForDefault
15eb0 41 70 70 44 6f 6d 61 69 6e 20 7b 20 63 68 61 6e  AppDomain { chan
15ec0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
15ed0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
15ee0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
15ef0 20 64 65 66 61 75 6c 74 20 61 70 70 6c 69 63 61   default applica
15f00 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 2e 2e 20 22  tion domain... "
15f10 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
15f20 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
15f30 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70  object invoke Ap
15f40 70 44 6f 6d 61 69 6e 20 43 75 72 72 65 6e 74 44  pDomain CurrentD
15f50 6f 6d 61 69 6e 0d 0a 20 20 20 20 20 20 7d 20 61  omain..      } a
15f60 70 70 44 6f 6d 61 69 6e 5d 20 3d 3d 20 30 20 26  ppDomain] == 0 &
15f70 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  & [string length
15f80 20 24 61 70 70 44 6f 6d 61 69 6e 5d 20 3e 20 30   $appDomain] > 0
15f90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15fa0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
15fb0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
15fc0 20 69 6e 76 6f 6b 65 20 24 61 70 70 44 6f 6d 61   invoke $appDoma
15fd0 69 6e 20 49 73 44 65 66 61 75 6c 74 41 70 70 44  in IsDefaultAppD
15fe0 6f 6d 61 69 6e 0d 0a 20 20 20 20 20 20 20 20 7d  omain..        }
15ff0 20 64 65 66 61 75 6c 74 5d 20 7c 7c 20 5b 73 74   default] || [st
16000 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 65 66  ring length $def
16010 61 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ault] == 0} then
16020 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
16030 74 20 64 65 66 61 75 6c 74 20 66 61 6c 73 65 0d  t default false.
16040 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
16050 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
16060 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
16070 24 61 70 70 44 6f 6d 61 69 6e 20 49 64 7d 20 69  $appDomain Id} i
16080 64 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  d] || \..       
16090 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
160a0 67 74 68 20 24 69 64 5d 20 3d 3d 20 30 7d 20 74  gth $id] == 0} t
160b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
160c0 20 73 65 74 20 69 64 20 75 6e 6b 6e 6f 77 6e 0d   set id unknown.
160d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
160e0 20 20 20 20 20 20 69 66 20 7b 24 64 65 66 61 75        if {$defau
160f0 6c 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  lt} then {..    
16100 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
16110 69 6e 74 20 64 65 66 61 75 6c 74 41 70 70 44 6f  int defaultAppDo
16120 6d 61 69 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  main....        
16130 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16140 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
16150 73 20 28 22 20 24 69 64 20 22 29 5c 6e 22 5d 0d  s (" $id ")\n"].
16160 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
16170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
16180 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16190 65 6e 64 41 72 67 73 20 22 6e 6f 20 28 22 20 24  endArgs "no (" $
161a0 69 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  id ")\n"]..     
161b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
161c0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
161d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
161e0 70 65 6e 64 41 72 67 73 20 22 6e 6f 20 28 6e 75  pendArgs "no (nu
161f0 6c 6c 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d  ll)\n"]..      }
16200 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16210 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 52 75 6e  proc checkForRun
16220 74 69 6d 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  time { channel }
16230 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
16240 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
16250 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 75 6e 74  hecking for runt
16260 69 6d 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ime... "....    
16270 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16280 45 3a 20 41 72 65 20 77 65 20 72 75 6e 6e 69 6e  E: Are we runnin
16290 67 20 69 6e 73 69 64 65 20 4d 6f 6e 6f 20 28 72  g inside Mono (r
162a0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6f 70 65  egardless of ope
162b0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 29 3f 0d  rating system)?.
162c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
162d0 69 66 20 7b 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d  if {[isTestMono]
162e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
162f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16300 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70  OTE: Yes, it app
16310 65 61 72 73 20 74 68 61 74 20 77 65 20 61 72 65  ears that we are
16320 20 72 75 6e 6e 69 6e 67 20 69 6e 73 69 64 65 20   running inside 
16330 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23  Mono...        #
16340 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
16350 73 74 72 61 69 6e 74 20 6d 6f 6e 6f 3b 20 23 20  straint mono; # 
16360 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 2e  running on Mono.
16370 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
16380 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16390 6e 64 41 72 67 73 20 5b 65 78 70 72 20 7b 5b 69  ndArgs [expr {[i
163a0 6e 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a 20 20  nfo exists \..  
163b0 20 20 20 20 20 20 20 20 20 20 3a 3a 65 61 67 6c            ::eagl
163c0 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69  e_platform(runti
163d0 6d 65 29 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  me)] ? \..      
163e0 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70        $::eagle_p
163f0 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65 29  latform(runtime)
16400 20 3a 20 22 4d 6f 6e 6f 22 7d 5d 20 5c 6e 5d 0d   : "Mono"}] \n].
16410 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
16420 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16430 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 2c 20      # NOTE: No, 
16440 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
16450 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  we are not runni
16460 6e 67 20 69 6e 73 69 64 65 20 4d 6f 6e 6f 2e 0d  ng inside Mono..
16470 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16480 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
16490 74 20 64 6f 74 4e 65 74 3b 20 23 20 72 75 6e 6e  t dotNet; # runn
164a0 69 6e 67 20 6f 6e 20 2e 4e 45 54 2e 0d 0a 0d 0a  ing on .NET.....
164b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
164c0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f     # NOTE: We do
164d0 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 73 6b 69   not want to ski
164e0 70 20 4d 6f 6e 6f 20 62 75 67 73 20 6f 6e 20 2e  p Mono bugs on .
164f0 4e 45 54 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  NET...        #.
16500 0a 20 20 20 20 20 20 20 20 61 64 64 4b 6e 6f 77  .        addKnow
16510 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61 69 6e 74 73  nMonoConstraints
16520 20 74 72 75 65 3b 20 23 20 72 75 6e 6e 69 6e 67   true; # running
16530 20 6f 6e 20 2e 4e 45 54 2e 0d 0a 0d 0a 20 20 20   on .NET.....   
16540 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16550 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16560 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69  [expr {[info exi
16570 73 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  sts \..         
16580 20 20 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66     ::eagle_platf
16590 6f 72 6d 28 72 75 6e 74 69 6d 65 29 5d 20 3f 20  orm(runtime)] ? 
165a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
165b0 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
165c0 28 72 75 6e 74 69 6d 65 29 20 3a 20 22 4d 69 63  (runtime) : "Mic
165d0 72 6f 73 6f 66 74 2e 4e 45 54 22 7d 5d 20 5c 6e  rosoft.NET"}] \n
165e0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
165f0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
16600 68 65 63 6b 46 6f 72 49 6d 61 67 65 52 75 6e 74  heckForImageRunt
16610 69 6d 65 56 65 72 73 69 6f 6e 20 7b 20 63 68 61  imeVersion { cha
16620 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
16630 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
16640 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
16650 72 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20  r image runtime 
16660 76 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a  version... "....
16670 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
16680 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70  exists ::eagle_p
16690 6c 61 74 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e  latform(imageRun
166a0 74 69 6d 65 56 65 72 73 69 6f 6e 29 5d 20 26 26  timeVersion)] &&
166b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
166c0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
166d0 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 69  eagle_platform(i
166e0 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
166f0 6f 6e 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  on)] > 0} then {
16700 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16710 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 65 74       # NOTE: Get
16720 20 74 68 65 20 6d 61 6a 6f 72 20 61 6e 64 20 6d   the major and m
16730 69 6e 6f 72 20 70 6f 72 74 69 6f 6e 73 20 6f 66  inor portions of
16740 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 6e 6c   the version onl
16750 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
16760 20 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65         set dotVe
16770 72 73 69 6f 6e 20 5b 67 65 74 4d 61 6a 6f 72 4d  rsion [getMajorM
16780 69 6e 6f 72 56 65 72 73 69 6f 6e 20 5c 0d 0a 20  inorVersion \.. 
16790 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61             $::ea
167a0 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 69 6d 61  gle_platform(ima
167b0 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  geRuntimeVersion
167c0 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  )]....        #.
167d0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
167e0 20 4e 6f 77 20 63 72 65 61 74 65 20 61 20 76 65   Now create a ve
167f0 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
16800 20 75 73 65 20 69 6e 20 74 68 65 20 63 6f 6e 73   use in the cons
16810 74 72 61 69 6e 74 20 6e 61 6d 65 0d 0a 20 20 20  traint name..   
16820 20 20 20 20 20 23 20 20 20 20 20 20 20 28 72 65       #       (re
16830 6d 6f 76 65 20 74 68 65 20 70 65 72 69 6f 64 73  move the periods
16840 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
16850 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
16860 6f 6e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  on [string map [
16870 6c 69 73 74 20 76 20 22 22 20 2e 20 22 22 5d 20  list v "" . ""] 
16880 24 64 6f 74 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a  $dotVersion]....
16890 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
168a0 20 20 20 23 20 4e 4f 54 45 3a 20 4b 65 65 70 20     # NOTE: Keep 
168b0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 73 70 65  track of the spe
168c0 63 69 66 69 63 20 69 6d 61 67 65 20 72 75 6e 74  cific image runt
168d0 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  ime version for 
168e0 75 73 61 67 65 20 69 6e 0d 0a 20 20 20 20 20 20  usage in..      
168f0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
16900 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
16910 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16920 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
16930 70 70 65 6e 64 41 72 67 73 20 69 6d 61 67 65 52  ppendArgs imageR
16940 75 6e 74 69 6d 65 20 24 76 65 72 73 69 6f 6e 5d  untime $version]
16950 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
16960 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16970 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16980 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70        $::eagle_p
16990 6c 61 74 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e  latform(imageRun
169a0 74 69 6d 65 56 65 72 73 69 6f 6e 29 20 22 20 28  timeVersion) " (
169b0 22 20 24 64 6f 74 56 65 72 73 69 6f 6e 20 22 29  " $dotVersion ")
169c0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
169d0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
169e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
169f0 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
16a00 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
16a10 68 65 63 6b 46 6f 72 46 72 61 6d 65 77 6f 72 6b  heckForFramework
16a20 56 65 72 73 69 6f 6e 20 7b 20 63 68 61 6e 6e 65  Version { channe
16a30 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
16a40 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
16a50 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66  - checking for f
16a60 72 61 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e  ramework version
16a70 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
16a80 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
16a90 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
16aa0 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
16ab0 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  n)] && \..      
16ac0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
16ad0 74 68 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74  th $::eagle_plat
16ae0 66 6f 72 6d 28 66 72 61 6d 65 77 6f 72 6b 56 65  form(frameworkVe
16af0 72 73 69 6f 6e 29 5d 20 3e 20 30 7d 20 74 68 65  rsion)] > 0} the
16b00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
16b10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16b20 47 65 74 20 74 68 65 20 6d 61 6a 6f 72 20 61 6e  Get the major an
16b30 64 20 6d 69 6e 6f 72 20 70 6f 72 74 69 6f 6e 73  d minor portions
16b40 20 6f 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20   of the version 
16b50 6f 6e 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  only...        #
16b60 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 6f  ..        set do
16b70 74 56 65 72 73 69 6f 6e 20 5b 67 65 74 4d 61 6a  tVersion [getMaj
16b80 6f 72 4d 69 6e 6f 72 56 65 72 73 69 6f 6e 20 5c  orMinorVersion \
16b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a  ..            $:
16ba0 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
16bb0 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
16bc0 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  )]....        #.
16bd0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
16be0 20 4e 6f 77 20 63 72 65 61 74 65 20 61 20 76 65   Now create a ve
16bf0 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
16c00 20 75 73 65 20 69 6e 20 74 68 65 20 63 6f 6e 73   use in the cons
16c10 74 72 61 69 6e 74 20 6e 61 6d 65 0d 0a 20 20 20  traint name..   
16c20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 72 65       #       (re
16c30 6d 6f 76 65 20 74 68 65 20 70 65 72 69 6f 64 73  move the periods
16c40 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
16c50 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
16c60 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65  on [getDotlessVe
16c70 72 73 69 6f 6e 20 24 64 6f 74 56 65 72 73 69 6f  rsion $dotVersio
16c80 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
16c90 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
16ca0 20 49 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72   If the framewor
16cb0 6b 20 76 65 72 73 69 6f 6e 20 77 61 73 20 66 6f  k version was fo
16cc0 75 6e 64 2c 20 61 64 64 20 61 20 74 65 73 74 20  und, add a test 
16cd0 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 20 20 20 20  constraint..    
16ce0 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
16cf0 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  it now...       
16d00 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
16d10 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
16d20 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  version] > 0} th
16d30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16d40 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
16d50 70 70 65 6e 64 41 72 67 73 20 66 72 61 6d 65 77  ppendArgs framew
16d60 6f 72 6b 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 20  ork $version].. 
16d70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16d80 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16d90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a  ..            $:
16db0 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
16dc0 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
16dd0 29 20 22 20 28 22 20 24 64 6f 74 56 65 72 73 69  ) " (" $dotVersi
16de0 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  on ")\n"]..     
16df0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16e00 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16e10 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
16e20 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
16e30 72 6f 63 20 63 68 65 63 6b 46 6f 72 4d 61 74 63  roc checkForMatc
16e40 68 69 6e 67 46 72 61 6d 65 77 6f 72 6b 56 65 72  hingFrameworkVer
16e50 73 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  sion { channel }
16e60 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
16e70 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
16e80 68 65 63 6b 69 6e 67 20 66 6f 72 20 6d 61 74 63  hecking for matc
16e90 68 69 6e 67 20 66 72 61 6d 65 77 6f 72 6b 20 76  hing framework v
16ea0 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ersion... ".... 
16eb0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
16ec0 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c  xists ::eagle_pl
16ed0 61 74 66 6f 72 6d 28 66 72 61 6d 65 77 6f 72 6b  atform(framework
16ee0 56 65 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a  Version)] && \..
16ef0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
16f00 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c  g length $::eagl
16f10 65 5f 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d 65  e_platform(frame
16f20 77 6f 72 6b 56 65 72 73 69 6f 6e 29 5d 20 3e 20  workVersion)] > 
16f30 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16f40 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
16f50 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74  sts ::eagle_plat
16f60 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e 74 69 6d  form(imageRuntim
16f70 65 56 65 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d  eVersion)] && \.
16f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74  .            [st
16f90 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65  ring length $::e
16fa0 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 69 6d  agle_platform(im
16fb0 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
16fc0 6e 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  n)] > 0} then {.
16fd0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
16fe0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16ff0 47 65 74 20 74 68 65 20 6d 61 6a 6f 72 20 61 6e  Get the major an
17000 64 20 6d 69 6e 6f 72 20 70 6f 72 74 69 6f 6e 73  d minor portions
17010 20 6f 66 20 74 68 65 20 76 65 72 73 69 6f 6e 73   of the versions
17020 20 6f 6e 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20   only...        
17030 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
17040 65 74 20 64 6f 74 56 65 72 73 69 6f 6e 28 31 29  et dotVersion(1)
17050 20 5b 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56   [getMajorMinorV
17060 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
17070 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65          $::eagle
17080 5f 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d 65 77  _platform(framew
17090 6f 72 6b 56 65 72 73 69 6f 6e 29 5d 0d 0a 0d 0a  orkVersion)]....
170a0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 6f            set do
170b0 74 56 65 72 73 69 6f 6e 28 32 29 20 5b 67 65 74  tVersion(2) [get
170c0 4d 61 6a 6f 72 4d 69 6e 6f 72 56 65 72 73 69 6f  MajorMinorVersio
170d0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
170e0 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74     $::eagle_plat
170f0 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e 74 69 6d  form(imageRuntim
17100 65 56 65 72 73 69 6f 6e 29 5d 0d 0a 0d 0a 20 20  eVersion)]....  
17110 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17120 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d       # NOTE: Rem
17130 6f 76 65 20 73 69 6e 67 6c 65 20 6c 65 61 64 69  ove single leadi
17140 6e 67 20 22 76 22 20 63 68 61 72 61 63 74 65 72  ng "v" character
17150 73 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65  s, if applicable
17160 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
17170 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
17180 74 72 69 6e 67 20 69 6e 64 65 78 20 24 64 6f 74  tring index $dot
17190 56 65 72 73 69 6f 6e 28 31 29 20 30 5d 20 65 71  Version(1) 0] eq
171a0 20 22 76 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   "v"} then {..  
171b0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 6f            set do
171c0 74 56 65 72 73 69 6f 6e 28 31 29 20 5b 73 74 72  tVersion(1) [str
171d0 69 6e 67 20 72 61 6e 67 65 20 24 64 6f 74 56 65  ing range $dotVe
171e0 72 73 69 6f 6e 28 31 29 20 31 20 65 6e 64 5d 0d  rsion(1) 1 end].
171f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
17200 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
17210 74 72 69 6e 67 20 69 6e 64 65 78 20 24 64 6f 74  tring index $dot
17220 56 65 72 73 69 6f 6e 28 32 29 20 30 5d 20 65 71  Version(2) 0] eq
17230 20 22 76 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   "v"} then {..  
17240 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 6f            set do
17250 74 56 65 72 73 69 6f 6e 28 32 29 20 5b 73 74 72  tVersion(2) [str
17260 69 6e 67 20 72 61 6e 67 65 20 24 64 6f 74 56 65  ing range $dotVe
17270 72 73 69 6f 6e 28 32 29 20 31 20 65 6e 64 5d 0d  rsion(2) 1 end].
17280 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
17290 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
172a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
172b0 6f 77 20 63 72 65 61 74 65 20 61 20 76 65 72 73  ow create a vers
172c0 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 75  ion string for u
172d0 73 65 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  se in the constr
172e0 61 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20  aint..          
172f0 23 20 20 20 20 20 20 20 6e 61 6d 65 20 28 72 65  #       name (re
17300 6d 6f 76 65 20 74 68 65 20 70 65 72 69 6f 64 73  move the periods
17310 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  )...          #.
17320 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
17330 65 72 73 69 6f 6e 28 31 29 20 5b 73 74 72 69 6e  ersion(1) [strin
17340 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e 20 22 22  g map [list . ""
17350 5d 20 24 64 6f 74 56 65 72 73 69 6f 6e 28 31 29  ] $dotVersion(1)
17360 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ]....          #
17370 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
17380 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e  TE: Check for an
17390 20 65 78 61 63 74 20 6d 61 74 63 68 20 62 65 74   exact match bet
173a0 77 65 65 6e 20 74 68 65 20 69 6d 61 67 65 20 72  ween the image r
173b0 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20  untime..        
173c0 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f    #       versio
173d0 6e 20 61 6e 64 20 74 68 65 20 66 72 61 6d 65 77  n and the framew
173e0 6f 72 6b 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20  ork version...  
173f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17400 20 20 20 20 20 69 66 20 7b 24 64 6f 74 56 65 72       if {$dotVer
17410 73 69 6f 6e 28 31 29 20 65 71 20 24 64 6f 74 56  sion(1) eq $dotV
17420 65 72 73 69 6f 6e 28 32 29 7d 20 74 68 65 6e 20  ersion(2)} then 
17430 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
17440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
17450 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 69  NOTE: Yes, the i
17460 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72  mage runtime ver
17470 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65  sion matches the
17480 20 66 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20   framework...   
17490 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
174a0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
174b0 72 61 69 6e 74 20 6d 61 74 63 68 46 72 61 6d 65  raint matchFrame
174c0 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20 20 20 20  work..          
174d0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
174e0 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 61 74 63  [appendArgs matc
174f0 68 46 72 61 6d 65 77 6f 72 6b 20 24 76 65 72 73  hFramework $vers
17500 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20  ion(1)]....     
17510 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
17520 61 69 6e 74 20 64 6f 74 6e 65 74 4d 61 74 63 68  aint dotnetMatch
17530 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20  Framework..     
17540 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
17550 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
17560 20 64 6f 74 6e 65 74 4d 61 74 63 68 46 72 61 6d   dotnetMatchFram
17570 65 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31  ework $version(1
17580 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  )]....          
17590 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
175a0 6d 6f 6e 6f 4d 61 74 63 68 46 72 61 6d 65 77 6f  monoMatchFramewo
175b0 72 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rk..            
175c0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
175d0 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 4d 61  ppendArgs monoMa
175e0 74 63 68 46 72 61 6d 65 77 6f 72 6b 20 24 76 65  tchFramework $ve
175f0 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20  rsion(1)]....   
17600 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17610 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
17620 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
17630 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
17640 66 20 7b 5b 69 73 4d 6f 6e 6f 5d 7d 20 74 68 65  f {[isMono]} the
17650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17660 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
17670 20 64 6f 74 6e 65 74 4d 61 74 63 68 46 72 61 6d   dotnetMatchFram
17680 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20 20 20  ework..         
17690 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
176a0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64  nt [appendArgs d
176b0 6f 74 6e 65 74 4d 61 74 63 68 46 72 61 6d 65 77  otnetMatchFramew
176c0 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31 29 5d  ork $version(1)]
176d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
176e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
176f0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
17700 69 6e 74 20 6d 6f 6e 6f 4d 61 74 63 68 46 72 61  int monoMatchFra
17710 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20 20  mework..        
17720 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
17730 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
17740 6d 6f 6e 6f 4d 61 74 63 68 46 72 61 6d 65 77 6f  monoMatchFramewo
17750 72 6b 20 24 76 65 72 73 69 6f 6e 28 31 29 5d 0d  rk $version(1)].
17760 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
17770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
17780 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
17790 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
177a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
177b0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
177c0 73 20 24 63 68 61 6e 6e 65 6c 20 22 6e 6f 2c 20  s $channel "no, 
177d0 6d 69 73 73 69 6e 67 20 69 6d 61 67 65 20 72 75  missing image ru
177e0 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 5c 6e 22  ntime version\n"
177f0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
17800 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
17810 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17820 6e 65 6c 20 22 6e 6f 2c 20 6d 69 73 73 69 6e 67  nel "no, missing
17830 20 66 72 61 6d 65 77 6f 72 6b 20 76 65 72 73 69   framework versi
17840 6f 6e 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  on\n"..      }..
17850 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17860 6f 63 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69  oc checkForRunti
17870 6d 65 56 65 72 73 69 6f 6e 20 7b 20 63 68 61 6e  meVersion { chan
17880 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
17890 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
178a0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
178b0 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
178c0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
178d0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
178e0 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
178f0 28 72 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29  (runtimeVersion)
17900 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
17910 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
17920 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f   $::eagle_platfo
17930 72 6d 28 72 75 6e 74 69 6d 65 56 65 72 73 69 6f  rm(runtimeVersio
17940 6e 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  n)] > 0} then {.
17950 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17960 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 65 74 20      # NOTE: Get 
17970 74 68 65 20 6d 61 6a 6f 72 20 61 6e 64 20 6d 69  the major and mi
17980 6e 6f 72 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20  nor portions of 
17990 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 6e 6c 79  the version only
179a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
179b0 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72        set dotVer
179c0 73 69 6f 6e 20 5b 67 65 74 4d 61 6a 6f 72 4d 69  sion [getMajorMi
179d0 6e 6f 72 56 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  norVersion \..  
179e0 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67            $::eag
179f0 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74  le_platform(runt
17a00 69 6d 65 56 65 72 73 69 6f 6e 29 5d 0d 0a 0d 0a  imeVersion)]....
17a10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17a20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63     # NOTE: Now c
17a30 72 65 61 74 65 20 61 20 76 65 72 73 69 6f 6e 20  reate a version 
17a40 73 74 72 69 6e 67 20 66 6f 72 20 75 73 65 20 69  string for use i
17a50 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
17a60 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23   name..        #
17a70 20 20 20 20 20 20 20 28 72 65 6d 6f 76 65 20 74         (remove t
17a80 68 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a 20 20  he periods)...  
17a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17aa0 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 73 74   set version [st
17ab0 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e  ring map [list .
17ac0 20 22 22 5d 20 24 64 6f 74 56 65 72 73 69 6f 6e   ""] $dotVersion
17ad0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
17ae0 7b 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d 7d 20 74  {[isTestMono]} t
17af0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17b00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
17b10 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 75 6e  NOTE: If the run
17b20 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 77 61 73  time version was
17b30 20 66 6f 75 6e 64 2c 20 61 64 64 20 61 20 74 65   found, add a te
17b40 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 20  st constraint.. 
17b50 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17b60 20 66 6f 72 20 69 74 20 6e 6f 77 2e 0d 0a 20 20   for it now...  
17b70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17b80 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
17b90 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e   length $version
17ba0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17bd0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e  NOTE: We are run
17be0 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 2e 20 20 4b  ning on Mono.  K
17bf0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
17c00 20 73 70 65 63 69 66 69 63 0d 0a 20 20 20 20 20   specific..     
17c10 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17c20 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 61   version for usa
17c30 67 65 20 69 6e 20 74 65 73 74 20 63 6f 6e 73 74  ge in test const
17c40 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
17c50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17c60 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
17c70 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
17c80 73 20 6d 6f 6e 6f 20 24 76 65 72 73 69 6f 6e 5d  s mono $version]
17c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17ca0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
17cb0 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 20 24  ppendArgs mono $
17cc0 76 65 72 73 69 6f 6e 20 4f 72 48 69 67 68 65 72  version OrHigher
17cd0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
17ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
17cf0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17d00 20 41 74 74 65 6d 70 74 20 74 6f 20 70 61 72 73   Attempt to pars
17d10 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20 69 6e  e the version in
17d20 74 6f 20 69 74 73 20 6d 61 6a 6f 72 20 61 6e 64  to its major and
17d30 20 6d 69 6e 6f 72 0d 0a 20 20 20 20 20 20 20 20   minor..        
17d40 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
17d50 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ents...         
17d60 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
17d70 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
17d80 20 24 64 6f 74 56 65 72 73 69 6f 6e 5d 20 3e 20   $dotVersion] > 
17d90 30 20 26 26 20 5b 72 65 67 65 78 70 20 2d 2d 20  0 && [regexp -- 
17da0 7b 5e 28 5c 64 2b 29 5c 2e 28 5c 64 2b 29 24 7d  {^(\d+)\.(\d+)$}
17db0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17dc0 20 20 24 64 6f 74 56 65 72 73 69 6f 6e 20 64 75    $dotVersion du
17dd0 6d 6d 79 20 6d 61 6a 6f 72 56 65 72 73 69 6f 6e  mmy majorVersion
17de0 20 6d 69 6e 6f 72 56 65 72 73 69 6f 6e 5d 7d 20   minorVersion]} 
17df0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17e00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17e10 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
17e20 69 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 4d  is the list of M
17e30 6f 6e 6f 20 76 65 72 73 69 6f 6e 73 20 74 6f 20  ono versions to 
17e40 61 64 64 20 74 65 73 74 0d 0a 20 20 20 20 20 20  add test..      
17e50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
17e60 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 2e 0d 0a  nstraints for...
17e70 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17e80 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d             set m
17e90 6f 6e 6f 56 65 72 73 69 6f 6e 73 20 5b 6c 69 73  onoVersions [lis
17ea0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t]....          
17eb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17ec0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 65   # NOTE: Check e
17ed0 61 63 68 20 4d 6f 6e 6f 20 76 65 72 73 69 6f 6e  ach Mono version
17ee0 20 22 6b 6e 6f 77 6e 22 20 74 6f 20 74 68 65 20   "known" to the 
17ef0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
17f00 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17f10 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
17f20 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 5b 67 65 74  monoVersion [get
17f30 4b 6e 6f 77 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e  KnownMonoVersion
17f40 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
17f50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17f60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
17f70 63 6b 20 66 6f 72 20 61 6e 79 20 4d 6f 6e 6f 20  ck for any Mono 
17f80 6d 61 6a 6f 72 20 76 65 72 73 69 6f 6e 20 58 20  major version X 
17f90 6f 72 20 68 69 67 68 65 72 2e 0d 0a 20 20 20 20  or higher...    
17fa0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17fb0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
17fc0 6d 61 6a 6f 72 56 65 72 73 69 6f 6e 20 3e 3d 20  majorVersion >= 
17fd0 5b 6c 69 6e 64 65 78 20 24 6d 6f 6e 6f 56 65 72  [lindex $monoVer
17fe0 73 69 6f 6e 20 30 5d 7d 20 74 68 65 6e 20 7b 0d  sion 0]} then {.
17ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18000 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
18010 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
18020 6b 20 66 6f 72 20 61 6e 79 20 4d 6f 6e 6f 20 6d  k for any Mono m
18030 61 6a 6f 72 2f 6d 69 6e 6f 72 20 76 65 72 73 69  ajor/minor versi
18040 6f 6e 20 68 69 67 68 65 72 0d 0a 20 20 20 20 20  on higher..     
18050 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
18060 20 20 20 74 68 61 6e 20 58 2e 59 2e 0d 0a 20 20     than X.Y...  
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18090 20 69 66 20 7b 24 6d 61 6a 6f 72 56 65 72 73 69   if {$majorVersi
180a0 6f 6e 20 3e 20 5b 6c 69 6e 64 65 78 20 24 6d 6f  on > [lindex $mo
180b0 6e 6f 56 65 72 73 69 6f 6e 20 30 5d 20 7c 7c 20  noVersion 0] || 
180c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
180d0 20 20 20 20 20 20 20 24 6d 69 6e 6f 72 56 65 72         $minorVer
180e0 73 69 6f 6e 20 3e 20 5b 6c 69 6e 64 65 78 20 24  sion > [lindex $
180f0 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 31 5d 7d 20  monoVersion 1]} 
18100 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18110 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
18130 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 69 73 20   NOTE: Add this 
18140 22 6b 6e 6f 77 6e 22 20 76 65 72 73 69 6f 6e 20  "known" version 
18150 6f 66 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20  of Mono...      
18160 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 6c 61 70 70 65 6e 64 20 6d 6f 6e 6f 56 65 72   lappend monoVer
18190 73 69 6f 6e 73 20 24 6d 6f 6e 6f 56 65 72 73 69  sions $monoVersi
181a0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
181b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
181c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
181d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
181e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
181f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
18200 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
18210 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 65 61  nstraints for ea
18220 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 6f  ch version of Mo
18230 6e 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  no..            
18240 23 20 20 20 20 20 20 20 77 65 20 73 68 6f 75 6c  #       we shoul
18250 64 20 4e 4f 54 20 73 6b 69 70 20 62 75 67 73 20  d NOT skip bugs 
18260 66 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  for...          
18270 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18280 20 66 6f 72 65 61 63 68 20 6d 6f 6e 6f 56 65 72   foreach monoVer
18290 73 69 6f 6e 20 24 6d 6f 6e 6f 56 65 72 73 69 6f  sion $monoVersio
182a0 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ns {..          
182b0 20 20 20 20 73 65 74 20 63 6f 6e 73 74 72 61 69      set constrai
182c0 6e 74 56 65 72 73 69 6f 6e 20 5b 6a 6f 69 6e 20  ntVersion [join 
182d0 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 22 22 5d  $monoVersion ""]
182e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
182f0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18300 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f  [appendArgs mono
18310 20 24 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73   $constraintVers
18320 69 6f 6e 20 4f 72 48 69 67 68 65 72 5d 0d 0a 20  ion OrHigher].. 
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
18340 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
18350 6e 64 41 72 67 73 20 6d 6f 6e 6f 54 6f 44 6f 20  ndArgs monoToDo 
18360 24 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69  $constraintVersi
18370 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on]..           
18380 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
18390 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e   [appendArgs mon
183a0 6f 42 75 67 20 24 63 6f 6e 73 74 72 61 69 6e 74  oBug $constraint
183b0 56 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  Version]..      
183c0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
183d0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
183e0 73 20 6d 6f 6e 6f 43 72 61 73 68 20 24 63 6f 6e  s monoCrash $con
183f0 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 5d 0d  straintVersion].
18400 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
18410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
18420 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
18430 4f 54 45 3a 20 43 68 65 63 6b 20 61 6c 6c 20 6b  OTE: Check all k
18440 6e 6f 77 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  nown versions of
18450 20 4d 6f 6e 6f 20 66 6f 72 20 61 6e 20 65 78 61   Mono for an exa
18460 63 74 20 6d 61 74 63 68 20 77 69 74 68 0d 0a 20  ct match with.. 
18470 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
18480 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79     the currently
18490 20 72 75 6e 6e 69 6e 67 20 6f 6e 65 2e 0d 0a 20   running one... 
184a0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
184b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
184c0 68 20 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 5b 67  h monoVersion [g
184d0 65 74 4b 6e 6f 77 6e 4d 6f 6e 6f 56 65 72 73 69  etKnownMonoVersi
184e0 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
184f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18500 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
18510 68 65 63 6b 20 69 66 20 4d 6f 6e 6f 20 6d 61 6a  heck if Mono maj
18520 6f 72 2f 6d 69 6e 6f 72 20 76 65 72 73 69 6f 6e  or/minor version
18530 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
18540 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  one..           
18550 20 20 20 23 20 20 20 20 20 20 20 77 65 20 61 72     #       we ar
18560 65 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  e currently proc
18570 65 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  essing...       
18580 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18590 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 73          set cons
185a0 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 5b 6a  traintVersion [j
185b0 6f 69 6e 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e  oin $monoVersion
185c0 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   ""]....        
185d0 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65        if {[linde
185e0 78 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 30  x $monoVersion 0
185f0 5d 20 3d 3d 20 24 6d 61 6a 6f 72 56 65 72 73 69  ] == $majorVersi
18600 6f 6e 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  on && \..       
18610 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64             [lind
18620 65 78 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20  ex $monoVersion 
18630 31 5d 20 3d 3d 20 24 6d 69 6e 6f 72 56 65 72 73  1] == $minorVers
18640 69 6f 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ion} then {..   
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 65 73 74  # NOTE: Add test
18680 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
18690 74 20 6f 6e 6c 79 20 61 70 70 6c 79 20 74 6f 20  t only apply to 
186a0 74 68 69 73 20 65 78 61 63 74 0d 0a 20 20 20 20  this exact..    
186b0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
186c0 20 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d      version of M
186d0 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ono...          
186e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
186f0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
18700 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
18710 67 73 20 6d 6f 6e 6f 20 24 63 6f 6e 73 74 72 61  gs mono $constra
18720 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d  intVersion Only]
18730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18740 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18750 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
18770 4f 54 45 3a 20 41 64 64 20 74 65 73 74 20 63 6f  OTE: Add test co
18780 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 61  nstraints that a
18790 70 70 6c 79 20 74 6f 20 61 6c 6c 20 76 65 72 73  pply to all vers
187a0 69 6f 6e 73 20 6f 66 0d 0a 20 20 20 20 20 20 20  ions of..       
187b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
187c0 20 4d 6f 6e 6f 20 65 78 63 65 70 74 20 74 68 69   Mono except thi
187d0 73 20 65 78 61 63 74 20 76 65 72 73 69 6f 6e 2e  s exact version.
187e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
187f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18800 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
18810 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d  nt [appendArgs m
18820 6f 6e 6f 54 6f 44 6f 20 24 63 6f 6e 73 74 72 61  onoToDo $constra
18830 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d  intVersion Only]
18840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18850 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18860 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f  [appendArgs mono
18870 42 75 67 20 24 63 6f 6e 73 74 72 61 69 6e 74 56  Bug $constraintV
18880 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a 20 20  ersion Only]..  
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
188a0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
188b0 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 43 72 61 73  endArgs monoCras
188c0 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 56 65 72  h $constraintVer
188d0 73 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a 20 20 20 20  sion Only]..    
188e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
188f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18900 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18910 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
18920 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18930 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
18940 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
18950 20 77 61 73 20 66 6f 75 6e 64 2c 20 61 64 64 20   was found, add 
18960 61 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  a test constrain
18970 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
18980 20 20 20 20 20 66 6f 72 20 69 74 20 6e 6f 77 2e       for it now.
18990 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
189a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
189b0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
189c0 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
189d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
189e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
189f0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e  NOTE: We are run
18a00 6e 69 6e 67 20 6f 6e 20 74 68 65 20 2e 4e 45 54  ning on the .NET
18a10 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 4b 65 65   Framework.  Kee
18a20 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 0d 0a  p track of the..
18a30 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
18a40 20 20 20 20 73 70 65 63 69 66 69 63 20 76 65 72      specific ver
18a50 73 69 6f 6e 20 66 6f 72 20 75 73 61 67 65 20 69  sion for usage i
18a60 6e 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  n test constrain
18a70 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ts...           
18a80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
18a90 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
18aa0 70 70 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74  ppendArgs dotNet
18ab0 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20   $version]..    
18ac0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
18ad0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
18ae0 73 20 64 6f 74 4e 65 74 20 24 76 65 72 73 69 6f  s dotNet $versio
18af0 6e 20 4f 72 48 69 67 68 65 72 5d 0d 0a 20 20 20  n OrHigher]..   
18b00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18b10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18b20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f     # NOTE: We do
18b30 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 73 6b 69   not want to ski
18b40 70 20 61 6e 79 20 4d 6f 6e 6f 20 62 75 67 73 20  p any Mono bugs 
18b50 6f 6e 20 2e 4e 45 54 2e 20 20 41 64 64 20 74 68  on .NET.  Add th
18b60 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
18b70 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 63       necessary c
18b80 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 65  onstraints for e
18b90 61 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d  ach version of M
18ba0 6f 6e 6f 20 77 65 20 6b 6e 6f 77 0d 0a 20 20 20  ono we know..   
18bb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
18bc0 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  bout...         
18bd0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
18be0 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e 73 74 72  dKnownMonoConstr
18bf0 61 69 6e 74 73 20 66 61 6c 73 65 3b 20 23 20 72  aints false; # r
18c00 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54 2e 0d  unning on .NET..
18c10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
18c20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
18c30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
18c40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18c50 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
18c60 6d 28 72 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  m(runtimeVersion
18c70 29 20 22 20 28 22 20 24 64 6f 74 56 65 72 73 69  ) " (" $dotVersi
18c80 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  on ")\n"]..     
18c90 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
18ca0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
18cb0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
18cc0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18cd0 72 6f 63 20 63 68 65 63 6b 46 6f 72 50 72 6f 63  roc checkForProc
18ce0 65 73 73 42 69 74 73 20 7b 20 63 68 61 6e 6e 65  essBits { channe
18cf0 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
18d00 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
18d10 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 70  - checking for p
18d20 72 6f 63 65 73 73 20 62 69 74 73 2e 2e 2e 20 22  rocess bits... "
18d30 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
18d40 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
18d50 5f 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63 65 73  _platform(proces
18d60 73 42 69 74 73 29 5d 20 26 26 20 5c 0d 0a 20 20  sBits)] && \..  
18d70 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
18d80 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69  is integer -stri
18d90 63 74 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  ct $::tcl_platfo
18da0 72 6d 28 70 72 6f 63 65 73 73 42 69 74 73 29 5d  rm(processBits)]
18db0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18dc0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18dd0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74  [appendArgs $::t
18de0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63  cl_platform(proc
18df0 65 73 73 42 69 74 73 29 20 62 69 74 5d 0d 0a 0d  essBits) bit]...
18e00 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18e10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18e20 72 67 73 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  rgs $::tcl_platf
18e30 6f 72 6d 28 70 72 6f 63 65 73 73 42 69 74 73 29  orm(processBits)
18e40 20 2d 62 69 74 5c 6e 5d 0d 0a 20 20 20 20 20 20   -bit\n]..      
18e50 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18e60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18e70 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
18e80 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
18e90 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
18ea0 4d 61 63 68 69 6e 65 20 7b 20 63 68 61 6e 6e 65  Machine { channe
18eb0 6c 20 62 69 74 73 20 6d 61 63 68 69 6e 65 20 7d  l bits machine }
18ec0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
18ed0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
18ee0 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
18ef0 69 6e 67 20 66 6f 72 20 6d 61 63 68 69 6e 65 20  ing for machine 
18f00 5c 22 22 20 24 62 69 74 73 20 5c 0d 0a 20 20 20  \"" $bits \..   
18f10 20 20 20 20 20 20 20 22 2d 62 69 74 20 22 20 24         "-bit " $
18f20 6d 61 63 68 69 6e 65 20 22 5c 22 2e 2e 2e 20 22  machine "\"... "
18f30 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
18f40 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
18f50 20 61 72 65 20 74 68 65 20 6d 61 63 68 69 6e 65   are the machine
18f60 20 61 72 63 68 69 74 65 63 74 75 72 65 20 61 6e   architecture an
18f70 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  d the..      #  
18f80 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 62       number of b
18f90 69 74 73 20 66 6f 72 20 74 68 69 73 20 6f 70 65  its for this ope
18fa0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 3f 0d 0a  rating system?..
18fb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
18fc0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
18fd0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
18fe0 61 63 68 69 6e 65 29 5d 20 26 26 20 5c 0d 0a 20  achine)] && \.. 
18ff0 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
19000 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
19010 66 6f 72 6d 28 70 72 6f 63 65 73 73 42 69 74 73  form(processBits
19020 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
19030 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19040 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20   NOTE: Does the 
19050 6d 61 63 68 69 6e 65 20 61 6e 64 20 6e 75 6d 62  machine and numb
19060 65 72 20 6f 66 20 62 69 74 73 20 6d 61 74 63 68  er of bits match
19070 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19080 20 20 77 68 61 74 20 74 68 65 20 63 61 6c 6c 65    what the calle
19090 72 20 73 70 65 63 69 66 69 65 64 3f 0d 0a 20 20  r specified?..  
190a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
190b0 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74   if {$::tcl_plat
190c0 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 65 71  form(machine) eq
190d0 20 24 6d 61 63 68 69 6e 65 20 26 26 20 5c 0d 0a   $machine && \..
190e0 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74              $::t
190f0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63  cl_platform(proc
19100 65 73 73 42 69 74 73 29 20 65 71 20 24 62 69 74  essBits) eq $bit
19110 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  s} then {..     
19120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19130 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
19140 74 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20  t matches...    
19150 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19160 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
19170 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 61   [appendArgs $ma
19180 63 68 69 6e 65 20 2e 20 24 62 69 74 73 20 62 69  chine . $bits bi
19190 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t]....          
191a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
191b0 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
191c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
191d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
191e0 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
191f0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
19200 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
19210 24 63 68 61 6e 6e 65 6c 20 22 6e 6f 2c 20 75 6e  $channel "no, un
19220 6b 6e 6f 77 6e 5c 6e 22 0d 0a 20 20 20 20 20 20  known\n"..      
19230 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
19240 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65   proc checkForTe
19250 73 74 43 61 6c 6c 53 74 61 63 6b 20 7b 20 63 68  stCallStack { ch
19260 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
19270 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19280 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
19290 6f 72 20 74 65 73 74 20 63 61 6c 6c 20 73 74 61  or test call sta
192a0 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ck... "....     
192b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
192c0 3a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 63  : Search for a c
192d0 61 6c 6c 20 66 72 61 6d 65 20 77 69 74 68 20 61  all frame with a
192e0 73 73 6f 63 69 61 74 65 64 20 61 72 67 75 6d 65  ssociated argume
192f0 6e 74 73 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  nts...      #   
19300 20 20 20 20 41 74 20 74 68 69 73 20 70 6f 69 6e      At this poin
19310 74 2c 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  t, there must be
19320 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 75   at least one su
19330 63 68 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 23  ch call..      #
19340 20 20 20 20 20 20 20 66 72 61 6d 65 20 28 74 68         frame (th
19350 69 73 20 6f 6e 65 29 2e 20 20 54 68 65 72 65 66  is one).  Theref
19360 6f 72 65 2c 20 74 68 69 73 20 6c 6f 6f 70 20 77  ore, this loop w
19370 69 6c 6c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20  ill always..    
19380 20 20 23 20 20 20 20 20 20 20 74 65 72 6d 69 6e    #       termin
19390 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ate...      #.. 
193a0 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 30       set index 0
193b0 3b 20 73 65 74 20 61 72 67 75 6d 65 6e 74 73 20  ; set arguments 
193c0 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73 65  [list]..      se
193d0 74 20 73 63 72 69 70 74 20 7b 69 6e 66 6f 20 6c  t script {info l
193e0 65 76 65 6c 20 5b 69 6e 66 6f 20 6c 65 76 65 6c  evel [info level
193f0 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20 77 68 69 6c  ]}....      whil
19400 65 20 7b 31 7d 20 7b 0d 0a 20 20 20 20 20 20 20  e {1} {..       
19410 20 73 65 74 20 6c 65 76 65 6c 20 5b 61 70 70 65   set level [appe
19420 6e 64 41 72 67 73 20 23 23 20 24 69 6e 64 65 78  ndArgs ## $index
19430 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
19440 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
19450 20 24 6c 65 76 65 6c 20 24 73 63 72 69 70 74 7d   $level $script}
19460 20 61 72 67 75 6d 65 6e 74 73 5d 20 3d 3d 20 30   arguments] == 0
19470 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19480 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20      break..     
19490 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
194a0 69 6e 63 72 20 69 6e 64 65 78 0d 0a 20 20 20 20  incr index..    
194b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
194c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
194d0 61 62 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6e  ab the command n
194e0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 61 72 67  ame from the arg
194f0 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2e 0d  uments, if any..
19500 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19510 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 65 78 70  set command [exp
19520 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 6c 6c  r {..        [ll
19530 65 6e 67 74 68 20 24 61 72 67 75 6d 65 6e 74 73  ength $arguments
19540 5d 20 3e 20 30 20 3f 20 5b 6c 69 6e 64 65 78 20  ] > 0 ? [lindex 
19550 24 61 72 67 75 6d 65 6e 74 73 20 30 5d 20 3a 20  $arguments 0] : 
19560 22 22 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a  ""..      }]....
19570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
19580 20 48 41 43 4b 3a 20 4d 61 6b 65 20 73 75 72 65   HACK: Make sure
19590 20 74 68 65 20 63 61 6c 6c 20 73 74 61 63 6b 20   the call stack 
195a0 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 75 70 20  does not end up 
195b0 63 6f 6e 66 75 73 69 6e 67 0d 0a 20 20 20 20 20  confusing..     
195c0 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
195d0 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20  ts that rely on 
195e0 61 62 73 6f 6c 75 74 65 20 63 61 6c 6c 20 66 72  absolute call fr
195f0 61 6d 65 73 2e 20 20 54 68 65 0d 0a 20 20 20 20  ames.  The..    
19600 20 20 23 20 20 20 20 20 20 20 5b 72 75 6e 54 65    #       [runTe
19610 73 74 50 72 6f 6c 6f 67 75 65 5d 20 69 73 20 61  stPrologue] is a
19620 6c 6c 6f 77 65 64 20 68 65 72 65 20 62 65 63 61  llowed here beca
19630 75 73 65 20 69 74 20 77 69 6c 6c 0d 0a 20 20 20  use it will..   
19640 20 20 20 23 20 20 20 20 20 20 20 6e 6f 74 20 62     #       not b
19650 65 20 61 63 74 69 76 65 20 6f 6e 20 74 68 65 20  e active on the 
19660 63 61 6c 6c 20 73 74 61 63 6b 20 61 74 20 74 68  call stack at th
19670 65 20 70 6f 69 6e 74 20 74 68 65 0d 0a 20 20 20  e point the..   
19680 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
19690 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72 75   are actually ru
196a0 6e 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 74 68  n.  Actually, th
196b0 65 20 73 61 6d 65 20 74 68 69 6e 67 0d 0a 20 20  e same thing..  
196c0 20 20 20 20 23 20 20 20 20 20 20 20 67 6f 65 73      #       goes
196d0 20 66 6f 72 20 5b 63 68 65 63 6b 46 6f 72 54 65   for [checkForTe
196e0 73 74 43 61 6c 6c 53 74 61 63 6b 5d 20 61 73 20  stCallStack] as 
196f0 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  well...      #..
19700 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6d 6d 61        if {$comma
19710 6e 64 20 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20  nd in \..       
19720 20 20 20 5b 6c 69 73 74 20 72 75 6e 54 65 73 74     [list runTest
19730 50 72 6f 6c 6f 67 75 65 20 63 68 65 63 6b 46 6f  Prologue checkFo
19740 72 54 65 73 74 43 61 6c 6c 53 74 61 63 6b 5d 7d  rTestCallStack]}
19750 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19760 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74   addConstraint t
19770 65 73 74 43 61 6c 6c 53 74 61 63 6b 0d 0a 0d 0a  estCallStack....
19780 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
19790 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
197a0 67 73 20 22 79 65 73 20 28 5c 22 22 20 24 63 6f  gs "yes (\"" $co
197b0 6d 6d 61 6e 64 20 22 5c 22 29 5c 6e 22 5d 0d 0a  mmand "\")\n"]..
197c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
197d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
197e0 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72  are done here, r
197f0 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20  eturn now...    
19800 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
19810 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
19820 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
19830 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19840 67 73 20 22 6e 6f 20 28 5c 22 22 20 24 63 6f 6d  gs "no (\"" $com
19850 6d 61 6e 64 20 22 5c 22 29 5c 6e 22 5d 0d 0a 20  mand "\")\n"].. 
19860 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19870 63 20 63 68 65 63 6b 46 6f 72 47 61 72 75 64 61  c checkForGaruda
19880 44 6c 6c 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  Dll { channel } 
19890 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
198a0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
198b0 75 74 6f 6d 61 74 69 63 20 54 63 6c 20 73 68 65  utomatic Tcl she
198c0 6c 6c 20 6d 61 63 68 69 6e 65 20 64 65 74 65 63  ll machine detec
198d0 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
198e0 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ot..      #     
198f0 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 65 78 65    allowed to exe
19900 63 75 74 65 20 65 78 74 65 72 6e 61 6c 20 63 6f  cute external co
19910 6d 6d 61 6e 64 73 2e 0d 0a 20 20 20 20 20 20 23  mmands...      #
19920 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 6e  ..      if {[can
19930 45 78 65 63 54 63 6c 53 68 65 6c 6c 5d 7d 20 74  ExecTclShell]} t
19940 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
19950 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
19960 3a 20 48 61 76 65 20 74 68 65 20 5b 67 65 74 47  : Have the [getG
19970 61 72 75 64 61 44 6c 6c 5d 20 70 72 6f 63 65 64  arudaDll] proced
19980 75 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ure automaticall
19990 79 20 64 65 74 65 63 74 20 74 68 65 0d 0a 20 20  y detect the..  
199a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
199b0 63 68 69 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20  chine...        
199c0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
199d0 61 63 68 69 6e 65 20 22 22 0d 0a 20 20 20 20 20  achine ""..     
199e0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
199f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19a00 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 6d 61  NOTE: Use the ma
19a10 63 68 69 6e 65 20 66 6f 72 20 74 68 69 73 20 74  chine for this t
19a20 65 73 74 20 72 75 6e 2e 0d 0a 20 20 20 20 20 20  est run...      
19a30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
19a40 20 6d 61 63 68 69 6e 65 20 5b 67 65 74 54 65 73   machine [getTes
19a50 74 4d 61 63 68 69 6e 65 5d 0d 0a 0d 0a 20 20 20  tMachine]....   
19a60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19a70 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 61 6e  # NOTE: Since an
19a80 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 6d 65   empty string me
19a90 61 6e 73 20 22 61 75 74 6f 6d 61 74 69 63 61 6c  ans "automatical
19aa0 6c 79 20 64 65 74 65 63 74 22 20 74 6f 20 74 68  ly detect" to th
19ab0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
19ac0 20 20 20 5b 67 65 74 47 61 72 75 64 61 44 6c 6c     [getGarudaDll
19ad0 5d 20 70 72 6f 63 65 64 75 72 65 2c 20 77 65 20  ] procedure, we 
19ae0 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
19af0 68 65 20 76 61 6c 75 65 20 69 73 0d 0a 20 20 20  he value is..   
19b00 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 6d       #       som
19b10 65 74 68 69 6e 67 20 65 6c 73 65 2e 0d 0a 20 20  ething else...  
19b20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19b30 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
19b40 67 74 68 20 24 6d 61 63 68 69 6e 65 5d 20 3d 3d  gth $machine] ==
19b50 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
19b60 20 20 20 20 20 20 73 65 74 20 6d 61 63 68 69 6e        set machin
19b70 65 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  e unknown..     
19b80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
19b90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19ba0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
19bb0 72 20 74 68 65 20 47 61 72 75 64 61 20 44 4c 4c  r the Garuda DLL
19bc0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 6c 61   of the same pla
19bd0 74 66 6f 72 6d 20 28 69 2e 65 2e 20 6d 61 63 68  tform (i.e. mach
19be0 69 6e 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ine..      #    
19bf0 20 20 20 74 79 70 65 29 20 61 73 20 74 68 65 20     type) as the 
19c00 6e 61 74 69 76 65 20 54 63 6c 20 73 68 65 6c 6c  native Tcl shell
19c10 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19c20 20 20 72 65 74 75 72 6e 20 5b 63 68 65 63 6b 46    return [checkF
19c30 6f 72 46 69 6c 65 20 24 63 68 61 6e 6e 65 6c 20  orFile $channel 
19c40 5b 67 65 74 47 61 72 75 64 61 44 6c 6c 20 24 6d  [getGarudaDll $m
19c50 61 63 68 69 6e 65 5d 5d 0d 0a 20 20 20 20 7d 0d  achine]]..    }.
19c60 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
19c70 63 6b 46 6f 72 43 75 6c 74 75 72 65 20 7b 20 63  ckForCulture { c
19c80 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
19c90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19ca0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
19cb0 66 6f 72 20 63 75 6c 74 75 72 65 2e 2e 2e 20 22  for culture... "
19cc0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
19cd0 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
19ce0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 6c 74  the current cult
19cf0 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ure...      #.. 
19d00 20 20 20 20 20 73 65 74 20 63 75 6c 74 75 72 65       set culture
19d10 20 5b 69 6e 66 6f 20 63 75 6c 74 75 72 65 5d 0d   [info culture].
19d20 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
19d30 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 75 6c  ring length $cul
19d40 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
19d50 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19d60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
19d70 65 20 63 75 6c 74 75 72 65 20 69 6e 66 6f 72 6d  e culture inform
19d80 61 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74  ation is present
19d90 2c 20 75 73 65 20 69 74 20 61 6e 64 20 73 68 6f  , use it and sho
19da0 77 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  w it...        #
19db0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
19dc0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
19dd0 72 67 73 20 63 75 6c 74 75 72 65 2e 20 5b 73 74  rgs culture. [st
19de0 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2d  ring map [list -
19df0 20 5f 5d 20 24 63 75 6c 74 75 72 65 5d 5d 0d 0a   _] $culture]]..
19e00 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
19e10 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19e20 41 72 67 73 20 24 63 75 6c 74 75 72 65 20 5c 6e  Args $culture \n
19e30 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
19e40 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
19e50 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77   $channel unknow
19e60 6e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n\n..      }..  
19e70 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
19e80 20 63 68 65 63 6b 46 6f 72 54 68 72 65 61 64 43   checkForThreadC
19e90 75 6c 74 75 72 65 20 7b 20 63 68 61 6e 6e 65 6c  ulture { channel
19ea0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
19eb0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
19ec0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
19ed0 72 65 61 64 20 63 75 6c 74 75 72 65 2e 2e 2e 20  read culture... 
19ee0 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  "....      #..  
19ef0 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
19f00 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
19f10 65 61 64 20 63 75 6c 74 75 72 65 2e 0d 0a 20 20  ead culture...  
19f20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19f30 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
19f40 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
19f50 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e   System.Threadin
19f60 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  g.Thread.Current
19f70 54 68 72 65 61 64 20 43 75 72 72 65 6e 74 43 75  Thread CurrentCu
19f80 6c 74 75 72 65 0d 0a 20 20 20 20 20 20 7d 20 63  lture..      } c
19f90 75 6c 74 75 72 65 5d 20 3d 3d 20 30 20 26 26 20  ulture] == 0 && 
19fa0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
19fb0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
19fc0 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74  Eagle._Component
19fd0 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74  s.Private.Format
19fe0 4f 70 73 20 43 75 6c 74 75 72 65 4e 61 6d 65 20  Ops CultureName 
19ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
1a000 63 75 6c 74 75 72 65 20 66 61 6c 73 65 0d 0a 20  culture false.. 
1a010 20 20 20 20 20 7d 20 63 75 6c 74 75 72 65 5d 20       } culture] 
1a020 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
1a030 6c 65 6e 67 74 68 20 24 63 75 6c 74 75 72 65 5d  length $culture]
1a040 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1a050 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a060 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 63 75 6c   # NOTE: The cul
1a070 74 75 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ture information
1a080 20 69 73 20 70 72 65 73 65 6e 74 2c 20 75 73 65   is present, use
1a090 20 69 74 20 61 6e 64 20 73 68 6f 77 20 69 74 2e   it and show it.
1a0a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a0b0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1a0c0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74  nt [appendArgs t
1a0d0 68 72 65 61 64 43 75 6c 74 75 72 65 2e 20 5b 73  hreadCulture. [s
1a0e0 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
1a0f0 2d 20 5f 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  - _] \..        
1a100 20 20 20 20 24 63 75 6c 74 75 72 65 5d 5d 0d 0a      $culture]]..
1a110 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1a120 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a130 41 72 67 73 20 24 63 75 6c 74 75 72 65 20 5c 6e  Args $culture \n
1a140 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
1a150 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1a160 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77   $channel unknow
1a170 6e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n\n..      }..  
1a180 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1a190 20 63 68 65 63 6b 46 6f 72 51 75 69 65 74 20 7b   checkForQuiet {
1a1a0 20 63 68 61 6e 6e 65 6c 20 71 75 69 65 74 20 7d   channel quiet }
1a1b0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   {..      if {!$
1a1c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1a1d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a1e0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
1a1f0 6b 69 6e 67 20 66 6f 72 20 71 75 69 65 74 2e 2e  king for quiet..
1a200 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
1a210 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1a220 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
1a230 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
1a240 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
1a250 51 75 69 65 74 0d 0a 20 20 20 20 20 20 7d 20 69  Quiet..      } i
1a260 73 51 75 69 65 74 5d 20 3d 3d 20 30 20 26 26 20  sQuiet] == 0 && 
1a270 24 69 73 51 75 69 65 74 7d 20 74 68 65 6e 20 7b  $isQuiet} then {
1a280 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a290 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
1a2a0 2c 20 71 75 69 65 74 20 6d 6f 64 65 20 69 73 20  , quiet mode is 
1a2b0 65 6e 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20  enabled...      
1a2c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
1a2d0 43 6f 6e 73 74 72 61 69 6e 74 20 71 75 69 65 74  Constraint quiet
1a2e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1a2f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1a300 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1a310 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
1a320 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1a330 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1a340 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1a350 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a360 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1a370 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
1a380 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1a390 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1a3a0 68 65 63 6b 46 6f 72 52 65 66 65 72 65 6e 63 65  heckForReference
1a3b0 43 6f 75 6e 74 54 72 61 63 6b 69 6e 67 20 7b 20  CountTracking { 
1a3c0 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
1a3d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1a3e0 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
1a3f0 20 66 6f 72 20 6f 62 6a 65 63 74 20 72 65 66 65   for object refe
1a400 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
1a410 6b 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  king... "....   
1a420 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1a430 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74  sts ::eagle_plat
1a440 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69  form(compileOpti
1a450 6f 6e 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ons)] && \..    
1a460 20 20 20 20 20 20 28 5b 6c 73 65 61 72 63 68 20        ([lsearch 
1a470 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24  -exact -nocase $
1a480 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
1a490 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29  (compileOptions)
1a4a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a4b0 20 20 4e 4f 54 49 46 59 5d 20 21 3d 20 2d 31 20    NOTIFY] != -1 
1a4c0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
1a4d0 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74   [lsearch -exact
1a4e0 20 2d 6e 6f 63 61 73 65 20 24 3a 3a 65 61 67 6c   -nocase $::eagl
1a4f0 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6d 70 69  e_platform(compi
1a500 6c 65 4f 70 74 69 6f 6e 73 29 20 5c 0d 0a 20 20  leOptions) \..  
1a510 20 20 20 20 20 20 20 20 20 20 20 20 4e 4f 54 49              NOTI
1a520 46 59 5f 4f 42 4a 45 43 54 5d 20 21 3d 20 2d 31  FY_OBJECT] != -1
1a530 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
1a540 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1a550 4e 4f 54 45 3a 20 59 65 73 2c 20 73 75 70 70 6f  NOTE: Yes, suppo
1a560 72 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 72 65  rt for object re
1a570 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72  ference count tr
1a580 61 63 6b 69 6e 67 20 69 73 20 70 72 65 73 65 6e  acking is presen
1a590 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1a5a0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1a5b0 61 69 6e 74 20 72 65 66 43 6f 75 6e 74 0d 0a 0d  aint refCount...
1a5c0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1a5d0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
1a5e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a5f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a600 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
1a610 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1a620 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1a630 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20  RuntimeOption { 
1a640 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 7d  channel option }
1a650 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1a660 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a670 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
1a680 69 6e 67 20 66 6f 72 20 72 75 6e 74 69 6d 65 20  ing for runtime 
1a690 6f 70 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20  option \"" \..  
1a6a0 20 20 20 20 20 20 20 20 24 6f 70 74 69 6f 6e 20          $option 
1a6b0 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
1a6c0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1a6d0 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74  sts ::eagle_plat
1a6e0 66 6f 72 6d 28 72 75 6e 74 69 6d 65 4f 70 74 69  form(runtimeOpti
1a6f0 6f 6e 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ons)] && \..    
1a700 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d        [lsearch -
1a710 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 3a  exact -nocase $:
1a720 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
1a730 72 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 73 29 20  runtimeOptions) 
1a740 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a750 20 24 6f 70 74 69 6f 6e 5d 20 21 3d 20 2d 31 7d   $option] != -1}
1a760 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a770 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1a780 54 45 3a 20 59 65 73 2c 20 73 75 70 70 6f 72 74  TE: Yes, support
1a790 20 66 6f 72 20 74 68 65 20 72 75 6e 74 69 6d 65   for the runtime
1a7a0 20 6f 70 74 69 6f 6e 20 69 73 20 70 72 65 73 65   option is prese
1a7b0 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  nt...        #..
1a7c0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1a7d0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1a7e0 73 20 72 75 6e 74 69 6d 65 2e 20 24 6f 70 74 69  s runtime. $opti
1a7f0 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  on]....        t
1a800 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1a810 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
1a820 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
1a830 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
1a840 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1a850 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
1a860 65 63 6b 46 6f 72 44 79 6e 61 6d 69 63 4c 6f 61  eckForDynamicLoa
1a870 64 69 6e 67 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  ding { channel }
1a880 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1a890 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1a8a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 79 6e 61  hecking for dyna
1a8b0 6d 69 63 20 6c 6f 61 64 69 6e 67 2e 2e 2e 20 22  mic loading... "
1a8c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1a8d0 20 20 20 23 20 4e 4f 54 45 3a 20 41 73 20 66 61     # NOTE: As fa
1a8e0 72 20 61 73 20 77 65 20 6b 6e 6f 77 2c 20 64 79  r as we know, dy
1a8f0 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67 20 61 6c  namic loading al
1a900 77 61 79 73 20 77 6f 72 6b 73 20 6f 6e 20 57 69  ways works on Wi
1a910 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20 23 20  ndows...      # 
1a920 20 20 20 20 20 20 4f 6e 20 73 6f 6d 65 20 55 6e        On some Un
1a930 69 78 20 73 79 73 74 65 6d 73 2c 20 64 6c 6f 70  ix systems, dlop
1a940 65 6e 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  en does not work
1a950 20 28 65 2e 67 2e 20 62 65 63 61 75 73 65 0d 0a   (e.g. because..
1a960 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4d 6f        #       Mo
1a970 6e 6f 20 69 73 20 73 74 61 74 69 63 61 6c 6c 79  no is statically
1a980 20 6c 69 6e 6b 65 64 2c 20 65 74 63 29 2e 0d 0a   linked, etc)...
1a990 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1a9a0 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 7c  f {[isWindows] |
1a9b0 7c 20 28 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  | ([llength [inf
1a9c0 6f 20 63 6f 6d 6d 61 6e 64 73 20 6c 69 62 72 61  o commands libra
1a9d0 72 79 5d 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  ry]] > 0 && \.. 
1a9e0 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20           [catch 
1a9f0 7b 6c 69 62 72 61 72 79 20 74 65 73 74 7d 5d 20  {library test}] 
1aa00 3d 3d 20 30 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  == 0)} then {.. 
1aa10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1aa20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
1aa30 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
1aa40 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
1aa50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1aa60 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1aa70 74 20 64 79 6e 61 6d 69 63 0d 0a 0d 0a 20 20 20  t dynamic....   
1aa80 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1aa90 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
1aaa0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1aab0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1aac0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
1aad0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1aae0 72 6f 63 20 63 68 65 63 6b 46 6f 72 57 69 6e 64  roc checkForWind
1aaf0 6f 77 73 46 6f 72 6d 73 20 7b 20 63 68 61 6e 6e  owsForms { chann
1ab00 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
1ab10 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1ab20 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
1ab30 57 69 6e 64 6f 77 73 20 46 6f 72 6d 73 2e 2e 2e  Windows Forms...
1ab40 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
1ab50 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65       # HACK: Whe
1ab60 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e  n running on Win
1ab70 64 6f 77 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  dows, we do not 
1ab80 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20 6f  need to do any o
1ab90 74 68 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  ther..      #   
1aba0 20 20 20 20 73 70 65 63 69 61 6c 20 63 68 65 63      special chec
1abb0 6b 73 20 68 65 72 65 3b 20 68 6f 77 65 76 65 72  ks here; however
1abc0 2c 20 6f 6e 20 55 6e 69 78 20 28 61 6e 64 20 4d  , on Unix (and M
1abd0 61 63 20 4f 53 20 58 3f 29 2c 0d 0a 20 20 20 20  ac OS X?),..    
1abe0 20 20 23 20 20 20 20 20 20 20 77 65 20 73 68 6f    #       we sho
1abf0 75 6c 64 20 63 68 65 63 6b 20 66 6f 72 20 74 68  uld check for th
1ac00 65 20 44 49 53 50 4c 41 59 20 65 6e 76 69 72 6f  e DISPLAY enviro
1ac10 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 61  nment variable a
1ac20 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
1ac30 20 73 6f 6d 65 20 62 61 73 69 63 20 69 6e 64 69   some basic indi
1ac40 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  cation that the 
1ac50 58 20 73 65 72 76 65 72 20 69 73 20 61 76 61 69  X server is avai
1ac60 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 20  lable...      # 
1ac70 20 20 20 20 20 20 54 68 69 73 20 61 70 70 65 61        This appea
1ac80 72 73 20 74 6f 20 62 65 20 76 65 72 79 20 6e 65  rs to be very ne
1ac90 63 65 73 73 61 72 79 20 6f 6e 20 4d 6f 6e 6f 20  cessary on Mono 
1aca0 62 65 63 61 75 73 65 20 69 74 0d 0a 20 20 20 20  because it..    
1acb0 20 20 23 20 20 20 20 20 20 20 63 72 61 73 68 65    #       crashe
1acc0 73 20 61 66 74 65 72 20 72 65 70 65 61 74 65 64  s after repeated
1acd0 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1ace0 20 74 6f 20 63 72 65 61 74 65 20 61 0d 0a 20 20   to create a..  
1acf0 20 20 20 20 23 20 20 20 20 20 20 20 57 69 6e 64      #       Wind
1ad00 6f 77 73 20 46 6f 72 6d 20 77 68 65 6e 20 74 68  ows Form when th
1ad10 65 20 58 20 73 65 72 76 65 72 20 69 73 20 75 6e  e X server is un
1ad20 61 76 61 69 6c 61 62 6c 65 20 28 65 2e 67 2e 20  available (e.g. 
1ad30 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
1ad40 20 20 4f 70 65 6e 42 53 44 29 2e 0d 0a 20 20 20    OpenBSD)...   
1ad50 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1ad60 5b 69 73 57 69 6e 64 6f 77 73 5d 20 7c 7c 20 5b  [isWindows] || [
1ad70 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
1ad80 76 28 44 49 53 50 4c 41 59 29 5d 7d 20 74 68 65  v(DISPLAY)]} the
1ad90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1ada0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1adb0 49 73 20 74 68 65 20 57 69 6e 64 6f 77 73 20 46  Is the Windows F
1adc0 6f 72 6d 73 20 61 73 73 65 6d 62 6c 79 20 61 76  orms assembly av
1add0 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
1ade0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1adf0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ae00 20 20 20 20 20 6f 62 6a 65 63 74 20 72 65 73 6f       object reso
1ae10 6c 76 65 20 53 79 73 74 65 6d 2e 57 69 6e 64 6f  lve System.Windo
1ae20 77 73 2e 46 6f 72 6d 73 0d 0a 20 20 20 20 20 20  ws.Forms..      
1ae30 20 20 7d 20 61 73 73 65 6d 62 6c 79 5d 20 3d 3d    } assembly] ==
1ae40 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ae50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ae60 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
1ae70 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
1ae80 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
1ae90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1aea0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1aeb0 74 72 61 69 6e 74 20 77 69 6e 46 6f 72 6d 73 0d  traint winForms.
1aec0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
1aed0 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
1aee0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n....          #
1aef0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1af00 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
1af10 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
1af20 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1af30 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1af40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1af50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
1af60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1af70 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
1af80 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 57 6f   proc checkForWo
1af90 57 36 34 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  W64 { channel } 
1afa0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
1afb0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
1afc0 65 63 6b 69 6e 67 20 66 6f 72 20 57 6f 57 36 34  ecking for WoW64
1afd0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
1afe0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1aff0 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
1b000 28 77 6f 77 36 34 29 5d 20 26 26 20 5c 0d 0a 20  (wow64)] && \.. 
1b010 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1b020 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72   is boolean -str
1b030 69 63 74 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61  ict $::eagle_pla
1b040 74 66 6f 72 6d 28 77 6f 77 36 34 29 5d 20 26 26  tform(wow64)] &&
1b050 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a   \..          $:
1b060 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
1b070 77 6f 77 36 34 29 7d 20 74 68 65 6e 20 7b 0d 0a  wow64)} then {..
1b080 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b090 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
1b0a0 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69  we are running i
1b0b0 6e 20 61 20 57 6f 57 36 34 20 70 72 6f 63 65 73  n a WoW64 proces
1b0c0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1b0d0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1b0e0 61 69 6e 74 20 77 6f 77 36 34 0d 0a 0d 0a 20 20  aint wow64....  
1b0f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b100 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1b110 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1b120 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b130 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
1b140 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1b150 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 74 61  proc checkForSta
1b160 54 68 72 65 61 64 20 7b 20 63 68 61 6e 6e 65 6c  Thread { channel
1b170 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
1b180 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1b190 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 54   checking for ST
1b1a0 41 20 74 68 72 65 61 64 2e 2e 2e 20 22 0d 0a 0d  A thread... "...
1b1b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
1b1c0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
1b1d0 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
1b1e0 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
1b1f0 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64  ad.CurrentThread
1b200 20 47 65 74 41 70 61 72 74 6d 65 6e 74 53 74 61   GetApartmentSta
1b210 74 65 0d 0a 20 20 20 20 20 20 7d 20 61 70 61 72  te..      } apar
1b220 74 6d 65 6e 74 53 74 61 74 65 5d 20 3d 3d 20 30  tmentState] == 0
1b230 20 26 26 20 24 61 70 61 72 74 6d 65 6e 74 53 74   && $apartmentSt
1b240 61 74 65 20 65 71 20 22 53 54 41 22 7d 20 74 68  ate eq "STA"} th
1b250 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1b260 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b270 20 59 65 73 2c 20 77 65 20 61 72 65 20 72 75 6e   Yes, we are run
1b280 6e 69 6e 67 20 69 6e 20 61 6e 20 53 54 41 20 74  ning in an STA t
1b290 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  hread...        
1b2a0 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
1b2b0 6e 73 74 72 61 69 6e 74 20 73 74 61 54 68 72 65  nstraint staThre
1b2c0 61 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ad....        tp
1b2d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1b2e0 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
1b2f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1b300 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
1b310 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1b320 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
1b330 63 6b 46 6f 72 57 69 6e 64 6f 77 73 50 72 65 73  ckForWindowsPres
1b340 65 6e 74 61 74 69 6f 6e 46 6f 75 6e 64 61 74 69  entationFoundati
1b350 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  on { channel } {
1b360 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
1b370 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
1b380 63 6b 69 6e 67 20 66 6f 72 20 57 69 6e 64 6f 77  cking for Window
1b390 73 20 50 72 65 73 65 6e 74 61 74 69 6f 6e 20 46  s Presentation F
1b3a0 6f 75 6e 64 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a  oundation... "..
1b3b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b3c0 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
1b3d0 57 69 6e 64 6f 77 73 20 50 72 65 73 65 6e 74 61  Windows Presenta
1b3e0 74 69 6f 6e 20 46 6f 75 6e 64 61 74 69 6f 6e 20  tion Foundation 
1b3f0 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
1b400 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1b410 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1b420 20 6f 62 6a 65 63 74 20 72 65 73 6f 6c 76 65 20   object resolve 
1b430 50 72 65 73 65 6e 74 61 74 69 6f 6e 46 72 61 6d  PresentationFram
1b440 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 7d 20 61  ework..      } a
1b450 73 73 65 6d 62 6c 79 5d 20 3d 3d 20 30 7d 20 74  ssembly] == 0} t
1b460 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1b470 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1b480 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
1b490 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61  s that it is ava
1b4a0 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
1b4b0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
1b4c0 6f 6e 73 74 72 61 69 6e 74 20 77 70 66 0d 0a 0d  onstraint wpf...
1b4d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1b4e0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
1b4f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1b500 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1b510 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
1b520 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b530 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1b540 44 61 74 61 62 61 73 65 20 7b 20 63 68 61 6e 6e  Database { chann
1b550 65 6c 20 74 79 70 65 20 73 74 72 69 6e 67 20 7d  el type string }
1b560 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1b570 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1b580 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 61 74 61  hecking for data
1b590 62 61 73 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  base... "....   
1b5a0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41     #..      # HA
1b5b0 43 4b 3a 20 44 69 73 61 62 6c 65 20 64 61 74 61  CK: Disable data
1b5c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 76 69 74  base connectivit
1b5d0 79 20 74 65 73 74 69 6e 67 20 6f 6e 20 4d 6f 6e  y testing on Mon
1b5e0 6f 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20  o because..     
1b5f0 20 23 20 20 20 20 20 20 20 69 74 20 66 61 69 6c   #       it fail
1b600 73 20 74 6f 20 74 69 6d 65 6f 75 74 20 28 75 6e  s to timeout (un
1b610 6c 65 73 73 20 73 70 65 63 69 61 6c 20 74 65 73  less special tes
1b620 74 20 73 75 69 74 65 20 68 61 63 6b 73 0d 0a 20  t suite hacks.. 
1b630 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1b640 20 4d 6f 6e 6f 20 68 61 76 65 20 62 65 65 6e 20   Mono have been 
1b650 64 69 73 61 62 6c 65 64 20 62 79 20 74 68 65 20  disabled by the 
1b660 75 73 65 72 29 2e 0d 0a 20 20 20 20 20 20 23 0d  user)...      #.
1b670 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 73 54  .      if {![isT
1b680 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b  estMono]} then {
1b690 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b6a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6e       # NOTE: Can
1b6b0 20 77 65 20 61 63 63 65 73 73 20 74 68 65 20 6c   we access the l
1b6c0 6f 63 61 6c 20 64 61 74 61 62 61 73 65 3f 0d 0a  ocal database?..
1b6d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b6e0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73     if {[catch {s
1b6f0 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 24 74  ql open -type $t
1b700 79 70 65 20 24 73 74 72 69 6e 67 7d 20 63 6f 6e  ype $string} con
1b710 6e 65 63 74 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  nection] == 0} t
1b720 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b730 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1b740 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70  NOTE: Yes, it ap
1b750 70 65 61 72 73 20 74 68 61 74 20 77 65 20 63 61  pears that we ca
1b760 6e 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  n connect to the
1b770 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e   local database.
1b780 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b790 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1b7a0 74 72 61 69 6e 74 20 64 61 74 61 62 61 73 65 0d  traint database.
1b7b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1b7c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1b7d0 3a 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 74 68  : Also record th
1b7e0 65 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  e test database 
1b7f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 79 70 65 20  connection type 
1b800 75 73 65 64 20 61 73 20 61 0d 0a 20 20 20 20 20  used as a..     
1b810 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1b820 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
1b830 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b840 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1b850 67 20 6c 65 6e 67 74 68 20 24 74 79 70 65 5d 20  g length $type] 
1b860 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1b870 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1b880 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1b890 67 73 20 64 61 74 61 62 61 73 65 2e 20 5b 73 74  gs database. [st
1b8a0 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 24 74 79  ring tolower $ty
1b8b0 70 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  pe]]..          
1b8c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
1b8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1b8e0 54 45 3a 20 43 6c 65 61 6e 75 70 20 74 68 65 20  TE: Cleanup the 
1b8f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1b900 69 6f 6e 20 77 65 20 6a 75 73 74 20 6f 70 65 6e  ion we just open
1b910 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
1b920 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
1b930 63 6c 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f  close $connectio
1b940 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n....          t
1b950 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1b960 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  s\n..        } e
1b970 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1b980 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b990 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  no\n..        }.
1b9a0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1b9b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1b9c0 63 68 61 6e 6e 65 6c 20 64 69 73 61 62 6c 65 64  channel disabled
1b9d0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
1b9e0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1b9f0 63 68 65 63 6b 46 6f 72 4c 69 62 72 61 72 79 41  checkForLibraryA
1ba00 73 73 65 6d 62 6c 79 4e 61 6d 65 20 7b 20 63 68  ssemblyName { ch
1ba10 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
1ba20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1ba30 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1ba40 6f 72 20 6c 69 62 72 61 72 79 20 61 73 73 65 6d  or library assem
1ba50 62 6c 79 20 6e 61 6d 65 2e 2e 2e 20 22 0d 0a 0d  bly name... "...
1ba60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ba70 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20  # NOTE: What is 
1ba80 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1ba90 63 6f 72 65 20 6c 69 62 72 61 72 79 20 61 73 73  core library ass
1baa0 65 6d 62 6c 79 3f 20 20 4e 6f 72 6d 61 6c 6c 79  embly?  Normally
1bab0 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
1bac0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 22 45   this will be "E
1bad0 61 67 6c 65 22 3b 20 68 6f 77 65 76 65 72 2c 20  agle"; however, 
1bae0 69 74 20 63 6f 75 6c 64 20 62 65 20 73 6f 6d 65  it could be some
1baf0 74 68 69 6e 67 20 65 6c 73 65 2e 0d 0a 20 20 20  thing else...   
1bb00 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1bb10 5b 63 61 74 63 68 20 7b 67 65 74 54 65 73 74 41  [catch {getTestA
1bb20 73 73 65 6d 62 6c 79 4e 61 6d 65 7d 20 61 73 73  ssemblyName} ass
1bb30 65 6d 62 6c 79 4e 61 6d 65 5d 20 3d 3d 20 30 7d  emblyName] == 0}
1bb40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bb50 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
1bb60 61 70 70 65 6e 64 41 72 67 73 20 6c 69 62 72 61  appendArgs libra
1bb70 72 79 41 73 73 65 6d 62 6c 79 4e 61 6d 65 2e 20  ryAssemblyName. 
1bb80 24 61 73 73 65 6d 62 6c 79 4e 61 6d 65 5d 0d 0a  $assemblyName]..
1bb90 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1bba0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1bbb0 41 72 67 73 20 22 79 65 73 20 28 22 20 24 61 73  Args "yes (" $as
1bbc0 73 65 6d 62 6c 79 4e 61 6d 65 20 22 29 5c 6e 22  semblyName ")\n"
1bbd0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
1bbe0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1bbf0 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
1bc00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1bc10 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1bc20 6b 46 6f 72 41 73 73 65 6d 62 6c 79 20 7b 20 63  kForAssembly { c
1bc30 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
1bc40 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
1bc50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1bc60 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
1bc70 20 66 6f 72 20 61 73 73 65 6d 62 6c 79 20 5c 22   for assembly \"
1bc80 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
1bc90 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
1bca0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1bcb0 20 23 20 4e 4f 54 45 3a 20 43 61 6e 20 74 68 65   # NOTE: Can the
1bcc0 20 61 73 73 65 6d 62 6c 79 20 62 65 20 6c 6f 61   assembly be loa
1bcd0 64 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ded?..      #.. 
1bce0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1bcf0 7b 6f 62 6a 65 63 74 20 72 65 73 6f 6c 76 65 20  {object resolve 
1bd00 24 6e 61 6d 65 7d 20 61 73 73 65 6d 62 6c 79 5d  $name} assembly]
1bd10 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1bd20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bd30 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
1bd40 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
1bd50 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
1bd60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1bd70 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1bd80 74 20 24 6e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  t $name....     
1bd90 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1bda0 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
1bdb0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bdc0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1bdd0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
1bde0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1bdf0 63 20 63 68 65 63 6b 46 6f 72 4f 62 6a 65 63 74  c checkForObject
1be00 4d 65 6d 62 65 72 20 7b 20 63 68 61 6e 6e 65 6c  Member { channel
1be10 20 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 20 7b   object member {
1be20 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7d  constraint ""} }
1be30 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1be40 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1be50 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
1be60 69 6e 67 20 66 6f 72 20 6f 62 6a 65 63 74 20 6d  ing for object m
1be70 65 6d 62 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  ember \"" \..   
1be80 20 20 20 20 20 20 20 24 6f 62 6a 65 63 74 20 2e         $object .
1be90 20 24 6d 65 6d 62 65 72 20 22 5c 22 2e 2e 2e 20   $member "\"... 
1bea0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
1beb0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1bec0 20 20 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73    object members
1bed0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1bee0 69 63 20 2d 70 61 74 74 65 72 6e 20 24 6d 65 6d  ic -pattern $mem
1bef0 62 65 72 20 24 6f 62 6a 65 63 74 0d 0a 20 20 20  ber $object..   
1bf00 20 20 20 7d 20 6d 65 6d 62 65 72 73 5d 20 3d 3d     } members] ==
1bf10 20 30 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24   0 && [llength $
1bf20 6d 65 6d 62 65 72 73 5d 20 3e 20 30 7d 20 74 68  members] > 0} th
1bf30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1bf40 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1bf50 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
1bf60 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69   that it is avai
1bf70 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
1bf80 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
1bf90 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63  string length $c
1bfa0 6f 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20  onstraint] > 0} 
1bfb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bfc0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1bfd0 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 65 6d 62  [appendArgs memb
1bfe0 65 72 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d  er_ $constraint]
1bff0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1c000 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
1c010 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1c020 65 6e 64 41 72 67 73 20 24 6f 62 6a 65 63 74 2e  endArgs $object.
1c030 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d   [string trim $m
1c040 65 6d 62 65 72 20 2a 3f 5d 5d 0d 0a 20 20 20 20  ember *?]]..    
1c050 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c060 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c070 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  yes\n..      } e
1c080 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1c090 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
1c0a0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
1c0b0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1c0c0 63 68 65 63 6b 46 6f 72 54 63 6c 49 6e 73 74 61  checkForTclInsta
1c0d0 6c 6c 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  lls { channel } 
1c0e0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
1c0f0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
1c100 65 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c 20 69  ecking for Tcl i
1c110 6e 73 74 61 6c 6c 73 2e 2e 2e 20 22 0d 0a 0d 0a  nstalls... "....
1c120 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1c130 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
1c140 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 6c 6f 61   dynamically loa
1c150 64 61 62 6c 65 20 54 63 6c 20 6c 69 62 72 61 72  dable Tcl librar
1c160 69 65 73 20 28 66 6f 72 20 74 68 69 73 0d 0a 20  ies (for this.. 
1c170 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 63       #       arc
1c180 68 69 74 65 63 74 75 72 65 20 6f 6e 6c 79 29 2e  hitecture only).
1c190 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c1a0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 74 63 6c   if {[catch {tcl
1c1b0 20 73 65 6c 65 63 74 20 2d 61 72 63 68 69 74 65   select -archite
1c1c0 63 74 75 72 65 7d 20 74 63 6c 5d 20 3d 3d 20 30  cture} tcl] == 0
1c1d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c1e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1c1f0 4f 54 45 3a 20 46 6f 75 6e 64 20 6f 6e 65 3f 20  OTE: Found one? 
1c200 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20 74 6f 20   Ok, attempt to 
1c210 67 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6f  grab the index o
1c220 66 20 74 68 65 20 76 65 72 73 69 6f 6e 0d 0a 20  f the version.. 
1c230 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
1c240 69 65 6c 64 20 66 72 6f 6d 20 74 68 65 20 6c 69  ield from the li
1c250 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
1c260 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64 65          set inde
1c270 78 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63  x [lsearch -exac
1c280 74 20 24 74 63 6c 20 76 65 72 73 69 6f 6e 5d 0d  t $tcl version].
1c290 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  ...        if {$
1c2a0 69 6e 64 65 78 20 21 3d 20 2d 31 7d 20 74 68 65  index != -1} the
1c2b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
1c2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1c2d0 54 45 3a 20 54 68 65 20 76 65 72 79 20 6e 65 78  TE: The very nex
1c2e0 74 20 6c 69 73 74 20 69 6e 64 65 78 20 63 6f 6e  t list index con
1c2f0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1c300 28 69 2e 65 2e 20 6c 69 6b 65 0d 0a 20 20 20 20  (i.e. like..    
1c310 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20        #       a 
1c320 54 63 6c 20 38 2e 35 2b 20 64 69 63 74 29 2e 0d  Tcl 8.5+ dict)..
1c330 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c340 20 20 20 20 20 20 20 20 73 65 74 20 64 6f 74 56          set dotV
1c350 65 72 73 69 6f 6e 20 5b 6c 69 6e 64 65 78 20 24  ersion [lindex $
1c360 74 63 6c 20 5b 69 6e 63 72 20 69 6e 64 65 78 5d  tcl [incr index]
1c370 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ]....          #
1c380 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1c390 54 45 3a 20 44 6f 20 77 65 20 6b 6e 6f 77 20 74  TE: Do we know t
1c3a0 68 65 20 76 65 72 73 69 6f 6e 3f 0d 0a 20 20 20  he version?..   
1c3b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c3c0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1c3d0 6c 65 6e 67 74 68 20 24 64 6f 74 56 65 72 73 69  length $dotVersi
1c3e0 6f 6e 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  on] > 0 && \..  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 72 65 67              [reg
1c400 65 78 70 20 2d 2d 20 7b 5e 5c 64 2b 5c 2e 5c 64  exp -- {^\d+\.\d
1c410 2b 24 7d 20 24 64 6f 74 56 65 72 73 69 6f 6e 5d  +$} $dotVersion]
1c420 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c430 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c440 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
1c450 2c 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 20 6f  , some version o
1c460 66 20 54 63 6c 20 69 73 20 61 76 61 69 6c 61 62  f Tcl is availab
1c470 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
1c480 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1c490 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63  addConstraint tc
1c4a0 6c 4c 69 62 72 61 72 79 0d 0a 0d 0a 20 20 20 20  lLibrary....    
1c4b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c4c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
1c4d0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 38 2e  s the version 8.
1c4e0 78 20 6f 72 20 68 69 67 68 65 72 3f 0d 0a 20 20  x or higher?..  
1c4f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1c500 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1c510 20 74 63 6c 56 65 72 73 69 6f 6e 20 5b 6c 72 65   tclVersion [lre
1c520 76 65 72 73 65 20 5b 67 65 74 4b 6e 6f 77 6e 54  verse [getKnownT
1c530 63 6c 56 65 72 73 69 6f 6e 73 5d 5d 20 7b 0d 0a  clVersions]] {..
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c550 20 7b 24 64 6f 74 56 65 72 73 69 6f 6e 20 3e 3d   {$dotVersion >=
1c560 20 5b 67 65 74 44 6f 74 74 65 64 56 65 72 73 69   [getDottedVersi
1c570 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e 5d 7d  on $tclVersion]}
1c580 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c590 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1c5a0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1c5b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1c5c0 20 20 20 20 20 20 20 20 20 20 74 63 6c 4c 69 62            tclLib
1c5d0 72 61 72 79 20 5b 67 65 74 44 6f 74 6c 65 73 73  rary [getDotless
1c5e0 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73  Version $tclVers
1c5f0 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ion]]....       
1c600 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1c610 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1c620 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 74 68 65  TE: For now, the
1c630 72 65 20 63 61 6e 20 62 65 20 6f 6e 6c 79 20 6f  re can be only o
1c640 6e 65 20 54 63 6c 20 6c 69 62 72 61 72 79 20 6d  ne Tcl library m
1c650 61 74 63 68 3b 0d 0a 20 20 20 20 20 20 20 20 20  atch;..         
1c660 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1c670 68 65 72 65 66 6f 72 65 2c 20 77 65 20 61 72 65  herefore, we are
1c680 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20   done...        
1c690 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c6a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1c6b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c6c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1c6d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c6e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1c6f0 61 70 70 65 6e 64 41 72 67 73 20 24 64 6f 74 56  appendArgs $dotV
1c700 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 0d 0a 20 20  ersion \n]....  
1c710 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1c720 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1c730 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   We are done her
1c740 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a  e, return now...
1c750 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1c760 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1c770 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
1c780 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c790 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74   }....      tput
1c7a0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
1c7b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1c7c0 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 63 6c 52  roc checkForTclR
1c7d0 65 61 64 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  eady { channel }
1c7e0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1c7f0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1c800 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c 20  hecking for Tcl 
1c810 72 65 61 64 69 6e 65 73 73 2e 2e 2e 20 22 0d 0a  readiness... "..
1c820 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
1c830 63 68 20 7b 74 63 6c 20 72 65 61 64 79 7d 20 72  ch {tcl ready} r
1c840 65 61 64 79 5d 20 3d 3d 20 30 20 26 26 20 24 72  eady] == 0 && $r
1c850 65 61 64 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eady} then {..  
1c860 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c870 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 6e 61   # NOTE: Yes, na
1c880 74 69 76 65 20 54 63 6c 20 69 73 20 6c 6f 61 64  tive Tcl is load
1c890 65 64 20 61 6e 64 20 72 65 61 64 79 2e 0d 0a 20  ed and ready... 
1c8a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c8b0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1c8c0 74 63 6c 52 65 61 64 79 0d 0a 0d 0a 20 20 20 20  tclReady....    
1c8d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1c8e0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 6e 61 74 69   NOTE: Yes, nati
1c8f0 76 65 20 54 63 6c 20 69 73 20 72 65 61 64 79 20  ve Tcl is ready 
1c900 2d 4f 52 2d 20 61 76 61 69 6c 61 62 6c 65 2e 0d  -OR- available..
1c910 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1c920 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1c930 74 20 74 63 6c 52 65 61 64 79 4f 72 4c 69 62 72  t tclReadyOrLibr
1c940 61 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ary....        #
1c950 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1c960 3a 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20 74 6f  : Ok, attempt to
1c970 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c   determine the l
1c980 6f 61 64 65 64 20 54 63 6c 20 76 65 72 73 69 6f  oaded Tcl versio
1c990 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
1c9a0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1c9b0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1c9c0 63 6c 20 65 76 61 6c 20 5b 74 63 6c 20 6d 61 73  cl eval [tcl mas
1c9d0 74 65 72 5d 20 7b 69 6e 66 6f 20 74 63 6c 76 65  ter] {info tclve
1c9e0 72 73 69 6f 6e 7d 0d 0a 20 20 20 20 20 20 20 20  rsion}..        
1c9f0 7d 20 64 6f 74 56 65 72 73 69 6f 6e 5d 20 3d 3d  } dotVersion] ==
1ca00 20 30 20 26 26 20 5b 72 65 67 65 78 70 20 2d 2d   0 && [regexp --
1ca10 20 7b 5e 5c 64 2b 5c 2e 5c 64 2b 24 7d 20 24 64   {^\d+\.\d+$} $d
1ca20 6f 74 56 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e  otVersion]} then
1ca30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
1ca40 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1ca50 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1ca60 20 20 20 20 20 20 20 20 20 74 63 6c 52 65 61 64           tclRead
1ca70 79 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65 72  y [getDotlessVer
1ca80 73 69 6f 6e 20 24 64 6f 74 56 65 72 73 69 6f 6e  sion $dotVersion
1ca90 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
1caa0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1cab0 4f 54 45 3a 20 54 68 65 20 54 63 6c 20 6c 69 62  OTE: The Tcl lib
1cac0 72 61 72 79 20 69 73 20 72 65 61 64 79 3b 20 68  rary is ready; h
1cad0 6f 77 65 76 65 72 2c 20 77 65 20 6e 65 65 64 20  owever, we need 
1cae0 74 6f 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20  to add the..    
1caf0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
1cb00 70 72 6f 70 72 69 61 74 65 20 74 65 73 74 20 63  propriate test c
1cb10 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 69 6e 64  onstraint to ind
1cb20 69 63 61 74 65 20 74 68 61 74 20 61 20 73 70 65  icate that a spe
1cb30 63 69 66 69 63 0d 0a 20 20 20 20 20 20 20 20 20  cific..         
1cb40 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
1cb50 20 6f 66 20 54 63 6c 20 69 73 20 22 65 69 74 68   of Tcl is "eith
1cb60 65 72 20 72 65 61 64 79 20 6f 72 20 61 76 61 69  er ready or avai
1cb70 6c 61 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20 20  lable"...       
1cb80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1cb90 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72 73 69  foreach tclVersi
1cba0 6f 6e 20 5b 6c 72 65 76 65 72 73 65 20 5b 67 65  on [lreverse [ge
1cbb0 74 4b 6e 6f 77 6e 54 63 6c 56 65 72 73 69 6f 6e  tKnownTclVersion
1cbc0 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  s]] {..         
1cbd0 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b     set version [
1cbe0 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69 6f  getDotlessVersio
1cbf0 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e 5d 0d 0a  n $tclVersion]..
1cc00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1cc10 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
1cc20 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63  t [appendArgs tc
1cc30 6c 4c 69 62 72 61 72 79 20 24 76 65 72 73 69 6f  lLibrary $versio
1cc40 6e 5d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  n]] && \..      
1cc50 20 20 20 20 20 20 20 20 20 20 24 64 6f 74 56 65            $dotVe
1cc60 72 73 69 6f 6e 20 3e 3d 20 5b 67 65 74 44 6f 74  rsion >= [getDot
1cc70 74 65 64 56 65 72 73 69 6f 6e 20 24 74 63 6c 56  tedVersion $tclV
1cc80 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d  ersion]} then {.
1cc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1cca0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
1ccb0 70 65 6e 64 41 72 67 73 20 74 63 6c 52 65 61 64  pendArgs tclRead
1ccc0 79 4f 72 4c 69 62 72 61 72 79 20 24 76 65 72 73  yOrLibrary $vers
1ccd0 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ion]....        
1cce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ccf0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1cd00 6f 72 20 6e 6f 77 2c 20 74 68 65 72 65 20 63 61  or now, there ca
1cd10 6e 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 54 63  n be only one Tc
1cd20 6c 20 6c 69 62 72 61 72 79 20 6d 61 74 63 68 3b  l library match;
1cd30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cd40 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
1cd50 65 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d  e, we are done..
1cd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1cd70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cd80 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 20  break..         
1cd90 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1cda0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  }....          t
1cdb0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1cdc0 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
1cdd0 22 20 24 64 6f 74 56 65 72 73 69 6f 6e 20 22 29  " $dotVersion ")
1cde0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  \n"]..        } 
1cdf0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1ce00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1ce10 20 4e 4f 54 45 3a 20 54 68 65 20 54 63 6c 20 6c   NOTE: The Tcl l
1ce20 69 62 72 61 72 79 20 69 73 20 72 65 61 64 79 3b  ibrary is ready;
1ce30 20 68 6f 77 65 76 65 72 2c 20 77 65 20 68 61 76   however, we hav
1ce40 65 20 6e 6f 20 69 64 65 61 20 77 68 61 74 0d 0a  e no idea what..
1ce50 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1ce60 20 20 76 65 72 73 69 6f 6e 20 69 74 20 61 63 74    version it act
1ce70 75 61 6c 6c 79 20 69 73 3b 20 74 68 65 72 65 66  ually is; theref
1ce80 6f 72 65 2c 20 73 6b 69 70 20 61 64 64 69 6e 67  ore, skip adding
1ce90 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
1cea0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
1ceb0 73 74 72 61 69 6e 74 20 74 6f 20 69 6e 64 69 63  straint to indic
1cec0 61 74 65 20 74 68 61 74 20 61 20 73 70 65 63 69  ate that a speci
1ced0 66 69 63 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  fic version of T
1cee0 63 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  cl..          # 
1cef0 20 20 20 20 20 20 69 73 20 22 65 69 74 68 65 72        is "either
1cf00 20 72 65 61 64 79 20 6f 72 20 61 76 61 69 6c 61   ready or availa
1cf10 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 20  ble"...         
1cf20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   #..          tp
1cf30 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1cf40 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  \n..        }.. 
1cf50 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1cf60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cf70 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 54 63    # NOTE: The Tc
1cf80 6c 20 6c 69 62 72 61 72 79 20 69 73 20 6e 6f 74  l library is not
1cf90 20 72 65 61 64 79 3b 20 68 6f 77 65 76 65 72 2c   ready; however,
1cfa0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1cfb0 6f 20 61 64 64 0d 0a 20 20 20 20 20 20 20 20 23  o add..        #
1cfc0 20 20 20 20 20 20 20 74 68 65 20 61 70 70 72 6f         the appro
1cfd0 70 72 69 61 74 65 20 74 65 73 74 20 63 6f 6e 73  priate test cons
1cfe0 74 72 61 69 6e 74 20 74 6f 20 69 6e 64 69 63 61  traint to indica
1cff0 74 65 20 74 68 61 74 20 61 20 73 70 65 63 69 66  te that a specif
1d000 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ic..        #   
1d010 20 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 54      version of T
1d020 63 6c 20 69 73 20 22 65 69 74 68 65 72 20 72 65  cl is "either re
1d030 61 64 79 20 6f 72 20 61 76 61 69 6c 61 62 6c 65  ady or available
1d040 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
1d050 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 74         foreach t
1d060 63 6c 56 65 72 73 69 6f 6e 20 5b 6c 72 65 76 65  clVersion [lreve
1d070 72 73 65 20 5b 67 65 74 4b 6e 6f 77 6e 54 63 6c  rse [getKnownTcl
1d080 56 65 72 73 69 6f 6e 73 5d 5d 20 7b 0d 0a 20 20  Versions]] {..  
1d090 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
1d0a0 69 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73 73 56  ion [getDotlessV
1d0b0 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69  ersion $tclVersi
1d0c0 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
1d0d0 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
1d0e0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1d0f0 20 74 63 6c 4c 69 62 72 61 72 79 20 24 76 65 72   tclLibrary $ver
1d100 73 69 6f 6e 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  sion]]} then {..
1d110 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
1d120 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1d130 64 41 72 67 73 20 74 63 6c 52 65 61 64 79 4f 72  dArgs tclReadyOr
1d140 4c 69 62 72 61 72 79 20 24 76 65 72 73 69 6f 6e  Library $version
1d150 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1d160 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1d170 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
1d180 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e   there can be on
1d190 6c 79 20 6f 6e 65 20 54 63 6c 20 6c 69 62 72 61  ly one Tcl libra
1d1a0 72 79 20 6d 61 74 63 68 3b 0d 0a 20 20 20 20 20  ry match;..     
1d1b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1d1c0 68 65 72 65 66 6f 72 65 2c 20 77 65 20 61 72 65  herefore, we are
1d1d0 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20   done...        
1d1e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d1f0 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20     break..      
1d200 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d210 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1d220 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
1d230 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1d240 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
1d250 63 6b 46 6f 72 54 63 6c 53 65 6c 65 63 74 20 7b  ckForTclSelect {
1d260 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
1d270 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d280 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
1d290 67 20 66 6f 72 20 54 63 6c 20 6c 69 62 72 61 72  g for Tcl librar
1d2a0 79 20 73 65 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22  y selection... "
1d2b0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
1d2c0 61 74 63 68 20 7b 74 63 6c 20 73 65 6c 65 63 74  atch {tcl select
1d2d0 20 2d 61 72 63 68 69 74 65 63 74 75 72 65 7d 20   -architecture} 
1d2e0 73 65 6c 65 63 74 5d 20 3d 3d 20 30 7d 20 74 68  select] == 0} th
1d2f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1d300 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1d310 20 59 65 73 2c 20 6e 61 74 69 76 65 20 54 63 6c   Yes, native Tcl
1d320 20 69 73 20 22 70 72 6f 62 61 62 6c 79 20 6c 6f   is "probably lo
1d330 61 64 61 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20  adable"...      
1d340 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
1d350 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 53 65  Constraint tclSe
1d360 6c 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lect....        
1d370 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1d380 45 3a 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20 74  E: Ok, attempt t
1d390 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1d3a0 73 65 6c 65 63 74 65 64 20 54 63 6c 20 76 65 72  selected Tcl ver
1d3b0 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23  sion...        #
1d3c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1d3d0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1d3e0 20 20 67 65 74 44 69 63 74 69 6f 6e 61 72 79 56    getDictionaryV
1d3f0 61 6c 75 65 20 24 73 65 6c 65 63 74 20 76 65 72  alue $select ver
1d400 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  sion..        } 
1d410 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26  version] == 0 &&
1d420 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e 5c 64   [regexp -- {^\d
1d430 2b 5c 2e 5c 64 2b 24 7d 20 24 76 65 72 73 69 6f  +\.\d+$} $versio
1d440 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
1d450 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
1d460 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
1d470 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d480 20 74 63 6c 53 65 6c 65 63 74 20 5b 73 74 72 69   tclSelect [stri
1d490 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e 20 22  ng map [list . "
1d4a0 22 5d 20 24 76 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  "] $version]]...
1d4b0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1d4c0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d4d0 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 73  dArgs "yes (" $s
1d4e0 65 6c 65 63 74 20 22 29 5c 6e 22 5d 0d 0a 20 20  elect ")\n"]..  
1d4f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1d500 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d510 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
1d520 68 65 20 54 63 6c 20 6c 69 62 72 61 72 79 20 69  he Tcl library i
1d530 73 20 22 70 72 6f 62 61 62 6c 79 20 6c 6f 61 64  s "probably load
1d540 61 62 6c 65 22 3b 20 68 6f 77 65 76 65 72 2c 20  able"; however, 
1d550 77 65 20 68 61 76 65 0d 0a 20 20 20 20 20 20 20  we have..       
1d560 20 20 20 23 20 20 20 20 20 20 20 6e 6f 20 69 64     #       no id
1d570 65 61 20 77 68 61 74 20 76 65 72 73 69 6f 6e 20  ea what version 
1d580 69 74 20 61 63 74 75 61 6c 6c 79 20 69 73 2e 0d  it actually is..
1d590 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d5a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d5b0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
1d5c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1d5d0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d5e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d5f0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
1d600 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1d610 63 20 63 68 65 63 6b 46 6f 72 54 63 6c 53 68 65  c checkForTclShe
1d620 6c 6c 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ll { channel } {
1d630 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1d640 20 23 20 48 41 43 4b 3a 20 49 66 20 74 68 69 73   # HACK: If this
1d650 20 72 65 74 75 72 6e 73 20 22 65 72 72 6f 72 22   returns "error"
1d660 20 74 68 61 74 20 6e 6f 72 6d 61 6c 6c 79 20 69   that normally i
1d670 6e 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f  ndicates an erro
1d680 72 20 77 61 73 0d 0a 20 20 20 20 20 20 23 20 20  r was..      #  
1d690 20 20 20 20 20 63 61 75 67 68 74 20 64 75 72 69       caught duri
1d6a0 6e 67 20 5b 65 78 65 63 5d 20 28 69 2e 65 2e 20  ng [exec] (i.e. 
1d6b0 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c 20 73  the native Tcl s
1d6c0 68 65 6c 6c 20 63 6f 75 6c 64 20 6e 6f 74 20 62  hell could not b
1d6d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1d6e0 20 65 78 65 63 75 74 65 64 29 2e 0d 0a 20 20 20   executed)...   
1d6f0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
1d700 70 72 65 66 69 78 20 22 2d 2d 2d 2d 20 63 68 65  prefix "---- che
1d710 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c 20 73 68  cking for Tcl sh
1d720 65 6c 6c 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22  ell version... "
1d730 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
1d740 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c 5d 20  anExecTclShell] 
1d750 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1d760 5b 63 61 74 63 68 20 7b 67 65 74 54 63 6c 56 65  [catch {getTclVe
1d770 72 73 69 6f 6e 46 6f 72 54 63 6c 53 68 65 6c 6c  rsionForTclShell
1d780 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20  } version] == 0 
1d790 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1d7a0 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 65 72 72  $version ne "err
1d7b0 6f 72 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or"} then {..   
1d7c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d7d0 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 20 6e  # NOTE: Yes, a n
1d7e0 61 74 69 76 65 20 54 63 6c 20 73 68 65 6c 6c 20  ative Tcl shell 
1d7f0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76  appears to be av
1d800 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
1d810 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
1d820 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 53 68  Constraint tclSh
1d830 65 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ell....        #
1d840 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d850 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 76  : Now, add the v
1d860 65 72 73 69 6f 6e 20 73 70 65 63 69 66 69 63 20  ersion specific 
1d870 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e  test constraint.
1d880 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d890 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1d8a0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
1d8b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 63  ..            tc
1d8c0 6c 53 68 65 6c 6c 20 5b 73 74 72 69 6e 67 20 6d  lShell [string m
1d8d0 61 70 20 5b 6c 69 73 74 20 2e 20 22 22 5d 20 24  ap [list . ""] $
1d8e0 76 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  version]]....   
1d8f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d900 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1d910 24 70 72 65 66 69 78 20 22 79 65 73 20 28 22 20  $prefix "yes (" 
1d920 24 76 65 72 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d  $version ")\n"].
1d930 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1d940 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1d950 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d960 72 67 73 20 24 70 72 65 66 69 78 20 6e 6f 5c 6e  rgs $prefix no\n
1d970 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
1d980 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1d990 68 65 63 6b 46 6f 72 54 6b 50 61 63 6b 61 67 65  heckForTkPackage
1d9a0 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
1d9b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1d9c0 20 48 41 43 4b 3a 20 57 65 20 64 6f 20 6e 6f 74   HACK: We do not
1d9d0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1d9e0 54 6b 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  Tk version retur
1d9f0 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 0d 0a 20  ned from this.. 
1da00 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 6f       #       pro
1da10 63 65 64 75 72 65 2c 20 77 65 20 6f 6e 6c 79 20  cedure, we only 
1da20 63 61 72 65 20 69 66 20 69 74 20 72 65 74 75 72  care if it retur
1da30 6e 73 20 22 65 72 72 6f 72 22 20 62 65 63 61 75  ns "error" becau
1da40 73 65 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23  se that..      #
1da50 20 20 20 20 20 20 20 77 6f 75 6c 64 20 69 6e 64         would ind
1da60 69 63 61 74 65 20 61 6e 20 65 72 72 6f 72 20 77  icate an error w
1da70 61 73 20 63 61 75 67 68 74 20 64 75 72 69 6e 67  as caught during
1da80 20 5b 65 78 65 63 5d 20 28 69 2e 65 2e 20 74 68   [exec] (i.e. th
1da90 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1daa0 20 6e 61 74 69 76 65 20 54 63 6c 20 73 68 65 6c   native Tcl shel
1dab0 6c 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 65  l could not be e
1dac0 78 65 63 75 74 65 64 29 2e 0d 0a 20 20 20 20 20  xecuted)...     
1dad0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70 72   #..      set pr
1dae0 65 66 69 78 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  efix "---- check
1daf0 69 6e 67 20 66 6f 72 20 54 6b 20 70 61 63 6b 61  ing for Tk packa
1db00 67 65 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d  ge version... ".
1db10 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
1db20 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c 5d 20 26  nExecTclShell] &
1db30 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1db40 63 61 74 63 68 20 7b 67 65 74 54 6b 56 65 72 73  catch {getTkVers
1db50 69 6f 6e 46 6f 72 54 63 6c 53 68 65 6c 6c 7d 20  ionForTclShell} 
1db60 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26  version] == 0 &&
1db70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 76   \..          $v
1db80 65 72 73 69 6f 6e 20 6e 65 20 22 65 72 72 6f 72  ersion ne "error
1db90 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
1dba0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1dbb0 4e 4f 54 45 3a 20 59 65 73 2c 20 61 20 6e 61 74  NOTE: Yes, a nat
1dbc0 69 76 65 20 54 6b 20 70 61 63 6b 61 67 65 20 61  ive Tk package a
1dbd0 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61  ppears to be ava
1dbe0 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
1dbf0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
1dc00 6f 6e 73 74 72 61 69 6e 74 20 74 6b 50 61 63 6b  onstraint tkPack
1dc10 61 67 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  age....        t
1dc20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1dc30 70 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69  ppendArgs $prefi
1dc40 78 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  x "yes (" $versi
1dc50 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  on ")\n"]..     
1dc60 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1dc70 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1dc80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  l [appendArgs $p
1dc90 72 65 66 69 78 20 6e 6f 5c 6e 5d 0d 0a 20 20 20  refix no\n]..   
1dca0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1dcb0 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
1dcc0 72 50 6f 77 65 72 53 68 65 6c 6c 20 7b 20 63 68  rPowerShell { ch
1dcd0 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
1dce0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1dcf0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1dd00 6f 72 20 50 6f 77 65 72 53 68 65 6c 6c 2e 2e 2e  or PowerShell...
1dd10 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
1dd20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6e       # NOTE: Can
1dd30 20 74 68 65 20 50 6f 77 65 72 53 68 65 6c 6c 20   the PowerShell 
1dd40 61 73 73 65 6d 62 6c 79 20 62 65 20 6c 6f 61 64  assembly be load
1dd50 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed?..      #..  
1dd60 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1dd70 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1dd80 20 72 65 73 6f 6c 76 65 20 53 79 73 74 65 6d 2e   resolve System.
1dd90 4d 61 6e 61 67 65 6d 65 6e 74 2e 41 75 74 6f 6d  Management.Autom
1dda0 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 61  ation..      } a
1ddb0 73 73 65 6d 62 6c 79 5d 20 3d 3d 20 30 7d 20 74  ssembly] == 0} t
1ddc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ddd0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1dde0 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
1ddf0 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61  s that it is ava
1de00 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
1de10 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
1de20 6f 6e 73 74 72 61 69 6e 74 20 70 6f 77 65 72 53  onstraint powerS
1de30 68 65 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  hell....        
1de40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
1de50 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
1de60 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1de70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1de80 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
1de90 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1dea0 68 65 63 6b 46 6f 72 57 69 78 20 7b 20 63 68 61  heckForWix { cha
1deb0 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
1dec0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1ded0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
1dee0 72 20 57 69 58 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  r WiX... "....  
1def0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1df00 4f 54 45 3a 20 50 6c 61 74 66 6f 72 6d 20 6d 75  OTE: Platform mu
1df10 73 74 20 62 65 20 57 69 6e 64 6f 77 73 20 66 6f  st be Windows fo
1df20 72 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  r this constrain
1df30 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  t to..      #   
1df40 20 20 20 20 65 76 65 6e 20 62 65 20 63 68 65 63      even be chec
1df50 6b 65 64 20 28 69 2e 65 2e 20 77 65 20 72 65 71  ked (i.e. we req
1df60 75 69 72 65 20 74 68 65 20 72 65 67 69 73 74 72  uire the registr
1df70 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  y)...      #..  
1df80 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f      if {[isWindo
1df90 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ws]} then {..   
1dfa0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1dfb0 23 20 4e 4f 54 45 3a 20 49 6e 64 69 63 61 74 65  # NOTE: Indicate
1dfc0 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
1dfd0 74 20 66 6f 75 6e 64 20 69 74 20 79 65 74 2e 0d  t found it yet..
1dfe0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1dff0 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
1e000 79 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y ""....        
1e010 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1e020 45 3a 20 48 61 76 65 20 77 65 20 6e 6f 74 20 66  E: Have we not f
1e030 6f 75 6e 64 20 74 68 65 20 64 69 72 65 63 74 6f  ound the directo
1e040 72 79 20 79 65 74 3f 0d 0a 20 20 20 20 20 20 20  ry yet?..       
1e050 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
1e060 20 20 20 20 59 65 73 2c 20 74 68 69 73 20 69 73      Yes, this is
1e070 20 73 6f 6d 65 77 68 61 74 20 72 65 64 75 6e 64   somewhat redund
1e080 61 6e 74 20 62 65 63 61 75 73 65 20 77 65 20 6a  ant because we j
1e090 75 73 74 20 73 65 74 0d 0a 20 20 20 20 20 20 20  ust set..       
1e0a0 20 23 20 20 20 20 20 20 20 74 68 65 20 64 69 72   #       the dir
1e0b0 65 63 74 6f 72 79 20 74 6f 20 61 6e 20 65 6d 70  ectory to an emp
1e0c0 74 79 20 73 74 72 69 6e 67 20 28 61 62 6f 76 65  ty string (above
1e0d0 29 3b 20 68 6f 77 65 76 65 72 2c 0d 0a 20 20 20  ); however,..   
1e0e0 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 69       #       mai
1e0f0 6e 74 61 69 6e 69 6e 67 20 61 20 75 6e 69 66 6f  ntaining a unifo
1e100 72 6d 20 70 61 74 74 65 72 6e 20 69 73 20 6d 6f  rm pattern is mo
1e110 72 65 20 69 6d 70 6f 72 74 61 6e 74 2e 0d 0a 20  re important... 
1e120 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e130 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1e140 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d  ngth $directory]
1e150 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1e160 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1e170 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1e180 65 63 6b 20 66 6f 72 20 74 68 65 20 57 49 58 20  eck for the WIX 
1e190 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1e1a0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
1e1b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1e1c0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1e1d0 3a 65 6e 76 28 57 49 58 29 5d 7d 20 74 68 65 6e  :env(WIX)]} then
1e1e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e1f0 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66  set directory [f
1e200 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 73  ile normalize [s
1e210 74 72 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20  tring trimright 
1e220 24 3a 3a 65 6e 76 28 57 49 58 29 5d 5d 0d 0a 0d  $::env(WIX)]]...
1e230 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1e240 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1e250 24 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  $directory] > 0}
1e260 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e270 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e280 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1e290 57 65 20 6e 65 65 64 20 74 68 65 20 64 69 72 65  We need the dire
1e2a0 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1e2b0 20 74 68 65 20 62 69 6e 61 72 69 65 73 2e 0d 0a   the binaries...
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1e2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1e2e0 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69  et directory [fi
1e2f0 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
1e300 72 79 20 62 69 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ry bin]....     
1e310 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1e320 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1e330 3a 20 44 6f 65 73 20 74 68 65 20 64 69 72 65 63  : Does the direc
1e340 74 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 65 78  tory actually ex
1e350 69 73 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ist?..          
1e360 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e370 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 69       if {[file i
1e380 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
1e390 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1e3c0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
1e3d0 69 6c 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ile name of the 
1e3e0 70 72 69 6d 61 72 79 20 57 69 58 20 61 73 73 65  primary WiX asse
1e3f0 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mbly...         
1e400 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e410 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
1e420 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
1e430 6e 20 24 64 69 72 65 63 74 6f 72 79 20 77 69 78  n $directory wix
1e440 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .dll]....       
1e450 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1e460 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1e470 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 6b 6e  TE: We do not kn
1e480 6f 77 20 74 68 65 20 66 69 6c 65 20 76 65 72 73  ow the file vers
1e490 69 6f 6e 20 79 65 74 2e 0d 0a 20 20 20 20 20 20  ion yet...      
1e4a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1e4c0 20 76 65 72 73 69 6f 6e 20 22 22 0d 0a 0d 0a 20   version "".... 
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e4e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e4f0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1e500 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 76  t to query the v
1e510 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  ersion of the fi
1e520 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
1e530 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e540 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1e550 63 68 20 7b 66 69 6c 65 20 76 65 72 73 69 6f 6e  ch {file version
1e560 20 24 66 69 6c 65 4e 61 6d 65 7d 20 76 65 72 73   $fileName} vers
1e570 69 6f 6e 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a  ion] == 0 && \..
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1e5a0 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3e 20 30  th $version] > 0
1e5b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 23 20 4e 4f 54 45 3a 20 49 6e 64 69 63 61 74   # NOTE: Indicat
1e5f0 65 20 77 68 65 72 65 20 77 65 20 66 6f 75 6e 64  e where we found
1e600 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1e620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e630 20 20 20 73 65 74 20 77 68 65 72 65 20 65 6e 76     set where env
1e640 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20  ironment..      
1e650 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1e660 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e680 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1e690 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
1e6a0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73   not exist or is
1e6b0 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0d 0a 20   not properly.. 
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
1e6e0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
1e6f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e700 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1e710 64 69 72 65 63 74 6f 72 79 20 22 22 0d 0a 20 20  directory ""..  
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1e730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1e740 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1e750 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1e760 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1e770 54 45 3a 20 54 68 65 20 64 69 72 65 63 74 6f 72  TE: The director
1e780 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  y does not exist
1e790 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1e7a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e7b0 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
1e7c0 6f 72 79 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ory ""..        
1e7d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e7e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e7f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1e800 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e810 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 48 61 76       # NOTE: Hav
1e820 65 20 77 65 20 6e 6f 74 20 66 6f 75 6e 64 20 74  e we not found t
1e830 68 65 20 64 69 72 65 63 74 6f 72 79 20 79 65 74  he directory yet
1e840 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
1e850 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1e860 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74  g length $direct
1e870 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
1e880 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1e890 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1e8a0 3a 20 52 65 67 69 73 74 72 79 20 68 69 76 65 20  : Registry hive 
1e8b0 77 68 65 72 65 20 57 69 58 20 69 6e 73 74 61 6c  where WiX instal
1e8c0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
1e8d0 20 73 74 6f 72 65 64 2e 20 20 4d 61 6b 65 0d 0a   stored.  Make..
1e8e0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1e8f0 20 20 73 75 72 65 20 74 6f 20 6c 6f 6f 6b 20 69    sure to look i
1e900 6e 20 74 68 65 20 57 6f 57 36 34 20 72 65 67 69  n the WoW64 regi
1e910 73 74 72 79 20 62 65 63 61 75 73 65 20 57 69 58  stry because WiX
1e920 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20   is currently.. 
1e930 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e940 20 61 6c 77 61 79 73 20 69 6e 73 74 61 6c 6c 65   always installe
1e950 64 20 61 73 20 61 20 33 32 2d 62 69 74 20 61 70  d as a 32-bit ap
1e960 70 6c 69 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20  plication...    
1e970 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e980 20 20 20 73 65 74 20 6b 65 79 20 5b 61 70 70 65     set key [appe
1e990 6e 64 41 72 67 73 20 48 4b 45 59 5f 4c 4f 43 41  ndArgs HKEY_LOCA
1e9a0 4c 5f 4d 41 43 48 49 4e 45 5c 5c 20 5c 0d 0a 20  L_MACHINE\\ \.. 
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
1e9c0 74 53 6f 66 74 77 61 72 65 52 65 67 69 73 74 72  tSoftwareRegistr
1e9d0 79 4b 65 79 20 74 72 75 65 5d 20 7b 5c 4d 69 63  yKey true] {\Mic
1e9e0 72 6f 73 6f 66 74 5c 57 69 6e 64 6f 77 73 20 49  rosoft\Windows I
1e9f0 6e 73 74 61 6c 6c 65 72 20 58 4d 4c 7d 5d 0d 0a  nstaller XML}]..
1ea00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ea10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ea20 20 54 68 65 20 76 65 72 73 69 6f 6e 73 20 6f 66   The versions of
1ea30 20 57 69 58 20 74 68 61 74 20 77 65 20 73 75 70   WiX that we sup
1ea40 70 6f 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  port...         
1ea50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1ea60 74 20 76 65 72 73 69 6f 6e 73 20 5b 6c 69 73 74  t versions [list
1ea70 20 33 2e 31 31 20 33 2e 31 30 20 33 2e 39 20 33   3.11 3.10 3.9 3
1ea80 2e 38 20 33 2e 37 20 33 2e 36 20 33 2e 35 20 33  .8 3.7 3.6 3.5 3
1ea90 2e 30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  .0]....         
1eaa0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1eab0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 65 61 63 68  NOTE: Check each
1eac0 20 76 65 72 73 69 6f 6e 2c 20 73 74 6f 70 70 69   version, stoppi
1ead0 6e 67 20 77 68 65 6e 20 6f 6e 65 20 69 73 20 66  ng when one is f
1eae0 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ound...         
1eaf0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
1eb00 72 65 61 63 68 20 76 65 72 73 69 6f 6e 20 24 76  reach version $v
1eb10 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20  ersions {..     
1eb20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1eb30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
1eb40 74 65 6d 70 74 20 74 6f 20 66 65 74 63 68 20 74  tempt to fetch t
1eb50 68 65 20 57 69 58 20 69 6e 73 74 61 6c 6c 20 64  he WiX install d
1eb60 69 72 65 63 74 6f 72 79 20 76 61 6c 75 65 20 66  irectory value f
1eb70 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20 20 20 20  rom the..       
1eb80 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 67       #       reg
1eb90 69 73 74 72 79 2c 20 72 65 6d 6f 76 69 6e 67 20  istry, removing 
1eba0 74 68 65 20 74 72 61 69 6c 69 6e 67 20 62 61 63  the trailing bac
1ebb0 6b 73 6c 61 73 68 2c 20 69 66 20 61 6e 79 2e 20  kslash, if any. 
1ebc0 20 44 6f 65 73 0d 0a 20 20 20 20 20 20 20 20 20   Does..         
1ebd0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
1ebe0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 6c 6f  irectory name lo
1ebf0 6f 6b 20 76 61 6c 69 64 20 61 6e 64 20 64 6f 65  ok valid and doe
1ec00 73 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78  s it actually ex
1ec10 69 73 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ist?..          
1ec20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1ec30 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
1ec40 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 73 74 72  e normalize [str
1ec50 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20 5b 6f  ing trimright [o
1ec60 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a  bject invoke \..
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 20 20 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69      Microsoft.Wi
1ec90 6e 33 32 2e 52 65 67 69 73 74 72 79 20 47 65 74  n32.Registry Get
1eca0 56 61 6c 75 65 20 5b 61 70 70 65 6e 64 41 72 67  Value [appendArg
1ecb0 73 20 24 6b 65 79 20 5c 5c 20 5c 0d 0a 20 20 20  s $key \\ \..   
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 24 76 65 72 73 69 6f 6e 5d 20 49 6e 73 74 61   $version] Insta
1ece0 6c 6c 52 6f 6f 74 20 6e 75 6c 6c 5d 20 5c 5c 5d  llRoot null] \\]
1ecf0 7d 20 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20  } directory] == 
1ed00 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1ed20 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
1ed30 63 74 6f 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d  ctory] > 0 && \.
1ed40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed50 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f   [file isdirecto
1ed60 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ry $directory]} 
1ed70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ed80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ed90 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
1eda0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 66 20  he file name of 
1edb0 74 68 65 20 70 72 69 6d 61 72 79 20 57 69 58 20  the primary WiX 
1edc0 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
1edd0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ede0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
1edf0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
1ee00 6e 20 24 64 69 72 65 63 74 6f 72 79 20 77 69 78  n $directory wix
1ee10 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .dll]....       
1ee20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ee30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ee40 57 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 74  We do not know t
1ee50 68 65 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  he file version 
1ee60 79 65 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  yet...          
1ee70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1ee80 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
1ee90 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   ""....         
1eea0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1eeb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
1eec0 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74  tempt to query t
1eed0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  he version of th
1eee0 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
1eef0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ef00 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1ef10 63 68 20 7b 66 69 6c 65 20 76 65 72 73 69 6f 6e  ch {file version
1ef20 20 24 66 69 6c 65 4e 61 6d 65 7d 20 76 65 72 73   $fileName} vers
1ef30 69 6f 6e 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a  ion] == 0 && \..
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1ef60 20 24 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20   $version] > 0} 
1ef70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ef80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ef90 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1efa0 45 3a 20 49 6e 64 69 63 61 74 65 20 77 68 65 72  E: Indicate wher
1efb0 65 20 77 65 20 66 6f 75 6e 64 20 74 68 65 20 66  e we found the f
1efc0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
1efd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1efe0 20 20 20 20 20 20 20 20 20 73 65 74 20 77 68 65           set whe
1eff0 72 65 20 72 65 67 69 73 74 72 79 0d 0a 0d 0a 20  re registry.... 
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1f010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f020 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 6f 75    # NOTE: We fou
1f030 6e 64 20 69 74 2c 20 62 61 69 6c 20 6f 75 74 20  nd it, bail out 
1f040 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
1f050 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f060 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a           break..
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
1f080 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f090 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1f0b0 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
1f0c0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73   not exist or is
1f0d0 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0d 0a 20   not properly.. 
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1f0f0 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 65 64         versioned
1f100 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1f110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f120 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
1f130 6f 72 79 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ory ""..        
1f140 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f150 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f160 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1f170 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f180 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64       # NOTE: Did
1f190 20 77 65 20 66 69 6e 64 20 74 68 65 20 64 69 72   we find the dir
1f1a0 65 63 74 6f 72 79 3f 0d 0a 20 20 20 20 20 20 20  ectory?..       
1f1b0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1f1c0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f1d0 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 20 26  directory] > 0 &
1f1e0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1f1f0 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f   [file isdirecto
1f200 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ry $directory]} 
1f210 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f220 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1f230 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61   NOTE: Yes, it a
1f240 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 69  ppears that it i
1f250 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
1f260 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f270 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1f280 6e 74 20 77 69 78 0d 0a 0d 0a 20 20 20 20 20 20  nt wix....      
1f290 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1f2a0 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
1f2b0 65 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  e directory for 
1f2c0 6c 61 74 65 72 20 75 73 61 67 65 20 62 79 0d 0a  later usage by..
1f2d0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1f2e0 20 20 74 68 65 20 74 65 73 74 20 69 74 73 65 6c    the test itsel
1f2f0 66 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  f...          #.
1f300 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1f310 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1f320 6f 28 73 65 74 57 69 78 29 5d 7d 20 74 68 65 6e  o(setWix)]} then
1f330 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f340 73 65 74 20 3a 3a 74 65 73 74 5f 77 69 78 20 24  set ::test_wix $
1f350 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
1f360 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1f380 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
1f390 65 72 65 20 77 65 20 66 6f 75 6e 64 20 69 74 2e  ere we found it.
1f3a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1f3b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1f3c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1f3d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1f3e0 20 20 20 20 20 22 79 65 73 20 28 22 20 24 76 65       "yes (" $ve
1f3f0 72 73 69 6f 6e 20 22 2c 20 76 69 61 20 22 20 24  rsion ", via " $
1f400 77 68 65 72 65 20 22 2c 20 5c 22 22 20 5c 0d 0a  where ", \"" \..
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
1f420 69 72 65 63 74 6f 72 79 20 22 5c 22 29 5c 6e 22  irectory "\")\n"
1f430 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ]....          #
1f440 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1f450 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
1f460 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
1f470 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1f480 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f490 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1f4a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
1f4b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1f4c0 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
1f4d0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 61   proc checkForTa
1f4e0 72 67 65 74 46 72 61 6d 65 77 6f 72 6b 20 7b 20  rgetFramework { 
1f4f0 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
1f500 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f510 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
1f520 20 66 6f 72 20 74 61 72 67 65 74 20 66 72 61 6d   for target fram
1f530 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ework... "....  
1f540 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1f550 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61  ists ::eagle_pla
1f560 74 66 6f 72 6d 28 74 61 72 67 65 74 46 72 61 6d  tform(targetFram
1f570 65 77 6f 72 6b 29 5d 20 26 26 20 5c 0d 0a 20 20  ework)] && \..  
1f580 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1f590 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c 65 5f  length $::eagle_
1f5a0 70 6c 61 74 66 6f 72 6d 28 74 61 72 67 65 74 46  platform(targetF
1f5b0 72 61 6d 65 77 6f 72 6b 29 5d 20 3e 20 30 7d 20  ramework)] > 0} 
1f5c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f5d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1f5e0 45 3a 20 4e 6f 77 20 63 72 65 61 74 65 20 61 20  E: Now create a 
1f5f0 73 74 72 69 6e 67 20 66 6f 72 20 75 73 65 20 69  string for use i
1f600 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1f610 20 6e 61 6d 65 20 28 72 65 6d 6f 76 65 0d 0a 20   name (remove.. 
1f620 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1f630 68 65 20 69 6e 76 61 6c 69 64 20 63 68 61 72 61  he invalid chara
1f640 63 74 65 72 73 29 2e 20 20 46 6f 72 20 65 78 61  cters).  For exa
1f650 6d 70 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20 23  mple:..        #
1f660 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f670 20 20 22 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b    ".NETFramework
1f680 2c 56 65 72 73 69 6f 6e 3d 76 32 2e 30 22 20 2d  ,Version=v2.0" -
1f690 2d 3e 20 22 4e 45 54 46 72 61 6d 65 77 6f 72 6b  -> "NETFramework
1f6a0 2e 56 65 72 73 69 6f 6e 2e 76 32 2e 30 22 0d 0a  .Version.v2.0"..
1f6b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f6c0 20 20 20 73 65 74 20 74 61 72 67 65 74 46 72 61     set targetFra
1f6d0 6d 65 77 6f 72 6b 20 5b 73 74 72 69 6e 67 20 74  mework [string t
1f6e0 72 69 6d 6c 65 66 74 20 5b 73 74 72 69 6e 67 20  rimleft [string 
1f6f0 6d 61 70 20 5b 6c 69 73 74 20 2c 20 2e 20 3d 20  map [list , . = 
1f700 2e 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  .] \..          
1f710 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66    $::eagle_platf
1f720 6f 72 6d 28 74 61 72 67 65 74 46 72 61 6d 65 77  orm(targetFramew
1f730 6f 72 6b 29 5d 20 2e 5d 0d 0a 0d 0a 20 20 20 20  ork)] .]....    
1f740 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f750 20 4e 4f 54 45 3a 20 4b 65 65 70 20 74 72 61 63   NOTE: Keep trac
1f760 6b 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  k of the specifi
1f770 63 20 74 61 72 67 65 74 20 66 72 61 6d 65 77 6f  c target framewo
1f780 72 6b 20 66 6f 72 20 75 73 61 67 65 20 69 6e 20  rk for usage in 
1f790 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
1f7a0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
1f7b0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1f7c0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1f7d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1f7e0 20 74 61 72 67 65 74 46 72 61 6d 65 77 6f 72 6b   targetFramework
1f7f0 2e 20 24 74 61 72 67 65 74 46 72 61 6d 65 77 6f  . $targetFramewo
1f800 72 6b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  rk]....        t
1f810 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1f820 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
1f830 22 20 24 74 61 72 67 65 74 46 72 61 6d 65 77 6f  " $targetFramewo
1f840 72 6b 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  rk ")\n"]..     
1f850 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f860 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f870 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
1f880 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1f890 72 6f 63 20 63 68 65 63 6b 46 6f 72 4e 61 74 69  roc checkForNati
1f8a0 76 65 55 74 69 6c 69 74 79 20 7b 20 63 68 61 6e  veUtility { chan
1f8b0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
1f8c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1f8d0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1f8e0 20 6e 61 74 69 76 65 20 75 74 69 6c 69 74 79 2e   native utility.
1f8f0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
1f900 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1f910 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
1f920 6e 61 74 69 76 65 55 74 69 6c 69 74 79 29 5d 20  nativeUtility)] 
1f930 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f940 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f950 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
1f960 28 6e 61 74 69 76 65 55 74 69 6c 69 74 79 29 5d  (nativeUtility)]
1f970 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1f980 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b        set name [
1f990 6c 69 6e 64 65 78 20 24 3a 3a 65 61 67 6c 65 5f  lindex $::eagle_
1f9a0 70 6c 61 74 66 6f 72 6d 28 6e 61 74 69 76 65 55  platform(nativeU
1f9b0 74 69 6c 69 74 79 29 20 30 5d 0d 0a 0d 0a 20 20  tility) 0]....  
1f9c0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1f9d0 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20  g length $name] 
1f9e0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1f9f0 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
1fa00 6f 6e 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 65 61  on [lindex $::ea
1fa10 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 6e 61 74  gle_platform(nat
1fa20 69 76 65 55 74 69 6c 69 74 79 29 20 31 5d 0d 0a  iveUtility) 1]..
1fa30 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1fa40 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1fa50 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  version] > 0} th
1fa60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1fa70 20 20 73 65 74 20 6e 61 74 69 76 65 55 74 69 6c    set nativeUtil
1fa80 69 74 79 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ity [appendArgs 
1fa90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1faa0 20 20 20 24 6e 61 6d 65 20 2e 20 5b 67 65 74 4d     $name . [getM
1fab0 61 6a 6f 72 4d 69 6e 6f 72 56 65 72 73 69 6f 6e  ajorMinorVersion
1fac0 20 24 76 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20   $version]]..   
1fad0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1fae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
1faf0 20 6e 61 74 69 76 65 55 74 69 6c 69 74 79 20 24   nativeUtility $
1fb00 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  name..          
1fb10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
1fb20 66 20 7b 24 6e 61 74 69 76 65 55 74 69 6c 69 74  f {$nativeUtilit
1fb30 79 20 6e 69 20 22 64 69 73 61 62 6c 65 64 20 75  y ni "disabled u
1fb40 6e 61 76 61 69 6c 61 62 6c 65 22 7d 20 74 68 65  navailable"} the
1fb50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fb60 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e   addConstraint n
1fb70 61 74 69 76 65 55 74 69 6c 69 74 79 0d 0a 20 20  ativeUtility..  
1fb80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1fb90 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1fba0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1fbb0 20 6e 61 74 69 76 65 55 74 69 6c 69 74 79 2e 20   nativeUtility. 
1fbc0 24 6e 61 74 69 76 65 55 74 69 6c 69 74 79 5d 0d  $nativeUtility].
1fbd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
1fbe0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1fbf0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1fc00 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c           $::eagl
1fc10 65 5f 70 6c 61 74 66 6f 72 6d 28 6e 61 74 69 76  e_platform(nativ
1fc20 65 55 74 69 6c 69 74 79 29 20 22 20 28 22 20 24  eUtility) " (" $
1fc30 6e 61 74 69 76 65 55 74 69 6c 69 74 79 20 22 29  nativeUtility ")
1fc40 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  \n"]..        } 
1fc50 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1fc60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1fc70 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
1fc80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
1fc90 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1fca0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
1fcb0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
1fcc0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1fcd0 63 68 65 63 6b 46 6f 72 4e 65 74 46 78 32 30 53  checkForNetFx20S
1fce0 65 72 76 69 63 65 50 61 63 6b 20 7b 20 63 68 61  ervicePack { cha
1fcf0 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
1fd00 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1fd10 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
1fd20 72 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  r .NET Framework
1fd30 20 32 2e 30 20 53 65 72 76 69 63 65 20 50 61 63   2.0 Service Pac
1fd40 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
1fd50 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1fd60 20 50 6c 61 74 66 6f 72 6d 20 6d 75 73 74 20 62   Platform must b
1fd70 65 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 74 68  e Windows for th
1fd80 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f  is constraint to
1fd90 20 65 76 65 6e 20 62 65 0d 0a 20 20 20 20 20 20   even be..      
1fda0 23 20 20 20 20 20 20 20 63 68 65 63 6b 65 64 20  #       checked 
1fdb0 28 69 2e 65 2e 20 77 65 20 72 65 71 75 69 72 65  (i.e. we require
1fdc0 20 74 68 65 20 72 65 67 69 73 74 72 79 29 2e 0d   the registry)..
1fdd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1fde0 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d  if {[isWindows]}
1fdf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fe00 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1fe10 54 45 3a 20 52 65 67 69 73 74 72 79 20 68 69 76  TE: Registry hiv
1fe20 65 20 77 68 65 72 65 20 74 68 65 20 2e 4e 45 54  e where the .NET
1fe30 20 46 72 61 6d 65 77 6f 72 6b 20 32 2e 30 20 73   Framework 2.0 s
1fe40 65 74 75 70 20 61 6e 64 0d 0a 20 20 20 20 20 20  etup and..      
1fe50 20 20 23 20 20 20 20 20 20 20 73 65 72 76 69 63    #       servic
1fe60 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1fe70 69 73 20 73 74 6f 72 65 64 2e 20 20 4e 6f 20 6e  is stored.  No n
1fe80 65 65 64 20 74 6f 20 6c 6f 6f 6b 20 69 6e 0d 0a  eed to look in..
1fe90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1fea0 74 68 65 20 57 6f 57 36 34 20 72 65 67 69 73 74  the WoW64 regist
1feb0 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 2e  ry because the .
1fec0 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 68  NET Framework sh
1fed0 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20  ould..        # 
1fee0 20 20 20 20 20 20 62 65 20 69 6e 73 74 61 6c 6c        be install
1fef0 65 64 20 6e 61 74 69 76 65 6c 79 20 61 73 20 77  ed natively as w
1ff00 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ell...        #.
1ff10 0a 20 20 20 20 20 20 20 20 73 65 74 20 6b 65 79  .        set key
1ff20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 48 4b 45   [appendArgs HKE
1ff30 59 5f 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e 45 5c  Y_LOCAL_MACHINE\
1ff40 5c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \ \..           
1ff50 20 7b 53 6f 66 74 77 61 72 65 5c 4d 69 63 72 6f   {Software\Micro
1ff60 73 6f 66 74 5c 4e 45 54 20 46 72 61 6d 65 77 6f  soft\NET Framewo
1ff70 72 6b 20 53 65 74 75 70 5c 4e 44 50 5c 76 32 2e  rk Setup\NDP\v2.
1ff80 30 2e 35 30 37 32 37 7d 5d 0d 0a 0d 0a 20 20 20  0.50727}]....   
1ff90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ffa0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1ffb0 74 6f 20 66 65 74 63 68 20 74 68 65 20 2e 4e 45  to fetch the .NE
1ffc0 54 20 46 72 61 6d 65 77 6f 72 6b 20 32 2e 30 20  T Framework 2.0 
1ffd0 22 53 50 22 20 76 61 6c 75 65 20 66 72 6f 6d 20  "SP" value from 
1ffe0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
1fff0 20 20 20 20 20 73 65 72 76 69 63 69 6e 67 20 72       servicing r
20000 65 67 69 73 74 72 79 20 68 69 76 65 2e 20 20 49  egistry hive.  I
20010 66 20 74 68 69 73 20 76 61 6c 75 65 20 64 6f 65  f this value doe
20020 73 20 6e 6f 74 20 65 78 69 73 74 20 2d 4f 52 2d  s not exist -OR-
20030 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
20040 20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31    is less than 1
20050 2c 20 74 68 65 6e 20 6e 6f 20 2e 4e 45 54 20 46  , then no .NET F
20060 72 61 6d 65 77 6f 72 6b 20 32 2e 30 20 73 65 72  ramework 2.0 ser
20070 76 69 63 65 20 70 61 63 6b 20 69 73 0d 0a 20 20  vice pack is..  
20080 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
20090 73 74 61 6c 6c 65 64 2e 20 20 49 66 20 74 68 69  stalled.  If thi
200a0 73 20 72 61 69 73 65 73 20 61 20 73 63 72 69 70  s raises a scrip
200b0 74 20 65 72 72 6f 72 2c 20 74 68 61 74 20 77 69  t error, that wi
200c0 6c 6c 20 61 6c 6d 6f 73 74 0d 0a 20 20 20 20 20  ll almost..     
200d0 20 20 20 23 20 20 20 20 20 20 20 63 65 72 74 61     #       certa
200e0 69 6e 6c 79 20 63 61 75 73 65 20 74 68 65 20 72  inly cause the r
200f0 65 73 75 6c 74 20 74 6f 20 62 65 20 61 20 6e 6f  esult to be a no
20100 6e 2d 69 6e 74 65 67 65 72 2c 20 74 68 69 73 20  n-integer, this 
20110 66 61 69 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20  failing..       
20120 20 23 20 20 20 20 20 20 20 74 68 65 20 63 68 65   #       the che
20130 63 6b 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20  ck below...     
20140 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 61     #..        ca
20150 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
20160 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 4d   object invoke M
20170 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33 32 2e 52  icrosoft.Win32.R
20180 65 67 69 73 74 72 79 20 47 65 74 56 61 6c 75 65  egistry GetValue
20190 20 24 6b 65 79 20 53 50 20 6e 75 6c 6c 0d 0a 20   $key SP null.. 
201a0 20 20 20 20 20 20 20 7d 20 73 65 72 76 69 63 65         } service
201b0 50 61 63 6b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Pack....        
201c0 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
201d0 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
201e0 73 65 72 76 69 63 65 50 61 63 6b 5d 7d 20 74 68  servicePack]} th
201f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20200 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
20210 4f 54 45 3a 20 53 65 72 76 69 63 65 20 70 61 63  OTE: Service pac
20220 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 75  ks are always cu
20230 6d 75 6c 61 74 69 76 65 3b 20 74 68 65 72 65 66  mulative; theref
20240 6f 72 65 2c 20 61 64 64 20 74 65 73 74 0d 0a 20  ore, add test.. 
20250 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
20260 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
20270 20 61 6c 6c 20 73 65 72 76 69 63 65 20 70 61 63   all service pac
20280 6b 20 6c 65 76 65 6c 73 20 75 70 20 74 6f 20 74  k levels up to t
20290 68 65 20 6f 6e 65 20 74 68 61 74 0d 0a 20 20 20  he one that..   
202a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
202b0 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 73 74 61  s actually insta
202c0 6c 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  lled...         
202d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
202e0 72 20 7b 73 65 74 20 6c 65 76 65 6c 20 30 7d 20  r {set level 0} 
202f0 7b 24 6c 65 76 65 6c 20 3c 3d 20 24 73 65 72 76  {$level <= $serv
20300 69 63 65 50 61 63 6b 7d 20 7b 69 6e 63 72 20 6c  icePack} {incr l
20310 65 76 65 6c 7d 20 7b 0d 0a 20 20 20 20 20 20 20  evel} {..       
20320 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
20330 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64  nt [appendArgs d
20340 6f 74 4e 65 74 32 30 53 70 20 24 6c 65 76 65 6c  otNet20Sp $level
20350 20 4f 72 48 69 67 68 65 72 5d 0d 0a 20 20 20 20   OrHigher]..    
20360 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20370 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20380 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 61    # NOTE: Also a
20390 64 64 20 74 68 65 20 22 65 78 61 63 74 22 20 73  dd the "exact" s
203a0 65 72 76 69 63 65 20 70 61 63 6b 20 74 65 73 74  ervice pack test
203b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 76 65 6e   constraint even
203c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
203d0 20 20 20 20 74 68 6f 75 67 68 20 69 74 20 73 68      though it sh
203e0 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 6e 65 76 65  ould almost neve
203f0 72 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  r be used...    
20400 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20410 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
20420 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 6f 74   [appendArgs dot
20430 4e 65 74 32 30 53 70 20 24 73 65 72 76 69 63 65  Net20Sp $service
20440 50 61 63 6b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Pack]....       
20450 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
20460 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
20470 20 22 73 65 72 76 69 63 65 50 61 63 6b 22 20 76   "servicePack" v
20480 61 6c 75 65 20 77 65 20 66 6f 75 6e 64 20 69 6e  alue we found in
20490 20 74 68 65 20 72 65 67 69 73 74 72 79 2e 0d 0a   the registry...
204a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
204b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
204c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
204d0 73 20 22 79 65 73 20 28 22 20 24 73 65 72 76 69  s "yes (" $servi
204e0 63 65 50 61 63 6b 20 22 29 5c 6e 22 5d 0d 0a 0d  cePack ")\n"]...
204f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
20500 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20510 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65  We are done here
20520 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20  , return now... 
20530 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20540 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
20550 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
20560 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
20570 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
20580 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
20590 63 20 67 65 74 46 72 61 6d 65 77 6f 72 6b 53 65  c getFrameworkSe
205a0 74 75 70 34 35 31 56 61 6c 75 65 20 7b 7d 20 7b  tup451Value {} {
205b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
205c0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
205d0 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
205e0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 38 2e 31 2e   on Windows 8.1.
205f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
20600 20 23 20 42 55 47 42 55 47 3a 20 49 73 20 65 78   # BUGBUG: Is ex
20610 61 63 74 20 6d 61 74 63 68 69 6e 67 20 63 6f 72  act matching cor
20620 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20 20 20  rect here?..    
20630 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
20640 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b 69  isWindows] && [i
20650 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
20660 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73  _platform(osVers
20670 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ion)] && \..    
20680 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70 6c 61        $::tcl_pla
20690 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29  tform(osVersion)
206a0 20 3d 3d 20 36 2e 33 7d 20 74 68 65 6e 20 7b 0d   == 6.3} then {.
206b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
206c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
206d0 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69  re running on Wi
206e0 6e 64 6f 77 73 20 38 2e 31 2c 20 72 65 74 75 72  ndows 8.1, retur
206f0 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76 61  n the special va
20700 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
20710 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20720 33 37 38 36 37 35 0d 0a 20 20 20 20 20 20 7d 0d  378675..      }.
20730 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
20740 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
20750 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   not running on 
20760 57 69 6e 64 6f 77 73 20 38 2e 31 2c 20 72 65 74  Windows 8.1, ret
20770 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 76  urn the normal v
20780 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  alue...      #..
20790 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 37 38        return 378
207a0 37 35 38 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  758..    }..... 
207b0 20 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d 65     proc getFrame
207c0 77 6f 72 6b 53 65 74 75 70 34 36 56 61 6c 75 65  workSetup46Value
207d0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
207e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
207f0 65 63 6b 20 69 66 20 77 65 20 61 72 65 20 72 75  eck if we are ru
20800 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73  nning on Windows
20810 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d 0a 20   10 or later... 
20820 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
20830 42 55 47 42 55 47 3a 20 49 73 20 67 72 65 61 74  BUGBUG: Is great
20840 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75 61 6c  er-than-or-equal
20850 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63 6f 72  -to matching cor
20860 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20 20 20  rect here?..    
20870 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
20880 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b 69  isWindows] && [i
20890 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
208a0 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73  _platform(osVers
208b0 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ion)] && \..    
208c0 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70 6c 61        $::tcl_pla
208d0 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29  tform(osVersion)
208e0 20 3e 3d 20 31 30 2e 30 7d 20 74 68 65 6e 20 7b   >= 10.0} then {
208f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20900 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
20910 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  are running on W
20920 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72  indows 10, retur
20930 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76 61  n the special va
20940 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
20950 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20960 33 39 33 32 39 35 0d 0a 20 20 20 20 20 20 7d 0d  393295..      }.
20970 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
20980 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
20990 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   not running on 
209a0 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75  Windows 10, retu
209b0 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 76 61  rn the normal va
209c0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  lue...      #.. 
209d0 20 20 20 20 20 72 65 74 75 72 6e 20 33 39 33 32       return 3932
209e0 39 37 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  97..    }.....  
209f0 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d 65 77    proc getFramew
20a00 6f 72 6b 53 65 74 75 70 34 36 31 56 61 6c 75 65  orkSetup461Value
20a10 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
20a20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
20a30 65 63 6b 20 69 66 20 77 65 20 61 72 65 20 72 75  eck if we are ru
20a40 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73  nning on Windows
20a50 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d 0a 20   10 or later... 
20a60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
20a70 42 55 47 42 55 47 3a 20 49 73 20 67 72 65 61 74  BUGBUG: Is great
20a80 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75 61 6c  er-than-or-equal
20a90 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63 6f 72  -to matching cor
20aa0 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20 20 20  rect here?..    
20ab0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
20ac0 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b 69  isWindows] && [i
20ad0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
20ae0 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73  _platform(osVers
20af0 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ion)] && \..    
20b00 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70 6c 61        $::tcl_pla
20b10 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29  tform(osVersion)
20b20 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c 0d 0a 20   >= 10.0 && \.. 
20b30 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 54 63           [haveTc
20b40 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74 72 61  lPlatformOsExtra
20b50 55 70 64 61 74 65 4e 61 6d 65 20 22 4e 6f 76 65  UpdateName "Nove
20b60 6d 62 65 72 20 55 70 64 61 74 65 22 5d 7d 20 74  mber Update"]} t
20b70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
20b80 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20b90 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  : We are running
20ba0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20   on Windows 10, 
20bb0 72 65 74 75 72 6e 20 74 68 65 20 73 70 65 63 69  return the speci
20bc0 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  al value...     
20bd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
20be0 74 75 72 6e 20 33 39 34 32 35 34 3b 20 23 20 42  turn 394254; # B
20bf0 55 47 42 55 47 3a 20 4e 6f 76 65 6d 62 65 72 20  UGBUG: November 
20c00 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d 0a 20 20  Update only?..  
20c10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
20c20 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
20c30 57 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  We are not runni
20c40 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30  ng on Windows 10
20c50 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 6f 72  , return the nor
20c60 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  mal value...    
20c70 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
20c80 6e 20 33 39 34 32 37 31 0d 0a 20 20 20 20 7d 0d  n 394271..    }.
20c90 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
20ca0 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 36  FrameworkSetup46
20cb0 32 56 61 6c 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  2Value {} {..   
20cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
20cd0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 77 65 20  TE: Check if we 
20ce0 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  are running on W
20cf0 69 6e 64 6f 77 73 20 31 30 20 6f 72 20 6c 61 74  indows 10 or lat
20d00 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
20d10 20 20 20 20 23 20 42 55 47 42 55 47 3a 20 49 73      # BUGBUG: Is
20d20 20 67 72 65 61 74 65 72 2d 74 68 61 6e 2d 6f 72   greater-than-or
20d30 2d 65 71 75 61 6c 2d 74 6f 20 6d 61 74 63 68 69  -equal-to matchi
20d40 6e 67 20 63 6f 72 72 65 63 74 20 68 65 72 65 3f  ng correct here?
20d50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
20d60 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d   if {[isWindows]
20d70 20 26 26 20 5b 69 6e 66 6f 20 65 78 69 73 74 73   && [info exists
20d80 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
20d90 6f 73 56 65 72 73 69 6f 6e 29 5d 20 26 26 20 5c  osVersion)] && \
20da0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74  ..          $::t
20db0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
20dc0 72 73 69 6f 6e 29 20 3e 3d 20 31 30 2e 30 20 26  rsion) >= 10.0 &
20dd0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
20de0 68 61 76 65 54 63 6c 50 6c 61 74 66 6f 72 6d 4f  haveTclPlatformO
20df0 73 45 78 74 72 61 55 70 64 61 74 65 4e 61 6d 65  sExtraUpdateName
20e00 20 22 41 6e 6e 69 76 65 72 73 61 72 79 20 55 70   "Anniversary Up
20e10 64 61 74 65 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a  date"]} then {..
20e20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20e30 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
20e40 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e  e running on Win
20e50 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72 6e 20  dows 10, return 
20e60 74 68 65 20 73 70 65 63 69 61 6c 20 76 61 6c 75  the special valu
20e70 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
20e80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 39         return 39
20e90 34 38 30 32 3b 20 23 20 42 55 47 42 55 47 3a 20  4802; # BUGBUG: 
20ea0 41 6e 6e 69 76 65 72 73 61 72 79 20 55 70 64 61  Anniversary Upda
20eb0 74 65 20 6f 6e 6c 79 3f 0d 0a 20 20 20 20 20 20  te only?..      
20ec0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
20ed0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
20ee0 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f  re not running o
20ef0 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65  n Windows 10, re
20f00 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20  turn the normal 
20f10 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d  value...      #.
20f20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 39  .      return 39
20f30 34 38 30 36 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  4806..    }.....
20f40 20 20 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d      proc getFram
20f50 65 77 6f 72 6b 53 65 74 75 70 34 37 56 61 6c 75  eworkSetup47Valu
20f60 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
20f70 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
20f80 68 65 63 6b 20 69 66 20 77 65 20 61 72 65 20 72  heck if we are r
20f90 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77  unning on Window
20fa0 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d 0a  s 10 or later...
20fb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
20fc0 20 42 55 47 42 55 47 3a 20 49 73 20 67 72 65 61   BUGBUG: Is grea
20fd0 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75 61  ter-than-or-equa
20fe0 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63 6f  l-to matching co
20ff0 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20 20  rrect here?..   
21000 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
21010 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b  [isWindows] && [
21020 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
21030 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72  l_platform(osVer
21040 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20  sion)] && \..   
21050 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70 6c         $::tcl_pl
21060 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e  atform(osVersion
21070 29 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c 0d 0a  ) >= 10.0 && \..
21080 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 54            [haveT
21090 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74 72  clPlatformOsExtr
210a0 61 55 70 64 61 74 65 4e 61 6d 65 20 22 43 72 65  aUpdateName "Cre
210b0 61 74 6f 72 73 20 55 70 64 61 74 65 22 5d 7d 20  ators Update"]} 
210c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
210d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
210e0 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e  E: We are runnin
210f0 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c  g on Windows 10,
21100 20 72 65 74 75 72 6e 20 74 68 65 20 73 70 65 63   return the spec
21110 69 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  ial value...    
21120 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
21130 65 74 75 72 6e 20 34 36 30 37 39 38 3b 20 23 20  eturn 460798; # 
21140 42 55 47 42 55 47 3a 20 43 72 65 61 74 6f 72 73  BUGBUG: Creators
21150 20 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d 0a 20   Update only?.. 
21160 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21170 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
21180 20 57 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   We are not runn
21190 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31  ing on Windows 1
211a0 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 6f  0, return the no
211b0 72 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20  rmal value...   
211c0 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
211d0 72 6e 20 34 36 30 38 30 35 0d 0a 20 20 20 20 7d  rn 460805..    }
211e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
211f0 74 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34  tFrameworkSetup4
21200 37 31 56 61 6c 75 65 20 7b 7d 20 7b 0d 0a 20 20  71Value {} {..  
21210 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
21220 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 77 65  OTE: Check if we
21230 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
21240 57 69 6e 64 6f 77 73 20 31 30 20 6f 72 20 6c 61  Windows 10 or la
21250 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
21260 20 20 20 20 20 23 20 42 55 47 42 55 47 3a 20 49       # BUGBUG: I
21270 73 20 67 72 65 61 74 65 72 2d 74 68 61 6e 2d 6f  s greater-than-o
21280 72 2d 65 71 75 61 6c 2d 74 6f 20 6d 61 74 63 68  r-equal-to match
21290 69 6e 67 20 63 6f 72 72 65 63 74 20 68 65 72 65  ing correct here
212a0 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
212b0 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
212c0 5d 20 26 26 20 5b 69 6e 66 6f 20 65 78 69 73 74  ] && [info exist
212d0 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
212e0 28 6f 73 56 65 72 73 69 6f 6e 29 5d 20 26 26 20  (osVersion)] && 
212f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a 3a  \..          $::
21300 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56  tcl_platform(osV
21310 65 72 73 69 6f 6e 29 20 3e 3d 20 31 30 2e 30 20  ersion) >= 10.0 
21320 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
21330 5b 68 61 76 65 54 63 6c 50 6c 61 74 66 6f 72 6d  [haveTclPlatform
21340 4f 73 45 78 74 72 61 55 70 64 61 74 65 4e 61 6d  OsExtraUpdateNam
21350 65 20 22 46 61 6c 6c 20 43 72 65 61 74 6f 72 73  e "Fall Creators
21360 20 55 70 64 61 74 65 22 5d 7d 20 74 68 65 6e 20   Update"]} then 
21370 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
21380 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
21390 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
213a0 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75  Windows 10, retu
213b0 72 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76  rn the special v
213c0 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
213d0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
213e0 20 34 36 31 33 30 38 3b 20 23 20 42 55 47 42 55   461308; # BUGBU
213f0 47 3a 20 46 61 6c 6c 20 43 72 65 61 74 6f 72 73  G: Fall Creators
21400 20 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d 0a 20   Update only?.. 
21410 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21420 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
21430 20 57 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   We are not runn
21440 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31  ing on Windows 1
21450 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 6f  0, return the no
21460 72 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20  rmal value...   
21470 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
21480 72 6e 20 34 36 31 33 31 30 0d 0a 20 20 20 20 7d  rn 461310..    }
21490 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
214a0 65 63 6b 46 6f 72 4e 65 74 46 78 34 78 20 7b 20  eckForNetFx4x { 
214b0 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
214c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
214d0 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
214e0 20 66 6f 72 20 2e 4e 45 54 20 46 72 61 6d 65 77   for .NET Framew
214f0 6f 72 6b 20 34 2e 78 2e 2e 2e 20 22 0d 0a 0d 0a  ork 4.x... "....
21500 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
21510 20 4e 4f 54 45 3a 20 50 6c 61 74 66 6f 72 6d 20   NOTE: Platform 
21520 6d 75 73 74 20 62 65 20 57 69 6e 64 6f 77 73 20  must be Windows 
21530 66 6f 72 20 74 68 69 73 20 63 6f 6e 73 74 72 61  for this constra
21540 69 6e 74 20 74 6f 20 65 76 65 6e 20 62 65 0d 0a  int to even be..
21550 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68        #       ch
21560 65 63 6b 65 64 20 28 69 2e 65 2e 20 77 65 20 72  ecked (i.e. we r
21570 65 71 75 69 72 65 20 74 68 65 20 72 65 67 69 73  equire the regis
21580 74 72 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  try)...      #..
21590 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
215a0 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
215b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
215c0 20 20 23 20 4e 4f 54 45 3a 20 52 65 67 69 73 74    # NOTE: Regist
215d0 72 79 20 68 69 76 65 20 77 68 65 72 65 20 74 68  ry hive where th
215e0 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
215f0 20 34 2e 30 20 73 65 74 75 70 20 61 6e 64 0d 0a   4.0 setup and..
21600 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21610 73 65 72 76 69 63 69 6e 67 20 69 6e 66 6f 72 6d  servicing inform
21620 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 2e  ation is stored.
21630 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 6f    No need to loo
21640 6b 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  k in..        # 
21650 20 20 20 20 20 20 74 68 65 20 57 6f 57 36 34 20        the WoW64 
21660 72 65 67 69 73 74 72 79 20 62 65 63 61 75 73 65  registry because
21670 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
21680 6f 72 6b 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20  ork should..    
21690 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 69      #       be i
216a0 6e 73 74 61 6c 6c 65 64 20 6e 61 74 69 76 65 6c  nstalled nativel
216b0 79 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20  y as well...    
216c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
216d0 65 74 20 6b 65 79 20 5b 61 70 70 65 6e 64 41 72  et key [appendAr
216e0 67 73 20 48 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41  gs HKEY_LOCAL_MA
216f0 43 48 49 4e 45 5c 5c 20 5c 0d 0a 20 20 20 20 20  CHINE\\ \..     
21700 20 20 20 20 20 20 20 7b 53 6f 66 74 77 61 72 65         {Software
21710 5c 4d 69 63 72 6f 73 6f 66 74 5c 4e 45 54 20 46  \Microsoft\NET F
21720 72 61 6d 65 77 6f 72 6b 20 53 65 74 75 70 5c 4e  ramework Setup\N
21730 44 50 5c 76 34 5c 46 75 6c 6c 7d 5d 0d 0a 0d 0a  DP\v4\Full}]....
21740 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21750 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
21760 70 74 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  pt to fetch the 
21770 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 34  .NET Framework 4
21780 2e 30 20 22 72 65 6c 65 61 73 65 22 20 76 61 6c  .0 "release" val
21790 75 65 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20  ue from..       
217a0 20 23 20 20 20 20 20 20 20 74 68 65 20 73 65 72   #       the ser
217b0 76 69 63 69 6e 67 20 72 65 67 69 73 74 72 79 20  vicing registry 
217c0 68 69 76 65 2e 20 20 49 66 20 74 68 69 73 20 76  hive.  If this v
217d0 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  alue does not ex
217e0 69 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ist..        #  
217f0 20 20 20 20 20 2d 4f 52 2d 20 69 73 20 6c 65 73       -OR- is les
21800 73 20 74 68 61 6e 20 33 37 38 33 38 39 2c 20 74  s than 378389, t
21810 68 65 6e 20 74 68 65 20 2e 4e 45 54 20 46 72 61  hen the .NET Fra
21820 6d 65 77 6f 72 6b 20 34 2e 35 20 69 73 20 6e 6f  mework 4.5 is no
21830 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
21840 20 20 20 69 6e 73 74 61 6c 6c 65 64 2e 20 20 49     installed.  I
21850 66 20 74 68 69 73 20 72 61 69 73 65 73 20 61 20  f this raises a 
21860 73 63 72 69 70 74 20 65 72 72 6f 72 2c 20 74 68  script error, th
21870 61 74 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 0d 0a  at will almost..
21880 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21890 63 65 72 74 61 69 6e 6c 79 20 63 61 75 73 65 20  certainly cause 
218a0 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 62 65  the result to be
218b0 20 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 2c 20   a non-integer, 
218c0 74 68 69 73 20 66 61 69 6c 69 6e 67 0d 0a 20 20  this failing..  
218d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
218e0 65 20 63 68 65 63 6b 20 62 65 6c 6f 77 2e 0d 0a  e check below...
218f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21900 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
21910 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
21920 6f 6b 65 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69  oke Microsoft.Wi
21930 6e 33 32 2e 52 65 67 69 73 74 72 79 20 47 65 74  n32.Registry Get
21940 56 61 6c 75 65 20 24 6b 65 79 20 52 65 6c 65 61  Value $key Relea
21950 73 65 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  se null..       
21960 20 7d 20 72 65 6c 65 61 73 65 0d 0a 0d 0a 20 20   } release....  
21970 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
21980 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74  g is integer -st
21990 72 69 63 74 20 24 72 65 6c 65 61 73 65 5d 20 26  rict $release] &
219a0 26 20 24 72 65 6c 65 61 73 65 20 3e 3d 20 33 37  & $release >= 37
219b0 38 33 38 39 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  8389} then {..  
219c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
219d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
219e0 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61  , it appears tha
219f0 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  t it is availabl
21a00 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
21a10 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
21a20 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34  nstraint dotNet4
21a30 35 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20  5OrHigher....   
21a40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21a50 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
21a60 68 65 20 22 72 65 6c 65 61 73 65 22 20 76 61 6c  he "release" val
21a70 75 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ue is greater th
21a80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 33  an or equal to 3
21a90 37 38 37 35 38 0d 0a 20 20 20 20 20 20 20 20 20  78758..         
21aa0 20 23 20 20 20 20 20 20 20 28 6f 72 20 33 37 38   #       (or 378
21ab0 36 37 35 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  675 for Windows 
21ac0 38 2e 31 29 2c 20 74 68 65 6e 20 74 68 65 20 2e  8.1), then the .
21ad0 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 34 2e  NET Framework 4.
21ae0 35 2e 31 0d 0a 20 20 20 20 20 20 20 20 20 20 23  5.1..          #
21af0 20 20 20 20 20 20 20 69 73 20 69 6e 73 74 61 6c         is instal
21b00 6c 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 69  led.  However, i
21b10 66 20 74 68 65 20 22 72 65 6c 65 61 73 65 22 20  f the "release" 
21b20 76 61 6c 75 65 20 69 73 20 61 6c 73 6f 0d 0a 20  value is also.. 
21b30 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
21b40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
21b50 20 65 71 75 61 6c 20 74 6f 20 33 37 39 38 39 33   equal to 379893
21b60 2c 20 74 68 65 6e 20 74 68 65 20 2e 4e 45 54 20  , then the .NET 
21b70 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20  Framework..     
21b80 20 20 20 20 20 23 20 20 20 20 20 20 20 34 2e 35       #       4.5
21b90 2e 32 20 69 73 20 69 6e 73 74 61 6c 6c 65 64 2c  .2 is installed,
21ba0 20 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e 2d   which is an in-
21bb0 70 6c 61 63 65 20 75 70 67 72 61 64 65 20 74 6f  place upgrade to
21bc0 20 34 2e 35 2e 31 0d 0a 20 20 20 20 20 20 20 20   4.5.1..        
21bd0 20 20 23 20 20 20 20 20 20 20 28 61 6e 64 20 34    #       (and 4
21be0 2e 35 29 2e 20 20 49 66 20 74 68 65 20 22 72 65  .5).  If the "re
21bf0 6c 65 61 73 65 22 20 76 61 6c 75 65 20 69 73 20  lease" value is 
21c00 61 6c 73 6f 20 67 72 65 61 74 65 72 20 74 68 61  also greater tha
21c10 6e 20 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  n or..          
21c20 23 20 20 20 20 20 20 20 65 71 75 61 6c 20 74 6f  #       equal to
21c30 20 33 39 33 32 39 37 20 28 33 39 33 32 39 35 20   393297 (393295 
21c40 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 29 2c 20  on Windows 10), 
21c50 74 68 65 6e 20 74 68 65 20 2e 4e 45 54 0d 0a 20  then the .NET.. 
21c60 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
21c70 20 46 72 61 6d 65 77 6f 72 6b 20 34 2e 36 20 69   Framework 4.6 i
21c80 73 20 69 6e 73 74 61 6c 6c 65 64 2c 20 77 68 69  s installed, whi
21c90 63 68 20 69 73 20 61 6e 20 69 6e 2d 70 6c 61 63  ch is an in-plac
21ca0 65 20 75 70 67 72 61 64 65 0d 0a 20 20 20 20 20  e upgrade..     
21cb0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
21cc0 34 2e 35 2e 78 2e 20 20 53 69 6d 69 6c 61 72 20  4.5.x.  Similar 
21cd0 68 61 6e 64 6c 69 6e 67 20 69 73 20 6e 65 63 65  handling is nece
21ce0 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 2e 4e  ssary for the .N
21cf0 45 54 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ET..          # 
21d00 20 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b 20        Framework 
21d10 34 2e 36 2e 31 2c 20 34 2e 36 2e 32 2c 20 34 2e  4.6.1, 4.6.2, 4.
21d20 37 2c 20 61 6e 64 20 34 2e 37 2e 31 2e 20 20 46  7, and 4.7.1.  F
21d30 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d  or information,.
21d40 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
21d50 20 20 20 73 65 65 3a 0d 0a 20 20 20 20 20 20 20     see:..       
21d60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21d70 23 20 20 20 20 20 20 20 68 74 74 70 73 3a 2f 2f  #       https://
21d80 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  msdn.microsoft.c
21d90 6f 6d 2f 65 6e 2d 75 73 2f 6c 69 62 72 61 72 79  om/en-us/library
21da0 2f 68 68 39 32 35 35 36 38 2e 61 73 70 78 0d 0a  /hh925568.aspx..
21db0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
21dc0 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 6c 65         if {$rele
21dd0 61 73 65 20 3e 3d 20 5b 67 65 74 46 72 61 6d 65  ase >= [getFrame
21de0 77 6f 72 6b 53 65 74 75 70 34 37 31 56 61 6c 75  workSetup471Valu
21df0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
21e00 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
21e10 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 31 4f  raint dotNet451O
21e20 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20  rHigher..       
21e30 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
21e40 6e 74 20 64 6f 74 4e 65 74 34 35 32 4f 72 48 69  nt dotNet452OrHi
21e50 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  gher..          
21e60 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
21e70 64 6f 74 4e 65 74 34 36 4f 72 48 69 67 68 65 72  dotNet46OrHigher
21e80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
21e90 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
21ea0 65 74 34 36 31 4f 72 48 69 67 68 65 72 0d 0a 20  et461OrHigher.. 
21eb0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
21ec0 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34  nstraint dotNet4
21ed0 36 32 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20  62OrHigher..    
21ee0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
21ef0 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 37 4f 72  raint dotNet47Or
21f00 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20  Higher..        
21f10 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
21f20 74 20 64 6f 74 4e 65 74 34 37 31 0d 0a 20 20 20  t dotNet471..   
21f30 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
21f40 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 37 31  traint dotNet471
21f50 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20 20  OrHigher....    
21f60 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
21f70 69 6f 6e 20 34 2e 37 2e 31 0d 0a 20 20 20 20 20  ion 4.7.1..     
21f80 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
21f90 72 65 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74 46  release >= [getF
21fa0 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 37 56  rameworkSetup47V
21fb0 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
21fc0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
21fd0 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34  nstraint dotNet4
21fe0 35 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20  51OrHigher..    
21ff0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
22000 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32 4f  raint dotNet452O
22010 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20  rHigher..       
22020 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
22030 6e 74 20 64 6f 74 4e 65 74 34 36 4f 72 48 69 67  nt dotNet46OrHig
22040 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  her..           
22050 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
22060 6f 74 4e 65 74 34 36 31 4f 72 48 69 67 68 65 72  otNet461OrHigher
22070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
22080 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
22090 65 74 34 36 32 4f 72 48 69 67 68 65 72 0d 0a 20  et462OrHigher.. 
220a0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
220b0 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34  nstraint dotNet4
220c0 37 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  7..            a
220d0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
220e0 4e 65 74 34 37 4f 72 48 69 67 68 65 72 0d 0a 0d  Net47OrHigher...
220f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
22100 20 76 65 72 73 69 6f 6e 20 34 2e 37 0d 0a 20 20   version 4.7..  
22110 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
22120 20 7b 24 72 65 6c 65 61 73 65 20 3e 3d 20 5b 67   {$release >= [g
22130 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70  etFrameworkSetup
22140 34 36 32 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20  462Value]} then 
22150 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
22160 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
22170 4e 65 74 34 35 31 4f 72 48 69 67 68 65 72 0d 0a  Net451OrHigher..
22180 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
22190 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
221a0 34 35 32 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  452OrHigher..   
221b0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
221c0 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 4f  traint dotNet46O
221d0 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20  rHigher..       
221e0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
221f0 6e 74 20 64 6f 74 4e 65 74 34 36 31 4f 72 48 69  nt dotNet461OrHi
22200 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  gher..          
22210 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
22220 64 6f 74 4e 65 74 34 36 32 0d 0a 20 20 20 20 20  dotNet462..     
22230 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
22240 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 32 4f 72  aint dotNet462Or
22250 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20 20 20 20  Higher....      
22260 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
22270 6e 20 34 2e 36 2e 32 0d 0a 20 20 20 20 20 20 20  n 4.6.2..       
22280 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 72 65     } elseif {$re
22290 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74 46 72 61  lease >= [getFra
222a0 6d 65 77 6f 72 6b 53 65 74 75 70 34 36 31 56 61  meworkSetup461Va
222b0 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
222c0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
222d0 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35  straint dotNet45
222e0 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20  1OrHigher..     
222f0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
22300 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32 4f 72  aint dotNet452Or
22310 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20  Higher..        
22320 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
22330 74 20 64 6f 74 4e 65 74 34 36 4f 72 48 69 67 68  t dotNet46OrHigh
22340 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
22350 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
22360 74 4e 65 74 34 36 31 0d 0a 20 20 20 20 20 20 20  tNet461..       
22370 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
22380 6e 74 20 64 6f 74 4e 65 74 34 36 31 4f 72 48 69  nt dotNet461OrHi
22390 67 68 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gher....        
223a0 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
223b0 34 2e 36 2e 31 0d 0a 20 20 20 20 20 20 20 20 20  4.6.1..         
223c0 20 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 6c 65   } elseif {$rele
223d0 61 73 65 20 3e 3d 20 5b 67 65 74 46 72 61 6d 65  ase >= [getFrame
223e0 77 6f 72 6b 53 65 74 75 70 34 36 56 61 6c 75 65  workSetup46Value
223f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
22400 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
22410 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 31 4f 72  aint dotNet451Or
22420 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20  Higher..        
22430 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
22440 74 20 64 6f 74 4e 65 74 34 35 32 4f 72 48 69 67  t dotNet452OrHig
22450 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  her..           
22460 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
22470 6f 74 4e 65 74 34 36 0d 0a 20 20 20 20 20 20 20  otNet46..       
22480 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
22490 6e 74 20 64 6f 74 4e 65 74 34 36 4f 72 48 69 67  nt dotNet46OrHig
224a0 68 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  her....         
224b0 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 34     set version 4
224c0 2e 36 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  .6..          } 
224d0 65 6c 73 65 69 66 20 7b 24 72 65 6c 65 61 73 65  elseif {$release
224e0 20 3e 3d 20 33 37 39 38 39 33 7d 20 74 68 65 6e   >= 379893} then
224f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22500 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
22510 74 4e 65 74 34 35 31 4f 72 48 69 67 68 65 72 0d  tNet451OrHigher.
22520 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
22530 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
22540 74 34 35 32 0d 0a 20 20 20 20 20 20 20 20 20 20  t452..          
22550 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
22560 64 6f 74 4e 65 74 34 35 32 4f 72 48 69 67 68 65  dotNet452OrHighe
22570 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r....           
22580 20 73 65 74 20 76 65 72 73 69 6f 6e 20 34 2e 35   set version 4.5
22590 2e 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  .2..          } 
225a0 65 6c 73 65 69 66 20 7b 24 72 65 6c 65 61 73 65  elseif {$release
225b0 20 3e 3d 20 5b 67 65 74 46 72 61 6d 65 77 6f 72   >= [getFramewor
225c0 6b 53 65 74 75 70 34 35 31 56 61 6c 75 65 5d 7d  kSetup451Value]}
225d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
225e0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
225f0 6e 74 20 64 6f 74 4e 65 74 34 35 31 0d 0a 20 20  nt dotNet451..  
22600 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
22610 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35  straint dotNet45
22620 31 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20  1OrHigher....   
22630 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
22640 73 69 6f 6e 20 34 2e 35 2e 31 0d 0a 20 20 20 20  sion 4.5.1..    
22650 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
22660 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
22670 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
22680 34 35 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  45....          
22690 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 34 2e    set version 4.
226a0 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
226b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
226c0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
226d0 20 53 68 6f 77 20 74 68 65 20 22 72 65 6c 65 61   Show the "relea
226e0 73 65 22 20 76 61 6c 75 65 20 77 65 20 66 6f 75  se" value we fou
226f0 6e 64 20 69 6e 20 74 68 65 20 72 65 67 69 73 74  nd in the regist
22700 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ry...          #
22710 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
22720 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
22730 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
22740 72 65 6c 65 61 73 65 20 22 2c 20 22 20 24 76 65  release ", " $ve
22750 72 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  rsion ")\n"]....
22760 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22770 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
22780 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
22790 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
227a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
227b0 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
227c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
227d0 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
227e0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
227f0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
22800 20 63 68 65 63 6b 46 6f 72 56 69 73 75 61 6c 53   checkForVisualS
22810 74 75 64 69 6f 56 69 61 52 65 67 69 73 74 72 79  tudioViaRegistry
22820 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
22830 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22840 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
22850 69 6e 67 20 66 6f 72 20 56 69 73 75 61 6c 20 53  ing for Visual S
22860 74 75 64 69 6f 20 75 73 69 6e 67 20 72 65 67 69  tudio using regi
22870 73 74 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  stry... "....   
22880 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
22890 54 45 3a 20 49 6e 69 74 69 61 6c 6c 79 2c 20 6e  TE: Initially, n
228a0 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 56 69  o versions of Vi
228b0 73 75 61 6c 20 53 74 75 64 69 6f 20 68 61 76 65  sual Studio have
228c0 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0d 0a 20 20   been found...  
228d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
228e0 20 76 69 73 75 61 6c 53 74 75 64 69 6f 56 65 72   visualStudioVer
228f0 73 69 6f 6e 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  sions [list]....
22900 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
22910 20 4e 4f 54 45 3a 20 50 6c 61 74 66 6f 72 6d 20   NOTE: Platform 
22920 6d 75 73 74 20 62 65 20 57 69 6e 64 6f 77 73 20  must be Windows 
22930 66 6f 72 20 74 68 69 73 20 63 6f 6e 73 74 72 61  for this constra
22940 69 6e 74 20 74 6f 20 65 76 65 6e 20 62 65 0d 0a  int to even be..
22950 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68        #       ch
22960 65 63 6b 65 64 20 28 69 2e 65 2e 20 77 65 20 72  ecked (i.e. we r
22970 65 71 75 69 72 65 20 74 68 65 20 72 65 67 69 73  equire the regis
22980 74 72 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  try)...      #..
22990 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
229a0 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
229b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
229c0 20 20 23 20 4e 4f 54 45 3a 20 52 65 67 69 73 74    # NOTE: Regist
229d0 72 79 20 68 69 76 65 20 77 68 65 72 65 20 56 69  ry hive where Vi
229e0 73 75 61 6c 20 53 74 75 64 69 6f 20 69 6e 73 74  sual Studio inst
229f0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
22a00 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
22a10 20 20 20 20 73 74 6f 72 65 64 2e 20 20 4d 61 6b      stored.  Mak
22a20 65 20 73 75 72 65 20 74 6f 20 6c 6f 6f 6b 20 69  e sure to look i
22a30 6e 20 74 68 65 20 57 6f 57 36 34 20 72 65 67 69  n the WoW64 regi
22a40 73 74 72 79 20 62 65 63 61 75 73 65 0d 0a 20 20  stry because..  
22a50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56 69        #       Vi
22a60 73 75 61 6c 20 53 74 75 64 69 6f 20 69 73 20 63  sual Studio is c
22a70 75 72 72 65 6e 74 6c 79 20 61 6c 77 61 79 73 20  urrently always 
22a80 61 20 33 32 2d 62 69 74 20 61 70 70 6c 69 63 61  a 32-bit applica
22a90 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23  tion...        #
22aa0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6b 65  ..        set ke
22ab0 79 20 5b 61 70 70 65 6e 64 41 72 67 73 20 48 4b  y [appendArgs HK
22ac0 45 59 5f 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e 45  EY_LOCAL_MACHINE
22ad0 5c 5c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \\ \..          
22ae0 20 20 5b 67 65 74 53 6f 66 74 77 61 72 65 52 65    [getSoftwareRe
22af0 67 69 73 74 72 79 4b 65 79 20 74 72 75 65 5d 20  gistryKey true] 
22b00 7b 5c 4d 69 63 72 6f 73 6f 66 74 5c 56 69 73 75  {\Microsoft\Visu
22b10 61 6c 53 74 75 64 69 6f 7d 5d 0d 0a 0d 0a 20 20  alStudio}]....  
22b20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22b30 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 65 72   # NOTE: The ver
22b40 73 69 6f 6e 73 20 6f 66 20 56 69 73 75 61 6c 20  sions of Visual 
22b50 53 74 75 64 69 6f 20 74 68 61 74 20 77 65 20 73  Studio that we s
22b60 75 70 70 6f 72 74 20 64 65 74 65 63 74 69 6f 6e  upport detection
22b70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22b80 20 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20 72    of using the r
22b90 65 67 69 73 74 72 79 2e 0d 0a 20 20 20 20 20 20  egistry...      
22ba0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
22bb0 20 76 65 72 73 69 6f 6e 73 20 5b 6c 69 73 74 20   versions [list 
22bc0 5b 6c 69 73 74 20 38 2e 30 20 32 30 30 35 5d 20  [list 8.0 2005] 
22bd0 5b 6c 69 73 74 20 39 2e 30 20 32 30 30 38 5d 20  [list 9.0 2008] 
22be0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22bf0 6c 69 73 74 20 31 30 2e 30 20 32 30 31 30 5d 20  list 10.0 2010] 
22c00 5b 6c 69 73 74 20 31 31 2e 30 20 32 30 31 32 5d  [list 11.0 2012]
22c10 20 5b 6c 69 73 74 20 31 32 2e 30 20 32 30 31 33   [list 12.0 2013
22c20 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
22c30 20 5b 6c 69 73 74 20 31 34 2e 30 20 32 30 31 35   [list 14.0 2015
22c40 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ]]....        #.
22c50 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22c60 20 43 68 65 63 6b 20 65 61 63 68 20 76 65 72 73   Check each vers
22c70 69 6f 6e 20 61 6e 64 20 6b 65 65 70 20 74 72 61  ion and keep tra
22c80 63 6b 20 6f 66 20 74 68 65 20 6f 6e 65 73 20 77  ck of the ones w
22c90 65 20 66 69 6e 64 2e 0d 0a 20 20 20 20 20 20 20  e find...       
22ca0 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
22cb0 61 63 68 20 76 65 72 73 69 6f 6e 20 24 76 65 72  ach version $ver
22cc0 73 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20  sions {..       
22cd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
22ce0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
22cf0 74 6f 20 66 65 74 63 68 20 74 68 65 20 56 69 73  to fetch the Vis
22d00 75 61 6c 20 53 74 75 64 69 6f 20 69 6e 73 74 61  ual Studio insta
22d10 6c 6c 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ll directory..  
22d20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
22d30 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 72  value from the r
22d40 65 67 69 73 74 72 79 2c 20 72 65 6d 6f 76 69 6e  egistry, removin
22d50 67 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 62  g the trailing b
22d60 61 63 6b 73 6c 61 73 68 2c 0d 0a 20 20 20 20 20  ackslash,..     
22d70 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20       #       if 
22d80 61 6e 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  any...          
22d90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
22da0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
22db0 20 20 20 20 20 20 20 66 69 6c 65 20 6e 6f 72 6d         file norm
22dc0 61 6c 69 7a 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  alize [file join
22dd0 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 72 69 67   [string trimrig
22de0 68 74 20 5b 6f 62 6a 65 63 74 20 5c 0d 0a 20 20  ht [object \..  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
22e00 76 6f 6b 65 20 4d 69 63 72 6f 73 6f 66 74 2e 57  voke Microsoft.W
22e10 69 6e 33 32 2e 52 65 67 69 73 74 72 79 20 47 65  in32.Registry Ge
22e20 74 56 61 6c 75 65 20 5b 61 70 70 65 6e 64 41 72  tValue [appendAr
22e30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22e40 20 20 20 20 20 20 24 6b 65 79 20 5c 5c 20 5b 6c        $key \\ [l
22e50 69 6e 64 65 78 20 24 76 65 72 73 69 6f 6e 20 30  index $version 0
22e60 5d 5d 20 49 6e 73 74 61 6c 6c 44 69 72 20 6e 75  ]] InstallDir nu
22e70 6c 6c 5d 20 5c 5c 5d 20 5c 0d 0a 20 20 20 20 20  ll] \\] \..     
22e80 20 20 20 20 20 20 20 20 20 20 20 6d 73 65 6e 76             msenv
22e90 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20 20 20  .dll]..         
22ea0 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20   } fileName] == 
22eb0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22ec0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22ed0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
22ee0 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
22ef0 20 6e 61 6d 65 20 6c 6f 6f 6b 20 76 61 6c 69 64   name look valid
22f00 20 61 6e 64 20 64 6f 65 73 20 69 74 0d 0a 20 20   and does it..  
22f10 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
22f20 20 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74    actually exist
22f30 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ?..            #
22f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
22f50 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
22f60 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 20   $fileName] > 0 
22f70 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
22f80 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 66 69        [file isfi
22f90 6c 65 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  le $fileName]} t
22fa0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22fb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22fc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
22fd0 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68  s, it appears th
22fe0 61 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  at it is availab
22ff0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
23000 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
23010 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
23020 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  t [appendArgs \.
23030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23040 20 20 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20     visualStudio 
23050 5b 6c 69 6e 64 65 78 20 24 76 65 72 73 69 6f 6e  [lindex $version
23060 20 31 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   1]]....        
23070 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23080 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4b         # NOTE: K
23090 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c  eep track of all
230a0 20 74 68 65 20 76 65 72 73 69 6f 6e 73 20 74 68   the versions th
230b0 61 74 20 77 65 20 66 69 6e 64 2e 0d 0a 20 20 20  at we find...   
230c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
230e0 65 6e 64 20 76 69 73 75 61 6c 53 74 75 64 69 6f  end visualStudio
230f0 56 65 72 73 69 6f 6e 73 20 5b 6c 69 6e 64 65 78  Versions [lindex
23100 20 24 76 65 72 73 69 6f 6e 20 31 5d 0d 0a 0d 0a   $version 1]....
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
23120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
23130 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
23140 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 6c 61  directory for la
23150 74 65 72 20 75 73 61 67 65 20 62 79 20 74 68 65  ter usage by the
23160 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20   test..         
23170 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69       #       sui
23180 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  te itself...    
23190 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
231a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
231b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
231c0 6f 28 73 65 74 56 69 73 75 61 6c 53 74 75 64 69  o(setVisualStudi
231d0 6f 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  o)]} then {..   
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
231f0 20 3a 3a 74 65 73 74 5f 76 69 73 75 61 6c 5f 73   ::test_visual_s
23200 74 75 64 69 6f 20 5b 66 69 6c 65 20 64 69 72 6e  tudio [file dirn
23210 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
23230 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
23240 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23250 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
23260 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  ...      if {[ll
23270 65 6e 67 74 68 20 24 76 69 73 75 61 6c 53 74 75  ength $visualStu
23280 64 69 6f 56 65 72 73 69 6f 6e 73 5d 20 3e 20 30  dioVersions] > 0
23290 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
232a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
232b0 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 72 65 20  OTE: Show where 
232c0 77 65 20 66 6f 75 6e 64 20 74 68 65 20 6c 61 74  we found the lat
232d0 65 73 74 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20  est version...  
232e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
232f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23300 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23310 20 20 20 20 20 20 20 20 20 20 20 22 79 65 73 20             "yes 
23320 28 22 20 24 76 69 73 75 61 6c 53 74 75 64 69 6f  (" $visualStudio
23330 56 65 72 73 69 6f 6e 73 20 22 2c 20 5c 22 22 20  Versions ", \"" 
23340 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
23350 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73  expr {[info exis
23360 74 73 20 3a 3a 74 65 73 74 5f 76 69 73 75 61 6c  ts ::test_visual
23370 5f 73 74 75 64 69 6f 5d 20 3f 20 5c 0d 0a 20 20  _studio] ? \..  
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 3a                $:
23390 3a 74 65 73 74 5f 76 69 73 75 61 6c 5f 73 74 75  :test_visual_stu
233a0 64 69 6f 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  dio : "<none>"}]
233b0 20 22 5c 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20   "\")\n"]..     
233c0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
233d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
233e0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
233f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
23400 72 6f 63 20 63 68 65 63 6b 46 6f 72 4e 61 74 69  roc checkForNati
23410 76 65 44 65 62 75 67 67 65 72 20 7b 20 63 68 61  veDebugger { cha
23420 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
23430 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
23440 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
23450 72 20 6e 61 74 69 76 65 20 64 65 62 75 67 67 65  r native debugge
23460 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
23470 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
23480 20 49 73 20 74 68 65 20 6e 61 74 69 76 65 20 64   Is the native d
23490 65 62 75 67 67 65 72 20 70 72 65 73 65 6e 74 3f  ebugger present?
234a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
234b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
234c0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
234d0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
234e0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
234f0 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
23500 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
23510 4e 61 74 69 76 65 4f 70 73 2b 53 61 66 65 4e 61  NativeOps+SafeNa
23520 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
23530 20 20 20 20 20 20 20 20 20 20 20 49 73 44 65 62             IsDeb
23540 75 67 67 65 72 50 72 65 73 65 6e 74 0d 0a 20 20  uggerPresent..  
23550 20 20 20 20 7d 20 70 72 65 73 65 6e 74 5d 20 3d      } present] =
23560 3d 20 30 20 26 26 20 24 70 72 65 73 65 6e 74 7d  = 0 && $present}
23570 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23580 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
23590 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65  TE: Yes, it appe
235a0 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20 70  ars that it is p
235b0 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20  resent...       
235c0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
235d0 6f 6e 73 74 72 61 69 6e 74 20 6e 61 74 69 76 65  onstraint native
235e0 44 65 62 75 67 67 65 72 0d 0a 0d 0a 20 20 20 20  Debugger....    
235f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23600 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
23610 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
23620 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
23630 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
23640 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
23650 6f 63 20 63 68 65 63 6b 46 6f 72 4d 61 6e 61 67  oc checkForManag
23660 65 64 44 65 62 75 67 67 65 72 20 7b 20 63 68 61  edDebugger { cha
23670 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
23680 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
23690 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
236a0 72 20 6d 61 6e 61 67 65 64 20 64 65 62 75 67 67  r managed debugg
236b0 65 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  er... "....     
236c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
236d0 3a 20 49 73 20 74 68 65 20 6d 61 6e 61 67 65 64  : Is the managed
236e0 20 64 65 62 75 67 67 65 72 20 61 74 74 61 63 68   debugger attach
236f0 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed?..      #..  
23700 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
23710 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
23720 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44   invoke System.D
23730 69 61 67 6e 6f 73 74 69 63 73 2e 44 65 62 75 67  iagnostics.Debug
23740 67 65 72 20 49 73 41 74 74 61 63 68 65 64 0d 0a  ger IsAttached..
23750 20 20 20 20 20 20 7d 20 61 74 74 61 63 68 65 64        } attached
23760 5d 20 3d 3d 20 30 20 26 26 20 24 61 74 74 61 63  ] == 0 && $attac
23770 68 65 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  hed} then {..   
23780 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23790 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
237a0 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
237b0 69 73 20 61 74 74 61 63 68 65 64 2e 0d 0a 20 20  is attached...  
237c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
237d0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d   addConstraint m
237e0 61 6e 61 67 65 64 44 65 62 75 67 67 65 72 0d 0a  anagedDebugger..
237f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
23800 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
23810 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
23820 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23830 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
23840 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
23850 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
23860 72 53 63 72 69 70 74 44 65 62 75 67 67 65 72 20  rScriptDebugger 
23870 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
23880 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23890 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
238a0 6e 67 20 66 6f 72 20 73 63 72 69 70 74 20 64 65  ng for script de
238b0 62 75 67 67 65 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  bugger... ".... 
238c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
238d0 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 63 72  NOTE: Is the scr
238e0 69 70 74 20 64 65 62 75 67 67 65 72 20 61 76 61  ipt debugger ava
238f0 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23  ilable?..      #
23900 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
23910 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
23920 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
23930 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e  gs +NonPublic In
23940 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
23950 69 76 65 20 44 65 62 75 67 67 65 72 0d 0a 20 20  ive Debugger..  
23960 20 20 20 20 7d 20 64 65 62 75 67 67 65 72 5d 20      } debugger] 
23970 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
23980 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23990 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f 20 6e   # NOTE: We do n
239a0 6f 74 20 6f 77 6e 20 74 68 69 73 2c 20 64 6f 20  ot own this, do 
239b0 6e 6f 74 20 64 69 73 70 6f 73 65 20 69 74 2e 0d  not dispose it..
239c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
239d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
239e0 6c 65 6e 67 74 68 20 24 64 65 62 75 67 67 65 72  length $debugger
239f0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
23a00 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
23a10 6f 62 6a 65 63 74 20 66 6c 61 67 73 20 24 64 65  object flags $de
23a20 62 75 67 67 65 72 20 2b 4e 6f 44 69 73 70 6f 73  bugger +NoDispos
23a30 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  e}..        }...
23a40 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65  .        if {[re
23a50 67 65 78 70 20 2d 2d 20 7b 5e 44 65 62 75 67 67  gexp -- {^Debugg
23a60 65 72 23 5c 64 2b 24 7d 20 24 64 65 62 75 67 67  er#\d+$} $debugg
23a70 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  er]} then {..   
23a80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23a90 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
23aa0 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
23ab0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
23ac0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
23ad0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
23ae0 73 74 72 61 69 6e 74 20 73 63 72 69 70 74 44 65  straint scriptDe
23af0 62 75 67 67 65 72 0d 0a 0d 0a 20 20 20 20 20 20  bugger....      
23b00 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23b10 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
23b20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23b30 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
23b40 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
23b50 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
23b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
23b70 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
23b80 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
23b90 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23ba0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
23bb0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
23bc0 63 6b 46 6f 72 53 63 72 69 70 74 44 65 62 75 67  ckForScriptDebug
23bd0 67 65 72 49 6e 74 65 72 70 72 65 74 65 72 20 7b  gerInterpreter {
23be0 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
23bf0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23c00 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
23c10 67 20 66 6f 72 20 73 63 72 69 70 74 20 64 65 62  g for script deb
23c20 75 67 67 65 72 20 69 6e 74 65 72 70 72 65 74 65  ugger interprete
23c30 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
23c40 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
23c50 20 49 73 20 74 68 65 20 73 63 72 69 70 74 20 64   Is the script d
23c60 65 62 75 67 67 65 72 20 69 6e 74 65 72 70 72 65  ebugger interpre
23c70 74 65 72 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  ter available?..
23c80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
23c90 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
23ca0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
23cb0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
23cc0 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
23cd0 2e 47 65 74 41 63 74 69 76 65 20 44 65 62 75 67  .GetActive Debug
23ce0 67 65 72 0d 0a 20 20 20 20 20 20 7d 20 64 65 62  ger..      } deb
23cf0 75 67 67 65 72 5d 20 3d 3d 20 30 7d 20 74 68 65  ugger] == 0} the
23d00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
23d10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
23d20 57 65 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68  We do not own th
23d30 69 73 2c 20 64 6f 20 6e 6f 74 20 64 69 73 70 6f  is, do not dispo
23d40 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
23d50 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
23d60 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
23d70 65 62 75 67 67 65 72 5d 20 3e 20 30 7d 20 74 68  ebugger] > 0} th
23d80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23d90 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 66 6c  catch {object fl
23da0 61 67 73 20 24 64 65 62 75 67 67 65 72 20 2b 4e  ags $debugger +N
23db0 6f 44 69 73 70 6f 73 65 7d 0d 0a 20 20 20 20 20  oDispose}..     
23dc0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23dd0 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b  if {[regexp -- {
23de0 5e 44 65 62 75 67 67 65 72 23 5c 64 2b 24 7d 20  ^Debugger#\d+$} 
23df0 24 64 65 62 75 67 67 65 72 5d 20 26 26 20 5c 0d  $debugger] && \.
23e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 61  .            [ca
23e10 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
23e20 6b 65 20 24 64 65 62 75 67 67 65 72 20 49 6e 74  ke $debugger Int
23e30 65 72 70 72 65 74 65 72 7d 20 69 6e 74 65 72 70  erpreter} interp
23e40 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
23e50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
23e60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
23e70 65 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68 69  e do not own thi
23e80 73 2c 20 64 6f 20 6e 6f 74 20 64 69 73 70 6f 73  s, do not dispos
23e90 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  e it...         
23ea0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
23eb0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
23ec0 20 24 69 6e 74 65 72 70 5d 20 3e 20 30 7d 20 74   $interp] > 0} t
23ed0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23ee0 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74     catch {object
23ef0 20 66 6c 61 67 73 20 24 69 6e 74 65 72 70 20 2b   flags $interp +
23f00 4e 6f 44 69 73 70 6f 73 65 7d 0d 0a 20 20 20 20  NoDispose}..    
23f10 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23f20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70       if {[regexp
23f30 20 2d 2d 20 7b 5e 49 6e 74 65 72 70 72 65 74 65   -- {^Interprete
23f40 72 23 5c 64 2b 24 7d 20 24 69 6e 74 65 72 70 5d  r#\d+$} $interp]
23f50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23f60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23f70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
23f80 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61  , it appears tha
23f90 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  t it is availabl
23fa0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
23fb0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  #..            a
23fc0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 63 72  ddConstraint scr
23fd0 69 70 74 44 65 62 75 67 67 65 72 49 6e 74 65 72  iptDebuggerInter
23fe0 70 72 65 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  preter....      
23ff0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
24000 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
24010 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
24020 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
24030 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   We are done her
24040 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a  e, return now...
24050 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
24060 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
24070 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
24080 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24090 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74   }....      tput
240a0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
240b0 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 23  .    }....    ##
240c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
240d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
240e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
240f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24100 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
24110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24120 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e 44  ############ END
24130 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23   Eagle ONLY ####
24140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24150 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
24160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24190 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
241a0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d  ###########..  }
241b0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 23 23 23   else {..    ###
241c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
241d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
241e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
241f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24200 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
24210 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24220 23 23 23 23 23 23 23 23 23 23 23 20 42 45 47 49  ########### BEGI
24230 4e 20 54 63 6c 20 4f 4e 4c 59 20 23 23 23 23 23  N Tcl ONLY #####
24240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24250 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
24260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
242a0 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
242b0 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
242c0 20 57 65 20 6e 65 65 64 20 73 65 76 65 72 61 6c   We need several
242d0 20 6f 66 20 6f 75 72 20 74 65 73 74 20 63 6f 6e   of our test con
242e0 73 74 72 61 69 6e 74 20 72 65 6c 61 74 65 64 20  straint related 
242f0 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 0d  commands in the.
24300 0a 20 20 20 20 23 20 20 20 20 20 20 20 67 6c 6f  .    #       glo
24310 62 61 6c 20 6e 61 6d 65 73 70 61 63 65 2e 0d 0a  bal namespace...
24320 20 20 20 20 23 0d 0a 20 20 20 20 65 78 70 6f 72      #..    expor
24330 74 41 6e 64 49 6d 70 6f 72 74 50 61 63 6b 61 67  tAndImportPackag
24340 65 43 6f 6d 6d 61 6e 64 73 20 5b 6e 61 6d 65 73  eCommands [names
24350 70 61 63 65 20 63 75 72 72 65 6e 74 5d 20 5b 6c  pace current] [l
24360 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 67  ist \..        g
24370 65 74 4b 6e 6f 77 6e 42 75 69 6c 64 54 79 70 65  etKnownBuildType
24380 73 20 67 65 74 4b 6e 6f 77 6e 43 6f 6d 70 69 6c  s getKnownCompil
24390 65 4f 70 74 69 6f 6e 73 20 67 65 74 4b 6e 6f 77  eOptions getKnow
243a0 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e 73 20 5c 0d  nMonoVersions \.
243b0 0a 20 20 20 20 20 20 20 20 61 64 64 4b 6e 6f 77  .        addKnow
243c0 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61 69 6e 74 73  nMonoConstraints
243d0 20 6c 70 65 72 6d 75 74 65 20 61 6c 77 61 79 73   lpermute always
243e0 46 75 6c 6c 49 6e 74 65 72 70 52 65 61 64 79 20  FullInterpReady 
243f0 63 61 6e 45 78 65 63 43 6f 6d 53 70 65 63 20 5c  canExecComSpec \
24400 0d 0a 20 20 20 20 20 20 20 20 63 61 6e 45 78 65  ..        canExe
24410 63 57 68 6f 41 6d 49 20 63 61 6e 45 78 65 63 54  cWhoAmI canExecT
24420 63 6c 53 68 65 6c 6c 20 63 61 6e 45 78 65 63 46  clShell canExecF
24430 6f 73 73 69 6c 20 63 61 6e 45 78 65 63 56 73 57  ossil canExecVsW
24440 68 65 72 65 20 69 73 54 65 73 74 4d 6f 6e 6f 20  here isTestMono 
24450 5c 0d 0a 20 20 20 20 20 20 20 20 69 73 54 65 73  \..        isTes
24460 74 41 64 6d 69 6e 69 73 74 72 61 74 6f 72 20 63  tAdministrator c
24470 61 6e 50 69 6e 67 20 63 6c 65 61 6e 43 6f 6e 73  anPing cleanCons
24480 74 72 61 69 6e 74 4e 61 6d 65 20 63 6c 65 61 6e  traintName clean
24490 50 61 63 6b 61 67 65 4e 61 6d 65 20 5c 0d 0a 20  PackageName \.. 
244a0 20 20 20 20 20 20 20 68 61 76 65 54 63 6c 50 6c         haveTclPl
244b0 61 74 66 6f 72 6d 4f 73 45 78 74 72 61 55 70 64  atformOsExtraUpd
244c0 61 74 65 4e 61 6d 65 20 63 68 65 63 6b 46 6f 72  ateName checkFor
244d0 54 65 73 74 53 75 69 74 65 46 69 6c 65 73 20 5c  TestSuiteFiles \
244e0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
244f0 6f 72 50 6c 61 74 66 6f 72 6d 20 63 68 65 63 6b  orPlatform check
24500 46 6f 72 57 69 6e 64 6f 77 73 56 65 72 73 69 6f  ForWindowsVersio
24510 6e 20 63 68 65 63 6b 46 6f 72 4f 70 65 72 61 74  n checkForOperat
24520 69 6e 67 53 79 73 74 65 6d 55 70 64 61 74 65 20  ingSystemUpdate 
24530 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  \..        check
24540 46 6f 72 53 63 72 69 70 74 4c 69 62 72 61 72 79  ForScriptLibrary
24550 20 63 68 65 63 6b 46 6f 72 56 61 72 69 61 62 6c   checkForVariabl
24560 65 20 63 68 65 63 6b 46 6f 72 54 63 6c 4f 70 74  e checkForTclOpt
24570 69 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  ions \..        
24580 63 68 65 63 6b 46 6f 72 57 69 6e 64 6f 77 73 43  checkForWindowsC
24590 6f 6d 6d 61 6e 64 50 72 6f 63 65 73 73 6f 72 20  ommandProcessor 
245a0 63 68 65 63 6b 46 6f 72 50 61 63 6b 61 67 65 20  checkForPackage 
245b0 63 68 65 63 6b 46 6f 72 46 6f 73 73 69 6c 20 5c  checkForFossil \
245c0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
245d0 6f 72 56 69 73 75 61 6c 53 74 75 64 69 6f 56 69  orVisualStudioVi
245e0 61 56 73 57 68 65 72 65 20 63 68 65 63 6b 46 6f  aVsWhere checkFo
245f0 72 45 61 67 6c 65 20 63 68 65 63 6b 46 6f 72 53  rEagle checkForS
24600 79 6d 62 6f 6c 73 20 5c 0d 0a 20 20 20 20 20 20  ymbols \..      
24610 20 20 63 68 65 63 6b 46 6f 72 4c 6f 67 46 69 6c    checkForLogFil
24620 65 20 63 68 65 63 6b 46 6f 72 47 61 72 75 64 61  e checkForGaruda
24630 20 63 68 65 63 6b 46 6f 72 53 68 65 6c 6c 20 5c   checkForShell \
24640 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
24650 6f 72 4f 66 66 69 63 69 61 6c 53 74 61 62 6c 65  orOfficialStable
24660 52 65 6c 65 61 73 65 49 6e 50 72 6f 67 72 65 73  ReleaseInProgres
24670 73 20 63 68 65 63 6b 46 6f 72 44 65 62 75 67 20  s checkForDebug 
24680 63 68 65 63 6b 46 6f 72 54 6b 20 5c 0d 0a 20 20  checkForTk \..  
24690 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 56 65        checkForVe
246a0 72 73 69 6f 6e 20 63 68 65 63 6b 46 6f 72 43 6f  rsion checkForCo
246b0 6d 6d 61 6e 64 20 63 68 65 63 6b 46 6f 72 53 75  mmand checkForSu
246c0 62 43 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 46 6f  bCommand checkFo
246d0 72 4e 61 6d 65 73 70 61 63 65 73 20 5c 0d 0a 20  rNamespaces \.. 
246e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 54         checkForT
246f0 65 73 74 45 78 65 63 20 63 68 65 63 6b 46 6f 72  estExec checkFor
24700 54 65 73 74 4d 61 63 68 69 6e 65 20 63 68 65 63  TestMachine chec
24710 6b 46 6f 72 54 65 73 74 50 6c 61 74 66 6f 72 6d  kForTestPlatform
24720 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   \..        chec
24730 6b 46 6f 72 54 65 73 74 43 6f 6e 66 69 67 75 72  kForTestConfigur
24740 61 74 69 6f 6e 20 63 68 65 63 6b 46 6f 72 54 65  ation checkForTe
24750 73 74 53 75 66 66 69 78 20 63 68 65 63 6b 46 6f  stSuffix checkFo
24760 72 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  rFile \..       
24770 20 63 68 65 63 6b 46 6f 72 50 61 74 68 46 69 6c   checkForPathFil
24780 65 20 63 68 65 63 6b 46 6f 72 4e 61 74 69 76 65  e checkForNative
24790 43 6f 64 65 20 63 68 65 63 6b 46 6f 72 54 69 70  Code checkForTip
247a0 31 32 37 20 63 68 65 63 6b 46 6f 72 54 69 70 31  127 checkForTip1
247b0 39 34 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68  94 \..        ch
247c0 65 63 6b 46 6f 72 54 69 70 32 30 37 20 63 68 65  eckForTip207 che
247d0 63 6b 46 6f 72 54 69 70 32 34 31 20 63 68 65 63  ckForTip241 chec
247e0 6b 46 6f 72 54 69 70 32 38 35 20 63 68 65 63 6b  kForTip285 check
247f0 46 6f 72 54 69 70 34 30 35 20 5c 0d 0a 20 20 20  ForTip405 \..   
24800 20 20 20 20 20 63 68 65 63 6b 46 6f 72 54 69 70       checkForTip
24810 34 32 31 20 63 68 65 63 6b 46 6f 72 54 69 70 34  421 checkForTip4
24820 32 36 20 63 68 65 63 6b 46 6f 72 54 69 70 34 32  26 checkForTip42
24830 39 20 63 68 65 63 6b 46 6f 72 54 69 70 34 34 30  9 checkForTip440
24840 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   \..        chec
24850 6b 46 6f 72 54 69 70 34 36 31 20 63 68 65 63 6b  kForTip461 check
24860 46 6f 72 54 69 70 34 36 33 20 63 68 65 63 6b 46  ForTip463 checkF
24870 6f 72 54 69 70 34 37 31 20 63 68 65 63 6b 46 6f  orTip471 checkFo
24880 72 54 69 6d 69 6e 67 20 5c 0d 0a 20 20 20 20 20  rTiming \..     
24890 20 20 20 63 68 65 63 6b 46 6f 72 50 65 72 66 6f     checkForPerfo
248a0 72 6d 61 6e 63 65 20 63 68 65 63 6b 46 6f 72 42  rmance checkForB
248b0 69 67 4c 69 73 74 73 20 63 68 65 63 6b 46 6f 72  igLists checkFor
248c0 50 72 6f 63 65 73 73 6f 72 49 6e 74 65 6e 73 69  ProcessorIntensi
248d0 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68  ve \..        ch
248e0 65 63 6b 46 6f 72 54 69 6d 65 49 6e 74 65 6e 73  eckForTimeIntens
248f0 69 76 65 20 63 68 65 63 6b 46 6f 72 46 75 6c 6c  ive checkForFull
24900 54 65 73 74 20 63 68 65 63 6b 46 6f 72 4d 65 6d  Test checkForMem
24910 6f 72 79 49 6e 74 65 6e 73 69 76 65 20 5c 0d 0a  oryIntensive \..
24920 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
24930 53 74 61 63 6b 49 6e 74 65 6e 73 69 76 65 20 63  StackIntensive c
24940 68 65 63 6b 46 6f 72 53 74 61 63 6b 53 69 7a 65  heckForStackSize
24950 20 63 68 65 63 6b 46 6f 72 49 6e 74 65 72 61 63   checkForInterac
24960 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  tive \..        
24970 63 68 65 63 6b 46 6f 72 49 6e 74 65 72 61 63 74  checkForInteract
24980 69 76 65 43 6f 6d 6d 61 6e 64 20 63 68 65 63 6b  iveCommand check
24990 46 6f 72 55 73 65 72 49 6e 74 65 72 61 63 74 69  ForUserInteracti
249a0 6f 6e 20 63 68 65 63 6b 46 6f 72 4e 65 74 77 6f  on checkForNetwo
249b0 72 6b 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68  rk \..        ch
249c0 65 63 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f 70 74  eckForCompileOpt
249d0 69 6f 6e 20 63 68 65 63 6b 46 6f 72 4b 6e 6f 77  ion checkForKnow
249e0 6e 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d  nCompileOptions]
249f0 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 0d 0a   false false....
24a00 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
24a10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24a20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24a30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24a40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
24a50 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
24a60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24a70 23 23 23 20 45 4e 44 20 54 63 6c 20 4f 4e 4c 59  ### END Tcl ONLY
24a80 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
24a90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24aa0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
24ab0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24ac0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24ad0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24ae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24af0 23 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  #..  }.....  #..
24b00 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64    # NOTE: Provid
24b10 65 20 74 68 65 20 45 61 67 6c 65 20 22 74 65 73  e the Eagle "tes
24b20 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 70  t constraints" p
24b30 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e  ackage to the in
24b40 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d  terpreter...  #.
24b50 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69  .  package provi
24b60 64 65 20 45 61 67 6c 65 2e 54 65 73 74 2e 43 6f  de Eagle.Test.Co
24b70 6e 73 74 72 61 69 6e 74 73 20 5c 0d 0a 20 20 20  nstraints \..   
24b80 20 5b 65 78 70 72 20 7b 5b 69 73 45 61 67 6c 65   [expr {[isEagle
24b90 5d 20 3f 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65  ] ? [info engine
24ba0 20 50 61 74 63 68 4c 65 76 65 6c 5d 20 3a 20 22   PatchLevel] : "
24bb0 31 2e 30 22 7d 5d 0d 0a 7d 0d 0a 0c              1.0"}]..}...