System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 557920cada13588cc17b6054adbe4b0a13b614d4:


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 5c 0d 0a 20 20 20 20 20 20 20 20 4e 65 74  1 \..        Net
0380: 46 78 34 35 32 20 4e 65 74 46 78 34 36 20 4e 65  Fx452 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 5c 0d 0a 20 20 20 20 20  NetFx47 \..     
03b0: 20 20 20 4e 65 74 46 78 34 37 31 20 4e 65 74 46     NetFx471 NetF
03c0: 78 34 37 32 20 4e 65 74 53 74 61 6e 64 61 72 64  x472 NetStandard
03d0: 32 30 20 42 61 72 65 20 4c 65 61 6e 41 6e 64 4d  20 Bare LeanAndM
03e0: 65 61 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 44  ean \..        D
03f0: 61 74 61 62 61 73 65 20 4d 6f 6e 6f 4f 6e 55 6e  atabase MonoOnUn
0400: 69 78 20 44 65 76 65 6c 6f 70 6d 65 6e 74 5d 0d  ix Development].
0410: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
0420: 67 65 74 4b 6e 6f 77 6e 43 6f 6d 70 69 6c 65 4f  getKnownCompileO
0430: 70 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ptions {} {..   
0440: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d   return [list \.
0450: 0a 20 20 20 20 20 20 20 20 41 50 50 44 4f 4d 41  .        APPDOMA
0460: 49 4e 53 20 41 50 50 52 4f 56 45 44 5f 56 45 52  INS APPROVED_VER
0470: 42 53 20 41 52 47 55 4d 45 4e 54 5f 43 41 43 48  BS ARGUMENT_CACH
0480: 45 20 41 52 4d 20 41 52 4d 36 34 20 41 53 53 45  E ARM ARM64 ASSE
0490: 4d 42 4c 59 5f 44 41 54 45 54 49 4d 45 20 5c 0d  MBLY_DATETIME \.
04a0: 0a 20 20 20 20 20 20 20 20 41 53 53 45 4d 42 4c  .        ASSEMBL
04b0: 59 5f 52 45 4c 45 41 53 45 20 41 53 53 45 4d 42  Y_RELEASE ASSEMB
04c0: 4c 59 5f 53 54 52 4f 4e 47 5f 4e 41 4d 45 5f 54  LY_STRONG_NAME_T
04d0: 41 47 20 41 53 53 45 4d 42 4c 59 5f 54 41 47 20  AG ASSEMBLY_TAG 
04e0: 41 53 53 45 4d 42 4c 59 5f 54 45 58 54 20 5c 0d  ASSEMBLY_TEXT \.
04f0: 0a 20 20 20 20 20 20 20 20 41 53 53 45 4d 42 4c  .        ASSEMBL
0500: 59 5f 55 52 49 20 42 52 45 41 4b 5f 4f 4e 5f 45  Y_URI BREAK_ON_E
0510: 58 49 54 49 4e 47 20 42 52 45 41 4b 50 4f 49 4e  XITING BREAKPOIN
0520: 54 53 20 43 41 43 48 45 5f 41 52 47 55 4d 45 4e  TS CACHE_ARGUMEN
0530: 54 5f 54 4f 53 54 52 49 4e 47 20 5c 0d 0a 20 20  T_TOSTRING \..  
0540: 20 20 20 20 20 20 43 41 43 48 45 5f 41 52 47 55        CACHE_ARGU
0550: 4d 45 4e 54 4c 49 53 54 5f 54 4f 53 54 52 49 4e  MENTLIST_TOSTRIN
0560: 47 20 43 41 43 48 45 5f 44 49 43 54 49 4f 4e 41  G CACHE_DICTIONA
0570: 52 59 20 43 41 43 48 45 5f 52 45 53 55 4c 54 5f  RY CACHE_RESULT_
0580: 54 4f 53 54 52 49 4e 47 20 5c 0d 0a 20 20 20 20  TOSTRING \..    
0590: 20 20 20 20 43 41 43 48 45 5f 53 54 41 54 49 53      CACHE_STATIS
05a0: 54 49 43 53 20 43 41 43 48 45 5f 53 54 52 49 4e  TICS CACHE_STRIN
05b0: 47 4c 49 53 54 5f 54 4f 53 54 52 49 4e 47 20 43  GLIST_TOSTRING C
05c0: 41 4c 4c 42 41 43 4b 5f 51 55 45 55 45 20 43 41  ALLBACK_QUEUE CA
05d0: 53 5f 50 4f 4c 49 43 59 20 5c 0d 0a 20 20 20 20  S_POLICY \..    
05e0: 20 20 20 20 43 45 52 54 49 46 49 43 41 54 45 5f      CERTIFICATE_
05f0: 50 4c 55 47 49 4e 20 43 45 52 54 49 46 49 43 41  PLUGIN CERTIFICA
0600: 54 45 5f 50 4f 4c 49 43 59 20 43 45 52 54 49 46  TE_POLICY CERTIF
0610: 49 43 41 54 45 5f 52 45 4e 45 57 41 4c 20 5c 0d  ICATE_RENEWAL \.
0620: 0a 20 20 20 20 20 20 20 20 43 4f 44 45 5f 41 4e  .        CODE_AN
0630: 41 4c 59 53 49 53 20 43 4f 4d 5f 54 59 50 45 5f  ALYSIS COM_TYPE_
0640: 43 41 43 48 45 20 43 4f 4e 46 49 47 55 52 41 54  CACHE CONFIGURAT
0650: 49 4f 4e 20 43 4f 4e 53 4f 4c 45 20 44 41 45 4d  ION CONSOLE DAEM
0660: 4f 4e 20 44 41 54 41 20 5c 0d 0a 20 20 20 20 20  ON DATA \..     
0670: 20 20 20 44 45 41 44 5f 43 4f 44 45 20 44 45 42     DEAD_CODE DEB
0680: 55 47 20 44 45 42 55 47 47 45 52 20 44 45 42 55  UG DEBUGGER DEBU
0690: 47 47 45 52 5f 41 52 47 55 4d 45 4e 54 53 20 44  GGER_ARGUMENTS D
06a0: 45 42 55 47 47 45 52 5f 45 4e 47 49 4e 45 20 5c  EBUGGER_ENGINE \
06b0: 0d 0a 20 20 20 20 20 20 20 20 44 45 42 55 47 47  ..        DEBUGG
06c0: 45 52 5f 45 58 45 43 55 54 45 20 44 45 42 55 47  ER_EXECUTE DEBUG
06d0: 47 45 52 5f 45 58 50 52 45 53 53 49 4f 4e 20 44  GER_EXPRESSION D
06e0: 45 42 55 47 47 45 52 5f 56 41 52 49 41 42 4c 45  EBUGGER_VARIABLE
06f0: 20 44 45 42 55 47 5f 54 52 41 43 45 20 5c 0d 0a   DEBUG_TRACE \..
0700: 20 20 20 20 20 20 20 20 44 45 42 55 47 5f 57 52          DEBUG_WR
0710: 49 54 45 20 44 45 4d 4f 5f 45 44 49 54 49 4f 4e  ITE DEMO_EDITION
0720: 20 44 52 41 57 49 4e 47 20 44 59 4e 41 4d 49 43   DRAWING DYNAMIC
0730: 20 45 41 47 4c 45 20 45 4d 42 45 44 44 45 44 5f   EAGLE EMBEDDED_
0740: 4c 49 42 52 41 52 59 20 5c 0d 0a 20 20 20 20 20  LIBRARY \..     
0750: 20 20 20 45 4d 42 45 44 5f 43 45 52 54 49 46 49     EMBED_CERTIFI
0760: 43 41 54 45 53 20 45 4d 49 54 20 45 4e 54 45 52  CATES EMIT ENTER
0770: 50 52 49 53 45 5f 4c 4f 43 4b 44 4f 57 4e 20 45  PRISE_LOCKDOWN E
0780: 58 45 43 55 54 45 5f 43 41 43 48 45 20 5c 0d 0a  XECUTE_CACHE \..
0790: 20 20 20 20 20 20 20 20 45 58 50 52 45 53 53 49          EXPRESSI
07a0: 4f 4e 5f 46 4c 41 47 53 20 46 41 53 54 5f 45 52  ON_FLAGS FAST_ER
07b0: 52 4f 52 43 4f 44 45 20 46 41 53 54 5f 45 52 52  RORCODE FAST_ERR
07c0: 4f 52 49 4e 46 4f 20 46 4f 52 5f 54 45 53 54 5f  ORINFO FOR_TEST_
07d0: 55 53 45 5f 4f 4e 4c 59 20 5c 0d 0a 20 20 20 20  USE_ONLY \..    
07e0: 20 20 20 20 48 41 56 45 5f 53 49 5a 45 4f 46 20      HAVE_SIZEOF 
07f0: 48 49 53 54 4f 52 59 20 49 41 36 34 20 49 4e 54  HISTORY IA64 INT
0800: 45 52 41 43 54 49 56 45 5f 43 4f 4d 4d 41 4e 44  ERACTIVE_COMMAND
0810: 53 20 49 4e 54 45 52 4e 41 4c 53 5f 56 49 53 49  S INTERNALS_VISI
0820: 42 4c 45 5f 54 4f 20 5c 0d 0a 20 20 20 20 20 20  BLE_TO \..      
0830: 20 20 49 53 4f 4c 41 54 45 44 5f 49 4e 54 45 52    ISOLATED_INTER
0840: 50 52 45 54 45 52 53 20 49 53 4f 4c 41 54 45 44  PRETERS ISOLATED
0850: 5f 50 4c 55 47 49 4e 53 20 4c 49 42 52 41 52 59  _PLUGINS LIBRARY
0860: 20 4c 49 43 45 4e 53 49 4e 47 20 5c 0d 0a 20 20   LICENSING \..  
0870: 20 20 20 20 20 20 4c 49 43 45 4e 53 45 5f 4d 41        LICENSE_MA
0880: 4e 41 47 45 52 20 4c 49 4d 49 54 45 44 5f 45 44  NAGER LIMITED_ED
0890: 49 54 49 4f 4e 20 4c 49 53 54 5f 43 41 43 48 45  ITION LIST_CACHE
08a0: 20 4d 4f 4e 4f 20 4d 4f 4e 4f 5f 42 55 49 4c 44   MONO MONO_BUILD
08b0: 20 4d 4f 4e 4f 5f 48 41 43 4b 53 20 5c 0d 0a 20   MONO_HACKS \.. 
08c0: 20 20 20 20 20 20 20 4d 4f 4e 4f 5f 4c 45 47 41         MONO_LEGA
08d0: 43 59 20 4e 41 54 49 56 45 20 4e 41 54 49 56 45  CY NATIVE NATIVE
08e0: 5f 50 41 43 4b 41 47 45 20 4e 41 54 49 56 45 5f  _PACKAGE NATIVE_
08f0: 54 48 52 45 41 44 5f 49 44 20 4e 41 54 49 56 45  THREAD_ID NATIVE
0900: 5f 55 54 49 4c 49 54 59 20 5c 0d 0a 20 20 20 20  _UTILITY \..    
0910: 20 20 20 20 4e 41 54 49 56 45 5f 55 54 49 4c 49      NATIVE_UTILI
0920: 54 59 5f 42 53 54 52 20 4e 45 54 57 4f 52 4b 20  TY_BSTR NETWORK 
0930: 4e 45 54 5f 32 30 20 4e 45 54 5f 32 30 5f 46 41  NET_20 NET_20_FA
0940: 53 54 5f 45 4e 55 4d 20 4e 45 54 5f 32 30 5f 4f  ST_ENUM NET_20_O
0950: 4e 4c 59 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e  NLY \..        N
0960: 45 54 5f 32 30 5f 53 50 31 20 4e 45 54 5f 32 30  ET_20_SP1 NET_20
0970: 5f 53 50 32 20 4e 45 54 5f 33 30 20 4e 45 54 5f  _SP2 NET_30 NET_
0980: 33 35 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35  35 NET_40 NET_45
0990: 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f 34 35 32   NET_451 NET_452
09a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e 45 54 5f   \..        NET_
09b0: 34 36 20 4e 45 54 5f 34 36 31 20 4e 45 54 5f 34  46 NET_461 NET_4
09c0: 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34 37  62 NET_47 NET_47
09d0: 31 20 4e 45 54 5f 34 37 32 20 4e 45 54 5f 43 4f  1 NET_472 NET_CO
09e0: 52 45 5f 32 30 20 5c 0d 0a 20 20 20 20 20 20 20  RE_20 \..       
09f0: 20 4e 45 54 5f 53 54 41 4e 44 41 52 44 5f 32 30   NET_STANDARD_20
0a00: 20 4e 4f 4e 5f 57 4f 52 4b 49 4e 47 5f 43 4f 44   NON_WORKING_COD
0a10: 45 20 4e 4f 54 49 46 59 20 4e 4f 54 49 46 59 5f  E NOTIFY NOTIFY_
0a20: 41 43 54 49 56 45 20 5c 0d 0a 20 20 20 20 20 20  ACTIVE \..      
0a30: 20 20 4e 4f 54 49 46 59 5f 41 52 47 55 4d 45 4e    NOTIFY_ARGUMEN
0a40: 54 53 20 4e 4f 54 49 46 59 5f 45 58 43 45 50 54  TS NOTIFY_EXCEPT
0a50: 49 4f 4e 20 4e 4f 54 49 46 59 5f 45 58 45 43 55  ION NOTIFY_EXECU
0a60: 54 45 20 4e 4f 54 49 46 59 5f 45 58 50 52 45 53  TE NOTIFY_EXPRES
0a70: 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
0a80: 4e 4f 54 49 46 59 5f 47 4c 4f 42 41 4c 20 4e 4f  NOTIFY_GLOBAL NO
0a90: 54 49 46 59 5f 4f 42 4a 45 43 54 20 4f 42 53 4f  TIFY_OBJECT OBSO
0aa0: 4c 45 54 45 20 4f 42 46 55 53 43 41 54 49 4f 4e  LETE OBFUSCATION
0ab0: 20 4f 46 46 49 43 49 41 4c 20 50 41 52 53 45 5f   OFFICIAL PARSE_
0ac0: 43 41 43 48 45 20 5c 0d 0a 20 20 20 20 20 20 20  CACHE \..       
0ad0: 20 50 41 54 43 48 4c 45 56 45 4c 20 50 4c 55 47   PATCHLEVEL PLUG
0ae0: 49 4e 5f 43 4f 4d 4d 41 4e 44 53 20 50 4f 4c 49  IN_COMMANDS POLI
0af0: 43 59 5f 54 52 41 43 45 20 50 52 45 56 49 4f 55  CY_TRACE PREVIOU
0b00: 53 5f 52 45 53 55 4c 54 20 52 41 4e 44 4f 4d 49  S_RESULT RANDOMI
0b10: 5a 45 5f 49 44 20 5c 0d 0a 20 20 20 20 20 20 20  ZE_ID \..       
0b20: 20 52 45 4d 4f 54 49 4e 47 20 52 45 53 55 4c 54   REMOTING RESULT
0b30: 5f 4c 49 4d 49 54 53 20 53 41 4d 50 4c 45 20 53  _LIMITS SAMPLE S
0b40: 45 43 55 52 49 54 59 20 53 45 52 49 41 4c 49 5a  ECURITY SERIALIZ
0b50: 41 54 49 4f 4e 20 53 48 41 52 45 44 5f 49 44 5f  ATION SHARED_ID_
0b60: 50 4f 4f 4c 20 5c 0d 0a 20 20 20 20 20 20 20 20  POOL \..        
0b70: 53 48 45 4c 4c 20 53 4f 55 52 43 45 5f 49 44 20  SHELL SOURCE_ID 
0b80: 53 4f 55 52 43 45 5f 54 49 4d 45 53 54 41 4d 50  SOURCE_TIMESTAMP
0b90: 20 53 54 41 54 49 43 20 54 43 4c 20 54 43 4c 5f   STATIC TCL TCL_
0ba0: 4b 49 54 53 20 54 43 4c 5f 54 48 52 45 41 44 45  KITS TCL_THREADE
0bb0: 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 54 43 4c  D \..        TCL
0bc0: 5f 54 48 52 45 41 44 53 20 54 43 4c 5f 55 4e 49  _THREADS TCL_UNI
0bd0: 43 4f 44 45 20 54 43 4c 5f 57 52 41 50 50 45 52  CODE TCL_WRAPPER
0be0: 20 54 45 53 54 20 54 45 53 54 5f 50 4c 55 47 49   TEST TEST_PLUGI
0bf0: 4e 20 54 48 52 45 41 44 49 4e 47 20 5c 0d 0a 20  N THREADING \.. 
0c00: 20 20 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f         THROW_ON_
0c10: 44 49 53 50 4f 53 45 44 20 54 52 41 43 45 20 54  DISPOSED TRACE T
0c20: 59 50 45 5f 43 41 43 48 45 20 55 4e 49 58 20 55  YPE_CACHE UNIX U
0c30: 53 45 5f 41 50 50 44 4f 4d 41 49 4e 5f 46 4f 52  SE_APPDOMAIN_FOR
0c40: 5f 49 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 55  _ID \..        U
0c50: 53 45 5f 4e 41 4d 45 53 50 41 43 45 53 20 56 45  SE_NAMESPACES VE
0c60: 52 42 4f 53 45 20 57 45 42 20 57 49 4e 44 4f 57  RBOSE WEB WINDOW
0c70: 53 20 57 49 4e 46 4f 52 4d 53 20 57 49 58 5f 33  S WINFORMS WIX_3
0c80: 30 20 57 49 58 5f 33 35 20 57 49 58 5f 33 36 20  0 WIX_35 WIX_36 
0c90: 5c 0d 0a 20 20 20 20 20 20 20 20 57 49 58 5f 33  \..        WIX_3
0ca0: 37 20 57 49 58 5f 33 38 20 57 49 58 5f 33 39 20  7 WIX_38 WIX_39 
0cb0: 57 49 58 5f 33 31 30 20 57 49 58 5f 33 31 31 20  WIX_310 WIX_311 
0cc0: 58 36 34 20 58 38 36 20 58 4d 4c 5d 0d 0a 20 20  X64 X86 XML]..  
0cd0: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74  }.....  proc get
0ce0: 4b 6e 6f 77 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e  KnownMonoVersion
0cf0: 73 20 7b 20 7b 66 6f 72 63 65 20 66 61 6c 73 65  s { {force false
0d00: 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  } } {..    #..  
0d10: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 6a    # NOTE: This j
0d20: 6f 62 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  ob of this proce
0d30: 64 75 72 65 20 69 73 20 74 6f 20 72 65 74 75 72  dure is to retur
0d40: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 22 6b  n the list of "k
0d50: 6e 6f 77 6e 22 0d 0a 20 20 20 20 23 20 20 20 20  nown"..    #    
0d60: 20 20 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d     versions of M
0d70: 6f 6e 6f 20 73 75 70 70 6f 72 74 65 64 20 62 79  ono supported by
0d80: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
0d90: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 2e 0d  infrastructure..
0da0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
0db0: 54 45 3a 20 4f 74 68 65 72 20 74 68 61 6e 20 76  TE: Other than v
0dc0: 65 72 73 69 6f 6e 20 32 2e 31 31 20 28 77 68 69  ersion 2.11 (whi
0dd0: 63 68 20 77 61 73 20 6f 66 66 69 63 69 61 6c 6c  ch was officiall
0de0: 79 20 61 6e 6e 6f 75 6e 63 65 64 20 61 6e 64 0d  y announced and.
0df0: 0a 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c  .    #       rel
0e00: 65 61 73 65 64 29 2c 20 61 6c 6c 20 6f 66 20 74  eased), all of t
0e10: 68 65 73 65 20 72 65 6c 65 61 73 65 73 20 61 72  hese releases ar
0e20: 65 20 6c 69 73 74 65 64 20 6f 6e 20 74 68 65 20  e listed on the 
0e30: 6f 66 66 69 63 69 61 6c 0d 0a 20 20 20 20 23 20  official..    # 
0e40: 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 68 69        release hi
0e50: 73 74 6f 72 79 20 70 61 67 65 73 3a 0d 0a 20 20  story pages:..  
0e60: 20 20 23 0d 0a 20 20 20 20 23 20 20 20 20 20 20    #..    #      
0e70: 20 68 74 74 70 73 3a 2f 2f 65 6e 2e 77 69 6b 69   https://en.wiki
0e80: 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4d  pedia.org/wiki/M
0e90: 6f 6e 6f 5f 25 32 38 73 6f 66 74 77 61 72 65 25  ono_%28software%
0ea0: 32 39 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  29..    #       
0eb0: 68 74 74 70 73 3a 2f 2f 77 77 77 2e 6d 6f 6e 6f  https://www.mono
0ec0: 2d 70 72 6f 6a 65 63 74 2e 63 6f 6d 2f 64 6f 63  -project.com/doc
0ed0: 73 2f 61 62 6f 75 74 2d 6d 6f 6e 6f 2f 72 65 6c  s/about-mono/rel
0ee0: 65 61 73 65 73 2f 0d 0a 20 20 20 20 23 0d 0a 20  eases/..    #.. 
0ef0: 20 20 20 23 20 54 4f 44 4f 3a 20 54 68 69 73 20     # TODO: This 
0f00: 6c 69 73 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  list should be m
0f10: 61 6e 75 61 6c 6c 79 20 75 70 64 61 74 65 64 20  anually updated 
0f20: 77 68 65 6e 20 61 20 6e 65 77 20 76 65 72 73 69  when a new versi
0f30: 6f 6e 20 6f 66 0d 0a 20 20 20 20 23 20 20 20 20  on of..    #    
0f40: 20 20 20 74 68 65 20 4d 6f 6e 6f 20 72 75 6e 74     the Mono runt
0f50: 69 6d 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  ime is released.
0f60: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
0f70: 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66  {$force || ![inf
0f80: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6d 6f  o exists ::no(mo
0f90: 6e 6f 56 65 72 73 69 6f 6e 73 29 5d 7d 20 74 68  noVersions)]} th
0fa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75  en {..      retu
0fb0: 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  rn [list \..    
0fc0: 20 20 20 20 20 20 5b 6c 69 73 74 20 32 20 30 5d        [list 2 0]
0fd0: 20 5b 6c 69 73 74 20 32 20 32 5d 20 5b 6c 69 73   [list 2 2] [lis
0fe0: 74 20 32 20 34 5d 20 5b 6c 69 73 74 20 32 20 36  t 2 4] [list 2 6
0ff0: 5d 20 5b 6c 69 73 74 20 32 20 38 5d 20 5b 6c 69  ] [list 2 8] [li
1000: 73 74 20 32 20 31 30 5d 20 5c 0d 0a 20 20 20 20  st 2 10] \..    
1010: 20 20 20 20 20 20 5b 6c 69 73 74 20 32 20 31 31        [list 2 11
1020: 5d 20 5b 6c 69 73 74 20 33 20 30 5d 20 5b 6c 69  ] [list 3 0] [li
1030: 73 74 20 33 20 31 5d 20 5b 6c 69 73 74 20 33 20  st 3 1] [list 3 
1040: 32 5d 20 5b 6c 69 73 74 20 33 20 34 5d 20 5b 6c  2] [list 3 4] [l
1050: 69 73 74 20 33 20 36 5d 20 5c 0d 0a 20 20 20 20  ist 3 6] \..    
1060: 20 20 20 20 20 20 5b 6c 69 73 74 20 33 20 38 5d        [list 3 8]
1070: 20 5b 6c 69 73 74 20 33 20 31 30 5d 20 5b 6c 69   [list 3 10] [li
1080: 73 74 20 33 20 31 32 5d 20 5b 6c 69 73 74 20 34  st 3 12] [list 4
1090: 20 30 5d 20 5b 6c 69 73 74 20 34 20 32 5d 20 5b   0] [list 4 2] [
10a0: 6c 69 73 74 20 34 20 34 5d 20 5c 0d 0a 20 20 20  list 4 4] \..   
10b0: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 34 20 36         [list 4 6
10c0: 5d 20 5b 6c 69 73 74 20 34 20 38 5d 20 5b 6c 69  ] [list 4 8] [li
10d0: 73 74 20 35 20 30 5d 20 5b 6c 69 73 74 20 35 20  st 5 0] [list 5 
10e0: 32 5d 20 5b 6c 69 73 74 20 35 20 34 5d 20 5b 6c  2] [list 5 4] [l
10f0: 69 73 74 20 35 20 38 5d 20 5c 0d 0a 20 20 20 20  ist 5 8] \..    
1100: 20 20 20 20 20 20 5b 6c 69 73 74 20 35 20 31 30        [list 5 10
1110: 5d 20 5b 6c 69 73 74 20 35 20 31 32 5d 5d 0d 0a  ] [list 5 12]]..
1120: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1130: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
1140: 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  ]..    }..  }...
1150: 0d 0a 20 20 70 72 6f 63 20 61 64 64 4b 6e 6f 77  ..  proc addKnow
1160: 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61 69 6e 74 73  nMonoConstraints
1170: 20 7b 20 67 65 6e 65 72 69 63 20 7d 20 7b 0d 0a   { generic } {..
1180: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
1190: 45 3a 20 44 6f 65 73 20 74 68 65 20 63 61 6c 6c  E: Does the call
11a0: 65 72 20 77 61 6e 74 20 74 6f 20 61 64 64 20 74  er want to add t
11b0: 68 65 20 76 65 72 73 69 6f 6e 2d 73 70 65 63 69  he version-speci
11c0: 66 69 63 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d  fic constraints.
11d0: 0a 20 20 20 20 23 20 20 20 20 20 20 20 6f 72 20  .    #       or 
11e0: 74 68 65 20 67 65 6e 65 72 69 63 20 6f 6e 65 73  the generic ones
11f0: 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ?..    #..    if
1200: 20 7b 21 24 67 65 6e 65 72 69 63 7d 20 74 68 65   {!$generic} the
1210: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
1220: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
1230: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
1240: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 65 61  nstraints for ea
1250: 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 6f  ch version of Mo
1260: 6e 6f 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23  no that..      #
1270: 20 20 20 20 20 20 20 77 65 20 6b 6e 6f 77 20 61         we know a
1280: 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bout...      #..
1290: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6d 6f        foreach mo
12a0: 6e 6f 56 65 72 73 69 6f 6e 20 5b 67 65 74 4b 6e  noVersion [getKn
12b0: 6f 77 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e 73 5d  ownMonoVersions]
12c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
12d0: 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f  constraintVersio
12e0: 6e 20 5b 6a 6f 69 6e 20 24 6d 6f 6e 6f 56 65 72  n [join $monoVer
12f0: 73 69 6f 6e 20 22 22 5d 0d 0a 0d 0a 20 20 20 20  sion ""]....    
1300: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1310: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f  t [appendArgs mo
1320: 6e 6f 54 6f 44 6f 20 24 63 6f 6e 73 74 72 61 69  noToDo $constrai
1330: 6e 74 56 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20  ntVersion]..    
1340: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1350: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f  t [appendArgs mo
1360: 6e 6f 54 6f 44 6f 20 24 63 6f 6e 73 74 72 61 69  noToDo $constrai
1370: 6e 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d 0d  ntVersion Only].
1380: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
1390: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
13a0: 67 73 20 6d 6f 6e 6f 42 75 67 20 24 63 6f 6e 73  gs monoBug $cons
13b0: 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 5d 0d 0a  traintVersion]..
13c0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
13d0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
13e0: 73 20 6d 6f 6e 6f 42 75 67 20 24 63 6f 6e 73 74  s monoBug $const
13f0: 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e 6c  raintVersion Onl
1400: 79 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  y]..        addC
1410: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1420: 64 41 72 67 73 20 6d 6f 6e 6f 43 72 61 73 68 20  dArgs monoCrash 
1430: 24 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69  $constraintVersi
1440: 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  on]..        add
1450: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1460: 6e 64 41 72 67 73 20 6d 6f 6e 6f 43 72 61 73 68  ndArgs monoCrash
1470: 20 24 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73   $constraintVers
1480: 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20  ion Only]..     
1490: 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   }..    } else {
14a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14b0: 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 61 64   # NOTE: Also ad
14c0: 64 20 6a 75 73 74 20 74 68 65 20 67 65 6e 65 72  d just the gener
14d0: 69 63 20 4d 6f 6e 6f 20 63 6f 6e 73 74 72 61 69  ic Mono constrai
14e0: 6e 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  nts that do not 
14f0: 68 61 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20  have..      #   
1500: 20 20 20 20 61 20 74 72 61 69 6c 69 6e 67 20 76      a trailing v
1510: 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 23  ersion...      #
1520: 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6e 73  ..      set cons
1530: 74 72 61 69 6e 74 73 20 5b 6c 69 73 74 20 6d 6f  traints [list mo
1540: 6e 6f 54 6f 44 6f 20 6d 6f 6e 6f 42 75 67 20 6d  noToDo monoBug m
1550: 6f 6e 6f 43 72 61 73 68 5d 0d 0a 0d 0a 20 20 20  onoCrash]....   
1560: 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 73 74     foreach const
1570: 72 61 69 6e 74 20 24 63 6f 6e 73 74 72 61 69 6e  raint $constrain
1580: 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  ts {..        ad
1590: 64 43 6f 6e 73 74 72 61 69 6e 74 20 24 63 6f 6e  dConstraint $con
15a0: 73 74 72 61 69 6e 74 0d 0a 20 20 20 20 20 20 7d  straint..      }
15b0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
15c0: 0a 20 20 70 72 6f 63 20 67 65 74 4b 6e 6f 77 6e  .  proc getKnown
15d0: 54 63 6c 56 65 72 73 69 6f 6e 73 20 7b 20 7b 66  TclVersions { {f
15e0: 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  orce false} } {.
15f0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
1600: 54 45 3a 20 54 68 69 73 20 6a 6f 62 20 6f 66 20  TE: This job of 
1610: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  this procedure i
1620: 73 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  s to return the 
1630: 6c 69 73 74 20 6f 66 20 22 6b 6e 6f 77 6e 22 0d  list of "known".
1640: 0a 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72  .    #       ver
1650: 73 69 6f 6e 73 20 6f 66 20 54 63 6c 2f 54 6b 20  sions of Tcl/Tk 
1660: 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65  supported by the
1670: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
1680: 61 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20  astructure...   
1690: 20 23 0d 0a 20 20 20 20 69 66 20 7b 24 66 6f 72   #..    if {$for
16a0: 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  ce || ![info exi
16b0: 73 74 73 20 3a 3a 6e 6f 28 74 63 6c 56 65 72 73  sts ::no(tclVers
16c0: 69 6f 6e 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ions)]} then {..
16d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
16e0: 73 74 20 5b 6c 69 73 74 20 38 20 34 5d 20 5b 6c  st [list 8 4] [l
16f0: 69 73 74 20 38 20 35 5d 20 5b 6c 69 73 74 20 38  ist 8 5] [list 8
1700: 20 36 5d 20 5b 6c 69 73 74 20 38 20 37 5d 5d 0d   6] [list 8 7]].
1710: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
1720: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1730: 74 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  t]..    }..  }..
1740: 0c 0d 0a 20 20 70 72 6f 63 20 66 69 6c 74 65 72  ...  proc filter
1750: 4b 6e 6f 77 6e 56 65 72 73 69 6f 6e 73 20 7b 0d  KnownVersions {.
1760: 0a 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69  .          versi
1770: 6f 6e 73 20 7b 6d 69 6e 69 6d 75 6d 56 65 72 73  ons {minimumVers
1780: 69 6f 6e 20 22 22 7d 20 7b 6d 61 78 69 6d 75 6d  ion ""} {maximum
1790: 56 65 72 73 69 6f 6e 20 22 22 7d 20 7d 20 7b 0d  Version ""} } {.
17a0: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
17b0: 20 6c 65 6e 67 74 68 20 24 6d 69 6e 69 6d 75 6d   length $minimum
17c0: 56 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  Version] > 0} th
17d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20  en {..      set 
17e0: 64 6f 74 4d 69 6e 69 6d 75 6d 56 65 72 73 69 6f  dotMinimumVersio
17f0: 6e 20 5b 67 65 74 44 6f 74 74 65 64 56 65 72 73  n [getDottedVers
1800: 69 6f 6e 20 24 6d 69 6e 69 6d 75 6d 56 65 72 73  ion $minimumVers
1810: 69 6f 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65  ion]..    } else
1820: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 6f   {..      set do
1830: 74 4d 69 6e 69 6d 75 6d 56 65 72 73 69 6f 6e 20  tMinimumVersion 
1840: 22 22 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ""..    }....   
1850: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1860: 67 74 68 20 24 6d 61 78 69 6d 75 6d 56 65 72 73  gth $maximumVers
1870: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
1880: 0d 0a 20 20 20 20 20 20 73 65 74 20 64 6f 74 4d  ..      set dotM
1890: 61 78 69 6d 75 6d 56 65 72 73 69 6f 6e 20 5b 67  aximumVersion [g
18a0: 65 74 44 6f 74 74 65 64 56 65 72 73 69 6f 6e 20  etDottedVersion 
18b0: 24 6d 61 78 69 6d 75 6d 56 65 72 73 69 6f 6e 5d  $maximumVersion]
18c0: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
18d0: 20 20 20 20 20 20 73 65 74 20 64 6f 74 4d 61 78        set dotMax
18e0: 69 6d 75 6d 56 65 72 73 69 6f 6e 20 22 22 0d 0a  imumVersion ""..
18f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65 74      }....    set
1900: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
1910: 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 76 65  ..    foreach ve
1920: 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e 73 20  rsion $versions 
1930: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 6f 74  {..      set dot
1940: 56 65 72 73 69 6f 6e 20 5b 67 65 74 44 6f 74 74  Version [getDott
1950: 65 64 56 65 72 73 69 6f 6e 20 24 76 65 72 73 69  edVersion $versi
1960: 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  on]....      if 
1970: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1980: 24 64 6f 74 4d 69 6e 69 6d 75 6d 56 65 72 73 69  $dotMinimumVersi
1990: 6f 6e 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  on] > 0 && \..  
19a0: 20 20 20 20 20 20 20 20 24 64 6f 74 56 65 72 73          $dotVers
19b0: 69 6f 6e 20 3c 20 24 64 6f 74 4d 69 6e 69 6d 75  ion < $dotMinimu
19c0: 6d 56 65 72 73 69 6f 6e 7d 20 74 68 65 6e 20 7b  mVersion} then {
19d0: 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ..        contin
19e0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
19f0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1a00: 20 6c 65 6e 67 74 68 20 24 64 6f 74 4d 61 78 69   length $dotMaxi
1a10: 6d 75 6d 56 65 72 73 69 6f 6e 5d 20 3e 20 30 20  mumVersion] > 0 
1a20: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1a30: 24 64 6f 74 56 65 72 73 69 6f 6e 20 3e 20 24 64  $dotVersion > $d
1a40: 6f 74 4d 61 78 69 6d 75 6d 56 65 72 73 69 6f 6e  otMaximumVersion
1a50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a60: 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20    continue..    
1a70: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6c 61 70    }....      lap
1a80: 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 65 72  pend result $ver
1a90: 73 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  sion..    }.... 
1aa0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
1ab0: 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  t..  }.....  pro
1ac0: 63 20 67 65 74 44 6f 74 4e 65 74 43 6f 72 65 44  c getDotNetCoreD
1ad0: 69 72 65 63 74 6f 72 79 4e 61 6d 65 4f 6e 6c 79  irectoryNameOnly
1ae0: 20 7b 20 70 61 74 68 20 7d 20 7b 0d 0a 20 20 20   { path } {..   
1af0: 20 23 0d 0a 20 20 20 20 23 20 48 41 43 4b 3a 20   #..    # HACK: 
1b00: 4f 62 74 61 69 6e 20 70 61 72 65 6e 74 20 64 69  Obtain parent di
1b10: 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 74 68 61  rectory name tha
1b20: 74 20 6d 61 74 63 68 65 73 20 22 6e 65 74 2a 22  t matches "net*"
1b30: 2c 20 69 66 20 61 6e 79 20 28 65 2e 67 2e 0d 0a  , if any (e.g...
1b40: 20 20 20 20 23 20 20 20 20 20 20 20 22 6e 65 74      #       "net
1b50: 63 6f 72 65 61 70 70 32 2e 30 22 2c 20 22 6e 65  coreapp2.0", "ne
1b60: 74 73 74 61 6e 64 61 72 64 32 2e 30 22 2c 20 65  tstandard2.0", e
1b70: 74 63 29 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  tc)...    #..   
1b80: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1b90: 67 74 68 20 24 70 61 74 68 5d 20 3e 20 30 7d 20  gth $path] > 0} 
1ba0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65  then {..      se
1bb0: 74 20 74 61 69 6c 20 5b 66 69 6c 65 20 74 61 69  t tail [file tai
1bc0: 6c 20 24 70 61 74 68 5d 0d 0a 0d 0a 20 20 20 20  l $path]....    
1bd0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1be0: 74 63 68 20 6e 65 74 2a 20 24 74 61 69 6c 5d 7d  tch net* $tail]}
1bf0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c00: 20 72 65 74 75 72 6e 20 24 74 61 69 6c 0d 0a 20   return $tail.. 
1c10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
1c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a  .    return ""..
1c30: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67    }.....  proc g
1c40: 65 74 44 6f 74 4e 65 74 43 6f 72 65 4c 69 62 50  etDotNetCoreLibP
1c50: 61 74 68 44 69 72 65 63 74 6f 72 79 4e 61 6d 65  athDirectoryName
1c60: 4f 6e 6c 79 20 7b 20 7b 6e 61 6d 65 20 22 22 7d  Only { {name ""}
1c70: 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20   } {..    #..   
1c80: 20 23 20 4e 4f 54 45 3a 20 53 65 61 72 63 68 20   # NOTE: Search 
1c90: 66 6f 72 20 6d 61 74 63 68 69 6e 67 20 64 69 72  for matching dir
1ca0: 65 63 74 6f 72 69 65 73 20 62 61 73 65 64 20 6f  ectories based o
1cb0: 6e 20 74 68 65 20 67 6c 6f 62 61 6c 6c 79 20 64  n the globally d
1cc0: 65 74 65 63 74 65 64 0d 0a 20 20 20 20 23 20 20  etected..    #  
1cd0: 20 20 20 20 20 6c 69 62 72 61 72 79 20 70 61 74       library pat
1ce0: 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  h associated wit
1cf0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
1d00: 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  re library...   
1d10: 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66   #..    if {[inf
1d20: 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 72 65 5f  o exists ::core_
1d30: 6c 69 62 5f 70 61 74 68 5d 20 26 26 20 5c 0d 0a  lib_path] && \..
1d40: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1d50: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 72 65 5f 6c  length $::core_l
1d60: 69 62 5f 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  ib_path] > 0} th
1d70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
1d80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
1d90: 65 20 73 75 72 65 20 74 68 65 20 64 69 72 65 63  e sure the direc
1da0: 74 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 65 78  tory actually ex
1db0: 69 73 74 73 20 62 65 66 6f 72 65 20 74 72 79 69  ists before tryi
1dc0: 6e 67 20 74 6f 20 66 69 6e 64 0d 0a 20 20 20 20  ng to find..    
1dd0: 20 20 23 20 20 20 20 20 20 20 74 68 69 6e 67 73    #       things
1de0: 20 77 69 74 68 69 6e 20 69 74 2e 0d 0a 20 20 20   within it...   
1df0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1e00: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
1e10: 79 20 24 3a 3a 63 6f 72 65 5f 6c 69 62 5f 70 61  y $::core_lib_pa
1e20: 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  th]} then {..   
1e30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e40: 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 61 6c 6c  # NOTE: Grab all
1e50: 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 68 61   directories tha
1e60: 74 20 61 72 65 20 64 69 72 65 63 74 6c 79 20 62  t are directly b
1e70: 65 6e 65 61 74 68 20 74 68 65 20 64 65 74 65 63  eneath the detec
1e80: 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
1e90: 20 20 20 20 20 6c 69 62 72 61 72 79 20 70 61 74       library pat
1ea0: 68 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  h, if any...    
1eb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
1ec0: 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79  oreach directory
1ed0: 20 5b 67 6c 6f 62 20 5c 0d 0a 20 20 20 20 20 20   [glob \..      
1ee0: 20 20 20 20 20 20 2d 6e 6f 63 6f 6d 70 6c 61 69        -nocomplai
1ef0: 6e 20 2d 74 79 70 65 73 20 7b 64 7d 20 2d 2d 20  n -types {d} -- 
1f00: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 63 6f  [file join $::co
1f10: 72 65 5f 6c 69 62 5f 70 61 74 68 20 2a 5d 5d 20  re_lib_path *]] 
1f20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1f30: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1f40: 3a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  : If the caller 
1f50: 73 70 65 63 69 66 69 65 64 20 61 20 28 70 6c 75  specified a (plu
1f60: 67 69 6e 29 20 6e 61 6d 65 20 74 6f 20 6d 61 74  gin) name to mat
1f70: 63 68 20 61 67 61 69 6e 73 74 2c 0d 0a 20 20 20  ch against,..   
1f80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
1f90: 61 6b 65 20 73 75 72 65 20 69 74 20 6d 61 74 63  ake sure it matc
1fa0: 68 65 73 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  hes; otherwise, 
1fb0: 73 6b 69 70 20 74 68 69 73 20 64 69 72 65 63 74  skip this direct
1fc0: 6f 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ory...          
1fd0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1fe0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1ff0: 24 6e 61 6d 65 5d 20 3e 20 30 20 26 26 20 5c 0d  $name] > 0 && \.
2000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21  .              !
2010: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 24 6e  [string match $n
2020: 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
2030: 64 69 72 65 63 74 6f 72 79 5d 5d 7d 20 74 68 65  directory]]} the
2040: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2050: 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20   continue..     
2060: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2070: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2080: 20 23 20 4e 4f 54 45 3a 20 46 69 6e 64 20 64 69   # NOTE: Find di
2090: 72 65 63 74 6f 72 69 65 73 20 62 65 6e 65 61 74  rectories beneat
20a0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  h the current ca
20b0: 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f 72  ndidate director
20c0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
20d0: 20 20 20 20 20 74 68 61 74 20 61 72 65 20 2e 4e       that are .N
20e0: 45 54 20 43 6f 72 65 20 6f 75 74 70 75 74 20 64  ET Core output d
20f0: 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
2100: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2110: 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
2120: 69 65 73 20 5b 67 6c 6f 62 20 5c 0d 0a 20 20 20  ies [glob \..   
2130: 20 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 6f             -noco
2140: 6d 70 6c 61 69 6e 20 2d 74 79 70 65 73 20 7b 64  mplain -types {d
2150: 7d 20 2d 2d 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  } -- [file join 
2160: 24 64 69 72 65 63 74 6f 72 79 20 6e 65 74 2a 5d  $directory net*]
2170: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ]....          #
2180: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2190: 54 45 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  TE: If there is 
21a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 61 74  at least one mat
21b0: 63 68 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e  ch, we are done.
21c0: 20 20 52 65 74 75 72 6e 20 74 68 65 0d 0a 20 20    Return the..  
21d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21e0: 66 69 6e 61 6c 20 70 61 74 68 20 73 65 67 6d 65  final path segme
21f0: 6e 74 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  nt of the direct
2200: 6f 72 79 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ory name to the 
2210: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
2220: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2230: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 64 69  if {[llength $di
2240: 72 65 63 74 6f 72 69 65 73 5d 20 3e 20 30 7d 20  rectories] > 0} 
2250: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2260: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2270: 20 74 61 69 6c 20 5b 6c 69 6e 64 65 78 20 24 64   tail [lindex $d
2280: 69 72 65 63 74 6f 72 69 65 73 20 30 5d 5d 0d 0a  irectories 0]]..
2290: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
22b0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
22c0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65  .    # NOTE: The
22d0: 72 65 20 77 61 73 20 6e 6f 20 6d 61 74 63 68 2c  re was no match,
22e0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 73 6f 6d   just return som
22f0: 65 74 68 69 6e 67 20 6f 62 76 69 6f 75 73 6c 79  ething obviously
2300: 20 69 6e 76 61 6c 69 64 2e 0d 0a 20 20 20 20 23   invalid...    #
2310: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d  ..    return "".
2320: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
2330: 67 65 74 44 6f 74 74 65 64 56 65 72 73 69 6f 6e  getDottedVersion
2340: 20 7b 20 76 65 72 73 69 6f 6e 20 7d 20 7b 0d 0a   { version } {..
2350: 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e      return [join
2360: 20 24 76 65 72 73 69 6f 6e 20 2e 5d 0d 0a 20 20   $version .]..  
2370: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74  }.....  proc get
2380: 44 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 7b  DotlessVersion {
2390: 20 76 65 72 73 69 6f 6e 20 7d 20 7b 0d 0a 20 20   version } {..  
23a0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 66 69    if {[string fi
23b0: 72 73 74 20 2e 20 24 76 65 72 73 69 6f 6e 5d 20  rst . $version] 
23c0: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
23d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72       return [str
23e0: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e 20  ing map [list . 
23f0: 22 22 5d 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 20  ""] $version].. 
2400: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
2410: 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20     return [join 
2420: 24 76 65 72 73 69 6f 6e 20 22 22 5d 0d 0a 20 20  $version ""]..  
2430: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
2440: 72 6f 63 20 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f  roc getMajorMino
2450: 72 56 65 72 73 69 6f 6e 20 7b 20 76 65 72 73 69  rVersion { versi
2460: 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75  on } {..    retu
2470: 72 6e 20 5b 6a 6f 69 6e 20 5b 6c 72 61 6e 67 65  rn [join [lrange
2480: 20 5b 73 70 6c 69 74 20 24 76 65 72 73 69 6f 6e   [split $version
2490: 20 2e 5d 20 30 20 31 5d 20 2e 5d 0d 0a 20 20 7d   .] 0 1] .]..  }
24a0: 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  .....  #..  # NO
24b0: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
24c0: 72 65 20 77 61 73 20 61 64 61 70 74 65 64 20 66  re was adapted f
24d0: 72 6f 6d 20 74 68 65 20 6f 6e 65 20 6c 69 73 74  rom the one list
24e0: 65 64 20 6f 6e 20 74 68 65 20 54 63 6c 20 57 69  ed on the Tcl Wi
24f0: 6b 69 20 70 61 67 65 0d 0a 20 20 23 20 20 20 20  ki page..  #    
2500: 20 20 20 61 74 20 22 68 74 74 70 73 3a 2f 2f 77     at "https://w
2510: 69 6b 69 2e 74 63 6c 2e 74 6b 2f 34 33 22 2e 20  iki.tcl.tk/43". 
2520: 20 49 74 20 69 73 20 6f 6e 6c 79 20 69 6e 74 65   It is only inte
2530: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
2540: 6f 6e 20 76 65 72 79 0d 0a 20 20 23 20 20 20 20  on very..  #    
2550: 20 20 20 73 6d 61 6c 6c 20 6c 69 73 74 73 20 62     small lists b
2560: 65 63 61 75 73 65 20 6f 66 20 69 74 73 20 68 65  ecause of its he
2570: 61 76 79 20 75 73 65 20 6f 66 20 72 65 63 75 72  avy use of recur
2580: 73 69 6f 6e 20 61 6e 64 20 63 6f 6d 70 6c 65 78  sion and complex
2590: 69 74 79 20 6f 6e 0d 0a 20 20 23 20 20 20 20 20  ity on..  #     
25a0: 20 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 4f    the order of O
25b0: 28 4e 21 29 2e 0d 0a 20 20 23 0d 0a 20 20 70 72  (N!)...  #..  pr
25c0: 6f 63 20 6c 70 65 72 6d 75 74 65 20 7b 20 6c 69  oc lpermute { li
25d0: 73 74 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20  st } {..    set 
25e0: 6c 65 6e 67 74 68 20 5b 6c 6c 65 6e 67 74 68 20  length [llength 
25f0: 24 6c 69 73 74 5d 0d 0a 20 20 20 20 69 66 20 7b  $list]..    if {
2600: 24 6c 65 6e 67 74 68 20 3c 20 32 7d 20 7b 0d 0a  $length < 2} {..
2610: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
2620: 73 74 20 24 6c 69 73 74 5d 0d 0a 20 20 20 20 7d  st $list]..    }
2630: 0d 0a 20 20 20 20 73 65 74 20 69 6e 64 65 78 20  ..    set index 
2640: 30 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 65  0..    foreach e
2650: 6c 65 6d 65 6e 74 31 20 24 6c 69 73 74 20 7b 0d  lement1 $list {.
2660: 0a 20 20 20 20 20 20 69 66 20 7b 24 69 6e 64 65  .      if {$inde
2670: 78 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  x == 0} then {..
2680: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73 74          set rest
2690: 20 5b 6c 72 61 6e 67 65 20 24 6c 69 73 74 20 31   [lrange $list 1
26a0: 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 20 65   end]..      } e
26b0: 6c 73 65 69 66 20 7b 24 69 6e 64 65 78 20 3d 3d  lseif {$index ==
26c0: 20 24 6c 65 6e 67 74 68 20 2d 20 31 7d 20 74 68   $length - 1} th
26d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
26e0: 74 20 72 65 73 74 20 5b 6c 72 61 6e 67 65 20 24  t rest [lrange $
26f0: 6c 69 73 74 20 30 20 65 6e 64 2d 31 5d 0d 0a 20  list 0 end-1].. 
2700: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
2710: 20 20 20 20 20 20 20 73 65 74 20 72 65 73 74 20         set rest 
2720: 5b 63 6f 6e 63 61 74 20 5c 0d 0a 20 20 20 20 20  [concat \..     
2730: 20 20 20 20 20 20 20 5b 6c 72 61 6e 67 65 20 24         [lrange $
2740: 6c 69 73 74 20 30 20 5b 65 78 70 72 20 7b 24 69  list 0 [expr {$i
2750: 6e 64 65 78 20 2d 20 31 7d 5d 5d 20 5c 0d 0a 20  ndex - 1}]] \.. 
2760: 20 20 20 20 20 20 20 20 20 20 20 5b 6c 72 61 6e             [lran
2770: 67 65 20 24 6c 69 73 74 20 5b 65 78 70 72 20 7b  ge $list [expr {
2780: 24 69 6e 64 65 78 20 2b 20 31 7d 5d 20 65 6e 64  $index + 1}] end
2790: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ]]..      }..   
27a0: 20 20 20 69 6e 63 72 20 69 6e 64 65 78 0d 0a 20     incr index.. 
27b0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 6c 69 73       foreach lis
27c0: 74 32 20 5b 6c 70 65 72 6d 75 74 65 20 24 72 65  t2 [lpermute $re
27d0: 73 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c  st] {..        l
27e0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 63  append result [c
27f0: 6f 6e 63 61 74 20 5b 6c 69 73 74 20 24 65 6c 65  oncat [list $ele
2800: 6d 65 6e 74 31 5d 20 24 6c 69 73 74 32 5d 0d 0a  ment1] $list2]..
2810: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2820: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
2830: 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  lt..  }.....  pr
2840: 6f 63 20 61 6c 77 61 79 73 46 75 6c 6c 49 6e 74  oc alwaysFullInt
2850: 65 72 70 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20  erpReady {} {.. 
2860: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
2870: 3a 20 54 68 65 20 5b 69 6e 74 65 72 70 20 72 65  : The [interp re
2880: 61 64 79 6c 69 6d 69 74 5d 20 73 75 62 2d 63 6f  adylimit] sub-co
2890: 6d 6d 61 6e 64 20 69 73 20 6f 6e 6c 79 20 69 6e  mmand is only in
28a0: 20 45 61 67 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a   Eagle...    #..
28b0: 20 20 20 20 69 66 20 7b 21 5b 69 73 45 61 67 6c      if {![isEagl
28c0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
28d0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
28e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20     }....    #.. 
28f0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
2900: 69 73 20 45 61 67 6c 65 20 76 65 72 73 69 6f 6e  is Eagle version
2910: 20 6c 61 63 6b 73 20 5b 69 6e 74 65 72 70 20 72   lacks [interp r
2920: 65 61 64 79 6c 69 6d 69 74 5d 20 2d 4f 52 2d 20  eadylimit] -OR- 
2930: 69 74 20 68 61 73 0d 0a 20 20 20 20 23 20 20 20  it has..    #   
2940: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
2950: 76 61 6c 75 65 20 28 69 2e 65 2e 20 69 74 20 61  value (i.e. it a
2960: 6c 77 61 79 73 20 66 75 6c 6c 79 20 63 68 65 63  lways fully chec
2970: 6b 73 20 72 65 61 64 69 6e 65 73 73 29 2c 0d 0a  ks readiness),..
2980: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
2990: 72 6e 20 74 72 75 65 2e 0d 0a 20 20 20 20 23 0d  rn true...    #.
29a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70  .    return [exp
29b0: 72 20 7b 0d 0a 20 20 20 20 20 20 5b 63 61 74 63  r {..      [catc
29c0: 68 20 7b 69 6e 74 65 72 70 20 72 65 61 64 79 6c  h {interp readyl
29d0: 69 6d 69 74 20 7b 7d 7d 20 72 65 61 64 79 6c 69  imit {}} readyli
29e0: 6d 69 74 5d 20 7c 7c 20 24 72 65 61 64 79 6c 69  mit] || $readyli
29f0: 6d 69 74 20 3d 3d 20 30 0d 0a 20 20 20 20 7d 5d  mit == 0..    }]
2a00: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
2a10: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
2a20: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
2a30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
2a40: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
2a50: 73 79 73 74 65 6d 0d 0a 20 20 23 20 20 20 20 20  system..  #     
2a60: 20 20 73 68 65 6c 6c 20 6d 61 79 20 62 65 20 65    shell may be e
2a70: 78 65 63 75 74 65 64 20 62 79 20 74 68 65 20 74  xecuted by the t
2a80: 65 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73  est suite infras
2a90: 74 72 75 63 74 75 72 65 20 6f 75 74 73 69 64 65  tructure outside
2aa0: 0d 0a 20 20 23 20 20 20 20 20 20 20 74 68 65 20  ..  #       the 
2ab0: 63 6f 6e 74 65 78 74 20 6f 66 20 61 6e 79 20 73  context of any s
2ac0: 70 65 63 69 66 69 63 20 74 65 73 74 73 2e 20 20  pecific tests.  
2ad0: 54 68 65 20 73 70 65 63 69 66 69 63 20 74 65 73  The specific tes
2ae0: 74 73 20 74 68 65 6d 73 65 6c 76 65 73 0d 0a 20  ts themselves.. 
2af0: 20 23 20 20 20 20 20 20 20 6d 75 73 74 20 6d 61   #       must ma
2b00: 6b 65 20 75 73 65 20 6f 66 20 74 68 65 69 72 20  ke use of their 
2b10: 6f 77 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  own constraints 
2b20: 74 6f 20 70 72 65 76 65 6e 74 20 69 74 73 20 65  to prevent its e
2b30: 78 65 63 75 74 69 6f 6e 2e 0d 0a 20 20 23 0d 0a  xecution...  #..
2b40: 20 20 70 72 6f 63 20 63 61 6e 45 78 65 63 43 6f    proc canExecCo
2b50: 6d 53 70 65 63 20 7b 7d 20 7b 0d 0a 20 20 20 20  mSpec {} {..    
2b60: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2b70: 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 7d 20 74 68   ::no(exec)]} th
2b80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75  en {..      retu
2b90: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
2ba0: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
2bb0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 6d   exists ::no(com
2bc0: 53 70 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Spec)]} then {..
2bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2be0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
2bf0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2c00: 73 20 3a 3a 6e 6f 28 63 61 6e 45 78 65 63 43 6f  s ::no(canExecCo
2c10: 6d 53 70 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d  mSpec)]} then {.
2c20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
2c30: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  lse..    }....  
2c40: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
2c50: 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20   }.....  #..  # 
2c60: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
2c70: 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65 74 75  dure should retu
2c80: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
2c90: 68 65 20 22 77 68 6f 61 6d 69 22 20 63 6f 6d 6d  he "whoami" comm
2ca0: 61 6e 64 20 6d 61 79 0d 0a 20 20 23 20 20 20 20  and may..  #    
2cb0: 20 20 20 62 65 20 65 78 65 63 75 74 65 64 20 62     be executed b
2cc0: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
2cd0: 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2ce0: 6f 75 74 73 69 64 65 20 74 68 65 20 63 6f 6e 74  outside the cont
2cf0: 65 78 74 0d 0a 20 20 23 20 20 20 20 20 20 20 6f  ext..  #       o
2d00: 66 20 61 6e 79 20 73 70 65 63 69 66 69 63 20 74  f any specific t
2d10: 65 73 74 73 2e 20 20 54 68 65 20 73 70 65 63 69  ests.  The speci
2d20: 66 69 63 20 74 65 73 74 73 20 74 68 65 6d 73 65  fic tests themse
2d30: 6c 76 65 73 20 6d 75 73 74 20 6d 61 6b 65 0d 0a  lves must make..
2d40: 20 20 23 20 20 20 20 20 20 20 75 73 65 20 6f 66    #       use of
2d50: 20 74 68 65 69 72 20 6f 77 6e 20 63 6f 6e 73 74   their own const
2d60: 72 61 69 6e 74 73 20 74 6f 20 70 72 65 76 65 6e  raints to preven
2d70: 74 20 69 74 73 20 65 78 65 63 75 74 69 6f 6e 2e  t its execution.
2d80: 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 63 61  ..  #..  proc ca
2d90: 6e 45 78 65 63 57 68 6f 41 6d 49 20 7b 7d 20 7b  nExecWhoAmI {} {
2da0: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
2db0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63  exists ::no(exec
2dc0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2dd0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
2de0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20      }....    if 
2df0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2e00: 6e 6f 28 77 68 6f 61 6d 69 29 5d 7d 20 74 68 65  no(whoami)]} the
2e10: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
2e20: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
2e30: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
2e40: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 45  exists ::no(canE
2e50: 78 65 63 57 68 6f 41 6d 49 29 5d 7d 20 74 68 65  xecWhoAmI)]} the
2e60: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
2e70: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
2e80: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  ..    return tru
2e90: 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  e..  }.....  #..
2ea0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
2eb0: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
2ec0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
2ed0: 69 66 20 74 68 65 20 6e 61 74 69 76 65 20 54 63  if the native Tc
2ee0: 6c 20 73 68 65 6c 6c 20 6d 61 79 0d 0a 20 20 23  l shell may..  #
2ef0: 20 20 20 20 20 20 20 62 65 20 65 78 65 63 75 74         be execut
2f00: 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
2f10: 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63 74  uite infrastruct
2f20: 75 72 65 20 6f 75 74 73 69 64 65 20 74 68 65 20  ure outside the 
2f30: 63 6f 6e 74 65 78 74 0d 0a 20 20 23 20 20 20 20  context..  #    
2f40: 20 20 20 6f 66 20 61 6e 79 20 73 70 65 63 69 66     of any specif
2f50: 69 63 20 74 65 73 74 73 2e 20 20 54 68 65 20 73  ic tests.  The s
2f60: 70 65 63 69 66 69 63 20 74 65 73 74 73 20 74 68  pecific tests th
2f70: 65 6d 73 65 6c 76 65 73 20 6d 75 73 74 20 6d 61  emselves must ma
2f80: 6b 65 0d 0a 20 20 23 20 20 20 20 20 20 20 75 73  ke..  #       us
2f90: 65 20 6f 66 20 74 68 65 69 72 20 6f 77 6e 20 63  e of their own c
2fa0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 70 72  onstraints to pr
2fb0: 65 76 65 6e 74 20 69 74 73 20 65 78 65 63 75 74  event its execut
2fc0: 69 6f 6e 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f  ion...  #..  pro
2fd0: 63 20 63 61 6e 45 78 65 63 54 63 6c 53 68 65 6c  c canExecTclShel
2fe0: 6c 20 7b 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b  l {} {..    if {
2ff0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
3000: 6f 28 65 78 65 63 29 5d 7d 20 74 68 65 6e 20 7b  o(exec)]} then {
3010: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
3020: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  alse..    }.... 
3030: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
3040: 73 74 73 20 3a 3a 6e 6f 28 74 63 6c 29 5d 7d 20  sts ::no(tcl)]} 
3050: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65  then {..      re
3060: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
3070: 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  }....    if {[in
3080: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
3090: 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c 29 5d  anExecTclShell)]
30a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
30b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
30c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72    }....    retur
30d0: 6e 20 74 72 75 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a  n true..  }.....
30e0: 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54    #..  # NOTE: T
30f0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 68  his procedure sh
3100: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ould return non-
3110: 7a 65 72 6f 20 69 66 20 46 6f 73 73 69 6c 20 6d  zero if Fossil m
3120: 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 62  ay be executed b
3130: 79 0d 0a 20 20 23 20 20 20 20 20 20 20 74 68 65  y..  #       the
3140: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
3150: 61 73 74 72 75 63 74 75 72 65 20 6f 75 74 73 69  astructure outsi
3160: 64 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  de the context o
3170: 66 20 61 6e 79 20 73 70 65 63 69 66 69 63 0d 0a  f any specific..
3180: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73 2e    #       tests.
3190: 20 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74    The specific t
31a0: 65 73 74 73 20 74 68 65 6d 73 65 6c 76 65 73 20  ests themselves 
31b0: 6d 75 73 74 20 6d 61 6b 65 20 75 73 65 20 6f 66  must make use of
31c0: 20 74 68 65 69 72 20 6f 77 6e 0d 0a 20 20 23 20   their own..  # 
31d0: 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
31e0: 73 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 73  s to prevent its
31f0: 20 65 78 65 63 75 74 69 6f 6e 2e 0d 0a 20 20 23   execution...  #
3200: 0d 0a 20 20 70 72 6f 63 20 63 61 6e 45 78 65 63  ..  proc canExec
3210: 46 6f 73 73 69 6c 20 7b 7d 20 7b 0d 0a 20 20 20  Fossil {} {..   
3220: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
3230: 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 7d 20 74  s ::no(exec)]} t
3240: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74  hen {..      ret
3250: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
3260: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66  ....    if {[inf
3270: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 66 6f  o exists ::no(fo
3280: 73 73 69 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ssil)]} then {..
3290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
32a0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
32b0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
32c0: 73 20 3a 3a 6e 6f 28 63 61 6e 45 78 65 63 46 6f  s ::no(canExecFo
32d0: 73 73 69 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ssil)]} then {..
32e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
32f0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
3300: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
3310: 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e  }.....  #..  # N
3320: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
3330: 75 72 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72  ure should retur
3340: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
3350: 65 20 22 76 73 77 68 65 72 65 22 20 74 6f 6f 6c  e "vswhere" tool
3360: 20 6d 61 79 20 62 65 0d 0a 20 20 23 20 20 20 20   may be..  #    
3370: 20 20 20 65 78 65 63 75 74 65 64 20 62 79 20 74     executed by t
3380: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e  he test suite in
3390: 66 72 61 73 74 72 75 63 74 75 72 65 20 6f 75 74  frastructure out
33a0: 73 69 64 65 20 74 68 65 20 63 6f 6e 74 65 78 74  side the context
33b0: 20 6f 66 0d 0a 20 20 23 20 20 20 20 20 20 20 61   of..  #       a
33c0: 6e 79 20 73 70 65 63 69 66 69 63 20 74 65 73 74  ny specific test
33d0: 73 2e 20 20 54 68 65 20 73 70 65 63 69 66 69 63  s.  The specific
33e0: 20 74 65 73 74 73 20 74 68 65 6d 73 65 6c 76 65   tests themselve
33f0: 73 20 6d 75 73 74 20 6d 61 6b 65 20 75 73 65 0d  s must make use.
3400: 0a 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68  .  #       of th
3410: 65 69 72 20 6f 77 6e 20 63 6f 6e 73 74 72 61 69  eir own constrai
3420: 6e 74 73 20 74 6f 20 70 72 65 76 65 6e 74 20 69  nts to prevent i
3430: 74 73 20 65 78 65 63 75 74 69 6f 6e 2e 0d 0a 20  ts execution... 
3440: 20 23 0d 0a 20 20 70 72 6f 63 20 63 61 6e 45 78   #..  proc canEx
3450: 65 63 56 73 57 68 65 72 65 20 7b 7d 20 7b 0d 0a  ecVsWhere {} {..
3460: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3470: 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d  ists ::no(exec)]
3480: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3490: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
34a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b    }....    if {[
34b0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
34c0: 28 76 73 77 68 65 72 65 29 5d 7d 20 74 68 65 6e  (vswhere)]} then
34d0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
34e0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   false..    }...
34f0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
3500: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 45 78  xists ::no(canEx
3510: 65 63 56 73 57 68 65 72 65 29 5d 7d 20 74 68 65  ecVsWhere)]} the
3520: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
3530: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
3540: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  ..    return tru
3550: 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  e..  }.....  #..
3560: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
3570: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
3580: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
3590: 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
35a0: 65 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 23  e should be..  #
35b0: 20 20 20 20 20 20 20 63 6f 6e 73 69 64 65 72 65         considere
35c0: 64 20 74 6f 20 62 65 20 72 75 6e 6e 69 6e 67 20  d to be running 
35d0: 6f 6e 20 4d 6f 6e 6f 2e 0d 0a 20 20 23 0d 0a 20  on Mono...  #.. 
35e0: 20 70 72 6f 63 20 69 73 54 65 73 74 4d 6f 6e 6f   proc isTestMono
35f0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72   {} {..    retur
3600: 6e 20 5b 65 78 70 72 20 7b 21 5b 69 6e 66 6f 20  n [expr {![info 
3610: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6d 6f 6e 6f  exists ::no(mono
3620: 29 5d 20 26 26 20 5b 69 73 4d 6f 6e 6f 5d 7d 5d  )] && [isMono]}]
3630: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
3640: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
3650: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
3660: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
3670: 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
3680: 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 23 20   should be..  # 
3690: 20 20 20 20 20 20 63 6f 6e 73 69 64 65 72 65 64        considered
36a0: 20 74 6f 20 62 65 20 72 75 6e 6e 69 6e 67 20 6f   to be running o
36b0: 6e 20 2e 4e 45 54 20 43 6f 72 65 2e 0d 0a 20 20  n .NET Core...  
36c0: 23 0d 0a 20 20 70 72 6f 63 20 69 73 54 65 73 74  #..  proc isTest
36d0: 44 6f 74 4e 65 74 43 6f 72 65 20 7b 7d 20 7b 0d  DotNetCore {} {.
36e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70  .    return [exp
36f0: 72 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  r {![info exists
3700: 20 3a 3a 6e 6f 28 64 6f 74 4e 65 74 43 6f 72 65   ::no(dotNetCore
3710: 29 5d 20 26 26 20 5b 69 73 44 6f 74 4e 65 74 43  )] && [isDotNetC
3720: 6f 72 65 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  ore]}]..  }.....
3730: 20 20 70 72 6f 63 20 69 73 54 65 73 74 41 64 6d    proc isTestAdm
3740: 69 6e 69 73 74 72 61 74 6f 72 20 7b 20 7b 66 6f  inistrator { {fo
3750: 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  rce false} } {..
3760: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
3770: 45 3a 20 54 68 69 73 20 69 73 20 61 20 77 6f 72  E: This is a wor
3780: 6b 61 72 6f 75 6e 64 20 66 6f 72 20 74 68 65 20  karound for the 
3790: 5b 69 73 41 64 6d 69 6e 69 73 74 72 61 74 6f 72  [isAdministrator
37a0: 5d 20 70 72 6f 63 65 64 75 72 65 20 62 65 69 6e  ] procedure bein
37b0: 67 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69  g..    #       i
37c0: 6e 61 63 63 75 72 61 74 65 20 66 6f 72 20 4d 6f  naccurate for Mo
37d0: 6e 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 70  no on Windows, p
37e0: 72 69 6d 61 72 69 6c 79 20 64 75 65 20 74 6f 20  rimarily due to 
37f0: 74 68 65 20 69 6e 61 62 69 6c 69 74 79 0d 0a 20  the inability.. 
3800: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 4d 6f     #       of Mo
3810: 6e 6f 20 74 6f 20 63 61 6c 6c 20 61 20 50 2f 49  no to call a P/I
3820: 6e 76 6f 6b 65 20 6d 65 74 68 6f 64 20 62 79 20  nvoke method by 
3830: 6f 72 64 69 6e 61 6c 2e 20 20 41 6c 73 6f 2c 20  ordinal.  Also, 
3840: 74 68 69 73 20 63 61 6e 0d 0a 20 20 20 20 23 20  this can..    # 
3850: 20 20 20 20 20 20 62 65 20 75 73 65 64 20 66 6f        be used fo
3860: 72 20 6e 61 74 69 76 65 20 54 63 6c 20 6f 6e 20  r native Tcl on 
3870: 57 69 6e 64 6f 77 73 2e 20 20 54 68 69 73 20 6f  Windows.  This o
3880: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 57 69 6e  nly works on Win
3890: 64 6f 77 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  dows...    #..  
38a0: 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
38b0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
38c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
38d0: 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  : Normally, this
38e0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
38f0: 72 20 6e 61 74 69 76 65 20 54 63 6c 20 6f 72 20  r native Tcl or 
3900: 45 61 67 6c 65 20 6f 6e 20 4d 6f 6e 6f 3b 0d 0a  Eagle on Mono;..
3910: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68 6f        #       ho
3920: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62 65  wever, it can be
3930: 20 75 73 65 64 20 66 6f 72 20 45 61 67 6c 65 20   used for Eagle 
3940: 6f 6e 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d  on the .NET Fram
3950: 65 77 6f 72 6b 20 69 66 0d 0a 20 20 20 20 20 20  ework if..      
3960: 23 20 20 20 20 20 20 20 66 6f 72 63 65 64 2e 0d  #       forced..
3970: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3980: 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b  if {$force || ![
3990: 69 73 45 61 67 6c 65 5d 20 7c 7c 20 5b 69 73 54  isEagle] || [isT
39a0: 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b  estMono]} then {
39b0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
39c0: 61 6e 45 78 65 63 57 68 6f 41 6d 49 5d 20 26 26  anExecWhoAmI] &&
39d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
39e0: 5b 63 61 74 63 68 20 7b 65 78 65 63 20 2d 2d 20  [catch {exec -- 
39f0: 77 68 6f 61 6d 69 20 2f 67 72 6f 75 70 73 7d 20  whoami /groups} 
3a00: 67 72 6f 75 70 73 5d 20 3d 3d 20 30 7d 20 74 68  groups] == 0} th
3a10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
3a20: 73 65 74 20 67 72 6f 75 70 73 20 5b 73 74 72 69  set groups [stri
3a30: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c  ng map [list \r\
3a40: 6e 20 5c 6e 5d 20 24 67 72 6f 75 70 73 5d 0d 0a  n \n] $groups]..
3a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
3a60: 61 63 68 20 67 72 6f 75 70 20 5b 73 70 6c 69 74  ach group [split
3a70: 20 24 67 72 6f 75 70 73 20 5c 6e 5d 20 7b 0d 0a   $groups \n] {..
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
3a90: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
3aa0: 45 3a 20 4d 61 74 63 68 20 74 68 69 73 20 67 72  E: Match this gr
3ab0: 6f 75 70 20 6c 69 6e 65 20 61 67 61 69 6e 73 74  oup line against
3ac0: 20 74 68 65 20 22 77 65 6c 6c 2d 6b 6e 6f 77 6e   the "well-known
3ad0: 22 20 53 49 44 20 66 6f 72 0d 0a 20 20 20 20 20  " SID for..     
3ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3af0: 68 65 20 22 41 64 6d 69 6e 69 73 74 72 61 74 6f  he "Administrato
3b00: 72 73 22 20 67 72 6f 75 70 20 6f 6e 20 57 69 6e  rs" group on Win
3b10: 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  dows...         
3b20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3b30: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d    if {[regexp --
3b40: 20 7b 5c 73 53 2d 31 2d 35 2d 33 32 2d 35 34 34   {\sS-1-5-32-544
3b50: 5c 73 7d 20 24 67 72 6f 75 70 5d 7d 20 74 68 65  \s} $group]} the
3b60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
3b70: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3b80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 74 63      # NOTE: Matc
3b90: 68 20 74 68 69 73 20 67 72 6f 75 70 20 6c 69 6e  h this group lin
3ba0: 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 61 74  e against the at
3bb0: 74 72 69 62 75 74 65 73 20 63 6f 6c 75 6d 6e 0d  tributes column.
3bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
3bd0: 20 20 20 20 20 20 20 73 75 62 2d 76 61 6c 75 65         sub-value
3be0: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
3bf0: 70 72 65 73 65 6e 74 20 77 68 65 6e 20 72 75 6e  present when run
3c00: 6e 69 6e 67 20 77 69 74 68 0d 0a 20 20 20 20 20  ning with..     
3c10: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
3c20: 20 65 6c 65 76 61 74 65 64 20 61 64 6d 69 6e 69   elevated admini
3c30: 73 74 72 61 74 6f 72 20 63 72 65 64 65 6e 74 69  strator credenti
3c40: 61 6c 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  als...          
3c50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
3c60: 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70       if {[regexp
3c70: 20 2d 2d 20 7b 5c 73 45 6e 61 62 6c 65 64 20 67   -- {\sEnabled g
3c80: 72 6f 75 70 28 3f 3a 2c 7c 5c 73 29 7d 20 24 67  roup(?:,|\s)} $g
3c90: 72 6f 75 70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  roup]} then {.. 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
3cb0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3cc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3cd0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3ce0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3cf0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
3d00: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
3d10: 20 23 20 4e 4f 54 45 3a 20 57 65 20 6d 75 73 74   # NOTE: We must
3d20: 20 62 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   be running in n
3d30: 61 74 69 76 65 20 54 63 6c 2c 20 72 75 6e 6e 69  ative Tcl, runni
3d40: 6e 67 20 6f 6e 20 55 6e 69 78 2c 20 72 75 6e 6e  ng on Unix, runn
3d50: 69 6e 67 20 69 6e 0d 0a 20 20 20 20 23 20 20 20  ing in..    #   
3d60: 20 20 20 20 45 61 67 6c 65 20 6f 6e 20 74 68 65      Eagle on the
3d70: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2c   .NET Framework,
3d80: 20 6f 72 20 75 6e 61 62 6c 65 20 74 6f 20 65 78   or unable to ex
3d90: 65 63 75 74 65 20 74 68 65 20 22 77 68 6f 61 6d  ecute the "whoam
3da0: 69 22 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  i"..    #       
3db0: 63 6f 6d 6d 61 6e 64 2e 20 20 49 66 20 72 75 6e  command.  If run
3dc0: 6e 69 6e 67 20 69 6e 20 45 61 67 6c 65 2c 20 77  ning in Eagle, w
3dd0: 65 20 63 61 6e 20 6a 75 73 74 20 66 61 6c 6c 62  e can just fallb
3de0: 61 63 6b 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20  ack to using..  
3df0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 5b 69    #       the [i
3e00: 73 41 64 6d 69 6e 69 73 74 72 61 74 6f 72 5d 20  sAdministrator] 
3e10: 70 72 6f 63 65 64 75 72 65 3b 20 6f 74 68 65 72  procedure; other
3e20: 77 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72  wise, just retur
3e30: 6e 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 23 0d  n false...    #.
3e40: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70  .    return [exp
3e50: 72 20 7b 5b 69 73 45 61 67 6c 65 5d 20 3f 20 5b  r {[isEagle] ? [
3e60: 69 73 41 64 6d 69 6e 69 73 74 72 61 74 6f 72 5d  isAdministrator]
3e70: 20 3a 20 66 61 6c 73 65 7d 5d 0d 0a 20 20 7d 0d   : false}]..  }.
3e80: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 61 6e 50 69  ....  proc canPi
3e90: 6e 67 20 7b 20 7b 76 61 72 4e 61 6d 65 20 22 22  ng { {varName ""
3ea0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  } } {..    #..  
3eb0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71    # NOTE: If req
3ec0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 63 61  uested by the ca
3ed0: 6c 6c 65 72 2c 20 70 72 6f 76 69 64 65 20 61 20  ller, provide a 
3ee0: 72 65 61 73 6f 6e 20 77 68 65 6e 65 76 65 72 20  reason whenever 
3ef0: 66 61 6c 73 65 20 69 73 0d 0a 20 20 20 20 23 20  false is..    # 
3f00: 20 20 20 20 20 20 72 65 74 75 72 6e 65 64 20 66        returned f
3f10: 72 6f 6d 20 74 68 69 73 20 70 72 6f 63 65 64 75  rom this procedu
3f20: 72 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  re...    #..    
3f30: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
3f40: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
3f50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3f60: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
3f70: 20 72 65 61 73 6f 6e 0d 0a 20 20 20 20 7d 0d 0a   reason..    }..
3f80: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
3f90: 4f 54 45 3a 20 4e 61 74 69 76 65 20 54 63 6c 20  OTE: Native Tcl 
3fa0: 28 77 69 74 68 6f 75 74 20 65 78 74 72 61 20 70  (without extra p
3fb0: 61 63 6b 61 67 65 73 29 20 64 6f 65 73 20 6e 6f  ackages) does no
3fc0: 74 20 70 72 6f 76 69 64 65 20 73 75 70 70 6f 72  t provide suppor
3fd0: 74 20 66 6f 72 0d 0a 20 20 20 20 23 20 20 20 20  t for..    #    
3fe0: 20 20 20 70 69 6e 67 69 6e 67 20 61 20 6e 65 74     pinging a net
3ff0: 77 6f 72 6b 20 68 6f 73 74 2e 0d 0a 20 20 20 20  work host...    
4000: 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61  #..    if {[isEa
4010: 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gle]} then {..  
4020: 20 20 20 20 69 66 20 7b 5b 69 73 54 65 73 74 4d      if {[isTestM
4030: 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ono]} then {..  
4040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4050: 20 23 20 4e 4f 54 45 3a 20 55 73 69 6e 67 20 5b   # NOTE: Using [
4060: 75 72 69 20 70 69 6e 67 5d 20 6f 6e 20 74 68 65  uri ping] on the
4070: 20 4d 6f 6e 6f 20 33 2e 33 2e 30 20 28 6f 72 20   Mono 3.3.0 (or 
4080: 33 2e 34 2e 30 3f 29 20 72 65 6c 65 61 73 65 20  3.4.0?) release 
4090: 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  will..        # 
40a0: 20 20 20 20 20 20 6c 6f 63 6b 20 75 70 20 74 68        lock up th
40b0: 65 20 70 72 6f 63 65 73 73 3b 20 74 68 65 72 65  e process; there
40c0: 66 6f 72 65 2c 20 73 6b 69 70 20 69 74 20 69 6e  fore, skip it in
40d0: 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20   that case...   
40e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
40f0: 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61  if {[haveConstra
4100: 69 6e 74 20 6d 6f 6e 6f 33 33 5d 20 7c 7c 20 5b  int mono33] || [
4110: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 6d  haveConstraint m
4120: 6f 6e 6f 33 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ono34]} then {..
4130: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65            set re
4140: 61 73 6f 6e 20 22 73 6b 69 70 70 65 64 2c 20 6d  ason "skipped, m
4150: 61 79 20 68 61 6e 67 20 6f 6e 20 4d 6f 6e 6f 20  ay hang on Mono 
4160: 33 2e 33 2e 30 20 61 6e 64 20 33 2e 34 2e 30 22  3.3.0 and 3.4.0"
4170: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
4180: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
4190: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
41a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
41b0: 3a 20 4f 74 68 65 72 20 76 65 72 73 69 6f 6e 73  : Other versions
41c0: 20 6f 66 20 4d 6f 6e 6f 2c 20 65 2e 67 2e 20 33   of Mono, e.g. 3
41d0: 2e 31 32 2c 20 61 70 70 65 61 72 20 74 6f 20 72  .12, appear to r
41e0: 65 71 75 69 72 65 20 65 6c 65 76 61 74 65 64 0d  equire elevated.
41f0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4200: 20 70 72 69 76 69 6c 65 67 65 73 20 28 69 2e 65   privileges (i.e
4210: 2e 20 66 75 6c 6c 20 61 64 6d 69 6e 69 73 74 72  . full administr
4220: 61 74 6f 72 29 20 69 6e 20 6f 72 64 65 72 20 74  ator) in order t
4230: 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0d 0a  o successfully..
4240: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4250: 65 78 65 63 75 74 65 20 5b 75 72 69 20 70 69 6e  execute [uri pin
4260: 67 5d 2e 20 20 54 68 69 73 20 68 61 73 20 62 65  g].  This has be
4270: 65 6e 20 76 65 72 69 66 69 65 64 20 6f 6e 20 57  en verified on W
4280: 69 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20 20  indows...       
4290: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
42a0: 21 5b 69 73 54 65 73 74 41 64 6d 69 6e 69 73 74  ![isTestAdminist
42b0: 72 61 74 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rator]} then {..
42c0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65            set re
42d0: 61 73 6f 6e 20 22 73 6b 69 70 70 65 64 2c 20 6e  ason "skipped, n
42e0: 65 65 64 20 61 64 6d 69 6e 69 73 74 72 61 74 6f  eed administrato
42f0: 72 20 70 72 69 76 69 6c 65 67 65 73 22 0d 0a 20  r privileges".. 
4300: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4310: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
4320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4330: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4340: 54 45 3a 20 45 61 67 6c 65 2c 20 77 68 65 6e 20  TE: Eagle, when 
4350: 72 75 6e 6e 69 6e 67 20 6f 6e 20 74 68 65 20 4d  running on the M
4360: 69 63 72 6f 73 6f 66 74 20 2e 4e 45 54 20 46 72  icrosoft .NET Fr
4370: 61 6d 65 77 6f 72 6b 2c 20 73 75 70 70 6f 72 74  amework, support
4380: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
4390: 20 70 69 6e 67 69 6e 67 20 61 20 6e 65 74 77 6f   pinging a netwo
43a0: 72 6b 20 68 6f 73 74 20 61 73 20 6c 6f 6e 67 20  rk host as long 
43b0: 61 73 20 69 74 20 77 61 73 20 63 6f 6d 70 69 6c  as it was compil
43c0: 65 64 20 77 69 74 68 20 6e 65 74 77 6f 72 6b 0d  ed with network.
43d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
43e0: 75 70 70 6f 72 74 20 28 77 68 69 63 68 20 74 68  upport (which th
43f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 70 75 72  is procedure pur
4400: 70 6f 73 65 6c 79 20 64 6f 65 73 20 6e 6f 74 20  posely does not 
4410: 63 68 65 63 6b 29 2e 20 20 54 68 61 74 0d 0a 20  check).  That.. 
4420: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
4430: 64 6f 6e 65 20 75 73 69 6e 67 20 5b 63 68 65 63  done using [chec
4440: 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  kForCompileOptio
4450: 6e 5d 2c 20 62 79 20 74 68 65 20 74 65 73 74 20  n], by the test 
4460: 70 72 6f 6c 6f 67 75 65 2e 0d 0a 20 20 20 20 20  prologue...     
4470: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
4480: 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a   true..    }....
4490: 20 20 20 20 73 65 74 20 72 65 61 73 6f 6e 20 22      set reason "
44a0: 73 6b 69 70 70 65 64 2c 20 6e 65 65 64 20 45 61  skipped, need Ea
44b0: 67 6c 65 22 0d 0a 20 20 20 20 72 65 74 75 72 6e  gle"..    return
44c0: 20 66 61 6c 73 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a   false..  }.....
44d0: 20 20 70 72 6f 63 20 63 6c 65 61 6e 43 6f 6e 73    proc cleanCons
44e0: 74 72 61 69 6e 74 4e 61 6d 65 20 7b 20 6e 61 6d  traintName { nam
44f0: 65 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  e } {..    #..  
4500: 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20    # NOTE: Start 
4510: 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61  with the origina
4520: 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d  l constraint nam
4530: 65 2c 20 72 65 6d 6f 76 69 6e 67 20 73 75 72 72  e, removing surr
4540: 6f 75 6e 64 69 6e 67 0d 0a 20 20 20 20 23 20 20  ounding..    #  
4550: 20 20 20 20 20 77 68 69 74 65 73 70 61 63 65 2e       whitespace.
4560: 20 20 49 66 20 74 68 69 73 20 72 65 73 75 6c 74    If this result
4570: 73 20 69 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  s in an empty st
4580: 72 69 6e 67 2c 20 77 65 20 61 72 65 20 64 6f 6e  ring, we are don
4590: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  e...    #..    s
45a0: 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72 69 6e  et result [strin
45b0: 67 20 74 72 69 6d 20 24 6e 61 6d 65 5d 0d 0a 0d  g trim $name]...
45c0: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
45d0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d   length $result]
45e0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
45f0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
4600: 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ult..    }....  
4610: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
4620: 20 54 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   The constraints
4630: 20 66 6f 72 20 61 20 74 65 73 74 20 61 72 65 20   for a test are 
4640: 61 63 74 75 61 6c 6c 79 20 61 20 6c 69 73 74 3b  actually a list;
4650: 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 0d 0a   therefore, we..
4660: 20 20 20 20 23 20 20 20 20 20 20 20 6d 75 73 74      #       must
4670: 20 72 65 6d 6f 76 65 20 61 6e 79 74 68 69 6e 67   remove anything
4680: 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 66   that might conf
4690: 75 73 65 20 74 68 65 20 6c 69 73 74 20 70 61 72  use the list par
46a0: 73 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ser...    #..   
46b0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72   set result [str
46c0: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 22  ing map [list \"
46d0: 20 22 22 20 5c 5c 20 22 22 20 5c 7b 20 22 22 20   "" \\ "" \{ "" 
46e0: 5c 7d 20 22 22 5d 20 24 72 65 73 75 6c 74 5d 0d  \} ""] $result].
46f0: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
4700: 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72 20 74  NOTE: In order t
4710: 6f 20 61 76 6f 69 64 20 73 65 6d 61 6e 74 69 63  o avoid semantic
4720: 20 63 6f 6e 66 75 73 69 6f 6e 2c 20 72 65 6d 6f   confusion, remo
4730: 76 65 20 6f 74 68 65 72 20 63 68 61 72 61 63 74  ve other charact
4740: 65 72 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20  ers..    #      
4750: 20 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 73   that may be res
4760: 65 72 76 65 64 20 62 79 20 74 68 65 20 74 65 73  erved by the tes
4770: 74 20 73 75 69 74 65 20 73 75 62 73 79 73 74 65  t suite subsyste
4780: 6d 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ms...    #..    
4790: 73 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72 69  set result [stri
47a0: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 21 20 22  ng map [list ! "
47b0: 22 20 23 20 22 22 20 5c 24 20 22 22 20 5c 3b 20  " # "" \$ "" \; 
47c0: 22 22 20 5c 5b 20 22 22 20 5c 5d 20 22 22 5d 20  "" \[ "" \] ""] 
47d0: 24 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20  $result]....    
47e0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  #..    # NOTE: F
47f0: 69 6e 61 6c 6c 79 2c 20 72 65 6d 6f 76 65 20 61  inally, remove a
4800: 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 77 68 69  ll remaining whi
4810: 74 65 73 70 61 63 65 2e 0d 0a 20 20 20 20 23 0d  tespace...    #.
4820: 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c  .    regsub -all
4830: 20 2d 2d 20 7b 5c 73 7d 20 24 72 65 73 75 6c 74   -- {\s} $result
4840: 20 22 22 20 72 65 73 75 6c 74 3b 20 72 65 74 75   "" result; retu
4850: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 7d 0d  rn $result..  }.
4860: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 6c 65 61 6e  ....  proc clean
4870: 50 61 63 6b 61 67 65 4e 61 6d 65 20 7b 20 70 61  PackageName { pa
4880: 63 6b 61 67 65 20 66 75 6c 6c 20 7d 20 7b 0d 0a  ckage full } {..
4890: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
48a0: 45 3a 20 53 74 61 72 74 20 6f 75 74 20 77 69 74  E: Start out wit
48b0: 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  h the original p
48c0: 61 63 6b 61 67 65 20 6e 61 6d 65 2c 20 72 65 6d  ackage name, rem
48d0: 6f 76 69 6e 67 20 73 75 72 72 6f 75 6e 64 69 6e  oving surroundin
48e0: 67 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 77  g..    #       w
48f0: 68 69 74 65 73 70 61 63 65 2e 20 20 49 66 20 74  hitespace.  If t
4900: 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
4910: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
4920: 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d 0a 20 20  we are done...  
4930: 20 20 23 0d 0a 20 20 20 20 73 65 74 20 72 65 73    #..    set res
4940: 75 6c 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  ult [string trim
4950: 20 24 70 61 63 6b 61 67 65 5d 0d 0a 0d 0a 20 20   $package]....  
4960: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
4970: 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3d 3d  ngth $result] ==
4980: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4990: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
49a0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
49b0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66  ..    # NOTE: If
49c0: 20 74 68 65 20 66 75 6c 6c 20 70 61 63 6b 61 67   the full packag
49d0: 65 20 6e 61 6d 65 20 69 73 20 4e 4f 54 20 77 61  e name is NOT wa
49e0: 6e 74 65 64 2c 20 75 73 65 20 74 68 65 20 73 68  nted, use the sh
49f0: 6f 72 74 20 6e 61 6d 65 2e 20 20 49 74 0d 0a 20  ort name.  It.. 
4a00: 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20     #       will 
4a10: 62 65 20 77 68 61 74 65 76 65 72 20 6f 63 63 75  be whatever occu
4a20: 72 73 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  rs before the fi
4a30: 72 73 74 20 63 6f 6d 6d 61 2e 20 20 49 66 20 74  rst comma.  If t
4a40: 68 69 73 20 72 65 73 75 6c 74 73 0d 0a 20 20 20  his results..   
4a50: 20 23 20 20 20 20 20 20 20 69 6e 20 61 6e 20 65   #       in an e
4a60: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 77 65 20  mpty string, we 
4a70: 61 72 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 23  are done...    #
4a80: 0d 0a 20 20 20 20 69 66 20 7b 21 24 66 75 6c 6c  ..    if {!$full
4a90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4aa0: 73 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72 69  set result [stri
4ab0: 6e 67 20 74 72 69 6d 20 5b 6c 69 6e 64 65 78 20  ng trim [lindex 
4ac0: 5b 73 70 6c 69 74 20 24 72 65 73 75 6c 74 20 2c  [split $result ,
4ad0: 5d 20 30 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  ] 0]]....      i
4ae0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
4af0: 68 20 24 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  h $result] == 0}
4b00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4b10: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
4b20: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
4b30: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
4b40: 48 41 43 4b 3a 20 54 68 69 73 20 69 73 20 74 68  HACK: This is th
4b50: 65 20 6c 69 73 74 20 6f 66 20 22 73 70 65 63 69  e list of "speci
4b60: 61 6c 22 20 63 68 61 72 61 63 74 65 72 73 20 74  al" characters t
4b70: 68 61 74 20 61 72 65 20 64 6f 63 75 6d 65 6e 74  hat are document
4b80: 65 64 20 74 6f 0d 0a 20 20 20 20 23 20 20 20 20  ed to..    #    
4b90: 20 20 20 62 65 20 75 73 65 64 20 77 68 65 6e 20     be used when 
4ba0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 66 75 6c  constructing ful
4bb0: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 2e 4e 45  ly qualified .NE
4bc0: 54 20 46 72 61 6d 65 77 6f 72 6b 20 74 79 70 65  T Framework type
4bd0: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 6e 61  ..    #       na
4be0: 6d 65 73 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74  mes.  For now, t
4bf0: 68 65 79 20 61 72 65 20 61 6c 6c 20 72 65 70 6c  hey are all repl
4c00: 61 63 65 64 20 77 69 74 68 20 75 6e 64 65 72 73  aced with unders
4c10: 63 6f 72 65 73 20 62 79 20 74 68 69 73 0d 0a 20  cores by this.. 
4c20: 20 20 20 23 20 20 20 20 20 20 20 70 72 6f 63 65     #       proce
4c30: 64 75 72 65 2e 20 20 41 6e 79 20 65 78 69 73 74  dure.  Any exist
4c40: 69 6e 67 20 75 6e 64 65 72 73 63 6f 72 65 73 20  ing underscores 
4c50: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61 72  in the string ar
4c60: 65 20 64 6f 75 62 6c 65 64 2e 0d 0a 20 20 20 20  e doubled...    
4c70: 23 0d 0a 20 20 20 20 73 65 74 20 63 68 61 72 4d  #..    set charM
4c80: 61 70 20 5b 6c 69 73 74 20 5f 20 5f 5f 20 22 20  ap [list _ __ " 
4c90: 22 20 5f 20 2b 20 5f 20 2c 20 5f 20 2e 20 5f 20  " _ + _ , _ . _ 
4ca0: 3d 20 5f 20 5c 5b 20 5f 20 5c 5c 20 5f 20 5c 5d  = _ \[ _ \\ _ \]
4cb0: 20 5f 20 60 20 5f 5d 0d 0a 0d 0a 20 20 20 20 72   _ ` _]....    r
4cc0: 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d 61  eturn [string ma
4cd0: 70 20 24 63 68 61 72 4d 61 70 20 24 72 65 73 75  p $charMap $resu
4ce0: 6c 74 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  lt]..  }.....  p
4cf0: 72 6f 63 20 68 61 76 65 54 63 6c 50 6c 61 74 66  roc haveTclPlatf
4d00: 6f 72 6d 4f 73 45 78 74 72 61 55 70 64 61 74 65  ormOsExtraUpdate
4d10: 4e 61 6d 65 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d  Name { name } {.
4d20: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
4d30: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
4d40: 66 6f 72 6d 28 6f 73 45 78 74 72 61 29 5d 7d 20  form(osExtra)]} 
4d50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65  then {..      se
4d60: 74 20 75 70 64 61 74 65 4e 61 6d 65 73 20 5b 67  t updateNames [g
4d70: 65 74 44 69 63 74 69 6f 6e 61 72 79 56 61 6c 75  etDictionaryValu
4d80: 65 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  e $::tcl_platfor
4d90: 6d 28 6f 73 45 78 74 72 61 29 20 5c 0d 0a 20 20  m(osExtra) \..  
4da0: 20 20 20 20 20 20 20 20 55 70 64 61 74 65 4e 61          UpdateNa
4db0: 6d 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  mes]....      if
4dc0: 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
4dd0: 74 20 24 75 70 64 61 74 65 4e 61 6d 65 73 20 24  t $updateNames $
4de0: 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65  name] != -1} the
4df0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
4e00: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
4e10: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
4e20: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
4e30: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
4e40: 63 6b 46 6f 72 54 65 73 74 53 75 69 74 65 46 69  ckForTestSuiteFi
4e50: 6c 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  les { channel } 
4e60: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
4e70: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
4e80: 6b 69 6e 67 20 66 6f 72 20 74 65 73 74 20 73 75  king for test su
4e90: 69 74 65 20 66 69 6c 65 73 2e 2e 2e 20 22 0d 0a  ite files... "..
4ea0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
4eb0: 4f 54 45 3a 20 53 74 61 72 74 20 6f 75 74 20 77  OTE: Start out w
4ec0: 69 74 68 20 6e 6f 20 74 65 73 74 20 73 75 69 74  ith no test suit
4ed0: 65 20 66 69 6c 65 73 20 74 6f 20 63 68 65 63 6b  e files to check
4ee0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65  ...    #..    se
4ef0: 74 20 66 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  t fileNames [lis
4f00: 74 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  t]....    #..   
4f10: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
4f20: 66 20 74 68 65 20 62 61 73 65 20 70 61 63 6b 61  f the base packa
4f30: 67 65 20 70 61 74 68 20 69 73 20 61 76 61 69 6c  ge path is avail
4f40: 61 62 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  able...    #..  
4f50: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
4f60: 74 73 20 3a 3a 74 65 73 74 5f 70 61 63 6b 61 67  ts ::test_packag
4f70: 65 5f 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d  e_path]} then {.
4f80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4f90: 23 20 54 4f 44 4f 3a 20 49 66 20 61 64 64 69 74  # TODO: If addit
4fa0: 69 6f 6e 61 6c 20 74 65 73 74 20 73 75 69 74 65  ional test suite
4fb0: 20 66 69 6c 65 73 20 61 72 65 20 61 64 64 65 64   files are added
4fc0: 20 77 69 74 68 69 6e 20 74 68 65 20 62 61 73 65   within the base
4fd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4fe0: 70 61 63 6b 61 67 65 20 70 61 74 68 2c 20 61 64  package path, ad
4ff0: 64 20 74 68 65 6d 20 68 65 72 65 20 61 73 20 77  d them here as w
5000: 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ell...      #.. 
5010: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
5020: 65 4e 61 6d 65 4f 6e 6c 79 20 5b 6c 69 73 74 20  eNameOnly [list 
5030: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 61 75 78  \..          aux
5040: 69 6c 69 61 72 79 2e 65 61 67 6c 65 20 63 6f 6d  iliary.eagle com
5050: 70 61 74 2e 65 61 67 6c 65 20 63 73 68 61 72 70  pat.eagle csharp
5060: 2e 65 61 67 6c 65 20 64 61 74 61 62 61 73 65 2e  .eagle database.
5070: 65 61 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  eagle \..       
5080: 20 20 20 65 6d 62 65 64 2e 65 61 67 6c 65 20 65     embed.eagle e
5090: 78 65 63 2e 65 61 67 6c 65 20 66 69 6c 65 31 2e  xec.eagle file1.
50a0: 65 61 67 6c 65 20 66 69 6c 65 32 2e 65 61 67 6c  eagle file2.eagl
50b0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 66  e \..          f
50c0: 69 6c 65 33 2e 65 61 67 6c 65 20 69 6e 66 6f 2e  ile3.eagle info.
50d0: 65 61 67 6c 65 20 69 6e 69 74 2e 65 61 67 6c 65  eagle init.eagle
50e0: 20 6c 69 73 74 2e 65 61 67 6c 65 20 5c 0d 0a 20   list.eagle \.. 
50f0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 2e           object.
5100: 65 61 67 6c 65 20 70 6b 67 49 6e 64 65 78 2e 65  eagle pkgIndex.e
5110: 61 67 6c 65 20 70 6b 67 49 6e 64 65 78 2e 74 63  agle pkgIndex.tc
5120: 6c 20 70 6b 67 74 2e 65 61 67 6c 65 20 5c 0d 0a  l pkgt.eagle \..
5130: 20 20 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f            platfo
5140: 72 6d 2e 65 61 67 6c 65 20 70 72 6f 63 65 73 73  rm.eagle process
5150: 2e 65 61 67 6c 65 20 72 75 6e 6f 70 74 2e 65 61  .eagle runopt.ea
5160: 67 6c 65 20 73 61 66 65 2e 65 61 67 6c 65 20 5c  gle safe.eagle \
5170: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 65 6c  ..          shel
5180: 6c 2e 65 61 67 6c 65 20 73 68 69 6d 2e 65 61 67  l.eagle shim.eag
5190: 6c 65 20 74 65 73 74 2e 65 61 67 6c 65 20 74 65  le test.eagle te
51a0: 73 74 6c 6f 67 2e 65 61 67 6c 65 20 5c 0d 0a 20  stlog.eagle \.. 
51b0: 20 20 20 20 20 20 20 20 20 75 6e 6b 6f 62 6a 2e           unkobj.
51c0: 65 61 67 6c 65 20 75 6e 7a 69 70 2e 65 61 67 6c  eagle unzip.eagl
51d0: 65 20 75 70 64 61 74 65 2e 65 61 67 6c 65 20 76  e update.eagle v
51e0: 65 6e 64 6f 72 2e 65 61 67 6c 65 20 5c 0d 0a 20  endor.eagle \.. 
51f0: 20 20 20 20 20 20 20 20 20 77 6f 72 64 2e 74 63           word.tc
5200: 6c 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  l] {..        #.
5210: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
5220: 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66   First, check if
5230: 20 74 68 65 20 66 69 6c 65 20 72 65 73 69 64 65   the file reside
5240: 73 20 69 6e 20 74 68 65 20 45 61 67 6c 65 2d 73  s in the Eagle-s
5250: 70 65 63 69 66 69 63 0d 0a 20 20 20 20 20 20 20  pecific..       
5260: 20 23 20 20 20 20 20 20 20 70 61 63 6b 61 67 65   #       package
5270: 20 73 75 62 2d 64 69 72 65 63 74 6f 72 79 2e 20   sub-directory. 
5280: 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 66   Failing that, f
5290: 61 6c 6c 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  allback to using
52a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
52b0: 20 20 74 68 65 20 62 61 73 65 20 70 61 63 6b 61    the base packa
52c0: 67 65 20 70 61 74 68 20 69 74 73 65 6c 66 2e 0d  ge path itself..
52d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
52e0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
52f0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
5300: 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 65             $::te
5310: 73 74 5f 70 61 63 6b 61 67 65 5f 70 61 74 68 20  st_package_path 
5320: 45 61 67 6c 65 31 2e 30 20 24 66 69 6c 65 4e 61  Eagle1.0 $fileNa
5330: 6d 65 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20  meOnly]....     
5340: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
5350: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5360: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5370: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5380: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 74 65  [file join $::te
5390: 73 74 5f 70 61 63 6b 61 67 65 5f 70 61 74 68 20  st_package_path 
53a0: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d 0a  $fileNameOnly]..
53b0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
53c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
53d0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74  # NOTE: If the t
53e0: 65 73 74 20 73 75 69 74 65 20 66 69 6c 65 20 65  est suite file e
53f0: 78 69 73 74 73 2c 20 61 64 64 20 69 74 20 74 6f  xists, add it to
5400: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 69 6c   the list of fil
5410: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
5420: 20 20 20 6e 61 6d 65 73 20 74 6f 20 70 72 6f 63     names to proc
5430: 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess...        #.
5440: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
5450: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
5460: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
5470: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
5480: 66 69 6c 65 4e 61 6d 65 73 20 24 66 69 6c 65 4e  fileNames $fileN
5490: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
54a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
54b0: 20 23 0d 0a 20 20 20 20 20 20 23 20 54 4f 44 4f   #..      # TODO
54c0: 3a 20 49 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  : If additional 
54d0: 74 65 73 74 20 73 75 69 74 65 20 66 69 6c 65 73  test suite files
54e0: 20 61 72 65 20 61 64 64 65 64 20 77 69 74 68 69   are added withi
54f0: 6e 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20  n the test..    
5500: 20 20 23 20 20 20 20 20 20 20 70 61 63 6b 61 67    #       packag
5510: 65 20 70 61 74 68 2c 20 61 64 64 20 74 68 65 6d  e path, add them
5520: 20 68 65 72 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   here as well...
5530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
5540: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
5550: 6e 6c 79 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  nly [list \..   
5560: 20 20 20 20 20 20 20 61 6c 6c 2e 65 61 67 6c 65         all.eagle
5570: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 65 61 67   constraints.eag
5580: 6c 65 20 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c  le epilogue.eagl
5590: 65 20 70 6b 67 49 6e 64 65 78 2e 65 61 67 6c 65  e pkgIndex.eagle
55a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 70 6b   \..          pk
55b0: 67 49 6e 64 65 78 2e 74 63 6c 20 70 72 6f 6c 6f  gIndex.tcl prolo
55c0: 67 75 65 2e 65 61 67 6c 65 5d 20 7b 0d 0a 20 20  gue.eagle] {..  
55d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
55e0: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
55f0: 63 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  check if the fil
5600: 65 20 72 65 73 69 64 65 73 20 69 6e 20 74 68 65  e resides in the
5610: 20 45 61 67 6c 65 2d 73 70 65 63 69 66 69 63 0d   Eagle-specific.
5620: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5630: 20 70 61 63 6b 61 67 65 20 73 75 62 2d 64 69 72   package sub-dir
5640: 65 63 74 6f 72 79 2e 20 20 46 61 69 6c 69 6e 67  ectory.  Failing
5650: 20 74 68 61 74 2c 20 66 61 6c 6c 62 61 63 6b 20   that, fallback 
5660: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
5670: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 62 61    #       the ba
5680: 73 65 20 70 61 63 6b 61 67 65 20 70 61 74 68 20  se package path 
5690: 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20  itself...       
56a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
56b0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
56c0: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
56d0: 20 20 20 24 3a 3a 74 65 73 74 5f 70 61 63 6b 61     $::test_packa
56e0: 67 65 5f 70 61 74 68 20 54 65 73 74 31 2e 30 20  ge_path Test1.0 
56f0: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d 0a  $fileNameOnly]..
5700: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
5710: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
5720: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
5730: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
5740: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
5750: 6e 20 24 3a 3a 74 65 73 74 5f 70 61 63 6b 61 67  n $::test_packag
5760: 65 5f 70 61 74 68 20 24 66 69 6c 65 4e 61 6d 65  e_path $fileName
5770: 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Only]..        }
5780: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
5790: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
57a0: 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
57b0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 64   file exists, ad
57c0: 64 20 69 74 20 74 6f 20 74 68 65 20 6c 69 73 74  d it to the list
57d0: 20 6f 66 20 66 69 6c 65 0d 0a 20 20 20 20 20 20   of file..      
57e0: 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20    #       names 
57f0: 74 6f 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  to process...   
5800: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5810: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
5820: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
5830: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
5840: 61 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73  append fileNames
5850: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
5860: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
5870: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a      }....    #..
5880: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
5890: 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 70 61  k if the test pa
58a0: 63 6b 61 67 65 20 70 61 74 68 20 69 73 20 61 76  ckage path is av
58b0: 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 23 0d  ailable...    #.
58c0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
58d0: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 61 74  xists ::test_pat
58e0: 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  h]} then {..    
58f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 54 4f 44    #..      # TOD
5900: 4f 3a 20 49 66 20 61 64 64 69 74 69 6f 6e 61 6c  O: If additional
5910: 20 74 65 73 74 20 73 75 69 74 65 20 66 69 6c 65   test suite file
5920: 73 20 61 72 65 20 61 64 64 65 64 20 77 69 74 68  s are added with
5930: 69 6e 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  in the test..   
5940: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
5950: 20 70 61 74 68 2c 20 61 64 64 20 74 68 65 6d 20   path, add them 
5960: 68 65 72 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20  here as well... 
5970: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
5980: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
5990: 6c 79 20 5b 6c 69 73 74 20 61 6c 6c 2e 65 61 67  ly [list all.eag
59a0: 6c 65 20 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c  le epilogue.eagl
59b0: 65 20 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65  e prologue.eagle
59c0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ] {..        #..
59d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
59e0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
59f0: 65 20 72 65 73 69 64 65 73 20 69 6e 20 74 68 65  e resides in the
5a00: 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 64 69   test package di
5a10: 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20  rectory...      
5a20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
5a30: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
5a40: 6a 6f 69 6e 20 24 3a 3a 74 65 73 74 5f 70 61 74  join $::test_pat
5a50: 68 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  h $fileNameOnly]
5a60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
5a70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
5a80: 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
5a90: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 64   file exists, ad
5aa0: 64 20 69 74 20 74 6f 20 74 68 65 20 6c 69 73 74  d it to the list
5ab0: 20 6f 66 20 66 69 6c 65 0d 0a 20 20 20 20 20 20   of file..      
5ac0: 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20    #       names 
5ad0: 74 6f 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  to process...   
5ae0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5af0: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
5b00: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
5b10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
5b20: 61 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73  append fileNames
5b30: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
5b40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
5b50: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a      }....    #..
5b60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20      # NOTE: Did 
5b70: 77 65 20 66 69 6e 64 20 61 6e 79 20 74 65 73 74  we find any test
5b80: 20 73 75 69 74 65 20 66 69 6c 65 73 3f 0d 0a 20   suite files?.. 
5b90: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 6c     #..    if {[l
5ba0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
5bb0: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
5bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5bd0: 20 4e 4f 54 45 3a 20 45 61 67 6c 65 20 68 61 73   NOTE: Eagle has
5be0: 20 61 20 62 75 69 6c 74 2d 69 6e 20 68 61 73 68   a built-in hash
5bf0: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3b 20 68 6f 77  ing command; how
5c00: 65 76 65 72 2c 20 54 63 6c 20 72 65 71 75 69 72  ever, Tcl requir
5c10: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
5c20: 20 20 61 20 70 61 63 6b 61 67 65 2e 20 20 4d 61    a package.  Ma
5c30: 6b 65 20 73 75 72 65 20 77 65 20 63 61 6e 20 68  ke sure we can h
5c40: 61 73 68 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  ash content befo
5c50: 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 0d 0a  re proceeding...
5c60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5c70: 66 20 7b 5b 69 73 45 61 67 6c 65 5d 20 7c 7c 20  f {[isEagle] || 
5c80: 5b 63 61 74 63 68 20 7b 70 61 63 6b 61 67 65 20  [catch {package 
5c90: 72 65 71 75 69 72 65 20 73 68 61 31 7d 5d 20 3d  require sha1}] =
5ca0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
5cb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
5cc0: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20  nel yes\n....   
5cd0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
5ce0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73  eName $fileNames
5cf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
5d00: 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
5d10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
5d20: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
5d30: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
5d40: 72 65 6c 61 74 69 76 65 6c 79 20 6e 65 77 20 2d  relatively new -
5d50: 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 20  filename option 
5d60: 74 6f 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  to the Eagle..  
5d70: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
5d80: 20 20 5b 68 61 73 68 5d 20 63 6f 6d 6d 61 6e 64    [hash] command
5d90: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
5da0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
5db0: 74 20 73 68 61 31 20 5b 68 61 73 68 20 6e 6f 72  t sha1 [hash nor
5dc0: 6d 61 6c 20 2d 66 69 6c 65 6e 61 6d 65 20 73 68  mal -filename sh
5dd0: 61 31 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  a1 $fileName].. 
5de0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5df0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
5e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
5e10: 42 55 47 42 55 47 3a 20 41 70 70 61 72 65 6e 74  BUGBUG: Apparent
5e20: 6c 79 2c 20 74 68 65 20 41 63 74 69 76 65 53 74  ly, the ActiveSt
5e30: 61 74 65 20 74 63 6c 6c 69 62 20 73 68 61 31 20  ate tcllib sha1 
5e40: 70 61 63 6b 61 67 65 20 6d 61 79 0d 0a 20 20 20  package may..   
5e50: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
5e60: 20 20 20 68 61 76 65 20 61 20 62 75 67 20 74 68     have a bug th
5e70: 61 74 20 70 72 6f 64 75 63 65 73 20 74 68 65 20  at produces the 
5e80: 77 72 6f 6e 67 20 76 61 6c 75 65 73 20 68 65 72  wrong values her
5e90: 65 2e 20 20 4e 6f 0d 0a 20 20 20 20 20 20 20 20  e.  No..        
5ea0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 61 74      #         at
5eb0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 68 65  tempt is made he
5ec0: 72 65 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  re to work aroun
5ed0: 64 20 61 6e 79 20 73 75 63 68 20 62 75 67 2e 0d  d any such bug..
5ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
5ef0: 20 20 20 20 20 20 20 46 6f 72 20 66 75 72 74 68         For furth
5f00: 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20  er information, 
5f10: 70 6c 65 61 73 65 20 73 65 65 3a 0d 0a 20 20 20  please see:..   
5f20: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5f30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5f40: 20 20 68 74 74 70 73 3a 2f 2f 63 6f 72 65 2e 74    https://core.t
5f50: 63 6c 2e 74 6b 2f 74 63 6c 6c 69 62 2f 69 6e 66  cl.tk/tcllib/inf
5f60: 6f 2f 61 64 32 30 34 35 34 30 32 33 0d 0a 20 20  o/ad20454023..  
5f70: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
5f80: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 68 61           set sha
5f90: 31 20 5b 73 68 61 31 3a 3a 73 68 61 31 20 2d 68  1 [sha1::sha1 -h
5fa0: 65 78 20 2d 66 69 6c 65 6e 61 6d 65 20 24 66 69  ex -filename $fi
5fb0: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
5fc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5fd0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
5fe0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
6000: 2d 2d 2d 20 66 69 6c 65 20 5c 22 22 20 24 66 69  --- file \"" $fi
6010: 6c 65 4e 61 6d 65 20 22 5c 22 2e 2e 2e 20 73 68  leName "\"... sh
6020: 61 31 20 28 22 20 24 73 68 61 31 20 22 29 5c 6e  a1 (" $sha1 ")\n
6030: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
6040: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6050: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
6060: 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65  re done here, re
6070: 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  turn now...     
6080: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
6090: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  turn..      }.. 
60a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74     }....    tput
60b0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
60c0: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
60d0: 63 68 65 63 6b 46 6f 72 50 6c 61 74 66 6f 72 6d  checkForPlatform
60e0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
60f0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
6100: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
6110: 67 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 2e 2e  g for platform..
6120: 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  . "....    if {[
6130: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
6140: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
6150: 6f 72 6d 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  orm)]} then {.. 
6160: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
6170: 6e 74 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  nt $::tcl_platfo
6180: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 0d 0a 0d 0a  rm(platform)....
6190: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
61a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
61b0: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
61c0: 28 70 6c 61 74 66 6f 72 6d 29 20 5c 6e 5d 0d 0a  (platform) \n]..
61d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
61e0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
61f0: 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
6200: 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 23 23 23 23    }....    #####
6210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6250: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 69 66  ######....    if
6260: 20 7b 21 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68   {![isEagle]} th
6270: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
6280: 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 57       # BUGFIX: W
6290: 65 20 64 6f 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c  e do not normall
62a0: 79 20 77 61 6e 74 20 74 6f 20 73 6b 69 70 20 61  y want to skip a
62b0: 6e 79 20 4d 6f 6e 6f 20 62 75 67 73 20 69 6e 20  ny Mono bugs in 
62c0: 6e 61 74 69 76 65 20 54 63 6c 2e 0d 0a 20 20 20  native Tcl...   
62d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
62e0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
62f0: 6e 6f 28 72 75 6e 74 69 6d 65 56 65 72 73 69 6f  no(runtimeVersio
6300: 6e 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  n)]} then {..   
6310: 20 20 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e       addKnownMon
6320: 6f 43 6f 6e 73 74 72 61 69 6e 74 73 20 74 72 75  oConstraints tru
6330: 65 3b 20 23 20 72 75 6e 6e 69 6e 67 20 69 6e 20  e; # running in 
6340: 6e 61 74 69 76 65 20 54 63 6c 2e 0d 0a 20 20 20  native Tcl...   
6350: 20 20 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e       addKnownMon
6360: 6f 43 6f 6e 73 74 72 61 69 6e 74 73 20 66 61 6c  oConstraints fal
6370: 73 65 3b 20 23 20 72 75 6e 6e 69 6e 67 20 69 6e  se; # running in
6380: 20 6e 61 74 69 76 65 20 54 63 6c 2e 0d 0a 20 20   native Tcl...  
6390: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
63a0: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
63b0: 63 6b 46 6f 72 57 69 6e 64 6f 77 73 56 65 72 73  ckForWindowsVers
63c0: 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ion { channel } 
63d0: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
63e0: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
63f0: 6b 69 6e 67 20 66 6f 72 20 57 69 6e 64 6f 77 73  king for Windows
6400: 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d   version... "...
6410: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
6420: 54 45 3a 20 41 72 65 20 77 65 20 72 75 6e 6e 69  TE: Are we runni
6430: 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 61 74  ng on Windows at
6440: 20 61 6c 6c 3f 0d 0a 20 20 20 20 23 0d 0a 20 20   all?..    #..  
6450: 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
6460: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
6470: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6480: 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66 69  : Is the specifi
6490: 63 20 4f 53 20 6e 61 6d 65 20 61 6e 64 20 76 65  c OS name and ve
64a0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 76 61  rsion number ava
64b0: 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23  ilable?..      #
64c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
64d0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
64e0: 6c 61 74 66 6f 72 6d 28 6f 73 29 5d 20 26 26 20  latform(os)] && 
64f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
6500: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
6510: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 5d  cl_platform(os)]
6520: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
6530: 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74       [info exist
6540: 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
6550: 28 6f 73 56 65 72 73 69 6f 6e 29 5d 20 26 26 20  (osVersion)] && 
6560: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
6570: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
6580: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
6590: 72 73 69 6f 6e 29 5d 20 3e 20 30 20 26 26 20 5c  rsion)] > 0 && \
65a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 72 65 67  ..          [reg
65b0: 65 78 70 20 2d 2d 20 7b 5e 5c 64 2b 5c 2e 5c 64  exp -- {^\d+\.\d
65c0: 2b 24 7d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  +$} $::tcl_platf
65d0: 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d 7d  orm(osVersion)]}
65e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
65f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6600: 54 45 3a 20 47 72 61 62 20 74 68 65 20 72 65 70  TE: Grab the rep
6610: 6f 72 74 65 64 20 57 69 6e 64 6f 77 73 20 76 65  orted Windows ve
6620: 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  rsion...        
6630: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6f  #..        set o
6640: 73 56 65 72 73 69 6f 6e 20 24 3a 3a 74 63 6c 5f  sVersion $::tcl_
6650: 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69  platform(osVersi
6660: 6f 6e 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  on)....        #
6670: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6680: 3a 20 44 6f 75 62 6c 65 20 63 68 65 63 6b 20 74  : Double check t
6690: 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 62  hat we are not b
66a0: 65 69 6e 67 20 6c 69 65 64 20 74 6f 20 62 79 20  eing lied to by 
66b0: 57 69 6e 64 6f 77 73 0d 0a 20 20 20 20 20 20 20  Windows..       
66c0: 20 23 20 20 20 20 20 20 20 61 62 6f 75 74 20 69   #       about i
66d0: 74 73 20 72 65 61 6c 20 76 65 72 73 69 6f 6e 20  ts real version 
66e0: 6e 75 6d 62 65 72 2e 0d 0a 20 20 20 20 20 20 20  number...       
66f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
6700: 65 78 74 72 61 20 22 22 0d 0a 0d 0a 20 20 20 20  extra ""....    
6710: 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63      if {[canExec
6720: 43 6f 6d 53 70 65 63 5d 20 26 26 20 5b 69 6e 66  ComSpec] && [inf
6730: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43  o exists ::env(C
6740: 6f 6d 53 70 65 63 29 5d 7d 20 74 68 65 6e 20 7b  omSpec)]} then {
6750: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
6760: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
6770: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
6780: 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 73 20 63  of the Windows c
6790: 6f 6d 6d 61 6e 64 20 70 72 6f 63 65 73 73 6f 72  ommand processor
67a0: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 23   to..          #
67b0: 20 20 20 20 20 20 20 72 75 6e 20 69 74 73 20 69         run its i
67c0: 6e 74 65 72 6e 61 6c 20 56 45 52 20 63 6f 6d 6d  nternal VER comm
67d0: 61 6e 64 2c 20 77 68 69 63 68 20 61 70 70 65 61  and, which appea
67e0: 72 73 20 74 6f 20 61 6c 77 61 79 73 0d 0a 20 20  rs to always..  
67f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6800: 72 65 70 6f 72 74 20 74 68 65 20 72 65 61 6c 20  report the real 
6810: 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f 6e 20  Windows version 
6820: 6e 75 6d 62 65 72 2e 0d 0a 20 20 20 20 20 20 20  number...       
6830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
6840: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
6850: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20 24            exec $
6860: 3a 3a 65 6e 76 28 43 6f 6d 53 70 65 63 29 20 2f  ::env(ComSpec) /
6870: 43 20 56 45 52 0d 0a 20 20 20 20 20 20 20 20 20  C VER..         
6880: 20 7d 20 63 6f 6d 53 70 65 63 56 65 72 73 69 6f   } comSpecVersio
6890: 6e 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20  n] == 0 && \..  
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 72 65 67              [reg
68b0: 65 78 70 20 2d 2d 20 7b 56 65 72 73 69 6f 6e 20  exp -- {Version 
68c0: 28 5c 64 2b 5c 2e 5c 64 2b 29 7d 20 24 63 6f 6d  (\d+\.\d+)} $com
68d0: 53 70 65 63 56 65 72 73 69 6f 6e 20 5c 0d 0a 20  SpecVersion \.. 
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 75 6d               dum
68f0: 6d 79 20 63 6f 6d 53 70 65 63 56 65 72 73 69 6f  my comSpecVersio
6900: 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
6910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6920: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
6930: 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 70 6f  f the value repo
6940: 72 74 65 64 20 74 6f 20 74 68 65 20 70 72 6f 63  rted to the proc
6950: 65 73 73 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ess does not mat
6960: 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch..            
6970: 23 20 20 20 20 20 20 20 74 68 65 20 76 61 6c 75  #       the valu
6980: 65 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  e returned from 
6990: 74 68 65 20 57 69 6e 64 6f 77 73 20 63 6f 6d 6d  the Windows comm
69a0: 61 6e 64 20 70 72 6f 63 65 73 73 6f 72 2c 0d 0a  and processor,..
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
69c0: 20 20 20 20 72 65 70 6c 61 63 65 20 69 74 2e 20      replace it. 
69d0: 20 57 65 20 6d 75 73 74 20 6b 6e 6f 77 20 74 68   We must know th
69e0: 65 20 72 65 61 6c 20 57 69 6e 64 6f 77 73 20 76  e real Windows v
69f0: 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ersion...       
6a00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6a10: 20 20 20 20 69 66 20 7b 24 6f 73 56 65 72 73 69      if {$osVersi
6a20: 6f 6e 20 65 71 20 24 63 6f 6d 53 70 65 63 56 65  on eq $comSpecVe
6a30: 72 73 69 6f 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20  rsion} then {.. 
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
6a50: 20 65 78 74 72 61 20 22 2d 2d 2d 2d 20 72 65 70   extra "---- rep
6a60: 6f 72 74 65 64 20 61 6e 64 20 64 65 74 65 63 74  orted and detect
6a70: 65 64 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69  ed Windows versi
6a80: 6f 6e 73 20 6d 61 74 63 68 5c 6e 22 0d 0a 20 20  ons match\n"..  
6a90: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
6aa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6ab0: 20 20 73 65 74 20 65 78 74 72 61 20 5b 61 70 70    set extra [app
6ac0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
6ae0: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 72 65 70 6f  == WARNING: repo
6af0: 72 74 65 64 20 61 6e 64 20 64 65 74 65 63 74 65  rted and detecte
6b00: 64 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f  d Windows versio
6b10: 6e 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ns " \..        
6b20: 20 20 20 20 20 20 20 20 20 20 22 64 6f 20 6e 6f            "do no
6b30: 74 20 6d 61 74 63 68 3a 20 22 20 24 6f 73 56 65  t match: " $osVe
6b40: 72 73 69 6f 6e 20 22 20 76 65 72 73 75 73 20 22  rsion " versus "
6b50: 20 24 63 6f 6d 53 70 65 63 56 65 72 73 69 6f 6e   $comSpecVersion
6b60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6b70: 20 20 20 20 20 20 22 2c 20 72 65 73 65 74 74 69        ", resetti
6b80: 6e 67 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  ng...\n"]....   
6b90: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
6ba0: 73 56 65 72 73 69 6f 6e 20 24 63 6f 6d 53 70 65  sVersion $comSpe
6bb0: 63 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  cVersion..      
6bc0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6bd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
6be0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6bf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
6c00: 61 72 74 20 6f 75 74 20 77 69 74 68 20 74 68 65  art out with the
6c10: 20 4f 53 20 6e 61 6d 65 2c 20 72 65 6d 6f 76 69   OS name, removi
6c20: 6e 67 20 61 6c 6c 20 73 70 61 63 65 73 20 61 6e  ng all spaces an
6c30: 64 20 74 68 65 6e 0d 0a 20 20 20 20 20 20 20 20  d then..        
6c40: 23 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 74  #       append t
6c50: 68 65 20 72 65 70 6f 72 74 65 64 20 28 6f 72 20  he reported (or 
6c60: 64 65 74 65 63 74 65 64 29 20 4f 53 20 76 65 72  detected) OS ver
6c70: 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d 0a 20 20  sion number...  
6c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6c90: 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 61 70   set version [ap
6ca0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
6cb0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6cc0: 6d 61 70 20 5b 6c 69 73 74 20 22 20 22 20 22 22  map [list " " ""
6cd0: 5d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ] $::tcl_platfor
6ce0: 6d 28 6f 73 29 5d 20 5f 20 5c 0d 0a 20 20 20 20  m(os)] _ \..    
6cf0: 20 20 20 20 20 20 20 20 24 6f 73 56 65 72 73 69          $osVersi
6d00: 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  on]....        #
6d10: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6d20: 3a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  : Add constraint
6d30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6d40: 4f 53 20 6e 61 6d 65 20 61 6e 64 20 76 65 72 73  OS name and vers
6d50: 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d 0a 20 20 20  ion number...   
6d60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6d70: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
6d80: 70 70 65 6e 64 41 72 67 73 20 6f 73 56 65 72 73  ppendArgs osVers
6d90: 69 6f 6e 2e 20 24 76 65 72 73 69 6f 6e 5d 0d 0a  ion. $version]..
6da0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6db0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
6dc0: 77 20 77 68 61 74 20 77 65 20 66 6f 75 6e 64 20  w what we found 
6dd0: 66 6f 72 20 74 68 65 20 4f 53 20 6e 61 6d 65 20  for the OS name 
6de0: 61 6e 64 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  and version numb
6df0: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
6e00: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
6e10: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
6e20: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
6e30: 20 20 22 79 65 73 20 28 22 20 24 3a 3a 74 63 6c    "yes (" $::tcl
6e40: 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 20 22 20  _platform(os) " 
6e50: 76 22 20 24 6f 73 56 65 72 73 69 6f 6e 20 22 29  v" $osVersion ")
6e60: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
6e70: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6e80: 45 3a 20 4c 6f 67 20 61 6e 79 20 65 78 74 72 61  E: Log any extra
6e90: 20 6d 65 73 73 61 67 65 20 6e 6f 77 2e 0d 0a 20   message now... 
6ea0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6eb0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
6ec0: 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30  ngth $extra] > 0
6ed0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6ee0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
6ef0: 65 6c 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20  el $extra..     
6f00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6f10: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6f20: 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68  E: We are done h
6f30: 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ere, return now.
6f40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6f50: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
6f60: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
6f70: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
6f80: 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a  l no\n..  }.....
6f90: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 4f    proc checkForO
6fa0: 70 65 72 61 74 69 6e 67 53 79 73 74 65 6d 55 70  peratingSystemUp
6fb0: 64 61 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  date { channel n
6fc0: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  ame } {..    tpu
6fd0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
6fe0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
6ff0: 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
7000: 67 20 66 6f 72 20 6f 70 65 72 61 74 69 6e 67 20  g for operating 
7010: 73 79 73 74 65 6d 20 75 70 64 61 74 65 20 5c 22  system update \"
7020: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 6e 61  " \..        $na
7030: 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  me "\"... "]....
7040: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
7050: 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66  E: Is the specif
7060: 69 63 20 4f 53 20 75 70 64 61 74 65 20 63 75 72  ic OS update cur
7070: 72 65 6e 74 6c 79 20 69 6e 73 74 61 6c 6c 65 64  rently installed
7080: 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ?..    #..    if
7090: 20 7b 5b 68 61 76 65 54 63 6c 50 6c 61 74 66 6f   {[haveTclPlatfo
70a0: 72 6d 4f 73 45 78 74 72 61 55 70 64 61 74 65 4e  rmOsExtraUpdateN
70b0: 61 6d 65 20 24 6e 61 6d 65 5d 7d 20 74 68 65 6e  ame $name]} then
70c0: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
70d0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
70e0: 72 67 73 20 6f 73 55 70 64 61 74 65 20 2e 20 5b  rgs osUpdate . [
70f0: 63 6c 65 61 6e 43 6f 6e 73 74 72 61 69 6e 74 4e  cleanConstraintN
7100: 61 6d 65 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a 20  ame $name]].... 
7110: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
7120: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
7130: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
7140: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
7150: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
7160: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
7170: 6f 72 53 63 72 69 70 74 4c 69 62 72 61 72 79 20  orScriptLibrary 
7180: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
7190: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
71a0: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
71b0: 20 66 6f 72 20 73 63 72 69 70 74 20 6c 69 62 72   for script libr
71c0: 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ary... "....    
71d0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  #..    # NOTE: S
71e0: 65 65 20 69 66 20 74 68 65 20 76 61 72 69 61 62  ee if the variab
71f0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
7200: 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  e script library
7210: 20 6c 6f 63 61 74 69 6f 6e 0d 0a 20 20 20 20 23   location..    #
7220: 20 20 20 20 20 20 20 65 78 69 73 74 73 2e 0d 0a         exists...
7230: 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
7240: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
7250: 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d  l_library] && \.
7260: 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67  .        [string
7270: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c   length $::tcl_l
7280: 69 62 72 61 72 79 5d 20 3e 20 30 7d 20 74 68 65  ibrary] > 0} the
7290: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
72a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20      # NOTE: Now 
72b0: 73 65 65 20 69 66 20 74 68 65 20 73 63 72 69 70  see if the scrip
72c0: 74 20 6c 69 62 72 61 72 79 20 69 73 20 65 78 74  t library is ext
72d0: 65 72 6e 61 6c 20 6f 72 20 65 6d 62 65 64 64 65  ernal or embedde
72e0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
72f0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 69 73 64     if {[file isd
7300: 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f  irectory $::tcl_
7310: 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b  library]} then {
7320: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7330: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
7340: 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  , it appears to 
7350: 62 65 20 61 20 64 69 72 65 63 74 6f 72 79 20 6e  be a directory n
7360: 61 6d 65 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  ame, which shoul
7370: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
7380: 20 20 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65     mean that the
7390: 20 6e 65 63 65 73 73 61 72 79 20 66 69 6c 65 73   necessary files
73a0: 20 61 72 65 20 70 68 79 73 69 63 61 6c 6c 79 20   are physically 
73b0: 63 6f 6e 74 61 69 6e 65 64 0d 0a 20 20 20 20 20  contained..     
73c0: 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68 69     #       withi
73d0: 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  n it...        #
73e0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
73f0: 73 74 72 61 69 6e 74 20 74 63 6c 5f 6c 69 62 72  straint tcl_libr
7400: 61 72 79 5f 65 78 74 65 72 6e 61 6c 0d 0a 0d 0a  ary_external....
7410: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
7420: 68 61 6e 6e 65 6c 20 22 79 65 73 20 28 65 78 74  hannel "yes (ext
7430: 65 72 6e 61 6c 29 5c 6e 22 0d 0a 0d 0a 20 20 20  ernal)\n"....   
7440: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7450: 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  # NOTE: We are d
7460: 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e  one here, return
7470: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
7480: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7490: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
74a0: 20 7b 5b 66 69 6c 65 20 69 73 66 69 6c 65 20 24   {[file isfile $
74b0: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20  ::tcl_library]} 
74c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
74d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
74e0: 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61  E: Yes, it appea
74f0: 72 73 20 74 6f 20 62 65 20 61 20 66 69 6c 65 20  rs to be a file 
7500: 6e 61 6d 65 2c 20 77 68 69 63 68 20 73 68 6f 75  name, which shou
7510: 6c 64 20 6d 65 61 6e 0d 0a 20 20 20 20 20 20 20  ld mean..       
7520: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 74 68   #       that th
7530: 65 20 6e 65 63 65 73 73 61 72 79 20 66 69 6c 65  e necessary file
7540: 73 20 61 72 65 20 70 68 79 73 69 63 61 6c 6c 79  s are physically
7550: 20 65 6d 62 65 64 64 65 64 20 77 69 74 68 69 6e   embedded within
7560: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7570: 20 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23    it...        #
7580: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
7590: 73 74 72 61 69 6e 74 20 74 63 6c 5f 6c 69 62 72  straint tcl_libr
75a0: 61 72 79 5f 65 6d 62 65 64 64 65 64 0d 0a 0d 0a  ary_embedded....
75b0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
75c0: 68 61 6e 6e 65 6c 20 22 79 65 73 20 28 65 6d 62  hannel "yes (emb
75d0: 65 64 64 65 64 29 5c 6e 22 0d 0a 0d 0a 20 20 20  edded)\n"....   
75e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
75f0: 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  # NOTE: We are d
7600: 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e  one here, return
7610: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
7620: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7630: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
7640: 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63  ....    tputs $c
7650: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d  hannel no\n..  }
7660: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
7670: 6b 46 6f 72 56 61 72 69 61 62 6c 65 20 7b 20 63  kForVariable { c
7680: 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7b 6e 6f 74  hannel name {not
7690: 45 6d 70 74 79 20 74 72 75 65 7d 20 7b 63 6f 6e  Empty true} {con
76a0: 73 74 72 61 69 6e 74 20 22 22 7d 20 7d 20 7b 0d  straint ""} } {.
76b0: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
76c0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
76d0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
76e0: 6f 72 20 76 61 72 69 61 62 6c 65 20 5c 22 22 20  or variable \"" 
76f0: 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  $name \..       
7700: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
7710: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
7720: 20 46 69 72 73 74 2c 20 6e 6f 72 6d 61 6c 69 7a   First, normaliz
7730: 65 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  e the variable n
7740: 61 6d 65 20 74 6f 20 62 65 20 69 6e 20 74 68 65  ame to be in the
7750: 20 67 6c 6f 62 61 6c 20 73 63 6f 70 65 2e 0d 0a   global scope...
7760: 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 6e      #..    set n
7770: 65 77 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  ewName [appendAr
7780: 67 73 20 3a 3a 20 5b 73 74 72 69 6e 67 20 74 72  gs :: [string tr
7790: 69 6d 6c 65 66 74 20 24 6e 61 6d 65 20 3a 5d 5d  imleft $name :]]
77a0: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
77b0: 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 61 6c 77   NOTE: Next, alw
77c0: 61 79 73 20 63 68 65 63 6b 20 69 66 20 69 74 20  ays check if it 
77d0: 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20  actually exists 
77e0: 28 61 73 20 6f 66 20 72 69 67 68 74 20 6e 6f 77  (as of right now
77f0: 29 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  )...    #..    i
7800: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
7810: 24 6e 65 77 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  $newName]} then 
7820: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
7830: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
7840: 6f 70 74 69 6f 6e 61 6c 6c 79 20 63 68 65 63 6b  optionally check
7850: 20 69 66 20 69 74 20 63 6f 6e 73 74 61 69 6e 73   if it constains
7860: 20 61 6e 79 74 68 69 6e 67 2e 0d 0a 20 20 20 20   anything...    
7870: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
7880: 24 6e 6f 74 45 6d 70 74 79 20 7c 7c 20 5b 73 74  $notEmpty || [st
7890: 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 73 65 74  ring length [set
78a0: 20 24 6e 65 77 4e 61 6d 65 5d 5d 20 3e 20 30 7d   $newName]] > 0}
78b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
78c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
78d0: 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65  TE: The variable
78e0: 20 65 78 69 73 74 73 20 61 6e 64 20 69 74 20 65   exists and it e
78f0: 69 74 68 65 72 20 63 6f 6e 74 61 69 6e 73 20 73  ither contains s
7900: 6f 6d 65 74 68 69 6e 67 0d 0a 20 20 20 20 20 20  omething..      
7910: 20 20 23 20 20 20 20 20 20 20 6f 72 20 77 65 20    #       or we 
7920: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
7930: 74 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0d  t its contents..
7940: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7950: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
7960: 6c 65 6e 67 74 68 20 24 63 6f 6e 73 74 72 61 69  length $constrai
7970: 6e 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  nt] > 0} then {.
7980: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
7990: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
79a0: 41 72 67 73 20 76 61 72 69 61 62 6c 65 5f 20 24  Args variable_ $
79b0: 63 6f 6e 73 74 72 61 69 6e 74 5d 0d 0a 20 20 20  constraint]..   
79c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
79d0: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
79e0: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
79f0: 67 73 20 76 61 72 69 61 62 6c 65 5f 20 5b 73 74  gs variable_ [st
7a00: 72 69 6e 67 20 74 72 69 6d 6c 65 66 74 20 24 6e  ring trimleft $n
7a10: 65 77 4e 61 6d 65 20 3a 5d 5d 0d 0a 20 20 20 20  ewName :]]..    
7a20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7a30: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7a40: 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
7a50: 20 66 6f 75 6e 64 20 74 68 65 20 76 61 72 69 61   found the varia
7a60: 62 6c 65 20 61 6e 64 20 77 68 65 74 68 65 72 20  ble and whether 
7a70: 69 74 20 61 63 74 75 61 6c 6c 79 0d 0a 20 20 20  it actually..   
7a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
7a90: 74 61 69 6e 65 64 20 61 6e 79 74 68 69 6e 67 2e  tained anything.
7aa0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7ab0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
7ac0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7ad0: 22 79 65 73 20 28 22 20 5c 0d 0a 20 20 20 20 20  "yes (" \..     
7ae0: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 6e         [expr {$n
7af0: 6f 74 45 6d 70 74 79 20 3f 20 22 65 78 69 73 74  otEmpty ? "exist
7b00: 73 2c 20 6e 6f 74 20 65 6d 70 74 79 22 20 3a 20  s, not empty" : 
7b10: 22 65 78 69 73 74 73 22 7d 5d 20 22 29 5c 6e 22  "exists"}] ")\n"
7b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
7b30: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7b40: 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65  We are done here
7b50: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20  , return now... 
7b60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7b70: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
7b80: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
7b90: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
7ba0: 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  o\n..  }.....  p
7bb0: 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 63 6c 4f  roc checkForTclO
7bc0: 70 74 69 6f 6e 73 20 7b 20 63 68 61 6e 6e 65 6c  ptions { channel
7bd0: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
7be0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
7bf0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c 20  hecking for Tcl 
7c00: 6f 70 74 69 6f 6e 73 2e 2e 2e 20 22 0d 0a 0d 0a  options... "....
7c10: 20 20 20 20 69 66 20 7b 21 5b 69 73 45 61 67 6c      if {![isEagl
7c20: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7c30: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
7c40: 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  st]....      #..
7c50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
7c60: 69 73 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  is test constrai
7c70: 6e 74 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  nt is needed by 
7c80: 74 65 73 74 20 22 62 65 6e 63 68 6d 61 72 6b 2d  test "benchmark-
7c90: 31 2e 32 32 22 2e 0d 0a 20 20 20 20 20 20 23 0d  1.22"...      #.
7ca0: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
7cb0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
7cc0: 6d 70 69 6c 65 4e 61 74 69 76 65 29 5d 7d 20 74  mpileNative)]} t
7cd0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c  hen {..        l
7ce0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 63 6f  append result co
7cf0: 6d 70 69 6c 65 2e 4e 41 54 49 56 45 0d 0a 20 20  mpile.NATIVE..  
7d00: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
7d10: 69 6e 74 20 63 6f 6d 70 69 6c 65 2e 4e 41 54 49  int compile.NATI
7d20: 56 45 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  VE..      }.... 
7d30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7d40: 4e 4f 54 45 3a 20 54 68 69 73 20 74 65 73 74 20  NOTE: This test 
7d50: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 65  constraint is ne
7d60: 65 64 65 64 20 62 79 20 74 65 73 74 20 22 62 65  eded by test "be
7d70: 6e 63 68 6d 61 72 6b 2d 31 2e 32 32 22 2e 0d 0a  nchmark-1.22"...
7d80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
7d90: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
7da0: 20 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 57 69 6e   ::no(compileWin
7db0: 64 6f 77 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  dows)]} then {..
7dc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7dd0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
7de0: 65 20 63 75 72 72 65 6e 74 20 70 6c 61 74 66 6f  e current platfo
7df0: 72 6d 20 69 73 20 57 69 6e 64 6f 77 73 20 74 68  rm is Windows th
7e00: 65 20 54 63 6c 20 62 69 6e 61 72 79 20 6d 75 73  e Tcl binary mus
7e10: 74 20 68 61 76 65 0d 0a 20 20 20 20 20 20 20 20  t have..        
7e20: 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 6f 6d  #       been com
7e30: 70 69 6c 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  piled for Window
7e40: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
7e50: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69         if {[isWi
7e60: 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ndows]} then {..
7e70: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
7e80: 64 20 72 65 73 75 6c 74 20 63 6f 6d 70 69 6c 65  d result compile
7e90: 2e 57 49 4e 44 4f 57 53 0d 0a 20 20 20 20 20 20  .WINDOWS..      
7ea0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
7eb0: 74 20 63 6f 6d 70 69 6c 65 2e 57 49 4e 44 4f 57  t compile.WINDOW
7ec0: 53 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  S..        }..  
7ed0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
7ee0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
7ef0: 54 68 69 73 20 74 65 73 74 20 63 6f 6e 73 74 72  This test constr
7f00: 61 69 6e 74 20 69 73 20 6e 65 65 64 65 64 20 62  aint is needed b
7f10: 79 20 74 65 73 74 73 20 22 73 6f 63 6b 65 74 2d  y tests "socket-
7f20: 2a 2e 2a 22 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  *.*"...      #..
7f30: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
7f40: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 6d   exists ::no(com
7f50: 70 69 6c 65 4e 65 74 77 6f 72 6b 29 5d 7d 20 74  pileNetwork)]} t
7f60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c  hen {..        l
7f70: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 63 6f  append result co
7f80: 6d 70 69 6c 65 2e 4e 45 54 57 4f 52 4b 0d 0a 20  mpile.NETWORK.. 
7f90: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
7fa0: 61 69 6e 74 20 63 6f 6d 70 69 6c 65 2e 4e 45 54  aint compile.NET
7fb0: 57 4f 52 4b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  WORK..      }...
7fc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7fd0: 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 66 61 6b  # NOTE: Just fak
7fe0: 65 20 74 68 65 20 69 6e 76 61 72 69 61 6e 74 20  e the invariant 
7ff0: 63 75 6c 74 75 72 65 20 77 68 65 6e 20 72 75 6e  culture when run
8000: 6e 69 6e 67 20 69 6e 20 6e 61 74 69 76 65 20 54  ning in native T
8010: 63 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  cl...      #..  
8020: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
8030: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 75 6c 74 75  xists ::no(cultu
8040: 72 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  re)]} then {..  
8050: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
8060: 73 75 6c 74 20 63 75 6c 74 75 72 65 2e 69 6e 76  sult culture.inv
8070: 61 72 69 61 6e 74 0d 0a 20 20 20 20 20 20 20 20  ariant..        
8080: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 63 75  addConstraint cu
8090: 6c 74 75 72 65 2e 69 6e 76 61 72 69 61 6e 74 0d  lture.invariant.
80a0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
80b0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
80c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
80d0: 73 20 28 22 20 24 72 65 73 75 6c 74 20 22 29 5c  s (" $result ")\
80e0: 6e 22 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  n"]..    } else 
80f0: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
8100: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
8110: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
8120: 72 6f 63 20 63 68 65 63 6b 46 6f 72 57 69 6e 64  roc checkForWind
8130: 6f 77 73 43 6f 6d 6d 61 6e 64 50 72 6f 63 65 73  owsCommandProces
8140: 73 6f 72 20 7b 20 63 68 61 6e 6e 65 6c 20 70 61  sor { channel pa
8150: 74 74 65 72 6e 20 7b 63 6f 6e 73 74 72 61 69 6e  ttern {constrain
8160: 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 74  t ""} } {..    t
8170: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
8180: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
8190: 20 57 69 6e 64 6f 77 73 20 43 6f 6d 6d 61 6e 64   Windows Command
81a0: 20 50 72 6f 63 65 73 73 6f 72 2e 2e 2e 20 22 0d   Processor... ".
81b0: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 57 69  ...    if {[isWi
81c0: 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ndows]} then {..
81d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
81e0: 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
81f0: 22 43 6f 6d 53 70 65 63 22 20 66 72 6f 6d 20 74  "ComSpec" from t
8200: 68 65 20 57 69 6e 64 6f 77 73 20 65 6e 76 69 72  he Windows envir
8210: 6f 6e 6d 65 6e 74 20 61 6e 64 20 6d 61 6b 65 20  onment and make 
8220: 73 75 72 65 20 69 74 0d 0a 20 20 20 20 20 20 23  sure it..      #
8230: 20 20 20 20 20 20 20 6d 61 74 63 68 65 73 20 74         matches t
8240: 68 65 20 66 69 6c 65 20 70 61 74 74 65 72 6e 20  he file pattern 
8250: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
8260: 63 61 6c 6c 65 72 20 28 65 2e 67 2e 20 22 63 6d  caller (e.g. "cm
8270: 64 2e 65 78 65 22 29 2e 0d 0a 20 20 20 20 20 20  d.exe")...      
8280: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
8290: 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
82a0: 43 6f 6d 53 70 65 63 29 5d 20 26 26 20 5c 0d 0a  ComSpec)] && \..
82b0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
82c0: 67 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73 65 20  g match -nocase 
82d0: 24 70 61 74 74 65 72 6e 20 5b 66 69 6c 65 20 74  $pattern [file t
82e0: 61 69 6c 20 24 3a 3a 65 6e 76 28 43 6f 6d 53 70  ail $::env(ComSp
82f0: 65 63 29 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ec)]]} then {.. 
8300: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8310: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
8320: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 61 20   running with a 
8330: 6d 61 74 63 68 69 6e 67 20 63 6f 6d 6d 61 6e 64  matching command
8340: 20 70 72 6f 63 65 73 73 6f 72 2e 0d 0a 20 20 20   processor...   
8350: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8360: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
8370: 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 20  th $constraint] 
8380: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
8390: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
83a0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
83b0: 20 63 6f 6d 53 70 65 63 5f 20 24 63 6f 6e 73 74   comSpec_ $const
83c0: 72 61 69 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  raint]..        
83d0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
83e0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
83f0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 63 6f  t [appendArgs co
8400: 6d 53 70 65 63 5f 20 5c 0d 0a 20 20 20 20 20 20  mSpec_ \..      
8410: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
8420: 6d 61 70 20 5b 6c 69 73 74 20 2a 20 5f 20 2d 20  map [list * _ - 
8430: 5f 20 3f 20 5f 20 5c 5b 20 5f 20 5c 5c 20 5f 20  _ ? _ \[ _ \\ _ 
8440: 5c 5d 20 5f 5d 20 24 70 61 74 74 65 72 6e 5d 5d  \] _] $pattern]]
8450: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
8460: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
8470: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8480: 73 20 22 79 65 73 20 28 5c 22 22 20 24 3a 3a 65  s "yes (\"" $::e
8490: 6e 76 28 43 6f 6d 53 70 65 63 29 20 22 5c 22 29  nv(ComSpec) "\")
84a0: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
84b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
84c0: 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68  E: We are done h
84d0: 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ere, return now.
84e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
84f0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
8500: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
8510: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
8520: 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a  l no\n..  }.....
8530: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 50    proc checkForP
8540: 61 63 6b 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c  ackage { channel
8550: 20 70 61 74 74 65 72 6e 20 7d 20 7b 0d 0a 20 20   pattern } {..  
8560: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
8570: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8580: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
8590: 65 63 6b 69 6e 67 20 66 6f 72 20 6c 6f 61 64 65  ecking for loade
85a0: 64 20 70 61 63 6b 61 67 65 20 6d 61 74 63 68 69  d package matchi
85b0: 6e 67 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  ng \"" \..      
85c0: 20 20 24 70 61 74 74 65 72 6e 20 22 5c 22 2e 2e    $pattern "\"..
85d0: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  . "]....    if {
85e0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
85f0: 66 6f 72 65 61 63 68 20 6c 6f 61 64 65 64 20 5b  foreach loaded [
8600: 69 6e 66 6f 20 6c 6f 61 64 65 64 5d 20 7b 0d 0a  info loaded] {..
8610: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
8620: 65 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  exp -- $pattern 
8630: 5b 6c 69 6e 64 65 78 20 24 6c 6f 61 64 65 64 20  [lindex $loaded 
8640: 65 6e 64 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  end]]} then {.. 
8650: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 63           set pac
8660: 6b 61 67 65 20 5b 6c 69 6e 64 65 78 20 24 6c 6f  kage [lindex $lo
8670: 61 64 65 64 20 31 5d 3b 20 62 72 65 61 6b 0d 0a  aded 1]; break..
8680: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8690: 20 7d 0d 0a 20 20 20 20 7d 5d 20 3d 3d 20 30 7d   }..    }] == 0}
86a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
86b0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
86c0: 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  Make sure that a
86d0: 20 6d 61 74 63 68 69 6e 67 20 70 61 63 6b 61 67   matching packag
86e0: 65 20 6e 61 6d 65 20 77 61 73 20 66 6f 75 6e 64  e name was found
86f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8700: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
8710: 74 73 20 70 61 63 6b 61 67 65 5d 7d 20 74 68 65  ts package]} the
8720: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8730: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8740: 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
8750: 74 68 61 74 20 69 74 20 69 73 20 6c 6f 61 64 65  that it is loade
8760: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
8770: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
8780: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
8790: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
87a0: 6c 6f 61 64 65 64 2e 6e 61 6d 65 2e 20 5b 63 6c  loaded.name. [cl
87b0: 65 61 6e 50 61 63 6b 61 67 65 4e 61 6d 65 20 24  eanPackageName $
87c0: 70 61 63 6b 61 67 65 20 66 61 6c 73 65 5d 5d 0d  package false]].
87d0: 0a 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ...        addCo
87e0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
87f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8800: 20 20 20 20 6c 6f 61 64 65 64 2e 66 75 6c 6c 4e      loaded.fullN
8810: 61 6d 65 2e 20 5b 63 6c 65 61 6e 50 61 63 6b 61  ame. [cleanPacka
8820: 67 65 4e 61 6d 65 20 24 70 61 63 6b 61 67 65 20  geName $package 
8830: 74 72 75 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  true]]....      
8840: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
8850: 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 74  OTE: Show that t
8860: 68 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 77  he sub-command w
8870: 61 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  as found...     
8880: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
8890: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
88a0: 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
88b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
88c0: 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   We are done her
88d0: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a  e, return now...
88e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
88f0: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
8900: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
8910: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
8920: 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  no\n..  }.....  
8930: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 46 6f 73  proc checkForFos
8940: 73 69 6c 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  sil { channel } 
8950: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
8960: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
8970: 6b 69 6e 67 20 66 6f 72 20 46 6f 73 73 69 6c 2e  king for Fossil.
8980: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  .. "....    if {
8990: 5b 63 61 6e 45 78 65 63 46 6f 73 73 69 6c 5d 20  [canExecFossil] 
89a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 63  && \..        [c
89b0: 61 74 63 68 20 7b 65 78 65 63 20 2d 2d 20 66 6f  atch {exec -- fo
89c0: 73 73 69 6c 20 76 65 72 73 69 6f 6e 7d 20 76 65  ssil version} ve
89d0: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
89e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76  n {..      set v
89f0: 65 72 73 69 6f 6e 20 5b 73 74 72 69 6e 67 20 74  ersion [string t
8a00: 72 69 6d 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 0d  rim $version]...
8a10: 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65  .      set patte
8a20: 72 6e 20 7b 5e 54 68 69 73 20 69 73 20 66 6f 73  rn {^This is fos
8a30: 73 69 6c 20 76 65 72 73 69 6f 6e 20 28 2e 2a 29  sil version (.*)
8a40: 20 5c 5b 28 5b 30 2d 39 61 2d 66 5d 2b 29 5c 5d   \[([0-9a-f]+)\]
8a50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5c 64 7b  \..          \d{
8a60: 34 7d 2d 5c 64 7b 32 7d 2d 5c 64 7b 32 7d 20 5c  4}-\d{2}-\d{2} \
8a70: 64 7b 32 7d 3a 5c 64 7b 32 7d 3a 5c 64 7b 32 7d  d{2}:\d{2}:\d{2}
8a80: 20 55 54 43 24 7d 0d 0a 0d 0a 20 20 20 20 20 20   UTC$}....      
8a90: 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24  if {[regexp -- $
8aa0: 70 61 74 74 65 72 6e 20 24 76 65 72 73 69 6f 6e  pattern $version
8ab0: 20 64 75 6d 6d 79 20 76 65 72 73 69 6f 6e 20 73   dummy version s
8ac0: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
8ad0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8ae0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
8af0: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f   a constraint to
8b00: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 46   show that the F
8b10: 6f 73 73 69 6c 20 65 78 65 63 75 74 61 62 6c 65  ossil executable
8b20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8b30: 20 20 69 74 73 65 6c 66 20 69 73 20 61 76 61 69    itself is avai
8b40: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
8b50: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
8b60: 6e 73 74 72 61 69 6e 74 20 66 6f 73 73 69 6c 5f  nstraint fossil_
8b70: 76 65 72 73 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  version....     
8b80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8b90: 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 74 68 65  NOTE: Append the
8ba0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 46 6f 73 73   version of Foss
8bb0: 69 6c 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  il currently in 
8bc0: 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  use...        #.
8bd0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
8be0: 72 65 73 75 6c 74 20 76 65 72 73 69 6f 6e 20 22  result version "
8bf0: 20 22 20 24 76 65 72 73 69 6f 6e 20 22 20 5c 5b   " $version " \[
8c00: 22 20 24 73 6f 75 72 63 65 49 64 20 5c 5d 0d 0a  " $sourceId \]..
8c10: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
8c20: 61 6e 45 78 65 63 46 6f 73 73 69 6c 5d 20 26 26  anExecFossil] &&
8c30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8c40: 5b 63 61 74 63 68 20 7b 65 78 65 63 20 2d 2d 20  [catch {exec -- 
8c50: 66 6f 73 73 69 6c 20 72 65 6d 6f 74 65 2d 75 72  fossil remote-ur
8c60: 6c 7d 20 72 65 6d 6f 74 65 55 72 6c 5d 20 3d 3d  l} remoteUrl] ==
8c70: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8c80: 20 20 20 20 20 20 73 65 74 20 72 65 6d 6f 74 65        set remote
8c90: 55 72 6c 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  Url [string trim
8ca0: 20 24 72 65 6d 6f 74 65 55 72 6c 5d 3b 20 73 65   $remoteUrl]; se
8cb0: 74 20 76 61 6c 69 64 55 72 6c 20 66 61 6c 73 65  t validUrl false
8cc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
8cd0: 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65   {[isEagle]} the
8ce0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
8cf0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
8d00: 23 20 4e 4f 54 45 3a 20 57 69 74 68 20 45 61 67  # NOTE: With Eag
8d10: 6c 65 2c 20 77 65 20 63 61 6e 20 61 63 74 75 61  le, we can actua
8d20: 6c 6c 79 20 76 61 6c 69 64 61 74 65 20 74 68 65  lly validate the
8d30: 20 55 52 4c 2e 0d 0a 20 20 20 20 20 20 20 20 20   URL...         
8d40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8d50: 20 20 69 66 20 7b 5b 75 72 69 20 69 73 76 61 6c    if {[uri isval
8d60: 69 64 20 24 72 65 6d 6f 74 65 55 72 6c 5d 7d 20  id $remoteUrl]} 
8d70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8d80: 20 20 20 20 20 20 73 65 74 20 76 61 6c 69 64 55        set validU
8d90: 72 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rl true..       
8da0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
8db0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
8dc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8dd0: 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 43         # HACK: C
8de0: 75 72 72 65 6e 74 6c 79 2c 20 74 68 65 72 65 20  urrently, there 
8df0: 69 73 20 6e 6f 20 73 69 6d 70 6c 65 20 77 61 79  is no simple way
8e00: 20 74 6f 20 76 61 6c 69 64 61 74 65 0d 0a 20 20   to validate..  
8e10: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
8e20: 20 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 55    an arbitrary U
8e30: 52 4c 20 77 69 74 68 20 54 63 6c 20 28 69 2e 65  RL with Tcl (i.e
8e40: 2e 20 77 69 74 68 6f 75 74 20 75 73 69 6e 67 0d  . without using.
8e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
8e60: 20 20 20 20 20 73 6f 6d 65 20 68 69 64 65 6f 75       some hideou
8e70: 73 6c 79 20 63 6f 6d 70 6c 65 78 20 72 65 67 75  sly complex regu
8e80: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 2e  lar expression).
8e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
8eb0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
8ec0: 24 72 65 6d 6f 74 65 55 72 6c 5d 20 3e 20 30 7d  $remoteUrl] > 0}
8ed0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8ee0: 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 69 64         set valid
8ef0: 55 72 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20  Url true..      
8f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8f10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
8f20: 20 20 69 66 20 7b 24 76 61 6c 69 64 55 72 6c 7d    if {$validUrl}
8f30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8f40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8f50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
8f60: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  a constraint to 
8f70: 73 68 6f 77 20 74 68 61 74 20 61 20 76 61 6c 69  show that a vali
8f80: 64 20 46 6f 73 73 69 6c 0d 0a 20 20 20 20 20 20  d Fossil..      
8f90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
8fa0: 70 6f 73 69 74 6f 72 79 20 55 52 4c 20 61 70 70  pository URL app
8fb0: 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c  ears to be avail
8fc0: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
8fd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8fe0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
8ff0: 66 6f 73 73 69 6c 5f 72 65 70 6f 73 69 74 6f 72  fossil_repositor
9000: 79 5f 75 72 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  y_url....       
9010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 77      # NOTE: If w
9030: 65 20 61 72 65 20 6e 6f 74 20 70 72 65 76 65 6e  e are not preven
9040: 74 65 64 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73  ted from doing s
9050: 6f 2c 20 73 61 76 65 0d 0a 20 20 20 20 20 20 20  o, save..       
9060: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
9070: 20 74 65 73 74 20 72 65 70 6f 73 69 74 6f 72 79   test repository
9080: 20 55 52 4c 20 74 6f 20 74 68 65 20 72 65 70 6f   URL to the repo
9090: 73 69 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  sitory..        
90a0: 20 20 20 20 23 20 20 20 20 20 20 20 63 75 72 72      #       curr
90b0: 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 74 6f 20  ently in use to 
90c0: 61 20 73 75 69 74 61 62 6c 79 20 6e 61 6d 65 64  a suitably named
90d0: 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20   global..       
90e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
90f0: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
9100: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9110: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
9120: 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 52 65 70  ists ::no(setRep
9130: 6f 73 69 74 6f 72 79 55 72 6c 29 5d 7d 20 74 68  ositoryUrl)]} th
9140: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9150: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 72      set ::test_r
9160: 65 70 6f 73 69 74 6f 72 79 5f 75 72 6c 20 24 72  epository_url $r
9170: 65 6d 6f 74 65 55 72 6c 0d 0a 20 20 20 20 20 20  emoteUrl..      
9180: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
9190: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
91a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70        # NOTE: Ap
91b0: 70 65 6e 64 20 74 68 65 20 72 65 70 6f 73 69 74  pend the reposit
91c0: 6f 72 79 20 55 52 4c 20 63 75 72 72 65 6e 74 6c  ory URL currentl
91d0: 79 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20  y in use...     
91e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
91f0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
9200: 75 6c 74 20 22 2c 20 72 65 6d 6f 74 65 20 55 52  ult ", remote UR
9210: 4c 20 5c 22 22 20 24 72 65 6d 6f 74 65 55 72 6c  L \"" $remoteUrl
9220: 20 5c 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d   \"..          }
9230: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
9240: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 6e 45         if {[canE
9250: 78 65 63 46 6f 73 73 69 6c 5d 20 26 26 20 5c 0d  xecFossil] && \.
9260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 61  .            [ca
9270: 74 63 68 20 7b 65 78 65 63 20 2d 2d 20 66 6f 73  tch {exec -- fos
9280: 73 69 6c 20 69 6e 66 6f 7d 20 69 6e 66 6f 5d 20  sil info} info] 
9290: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
92a0: 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 66 6f          set info
92b0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 69   [string trim $i
92c0: 6e 66 6f 5d 3b 20 73 65 74 20 76 61 6c 69 64 46  nfo]; set validF
92d0: 69 6c 65 20 66 61 6c 73 65 0d 0a 0d 0a 20 20 20  ile false....   
92e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
92f0: 6e 67 20 6c 65 6e 67 74 68 20 24 69 6e 66 6f 5d  ng length $info]
9300: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9310: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
9320: 74 74 65 72 6e 20 7b 5e 72 65 70 6f 73 69 74 6f  ttern {^reposito
9330: 72 79 3a 5c 73 2b 28 2e 2a 3f 29 24 7d 0d 0a 0d  ry:\s+(.*?)$}...
9340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
9350: 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d  {[regexp -line -
9360: 2d 20 24 70 61 74 74 65 72 6e 20 24 69 6e 66 6f  - $pattern $info
9370: 20 64 75 6d 6d 79 20 72 65 70 6f 73 69 74 6f 72   dummy repositor
9380: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
9390: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65            set re
93a0: 70 6f 73 69 74 6f 72 79 20 5b 73 74 72 69 6e 67  pository [string
93b0: 20 74 72 69 6d 20 24 72 65 70 6f 73 69 74 6f 72   trim $repositor
93c0: 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y]....          
93d0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
93e0: 69 73 74 73 20 24 72 65 70 6f 73 69 74 6f 72 79  ists $repository
93f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
9400: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
9410: 61 6c 69 64 46 69 6c 65 20 74 72 75 65 0d 0a 20  alidFile true.. 
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
9430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
9440: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
9450: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c          if {$val
9460: 69 64 46 69 6c 65 7d 20 74 68 65 6e 20 7b 0d 0a  idFile} then {..
9470: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9480: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
9490: 45 3a 20 41 64 64 20 61 20 63 6f 6e 73 74 72 61  E: Add a constra
94a0: 69 6e 74 20 74 6f 20 73 68 6f 77 20 74 68 61 74  int to show that
94b0: 20 61 20 76 61 6c 69 64 20 46 6f 73 73 69 6c 0d   a valid Fossil.
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
94d0: 20 20 20 20 20 72 65 70 6f 73 69 74 6f 72 79 20       repository 
94e0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
94f0: 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  be available... 
9500: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
9510: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
9520: 73 74 72 61 69 6e 74 20 66 6f 73 73 69 6c 5f 72  straint fossil_r
9530: 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 0d 0a  epository_file..
9540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
9550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
9560: 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
9570: 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  he file name is 
9580: 66 75 6c 6c 79 20 6e 6f 72 6d 61 6c 69 7a 65 64  fully normalized
9590: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
95a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
95b0: 74 20 72 65 70 6f 73 69 74 6f 72 79 20 5b 66 69  t repository [fi
95c0: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 72 65  le normalize $re
95d0: 70 6f 73 69 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  pository]....   
95e0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
95f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9600: 49 66 20 77 65 20 61 72 65 20 6e 6f 74 20 70 72  If we are not pr
9610: 65 76 65 6e 74 65 64 20 66 72 6f 6d 20 64 6f 69  evented from doi
9620: 6e 67 20 73 6f 2c 20 73 61 76 65 0d 0a 20 20 20  ng so, save..   
9630: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
9640: 20 74 68 65 20 74 65 73 74 20 72 65 70 6f 73 69   the test reposi
9650: 74 6f 72 79 20 66 69 6c 65 20 66 6f 72 20 74 68  tory file for th
9660: 65 20 72 65 70 6f 73 69 74 6f 72 79 0d 0a 20 20  e repository..  
9670: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
9680: 20 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75    currently in u
9690: 73 65 20 74 6f 20 61 20 73 75 69 74 61 62 6c 79  se to a suitably
96a0: 20 6e 61 6d 65 64 20 67 6c 6f 62 61 6c 0d 0a 20   named global.. 
96b0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
96c0: 20 20 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20     variable...  
96d0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
96e0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
96f0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
9700: 73 65 74 52 65 70 6f 73 69 74 6f 72 79 46 69 6c  setRepositoryFil
9710: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
9720: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
9730: 3a 74 65 73 74 5f 72 65 70 6f 73 69 74 6f 72 79  :test_repository
9740: 5f 66 69 6c 65 20 24 72 65 70 6f 73 69 74 6f 72  _file $repositor
9750: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  y..            }
9760: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9770: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
9780: 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 74 68   NOTE: Append th
9790: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 66 69 6c  e repository fil
97a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
97b0: 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se...           
97c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
97d0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 22 2c  append result ",
97e0: 20 6c 6f 63 61 6c 20 66 69 6c 65 20 5c 22 22 20   local file \"" 
97f0: 24 72 65 70 6f 73 69 74 6f 72 79 20 5c 22 0d 0a  $repository \"..
9800: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9810: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9820: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9830: 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 72 65  OTE: Show the re
9840: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 68 65 63  sult of the chec
9850: 6b 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  king...        #
9860: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
9870: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
9880: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 72 65  Args "yes (" $re
9890: 73 75 6c 74 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  sult ")\n"].... 
98a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
98b0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
98c0: 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
98d0: 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  rn now...       
98e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
98f0: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  rn..      }..   
9900: 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20   }....    tputs 
9910: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
9920: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
9930: 65 63 6b 46 6f 72 56 69 73 75 61 6c 53 74 75 64  eckForVisualStud
9940: 69 6f 56 69 61 56 73 57 68 65 72 65 20 7b 20 63  ioViaVsWhere { c
9950: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
9960: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
9970: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
9980: 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  r Visual Studio 
9990: 75 73 69 6e 67 20 5c 22 76 73 77 68 65 72 65 5c  using \"vswhere\
99a0: 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d  "... "....    #.
99b0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 69  .    # NOTE: Ini
99c0: 74 69 61 6c 6c 79 2c 20 6e 6f 20 76 65 72 73 69  tially, no versi
99d0: 6f 6e 73 20 6f 66 20 56 69 73 75 61 6c 20 53 74  ons of Visual St
99e0: 75 64 69 6f 20 68 61 76 65 20 62 65 65 6e 20 66  udio have been f
99f0: 6f 75 6e 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ound...    #..  
9a00: 20 20 73 65 74 20 76 69 73 75 61 6c 53 74 75 64    set visualStud
9a10: 69 6f 56 65 72 73 69 6f 6e 73 20 5b 6c 69 73 74  ioVersions [list
9a20: 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ]....    #..    
9a30: 23 20 4e 4f 54 45 3a 20 55 73 65 20 6f 66 20 74  # NOTE: Use of t
9a40: 68 65 20 22 76 73 77 68 65 72 65 22 20 74 6f 6f  he "vswhere" too
9a50: 6c 20 6d 75 73 74 20 62 65 20 65 6e 61 62 6c 65  l must be enable
9a60: 64 20 66 6f 72 20 75 73 20 74 6f 20 64 65 74 65  d for us to dete
9a70: 63 74 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  ct..    #       
9a80: 61 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  any instances of
9a90: 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d   Visual Studio..
9aa0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
9ab0: 5b 63 61 6e 45 78 65 63 56 73 57 68 65 72 65 5d  [canExecVsWhere]
9ac0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9ad0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9ae0: 20 54 68 65 20 76 65 72 73 69 6f 6e 73 20 6f 66   The versions of
9af0: 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 74   Visual Studio t
9b00: 68 61 74 20 77 65 20 73 75 70 70 6f 72 74 20 64  hat we support d
9b10: 65 74 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  etection..      
9b20: 23 20 20 20 20 20 20 20 6f 66 20 75 73 69 6e 67  #       of using
9b30: 20 74 68 65 20 22 76 73 77 68 65 72 65 22 20 74   the "vswhere" t
9b40: 6f 6f 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ool...      #.. 
9b50: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
9b60: 73 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 31 35  s [list [list 15
9b70: 2e 30 20 32 30 31 37 5d 5d 0d 0a 0d 0a 20 20 20  .0 2017]]....   
9b80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9b90: 54 45 3a 20 43 68 65 63 6b 20 65 61 63 68 20 76  TE: Check each v
9ba0: 65 72 73 69 6f 6e 20 61 6e 64 20 6b 65 65 70 20  ersion and keep 
9bb0: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6f 6e 65  track of the one
9bc0: 73 20 77 65 20 66 69 6e 64 2e 0d 0a 20 20 20 20  s we find...    
9bd0: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
9be0: 63 68 20 76 65 72 73 69 6f 6e 20 24 76 65 72 73  ch version $vers
9bf0: 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ions {..        
9c00: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9c10: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 65  E: Attempt to fe
9c20: 74 63 68 20 56 69 73 75 61 6c 20 53 74 75 64 69  tch Visual Studi
9c30: 6f 20 69 6e 73 74 61 6c 6c 20 64 69 72 65 63 74  o install direct
9c40: 6f 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23  ories..        #
9c50: 20 20 20 20 20 20 20 76 61 6c 75 65 20 75 73 69         value usi
9c60: 6e 67 20 74 68 65 20 22 76 73 77 68 65 72 65 22  ng the "vswhere"
9c70: 20 74 6f 6f 6c 2e 0d 0a 20 20 20 20 20 20 20 20   tool...        
9c80: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
9c90: 63 61 6e 45 78 65 63 56 73 57 68 65 72 65 5d 20  canExecVsWhere] 
9ca0: 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
9cb0: 20 20 20 20 20 20 20 65 78 65 63 20 2d 6e 6f 63         exec -noc
9cc0: 61 72 72 69 61 67 65 72 65 74 75 72 6e 73 20 2d  arriagereturns -
9cd0: 2d 20 76 73 77 68 65 72 65 20 2d 70 72 6f 64 75  - vswhere -produ
9ce0: 63 74 73 20 2a 20 5c 0d 0a 20 20 20 20 20 20 20  cts * \..       
9cf0: 20 20 20 20 20 20 20 2d 76 65 72 73 69 6f 6e 20         -version 
9d00: 5b 6c 69 6e 64 65 78 20 24 76 65 72 73 69 6f 6e  [lindex $version
9d10: 20 30 5d 20 2d 70 72 6f 70 65 72 74 79 20 69 6e   0] -property in
9d20: 73 74 61 6c 6c 61 74 69 6f 6e 50 61 74 68 0d 0a  stallationPath..
9d30: 20 20 20 20 20 20 20 20 7d 20 69 6e 73 74 61 6c          } instal
9d40: 6c 61 74 69 6f 6e 50 61 74 68 73 5d 20 3d 3d 20  lationPaths] == 
9d50: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9d60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9d70: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
9d80: 65 61 63 68 20 56 69 73 75 61 6c 20 53 74 75 64  each Visual Stud
9d90: 69 6f 20 69 6e 73 74 61 6c 6c 20 64 69 72 65 63  io install direc
9da0: 74 6f 72 79 2c 20 69 6e 20 74 68 65 0d 0a 20 20  tory, in the..  
9db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9dc0: 6f 72 64 65 72 20 74 68 65 79 20 77 65 72 65 20  order they were 
9dd0: 72 65 74 75 72 6e 65 64 2c 20 61 66 74 65 72 20  returned, after 
9de0: 73 70 6c 69 74 74 69 6e 67 20 74 68 65 6d 20 69  splitting them i
9df0: 6e 74 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nto..          #
9e00: 20 20 20 20 20 20 20 61 20 70 72 6f 70 65 72 20         a proper 
9e10: 54 63 6c 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  Tcl list...     
9e20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9e30: 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 61 74 69    set installati
9e40: 6f 6e 50 61 74 68 73 20 5b 73 70 6c 69 74 20 5c  onPaths [split \
9e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9e60: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 69 6e  [string trim $in
9e70: 73 74 61 6c 6c 61 74 69 6f 6e 50 61 74 68 73 5d  stallationPaths]
9e80: 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
9e90: 20 20 66 6f 72 65 61 63 68 20 69 6e 73 74 61 6c    foreach instal
9ea0: 6c 61 74 69 6f 6e 50 61 74 68 20 24 69 6e 73 74  lationPath $inst
9eb0: 61 6c 6c 61 74 69 6f 6e 50 61 74 68 73 20 7b 0d  allationPaths {.
9ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
9ee0: 54 45 3a 20 52 65 6d 6f 76 65 20 74 68 65 20 74  TE: Remove the t
9ef0: 72 61 69 6c 69 6e 67 20 62 61 63 6b 73 6c 61 73  railing backslas
9f00: 68 2c 20 69 66 20 61 6e 79 2e 20 20 44 6f 65 73  h, if any.  Does
9f10: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
9f20: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
9f30: 6f 72 79 20 6e 61 6d 65 20 6c 6f 6f 6b 20 76 61  ory name look va
9f40: 6c 69 64 20 61 6e 64 20 64 6f 65 73 20 69 74 20  lid and does it 
9f50: 61 63 74 75 61 6c 6c 79 0d 0a 20 20 20 20 20 20  actually..      
9f60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
9f70: 69 73 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ist?..          
9f80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
9f90: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
9fa0: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
9fc0: 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20 24 69  ing trimright $i
9fd0: 6e 73 74 61 6c 6c 61 74 69 6f 6e 50 61 74 68 20  nstallationPath 
9fe0: 5c 5c 5d 20 43 6f 6d 6d 6f 6e 37 20 49 44 45 20  \\] Common7 IDE 
9ff0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a000: 20 20 20 6d 73 65 6e 76 2e 64 6c 6c 5d 0d 0a 0d     msenv.dll]...
a010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
a020: 7b 5b 66 69 6c 65 20 69 73 66 69 6c 65 20 24 66  {[file isfile $f
a030: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
a040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a050: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
a060: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74   # NOTE: Yes, it
a070: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
a080: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
a0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
a0b0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
a0c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 69                vi
a0e0: 73 75 61 6c 53 74 75 64 69 6f 20 5b 6c 69 6e 64  sualStudio [lind
a0f0: 65 78 20 24 76 65 72 73 69 6f 6e 20 31 5d 5d 0d  ex $version 1]].
a100: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
a110: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
a120: 20 20 23 20 4e 4f 54 45 3a 20 4b 65 65 70 20 74    # NOTE: Keep t
a130: 72 61 63 6b 20 6f 66 20 61 6c 6c 20 74 68 65 20  rack of all the 
a140: 76 65 72 73 69 6f 6e 73 20 74 68 61 74 20 77 65  versions that we
a150: 20 66 69 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20   find...        
a160: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a170: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 76         lappend v
a180: 69 73 75 61 6c 53 74 75 64 69 6f 56 65 72 73 69  isualStudioVersi
a190: 6f 6e 73 20 5b 6c 69 6e 64 65 78 20 24 76 65 72  ons [lindex $ver
a1a0: 73 69 6f 6e 20 31 5d 0d 0a 0d 0a 20 20 20 20 20  sion 1]....     
a1b0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a1c0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a1d0: 3a 20 53 61 76 65 20 74 68 65 20 64 69 72 65 63  : Save the direc
a1e0: 74 6f 72 79 20 66 6f 72 20 6c 61 74 65 72 20 75  tory for later u
a1f0: 73 61 67 65 20 62 79 20 74 68 65 20 74 65 73 74  sage by the test
a200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a210: 23 20 20 20 20 20 20 20 73 75 69 74 65 20 69 74  #       suite it
a220: 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 20  self...         
a230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a240: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
a250: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
a260: 56 69 73 75 61 6c 53 74 75 64 69 6f 29 5d 7d 20  VisualStudio)]} 
a270: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a280: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
a290: 73 74 5f 76 69 73 75 61 6c 5f 73 74 75 64 69 6f  st_visual_studio
a2a0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
a2b0: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
a2c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48               # H
a2f0: 41 43 4b 3a 20 53 74 6f 70 20 61 66 74 65 72 20  ACK: Stop after 
a300: 77 65 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  we find the firs
a310: 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 56 69  t instance of Vi
a320: 73 75 61 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  sual..          
a330: 20 20 20 20 23 20 20 20 20 20 20 20 53 74 75 64      #       Stud
a340: 69 6f 20 77 69 74 68 20 74 68 65 20 72 65 71 75  io with the requ
a350: 65 73 74 65 64 20 76 65 72 73 69 6f 6e 2e 0d 0a  ested version...
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
a370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
a380: 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 20 20  reak..          
a390: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
a3a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a3b0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
a3c0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
a3d0: 24 76 69 73 75 61 6c 53 74 75 64 69 6f 56 65 72  $visualStudioVer
a3e0: 73 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e  sions] > 0} then
a3f0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
a400: 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
a410: 77 68 65 72 65 20 77 65 20 66 6f 75 6e 64 20 74  where we found t
a420: 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
a430: 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  n...      #..   
a440: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a450: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a460: 0a 20 20 20 20 20 20 20 20 20 20 22 79 65 73 20  .          "yes 
a470: 28 22 20 24 76 69 73 75 61 6c 53 74 75 64 69 6f  (" $visualStudio
a480: 56 65 72 73 69 6f 6e 73 20 22 2c 20 5c 22 22 20  Versions ", \"" 
a490: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65 78  \..          [ex
a4a0: 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  pr {[info exists
a4b0: 20 3a 3a 74 65 73 74 5f 76 69 73 75 61 6c 5f 73   ::test_visual_s
a4c0: 74 75 64 69 6f 5d 20 3f 20 5c 0d 0a 20 20 20 20  tudio] ? \..    
a4d0: 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 65 73            $::tes
a4e0: 74 5f 76 69 73 75 61 6c 5f 73 74 75 64 69 6f 20  t_visual_studio 
a4f0: 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 22 5c 22  : "<none>"}] "\"
a500: 29 5c 6e 22 5d 0d 0a 20 20 20 20 7d 20 65 6c 73  )\n"]..    } els
a510: 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e {..      tputs
a520: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
a530: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
a540: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 45 61   proc checkForEa
a550: 67 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  gle { channel } 
a560: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
a570: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
a580: 6b 69 6e 67 20 66 6f 72 20 45 61 67 6c 65 2e 2e  king for Eagle..
a590: 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  . "....    if {[
a5a0: 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
a5b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a5c0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
a5d0: 72 75 6e 6e 69 6e 67 20 69 6e 73 69 64 65 20 45  running inside E
a5e0: 61 67 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  agle...      #..
a5f0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
a600: 69 6e 74 20 65 61 67 6c 65 0d 0a 0d 0a 20 20 20  int eagle....   
a610: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
a620: 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  TE: We do not wa
a630: 6e 74 20 74 6f 20 73 6b 69 70 20 62 75 67 73 20  nt to skip bugs 
a640: 6f 72 20 63 72 61 73 68 69 6e 67 0d 0a 20 20 20  or crashing..   
a650: 20 20 20 23 20 20 20 20 20 20 20 69 73 73 75 65     #       issue
a660: 73 20 66 6f 72 20 54 63 6c 20 73 69 6e 63 65 20  s for Tcl since 
a670: 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  we are not runni
a680: 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ng..      #     
a690: 20 20 69 6e 20 54 63 6c 2e 0d 0a 20 20 20 20 20    in Tcl...     
a6a0: 20 23 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   #..      addCon
a6b0: 73 74 72 61 69 6e 74 20 74 63 6c 42 75 67 0d 0a  straint tclBug..
a6c0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
a6d0: 69 6e 74 20 74 63 6c 43 72 61 73 68 0d 0a 0d 0a  int tclCrash....
a6e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a6f0: 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e   NOTE: Add the n
a700: 65 63 65 73 73 61 72 79 20 63 6f 6e 73 74 72 61  ecessary constra
a710: 69 6e 74 73 20 66 6f 72 20 65 61 63 68 0d 0a 20  ints for each.. 
a720: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72       #       ver
a730: 73 69 6f 6e 20 6f 66 20 54 63 6c 20 77 65 20 6b  sion of Tcl we k
a740: 6e 6f 77 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20  now about...    
a750: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
a760: 63 68 20 74 63 6c 56 65 72 73 69 6f 6e 20 5b 67  ch tclVersion [g
a770: 65 74 4b 6e 6f 77 6e 54 63 6c 56 65 72 73 69 6f  etKnownTclVersio
a780: 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  ns] {..        s
a790: 65 74 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 44  et version [getD
a7a0: 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 24 74  otlessVersion $t
a7b0: 63 6c 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20  clVersion]....  
a7c0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
a7d0: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
a7e0: 74 63 6c 42 75 67 20 24 76 65 72 73 69 6f 6e 5d  tclBug $version]
a7f0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
a800: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
a810: 72 67 73 20 74 63 6c 43 72 61 73 68 20 24 76 65  rgs tclCrash $ve
a820: 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  rsion]..      }.
a830: 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
a840: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
a850: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a860: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
a870: 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69  TE: We are runni
a880: 6e 67 20 69 6e 73 69 64 65 20 54 63 6c 2e 0d 0a  ng inside Tcl...
a890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61        #..      a
a8a0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c  ddConstraint tcl
a8b0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
a8c0: 20 20 20 23 20 4e 4f 54 45 3a 20 45 61 63 68 20     # NOTE: Each 
a8d0: 54 63 6c 20 62 75 67 20 61 6e 64 20 63 72 61 73  Tcl bug and cras
a8e0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  h constraint is 
a8f0: 73 65 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  set..      #    
a900: 20 20 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20     based on the 
a910: 65 78 61 63 74 20 54 63 6c 20 76 65 72 73 69 6f  exact Tcl versio
a920: 6e 20 28 69 2e 65 2e 20 6e 6f 74 0d 0a 20 20 20  n (i.e. not..   
a930: 20 20 20 23 20 20 20 20 20 20 20 67 72 65 61 74     #       great
a940: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a950: 20 74 6f 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   to)...      #..
a960: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
a970: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 76 65 72  exists ::tcl_ver
a980: 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sion]} then {.. 
a990: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a9a0: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61    # NOTE: For ea
a9b0: 63 68 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 77  ch Tcl version w
a9c0: 65 20 6b 6e 6f 77 20 61 62 6f 75 74 2c 0d 0a 20  e know about,.. 
a9d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
a9e0: 68 65 63 6b 20 69 74 20 61 67 61 69 6e 73 74 20  heck it against 
a9f0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 72 75  the currently ru
aa00: 6e 6e 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23  nning..        #
aa10: 20 20 20 20 20 20 20 54 63 6c 20 76 65 72 73 69         Tcl versi
aa20: 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 77 6f 20  on.  If the two 
aa30: 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2c 0d 0a  are not equal,..
aa40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
aa50: 61 64 64 20 74 68 65 20 74 65 73 74 20 63 6f 6e  add the test con
aa60: 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 70 72  straints that pr
aa70: 65 76 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 23  event..        #
aa80: 20 20 20 20 20 20 20 73 6b 69 70 70 69 6e 67 20         skipping 
aa90: 74 68 6f 73 65 20 74 65 73 74 73 20 74 68 61 74  those tests that
aaa0: 20 61 72 65 20 62 75 67 67 79 0d 0a 20 20 20 20   are buggy..    
aab0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e 6c 79      #       only
aac0: 20 66 6f 72 20 74 68 65 20 70 61 72 74 69 63 75   for the particu
aad0: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  lar version of T
aae0: 63 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  cl...        #..
aaf0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
ab00: 74 63 6c 56 65 72 73 69 6f 6e 20 5b 67 65 74 4b  tclVersion [getK
ab10: 6e 6f 77 6e 54 63 6c 56 65 72 73 69 6f 6e 73 5d  nownTclVersions]
ab20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
ab30: 74 20 64 6f 74 56 65 72 73 69 6f 6e 20 5b 67 65  t dotVersion [ge
ab40: 74 44 6f 74 74 65 64 56 65 72 73 69 6f 6e 20 24  tDottedVersion $
ab50: 74 63 6c 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20  tclVersion].... 
ab60: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 3a 3a           if {$::
ab70: 74 63 6c 5f 76 65 72 73 69 6f 6e 20 6e 65 20 24  tcl_version ne $
ab80: 64 6f 74 56 65 72 73 69 6f 6e 7d 20 74 68 65 6e  dotVersion} then
ab90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
aba0: 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  set version [get
abb0: 44 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 24  DotlessVersion $
abc0: 74 63 6c 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20  tclVersion].... 
abd0: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
abe0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
abf0: 41 72 67 73 20 74 63 6c 42 75 67 20 24 76 65 72  Args tclBug $ver
ac00: 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  sion]..         
ac10: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
ac20: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c   [appendArgs tcl
ac30: 43 72 61 73 68 20 24 76 65 72 73 69 6f 6e 5d 0d  Crash $version].
ac40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
ac50: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
ac60: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
ac70: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f     # NOTE: We do
ac80: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 73 6b 69   not want to ski
ac90: 70 20 62 75 67 73 20 6f 72 20 63 72 61 73 68 69  p bugs or crashi
aca0: 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ng..      #     
acb0: 20 20 69 73 73 75 65 73 20 66 6f 72 20 45 61 67    issues for Eag
acc0: 6c 65 20 73 69 6e 63 65 20 77 65 20 61 72 65 20  le since we are 
acd0: 6e 6f 74 20 72 75 6e 6e 69 6e 67 0d 0a 20 20 20  not running..   
ace0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 45 61     #       in Ea
acf0: 67 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  gle...      #.. 
ad00: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
ad10: 6e 74 20 65 61 67 6c 65 42 75 67 0d 0a 20 20 20  nt eagleBug..   
ad20: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
ad30: 20 65 61 67 6c 65 43 72 61 73 68 0d 0a 0d 0a 20   eagleCrash.... 
ad40: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ad50: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
ad60: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
ad70: 63 68 65 63 6b 46 6f 72 53 79 6d 62 6f 6c 73 20  checkForSymbols 
ad80: 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7b  { channel name {
ad90: 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7d  constraint ""} }
ada0: 20 7b 0d 0a 20 20 20 20 73 65 74 20 66 69 6c 65   {..    set file
adb0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  Name [file norma
adc0: 6c 69 7a 65 20 5b 61 70 70 65 6e 64 41 72 67 73  lize [appendArgs
add0: 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
ade0: 24 6e 61 6d 65 5d 20 2e 70 64 62 5d 5d 0d 0a 0d  $name] .pdb]]...
adf0: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
ae00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ae10: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
ae20: 6f 72 20 73 79 6d 62 6f 6c 73 20 5c 22 22 20 24  or symbols \"" $
ae30: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
ae40: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
ae50: 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65  .    if {[file e
ae60: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
ae70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ae80: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ae90: 20 54 68 65 20 66 69 6c 65 20 61 70 70 65 61 72   The file appear
aea0: 73 20 74 6f 20 68 61 76 65 20 61 73 73 6f 63 69  s to have associ
aeb0: 61 74 65 64 20 73 79 6d 62 6f 6c 73 20 61 76 61  ated symbols ava
aec0: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
aed0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
aee0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73  ing length $cons
aef0: 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20 74 68 65  traint] > 0} the
af00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  n {..        add
af10: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
af20: 6e 64 41 72 67 73 20 73 79 6d 62 6f 6c 73 5f 20  ndArgs symbols_ 
af30: 24 63 6f 6e 73 74 72 61 69 6e 74 5d 0d 0a 20 20  $constraint]..  
af40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
af50: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
af60: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
af70: 73 79 6d 62 6f 6c 73 5f 20 5b 66 69 6c 65 20 74  symbols_ [file t
af80: 61 69 6c 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20  ail $name]]..   
af90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
afa0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
afb0: 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  \n..    } else {
afc0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
afd0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
afe0: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
aff0: 6f 63 20 63 68 65 63 6b 46 6f 72 4c 6f 67 46 69  oc checkForLogFi
b000: 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  le { channel } {
b010: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
b020: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
b030: 69 6e 67 20 66 6f 72 20 6c 6f 67 20 66 69 6c 65  ing for log file
b040: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20  ... "....    if 
b050: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
b060: 74 65 73 74 5f 6c 6f 67 5d 20 26 26 20 5c 0d 0a  test_log] && \..
b070: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
b080: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6c  length $::test_l
b090: 6f 67 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  og] > 0 && \..  
b0a0: 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73        [file exis
b0b0: 74 73 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 5d 7d  ts $::test_log]}
b0c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
b0d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
b0e0: 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 61 70 70  The log file app
b0f0: 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c  ears to be avail
b100: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  able...      #..
b110: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
b120: 69 6e 74 20 6c 6f 67 46 69 6c 65 0d 0a 0d 0a 20  int logFile.... 
b130: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
b140: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
b150: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
b160: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
b170: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
b180: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
b190: 6f 72 47 61 72 75 64 61 20 7b 20 63 68 61 6e 6e  orGaruda { chann
b1a0: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
b1b0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
b1c0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 47 61   checking for Ga
b1d0: 72 75 64 61 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ruda... "....   
b1e0: 20 69 66 20 7b 5b 68 61 76 65 47 61 72 75 64 61   if {[haveGaruda
b1f0: 20 70 61 63 6b 61 67 65 49 64 5d 7d 20 74 68 65   packageId]} the
b200: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
b210: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
b220: 72 65 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  re running with 
b230: 6f 72 20 76 69 61 20 47 61 72 75 64 61 2e 0d 0a  or via Garuda...
b240: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61        #..      a
b250: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 67 61 72  ddConstraint gar
b260: 75 64 61 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  uda....      tpu
b270: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
b280: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
b290: 24 70 61 63 6b 61 67 65 49 64 20 22 29 5c 6e 22  $packageId ")\n"
b2a0: 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  ]..    } else {.
b2b0: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
b2c0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
b2d0: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
b2e0: 63 20 63 68 65 63 6b 46 6f 72 53 68 65 6c 6c 20  c checkForShell 
b2f0: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
b300: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
b310: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
b320: 20 66 6f 72 20 73 68 65 6c 6c 2e 2e 2e 20 22 0d   for shell... ".
b330: 0a 0d 0a 20 20 20 20 73 65 74 20 6e 61 6d 65 20  ...    set name 
b340: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
b350: 66 69 6c 65 20 74 61 69 6c 20 5b 69 6e 66 6f 20  file tail [info 
b360: 6e 61 6d 65 6f 66 65 78 65 63 75 74 61 62 6c 65  nameofexecutable
b370: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  ]]]....    if {[
b380: 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
b390: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b3a0: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
b3b0: 75 6c 74 2c 20 75 73 65 20 73 74 72 69 63 74 20  ult, use strict 
b3c0: 6d 61 74 63 68 69 6e 67 20 6f 66 20 74 68 65 20  matching of the 
b3d0: 73 68 65 6c 6c 20 65 78 65 63 75 74 61 62 6c 65  shell executable
b3e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b3f0: 6e 61 6d 65 20 28 65 78 61 63 74 29 3b 20 6f 74  name (exact); ot
b400: 68 65 72 77 69 73 65 2c 20 6d 61 74 63 68 20 61  herwise, match a
b410: 6e 79 20 65 78 65 63 75 74 61 62 6c 65 20 6e 61  ny executable na
b420: 6d 65 73 20 74 68 61 74 0d 0a 20 20 20 20 20 20  mes that..      
b430: 23 20 20 20 20 20 20 20 73 74 61 72 74 20 77 69  #       start wi
b440: 74 68 20 22 45 61 67 6c 65 22 2e 0d 0a 20 20 20  th "Eagle"...   
b450: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
b460: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
b470: 6e 6f 28 73 74 72 69 63 74 43 68 65 63 6b 46 6f  no(strictCheckFo
b480: 72 53 68 65 6c 6c 29 5d 7d 20 74 68 65 6e 20 7b  rShell)]} then {
b490: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ..        set ma
b4a0: 74 63 68 20 5b 65 78 70 72 20 7b 24 6e 61 6d 65  tch [expr {$name
b4b0: 20 65 71 20 22 45 61 67 6c 65 22 20 7c 7c 20 24   eq "Eagle" || $
b4c0: 6e 61 6d 65 20 65 71 20 22 45 61 67 6c 65 53 68  name eq "EagleSh
b4d0: 65 6c 6c 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  ell"}]..      } 
b4e0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b4f0: 73 65 74 20 6d 61 74 63 68 20 5b 73 74 72 69 6e  set match [strin
b500: 67 20 6d 61 74 63 68 20 45 61 67 6c 65 2a 20 24  g match Eagle* $
b510: 6e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  name]..      }..
b520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b530: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
b540: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 65 78  e name of the ex
b550: 65 63 75 74 61 62 6c 65 20 66 69 6c 65 20 61 70  ecutable file ap
b560: 70 65 61 72 20 74 6f 20 62 65 20 61 20 6d 61 74  pear to be a mat
b570: 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ch..      #     
b580: 20 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65    for one of the
b590: 20 22 77 65 6c 6c 2d 6b 6e 6f 77 6e 22 20 73 68   "well-known" sh
b5a0: 65 6c 6c 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  ells?..      #..
b5b0: 20 20 20 20 20 20 69 66 20 7b 24 6d 61 74 63 68        if {$match
b5c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b5d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
b5e0: 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e  OTE: We are runn
b5f0: 69 6e 67 20 69 6e 20 45 61 67 6c 65 20 76 69 61  ing in Eagle via
b600: 20 74 68 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e   the EagleShell.
b610: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b620: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
b630: 6e 74 20 73 68 65 6c 6c 0d 0a 20 20 20 20 20 20  nt shell..      
b640: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
b650: 5b 61 70 70 65 6e 64 41 72 67 73 20 73 68 65 6c  [appendArgs shel
b660: 6c 2e 20 24 6e 61 6d 65 5d 0d 0a 20 20 20 20 20  l. $name]..     
b670: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b680: 20 64 6f 74 4e 65 74 43 6f 72 65 4f 72 53 68 65   dotNetCoreOrShe
b690: 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ll....        tp
b6a0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 79 65  uts $channel "ye
b6b0: 73 20 28 45 61 67 6c 65 29 5c 6e 22 0d 0a 0d 0a  s (Eagle)\n"....
b6c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b6d0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
b6e0: 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
b6f0: 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
b700: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
b710: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  urn..      }..  
b720: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b730: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
b740: 74 63 68 20 74 63 6c 73 68 2a 20 24 6e 61 6d 65  tch tclsh* $name
b750: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b760: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
b770: 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e  NOTE: We are run
b780: 6e 69 6e 67 20 69 6e 20 54 63 6c 20 76 69 61 20  ning in Tcl via 
b790: 74 63 6c 73 68 2e 0d 0a 20 20 20 20 20 20 20 20  tclsh...        
b7a0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
b7b0: 6e 73 74 72 61 69 6e 74 20 73 68 65 6c 6c 0d 0a  nstraint shell..
b7c0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
b7d0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
b7e0: 73 20 73 68 65 6c 6c 2e 20 24 6e 61 6d 65 5d 0d  s shell. $name].
b7f0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
b800: 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 43 6f 72  traint dotNetCor
b810: 65 4f 72 53 68 65 6c 6c 0d 0a 0d 0a 20 20 20 20  eOrShell....    
b820: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
b830: 65 6c 20 22 79 65 73 20 28 54 63 6c 29 5c 6e 22  el "yes (Tcl)\n"
b840: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
b850: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
b860: 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
b870: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
b880: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b890: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
b8a0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74  ..    }....    t
b8b0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
b8c0: 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  \n..  }.....  pr
b8d0: 6f 63 20 63 68 65 63 6b 46 6f 72 4f 66 66 69 63  oc checkForOffic
b8e0: 69 61 6c 53 74 61 62 6c 65 52 65 6c 65 61 73 65  ialStableRelease
b8f0: 49 6e 50 72 6f 67 72 65 73 73 20 7b 20 63 68 61  InProgress { cha
b900: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 23 0d  nnel } {..    #.
b910: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20  .    # NOTE: If 
b920: 74 68 65 20 74 65 73 74 73 20 61 70 70 65 61 72  the tests appear
b930: 20 74 6f 20 62 65 20 72 75 6e 6e 69 6e 67 20 61   to be running a
b940: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6f 66  s part of the of
b950: 66 69 63 69 61 6c 20 73 74 61 62 6c 65 0d 0a 20  ficial stable.. 
b960: 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 65 61     #       relea
b970: 73 65 20 70 72 6f 63 65 73 73 20 66 6f 72 20 45  se process for E
b980: 61 67 6c 65 2c 20 74 68 65 6e 20 61 64 64 20 74  agle, then add t
b990: 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
b9a0: 6e 74 20 74 68 61 74 20 77 69 6c 6c 0d 0a 20 20  nt that will..  
b9b0: 20 20 23 20 20 20 20 20 20 20 62 65 20 63 68 65    #       be che
b9c0: 63 6b 65 64 20 62 79 20 74 68 65 20 5b 66 69 78  cked by the [fix
b9d0: 54 69 6d 69 6e 67 43 6f 6e 73 74 72 61 69 6e 74  TimingConstraint
b9e0: 73 5d 20 70 72 6f 63 65 64 75 72 65 2c 20 73 6f  s] procedure, so
b9f0: 20 74 68 61 74 20 74 65 73 74 73 0d 0a 20 20 20   that tests..   
ba00: 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 69   #       using i
ba10: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  t will not be co
ba20: 75 6e 74 65 64 20 61 67 61 69 6e 73 74 20 74 68  unted against th
ba30: 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74  e overall result
ba40: 73 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 23 20  s of the..    # 
ba50: 20 20 20 20 20 20 74 65 73 74 20 72 75 6e 2e 0d        test run..
ba60: 0a 20 20 20 20 23 0d 0a 20 20 20 20 74 70 75 74  .    #..    tput
ba70: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
ba80: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6f 66   checking for of
ba90: 66 69 63 69 61 6c 20 73 74 61 62 6c 65 20 72 65  ficial stable re
baa0: 6c 65 61 73 65 20 69 6e 20 70 72 6f 67 72 65 73  lease in progres
bab0: 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66  s... "....    if
bac0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
bad0: 3a 65 6e 76 28 4f 46 46 49 43 49 41 4c 29 5d 20  :env(OFFICIAL)] 
bae0: 26 26 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  && [info exists 
baf0: 3a 3a 65 6e 76 28 53 54 41 42 4c 45 29 5d 7d 20  ::env(STABLE)]} 
bb00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
bb10: 64 43 6f 6e 73 74 72 61 69 6e 74 20 6f 66 66 69  dConstraint offi
bb20: 63 69 61 6c 53 74 61 62 6c 65 52 65 6c 65 61 73  cialStableReleas
bb30: 65 49 6e 50 72 6f 67 72 65 73 73 0d 0a 0d 0a 20  eInProgress.... 
bb40: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
bb50: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
bb60: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
bb70: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
bb80: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
bb90: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
bba0: 6f 72 44 65 62 75 67 20 7b 20 63 68 61 6e 6e 65  orDebug { channe
bbb0: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
bbc0: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
bbd0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 65 62  checking for deb
bbe0: 75 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69  ug... "....    i
bbf0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
bc00: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 64  ::tcl_platform(d
bc10: 65 62 75 67 29 5d 20 26 26 20 24 3a 3a 74 63 6c  ebug)] && $::tcl
bc20: 5f 70 6c 61 74 66 6f 72 6d 28 64 65 62 75 67 29  _platform(debug)
bc30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bc40: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 65  addConstraint de
bc50: 62 75 67 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  bug....      tpu
bc60: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
bc70: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
bc80: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
bc90: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
bca0: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
bcb0: 63 20 63 68 65 63 6b 46 6f 72 54 6b 20 7b 20 63  c checkForTk { c
bcc0: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
bcd0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
bce0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
bcf0: 72 20 54 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  r Tk... "....   
bd00: 20 23 0d 0a 20 20 20 20 23 20 48 41 43 4b 3a 20   #..    # HACK: 
bd10: 46 6f 72 20 6e 6f 77 2c 20 64 69 73 61 62 6c 65  For now, disable
bd20: 20 74 65 73 74 69 6e 67 20 54 6b 20 38 2e 34 2f   testing Tk 8.4/
bd30: 38 2e 35 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  8.5 when running
bd40: 20 69 6e 20 45 61 67 6c 65 2e 0d 0a 20 20 20 20   in Eagle...    
bd50: 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 73 45  #..    if {![isE
bd60: 61 67 6c 65 5d 20 7c 7c 20 5b 68 61 76 65 43 6f  agle] || [haveCo
bd70: 6e 73 74 72 61 69 6e 74 20 74 63 6c 4c 69 62 72  nstraint tclLibr
bd80: 61 72 79 38 36 5d 20 7c 7c 20 5c 0d 0a 20 20 20  ary86] || \..   
bd90: 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
bda0: 61 69 6e 74 20 74 63 6c 4c 69 62 72 61 72 79 38  aint tclLibrary8
bdb0: 37 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  7]} then {..    
bdc0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
bdd0: 74 6b 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  tk....      tput
bde0: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
bdf0: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
be00: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
be10: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d  nnel no\n..    }
be20: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
be30: 20 63 68 65 63 6b 46 6f 72 56 65 72 73 69 6f 6e   checkForVersion
be40: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
be50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
be60: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
be70: 67 20 66 6f 72 20 6c 61 6e 67 75 61 67 65 20 76  g for language v
be80: 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ersion... ".... 
be90: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
bea0: 73 74 73 20 3a 3a 74 63 6c 5f 76 65 72 73 69 6f  sts ::tcl_versio
beb0: 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
bec0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
bed0: 45 3a 20 46 69 72 73 74 2c 20 6f 62 74 61 69 6e  E: First, obtain
bee0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
bef0: 20 22 6b 6e 6f 77 6e 22 20 54 63 6c 20 76 65 72   "known" Tcl ver
bf00: 73 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 23 0d  sions...      #.
bf10: 0a 20 20 20 20 20 20 73 65 74 20 74 63 6c 56 65  .      set tclVe
bf20: 72 73 69 6f 6e 73 20 5b 67 65 74 4b 6e 6f 77 6e  rsions [getKnown
bf30: 54 63 6c 56 65 72 73 69 6f 6e 73 5d 0d 0a 0d 0a  TclVersions]....
bf40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bf50: 20 4e 4f 54 45 3a 20 2a 45 41 47 4c 45 2a 20 57   NOTE: *EAGLE* W
bf60: 65 20 64 6f 20 77 61 6e 74 20 74 6f 20 69 6e 63  e do want to inc
bf70: 6c 75 64 65 20 61 6e 79 20 74 65 73 74 73 20 74  lude any tests t
bf80: 68 61 74 20 74 61 72 67 65 74 0d 0a 20 20 20 20  hat target..    
bf90: 20 20 23 20 20 20 20 20 20 20 22 54 63 6c 20 38    #       "Tcl 8
bfa0: 2e 58 20 6f 72 20 68 69 67 68 65 72 22 20 66 65  .X or higher" fe
bfb0: 61 74 75 72 65 73 20 62 65 63 61 75 73 65 20 74  atures because t
bfc0: 68 6f 73 65 20 74 65 73 74 73 0d 0a 20 20 20 20  hose tests..    
bfd0: 20 20 23 20 20 20 20 20 20 20 77 6f 75 6c 64 20    #       would 
bfe0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 74 65  not be in the te
bff0: 73 74 20 73 75 69 74 65 20 69 66 20 77 65 20 64  st suite if we d
c000: 69 64 20 6e 6f 74 20 73 75 70 70 6f 72 74 0d 0a  id not support..
c010: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
c020: 61 74 20 70 61 72 74 69 63 75 6c 61 72 20 66 65  at particular fe
c030: 61 74 75 72 65 2c 20 72 65 67 61 72 64 6c 65 73  ature, regardles
c040: 73 20 6f 66 20 74 68 65 20 6c 61 6e 67 75 61 67  s of the languag
c050: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
c060: 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20   version...     
c070: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
c080: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
c090: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c0a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 63      # NOTE: Proc
c0b0: 65 73 73 20 65 61 63 68 20 22 6b 6e 6f 77 6e 22  ess each "known"
c0c0: 20 54 63 6c 20 76 65 72 73 69 6f 6e 2c 20 61 64   Tcl version, ad
c0d0: 64 69 6e 67 20 65 61 63 68 20 6f 66 0d 0a 20 20  ding each of..  
c0e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
c0f0: 65 20 22 66 65 61 74 75 72 65 22 20 63 6f 6e 73  e "feature" cons
c100: 74 72 61 69 6e 74 73 20 28 69 2e 65 2e 20 73 69  traints (i.e. si
c110: 6e 63 65 20 74 68 69 73 20 69 73 20 61 6e 0d 0a  nce this is an..
c120: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c130: 45 61 67 6c 65 20 74 65 73 74 20 73 75 69 74 65  Eagle test suite
c140: 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
c150: 70 61 63 6b 61 67 65 29 2e 0d 0a 20 20 20 20 20  package)...     
c160: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
c170: 72 65 61 63 68 20 74 63 6c 56 65 72 73 69 6f 6e  reach tclVersion
c180: 28 31 29 20 24 74 63 6c 56 65 72 73 69 6f 6e 73  (1) $tclVersions
c190: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
c1a0: 74 20 76 65 72 73 69 6f 6e 28 31 29 20 5b 67 65  t version(1) [ge
c1b0: 74 44 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e 20  tDotlessVersion 
c1c0: 24 74 63 6c 56 65 72 73 69 6f 6e 28 31 29 5d 0d  $tclVersion(1)].
c1d0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
c1e0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
c1f0: 41 72 67 73 20 74 63 6c 20 24 76 65 72 73 69 6f  Args tcl $versio
c200: 6e 28 31 29 20 46 65 61 74 75 72 65 5d 0d 0a 20  n(1) Feature].. 
c210: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
c220: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
c230: 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 63      # NOTE: Proc
c240: 65 73 73 20 65 61 63 68 20 22 6b 6e 6f 77 6e 22  ess each "known"
c250: 20 54 63 6c 20 76 65 72 73 69 6f 6e 2c 20 63 68   Tcl version, ch
c260: 65 63 6b 69 6e 67 20 66 6f 72 20 61 6e 0d 0a 20  ecking for an.. 
c270: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78 61       #       exa
c280: 63 74 20 6d 61 74 63 68 20 77 69 74 68 20 74 68  ct match with th
c290: 65 20 72 75 6e 6e 69 6e 67 20 54 63 6c 20 76 65  e running Tcl ve
c2a0: 72 73 69 6f 6e 2e 20 20 57 68 65 6e 20 61 6e 0d  rsion.  When an.
c2b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
c2c0: 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f  xact match is fo
c2d0: 75 6e 64 2c 20 61 64 64 20 61 70 70 72 6f 70 72  und, add appropr
c2e0: 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  iate constraints
c2f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c300: 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72    foreach tclVer
c310: 73 69 6f 6e 28 31 29 20 24 74 63 6c 56 65 72 73  sion(1) $tclVers
c320: 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ions {..        
c330: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c340: 45 3a 20 44 6f 65 73 20 74 68 65 20 72 75 6e 6e  E: Does the runn
c350: 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20  ing Tcl version 
c360: 6d 61 74 63 68 20 74 68 69 73 20 22 6b 6e 6f 77  match this "know
c370: 6e 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n"..        #   
c380: 20 20 20 20 54 63 6c 20 76 65 72 73 69 6f 6e 20      Tcl version 
c390: 65 78 61 63 74 6c 79 3f 0d 0a 20 20 20 20 20 20  exactly?..      
c3a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
c3b0: 7b 24 3a 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 20  {$::tcl_version 
c3c0: 65 71 20 5b 67 65 74 44 6f 74 74 65 64 56 65 72  eq [getDottedVer
c3d0: 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e  sion $tclVersion
c3e0: 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  (1)]} then {..  
c3f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
c410: 2c 20 69 74 20 64 6f 65 73 2e 20 20 46 69 72 73  , it does.  Firs
c420: 74 2c 20 61 64 64 20 74 68 65 20 22 65 78 61 63  t, add the "exac
c430: 74 22 20 6d 61 74 63 68 0d 0a 20 20 20 20 20 20  t" match..      
c440: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 73      #       cons
c450: 74 72 61 69 6e 74 2e 20 20 54 68 65 72 65 20 63  traint.  There c
c460: 61 6e 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f  an be only one o
c470: 66 20 74 68 65 73 65 2e 0d 0a 20 20 20 20 20 20  f these...      
c480: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c490: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
c4a0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 20              tcl 
c4c0: 5b 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69  [getDotlessVersi
c4d0: 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e 28 31  on $tclVersion(1
c4e0: 29 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  )]]....         
c4f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
c500: 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 70 72 6f 63  NOTE: Next, proc
c510: 65 73 73 20 65 61 63 68 20 6f 66 20 74 68 65 20  ess each of the 
c520: 22 6b 6e 6f 77 6e 22 20 54 63 6c 20 76 65 72 73  "known" Tcl vers
c530: 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
c540: 23 20 20 20 20 20 20 20 6c 65 73 73 20 74 68 61  #       less tha
c550: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
c560: 65 20 72 75 6e 6e 69 6e 67 20 54 63 6c 20 76 65  e running Tcl ve
c570: 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20  rsion,..        
c580: 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20    #       while 
c590: 61 64 64 69 6e 67 20 62 6f 74 68 20 74 68 65 20  adding both the 
c5a0: 22 66 65 61 74 75 72 65 22 20 61 6e 64 20 22 6f  "feature" and "o
c5b0: 72 20 68 69 67 68 65 72 22 0d 0a 20 20 20 20 20  r higher"..     
c5c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
c5d0: 73 74 72 61 69 6e 74 73 2e 20 20 54 68 65 72 65  straints.  There
c5e0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
c5f0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 0d 0a 20 20  at least one..  
c600: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c610: 6f 66 20 74 68 65 73 65 2e 0d 0a 20 20 20 20 20  of these...     
c620: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c630: 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72    foreach tclVer
c640: 73 69 6f 6e 28 32 29 20 5b 66 69 6c 74 65 72 4b  sion(2) [filterK
c650: 6e 6f 77 6e 56 65 72 73 69 6f 6e 73 20 5c 0d 0a  nownVersions \..
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74                $t
c670: 63 6c 56 65 72 73 69 6f 6e 73 20 22 22 20 24 74  clVersions "" $t
c680: 63 6c 56 65 72 73 69 6f 6e 28 31 29 5d 20 7b 0d  clVersion(1)] {.
c690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
c6a0: 20 76 65 72 73 69 6f 6e 28 32 29 20 5b 67 65 74   version(2) [get
c6b0: 44 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 24  DotlessVersion $
c6c0: 74 63 6c 56 65 72 73 69 6f 6e 28 32 29 5d 0d 0a  tclVersion(2)]..
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
c6e0: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c6f0: 64 41 72 67 73 20 74 63 6c 20 24 76 65 72 73 69  dArgs tcl $versi
c700: 6f 6e 28 32 29 20 46 65 61 74 75 72 65 5d 0d 0a  on(2) Feature]..
c710: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
c720: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c730: 64 41 72 67 73 20 74 63 6c 20 24 76 65 72 73 69  dArgs tcl $versi
c740: 6f 6e 28 32 29 20 4f 72 48 69 67 68 65 72 5d 0d  on(2) OrHigher].
c750: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
c760: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c770: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
c780: 69 6e 61 6c 6c 79 2c 20 70 72 6f 63 65 73 73 20  inally, process 
c790: 65 61 63 68 20 6f 66 20 74 68 65 20 22 6b 6e 6f  each of the "kno
c7a0: 77 6e 22 20 54 63 6c 20 76 65 72 73 69 6f 6e 73  wn" Tcl versions
c7b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
c7c0: 20 20 20 20 67 72 65 61 74 65 72 20 74 68 61 6e      greater than
c7d0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
c7e0: 20 72 75 6e 6e 69 6e 67 20 54 63 6c 20 76 65 72   running Tcl ver
c7f0: 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
c800: 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 61   #       while a
c810: 64 64 69 6e 67 20 74 68 65 20 22 6f 72 20 6c 6f  dding the "or lo
c820: 77 65 72 22 20 63 6f 6e 73 74 72 61 69 6e 74 73  wer" constraints
c830: 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
c840: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c      #       will
c850: 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
c860: 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73 65  ast one of these
c870: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
c880: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
c890: 68 20 74 63 6c 56 65 72 73 69 6f 6e 28 33 29 20  h tclVersion(3) 
c8a0: 5b 66 69 6c 74 65 72 4b 6e 6f 77 6e 56 65 72 73  [filterKnownVers
c8b0: 69 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  ions \..        
c8c0: 20 20 20 20 20 20 24 74 63 6c 56 65 72 73 69 6f        $tclVersio
c8d0: 6e 73 20 24 74 63 6c 56 65 72 73 69 6f 6e 28 31  ns $tclVersion(1
c8e0: 29 20 22 22 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ) ""] {..       
c8f0: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
c900: 28 33 29 20 5b 67 65 74 44 6f 74 6c 65 73 73 56  (3) [getDotlessV
c910: 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69  ersion $tclVersi
c920: 6f 6e 28 33 29 5d 0d 0a 20 20 20 20 20 20 20 20  on(3)]..        
c930: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
c940: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63  t [appendArgs tc
c950: 6c 20 24 76 65 72 73 69 6f 6e 28 33 29 20 4f 72  l $version(3) Or
c960: 4c 6f 77 65 72 5d 0d 0a 20 20 20 20 20 20 20 20  Lower]..        
c970: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
c980: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
c990: 4e 4f 54 45 3a 20 54 68 65 72 65 20 63 61 6e 20  NOTE: There can 
c9a0: 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 61 63  be only one exac
c9b0: 74 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 6d 61  t Tcl version ma
c9c0: 74 63 68 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  tch;..          
c9d0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
c9e0: 65 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d  e, we are done..
c9f0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ca00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20          break.. 
ca10: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ca20: 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  }....      tputs
ca30: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
ca40: 64 41 72 67 73 20 24 3a 3a 74 63 6c 5f 76 65 72  dArgs $::tcl_ver
ca50: 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20  sion \n]..    } 
ca60: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70  else {..      tp
ca70: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
ca80: 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  n..    }..  }...
ca90: 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
caa0: 72 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e 6e  rCommand { chann
cab0: 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  el name } {..   
cac0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
cad0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
cae0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 63  - checking for c
caf0: 6f 6d 6d 61 6e 64 20 5c 22 22 20 24 6e 61 6d 65  ommand \"" $name
cb00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 22 5c 22 2e   \..        "\".
cb10: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a  .. "]....    #..
cb20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
cb30: 68 65 20 63 6f 6d 6d 61 6e 64 20 61 76 61 69 6c  he command avail
cb40: 61 62 6c 65 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  able?..    #..  
cb50: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b    if {[llength [
cb60: 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 24 6e  info commands $n
cb70: 61 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ame]] > 0} then 
cb80: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
cb90: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
cba0: 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
cbb0: 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
cbc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cbd0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
cbe0: 70 70 65 6e 64 41 72 67 73 20 63 6f 6d 6d 61 6e  ppendArgs comman
cbf0: 64 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  d. $name]....   
cc00: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
cc10: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
cc20: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
cc30: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
cc40: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
cc50: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
cc60: 53 75 62 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61  SubCommand { cha
cc70: 6e 6e 65 6c 20 6e 61 6d 65 73 20 7d 20 7b 0d 0a  nnel names } {..
cc80: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
cc90: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
cca0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
ccb0: 72 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 5c 22  r sub-command \"
ccc0: 22 20 24 6e 61 6d 65 73 20 5c 0d 0a 20 20 20 20  " $names \..    
ccd0: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
cce0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
ccf0: 54 45 3a 20 49 73 20 74 68 65 20 73 75 62 2d 63  TE: Is the sub-c
cd00: 6f 6d 6d 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  ommand available
cd10: 3f 20 20 54 68 65 20 6c 69 73 74 20 6f 66 20 6e  ?  The list of n
cd20: 61 6d 65 73 20 6d 75 73 74 20 68 61 76 65 0d 0a  ames must have..
cd30: 20 20 20 20 23 20 20 20 20 20 20 20 65 78 61 63      #       exac
cd40: 74 6c 79 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  tly two elements
cd50: 2e 20 20 54 68 65 20 66 69 72 73 74 20 65 6c 65  .  The first ele
cd60: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 74 68 65  ment must be the
cd70: 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 23 20   command..    # 
cd80: 20 20 20 20 20 20 6e 61 6d 65 20 61 6e 64 20 74        name and t
cd90: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
cda0: 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 75  t must be the su
cdb0: 62 2d 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 2e 0d  b-command name..
cdc0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
cdd0: 5b 6c 6c 65 6e 67 74 68 20 24 6e 61 6d 65 73 5d  [llength $names]
cde0: 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 2} then {.. 
cdf0: 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
ce00: 4e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 6e 61  Name [lindex $na
ce10: 6d 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 73 65  mes 0]..      se
ce20: 74 20 73 75 62 43 6f 6d 6d 61 6e 64 4e 61 6d 65  t subCommandName
ce30: 20 5b 6c 69 6e 64 65 78 20 24 6e 61 6d 65 73 20   [lindex $names 
ce40: 31 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  1]....      if {
ce50: 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20  [isEagle]} then 
ce60: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
ce70: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
ce80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ce90: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 45 61 67 6c  # NOTE: For Eagl
cea0: 65 2c 20 75 73 65 20 74 68 65 20 5b 69 6e 66 6f  e, use the [info
ceb0: 20 73 75 62 63 6f 6d 6d 61 6e 64 73 5d 20 73 75   subcommands] su
cec0: 62 2d 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20  b-command...    
ced0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cee0: 20 20 20 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61     info subcomma
cef0: 6e 64 73 20 24 63 6f 6d 6d 61 6e 64 4e 61 6d 65  nds $commandName
cf00: 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 75 62 43  ..        } subC
cf10: 6f 6d 6d 61 6e 64 73 5d 20 3d 3d 20 30 7d 20 74  ommands] == 0} t
cf20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
cf30: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65   if {[lsearch -e
cf40: 78 61 63 74 20 2d 2d 20 24 73 75 62 43 6f 6d 6d  xact -- $subComm
cf50: 61 6e 64 73 20 24 73 75 62 43 6f 6d 6d 61 6e 64  ands $subCommand
cf60: 4e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65  Name] != -1} the
cf70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
cf80: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
cf90: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
cfa0: 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
cfb0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
cfc0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
cfd0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
cfe0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
cff0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d000: 20 20 20 20 20 20 20 73 75 62 43 6f 6d 6d 61 6e         subComman
d010: 64 2e 20 24 63 6f 6d 6d 61 6e 64 4e 61 6d 65 20  d. $commandName 
d020: 2e 20 24 73 75 62 43 6f 6d 6d 61 6e 64 4e 61 6d  . $subCommandNam
d030: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
d040: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
d050: 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
d060: 61 74 20 74 68 65 20 73 75 62 2d 63 6f 6d 6d 61  at the sub-comma
d070: 6e 64 20 77 61 73 20 66 6f 75 6e 64 2e 0d 0a 20  nd was found... 
d080: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
d090: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d0a0: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
d0b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
d0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
d0d0: 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65  OTE: We are done
d0e0: 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f   here, return no
d0f0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  w...            
d100: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
d110: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20  eturn..         
d120: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
d130: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
d140: 3a 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 20 3e 3d  ::tcl_version >=
d150: 20 38 2e 35 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   8.5} then {..  
d160: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
d170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
d180: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
d190: 45 3a 20 46 6f 72 20 54 63 6c 20 38 2e 35 2b 2c  E: For Tcl 8.5+,
d1a0: 20 75 73 65 20 74 68 65 20 5b 6e 61 6d 65 73 70   use the [namesp
d1b0: 61 63 65 20 65 6e 73 65 6d 62 6c 65 5d 20 73 75  ace ensemble] su
d1c0: 62 2d 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20  b-command...    
d1d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d1e0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 6e 73     namespace ens
d1f0: 65 6d 62 6c 65 20 63 6f 6e 66 69 67 75 72 65 20  emble configure 
d200: 24 63 6f 6d 6d 61 6e 64 4e 61 6d 65 0d 0a 20 20  $commandName..  
d210: 20 20 20 20 20 20 7d 20 73 75 62 43 6f 6d 6d 61        } subComma
d220: 6e 64 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nds] == 0} then 
d230: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
d240: 65 61 63 68 20 7b 6e 61 6d 65 20 76 61 6c 75 65  each {name value
d250: 7d 20 5b 67 65 74 44 69 63 74 69 6f 6e 61 72 79  } [getDictionary
d260: 56 61 6c 75 65 20 24 73 75 62 43 6f 6d 6d 61 6e  Value $subComman
d270: 64 73 20 2d 6d 61 70 5d 20 7b 0d 0a 20 20 20 20  ds -map] {..    
d280: 20 20 20 20 20 20 20 20 69 66 20 7b 24 6e 61 6d          if {$nam
d290: 65 20 65 71 20 24 73 75 62 43 6f 6d 6d 61 6e 64  e eq $subCommand
d2a0: 4e 61 6d 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  Name} then {..  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
d2d0: 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70  OTE: Yes, it app
d2e0: 65 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20  ears that it is 
d2f0: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
d300: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d310: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
d320: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
d330: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d340: 20 20 20 20 20 20 20 20 20 20 73 75 62 43 6f 6d            subCom
d350: 6d 61 6e 64 2e 20 24 63 6f 6d 6d 61 6e 64 4e 61  mand. $commandNa
d360: 6d 65 20 2e 20 24 73 75 62 43 6f 6d 6d 61 6e 64  me . $subCommand
d370: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Name]....       
d380: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d390: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d3a0: 53 68 6f 77 20 74 68 61 74 20 74 68 65 20 73 75  Show that the su
d3b0: 62 2d 63 6f 6d 6d 61 6e 64 20 77 61 73 20 66 6f  b-command was fo
d3c0: 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  und...          
d3d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d3e0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d3f0: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20  nel yes\n....   
d400: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
d410: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
d420: 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
d430: 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
d440: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d450: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
d460: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
d470: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d480: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
d490: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
d4a0: 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  ...    tputs $ch
d4b0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d  annel no\n..  }.
d4c0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
d4d0: 46 6f 72 4e 61 6d 65 73 70 61 63 65 73 20 7b 20  ForNamespaces { 
d4e0: 63 68 61 6e 6e 65 6c 20 71 75 69 65 74 20 7d 20  channel quiet } 
d4f0: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
d500: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
d510: 6b 69 6e 67 20 66 6f 72 20 6e 61 6d 65 73 70 61  king for namespa
d520: 63 65 20 73 75 70 70 6f 72 74 2e 2e 2e 20 22 0d  ce support... ".
d530: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61  ...    if {[isEa
d540: 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gle]} then {..  
d550: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d560: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 6e 61  OTE: Check if na
d570: 6d 65 73 70 61 63 65 20 73 75 70 70 6f 72 74 20  mespace support 
d580: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74  was compiled int
d590: 6f 20 74 68 65 20 63 6f 72 65 0d 0a 20 20 20 20  o the core..    
d5a0: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
d5b0: 79 20 28 69 2e 65 2e 20 74 68 69 73 20 69 73 20  y (i.e. this is 
d5c0: 62 65 74 61 20 33 30 20 6f 72 20 6c 61 74 65 72  beta 30 or later
d5d0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
d5e0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6e     if {[catch {n
d5f0: 61 6d 65 73 70 61 63 65 20 65 6e 61 62 6c 65 7d  amespace enable}
d600: 20 65 6e 61 62 6c 65 64 5d 20 3d 3d 20 30 7d 20   enabled] == 0} 
d610: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d620: 73 65 74 20 61 76 61 69 6c 61 62 6c 65 20 74 72  set available tr
d630: 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61 64  ue....        ad
d640: 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65  dConstraint name
d650: 73 70 61 63 65 73 2e 61 76 61 69 6c 61 62 6c 65  spaces.available
d660: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
d670: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 76  ..        set av
d680: 61 69 6c 61 62 6c 65 20 66 61 6c 73 65 0d 0a 0d  ailable false...
d690: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
d6a0: 74 72 61 69 6e 74 20 6e 61 6d 65 73 70 61 63 65  traint namespace
d6b0: 73 2e 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 20  s.unavailable.. 
d6c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d6d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d6e0: 20 57 65 20 77 65 72 65 20 61 62 6c 65 20 74 6f   We were able to
d6f0: 20 71 75 65 72 79 20 66 6f 72 20 6e 61 6d 65 73   query for names
d700: 70 61 63 65 20 73 75 70 70 6f 72 74 20 28 69 2e  pace support (i.
d710: 65 2e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  e. this..      #
d720: 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 62         must be b
d730: 65 74 61 20 32 39 20 6f 72 20 6c 61 74 65 72 29  eta 29 or later)
d740: 3b 20 68 6f 77 65 76 65 72 2c 20 77 65 20 73 74  ; however, we st
d750: 69 6c 6c 20 6e 65 65 64 20 74 6f 0d 0a 20 20 20  ill need to..   
d760: 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b     #       check
d770: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
d780: 65 6e 61 62 6c 65 64 20 61 74 20 72 75 6e 74 69  enabled at runti
d790: 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  me...      #..  
d7a0: 20 20 20 20 69 66 20 7b 24 65 6e 61 62 6c 65 64      if {$enabled
d7b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d7c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
d7d0: 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70  OTE: Yes, it app
d7e0: 65 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20  ears that it is 
d7f0: 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 65 6e  available and en
d800: 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  abled...        
d810: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
d820: 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65 73 70 61  nstraint namespa
d830: 63 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ces....        t
d840: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 6e  puts $channel en
d850: 61 62 6c 65 64 5c 6e 0d 0a 20 20 20 20 20 20 7d  abled\n..      }
d860: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
d870: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d880: 64 69 73 61 62 6c 65 64 5c 6e 0d 0a 0d 0a 20 20  disabled\n....  
d890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d8a0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
d8b0: 66 20 6e 61 6d 65 73 70 61 63 65 20 73 75 70 70  f namespace supp
d8c0: 6f 72 74 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ort was compiled
d8d0: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 65 0d 0a   into the core..
d8e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
d8f0: 6c 69 62 72 61 72 79 20 28 69 2e 65 2e 20 69 73  library (i.e. is
d900: 20 74 68 69 73 20 62 65 74 61 20 33 30 20 6f 72   this beta 30 or
d910: 20 6c 61 74 65 72 29 2e 0d 0a 20 20 20 20 20 20   later)...      
d920: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
d930: 7b 21 24 71 75 69 65 74 20 26 26 20 24 61 76 61  {!$quiet && $ava
d940: 69 6c 61 62 6c 65 7d 20 74 68 65 6e 20 7b 0d 0a  ilable} then {..
d950: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d960: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
d970: 68 65 20 74 65 73 74 73 20 73 65 65 6d 20 74 6f  he tests seem to
d980: 20 62 65 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   be running with
d990: 20 6e 61 6d 65 73 70 61 63 65 20 73 75 70 70 6f   namespace suppo
d9a0: 72 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  rt..          # 
d9b0: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 2c        available,
d9c0: 20 62 75 74 20 64 69 73 61 62 6c 65 64 2e 20 20   but disabled.  
d9d0: 45 6d 69 74 20 61 20 77 61 72 6e 69 6e 67 20 69  Emit a warning i
d9e0: 6e 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20  nto the..       
d9f0: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
da00: 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
da10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
da20: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
da30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
da40: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
da50: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6e 61   running with na
da60: 6d 65 73 70 61 63 65 73 20 61 76 61 69 6c 61 62  mespaces availab
da70: 6c 65 20 61 6e 64 20 64 69 73 61 62 6c 65 64 5c  le and disabled\
da80: 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n"..        }.. 
da90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c       }..    } el
daa0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  se {..      #.. 
dab0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 6c       # NOTE: All
dac0: 20 73 75 70 70 6f 72 74 65 64 20 76 65 72 73 69   supported versi
dad0: 6f 6e 73 20 6f 66 20 6e 61 74 69 76 65 20 54 63  ons of native Tc
dae0: 6c 20 68 61 76 65 20 6e 61 6d 65 73 70 61 63 65  l have namespace
daf0: 73 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20  s enabled..     
db00: 20 23 20 20 20 20 20 20 20 61 6e 64 20 61 76 61   #       and ava
db10: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
db20: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
db30: 72 61 69 6e 74 20 6e 61 6d 65 73 70 61 63 65 73  raint namespaces
db40: 2e 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20  .available..    
db50: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
db60: 6e 61 6d 65 73 70 61 63 65 73 0d 0a 0d 0a 20 20  namespaces....  
db70: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
db80: 65 6c 20 65 6e 61 62 6c 65 64 5c 6e 0d 0a 20 20  el enabled\n..  
db90: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
dba0: 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65 73 74  roc checkForTest
dbb0: 45 78 65 63 20 7b 20 63 68 61 6e 6e 65 6c 20 71  Exec { channel q
dbc0: 75 69 65 74 20 7d 20 7b 0d 0a 20 20 20 20 74 70  uiet } {..    tp
dbd0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
dbe0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
dbf0: 74 65 73 74 20 75 73 65 20 6f 66 20 5c 22 65 78  test use of \"ex
dc00: 65 63 5c 22 20 63 6f 6d 6d 61 6e 64 2e 2e 2e 20  ec\" command... 
dc10: 22 0d 0a 0d 0a 20 20 20 20 73 65 74 20 70 72 6f  "....    set pro
dc20: 63 4e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 5b 69  cName [lindex [i
dc30: 6e 66 6f 20 6c 65 76 65 6c 20 5b 69 6e 66 6f 20  nfo level [info 
dc40: 6c 65 76 65 6c 5d 5d 20 30 5d 0d 0a 0d 0a 20 20  level]] 0]....  
dc50: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
dc60: 73 74 73 20 3a 3a 6e 6f 28 74 65 73 74 45 78 65  sts ::no(testExe
dc70: 63 29 5d 20 26 26 20 5b 63 61 6e 54 65 73 74 45  c)] && [canTestE
dc80: 78 65 63 20 24 70 72 6f 63 4e 61 6d 65 5d 7d 20  xec $procName]} 
dc90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
dca0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 65 73 74  dConstraint test
dcb0: 45 78 65 63 0d 0a 0d 0a 20 20 20 20 20 20 74 70  Exec....      tp
dcc0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
dcd0: 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  \n....      if {
dce0: 21 24 71 75 69 65 74 20 26 26 20 5b 69 6e 66 6f  !$quiet && [info
dcf0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65   exists ::no(exe
dd00: 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  c)]} then {..   
dd10: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
dd20: 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
dd30: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
dd40: 3a 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 74  : running with t
dd50: 68 65 20 5c 22 74 65 73 74 45 78 65 63 5c 22 20  he \"testExec\" 
dd60: 70 72 6f 63 65 64 75 72 65 20 64 69 73 61 62 6c  procedure disabl
dd70: 65 64 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ed\n"..      }..
dd80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
dd90: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
dda0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
ddb0: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
ddc0: 68 65 63 6b 46 6f 72 54 65 73 74 4d 61 63 68 69  heckForTestMachi
ddd0: 6e 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ne { channel } {
dde0: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
ddf0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
de00: 69 6e 67 20 66 6f 72 20 74 65 73 74 20 6d 61 63  ing for test mac
de10: 68 69 6e 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  hine... "....   
de20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
de30: 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65  s ::test_machine
de40: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
de50: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
de60: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
de70: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
de80: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
de90: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 61 63   [appendArgs mac
dea0: 68 69 6e 65 2e 20 24 3a 3a 74 65 73 74 5f 6d 61  hine. $::test_ma
deb0: 63 68 69 6e 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  chine]....      
dec0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ded0: 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74 65  appendArgs $::te
dee0: 73 74 5f 6d 61 63 68 69 6e 65 20 5c 6e 5d 0d 0a  st_machine \n]..
def0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
df00: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
df10: 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
df20: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
df30: 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 65 73 74  roc checkForTest
df40: 50 6c 61 74 66 6f 72 6d 20 7b 20 63 68 61 6e 6e  Platform { chann
df50: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
df60: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
df70: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 65   checking for te
df80: 73 74 20 70 6c 61 74 66 6f 72 6d 2e 2e 2e 20 22  st platform... "
df90: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66  ....    if {[inf
dfa0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
dfb0: 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a  platform] && \..
dfc0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
dfd0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 70  length $::test_p
dfe0: 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
dff0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43  en {..      addC
e000: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
e010: 64 41 72 67 73 20 70 6c 61 74 66 6f 72 6d 2e 20  dArgs platform. 
e020: 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d  $::test_platform
e030: 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  ]....      tputs
e040: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e050: 64 41 72 67 73 20 24 3a 3a 74 65 73 74 5f 70 6c  dArgs $::test_pl
e060: 61 74 66 6f 72 6d 20 5c 6e 5d 0d 0a 20 20 20 20  atform \n]..    
e070: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e080: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75  tputs $channel u
e090: 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 7d 0d  nknown\n..    }.
e0a0: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
e0b0: 63 68 65 63 6b 46 6f 72 54 65 73 74 43 6f 6e 66  checkForTestConf
e0c0: 69 67 75 72 61 74 69 6f 6e 20 7b 20 63 68 61 6e  iguration { chan
e0d0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  nel } {..    tpu
e0e0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
e0f0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  - checking for t
e100: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
e110: 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66  n... "....    if
e120: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
e130: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
e140: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
e150: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
e160: 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  h $::test_config
e170: 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  uration] > 0} th
e180: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43  en {..      addC
e190: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
e1a0: 64 41 72 67 73 20 63 6f 6e 66 69 67 75 72 61 74  dArgs configurat
e1b0: 69 6f 6e 2e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ion. $::test_con
e1c0: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20  figuration].... 
e1d0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e1e0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e1f0: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
e200: 61 74 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 7d  ation \n]..    }
e210: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
e220: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e  puts $channel un
e230: 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  known\n..    }..
e240: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
e250: 68 65 63 6b 46 6f 72 54 65 73 74 53 75 66 66 69  heckForTestSuffi
e260: 78 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  x { channel } {.
e270: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
e280: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
e290: 6e 67 20 66 6f 72 20 74 65 73 74 20 73 75 66 66  ng for test suff
e2a0: 69 78 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69  ix... "....    i
e2b0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
e2c0: 3a 3a 74 65 73 74 5f 73 75 66 66 69 78 5d 20 26  ::test_suffix] &
e2d0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74  & \..        [st
e2e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
e2f0: 65 73 74 5f 73 75 66 66 69 78 5d 20 3e 20 30 7d  est_suffix] > 0}
e300: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
e310: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
e320: 70 65 6e 64 41 72 67 73 20 73 75 66 66 69 78 2e  pendArgs suffix.
e330: 20 24 3a 3a 74 65 73 74 5f 73 75 66 66 69 78 5d   $::test_suffix]
e340: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
e350: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e360: 41 72 67 73 20 24 3a 3a 74 65 73 74 5f 73 75 66  Args $::test_suf
e370: 66 69 78 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20 65  fix \n]..    } e
e380: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
e390: 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  ts $channel unkn
e3a0: 6f 77 6e 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20  own\n..    }..  
e3b0: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
e3c0: 63 6b 46 6f 72 46 69 6c 65 20 7b 20 63 68 61 6e  ckForFile { chan
e3d0: 6e 65 6c 20 6e 61 6d 65 20 7b 63 6f 6e 73 74 72  nel name {constr
e3e0: 61 69 6e 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  aint ""} } {..  
e3f0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e400: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
e410: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
e420: 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
e430: 20 20 20 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c      [file normal
e440: 69 7a 65 20 24 6e 61 6d 65 5d 20 22 5c 22 2e 2e  ize $name] "\"..
e450: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  . "]....    if {
e460: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 6e 61  [file exists $na
e470: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
e480: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e490: 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65  TE: Yes, it appe
e4a0: 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61  ars that it is a
e4b0: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
e4c0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
e4d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 6f  tring length $co
e4e0: 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20 74  nstraint] > 0} t
e4f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
e500: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
e510: 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
e520: 63 6f 6e 73 74 72 61 69 6e 74 5d 0d 0a 20 20 20  constraint]..   
e530: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
e540: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e550: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
e560: 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20  ile_ [file tail 
e570: 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  $name]]..      }
e580: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
e590: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
e5a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e5b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
e5c0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
e5d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
e5e0: 68 65 63 6b 46 6f 72 50 61 74 68 46 69 6c 65 20  heckForPathFile 
e5f0: 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7b  { channel name {
e600: 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7d  constraint ""} }
e610: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
e620: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e630: 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  gs "---- checkin
e640: 67 20 66 6f 72 20 66 69 6c 65 20 5c 22 22 20 24  g for file \"" $
e650: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
e660: 22 5c 22 20 61 6c 6f 6e 67 20 50 41 54 48 2e 2e  "\" along PATH..
e670: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b  . "]....    if {
e680: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 6e 61  [file exists $na
e690: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
e6a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e6b0: 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65  TE: Yes, it appe
e6c0: 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61  ars that it is a
e6d0: 76 61 69 6c 61 62 6c 65 20 5b 69 6e 20 74 68 65  vailable [in the
e6e0: 20 65 78 61 63 74 20 6c 6f 63 61 74 69 6f 6e 20   exact location 
e6f0: 74 68 65 79 0d 0a 20 20 20 20 20 20 23 20 20 20  they..      #   
e700: 20 20 20 20 73 70 65 63 69 66 69 65 64 5d 2e 0d      specified]..
e710: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e720: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
e730: 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 20  th $constraint] 
e740: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
e750: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e760: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
e770: 69 6c 65 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74  ile_ $constraint
e780: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
e790: 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
e7a0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
e7b0: 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65  Args file_ [file
e7c0: 20 74 61 69 6c 20 24 6e 61 6d 65 5d 5d 0d 0a 20   tail $name]].. 
e7d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e7e0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
e7f0: 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  es\n....      #.
e800: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
e810: 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
e820: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
e830: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
e840: 75 72 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  urn..    } else 
e850: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
e860: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
e870: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  e appropriate en
e880: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
e890: 6c 65 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66  le for the platf
e8a0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
e8b0: 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64       if {[isWind
e8c0: 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ows]} then {..  
e8d0: 20 20 20 20 20 20 73 65 74 20 70 61 74 68 4e 61        set pathNa
e8e0: 6d 65 20 50 41 54 48 0d 0a 20 20 20 20 20 20 7d  me PATH..      }
e8f0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e900: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 48 41   #..        # HA
e910: 43 4b 3a 20 46 6f 72 20 73 68 61 72 65 64 20 6c  CK: For shared l
e920: 69 62 72 61 72 69 65 73 2c 20 75 73 65 20 74 68  ibraries, use th
e930: 65 20 4c 44 5f 4c 49 42 52 41 52 59 5f 50 41 54  e LD_LIBRARY_PAT
e940: 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  H...        #.. 
e950: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
e960: 20 65 78 74 65 6e 73 69 6f 6e 20 24 6e 61 6d 65   extension $name
e970: 5d 20 65 71 20 5b 69 6e 66 6f 20 73 68 61 72 65  ] eq [info share
e980: 64 6c 69 62 65 78 74 65 6e 73 69 6f 6e 5d 7d 20  dlibextension]} 
e990: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e9a0: 20 20 73 65 74 20 70 61 74 68 4e 61 6d 65 20 4c    set pathName L
e9b0: 44 5f 4c 49 42 52 41 52 59 5f 50 41 54 48 0d 0a  D_LIBRARY_PATH..
e9c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e9d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
e9e0: 70 61 74 68 4e 61 6d 65 20 50 41 54 48 0d 0a 20  pathName PATH.. 
e9f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ea00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
ea10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
ea20: 68 65 20 72 65 71 75 69 72 65 64 20 65 6e 76 69  he required envi
ea30: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
ea40: 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20   available?..   
ea50: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
ea60: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
ea70: 6e 76 28 24 70 61 74 68 4e 61 6d 65 29 5d 7d 20  nv($pathName)]} 
ea80: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ea90: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
eaa0: 45 3a 20 4f 6b 2c 20 67 72 61 62 20 69 74 20 6e  E: Ok, grab it n
eab0: 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
eac0: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 68          set path
ead0: 20 24 3a 3a 65 6e 76 28 24 70 61 74 68 4e 61 6d   $::env($pathNam
eae0: 65 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e)....        #.
eaf0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
eb00: 20 55 73 65 20 74 68 65 20 61 70 70 72 6f 70 72   Use the appropr
eb10: 69 61 74 65 20 70 61 74 68 20 73 65 70 61 72 61  iate path separa
eb20: 74 6f 72 20 66 6f 72 20 74 68 65 20 70 6c 61 74  tor for the plat
eb30: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  form...        #
eb40: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
eb50: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
eb60: 5f 70 6c 61 74 66 6f 72 6d 28 70 61 74 68 53 65  _platform(pathSe
eb70: 70 61 72 61 74 6f 72 29 5d 7d 20 74 68 65 6e 20  parator)]} then 
eb80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
eb90: 20 73 65 70 61 72 61 74 6f 72 20 24 3a 3a 74 63   separator $::tc
eba0: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 61 74 68 53  l_platform(pathS
ebb0: 65 70 61 72 61 74 6f 72 29 0d 0a 20 20 20 20 20  eparator)..     
ebc0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
ebd0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
ebe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
ebf0: 73 65 70 61 72 61 74 6f 72 20 5c 3b 0d 0a 20 20  separator \;..  
ec00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ec10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 65            set se
ec20: 70 61 72 61 74 6f 72 20 3a 0d 0a 20 20 20 20 20  parator :..     
ec30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
ec40: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
ec50: 45 3a 20 47 72 61 62 20 6a 75 73 74 20 74 68 65  E: Grab just the
ec60: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
ec70: 74 68 65 20 70 6f 73 73 69 62 6c 79 20 66 75 6c  the possibly ful
ec80: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
ec90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
eca0: 20 20 20 6e 61 6d 65 20 70 72 6f 76 69 64 65 64     name provided
ecb0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d   by the caller..
ecc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ecd0: 20 20 20 20 73 65 74 20 74 61 69 6c 20 5b 66 69      set tail [fi
ece0: 6c 65 20 74 61 69 6c 20 24 6e 61 6d 65 5d 0d 0a  le tail $name]..
ecf0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ed00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
ed10: 63 6b 20 65 61 63 68 20 64 69 72 65 63 74 6f 72  ck each director
ed20: 79 20 69 6e 20 74 68 65 20 50 41 54 48 20 66 6f  y in the PATH fo
ed30: 72 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  r the file...   
ed40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ed50: 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
ed60: 79 20 5b 73 70 6c 69 74 20 24 70 61 74 68 20 24  y [split $path $
ed70: 73 65 70 61 72 61 74 6f 72 5d 20 7b 0d 0a 20 20  separator] {..  
ed80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ed90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
eda0: 63 6b 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ck for the file 
edb0: 69 6e 20 74 68 69 73 20 64 69 72 65 63 74 6f 72  in this director
edc0: 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  y contained in t
edd0: 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20  he PATH...      
ede0: 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
edf0: 20 73 74 72 69 70 73 20 74 68 65 20 64 69 72 65   strips the dire
ee00: 63 74 6f 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ctory portion of
ee10: 66 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  f the file name 
ee20: 73 70 65 63 69 66 69 65 64 0d 0a 20 20 20 20 20  specified..     
ee30: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
ee40: 74 68 65 20 63 61 6c 6c 65 72 2c 20 69 66 20 61  the caller, if a
ee50: 6e 79 2c 20 62 65 66 6f 72 65 20 6a 6f 69 6e 69  ny, before joini
ee60: 6e 67 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d  ng that file nam
ee70: 65 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  e to the..      
ee80: 20 20 20 20 23 20 20 20 20 20 20 20 63 75 72 72      #       curr
ee90: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66  ent directory of
eea0: 20 74 68 65 20 50 41 54 48 20 62 65 69 6e 67 20   the PATH being 
eeb0: 73 65 61 72 63 68 65 64 2e 0d 0a 20 20 20 20 20  searched...     
eec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
eed0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
eee0: 74 73 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  ts [file join $d
eef0: 69 72 65 63 74 6f 72 79 20 24 74 61 69 6c 5d 5d  irectory $tail]]
ef00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ef10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ef20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
ef30: 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61  , it appears tha
ef40: 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  t it is availabl
ef50: 65 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  e in the PATH...
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
ef70: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
ef80: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63  string length $c
ef90: 6f 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20  onstraint] > 0} 
efa0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
efb0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
efc0: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
efd0: 66 69 6c 65 5f 20 24 63 6f 6e 73 74 72 61 69 6e  file_ $constrain
efe0: 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t]..            
eff0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f000: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
f010: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
f020: 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61  s file_ [file ta
f030: 69 6c 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20  il $name]]..    
f040: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f050: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
f060: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
f070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
f080: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
f090: 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
f0a0: 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
f0b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
f0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
f0d0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  turn..          
f0e0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
f0f0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
f100: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f110: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d  el no\n..  }....
f120: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
f130: 4e 61 74 69 76 65 43 6f 64 65 20 7b 20 63 68 61  NativeCode { cha
f140: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
f150: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
f160: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
f170: 6e 61 74 69 76 65 20 63 6f 64 65 2e 2e 2e 20 22  native code... "
f180: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45  ....    if {[isE
f190: 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  agle]} then {.. 
f1a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
f1b0: 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c  xists ::eagle_pl
f1c0: 61 74 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f 70  atform(compileOp
f1d0: 74 69 6f 6e 73 29 5d 20 26 26 20 5c 0d 0a 20 20  tions)] && \..  
f1e0: 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78          [info ex
f1f0: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
f200: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 5d 20 26  orm(platform)] &
f210: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
f220: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
f230: 6e 6f 63 61 73 65 20 24 3a 3a 65 61 67 6c 65 5f  nocase $::eagle_
f240: 70 6c 61 74 66 6f 72 6d 28 63 6f 6d 70 69 6c 65  platform(compile
f250: 4f 70 74 69 6f 6e 73 29 20 5c 0d 0a 20 20 20 20  Options) \..    
f260: 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70 6c 61        $::tcl_pla
f270: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 5d  tform(platform)]
f280: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
f290: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f2a0: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
f2b0: 74 68 65 20 62 69 6e 61 72 79 20 6d 61 74 63 68  the binary match
f2c0: 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  es the current p
f2d0: 6c 61 74 66 6f 72 6d 2c 0d 0a 20 20 20 20 20 20  latform,..      
f2e0: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
f2f0: 20 63 6f 64 65 20 63 61 6e 20 62 65 20 75 73 65   code can be use
f300: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
f310: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
f320: 61 69 6e 74 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  aint native.... 
f330: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f340: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
f350: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f360: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f370: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
f380: 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  }..    } else {.
f390: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f3a0: 23 20 4e 4f 54 45 3a 20 54 63 6c 20 69 73 20 61  # NOTE: Tcl is a
f3b0: 6c 77 61 79 73 20 6e 61 74 69 76 65 20 63 6f 64  lways native cod
f3c0: 65 20 61 6e 64 20 63 61 6e 20 61 6c 77 61 79 73  e and can always
f3d0: 20 65 78 65 63 75 74 65 20 6e 61 74 69 76 65 20   execute native 
f3e0: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  code...      #..
f3f0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
f400: 69 6e 74 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20  int native....  
f410: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f420: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 0d  el yes\n..    }.
f430: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
f440: 63 68 65 63 6b 46 6f 72 54 69 70 31 32 37 20 7b  checkForTip127 {
f450: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
f460: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f470: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
f480: 66 6f 72 20 54 49 50 20 23 31 32 37 2e 2e 2e 20  for TIP #127... 
f490: 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  "....    #..    
f4a0: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69  # NOTE: Is the i
f4b0: 6e 74 65 72 70 72 65 74 65 72 20 54 49 50 20 23  nterpreter TIP #
f4c0: 31 32 37 20 72 65 61 64 79 3f 0d 0a 20 20 20 20  127 ready?..    
f4d0: 23 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63  #..    if {[catc
f4e0: 68 20 7b 6c 73 65 61 72 63 68 20 2d 69 6e 64 65  h {lsearch -inde
f4f0: 78 20 30 20 30 20 30 7d 5d 20 3d 3d 20 30 7d 20  x 0 0 0}] == 0} 
f500: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
f510: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70 31  dConstraint tip1
f520: 32 37 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  27....      tput
f530: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
f540: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
f550: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f560: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d  nnel no\n..    }
f570: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
f580: 20 63 68 65 63 6b 46 6f 72 54 69 70 31 39 34 20   checkForTip194 
f590: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
f5a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
f5b0: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
f5c0: 20 66 6f 72 20 54 49 50 20 23 31 39 34 2e 2e 2e   for TIP #194...
f5d0: 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   "....    #..   
f5e0: 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
f5f0: 69 6e 74 65 72 70 72 65 74 65 72 20 54 49 50 20  interpreter TIP 
f600: 23 31 39 34 20 72 65 61 64 79 3f 0d 0a 20 20 20  #194 ready?..   
f610: 20 23 0d 0a 20 20 20 20 63 61 74 63 68 20 7b 61   #..    catch {a
f620: 70 70 6c 79 7d 20 65 72 72 6f 72 0d 0a 0d 0a 20  pply} error.... 
f630: 20 20 20 69 66 20 7b 24 65 72 72 6f 72 20 6e 65     if {$error ne
f640: 20 7b 69 6e 76 61 6c 69 64 20 63 6f 6d 6d 61 6e   {invalid comman
f650: 64 20 6e 61 6d 65 20 22 61 70 70 6c 79 22 7d 7d  d name "apply"}}
f660: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
f670: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70  ddConstraint tip
f680: 31 39 34 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  194....      tpu
f690: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
f6a0: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
f6b0: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
f6c0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
f6d0: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
f6e0: 63 20 63 68 65 63 6b 46 6f 72 54 69 70 32 30 37  c checkForTip207
f6f0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
f700: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f710: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
f720: 67 20 66 6f 72 20 54 49 50 20 23 32 30 37 2e 2e  g for TIP #207..
f730: 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  . "....    #..  
f740: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
f750: 20 69 6e 74 65 72 70 72 65 74 65 72 20 54 49 50   interpreter TIP
f760: 20 23 32 30 37 20 72 65 61 64 79 3f 0d 0a 20 20   #207 ready?..  
f770: 20 20 23 0d 0a 20 20 20 20 63 61 74 63 68 20 7b    #..    catch {
f780: 69 6e 74 65 72 70 20 69 6e 76 6f 6b 65 68 69 64  interp invokehid
f790: 64 65 6e 20 7b 7d 20 2d 6e 61 6d 65 73 70 61 63  den {} -namespac
f7a0: 65 20 2d 2d 20 69 6e 66 6f 7d 20 65 72 72 6f 72  e -- info} error
f7b0: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b 73 74  ....    if {![st
f7c0: 72 69 6e 67 20 6d 61 74 63 68 20 7b 62 61 64 20  ring match {bad 
f7d0: 6f 70 74 69 6f 6e 20 22 2d 6e 61 6d 65 73 70 61  option "-namespa
f7e0: 63 65 22 3a 20 2a 7d 20 24 65 72 72 6f 72 5d 7d  ce": *} $error]}
f7f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
f800: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70  ddConstraint tip
f810: 32 30 37 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  207....      tpu
f820: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
f830: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
f840: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
f850: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
f860: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
f870: 63 20 63 68 65 63 6b 46 6f 72 54 69 70 32 34 31  c checkForTip241
f880: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
f890: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f8a0: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
f8b0: 67 20 66 6f 72 20 54 49 50 20 23 32 34 31 2e 2e  g for TIP #241..
f8c0: 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  . "....    #..  
f8d0: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
f8e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 54 49 50   interpreter TIP
f8f0: 20 23 32 34 31 20 72 65 61 64 79 3f 0d 0a 20 20   #241 ready?..  
f900: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61    #..    if {[ca
f910: 74 63 68 20 7b 6c 73 65 61 72 63 68 20 2d 6e 6f  tch {lsearch -no
f920: 63 61 73 65 20 30 20 30 7d 5d 20 3d 3d 20 30 7d  case 0 0}] == 0}
f930: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
f940: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70  ddConstraint tip
f950: 32 34 31 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  241....      tpu
f960: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
f970: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
f980: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
f990: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
f9a0: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
f9b0: 63 20 63 68 65 63 6b 46 6f 72 54 69 70 32 38 35  c checkForTip285
f9c0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
f9d0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f9e0: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
f9f0: 67 20 66 6f 72 20 54 49 50 20 23 32 38 35 2e 2e  g for TIP #285..
fa00: 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  . "....    if {[
fa10: 61 6c 77 61 79 73 46 75 6c 6c 49 6e 74 65 72 70  alwaysFullInterp
fa20: 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
fa30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fa40: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e   NOTE: Is the in
fa50: 74 65 72 70 72 65 74 65 72 20 54 49 50 20 23 32  terpreter TIP #2
fa60: 38 35 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 20  85 ready?..     
fa70: 20 23 0d 0a 20 20 20 20 20 20 63 61 74 63 68 20   #..      catch 
fa80: 7b 69 6e 74 65 72 70 20 63 61 6e 63 65 6c 7d 20  {interp cancel} 
fa90: 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 20 20 69  error....      i
faa0: 66 20 7b 24 65 72 72 6f 72 20 65 71 20 22 65 76  f {$error eq "ev
fab0: 61 6c 20 63 61 6e 63 65 6c 65 64 22 7d 20 74 68  al canceled"} th
fac0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64  en {..        ad
fad0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70 32  dConstraint tip2
fae0: 38 35 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  85....        tp
faf0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
fb00: 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
fb10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
fb20: 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   We are done her
fb30: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a  e, return now...
fb40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fb50: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
fb60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
fb70: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
fb80: 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  no\n..  }.....  
fb90: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 70  proc checkForTip
fba0: 34 30 35 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  405 { channel } 
fbb0: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
fbc0: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
fbd0: 6b 69 6e 67 20 66 6f 72 20 54 49 50 20 23 34 30  king for TIP #40
fbe0: 35 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d  5... "....    #.
fbf0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65  .    # NOTE: Doe
fc00: 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  s the interprete
fc10: 72 20 68 61 76 65 20 54 49 50 20 23 34 30 35 20  r have TIP #405 
fc20: 28 69 2e 65 2e 20 5b 6c 6d 61 70 5d 29 3f 0d 0a  (i.e. [lmap])?..
fc30: 20 20 20 20 23 0d 0a 20 20 20 20 63 61 74 63 68      #..    catch
fc40: 20 7b 6c 6d 61 70 7d 20 65 72 72 6f 72 0d 0a 0d   {lmap} error...
fc50: 0a 20 20 20 20 69 66 20 7b 24 65 72 72 6f 72 20  .    if {$error 
fc60: 6e 65 20 22 69 6e 76 61 6c 69 64 20 63 6f 6d 6d  ne "invalid comm
fc70: 61 6e 64 20 6e 61 6d 65 20 5c 22 6c 6d 61 70 5c  and name \"lmap\
fc80: 22 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ""} then {..    
fc90: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
fca0: 74 69 70 34 30 35 0d 0a 0d 0a 20 20 20 20 20 20  tip405....      
fcb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
fcc0: 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65  es\n..    } else
fcd0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
fce0: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
fcf0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20     }..  }.....  
fd00: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 70  proc checkForTip
fd10: 34 32 31 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  421 { channel } 
fd20: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
fd30: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
fd40: 6b 69 6e 67 20 66 6f 72 20 54 49 50 20 23 34 32  king for TIP #42
fd50: 31 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d  1... "....    #.
fd60: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20  .    # NOTE: Is 
fd70: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
fd80: 54 49 50 20 23 34 32 31 20 72 65 61 64 79 3f 0d  TIP #421 ready?.
fd90: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
fda0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
fdb0: 73 65 74 20 61 72 72 61 79 28 31 29 20 6f 6e 65  set array(1) one
fdc0: 3b 20 73 65 74 20 6c 69 73 74 20 5b 6c 69 73 74  ; set list [list
fdd0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 61 72 72 61 79  ]....      array
fde0: 20 66 6f 72 20 7b 6e 61 6d 65 20 76 61 6c 75 65   for {name value
fdf0: 7d 20 61 72 72 61 79 20 7b 0d 0a 20 20 20 20 20  } array {..     
fe00: 20 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 20     lappend list 
fe10: 24 6e 61 6d 65 20 24 76 61 6c 75 65 0d 0a 20 20  $name $value..  
fe20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
fe30: 65 74 20 6c 69 73 74 0d 0a 20 20 20 20 7d 20 72  et list..    } r
fe40: 65 73 75 6c 74 5d 20 3d 3d 20 30 20 26 26 20 24  esult] == 0 && $
fe50: 72 65 73 75 6c 74 20 65 71 20 5b 6c 69 73 74 20  result eq [list 
fe60: 31 20 6f 6e 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  1 one]} then {..
fe70: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
fe80: 69 6e 74 20 74 69 70 34 32 31 0d 0a 0d 0a 20 20  int tip421....  
fe90: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
fea0: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20  el yes\n..    } 
feb0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70  else {..      tp
fec0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
fed0: 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  n..    }..  }...
fee0: 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
fef0: 72 54 69 70 34 32 36 20 7b 20 63 68 61 6e 6e 65  rTip426 { channe
ff00: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
ff10: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
ff20: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50  checking for TIP
ff30: 20 23 34 32 36 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   #426... "....  
ff40: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
ff50: 20 49 73 20 74 68 65 20 69 6e 74 65 72 70 72 65   Is the interpre
ff60: 74 65 72 20 54 49 50 20 23 34 32 36 20 72 65 61  ter TIP #426 rea
ff70: 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  dy?..    #..    
ff80: 63 61 74 63 68 20 7b 69 6e 66 6f 20 63 6d 64 74  catch {info cmdt
ff90: 79 70 65 7d 20 65 72 72 6f 72 0d 0a 0d 0a 20 20  ype} error....  
ffa0: 20 20 69 66 20 7b 24 65 72 72 6f 72 20 65 71 20    if {$error eq 
ffb0: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
ffc0: 68 6f 75 6c 64 20 62 65 20 22 69 6e 66 6f 20 63  hould be "info c
ffd0: 6d 64 74 79 70 65 20 63 6f 6d 6d 61 6e 64 4e 61  mdtype commandNa
ffe0: 6d 65 22 7d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me"}} then {..  
fff0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
10000 74 20 74 69 70 34 32 36 0d 0a 0d 0a 20 20 20 20  t tip426....    
10010 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10020 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c   yes\n..    } el
10030 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  se {..      tput
10040 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
10050 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
10060 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54    proc checkForT
10070 69 70 34 32 39 20 7b 20 63 68 61 6e 6e 65 6c 20  ip429 { channel 
10080 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
10090 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
100a0 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20 23  ecking for TIP #
100b0 34 32 39 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  429... "....    
100c0 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  #..    # NOTE: I
100d0 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  s the interprete
100e0 72 20 54 49 50 20 23 34 32 39 20 72 65 61 64 79  r TIP #429 ready
100f0 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ?..    #..    if
10100 20 7b 5b 63 61 74 63 68 20 7b 73 74 72 69 6e 67   {[catch {string
10110 20 63 61 74 7d 5d 20 3d 3d 20 30 7d 20 74 68 65   cat}] == 0} the
10120 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f  n {..      addCo
10130 6e 73 74 72 61 69 6e 74 20 74 69 70 34 32 39 0d  nstraint tip429.
10140 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
10150 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
10160 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10170 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10180 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
10190 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
101a0 65 63 6b 46 6f 72 54 69 70 34 34 30 20 7b 20 63  eckForTip440 { c
101b0 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
101c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
101d0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
101e0 72 20 54 49 50 20 23 34 34 30 2e 2e 2e 20 22 0d  r TIP #440... ".
101f0 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
10200 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74  NOTE: Is the int
10210 65 72 70 72 65 74 65 72 20 54 49 50 20 23 34 34  erpreter TIP #44
10220 30 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d  0 ready?..    #.
10230 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20  .    if {[catch 
10240 7b 73 65 74 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  {set ::tcl_platf
10250 6f 72 6d 28 65 6e 67 69 6e 65 29 7d 20 65 6e 67  orm(engine)} eng
10260 69 6e 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ine] == 0} then 
10270 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  {..      addCons
10280 74 72 61 69 6e 74 20 74 69 70 34 34 30 0d 0a 0d  traint tip440...
10290 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
102a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
102b0 73 20 22 79 65 73 20 28 22 20 24 65 6e 67 69 6e  s "yes (" $engin
102c0 65 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 7d 20  e ")\n"]..    } 
102d0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70  else {..      tp
102e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
102f0 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  n..    }..  }...
10300 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
10310 72 54 69 70 34 36 31 20 7b 20 63 68 61 6e 6e 65  rTip461 { channe
10320 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
10330 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
10340 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50  checking for TIP
10350 20 23 34 36 31 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   #461... "....  
10360 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
10370 20 49 73 20 74 68 65 20 69 6e 74 65 72 70 72 65   Is the interpre
10380 74 65 72 20 54 49 50 20 23 34 36 31 20 72 65 61  ter TIP #461 rea
10390 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  dy?..    #..    
103a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
103b0 20 20 20 20 73 65 74 20 65 78 70 72 28 67 65 29      set expr(ge)
103c0 20 7b 69 6e 74 28 22 61 62 63 22 20 67 65 20 22   {int("abc" ge "
103d0 61 62 63 22 29 7d 0d 0a 20 20 20 20 20 20 73 65  abc")}..      se
103e0 74 20 65 78 70 72 28 67 74 29 20 7b 69 6e 74 28  t expr(gt) {int(
103f0 22 61 62 63 22 20 67 74 20 22 61 62 63 22 29 7d  "abc" gt "abc")}
10400 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 70 72  ..      set expr
10410 28 6c 65 29 20 7b 69 6e 74 28 22 61 62 63 22 20  (le) {int("abc" 
10420 6c 65 20 22 61 62 63 22 29 7d 0d 0a 20 20 20 20  le "abc")}..    
10430 20 20 73 65 74 20 65 78 70 72 28 6c 74 29 20 7b    set expr(lt) {
10440 69 6e 74 28 22 61 62 63 22 20 6c 74 20 22 61 62  int("abc" lt "ab
10450 63 22 29 7d 0d 0a 0d 0a 20 20 20 20 20 20 6c 69  c")}....      li
10460 73 74 20 5b 65 78 70 72 20 24 65 78 70 72 28 67  st [expr $expr(g
10470 65 29 5d 20 5b 65 78 70 72 20 24 65 78 70 72 28  e)] [expr $expr(
10480 67 74 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  gt)] \..        
10490 20 20 5b 65 78 70 72 20 24 65 78 70 72 28 6c 65    [expr $expr(le
104a0 29 5d 20 5b 65 78 70 72 20 24 65 78 70 72 28 6c  )] [expr $expr(l
104b0 74 29 5d 0d 0a 20 20 20 20 7d 5d 20 3d 3d 20 30  t)]..    }] == 0
104c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
104d0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69  addConstraint ti
104e0 70 34 36 31 0d 0a 0d 0a 20 20 20 20 20 20 74 70  p461....      tp
104f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
10500 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  \n..    } else {
10510 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
10520 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
10530 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
10540 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 70 34 36  oc checkForTip46
10550 33 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  3 { channel } {.
10560 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
10570 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
10580 6e 67 20 66 6f 72 20 54 49 50 20 23 34 36 33 2e  ng for TIP #463.
10590 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20  .. "....    #.. 
105a0 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
105b0 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 54 49  e interpreter TI
105c0 50 20 23 34 36 33 20 72 65 61 64 79 3f 0d 0a 20  P #463 ready?.. 
105d0 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 63     #..    if {[c
105e0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 72 65  atch {..      re
105f0 67 73 75 62 20 2d 63 6f 6d 6d 61 6e 64 20 2e 20  gsub -command . 
10600 2e 20 6c 69 73 74 0d 0a 20 20 20 20 7d 5d 20 3d  . list..    }] =
10610 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
10620 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
10630 20 74 69 70 34 36 33 0d 0a 0d 0a 20 20 20 20 20   tip463....     
10640 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10650 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73  yes\n..    } els
10660 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e {..      tputs
10670 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
10680 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
10690 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69   proc checkForTi
106a0 70 34 37 31 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  p471 { channel }
106b0 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
106c0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
106d0 63 6b 69 6e 67 20 66 6f 72 20 54 49 50 20 23 34  cking for TIP #4
106e0 37 31 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23  71... "....    #
106f0 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73  ..    # NOTE: Is
10700 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
10710 20 54 49 50 20 23 34 37 31 20 72 65 61 64 79 3f   TIP #471 ready?
10720 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 63 61 74  ..    #..    cat
10730 63 68 20 7b 69 6e 66 6f 20 6c 69 6e 6b 65 64 6e  ch {info linkedn
10740 61 6d 65 7d 20 65 72 72 6f 72 0d 0a 0d 0a 20 20  ame} error....  
10750 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
10760 74 63 68 20 7b 77 72 6f 6e 67 20 23 20 61 72 67  tch {wrong # arg
10770 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 2a 7d  s: should be "*}
10780 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
10790 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
107a0 72 61 69 6e 74 20 74 69 70 34 37 31 0d 0a 0d 0a  raint tip471....
107b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
107c0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
107d0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
107e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
107f0 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  o\n..    }..  }.
10800 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
10810 46 6f 72 54 69 6d 69 6e 67 20 7b 0d 0a 20 20 20  ForTiming {..   
10820 20 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 74         channel t
10830 68 72 65 73 68 6f 6c 64 20 7b 63 6f 6e 73 74 72  hreshold {constr
10840 61 69 6e 74 20 22 22 7d 20 7b 74 72 69 65 73 20  aint ""} {tries 
10850 31 7d 20 7b 64 65 6c 61 79 20 31 30 30 30 7d 0d  1} {delay 1000}.
10860 0a 20 20 20 20 20 20 20 20 20 20 7b 61 76 65 72  .          {aver
10870 61 67 65 20 66 61 6c 73 65 7d 20 7b 61 73 79 6e  age false} {asyn
10880 63 68 72 6f 6e 6f 75 73 20 66 61 6c 73 65 7d 20  chronous false} 
10890 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
108a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
108b0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 22  rgs \..        "
108c0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
108d0 72 20 70 72 65 63 69 73 69 6f 6e 20 74 69 6d 69  r precision timi
108e0 6e 67 20 28 74 68 72 65 73 68 6f 6c 64 20 6f 66  ng (threshold of
108f0 20 22 20 24 74 68 72 65 73 68 6f 6c 64 20 5c 0d   " $threshold \.
10900 0a 20 20 20 20 20 20 20 20 22 20 6d 69 6c 6c 69  .        " milli
10910 73 65 63 6f 6e 64 73 22 20 5b 65 78 70 72 20 7b  seconds" [expr {
10920 24 61 76 65 72 61 67 65 20 3f 20 22 20 61 76 65  $average ? " ave
10930 72 61 67 65 22 20 3a 20 22 22 7d 5d 20 22 2c 20  rage" : ""}] ", 
10940 64 65 6c 61 79 20 6f 66 20 22 20 5c 0d 0a 20 20  delay of " \..  
10950 20 20 20 20 20 20 24 64 65 6c 61 79 20 22 20 6d        $delay " m
10960 69 6c 6c 69 73 65 63 6f 6e 64 73 29 2e 2e 2e 20  illiseconds)... 
10970 22 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  "]....    #..   
10980 20 23 20 48 41 43 4b 3a 20 53 6f 6d 65 74 69 6d   # HACK: Sometim
10990 65 73 20 74 68 65 20 66 69 72 73 74 20 74 72 79  es the first try
109a0 20 74 61 6b 65 73 20 71 75 69 74 65 20 61 20 62   takes quite a b
109b0 69 74 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73  it longer than s
109c0 75 62 73 65 71 75 65 6e 74 0d 0a 20 20 20 20 23  ubsequent..    #
109d0 20 20 20 20 20 20 20 74 72 69 65 73 2e 20 20 57         tries.  W
109e0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 62 79 70  e attempt to byp
109f0 61 73 73 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ass this problem
10a00 20 62 79 20 72 65 74 72 79 69 6e 67 20 61 20 73   by retrying a s
10a10 65 74 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 23  et number..    #
10a20 20 20 20 20 20 20 20 6f 66 20 74 69 6d 65 73 20         of times 
10a30 28 77 68 69 63 68 20 63 61 6e 20 62 65 20 6f 76  (which can be ov
10a40 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
10a50 63 61 6c 6c 65 72 29 20 62 65 66 6f 72 65 20 67  caller) before g
10a60 69 76 69 6e 67 20 75 70 2e 0d 0a 20 20 20 20 23  iving up...    #
10a70 0d 0a 20 20 20 20 73 65 74 20 74 6f 74 61 6c 20  ..    set total 
10a80 30 0d 0a 20 20 20 20 73 65 74 20 64 69 66 66 65  0..    set diffe
10a90 72 65 6e 63 65 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  rence unknown...
10aa0 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 74 72  .    for {set tr
10ab0 79 20 30 7d 20 7b 24 74 72 79 20 3c 20 24 74 72  y 0} {$try < $tr
10ac0 69 65 73 7d 20 7b 69 6e 63 72 20 74 72 79 7d 20  ies} {incr try} 
10ad0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
10ae0 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
10af0 20 61 20 73 63 72 69 70 74 20 74 68 61 74 20 77   a script that w
10b00 69 6c 6c 20 73 65 74 20 74 68 65 20 66 69 6e 61  ill set the fina
10b10 6c 20 63 6c 69 63 6b 73 20 76 61 6c 75 65 2e 20  l clicks value. 
10b20 20 54 68 69 73 20 6d 75 73 74 0d 0a 20 20 20 20   This must..    
10b30 20 20 23 20 20 20 20 20 20 20 75 73 65 20 61 20    #       use a 
10b40 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
10b50 64 75 65 20 74 6f 20 74 68 65 20 6e 61 74 75 72  due to the natur
10b60 65 20 6f 66 20 5b 61 66 74 65 72 5d 2e 0d 0a 20  e of [after]... 
10b70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
10b80 74 20 73 74 6f 70 53 63 72 69 70 74 20 7b 0d 0a  t stopScript {..
10b90 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 73 74          set ::st
10ba0 6f 70 43 6c 69 63 6b 73 20 5b 65 78 70 72 20 7b  opClicks [expr {
10bb0 5b 63 6c 6f 63 6b 20 63 6c 69 63 6b 73 20 2d 6d  [clock clicks -m
10bc0 69 6c 6c 69 73 65 63 6f 6e 64 73 5d 20 26 20 30  illiseconds] & 0
10bd0 78 37 66 66 66 66 66 66 66 7d 5d 0d 0a 20 20 20  x7fffffff}]..   
10be0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
10bf0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
10c00 65 74 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63  et the initial c
10c10 6c 69 63 6b 73 20 76 61 6c 75 65 20 61 6e 64 20  licks value and 
10c20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
10c30 77 61 69 74 20 66 6f 72 20 61 62 6f 75 74 0d 0a  wait for about..
10c40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e        #       on
10c50 65 20 73 65 63 6f 6e 64 2c 20 65 69 74 68 65 72  e second, either
10c60 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 6f   synchronously o
10c70 72 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  r asynchronously
10c80 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0d 0a  , depending on..
10c90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
10ca0 65 20 70 72 65 66 65 72 65 6e 63 65 20 6f 66 20  e preference of 
10cb0 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  the caller...   
10cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
10cd0 73 74 61 72 74 20 5b 65 78 70 72 20 7b 5b 63 6c  start [expr {[cl
10ce0 6f 63 6b 20 63 6c 69 63 6b 73 20 2d 6d 69 6c 6c  ock clicks -mill
10cf0 69 73 65 63 6f 6e 64 73 5d 20 26 20 30 78 37 66  iseconds] & 0x7f
10d00 66 66 66 66 66 66 7d 5d 0d 0a 0d 0a 20 20 20 20  ffffff}]....    
10d10 20 20 69 66 20 7b 24 61 73 79 6e 63 68 72 6f 6e    if {$asynchron
10d20 6f 75 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ous} then {..   
10d30 20 20 20 20 20 73 65 74 20 65 76 65 6e 74 20 5b       set event [
10d40 61 66 74 65 72 20 24 64 65 6c 61 79 20 24 73 74  after $delay $st
10d50 6f 70 53 63 72 69 70 74 5d 3b 20 76 77 61 69 74  opScript]; vwait
10d60 20 3a 3a 73 74 6f 70 43 6c 69 63 6b 73 0d 0a 20   ::stopClicks.. 
10d70 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10d80 20 20 20 20 20 20 20 61 66 74 65 72 20 24 64 65         after $de
10d90 6c 61 79 3b 20 65 76 61 6c 20 24 73 74 6f 70 53  lay; eval $stopS
10da0 63 72 69 70 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  cript..      }..
10db0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10dc0 20 23 20 4e 4f 54 45 3a 20 4d 6f 76 65 20 74 68   # NOTE: Move th
10dd0 65 20 66 69 6e 61 6c 20 63 6c 69 63 6b 73 20 76  e final clicks v
10de0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 67 6c  alue from the gl
10df0 6f 62 61 6c 20 66 72 61 6d 65 20 74 6f 20 74 68  obal frame to th
10e00 69 73 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23  is one...      #
10e10 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 6f 70  ..      set stop
10e20 20 24 3a 3a 73 74 6f 70 43 6c 69 63 6b 73 3b 20   $::stopClicks; 
10e30 75 6e 73 65 74 20 3a 3a 73 74 6f 70 43 6c 69 63  unset ::stopClic
10e40 6b 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ks....      #.. 
10e50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c       # NOTE: Cal
10e60 63 75 6c 61 74 65 20 74 68 65 20 64 69 66 66 65  culate the diffe
10e70 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
10e80 65 20 61 63 74 75 61 6c 20 61 6e 64 20 65 78 70  e actual and exp
10e90 65 63 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  ected..      #  
10ea0 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 6d       number of m
10eb0 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0d 0a 20 20  illiseconds...  
10ec0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
10ed0 20 64 69 66 66 65 72 65 6e 63 65 20 5b 65 78 70   difference [exp
10ee0 72 20 7b 61 62 73 28 24 73 74 6f 70 20 2d 20 24  r {abs($stop - $
10ef0 73 74 61 72 74 20 2d 20 24 64 65 6c 61 79 29 7d  start - $delay)}
10f00 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
10f10 20 20 20 20 23 20 4e 4f 54 45 3a 20 4b 65 65 70      # NOTE: Keep
10f20 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 74 6f   track of the to
10f30 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  tal number of mi
10f40 6c 6c 69 73 65 63 6f 6e 64 73 20 65 6c 61 70 73  lliseconds elaps
10f50 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  ed for..      # 
10f60 20 20 20 20 20 20 61 6c 6c 20 69 74 65 72 61 74        all iterat
10f70 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 6c 6f 6f  ions of this loo
10f80 70 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  p...      #..   
10f90 20 20 20 69 6e 63 72 20 74 6f 74 61 6c 20 24 64     incr total $d
10fa0 69 66 66 65 72 65 6e 63 65 0d 0a 0d 0a 20 20 20  ifference....   
10fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10fc0 54 45 3a 20 49 66 20 77 65 20 61 72 65 20 75 73  TE: If we are us
10fd0 69 6e 67 20 74 68 65 20 61 76 65 72 61 67 65 20  ing the average 
10fe0 64 69 66 66 65 72 65 6e 63 65 2c 20 68 61 6e 64  difference, hand
10ff0 6c 65 20 74 68 61 74 20 6e 6f 77 2e 0d 0a 20 20  le that now...  
11000 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11010 7b 24 61 76 65 72 61 67 65 20 26 26 20 24 74 72  {$average && $tr
11020 69 65 73 20 3e 20 31 7d 20 74 68 65 6e 20 7b 0d  ies > 1} then {.
11030 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69 66  .        set dif
11040 66 65 72 65 6e 63 65 20 5b 65 78 70 72 20 7b 24  ference [expr {$
11050 74 6f 74 61 6c 20 2f 20 24 74 72 69 65 73 7d 5d  total / $tries}]
11060 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11070 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11080 54 45 3a 20 41 72 65 20 77 65 20 77 69 74 68 69  TE: Are we withi
11090 6e 20 74 68 65 20 74 68 72 65 73 68 6f 6c 64 20  n the threshold 
110a0 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
110b0 20 63 61 6c 6c 65 72 3f 0d 0a 20 20 20 20 20 20   caller?..      
110c0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 64 69  #..      if {$di
110d0 66 66 65 72 65 6e 63 65 20 3e 3d 20 30 20 26 26  fference >= 0 &&
110e0 20 24 64 69 66 66 65 72 65 6e 63 65 20 3c 3d 20   $difference <= 
110f0 24 74 68 72 65 73 68 6f 6c 64 7d 20 74 68 65 6e  $threshold} then
11100 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11110 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
11120 65 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 63  e appear to be c
11130 61 70 61 62 6c 65 20 6f 66 20 66 61 69 72 6c 79  apable of fairly
11140 20 70 72 65 63 69 73 65 20 74 69 6d 69 6e 67 2e   precise timing.
11150 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11160 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
11170 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73 74 72 61   length $constra
11180 69 6e 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  int] == 0} then 
11190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
111a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 69 6d 69   constraint timi
111b0 6e 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ng..        }...
111c0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
111d0 74 72 61 69 6e 74 20 24 63 6f 6e 73 74 72 61 69  traint $constrai
111e0 6e 74 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  nt....        tp
111f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11200 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11210 20 20 20 20 20 20 20 20 22 79 65 73 20 28 30 20          "yes (0 
11220 3c 3d 20 22 20 24 64 69 66 66 65 72 65 6e 63 65  <= " $difference
11230 20 22 20 3c 3d 20 22 20 24 74 68 72 65 73 68 6f   " <= " $thresho
11240 6c 64 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  ld " millisecond
11250 73 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  s" \..          
11260 20 20 5b 65 78 70 72 20 7b 24 61 76 65 72 61 67    [expr {$averag
11270 65 20 3f 20 22 20 61 76 65 72 61 67 65 22 20 3a  e ? " average" :
11280 20 22 22 7d 5d 20 22 2c 20 74 72 69 65 64 20 22   ""}] ", tried "
11290 20 5b 65 78 70 72 20 7b 24 74 72 79 20 2b 20 31   [expr {$try + 1
112a0 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  }] \..          
112b0 20 20 22 20 6f 75 74 20 6f 66 20 22 20 24 74 72    " out of " $tr
112c0 69 65 73 20 22 20 22 20 5b 65 78 70 72 20 7b 24  ies " " [expr {$
112d0 74 72 69 65 73 20 3e 20 31 20 3f 20 22 74 69 6d  tries > 1 ? "tim
112e0 65 73 22 20 3a 20 22 74 69 6d 65 22 7d 5d 20 5c  es" : "time"}] \
112f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2c  ..            ",
11300 20 5c 22 22 20 24 63 6f 6e 73 74 72 61 69 6e 74   \"" $constraint
11310 20 22 5c 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20   "\")\n"]....   
11320 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11330 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  # NOTE: We are d
11340 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e  one here, return
11350 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
11360 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11370 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11380 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63  ....    tputs $c
11390 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
113a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 22 6e  gs \..        "n
113b0 6f 20 28 30 20 3c 3d 20 22 20 24 64 69 66 66 65  o (0 <= " $diffe
113c0 72 65 6e 63 65 20 22 20 3e 20 22 20 24 74 68 72  rence " > " $thr
113d0 65 73 68 6f 6c 64 20 22 20 6d 69 6c 6c 69 73 65  eshold " millise
113e0 63 6f 6e 64 73 22 20 5c 0d 0a 20 20 20 20 20 20  conds" \..      
113f0 20 20 5b 65 78 70 72 20 7b 24 61 76 65 72 61 67    [expr {$averag
11400 65 20 3f 20 22 20 61 76 65 72 61 67 65 22 20 3a  e ? " average" :
11410 20 22 22 7d 5d 20 22 2c 20 74 72 69 65 64 20 22   ""}] ", tried "
11420 20 24 74 72 79 20 22 20 6f 75 74 20 6f 66 20 22   $try " out of "
11430 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 74 72 69   \..        $tri
11440 65 73 20 22 20 22 20 5b 65 78 70 72 20 7b 24 74  es " " [expr {$t
11450 72 69 65 73 20 3e 20 31 20 3f 20 22 74 69 6d 65  ries > 1 ? "time
11460 73 22 20 3a 20 22 74 69 6d 65 22 7d 5d 20 22 29  s" : "time"}] ")
11470 5c 6e 22 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  \n"]..  }.....  
11480 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 50 65 72  proc checkForPer
11490 66 6f 72 6d 61 6e 63 65 20 7b 20 63 68 61 6e 6e  formance { chann
114a0 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  el } {..    tput
114b0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
114c0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 70 65   checking for pe
114d0 72 66 6f 72 6d 61 6e 63 65 20 74 65 73 74 69 6e  rformance testin
114e0 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d  g... "....    #.
114f0 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65  .    # NOTE: Are
11500 20 77 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64   we allowed to d
11510 6f 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 65  o performance te
11520 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a 20  sting?..    #.. 
11530 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11540 69 73 74 73 20 3a 3a 6e 6f 28 70 65 72 66 6f 72  ists ::no(perfor
11550 6d 61 6e 63 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  mance)]} then {.
11560 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72  .      addConstr
11570 61 69 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  aint performance
11580 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
11590 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
115a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
115b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
115c0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
115d0 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
115e0 68 65 63 6b 46 6f 72 42 69 67 4c 69 73 74 73 20  heckForBigLists 
115f0 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
11600 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11610 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
11620 20 66 6f 72 20 62 69 67 20 6c 69 73 74 20 74 65   for big list te
11630 73 74 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  sting... "....  
11640 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
11650 20 41 72 65 20 77 65 20 61 6c 6c 6f 77 65 64 20   Are we allowed 
11660 74 6f 20 64 6f 20 62 69 67 20 6c 69 73 74 20 74  to do big list t
11670 65 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a  esting?..    #..
11680 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
11690 78 69 73 74 73 20 3a 3a 6e 6f 28 62 69 67 4c 69  xists ::no(bigLi
116a0 73 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sts)]} then {.. 
116b0 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c       if {[isEagl
116c0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
116d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
116e0 20 4d 4f 4e 4f 3a 20 55 73 69 6e 67 20 74 68 65   MONO: Using the
116f0 20 6e 61 74 69 76 65 20 75 74 69 6c 69 74 79 20   native utility 
11700 6c 69 62 72 61 72 79 20 77 68 65 6e 20 72 75 6e  library when run
11710 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 20 74 6f 0d  ning on Mono to.
11720 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11730 20 6a 6f 69 6e 20 62 69 67 20 6c 69 73 74 73 20   join big lists 
11740 73 65 65 6d 73 20 74 6f 20 63 61 75 73 65 20 53  seems to cause S
11750 74 61 63 6b 4f 76 65 72 66 6c 6f 77 45 78 63 65  tackOverflowExce
11760 70 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20  ption to..      
11770 20 20 23 20 20 20 20 20 20 20 62 65 20 74 68 72    #       be thr
11780 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  own...        #.
11790 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
117a0 73 54 65 73 74 4d 6f 6e 6f 5d 20 7c 7c 20 21 5b  sTestMono] || ![
117b0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 6e  haveConstraint n
117c0 61 74 69 76 65 55 74 69 6c 69 74 79 5d 7d 20 74  ativeUtility]} t
117d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
117e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
117f0 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70  NOTE: Yes, it ap
11800 70 65 61 72 73 20 74 68 61 74 20 69 74 20 69 73  pears that it is
11810 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
11820 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11830 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
11840 74 20 62 69 67 4c 69 73 74 73 0d 0a 0d 0a 20 20  t bigLists....  
11850 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11860 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
11870 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
11880 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11890 24 63 68 61 6e 6e 65 6c 20 22 6e 6f 2c 20 62 72  $channel "no, br
118a0 6f 6b 65 6e 20 6f 6e 20 4d 6f 6e 6f 20 77 69 74  oken on Mono wit
118b0 68 20 6e 61 74 69 76 65 20 75 74 69 6c 69 74 79  h native utility
118c0 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n"..        }..
118d0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
118e0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
118f0 72 61 69 6e 74 20 62 69 67 4c 69 73 74 73 0d 0a  raint bigLists..
11900 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
11910 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
11920 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65        }..    } e
11930 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  lse {..      tpu
11940 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
11950 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
11960 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
11970 50 72 6f 63 65 73 73 6f 72 49 6e 74 65 6e 73 69  ProcessorIntensi
11980 76 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ve { channel } {
11990 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
119a0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
119b0 69 6e 67 20 66 6f 72 20 70 72 6f 63 65 73 73 6f  ing for processo
119c0 72 20 69 6e 74 65 6e 73 69 76 65 20 74 65 73 74  r intensive test
119d0 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ing... "....    
119e0 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  #..    # NOTE: A
119f0 72 65 20 77 65 20 61 6c 6c 6f 77 65 64 20 74 6f  re we allowed to
11a00 20 64 6f 20 70 72 6f 63 65 73 73 6f 72 20 69 6e   do processor in
11a10 74 65 6e 73 69 76 65 20 74 65 73 74 69 6e 67 3f  tensive testing?
11a20 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
11a30 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
11a40 3a 6e 6f 28 70 72 6f 63 65 73 73 6f 72 49 6e 74  :no(processorInt
11a50 65 6e 73 69 76 65 29 5d 7d 20 74 68 65 6e 20 7b  ensive)]} then {
11a60 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
11a70 72 61 69 6e 74 20 6d 61 79 62 65 50 72 6f 63 65  raint maybeProce
11a80 73 73 6f 72 49 6e 74 65 6e 73 69 76 65 0d 0a 20  ssorIntensive.. 
11a90 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
11aa0 6e 74 20 70 72 6f 63 65 73 73 6f 72 49 6e 74 65  nt processorInte
11ab0 6e 73 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 74  nsive....      t
11ac0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
11ad0 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
11ae0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
11af0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
11b00 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
11b10 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 6d 65  roc checkForTime
11b20 49 6e 74 65 6e 73 69 76 65 20 7b 20 63 68 61 6e  Intensive { chan
11b30 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  nel } {..    tpu
11b40 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
11b50 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  - checking for t
11b60 69 6d 65 20 69 6e 74 65 6e 73 69 76 65 20 74 65  ime intensive te
11b70 73 74 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  sting... "....  
11b80 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
11b90 20 41 72 65 20 77 65 20 61 6c 6c 6f 77 65 64 20   Are we allowed 
11ba0 74 6f 20 64 6f 20 74 69 6d 65 20 69 6e 74 65 6e  to do time inten
11bb0 73 69 76 65 20 74 65 73 74 69 6e 67 3f 0d 0a 20  sive testing?.. 
11bc0 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b     #..    if {![
11bd0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
11be0 28 74 69 6d 65 49 6e 74 65 6e 73 69 76 65 29 5d  (timeIntensive)]
11bf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11c00 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d 61  addConstraint ma
11c10 79 62 65 54 69 6d 65 49 6e 74 65 6e 73 69 76 65  ybeTimeIntensive
11c20 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
11c30 72 61 69 6e 74 20 74 69 6d 65 49 6e 74 65 6e 73  raint timeIntens
11c40 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  ive....      tpu
11c50 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
11c60 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
11c70 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
11c80 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
11c90 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
11ca0 63 20 63 68 65 63 6b 46 6f 72 46 75 6c 6c 54 65  c checkForFullTe
11cb0 73 74 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  st { channel } {
11cc0 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
11cd0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
11ce0 69 6e 67 20 66 6f 72 20 66 75 6c 6c 20 74 65 73  ing for full tes
11cf0 74 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ting... "....   
11d00 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
11d10 41 72 65 20 77 65 20 61 6c 6c 6f 77 65 64 20 74  Are we allowed t
11d20 6f 20 64 6f 20 66 75 6c 6c 20 74 65 73 74 69 6e  o do full testin
11d30 67 20 28 69 2e 65 2e 20 74 6f 20 72 75 6e 20 72  g (i.e. to run r
11d40 61 72 65 6c 79 0d 0a 20 20 20 20 23 20 20 20 20  arely..    #    
11d50 20 20 20 6e 65 65 64 65 64 20 74 65 73 74 73 29     needed tests)
11d60 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ?..    #..    if
11d70 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
11d80 3a 3a 6e 6f 28 66 75 6c 6c 54 65 73 74 29 5d 7d  ::no(fullTest)]}
11d90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
11da0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 66 75 6c  ddConstraint ful
11db0 6c 54 65 73 74 0d 0a 0d 0a 20 20 20 20 20 20 74  lTest....      t
11dc0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
11dd0 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
11de0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
11df0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
11e00 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
11e10 72 6f 63 20 63 68 65 63 6b 46 6f 72 4d 65 6d 6f  roc checkForMemo
11e20 72 79 49 6e 74 65 6e 73 69 76 65 20 7b 20 63 68  ryIntensive { ch
11e30 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
11e40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
11e50 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
11e60 20 6d 65 6d 6f 72 79 20 69 6e 74 65 6e 73 69 76   memory intensiv
11e70 65 20 74 65 73 74 69 6e 67 2e 2e 2e 20 22 0d 0a  e testing... "..
11e80 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
11e90 4f 54 45 3a 20 41 72 65 20 77 65 20 61 6c 6c 6f  OTE: Are we allo
11ea0 77 65 64 20 74 6f 20 64 6f 20 6d 65 6d 6f 72 79  wed to do memory
11eb0 20 69 6e 74 65 6e 73 69 76 65 20 74 65 73 74 69   intensive testi
11ec0 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ng?..    #..    
11ed0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
11ee0 73 20 3a 3a 6e 6f 28 6d 65 6d 6f 72 79 49 6e 74  s ::no(memoryInt
11ef0 65 6e 73 69 76 65 29 5d 7d 20 74 68 65 6e 20 7b  ensive)]} then {
11f00 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
11f10 72 61 69 6e 74 20 6d 65 6d 6f 72 79 49 6e 74 65  raint memoryInte
11f20 6e 73 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 74  nsive....      t
11f30 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
11f40 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
11f50 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
11f60 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
11f70 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
11f80 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 74 61 63  roc checkForStac
11f90 6b 49 6e 74 65 6e 73 69 76 65 20 7b 20 63 68 61  kIntensive { cha
11fa0 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
11fb0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
11fc0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
11fd0 73 74 61 63 6b 20 69 6e 74 65 6e 73 69 76 65 20  stack intensive 
11fe0 74 65 73 74 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a  testing... "....
11ff0 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
12000 45 3a 20 41 72 65 20 77 65 20 61 6c 6c 6f 77 65  E: Are we allowe
12010 64 20 74 6f 20 64 6f 20 73 74 61 63 6b 20 69 6e  d to do stack in
12020 74 65 6e 73 69 76 65 20 74 65 73 74 69 6e 67 3f  tensive testing?
12030 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
12040 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
12050 3a 6e 6f 28 73 74 61 63 6b 49 6e 74 65 6e 73 69  :no(stackIntensi
12060 76 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ve)]} then {..  
12070 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
12080 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12090 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
120a0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
120b0 20 71 75 65 72 79 20 66 6f 72 20 6e 61 74 69 76   query for nativ
120c0 65 20 73 74 61 63 6b 20 63 68 65 63 6b 69 6e 67  e stack checking
120d0 20 69 6e 20 45 61 67 6c 65 2e 0d 0a 20 20 20 20   in Eagle...    
120e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
120f0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
12100 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
12110 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
12120 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
12130 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43          Eagle._C
12140 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74  omponents.Privat
12150 65 2e 4e 61 74 69 76 65 53 74 61 63 6b 20 43 61  e.NativeStack Ca
12160 6e 51 75 65 72 79 54 68 72 65 61 64 0d 0a 20 20  nQueryThread..  
12170 20 20 20 20 20 20 7d 20 63 61 6e 51 75 65 72 79        } canQuery
12180 54 68 72 65 61 64 5d 20 3d 3d 20 30 20 26 26 20  Thread] == 0 && 
12190 24 63 61 6e 51 75 65 72 79 54 68 72 65 61 64 7d  $canQueryThread}
121a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
121b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
121c0 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
121d0 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
121e0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
121f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12200 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
12210 69 6e 74 20 73 74 61 63 6b 49 6e 74 65 6e 73 69  int stackIntensi
12220 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ve....          
12230 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
12240 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
12250 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12260 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12270 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
12280 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
12290 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
122a0 73 74 72 61 69 6e 74 20 73 74 61 63 6b 49 6e 74  straint stackInt
122b0 65 6e 73 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20  ensive....      
122c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
122d0 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d   yes\n..      }.
122e0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
122f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12300 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
12310 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
12320 63 68 65 63 6b 46 6f 72 53 74 61 63 6b 53 69 7a  checkForStackSiz
12330 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  e { channel } {.
12340 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
12350 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
12360 6e 67 20 66 6f 72 20 73 74 61 63 6b 20 73 69 7a  ng for stack siz
12370 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d  e... "....    #.
12380 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65  .    # NOTE: Are
12390 20 77 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64   we allowed to d
123a0 6f 20 73 74 61 63 6b 20 73 69 7a 65 20 74 65 73  o stack size tes
123b0 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  ting?..    #..  
123c0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
123d0 73 74 73 20 3a 3a 6e 6f 28 73 74 61 63 6b 53 69  sts ::no(stackSi
123e0 7a 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ze)]} then {..  
123f0 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
12400 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12410 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12420 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
12430 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 65   query for the e
12440 78 65 63 75 74 61 62 6c 65 20 73 74 61 63 6b 20  xecutable stack 
12450 73 69 7a 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  size...        #
12460 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
12470 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
12480 20 20 73 65 74 20 72 65 73 65 72 76 65 20 5b 6f    set reserve [o
12490 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72  bject invoke -cr
124a0 65 61 74 65 20 55 49 6e 74 50 74 72 20 5a 65 72  eate UIntPtr Zer
124b0 6f 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  o]..          se
124c0 74 20 63 6f 6d 6d 69 74 20 5b 6f 62 6a 65 63 74  t commit [object
124d0 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
124e0 55 49 6e 74 50 74 72 20 5a 65 72 6f 5d 0d 0a 0d  UIntPtr Zero]...
124f0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
12500 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
12510 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
12520 20 20 20 20 20 20 20 20 20 20 20 20 45 61 67 6c              Eagl
12530 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72  e._Components.Pr
12540 69 76 61 74 65 2e 46 69 6c 65 4f 70 73 20 5c 0d  ivate.FileOps \.
12550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47  .              G
12560 65 74 50 65 46 69 6c 65 53 74 61 63 6b 52 65 73  etPeFileStackRes
12570 65 72 76 65 41 6e 64 43 6f 6d 6d 69 74 20 5c 0d  erveAndCommit \.
12580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
12590 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75  info nameofexecu
125a0 74 61 62 6c 65 5d 20 72 65 73 65 72 76 65 20 63  table] reserve c
125b0 6f 6d 6d 69 74 0d 0a 0d 0a 20 20 20 20 20 20 20  ommit....       
125c0 20 20 20 73 65 74 20 72 65 73 65 72 76 65 3b 20     set reserve; 
125d0 23 20 70 72 69 6d 69 74 69 76 65 2c 20 61 6c 72  # primitive, alr
125e0 65 61 64 79 20 6e 75 6d 65 72 69 63 2e 0d 0a 20  eady numeric... 
125f0 20 20 20 20 20 20 20 7d 20 73 74 61 63 6b 53 69         } stackSi
12600 7a 65 5d 20 3d 3d 20 30 20 26 26 20 24 73 74 61  ze] == 0 && $sta
12610 63 6b 53 69 7a 65 20 3e 20 30 7d 20 74 68 65 6e  ckSize > 0} then
12620 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
12630 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
12640 65 6e 64 41 72 67 73 20 73 74 61 63 6b 53 69 7a  endArgs stackSiz
12650 65 2e 30 78 20 5b 66 6f 72 6d 61 74 20 25 78 20  e.0x [format %x 
12660 24 73 74 61 63 6b 53 69 7a 65 5d 5d 0d 0a 0d 0a  $stackSize]]....
12670 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12680 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12690 41 72 67 73 20 22 79 65 73 20 28 22 20 24 73 74  Args "yes (" $st
126a0 61 63 6b 53 69 7a 65 20 22 29 5c 6e 22 5d 0d 0a  ackSize ")\n"]..
126b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
126c0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
126d0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
126e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
126f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12700 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
12710 20 4e 4f 54 45 3a 20 54 68 65 72 65 20 69 73 20   NOTE: There is 
12720 6e 6f 20 63 72 6f 73 73 2d 70 6c 61 74 66 6f 72  no cross-platfor
12730 6d 20 77 61 79 20 74 6f 20 63 68 65 63 6b 20 74  m way to check t
12740 68 69 73 20 69 6e 0d 0a 20 20 20 20 20 20 20 20  his in..        
12750 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 54  #       native T
12760 63 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  cl...        #..
12770 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
12780 72 61 69 6e 74 20 73 74 61 63 6b 53 69 7a 65 2e  raint stackSize.
12790 75 6e 6c 69 6d 69 74 65 64 3b 20 23 20 54 4f 44  unlimited; # TOD
127a0 4f 3a 20 46 69 78 20 6d 65 3f 0d 0a 0d 0a 20 20  O: Fix me?....  
127b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
127c0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
127d0 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20    }..    } else 
127e0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
127f0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
12800 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
12810 72 6f 63 20 63 68 65 63 6b 46 6f 72 49 6e 74 65  roc checkForInte
12820 72 61 63 74 69 76 65 20 7b 20 63 68 61 6e 6e 65  ractive { channe
12830 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
12840 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
12850 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 69 6e 74  checking for int
12860 65 72 61 63 74 69 76 65 20 75 73 65 72 2e 2e 2e  eractive user...
12870 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   "....    #..   
12880 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 72   # NOTE: Is ther
12890 65 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65  e an interactive
128a0 20 75 73 65 72 3f 0d 0a 20 20 20 20 23 0d 0a 20   user?..    #.. 
128b0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
128c0 73 74 73 20 3a 3a 74 63 6c 5f 69 6e 74 65 72 61  sts ::tcl_intera
128d0 63 74 69 76 65 5d 20 26 26 20 24 3a 3a 74 63 6c  ctive] && $::tcl
128e0 5f 69 6e 74 65 72 61 63 74 69 76 65 7d 20 74 68  _interactive} th
128f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43  en {..      addC
12900 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 61  onstraint intera
12910 63 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 74  ctive....      t
12920 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
12930 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
12940 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
12950 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
12960 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
12970 72 6f 63 20 63 68 65 63 6b 46 6f 72 49 6e 74 65  roc checkForInte
12980 72 61 63 74 69 76 65 43 6f 6d 6d 61 6e 64 20 7b  ractiveCommand {
12990 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20   channel name } 
129a0 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
129b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
129c0 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
129d0 20 66 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65   for interactive
129e0 20 63 6f 6d 6d 61 6e 64 20 5c 22 22 20 5c 0d 0a   command \"" \..
129f0 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c          $name "\
12a00 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 23  "... "]....    #
12a10 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 75  ..    # NOTE: Cu
12a20 72 72 65 6e 74 6c 79 2c 20 6f 6e 6c 79 20 45 61  rrently, only Ea
12a30 67 6c 65 20 68 61 73 20 22 69 6e 74 65 72 61 63  gle has "interac
12a40 74 69 76 65 20 63 6f 6d 6d 61 6e 64 73 22 2e 0d  tive commands"..
12a50 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
12a60 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20  [isEagle]} then 
12a70 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
12a80 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
12a90 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 69  t to query the i
12aa0 6e 74 65 72 61 63 74 69 76 65 20 63 6f 6d 6d 61  nteractive comma
12ab0 6e 64 20 6e 61 6d 65 73 20 66 72 6f 6d 20 45 61  nd names from Ea
12ac0 67 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  gle...      #.. 
12ad0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
12ae0 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
12af0 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79  t invoke Utility
12b00 20 47 65 74 49 6e 74 65 72 61 63 74 69 76 65 43   GetInteractiveC
12b10 6f 6d 6d 61 6e 64 4e 61 6d 65 73 20 22 22 20 24  ommandNames "" $
12b20 6e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  name false..    
12b30 20 20 7d 20 6e 61 6d 65 73 5d 20 3d 3d 20 30 20    } names] == 0 
12b40 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 6e 61 6d  && [llength $nam
12b50 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
12b60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12b70 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
12b80 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
12b90 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
12ba0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12bb0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
12bc0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
12bd0 69 6e 74 65 72 61 63 74 69 76 65 43 6f 6d 6d 61  interactiveComma
12be0 6e 64 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  nd. $name]....  
12bf0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12c00 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
12c10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12c20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
12c30 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72  done here, retur
12c40 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  n now...        
12c50 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
12c60 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
12c70 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24  }....    tputs $
12c80 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
12c90 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
12ca0 63 6b 46 6f 72 55 73 65 72 49 6e 74 65 72 61 63  ckForUserInterac
12cb0 74 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  tion { channel }
12cc0 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
12cd0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
12ce0 63 6b 69 6e 67 20 66 6f 72 20 75 73 65 72 20 69  cking for user i
12cf0 6e 74 65 72 61 63 74 69 6f 6e 2e 2e 2e 20 22 0d  nteraction... ".
12d00 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
12d10 48 41 43 4b 3a 20 46 6f 72 20 6e 6f 77 2c 20 64  HACK: For now, d
12d20 6f 20 74 68 65 20 65 78 61 63 74 20 73 61 6d 65  o the exact same
12d30 20 63 68 65 63 6b 20 61 73 20 63 68 65 63 6b 46   check as checkF
12d40 6f 72 49 6e 74 65 72 61 63 74 69 76 65 3b 20 68  orInteractive; h
12d50 6f 77 65 76 65 72 2c 0d 0a 20 20 20 20 23 20 20  owever,..    #  
12d60 20 20 20 20 20 74 68 69 73 20 69 73 20 73 74 69       this is sti
12d70 6c 6c 20 75 73 65 66 75 6c 20 61 73 20 61 20 73  ll useful as a s
12d80 65 70 61 72 61 74 65 20 63 6f 6e 73 74 72 61 69  eparate constrai
12d90 6e 74 20 62 65 63 61 75 73 65 20 69 74 20 63 61  nt because it ca
12da0 6e 20 62 65 0d 0a 20 20 20 20 23 20 20 20 20 20  n be..    #     
12db0 20 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 64    individually d
12dc0 69 73 61 62 6c 65 64 20 69 6e 20 22 70 72 6f 6c  isabled in "prol
12dd0 6f 67 75 65 2e 65 61 67 6c 65 22 2e 0d 0a 20 20  ogue.eagle"...  
12de0 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e    #..    if {[in
12df0 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
12e00 69 6e 74 65 72 61 63 74 69 76 65 5d 20 26 26 20  interactive] && 
12e10 24 3a 3a 74 63 6c 5f 69 6e 74 65 72 61 63 74 69  $::tcl_interacti
12e20 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ve} then {..    
12e30 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
12e40 75 73 65 72 49 6e 74 65 72 61 63 74 69 6f 6e 0d  userInteraction.
12e50 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
12e60 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
12e70 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12e80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12e90 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
12ea0 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
12eb0 65 63 6b 46 6f 72 4e 65 74 77 6f 72 6b 20 7b 20  eckForNetwork { 
12ec0 63 68 61 6e 6e 65 6c 20 68 6f 73 74 20 74 69 6d  channel host tim
12ed0 65 6f 75 74 20 7d 20 7b 0d 0a 20 20 20 20 74 70  eout } {..    tp
12ee0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
12ef0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
12f00 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
12f10 6e 67 20 66 6f 72 20 6e 65 74 77 6f 72 6b 20 63  ng for network c
12f20 6f 6e 6e 65 63 74 69 76 69 74 79 20 74 6f 20 68  onnectivity to h
12f30 6f 73 74 20 5c 22 22 20 24 68 6f 73 74 20 22 5c  ost \"" $host "\
12f40 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69  "... "]....    i
12f50 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68  f {[isEagle]} th
12f60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
12f70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e       # NOTE: Run
12f80 6e 69 6e 67 20 74 68 69 73 20 63 68 65 63 6b 20  ning this check 
12f90 6f 6e 20 74 68 65 20 4d 6f 6e 6f 20 33 2e 33 2e  on the Mono 3.3.
12fa0 30 20 28 6f 72 20 33 2e 34 2e 30 3f 29 20 72 65  0 (or 3.4.0?) re
12fb0 6c 65 61 73 65 20 62 75 69 6c 64 0d 0a 20 20 20  lease build..   
12fc0 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20     #       will 
12fd0 6c 6f 63 6b 20 75 70 20 74 68 65 20 70 72 6f 63  lock up the proc
12fe0 65 73 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ess; therefore, 
12ff0 73 6b 69 70 20 69 74 20 69 6e 20 74 68 61 74 20  skip it in that 
13000 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  case...      #..
13010 20 20 20 20 20 20 73 65 74 20 72 65 61 73 6f 6e        set reason
13020 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
13030 20 20 69 66 20 7b 5b 63 61 6e 50 69 6e 67 20 72    if {[canPing r
13040 65 61 73 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eason]} then {..
13050 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13060 20 20 20 23 20 42 55 47 42 55 47 3a 20 54 63 6c     # BUGBUG: Tcl
13070 20 38 2e 34 20 64 6f 65 73 20 6e 6f 74 20 6c 69   8.4 does not li
13080 6b 65 20 74 68 69 73 20 65 78 70 72 65 73 73 69  ke this expressi
13090 6f 6e 20 28 61 6e 64 20 54 63 6c 20 74 72 69 65  on (and Tcl trie
130a0 73 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  s to..        # 
130b0 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20          compile 
130c0 69 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  it even though i
130d0 74 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 63 74 75  t will only actu
130e0 61 6c 6c 79 20 65 76 65 72 20 62 65 0d 0a 20 20  ally ever be..  
130f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
13100 65 76 61 6c 75 61 74 65 64 20 69 6e 20 45 61 67  evaluated in Eag
13110 6c 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  le)...        #.
13120 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78 70  .        set exp
13130 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
13140 6f 20 63 6f 6d 6d 61 6e 64 73 20 75 72 69 5d 5d  o commands uri]]
13150 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
13160 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 75         [catch {u
13170 72 69 20 70 69 6e 67 20 24 68 6f 73 74 20 24 74  ri ping $host $t
13180 69 6d 65 6f 75 74 7d 20 72 65 73 70 6f 6e 73 65  imeout} response
13190 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20  ] == 0 && \..   
131a0 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78           [lindex
131b0 20 24 72 65 73 70 6f 6e 73 65 20 30 5d 20 69 6e   $response 0] in
131c0 20 5b 6c 69 73 74 20 53 75 63 63 65 73 73 20 54   [list Success T
131d0 69 6d 65 64 4f 75 74 5d 20 26 26 20 5c 0d 0a 20  imedOut] && \.. 
131e0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
131f0 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
13200 74 72 69 63 74 20 5b 6c 69 6e 64 65 78 20 24 72  trict [lindex $r
13210 65 73 70 6f 6e 73 65 20 31 5d 5d 20 26 26 20 5c  esponse 1]] && \
13220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c  ..            [l
13230 69 6e 64 65 78 20 24 72 65 73 70 6f 6e 73 65 20  index $response 
13240 31 5d 20 3c 3d 20 24 74 69 6d 65 6f 75 74 7d 0d  1] <= $timeout}.
13250 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13260 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
13270 65 73 20 69 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20  es it look like 
13280 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 63  we are able to c
13290 6f 6e 74 61 63 74 20 74 68 65 20 6e 65 74 77 6f  ontact the netwo
132a0 72 6b 20 68 6f 73 74 3f 0d 0a 20 20 20 20 20 20  rk host?..      
132b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
132c0 7b 5b 65 78 70 72 20 24 65 78 70 72 5d 7d 20 74  {[expr $expr]} t
132d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
132e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
132f0 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70  NOTE: Yes, it ap
13300 70 65 61 72 73 20 74 68 61 74 20 69 74 20 69 73  pears that it is
13310 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
13320 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13330 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
13340 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6e 65  t [appendArgs ne
13350 74 77 6f 72 6b 5f 20 24 68 6f 73 74 5d 0d 0a 0d  twork_ $host]...
13360 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13370 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13380 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 72  dArgs "yes (" $r
13390 65 73 70 6f 6e 73 65 20 22 29 5c 6e 22 5d 0d 0a  esponse ")\n"]..
133a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
133b0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
133c0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
133d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
133e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
133f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13400 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
13410 72 65 61 73 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20  reason \n]..    
13420 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20    }..    } else 
13430 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
13440 20 20 23 20 48 41 43 4b 3a 20 52 75 6e 6e 69 6e    # HACK: Runnin
13450 67 20 69 6e 20 54 63 6c 2c 20 6a 75 73 74 20 61  g in Tcl, just a
13460 73 73 75 6d 65 20 77 65 20 68 61 76 65 20 6e 65  ssume we have ne
13470 74 77 6f 72 6b 20 61 63 63 65 73 73 2e 0d 0a 20  twork access... 
13480 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 64       #..      ad
13490 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
134a0 65 6e 64 41 72 67 73 20 6e 65 74 77 6f 72 6b 5f  endArgs network_
134b0 20 24 68 6f 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   $host]....     
134c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
134d0 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20  yes\n..    }..  
134e0 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
134f0 63 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f 70 74 69  ckForCompileOpti
13500 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 6f 70 74  on { channel opt
13510 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  ion } {..    tpu
13520 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
13530 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
13540 65 63 6b 69 6e 67 20 66 6f 72 20 63 6f 6d 70 69  ecking for compi
13550 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20 5c 0d  le option \"" \.
13560 0a 20 20 20 20 20 20 20 20 24 6f 70 74 69 6f 6e  .        $option
13570 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
13580 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
13590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69   then {..      i
135a0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
135b0 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
135c0 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29  (compileOptions)
135d0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
135e0 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63    [lsearch -exac
135f0 74 20 2d 6e 6f 63 61 73 65 20 24 3a 3a 65 61 67  t -nocase $::eag
13600 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6d 70  le_platform(comp
13610 69 6c 65 4f 70 74 69 6f 6e 73 29 20 5c 0d 0a 20  ileOptions) \.. 
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6f 70               $op
13630 74 69 6f 6e 5d 20 21 3d 20 2d 31 7d 20 74 68 65  tion] != -1} the
13640 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13650 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13660 59 65 73 2c 20 73 75 70 70 6f 72 74 20 66 6f 72  Yes, support for
13670 20 74 68 65 20 45 61 67 6c 65 20 63 6f 6d 70 69   the Eagle compi
13680 6c 65 20 6f 70 74 69 6f 6e 20 69 73 20 70 72 65  le option is pre
13690 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  sent...        #
136a0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
136b0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
136c0 72 67 73 20 63 6f 6d 70 69 6c 65 2e 20 24 6f 70  rgs compile. $op
136d0 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tion]....       
136e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
136f0 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  yes\n..      } e
13700 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
13710 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
13720 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
13730 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13740 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13750 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  : We are running
13760 20 69 6e 73 69 64 65 20 54 63 6c 3b 20 68 6f 77   inside Tcl; how
13770 65 76 65 72 2c 20 77 65 20 6e 65 65 64 20 74 6f  ever, we need to
13780 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 0d 0a 20   check for an.. 
13790 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
137a0 6c 65 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f  le compile optio
137b0 6e 2e 20 20 54 68 69 73 20 63 61 6e 20 6e 6f 77  n.  This can now
137c0 20 62 65 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   be accomplished
137d0 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20   via the..      
137e0 23 20 20 20 20 20 20 20 5b 65 61 67 6c 65 5d 20  #       [eagle] 
137f0 63 6f 6d 6d 61 6e 64 20 73 75 70 70 6c 69 65 64  command supplied
13800 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 50 61   by the Eagle Pa
13810 63 6b 61 67 65 20 66 6f 72 20 54 63 6c 2c 20 69  ckage for Tcl, i
13820 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
13830 20 69 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   it is actually 
13840 6c 6f 61 64 65 64 20 61 6e 64 20 61 76 61 69 6c  loaded and avail
13850 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  able...      #..
13860 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
13870 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
13880 73 20 65 61 67 6c 65 5d 5d 20 3e 20 30 7d 20 74  s eagle]] > 0} t
13890 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
138a0 65 74 20 6f 70 74 69 6f 6e 73 20 5b 65 61 67 6c  et options [eagl
138b0 65 20 5b 6c 69 73 74 20 65 78 70 72 20 7b 5b 69  e [list expr {[i
138c0 6e 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a 20 20  nfo exists \..  
138d0 20 20 20 20 20 20 20 20 20 20 3a 3a 65 61 67 6c            ::eagl
138e0 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6d 70 69  e_platform(compi
138f0 6c 65 4f 70 74 69 6f 6e 73 29 5d 20 3f 20 5c 0d  leOptions)] ? \.
13900 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a  .            $::
13910 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63  eagle_platform(c
13920 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29 20 3a  ompileOptions) :
13930 20 5b 6c 69 73 74 5d 7d 5d 5d 0d 0a 0d 0a 20 20   [list]}]]....  
13940 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
13950 63 68 20 2d 65 78 61 63 74 20 24 6f 70 74 69 6f  ch -exact $optio
13960 6e 73 20 24 6f 70 74 69 6f 6e 5d 20 21 3d 20 2d  ns $option] != -
13970 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
13980 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13990 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 73    # NOTE: Yes, s
139a0 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 45  upport for the E
139b0 61 67 6c 65 20 63 6f 6d 70 69 6c 65 20 6f 70 74  agle compile opt
139c0 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 2e 0d  ion is present..
139d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
139e0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
139f0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
13a00 73 20 63 6f 6d 70 69 6c 65 2e 20 24 6f 70 74 69  s compile. $opti
13a10 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
13a20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13a30 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  yes\n....       
13a40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13a50 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  # NOTE: We are d
13a60 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e  one here, return
13a70 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
13a80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   #..          re
13a90 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  turn..        }.
13aa0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13ab0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13ac0 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
13ad0 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
13ae0 63 6b 46 6f 72 4b 6e 6f 77 6e 43 6f 6d 70 69 6c  ckForKnownCompil
13af0 65 4f 70 74 69 6f 6e 73 20 7b 20 63 68 61 6e 6e  eOptions { chann
13b00 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  el } {..    #.. 
13b10 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
13b20 20 66 6f 72 20 61 6c 6c 20 22 6b 6e 6f 77 6e 22   for all "known"
13b30 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 73   compile options
13b40 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 74 70  ...    #..    tp
13b50 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
13b60 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
13b70 6b 6e 6f 77 6e 20 63 6f 6d 70 69 6c 65 20 6f 70  known compile op
13b80 74 69 6f 6e 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  tions... "....  
13b90 20 20 73 65 74 20 6f 70 74 69 6f 6e 73 20 5b 67    set options [g
13ba0 65 74 4b 6e 6f 77 6e 43 6f 6d 70 69 6c 65 4f 70  etKnownCompileOp
13bb0 74 69 6f 6e 73 5d 0d 0a 0d 0a 20 20 20 20 69 66  tions]....    if
13bc0 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6f 70 74 69   {[llength $opti
13bd0 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ons] > 0} then {
13be0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
13bf0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13c00 67 73 20 22 79 65 73 20 28 22 20 5b 6c 6c 65 6e  gs "yes (" [llen
13c10 67 74 68 20 24 6f 70 74 69 6f 6e 73 5d 20 22 29  gth $options] ")
13c20 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  \n"]....      fo
13c30 72 65 61 63 68 20 6f 70 74 69 6f 6e 20 24 6f 70  reach option $op
13c40 74 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20  tions {..       
13c50 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13c60 74 73 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a  ts [appendArgs :
13c70 3a 6e 6f 28 63 6f 6d 70 69 6c 65 2e 20 24 6f 70  :no(compile. $op
13c80 74 69 6f 6e 20 29 5d 5d 7d 20 74 68 65 6e 20 7b  tion )]]} then {
13c90 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
13ca0 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  kForCompileOptio
13cb0 6e 20 24 63 68 61 6e 6e 65 6c 20 24 6f 70 74 69  n $channel $opti
13cc0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  on..        }.. 
13cd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c       }..    } el
13ce0 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  se {..      tput
13cf0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
13d00 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
13d10 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
13d20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 23 23 23   then {..    ###
13d30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d70 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
13d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d90 23 23 23 23 23 23 23 23 23 23 20 42 45 47 49 4e  ########## BEGIN
13da0 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23   Eagle ONLY ####
13db0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13dc0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
13dd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13df0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13e00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13e10 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
13e20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
13e30 65 63 75 72 69 74 79 20 7b 20 63 68 61 6e 6e 65  ecurity { channe
13e40 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
13e50 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
13e60 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73  - checking for s
13e70 65 63 75 72 69 74 79 2e 2e 2e 20 22 0d 0a 0d 0a  ecurity... "....
13e80 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13e90 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
13ea0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
13eb0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65   +NonPublic Inte
13ec0 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
13ed0 65 20 48 61 73 53 65 63 75 72 69 74 79 0d 0a 20  e HasSecurity.. 
13ee0 20 20 20 20 20 7d 20 73 65 63 75 72 69 74 79 5d       } security]
13ef0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
13f00 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 63 75         if {$secu
13f10 72 69 74 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rity} then {..  
13f20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
13f30 72 61 69 6e 74 20 73 65 63 75 72 69 74 79 2e 65  raint security.e
13f40 6e 61 62 6c 65 64 0d 0a 0d 0a 20 20 20 20 20 20  nabled....      
13f50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13f60 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
13f70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13f80 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
13f90 69 6e 74 20 73 65 63 75 72 69 74 79 2e 64 69 73  int security.dis
13fa0 61 62 6c 65 64 0d 0a 0d 0a 20 20 20 20 20 20 20  abled....       
13fb0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13fc0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
13fd0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
13fe0 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
13ff0 6e 73 74 72 61 69 6e 74 20 73 65 63 75 72 69 74  nstraint securit
14000 79 2e 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d  y.unavailable...
14010 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
14020 63 68 61 6e 6e 65 6c 20 75 6e 61 76 61 69 6c 61  channel unavaila
14030 62 6c 65 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ble\n..      }..
14040 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14050 6f 63 20 63 68 65 63 6b 46 6f 72 53 6f 66 74 77  oc checkForSoftw
14060 61 72 65 55 70 64 61 74 65 54 72 75 73 74 20 7b  areUpdateTrust {
14070 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
14080 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14090 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
140a0 67 20 66 6f 72 20 73 6f 66 74 77 61 72 65 20 75  g for software u
140b0 70 64 61 74 65 20 74 72 75 73 74 2e 2e 2e 20 22  pdate trust... "
140c0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c  ....      if {[l
140d0 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d  length [info com
140e0 6d 61 6e 64 73 20 75 72 69 5d 5d 20 3e 20 30 20  mands uri]] > 0 
140f0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
14100 5b 63 61 74 63 68 20 7b 75 72 69 20 73 6f 66 74  [catch {uri soft
14110 77 61 72 65 75 70 64 61 74 65 73 7d 20 74 72 75  wareupdates} tru
14120 73 74 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20  st] == 0 && \.. 
14130 20 20 20 20 20 20 20 20 20 24 74 72 75 73 74 20           $trust 
14140 65 71 20 22 73 6f 66 74 77 61 72 65 20 75 70 64  eq "software upd
14150 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20  ate certificate 
14160 69 73 20 74 72 75 73 74 65 64 22 7d 20 74 68 65  is trusted"} the
14170 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
14180 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14190 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
141a0 74 68 61 74 20 77 65 20 74 72 75 73 74 20 6f 75  that we trust ou
141b0 72 20 73 6f 66 74 77 61 72 65 20 75 70 64 61 74  r software updat
141c0 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  es...        #  
141d0 20 20 20 20 20 53 69 6e 63 65 20 74 68 69 73 20       Since this 
141e0 73 65 74 74 69 6e 67 20 69 73 20 6f 66 66 20 62  setting is off b
141f0 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 20 75  y default, the u
14200 73 65 72 20 28 6f 72 0d 0a 20 20 20 20 20 20 20  ser (or..       
14210 20 23 20 20 20 20 20 20 20 61 20 73 63 72 69 70   #       a scrip
14220 74 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 74  t evaluated by t
14230 68 65 20 75 73 65 72 29 20 6d 75 73 74 20 68 61  he user) must ha
14240 76 65 20 6d 61 6e 75 61 6c 6c 79 0d 0a 20 20 20  ve manually..   
14250 20 20 20 20 20 23 20 20 20 20 20 20 20 74 75 72       #       tur
14260 6e 65 64 20 69 74 20 6f 6e 2e 0d 0a 20 20 20 20  ned it on...    
14270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
14280 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 6f 66  ddConstraint sof
14290 74 77 61 72 65 55 70 64 61 74 65 0d 0a 0d 0a 20  twareUpdate.... 
142a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
142b0 61 6e 6e 65 6c 20 74 72 75 73 74 65 64 5c 6e 0d  annel trusted\n.
142c0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
142d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
142e0 63 68 61 6e 6e 65 6c 20 75 6e 74 72 75 73 74 65  channel untruste
142f0 64 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  d\n..      }..  
14300 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14310 20 63 68 65 63 6b 46 6f 72 4d 61 6e 61 67 65 64   checkForManaged
14320 44 65 62 75 67 67 69 6e 67 41 73 73 69 73 74 61  DebuggingAssista
14330 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  nts { channel } 
14340 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
14350 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d  eName [file norm
14360 61 6c 69 7a 65 20 5b 61 70 70 65 6e 64 41 72 67  alize [appendArg
14370 73 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78  s [info nameofex
14380 65 63 75 74 61 62 6c 65 5d 20 5c 0d 0a 20 20 20  ecutable] \..   
14390 20 20 20 20 20 20 20 2e 6d 64 61 2e 63 6f 6e 66         .mda.conf
143a0 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70  ig]]....      tp
143b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
143c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
143d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
143e0 6b 69 6e 67 20 66 6f 72 20 6d 61 6e 61 67 65 64  king for managed
143f0 20 64 65 62 75 67 67 69 6e 67 20 61 73 73 69 73   debugging assis
14400 74 61 6e 74 73 20 65 6e 61 62 6c 65 64 20 76 69  tants enabled vi
14410 61 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  a \"" \..       
14420 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 22 5c 22     $fileName "\"
14430 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
14440 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
14450 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
14460 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
14470 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14480 53 69 6e 63 65 20 74 68 65 20 53 79 73 74 65 6d  Since the System
14490 2e 58 6d 6c 20 61 73 73 65 6d 62 6c 79 20 6d 61  .Xml assembly ma
144a0 79 20 6e 6f 74 20 62 65 20 6c 6f 61 64 65 64 2c  y not be loaded,
144b0 20 77 72 61 70 20 74 68 65 0d 0a 20 20 20 20 20   wrap the..     
144c0 20 20 20 23 20 20 20 20 20 20 20 64 65 74 65 63     #       detec
144d0 74 69 6f 6e 20 69 6e 20 61 20 5b 63 61 74 63 68  tion in a [catch
144e0 5d 20 62 6c 6f 63 6b 2e 0d 0a 20 20 20 20 20 20  ] block...      
144f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
14500 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
14510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14520 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
14530 20 61 6e 64 20 6c 6f 61 64 20 61 6e 20 58 4d 4c   and load an XML
14540 20 64 6f 63 75 6d 65 6e 74 20 62 61 73 65 64 20   document based 
14550 6f 6e 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  on the data from
14560 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
14570 23 20 20 20 20 20 20 20 4d 44 41 20 63 6f 6e 66  #       MDA conf
14580 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 61  iguration file a
14590 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
145a0 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 74 68  he executable th
145b0 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  at..          # 
145c0 20 20 20 20 20 20 73 74 61 72 74 65 64 20 74 68        started th
145d0 69 73 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  is process...   
145e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
145f0 20 20 20 20 73 65 74 20 64 6f 63 75 6d 65 6e 74      set document
14600 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
14610 2d 61 6c 69 61 73 20 53 79 73 74 65 6d 2e 58 6d  -alias System.Xm
14620 6c 2e 58 6d 6c 44 6f 63 75 6d 65 6e 74 5d 0d 0a  l.XmlDocument]..
14630 20 20 20 20 20 20 20 20 20 20 24 64 6f 63 75 6d            $docum
14640 65 6e 74 20 4c 6f 61 64 58 6d 6c 20 5b 72 65 61  ent LoadXml [rea
14650 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 5d  dFile $fileName]
14660 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
14670 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
14680 45 3a 20 53 65 74 75 70 20 74 68 65 20 58 4d 4c  E: Setup the XML
14690 20 6e 61 6d 65 73 70 61 63 65 20 6d 61 6e 61 67   namespace manag
146a0 65 72 20 66 6f 72 20 75 73 65 20 77 68 65 6e 20  er for use when 
146b0 75 73 69 6e 67 20 58 50 61 74 68 0d 0a 20 20 20  using XPath..   
146c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
146d0 6f 20 71 75 65 72 79 20 74 68 65 20 58 4d 4c 20  o query the XML 
146e0 64 6f 63 75 6d 65 6e 74 2e 0d 0a 20 20 20 20 20  document...     
146f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14700 20 20 73 65 74 20 6e 61 6d 65 54 61 62 6c 65 20    set nameTable 
14710 5b 24 64 6f 63 75 6d 65 6e 74 20 4e 61 6d 65 54  [$document NameT
14720 61 62 6c 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  able]....       
14730 20 20 20 73 65 74 20 6e 61 6d 65 73 70 61 63 65     set namespace
14740 4d 61 6e 61 67 65 72 20 5b 6f 62 6a 65 63 74 20  Manager [object 
14750 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20  create \..      
14760 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20 53          -alias S
14770 79 73 74 65 6d 2e 58 6d 6c 2e 58 6d 6c 4e 61 6d  ystem.Xml.XmlNam
14780 65 73 70 61 63 65 4d 61 6e 61 67 65 72 20 24 6e  espaceManager $n
14790 61 6d 65 54 61 62 6c 65 5d 0d 0a 0d 0a 20 20 20  ameTable]....   
147a0 20 20 20 20 20 20 20 24 6e 61 6d 65 73 70 61 63         $namespac
147b0 65 4d 61 6e 61 67 65 72 20 41 64 64 4e 61 6d 65  eManager AddName
147c0 73 70 61 63 65 20 6d 64 61 20 5c 0d 0a 20 20 20  space mda \..   
147d0 20 20 20 20 20 20 20 20 20 20 20 68 74 74 70 3a             http:
147e0 2f 2f 73 63 68 65 6d 61 73 2e 6d 69 63 72 6f 73  //schemas.micros
147f0 6f 66 74 2e 63 6f 6d 2f 43 4c 52 2f 32 30 30 34  oft.com/CLR/2004
14800 2f 31 30 2f 6d 64 61 0d 0a 0d 0a 20 20 20 20 20  /10/mda....     
14810 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14820 20 20 23 20 4e 4f 54 45 3a 20 53 65 6c 65 63 74    # NOTE: Select
14830 20 61 6c 6c 20 6e 6f 64 65 73 20 75 6e 64 65 72   all nodes under
14840 6e 65 61 74 68 20 74 68 65 20 6c 6f 63 61 74 69  neath the locati
14850 6f 6e 20 77 68 65 72 65 20 74 68 65 79 20 73 68  on where they sh
14860 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ould..          
14870 23 20 20 20 20 20 20 20 72 65 73 69 64 65 20 69  #       reside i
14880 6e 20 74 68 65 20 4d 44 41 20 63 6f 6e 66 69 67  n the MDA config
14890 75 72 61 74 69 6f 6e 20 58 4d 4c 20 64 6f 63 75  uration XML docu
148a0 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  ment...         
148b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
148c0 74 20 6e 6f 64 65 73 20 5b 24 64 6f 63 75 6d 65  t nodes [$docume
148d0 6e 74 20 53 65 6c 65 63 74 4e 6f 64 65 73 20 5c  nt SelectNodes \
148e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
148f0 2f 6d 64 61 3a 6d 64 61 43 6f 6e 66 69 67 2f 6d  /mda:mdaConfig/m
14900 64 61 3a 61 73 73 69 73 74 61 6e 74 73 2f 2a 20  da:assistants/* 
14910 24 6e 61 6d 65 73 70 61 63 65 4d 61 6e 61 67 65  $namespaceManage
14920 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  r]....          
14930 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14940 4f 54 45 3a 20 50 6f 70 75 6c 61 74 65 20 74 68  OTE: Populate th
14950 65 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 20 76  e local result v
14960 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
14970 20 6e 61 6d 65 73 20 6f 66 0d 0a 20 20 20 20 20   names of..     
14980 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 6c       #       all
14990 20 74 68 65 20 58 4d 4c 20 6e 6f 64 65 73 20 66   the XML nodes f
149a0 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ound...         
149b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
149c0 74 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20  t names [object 
149d0 6c 6d 61 70 20 2d 61 6c 69 61 73 20 6e 6f 64 65  lmap -alias node
149e0 20 24 6e 6f 64 65 73 20 7b 0d 0a 20 20 20 20 20   $nodes {..     
149f0 20 20 20 20 20 20 20 24 6e 6f 64 65 20 4e 61 6d         $node Nam
14a00 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 5d 0d  e..          }].
14a10 0a 20 20 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  .        }] == 0
14a20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14a30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14a40 20 23 20 4e 4f 54 45 3a 20 4f 6b 2c 20 74 68 65   # NOTE: Ok, the
14a50 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69   XML configurati
14a60 6f 6e 20 66 69 6c 65 20 77 61 73 20 6c 6f 61 64  on file was load
14a70 65 64 20 61 6e 64 20 70 61 72 73 65 64 0d 0a 20  ed and parsed.. 
14a80 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14a90 20 63 6f 72 72 65 63 74 6c 79 2c 20 73 65 65 20   correctly, see 
14aa0 69 66 20 61 6e 79 20 6d 61 6e 61 67 65 64 20 64  if any managed d
14ab0 65 62 75 67 67 69 6e 67 20 61 73 73 69 73 74 61  ebugging assista
14ac0 6e 74 73 20 77 65 72 65 0d 0a 20 20 20 20 20 20  nts were..      
14ad0 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e      #       foun
14ae0 64 20 65 6e 61 62 6c 65 64 20 77 69 74 68 69 6e  d enabled within
14af0 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20   it...          
14b00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
14b10 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 61  {[info exists na
14b20 6d 65 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68  mes] && [llength
14b30 20 24 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68   $names] > 0} th
14b40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14b50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
14b60 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 20 74   # NOTE: Add a t
14b70 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  est constraint f
14b80 6f 72 20 65 61 63 68 20 6d 61 6e 61 67 65 64 20  or each managed 
14b90 64 65 62 75 67 67 69 6e 67 0d 0a 20 20 20 20 20  debugging..     
14ba0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
14bb0 73 73 69 73 74 61 6e 74 20 74 68 61 74 20 61 70  ssistant that ap
14bc0 70 65 61 72 73 20 74 6f 20 62 65 20 65 6e 61 62  pears to be enab
14bd0 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  led...          
14be0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
14bf0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d   addConstraint m
14c00 64 61 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  da....          
14c10 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24    foreach name $
14c20 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  names {..       
14c30 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
14c40 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
14c50 20 6d 64 61 2e 20 24 6e 61 6d 65 5d 0d 0a 20 20   mda. $name]..  
14c60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
14c70 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14c80 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14c90 3a 20 53 61 76 65 20 74 68 65 20 6c 69 73 74 20  : Save the list 
14ca0 6f 66 20 6d 61 6e 61 67 65 64 20 64 65 62 75 67  of managed debug
14cb0 67 69 6e 67 20 61 73 73 69 73 74 61 6e 74 73 20  ging assistants 
14cc0 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  for..           
14cd0 20 23 20 20 20 20 20 20 20 6c 61 74 65 72 20 75   #       later u
14ce0 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
14cf0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  uite...         
14d00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
14d10 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14d20 73 74 73 20 3a 3a 6e 6f 28 73 65 74 4d 64 61 73  sts ::no(setMdas
14d30 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14d40 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
14d50 74 65 73 74 5f 6d 64 61 73 20 24 6e 61 6d 65 73  test_mdas $names
14d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
14d70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
14d80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
14d90 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70  NOTE: Yes, it ap
14da0 70 65 61 72 73 20 74 68 61 74 20 61 74 20 6c 65  pears that at le
14db0 61 73 74 20 6f 6e 65 20 6d 61 6e 61 67 65 64 20  ast one managed 
14dc0 64 65 62 75 67 67 69 6e 67 0d 0a 20 20 20 20 20  debugging..     
14dd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
14de0 73 73 69 73 74 61 6e 74 20 69 73 20 65 6e 61 62  ssistant is enab
14df0 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  led...          
14e00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
14e10 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14e20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
14e30 20 28 22 20 24 6e 61 6d 65 73 20 22 29 5c 6e 22   (" $names ")\n"
14e40 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
14e50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
14e60 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  # NOTE: We are d
14e70 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e  one here, return
14e80 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
14e90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
14ea0 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
14eb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
14ec0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
14ed0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14ee0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  l no\n..    }...
14ef0 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
14f00 46 6f 72 53 74 72 6f 6e 67 4e 61 6d 65 20 7b 20  ForStrongName { 
14f10 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
14f20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14f30 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
14f40 20 66 6f 72 20 73 74 72 6f 6e 67 20 6e 61 6d 65   for strong name
14f50 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
14f60 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
14f70 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
14f80 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
14f90 65 74 41 63 74 69 76 65 20 47 65 74 53 74 72 6f  etActive GetStro
14fa0 6e 67 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20  ngName..      } 
14fb0 73 74 72 6f 6e 67 4e 61 6d 65 5d 20 3d 3d 20 30  strongName] == 0
14fc0 20 26 26 20 5b 69 73 4e 6f 6e 4e 75 6c 6c 4f 62   && [isNonNullOb
14fd0 6a 65 63 74 48 61 6e 64 6c 65 20 24 73 74 72 6f  jectHandle $stro
14fe0 6e 67 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  ngName]} then {.
14ff0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15000 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
15010 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
15020 20 74 68 65 20 63 6f 72 65 20 6c 69 62 72 61 72   the core librar
15030 79 20 77 61 73 20 73 69 67 6e 65 64 20 77 69 74  y was signed wit
15040 68 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20  h a..        #  
15050 20 20 20 20 20 73 74 72 6f 6e 67 20 6e 61 6d 65       strong name
15060 20 6b 65 79 2e 0d 0a 20 20 20 20 20 20 20 20 23   key...        #
15070 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
15080 73 74 72 61 69 6e 74 20 73 74 72 6f 6e 67 4e 61  straint strongNa
15090 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  me....        tp
150a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
150b0 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
150c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
150d0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
150e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
150f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
15100 63 6b 46 6f 72 53 74 72 6f 6e 67 4e 61 6d 65 4b  ckForStrongNameK
15110 65 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ey { channel } {
15120 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
15130 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
15140 63 6b 69 6e 67 20 66 6f 72 20 73 74 72 6f 6e 67  cking for strong
15150 20 6e 61 6d 65 20 6b 65 79 2e 2e 2e 20 22 0d 0a   name key... "..
15160 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
15170 63 68 20 7b 69 6e 66 6f 20 65 6e 67 69 6e 65 20  ch {info engine 
15180 50 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 7d 20  PublicKeyToken} 
15190 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 5d 20  publicKeyToken] 
151a0 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20  == 0 && \..     
151b0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
151c0 67 74 68 20 24 70 75 62 6c 69 63 4b 65 79 54 6f  gth $publicKeyTo
151d0 6b 65 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ken] > 0} then {
151e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
151f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
15200 20 61 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69   a test constrai
15210 6e 74 20 66 6f 72 20 74 68 69 73 20 73 70 65 63  nt for this spec
15220 69 66 69 63 20 73 74 72 6f 6e 67 20 6e 61 6d 65  ific strong name
15230 20 6b 65 79 2e 0d 0a 20 20 20 20 20 20 20 20 23   key...        #
15240 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
15250 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
15260 72 67 73 20 73 74 72 6f 6e 67 4e 61 6d 65 2e 20  rgs strongName. 
15270 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 5d  $publicKeyToken]
15280 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
15290 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
152a0 68 6f 77 20 74 68 65 20 73 74 72 6f 6e 67 20 6e  how the strong n
152b0 61 6d 65 20 6b 65 79 20 74 68 61 74 20 77 65 20  ame key that we 
152c0 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
152d0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
152e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
152f0 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
15300 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20 22 29  ublicKeyToken ")
15310 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
15320 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47  #..        # BUG
15330 42 55 47 3a 20 54 63 6c 20 38 2e 34 20 64 6f 65  BUG: Tcl 8.4 doe
15340 73 20 6e 6f 74 20 73 65 65 6d 20 74 6f 20 6c 69  s not seem to li
15350 6b 65 20 74 68 69 73 20 65 78 70 72 65 73 73 69  ke this expressi
15360 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0d 0a 20  on because it.. 
15370 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
15380 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 22 6e   contains the "n
15390 69 22 20 6f 70 65 72 61 74 6f 72 20 61 64 64 65  i" operator adde
153a0 64 20 69 6e 20 54 63 6c 20 38 2e 35 20 28 61 6e  d in Tcl 8.5 (an
153b0 64 20 54 63 6c 20 38 2e 34 0d 0a 20 20 20 20 20  d Tcl 8.4..     
153c0 20 20 20 23 20 20 20 20 20 20 20 20 20 74 72 69     #         tri
153d0 65 73 20 74 6f 20 63 6f 6d 70 69 6c 65 20 69 74  es to compile it
153e0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
153f0 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 65 76 61  will only be eva
15400 6c 75 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  luated..        
15410 23 20 20 20 20 20 20 20 20 20 69 6e 20 45 61 67  #         in Eag
15420 6c 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  le)...        #.
15430 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78 70  .        set exp
15440 72 20 7b 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b  r {$publicKeyTok
15450 65 6e 20 6e 69 20 5c 0d 0a 20 20 20 20 20 20 20  en ni \..       
15460 20 20 20 20 20 22 32 39 63 36 32 39 37 36 33 30       "29c6297630
15470 62 65 30 35 65 62 20 31 65 32 32 65 63 36 37 38  be05eb 1e22ec678
15480 37 39 37 33 39 61 32 20 33 35 38 30 33 30 30 36  79739a2 35803006
15490 33 61 38 33 32 62 63 33 22 7d 0d 0a 0d 0a 20 20  3a832bc3"}....  
154a0 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70 72 20        if {[expr 
154b0 24 65 78 70 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  $expr]} then {..
154c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
154d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
154e0 68 65 20 45 61 67 6c 65 20 63 6f 72 65 20 6c 69  he Eagle core li
154f0 62 72 61 72 79 20 69 73 20 73 74 72 6f 6e 67 20  brary is strong 
15500 6e 61 6d 65 20 73 69 67 6e 65 64 20 77 69 74 68  name signed with
15510 20 61 20 6b 65 79 20 74 68 61 74 0d 0a 20 20 20   a key that..   
15520 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
15530 73 20 6e 6f 74 20 6f 66 66 69 63 69 61 6c 2e 20  s not official. 
15540 20 54 68 69 73 20 69 73 20 61 6c 73 6f 20 6e 6f   This is also no
15550 74 20 61 6e 20 65 72 72 6f 72 2c 20 70 65 72 20  t an error, per 
15560 73 65 3b 20 68 6f 77 65 76 65 72 2c 0d 0a 20 20  se; however,..  
15570 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15580 69 74 20 6d 61 79 20 63 61 75 73 65 20 73 6f 6d  it may cause som
15590 65 20 74 65 73 74 73 20 74 6f 20 66 61 69 6c 20  e tests to fail 
155a0 61 6e 64 20 69 74 20 73 68 6f 75 6c 64 20 62 65  and it should be
155b0 20 72 65 70 6f 72 74 65 64 20 74 6f 0d 0a 20 20   reported to..  
155c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
155d0 74 68 65 20 75 73 65 72 20 61 6e 64 20 6e 6f 74  the user and not
155e0 65 64 20 69 6e 20 74 68 65 20 74 65 73 74 20 73  ed in the test s
155f0 75 69 74 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  uite log file...
15600 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
15610 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
15620 61 69 6e 74 20 73 74 72 6f 6e 67 4e 61 6d 65 2e  aint strongName.
15630 75 6e 6f 66 66 69 63 69 61 6c 0d 0a 0d 0a 20 20  unofficial....  
15640 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15650 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c       # NOTE: Unl
15660 65 73 73 20 66 6f 72 62 69 64 64 65 6e 2c 20 69  ess forbidden, i
15670 73 73 75 65 20 61 6e 64 20 6c 6f 67 20 61 20 77  ssue and log a w
15680 61 72 6e 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  arning...       
15690 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
156a0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
156b0 73 20 6e 6f 28 77 61 72 6e 69 6e 67 46 6f 72 53  s no(warningForS
156c0 74 72 6f 6e 67 4e 61 6d 65 4b 65 79 29 5d 20 26  trongNameKey)] &
156d0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
156e0 20 20 20 21 5b 68 61 76 65 43 6f 6e 73 74 72 61     ![haveConstra
156f0 69 6e 74 20 71 75 69 65 74 5d 7d 20 74 68 65 6e  int quiet]} then
15700 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15710 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15720 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
15740 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 75 6e 6f  === WARNING: uno
15750 66 66 69 63 69 61 6c 20 45 61 67 6c 65 20 73 74  fficial Eagle st
15760 72 6f 6e 67 20 6e 61 6d 65 20 73 69 67 6e 61 74  rong name signat
15770 75 72 65 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ure " \..       
15780 20 20 20 20 20 20 20 20 20 22 64 65 74 65 63 74           "detect
15790 65 64 3a 20 22 20 24 70 75 62 6c 69 63 4b 65 79  ed: " $publicKey
157a0 54 6f 6b 65 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20  Token \n]..     
157b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
157c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
157d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
157e0 20 23 20 4e 4f 54 45 3a 20 53 65 76 65 72 61 6c   # NOTE: Several
157f0 20 74 65 73 74 73 20 72 65 71 75 69 72 65 20 6f   tests require o
15800 6e 65 20 6f 66 20 74 68 65 20 6f 66 66 69 63 69  ne of the offici
15810 61 6c 20 73 74 72 6f 6e 67 20 6e 61 6d 65 20 6b  al strong name k
15820 65 79 73 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  eys to..        
15830 20 20 23 20 20 20 20 20 20 20 62 65 20 75 73 65    #       be use
15840 64 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  d in order for t
15850 68 65 6d 20 74 6f 20 70 61 73 73 2e 0d 0a 20 20  hem to pass...  
15860 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15870 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
15880 6e 74 20 73 74 72 6f 6e 67 4e 61 6d 65 2e 6f 66  nt strongName.of
15890 66 69 63 69 61 6c 0d 0a 0d 0a 20 20 20 20 20 20  ficial....      
158a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
158b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
158c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
158d0 22 2d 2d 2d 2d 20 6f 66 66 69 63 69 61 6c 20 45  "---- official E
158e0 61 67 6c 65 20 73 74 72 6f 6e 67 20 6e 61 6d 65  agle strong name
158f0 20 73 69 67 6e 61 74 75 72 65 20 64 65 74 65 63   signature detec
15900 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ted: " \..      
15910 20 20 20 20 20 20 20 20 24 70 75 62 6c 69 63 4b          $publicK
15920 65 79 54 6f 6b 65 6e 20 5c 6e 5d 0d 0a 20 20 20  eyToken \n]..   
15930 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
15940 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15950 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15960 45 3a 20 54 68 65 20 45 61 67 6c 65 20 63 6f 72  E: The Eagle cor
15970 65 20 6c 69 62 72 61 72 79 20 69 73 20 6e 6f 74  e library is not
15980 20 73 69 67 6e 65 64 20 77 69 74 68 20 61 20 73   signed with a s
15990 74 72 6f 6e 67 20 6e 61 6d 65 20 6b 65 79 2e 0d  trong name key..
159a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
159b0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   This is not an 
159c0 65 72 72 6f 72 2c 20 70 65 72 20 73 65 3b 20 68  error, per se; h
159d0 6f 77 65 76 65 72 2c 20 69 74 20 6d 61 79 20 63  owever, it may c
159e0 61 75 73 65 20 73 65 6c 65 63 74 65 64 0d 0a 20  ause selected.. 
159f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
15a00 65 73 74 73 20 74 6f 20 66 61 69 6c 20 61 6e 64  ests to fail and
15a10 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
15a20 70 6f 72 74 65 64 20 74 6f 20 74 68 65 20 75 73  ported to the us
15a30 65 72 20 61 6e 64 20 6e 6f 74 65 64 0d 0a 20 20  er and noted..  
15a40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
15a50 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
15a60 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
15a70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
15a80 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 74 72 6f  dConstraint stro
15a90 6e 67 4e 61 6d 65 2e 6e 6f 6e 65 0d 0a 0d 0a 20  ngName.none.... 
15aa0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15ab0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
15ac0 68 61 74 20 77 65 20 64 69 64 20 6e 6f 74 20 66  hat we did not f
15ad0 69 6e 64 20 61 20 73 74 72 6f 6e 67 20 6e 61 6d  ind a strong nam
15ae0 65 20 6b 65 79 2e 0d 0a 20 20 20 20 20 20 20 20  e key...        
15af0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
15b00 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
15b10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15b20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c       # NOTE: Unl
15b30 65 73 73 20 66 6f 72 62 69 64 64 65 6e 2c 20 69  ess forbidden, i
15b40 73 73 75 65 20 61 6e 64 20 6c 6f 67 20 61 20 77  ssue and log a w
15b50 61 72 6e 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  arning...       
15b60 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
15b70 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f  ![info exists no
15b80 28 77 61 72 6e 69 6e 67 46 6f 72 53 74 72 6f 6e  (warningForStron
15b90 67 4e 61 6d 65 4b 65 79 29 5d 20 26 26 20 5c 0d  gNameKey)] && \.
15ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68  .            ![h
15bb0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 71 75  aveConstraint qu
15bc0 69 65 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  iet]} then {..  
15bd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15be0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
15bf0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
15c00 52 4e 49 4e 47 3a 20 6e 6f 20 45 61 67 6c 65 20  RNING: no Eagle 
15c10 73 74 72 6f 6e 67 20 6e 61 6d 65 20 73 69 67 6e  strong name sign
15c20 61 74 75 72 65 20 64 65 74 65 63 74 65 64 2e 2e  ature detected..
15c30 2e 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .\n"..        }.
15c40 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
15c50 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
15c60 63 6b 46 6f 72 43 65 72 74 69 66 69 63 61 74 65  ckForCertificate
15c70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
15c80 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15c90 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
15ca0 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63  ing for certific
15cb0 61 74 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ate... "....    
15cc0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
15cd0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
15ce0 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
15cf0 72 2e 47 65 74 41 63 74 69 76 65 20 47 65 74 43  r.GetActive GetC
15d00 65 72 74 69 66 69 63 61 74 65 0d 0a 20 20 20 20  ertificate..    
15d10 20 20 7d 20 63 65 72 74 69 66 69 63 61 74 65 5d    } certificate]
15d20 20 3d 3d 20 30 20 26 26 20 5b 69 73 4e 6f 6e 4e   == 0 && [isNonN
15d30 75 6c 6c 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  ullObjectHandle 
15d40 24 63 65 72 74 69 66 69 63 61 74 65 5d 7d 20 74  $certificate]} t
15d50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
15d60 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15d70 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
15d80 73 20 74 68 61 74 20 74 68 65 20 63 6f 72 65 20  s that the core 
15d90 6c 69 62 72 61 72 79 20 77 61 73 20 73 69 67 6e  library was sign
15da0 65 64 20 77 69 74 68 20 61 0d 0a 20 20 20 20 20  ed with a..     
15db0 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 2d     #       code-
15dc0 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63  signing certific
15dd0 61 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ate...        #.
15de0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
15df0 74 72 61 69 6e 74 20 63 65 72 74 69 66 69 63 61  traint certifica
15e00 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  te....        #.
15e10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15e20 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
15e30 79 20 74 68 65 20 73 75 62 6a 65 63 74 20 66 72  y the subject fr
15e40 6f 6d 20 74 68 65 20 63 65 72 74 69 66 69 63 61  om the certifica
15e50 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
15e60 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
15e70 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
15e80 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
15e90 65 72 74 69 66 69 63 61 74 65 20 53 75 62 6a 65  ertificate Subje
15ea0 63 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 75  ct..        } su
15eb0 62 6a 65 63 74 5d 20 7c 7c 20 5b 73 74 72 69 6e  bject] || [strin
15ec0 67 20 6c 65 6e 67 74 68 20 24 73 75 62 6a 65 63  g length $subjec
15ed0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
15ee0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15ef0 20 20 20 20 20 20 20 20 23 20 54 4f 44 4f 3a 20          # TODO: 
15f00 4e 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 73  No certificate s
15f10 75 62 6a 65 63 74 2c 20 62 65 74 74 65 72 20 68  ubject, better h
15f20 61 6e 64 6c 69 6e 67 20 68 65 72 65 3f 0d 0a 20  andling here?.. 
15f30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15f40 20 20 20 20 20 20 73 65 74 20 73 75 62 6a 65 63        set subjec
15f50 74 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  t unknown..     
15f60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15f70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15f80 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
15f90 28 22 20 24 73 75 62 6a 65 63 74 20 22 29 5c 6e  (" $subject ")\n
15fa0 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
15fb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
15fc0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
15fd0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
15fe0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
15ff0 63 6b 46 6f 72 43 6f 6d 70 69 6c 65 43 53 68 61  ckForCompileCSha
16000 72 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  rp { channel } {
16010 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
16020 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
16030 63 6b 69 6e 67 20 66 6f 72 20 74 65 73 74 20 75  cking for test u
16040 73 65 20 6f 66 20 43 23 20 63 6f 6d 70 69 6c 65  se of C# compile
16050 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
16060 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
16070 73 20 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 43 53  s ::no(compileCS
16080 68 61 72 70 29 5d 20 26 26 20 5c 0d 0a 20 20 20  harp)] && \..   
16090 20 20 20 20 20 20 20 5b 64 6f 65 73 43 6f 6d 70         [doesComp
160a0 69 6c 65 43 53 68 61 72 70 57 6f 72 6b 5d 7d 20  ileCSharpWork]} 
160b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
160c0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 63 6f  addConstraint co
160d0 6d 70 69 6c 65 43 53 68 61 72 70 0d 0a 0d 0a 20  mpileCSharp.... 
160e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
160f0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
16100 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
16110 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16120 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
16130 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
16140 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 41 64   proc checkForAd
16150 6d 69 6e 69 73 74 72 61 74 6f 72 20 7b 20 63 68  ministrator { ch
16160 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
16170 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
16180 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
16190 6f 72 20 61 64 6d 69 6e 69 73 74 72 61 74 6f 72  or administrator
161a0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
161b0 66 20 7b 5b 69 73 54 65 73 74 41 64 6d 69 6e 69  f {[isTestAdmini
161c0 73 74 72 61 74 6f 72 5d 7d 20 74 68 65 6e 20 7b  strator]} then {
161d0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
161e0 73 74 72 61 69 6e 74 20 61 64 6d 69 6e 69 73 74  straint administ
161f0 72 61 74 6f 72 3b 20 23 20 72 75 6e 6e 69 6e 67  rator; # running
16200 20 61 73 20 66 75 6c 6c 20 61 64 6d 69 6e 2e 0d   as full admin..
16210 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
16220 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
16230 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
16240 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
16250 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
16260 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
16270 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
16280 6f 72 48 6f 73 74 20 7b 20 63 68 61 6e 6e 65 6c  orHost { channel
16290 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
162a0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
162b0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 68 6f   checking for ho
162c0 73 74 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  st... "....     
162d0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 68 6f 73   if {[catch {hos
162e0 74 20 69 73 6f 70 65 6e 7d 20 6f 70 65 6e 5d 20  t isopen} open] 
162f0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16300 20 20 20 20 20 20 69 66 20 7b 24 6f 70 65 6e 7d        if {$open}
16310 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16320 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
16330 20 68 6f 73 74 49 73 4f 70 65 6e 0d 0a 0d 0a 20   hostIsOpen.... 
16340 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16350 63 68 61 6e 6e 65 6c 20 6f 70 65 6e 5c 6e 0d 0a  channel open\n..
16360 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
16370 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
16380 5b 63 61 74 63 68 20 7b 68 6f 73 74 20 72 65 64  [catch {host red
16390 69 72 65 63 74 65 64 20 49 6e 70 75 74 7d 20 72  irected Input} r
163a0 65 64 69 72 65 63 74 65 64 5d 20 3d 3d 20 30 7d  edirected] == 0}
163b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
163c0 20 20 20 20 20 69 66 20 7b 24 72 65 64 69 72 65       if {$redire
163d0 63 74 65 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  cted} then {..  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
163f0 6f 6e 73 74 72 61 69 6e 74 20 68 6f 73 74 49 6e  onstraint hostIn
16400 70 75 74 52 65 64 69 72 65 63 74 65 64 0d 0a 0d  putRedirected...
16410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
16420 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 72 65  puts $channel re
16430 64 69 72 65 63 74 65 64 5c 6e 0d 0a 20 20 20 20  directed\n..    
16440 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
16450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16460 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 68 6f  addConstraint ho
16470 73 74 49 73 43 6c 6f 73 65 64 0d 0a 0d 0a 20 20  stIsClosed....  
16480 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16490 73 20 24 63 68 61 6e 6e 65 6c 20 63 6c 6f 73 65  s $channel close
164a0 64 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d\n..           
164b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
164c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
164d0 20 20 20 20 74 6c 6f 67 20 24 72 65 64 69 72 65      tlog $redire
164e0 63 74 65 64 3b 20 74 70 75 74 73 20 24 63 68 61  cted; tputs $cha
164f0 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20  nnel error\n..  
16500 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16510 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
16520 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 6c  se {..        tl
16530 6f 67 20 24 6f 70 65 6e 3b 20 74 70 75 74 73 20  og $open; tputs 
16540 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
16550 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
16560 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
16570 65 63 6b 46 6f 72 48 6f 73 74 54 79 70 65 20 7b  eckForHostType {
16580 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
16590 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
165a0 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
165b0 67 20 66 6f 72 20 68 6f 73 74 20 74 79 70 65 2e  g for host type.
165c0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
165d0 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74   {[set code [cat
165e0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
165f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
16600 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
16610 65 2e 48 6f 73 74 2e 47 65 74 54 79 70 65 20 54  e.Host.GetType T
16620 6f 53 74 72 69 6e 67 0d 0a 20 20 20 20 20 20 7d  oString..      }
16630 20 68 6f 73 74 54 79 70 65 5d 5d 20 3d 3d 20 30   hostType]] == 0
16640 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67   && [string leng
16650 74 68 20 24 68 6f 73 74 54 79 70 65 5d 20 3e 20  th $hostType] > 
16660 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16670 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
16680 20 5b 61 70 70 65 6e 64 41 72 67 73 20 68 6f 73   [appendArgs hos
16690 74 54 79 70 65 2e 20 5b 73 74 72 69 6e 67 20 6d  tType. [string m
166a0 61 70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ap \..          
166b0 20 20 5b 6c 69 73 74 20 2c 20 5f 20 2b 20 5f 20    [list , _ + _ 
166c0 26 20 5f 20 2a 20 5f 20 5c 5b 20 5f 20 5c 5d 20  & _ * _ \[ _ \] 
166d0 5f 20 2e 20 5f 20 5c 5c 20 5f 5d 20 24 68 6f 73  _ . _ \\ _] $hos
166e0 74 54 79 70 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  tType]]....     
166f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16700 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 68  l [appendArgs $h
16710 6f 73 74 54 79 70 65 20 5c 6e 5d 0d 0a 20 20 20  ostType \n]..   
16720 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
16730 64 65 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  de == 0} then {.
16740 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
16750 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
16760 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
16770 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
16780 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c   $channel error\
16790 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
167a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
167b0 68 65 63 6b 46 6f 72 50 72 69 6d 61 72 79 54 68  heckForPrimaryTh
167c0 72 65 61 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  read { channel }
167d0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
167e0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
167f0 68 65 63 6b 69 6e 67 20 66 6f 72 20 70 72 69 6d  hecking for prim
16800 61 72 79 20 74 68 72 65 61 64 2e 2e 2e 20 22 0d  ary thread... ".
16810 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  ...      if {[in
16820 66 6f 20 74 69 64 5d 20 3d 3d 20 5b 73 65 74 20  fo tid] == [set 
16830 74 68 72 65 61 64 49 64 20 5b 69 6e 66 6f 20 70  threadId [info p
16840 74 69 64 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tid]]} then {.. 
16850 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
16860 61 69 6e 74 20 70 72 69 6d 61 72 79 54 68 72 65  aint primaryThre
16870 61 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ad....        tp
16880 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
16890 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
168a0 20 24 74 68 72 65 61 64 49 64 20 22 29 5c 6e 22   $threadId ")\n"
168b0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
168c0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
168d0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
168e0 64 41 72 67 73 20 22 6e 6f 20 28 22 20 24 74 68  dArgs "no (" $th
168f0 72 65 61 64 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  readId ")\n"].. 
16900 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
16910 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
16920 46 6f 72 44 65 66 61 75 6c 74 41 70 70 44 6f 6d  ForDefaultAppDom
16930 61 69 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ain { channel } 
16940 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
16950 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
16960 65 63 6b 69 6e 67 20 66 6f 72 20 64 65 66 61 75  ecking for defau
16970 6c 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  lt application d
16980 6f 6d 61 69 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  omain... "....  
16990 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
169a0 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
169b0 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
169c0 6e 20 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 0d  n CurrentDomain.
169d0 0a 20 20 20 20 20 20 7d 20 61 70 70 44 6f 6d 61  .      } appDoma
169e0 69 6e 5d 20 3d 3d 20 30 20 26 26 20 5b 69 73 4e  in] == 0 && [isN
169f0 6f 6e 4e 75 6c 6c 4f 62 6a 65 63 74 48 61 6e 64  onNullObjectHand
16a00 6c 65 20 24 61 70 70 44 6f 6d 61 69 6e 5d 7d 20  le $appDomain]} 
16a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16a20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
16a30 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
16a40 6e 76 6f 6b 65 20 24 61 70 70 44 6f 6d 61 69 6e  nvoke $appDomain
16a50 20 49 73 44 65 66 61 75 6c 74 41 70 70 44 6f 6d   IsDefaultAppDom
16a60 61 69 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 64  ain..        } d
16a70 65 66 61 75 6c 74 5d 20 7c 7c 20 5b 73 74 72 69  efault] || [stri
16a80 6e 67 20 6c 65 6e 67 74 68 20 24 64 65 66 61 75  ng length $defau
16a90 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
16aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
16ab0 64 65 66 61 75 6c 74 20 66 61 6c 73 65 0d 0a 20  default false.. 
16ac0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16ad0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
16ae0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 61  object invoke $a
16af0 70 70 44 6f 6d 61 69 6e 20 49 64 7d 20 69 64 5d  ppDomain Id} id]
16b00 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
16b10 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
16b20 68 20 24 69 64 5d 20 3d 3d 20 30 7d 20 74 68 65  h $id] == 0} the
16b30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
16b40 65 74 20 69 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20  et id unknown.. 
16b50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16b60 20 20 20 20 69 66 20 7b 24 64 65 66 61 75 6c 74      if {$default
16b70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16b80 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
16b90 74 20 64 65 66 61 75 6c 74 41 70 70 44 6f 6d 61  t defaultAppDoma
16ba0 69 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  in....          
16bb0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
16bc0 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
16bd0 28 22 20 24 69 64 20 22 29 5c 6e 22 5d 0d 0a 20  (" $id ")\n"].. 
16be0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
16bf0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
16c00 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
16c10 64 41 72 67 73 20 22 6e 6f 20 28 22 20 24 69 64  dArgs "no (" $id
16c20 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20   ")\n"]..       
16c30 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
16c40 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
16c50 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16c60 6e 64 41 72 67 73 20 22 6e 6f 20 28 6e 75 6c 6c  ndArgs "no (null
16c70 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  )\n"]..      }..
16c80 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
16c90 6f 63 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69  oc checkForRunti
16ca0 6d 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  me { channel } {
16cb0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
16cc0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
16cd0 63 6b 69 6e 67 20 66 6f 72 20 72 75 6e 74 69 6d  cking for runtim
16ce0 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  e... "....      
16cf0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
16d00 20 41 72 65 20 77 65 20 72 75 6e 6e 69 6e 67 20   Are we running 
16d10 69 6e 73 69 64 65 20 4d 6f 6e 6f 20 2d 4f 52 2d  inside Mono -OR-
16d20 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 20 28 72   on .NET Core (r
16d30 65 67 61 72 64 6c 65 73 73 0d 0a 20 20 20 20 20  egardless..     
16d40 20 23 20 20 20 20 20 20 20 6f 66 20 6f 70 65 72   #       of oper
16d50 61 74 69 6e 67 20 73 79 73 74 65 6d 29 3f 0d 0a  ating system)?..
16d60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
16d70 66 20 7b 5b 69 73 54 65 73 74 44 6f 74 4e 65 74  f {[isTestDotNet
16d80 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Core]} then {.. 
16d90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16da0 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
16db0 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 77  t appears that w
16dc0 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
16dd0 20 2e 4e 45 54 20 43 6f 72 65 2e 0d 0a 20 20 20   .NET Core...   
16de0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16df0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
16e00 74 4e 65 74 43 6f 72 65 3b 20 23 20 72 75 6e 6e  tNetCore; # runn
16e10 69 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65  ing on .NET Core
16e20 2e 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ...        addCo
16e30 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 4f  nstraint dotNetO
16e40 72 44 6f 74 4e 65 74 43 6f 72 65 0d 0a 20 20 20  rDotNetCore..   
16e50 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
16e60 6e 74 20 64 6f 74 4e 65 74 43 6f 72 65 4f 72 53  nt dotNetCoreOrS
16e70 68 65 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  hell....        
16e80 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
16e90 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  E: We do not wan
16ea0 74 20 74 6f 20 73 6b 69 70 20 4d 6f 6e 6f 20 62  t to skip Mono b
16eb0 75 67 73 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65  ugs on .NET Core
16ec0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
16ed0 20 20 20 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f        addKnownMo
16ee0 6e 6f 43 6f 6e 73 74 72 61 69 6e 74 73 20 74 72  noConstraints tr
16ef0 75 65 3b 20 23 20 72 75 6e 6e 69 6e 67 20 6f 6e  ue; # running on
16f00 20 2e 4e 45 54 20 43 6f 72 65 2e 0d 0a 0d 0a 20   .NET Core..... 
16f10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
16f20 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16f30 73 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65  s [expr {[info e
16f40 78 69 73 74 73 20 5c 0d 0a 20 20 20 20 20 20 20  xists \..       
16f50 20 20 20 20 20 3a 3a 65 61 67 6c 65 5f 70 6c 61       ::eagle_pla
16f60 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65 29 5d 20  tform(runtime)] 
16f70 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
16f80 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f   $::eagle_platfo
16f90 72 6d 28 72 75 6e 74 69 6d 65 29 20 3a 20 22 2e  rm(runtime) : ".
16fa0 4e 45 54 20 43 6f 72 65 22 7d 5d 20 5c 6e 5d 0d  NET Core"}] \n].
16fb0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
16fc0 7b 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d 7d 20 74  {[isTestMono]} t
16fd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
16fe0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
16ff0 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
17000 73 20 74 68 61 74 20 77 65 20 61 72 65 20 72 75  s that we are ru
17010 6e 6e 69 6e 67 20 69 6e 73 69 64 65 20 4d 6f 6e  nning inside Mon
17020 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o...        #.. 
17030 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
17040 61 69 6e 74 20 6d 6f 6e 6f 3b 20 23 20 72 75 6e  aint mono; # run
17050 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 2e 0d 0a 20  ning on Mono... 
17060 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
17070 61 69 6e 74 20 6d 6f 6e 6f 4f 72 44 6f 74 4e 65  aint monoOrDotNe
17080 74 43 6f 72 65 0d 0a 0d 0a 20 20 20 20 20 20 20  tCore....       
17090 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
170a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 65 78 70  [appendArgs [exp
170b0 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  r {[info exists 
170c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  \..            :
170d0 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
170e0 72 75 6e 74 69 6d 65 29 5d 20 3f 20 5c 0d 0a 20  runtime)] ? \.. 
170f0 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61             $::ea
17100 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e  gle_platform(run
17110 74 69 6d 65 29 20 3a 20 22 4d 6f 6e 6f 22 7d 5d  time) : "Mono"}]
17120 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c   \n]..      } el
17130 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
17140 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
17150 20 49 74 20 61 70 70 65 61 72 73 20 74 68 61 74   It appears that
17160 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
17170 6f 6e 20 74 68 65 20 66 75 6c 6c 20 2e 4e 45 54  on the full .NET
17180 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17190 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
171a0 69 6e 74 20 64 6f 74 4e 65 74 3b 20 23 20 72 75  int dotNet; # ru
171b0 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54 2e 0d 0a  nning on .NET...
171c0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
171d0 72 61 69 6e 74 20 64 6f 74 4e 65 74 4f 72 44 6f  raint dotNetOrDo
171e0 74 4e 65 74 43 6f 72 65 0d 0a 0d 0a 20 20 20 20  tNetCore....    
171f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
17200 20 4e 4f 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74   NOTE: We do not
17210 20 77 61 6e 74 20 74 6f 20 73 6b 69 70 20 4d 6f   want to skip Mo
17220 6e 6f 20 62 75 67 73 20 6f 6e 20 2e 4e 45 54 2e  no bugs on .NET.
17230 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17240 20 20 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e       addKnownMon
17250 6f 43 6f 6e 73 74 72 61 69 6e 74 73 20 74 72 75  oConstraints tru
17260 65 3b 20 23 20 72 75 6e 6e 69 6e 67 20 6f 6e 20  e; # running on 
17270 2e 4e 45 54 2e 0d 0a 0d 0a 20 20 20 20 20 20 20  .NET.....       
17280 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17290 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 65 78 70  [appendArgs [exp
172a0 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  r {[info exists 
172b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  \..            :
172c0 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
172d0 72 75 6e 74 69 6d 65 29 5d 20 3f 20 5c 0d 0a 20  runtime)] ? \.. 
172e0 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61             $::ea
172f0 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e  gle_platform(run
17300 74 69 6d 65 29 20 3a 20 22 4d 69 63 72 6f 73 6f  time) : "Microso
17310 66 74 2e 4e 45 54 22 7d 5d 20 5c 6e 5d 0d 0a 20  ft.NET"}] \n].. 
17320 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
17330 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
17340 46 6f 72 49 6d 61 67 65 52 75 6e 74 69 6d 65 56  ForImageRuntimeV
17350 65 72 73 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c  ersion { channel
17360 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
17370 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
17380 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 69 6d   checking for im
17390 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73  age runtime vers
173a0 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ion... "....    
173b0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
173c0 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  ts ::eagle_platf
173d0 6f 72 6d 28 69 6d 61 67 65 52 75 6e 74 69 6d 65  orm(imageRuntime
173e0 56 65 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a  Version)] && \..
173f0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
17400 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c  g length $::eagl
17410 65 5f 70 6c 61 74 66 6f 72 6d 28 69 6d 61 67 65  e_platform(image
17420 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 5d  RuntimeVersion)]
17430 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
17440 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17450 20 23 20 4e 4f 54 45 3a 20 47 65 74 20 74 68 65   # NOTE: Get the
17460 20 6d 61 6a 6f 72 20 61 6e 64 20 6d 69 6e 6f 72   major and minor
17470 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65   portions of the
17480 20 76 65 72 73 69 6f 6e 20 6f 6e 6c 79 2e 0d 0a   version only...
17490 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
174a0 20 20 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f     set dotVersio
174b0 6e 20 5b 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f 72  n [getMajorMinor
174c0 56 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  Version \..     
174d0 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f         $::eagle_
174e0 70 6c 61 74 66 6f 72 6d 28 69 6d 61 67 65 52 75  platform(imageRu
174f0 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 5d 0d 0a  ntimeVersion)]..
17500 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17510 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
17520 20 63 72 65 61 74 65 20 61 20 76 65 72 73 69 6f   create a versio
17530 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 75 73 65  n string for use
17540 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
17550 6e 74 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  nt name..       
17560 20 23 20 20 20 20 20 20 20 28 72 65 6d 6f 76 65   #       (remove
17570 20 74 68 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a   the periods)...
17580 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17590 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b     set version [
175a0 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
175b0 20 76 20 22 22 20 2e 20 22 22 5d 20 24 64 6f 74   v "" . ""] $dot
175c0 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20  Version]....    
175d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
175e0 20 4e 4f 54 45 3a 20 4b 65 65 70 20 74 72 61 63   NOTE: Keep trac
175f0 6b 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  k of the specifi
17600 63 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20  c image runtime 
17610 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 61 67  version for usag
17620 65 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  e in..        # 
17630 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74        test const
17640 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
17650 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
17660 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
17670 64 41 72 67 73 20 69 6d 61 67 65 52 75 6e 74 69  dArgs imageRunti
17680 6d 65 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 0d 0a  me $version]....
17690 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
176a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
176b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
176c0 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66    $::eagle_platf
176d0 6f 72 6d 28 69 6d 61 67 65 52 75 6e 74 69 6d 65  orm(imageRuntime
176e0 56 65 72 73 69 6f 6e 29 20 22 20 28 22 20 24 64  Version) " (" $d
176f0 6f 74 56 65 72 73 69 6f 6e 20 22 29 5c 6e 22 5d  otVersion ")\n"]
17700 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
17710 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
17720 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
17730 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
17740 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
17750 46 6f 72 46 72 61 6d 65 77 6f 72 6b 56 65 72 73  ForFrameworkVers
17760 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ion { channel } 
17770 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
17780 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
17790 65 63 6b 69 6e 67 20 66 6f 72 20 66 72 61 6d 65  ecking for frame
177a0 77 6f 72 6b 20 76 65 72 73 69 6f 6e 2e 2e 2e 20  work version... 
177b0 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
177c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61  info exists ::ea
177d0 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 66 72 61  gle_platform(fra
177e0 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 5d 20  meworkVersion)] 
177f0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
17800 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
17810 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
17820 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
17830 6e 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  n)] > 0} then {.
17840 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17850 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 65 74 20      # NOTE: Get 
17860 74 68 65 20 6d 61 6a 6f 72 20 61 6e 64 20 6d 69  the major and mi
17870 6e 6f 72 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20  nor portions of 
17880 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 6e 6c 79  the version only
17890 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
178a0 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72        set dotVer
178b0 73 69 6f 6e 20 5b 67 65 74 4d 61 6a 6f 72 4d 69  sion [getMajorMi
178c0 6e 6f 72 56 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  norVersion \..  
178d0 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67            $::eag
178e0 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d  le_platform(fram
178f0 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 5d 0d 0a  eworkVersion)]..
17900 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17910 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
17920 20 63 72 65 61 74 65 20 61 20 76 65 72 73 69 6f   create a versio
17930 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 75 73 65  n string for use
17940 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
17950 6e 74 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  nt name..       
17960 20 23 20 20 20 20 20 20 20 28 72 65 6d 6f 76 65   #       (remove
17970 20 74 68 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a   the periods)...
17980 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17990 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b     set version [
179a0 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69 6f  getDotlessVersio
179b0 6e 20 24 64 6f 74 56 65 72 73 69 6f 6e 5d 0d 0a  n $dotVersion]..
179c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
179d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
179e0 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 20 76 65  the framework ve
179f0 72 73 69 6f 6e 20 77 61 73 20 66 6f 75 6e 64 2c  rsion was found,
17a00 20 61 64 64 20 61 20 74 65 73 74 20 63 6f 6e 73   add a test cons
17a10 74 72 61 69 6e 74 0d 0a 20 20 20 20 20 20 20 20  traint..        
17a20 23 20 20 20 20 20 20 20 66 6f 72 20 69 74 20 6e  #       for it n
17a30 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
17a40 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
17a50 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
17a60 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
17a70 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
17a80 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
17a90 64 41 72 67 73 20 66 72 61 6d 65 77 6f 72 6b 20  dArgs framework 
17aa0 24 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20  $version]..     
17ab0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17ac0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17ad0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17ae0 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67            $::eag
17af0 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d  le_platform(fram
17b00 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 20 22 20  eworkVersion) " 
17b10 28 22 20 24 64 6f 74 56 65 72 73 69 6f 6e 20 22  (" $dotVersion "
17b20 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
17b30 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
17b40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
17b50 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
17b60 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
17b70 63 68 65 63 6b 46 6f 72 4d 61 74 63 68 69 6e 67  checkForMatching
17b80 46 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  FrameworkVersion
17b90 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
17ba0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
17bb0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
17bc0 69 6e 67 20 66 6f 72 20 6d 61 74 63 68 69 6e 67  ing for matching
17bd0 20 66 72 61 6d 65 77 6f 72 6b 20 76 65 72 73 69   framework versi
17be0 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  on... "....     
17bf0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17c00 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f  s ::eagle_platfo
17c10 72 6d 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  rm(frameworkVers
17c20 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ion)] && \..    
17c30 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
17c40 6e 67 74 68 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  ngth $::eagle_pl
17c50 61 74 66 6f 72 6d 28 66 72 61 6d 65 77 6f 72 6b  atform(framework
17c60 56 65 72 73 69 6f 6e 29 5d 20 3e 20 30 7d 20 74  Version)] > 0} t
17c70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
17c80 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
17c90 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
17ca0 28 69 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72  (imageRuntimeVer
17cb0 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20  sion)] && \..   
17cc0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
17cd0 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c 65   length $::eagle
17ce0 5f 70 6c 61 74 66 6f 72 6d 28 69 6d 61 67 65 52  _platform(imageR
17cf0 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 5d 20  untimeVersion)] 
17d00 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
17d10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17d20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 65 74 20      # NOTE: Get 
17d30 74 68 65 20 6d 61 6a 6f 72 20 61 6e 64 20 6d 69  the major and mi
17d40 6e 6f 72 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20  nor portions of 
17d50 74 68 65 20 76 65 72 73 69 6f 6e 73 20 6f 6e 6c  the versions onl
17d60 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
17d70 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
17d80 6f 74 56 65 72 73 69 6f 6e 28 31 29 20 5b 67 65  otVersion(1) [ge
17d90 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56 65 72 73 69  tMajorMinorVersi
17da0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
17db0 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61      $::eagle_pla
17dc0 74 66 6f 72 6d 28 66 72 61 6d 65 77 6f 72 6b 56  tform(frameworkV
17dd0 65 72 73 69 6f 6e 29 5d 0d 0a 0d 0a 20 20 20 20  ersion)]....    
17de0 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72        set dotVer
17df0 73 69 6f 6e 28 32 29 20 5b 67 65 74 4d 61 6a 6f  sion(2) [getMajo
17e00 72 4d 69 6e 6f 72 56 65 72 73 69 6f 6e 20 5c 0d  rMinorVersion \.
17e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
17e20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
17e30 28 69 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72  (imageRuntimeVer
17e40 73 69 6f 6e 29 5d 0d 0a 0d 0a 20 20 20 20 20 20  sion)]....      
17e50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17e60 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20   # NOTE: Remove 
17e70 73 69 6e 67 6c 65 20 6c 65 61 64 69 6e 67 20 22  single leading "
17e80 76 22 20 63 68 61 72 61 63 74 65 72 73 2c 20 69  v" characters, i
17e90 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0d 0a 20  f applicable... 
17ea0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17eb0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
17ec0 67 20 69 6e 64 65 78 20 24 64 6f 74 56 65 72 73  g index $dotVers
17ed0 69 6f 6e 28 31 29 20 30 5d 20 65 71 20 22 76 22  ion(1) 0] eq "v"
17ee0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17ef0 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72        set dotVer
17f00 73 69 6f 6e 28 31 29 20 5b 73 74 72 69 6e 67 20  sion(1) [string 
17f10 72 61 6e 67 65 20 24 64 6f 74 56 65 72 73 69 6f  range $dotVersio
17f20 6e 28 31 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20  n(1) 1 end]..   
17f30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17f40 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
17f50 67 20 69 6e 64 65 78 20 24 64 6f 74 56 65 72 73  g index $dotVers
17f60 69 6f 6e 28 32 29 20 30 5d 20 65 71 20 22 76 22  ion(2) 0] eq "v"
17f70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17f80 20 20 20 20 20 20 73 65 74 20 64 6f 74 56 65 72        set dotVer
17f90 73 69 6f 6e 28 32 29 20 5b 73 74 72 69 6e 67 20  sion(2) [string 
17fa0 72 61 6e 67 65 20 24 64 6f 74 56 65 72 73 69 6f  range $dotVersio
17fb0 6e 28 32 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20  n(2) 1 end]..   
17fc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17fd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17fe0 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63     # NOTE: Now c
17ff0 72 65 61 74 65 20 61 20 76 65 72 73 69 6f 6e 20  reate a version 
18000 73 74 72 69 6e 67 20 66 6f 72 20 75 73 65 20 69  string for use i
18010 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
18020 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
18030 20 20 20 20 6e 61 6d 65 20 28 72 65 6d 6f 76 65      name (remove
18040 20 74 68 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a   the periods)...
18050 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18060 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
18070 6f 6e 28 31 29 20 5b 73 74 72 69 6e 67 20 6d 61  on(1) [string ma
18080 70 20 5b 6c 69 73 74 20 2e 20 22 22 5d 20 24 64  p [list . ""] $d
18090 6f 74 56 65 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d  otVersion(1)]...
180a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
180b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
180c0 43 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 61  Check for an exa
180d0 63 74 20 6d 61 74 63 68 20 62 65 74 77 65 65 6e  ct match between
180e0 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69   the image runti
180f0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  me..          # 
18100 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 61 6e        version an
18110 64 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 20  d the framework 
18120 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  version...      
18130 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18140 20 69 66 20 7b 24 64 6f 74 56 65 72 73 69 6f 6e   if {$dotVersion
18150 28 31 29 20 65 71 20 24 64 6f 74 56 65 72 73 69  (1) eq $dotVersi
18160 6f 6e 28 32 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  on(2)} then {.. 
18170 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18180 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
18190 3a 20 59 65 73 2c 20 74 68 65 20 69 6d 61 67 65  : Yes, the image
181a0 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
181b0 20 6d 61 74 63 68 65 73 20 74 68 65 20 66 72 61   matches the fra
181c0 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 20  mework...       
181d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
181e0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
181f0 74 20 6d 61 74 63 68 46 72 61 6d 65 77 6f 72 6b  t matchFramework
18200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
18210 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
18220 65 6e 64 41 72 67 73 20 6d 61 74 63 68 46 72 61  endArgs matchFra
18230 6d 65 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28  mework $version(
18240 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  1)]....         
18250 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
18260 20 64 6f 74 4e 65 74 4d 61 74 63 68 46 72 61 6d   dotNetMatchFram
18270 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20 20 20  ework..         
18280 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
18290 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 6f 74   [appendArgs dot
182a0 4e 65 74 4d 61 74 63 68 46 72 61 6d 65 77 6f 72  NetMatchFramewor
182b0 6b 20 24 76 65 72 73 69 6f 6e 28 31 29 5d 0d 0a  k $version(1)]..
182c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
182d0 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d 6f 6e 6f  dConstraint mono
182e0 4d 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a  MatchFramework..
182f0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
18300 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
18310 64 41 72 67 73 20 6d 6f 6e 6f 4d 61 74 63 68 46  dArgs monoMatchF
18320 72 61 6d 65 77 6f 72 6b 20 24 76 65 72 73 69 6f  ramework $versio
18330 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  n(1)]....       
18340 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
18350 6e 74 20 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74  nt dotNetCoreMat
18360 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20  chFramework..   
18370 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
18380 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
18390 67 73 20 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74  gs dotNetCoreMat
183a0 63 68 46 72 61 6d 65 77 6f 72 6b 20 24 76 65 72  chFramework $ver
183b0 73 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20 20  sion(1)]....    
183c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
183d0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
183e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
183f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
18400 20 7b 5b 69 73 54 65 73 74 44 6f 74 4e 65 74 43   {[isTestDotNetC
18410 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ore]} then {..  
18420 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
18430 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
18440 4d 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a  MatchFramework..
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
18460 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
18470 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74 4d 61  endArgs dotNetMa
18480 74 63 68 46 72 61 6d 65 77 6f 72 6b 20 24 76 65  tchFramework $ve
18490 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20  rsion(1)]....   
184a0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
184b0 6e 73 74 72 61 69 6e 74 20 6d 6f 6e 6f 4d 61 74  nstraint monoMat
184c0 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20  chFramework..   
184d0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
184e0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
184f0 41 72 67 73 20 6d 6f 6e 6f 4d 61 74 63 68 46 72  Args monoMatchFr
18500 61 6d 65 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e  amework $version
18510 28 31 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  (1)]..          
18520 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 54    } elseif {[isT
18530 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b  estMono]} then {
18540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18550 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
18560 74 4e 65 74 4d 61 74 63 68 46 72 61 6d 65 77 6f  tNetMatchFramewo
18570 72 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rk..            
18580 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18590 5b 61 70 70 65 6e 64 41 72 67 73 20 64 6f 74 4e  [appendArgs dotN
185a0 65 74 4d 61 74 63 68 46 72 61 6d 65 77 6f 72 6b  etMatchFramework
185b0 20 24 76 65 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d   $version(1)]...
185c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
185d0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
185e0 4e 65 74 43 6f 72 65 4d 61 74 63 68 46 72 61 6d  NetCoreMatchFram
185f0 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20 20 20  ework..         
18600 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
18610 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64  nt [appendArgs d
18620 6f 74 4e 65 74 43 6f 72 65 4d 61 74 63 68 46 72  otNetCoreMatchFr
18630 61 6d 65 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e  amework $version
18640 28 31 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  (1)]..          
18650 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18660 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
18670 73 74 72 61 69 6e 74 20 6d 6f 6e 6f 4d 61 74 63  straint monoMatc
18680 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20  hFramework..    
18690 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
186a0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
186b0 72 67 73 20 6d 6f 6e 6f 4d 61 74 63 68 46 72 61  rgs monoMatchFra
186c0 6d 65 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28  mework $version(
186d0 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  1)]....         
186e0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
186f0 6e 74 20 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74  nt dotNetCoreMat
18700 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20  chFramework..   
18710 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
18720 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
18730 41 72 67 73 20 64 6f 74 4e 65 74 43 6f 72 65 4d  Args dotNetCoreM
18740 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 20 24 76  atchFramework $v
18750 65 72 73 69 6f 6e 28 31 29 5d 0d 0a 20 20 20 20  ersion(1)]..    
18760 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18770 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18780 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
18790 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
187a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
187b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
187c0 61 6e 6e 65 6c 20 22 6e 6f 2c 20 6d 69 73 73 69  annel "no, missi
187d0 6e 67 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65  ng image runtime
187e0 20 76 65 72 73 69 6f 6e 5c 6e 22 0d 0a 20 20 20   version\n"..   
187f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
18800 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18810 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
18820 6e 6f 2c 20 6d 69 73 73 69 6e 67 20 66 72 61 6d  no, missing fram
18830 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 5c 6e 22  ework version\n"
18840 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
18850 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
18860 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 56 65 72  eckForRuntimeVer
18870 73 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  sion { channel }
18880 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
18890 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
188a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 75 6e 74  hecking for runt
188b0 69 6d 65 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22  ime version... "
188c0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
188d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67  nfo exists ::eag
188e0 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74  le_platform(runt
188f0 69 6d 65 56 65 72 73 69 6f 6e 29 5d 20 26 26 20  imeVersion)] && 
18900 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
18910 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65  ring length $::e
18920 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75  agle_platform(ru
18930 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 5d 20 3e  ntimeVersion)] >
18940 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
18950 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18960 20 4e 4f 54 45 3a 20 47 65 74 20 74 68 65 20 6d   NOTE: Get the m
18970 61 6a 6f 72 20 61 6e 64 20 6d 69 6e 6f 72 20 70  ajor and minor p
18980 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 76  ortions of the v
18990 65 72 73 69 6f 6e 20 6f 6e 6c 79 2e 0d 0a 20 20  ersion only...  
189a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
189b0 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f 6e 20   set dotVersion 
189c0 5b 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56 65  [getMajorMinorVe
189d0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
189e0 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c       $::eagle_pl
189f0 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65 56 65  atform(runtimeVe
18a00 72 73 69 6f 6e 29 5d 0d 0a 0d 0a 20 20 20 20 20  rsion)]....     
18a10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18a20 4e 4f 54 45 3a 20 4e 6f 77 20 63 72 65 61 74 65  NOTE: Now create
18a30 20 61 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e   a version strin
18a40 67 20 66 6f 72 20 75 73 65 20 69 6e 20 74 68 65  g for use in the
18a50 20 63 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65   constraint name
18a60 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18a70 20 20 28 72 65 6d 6f 76 65 20 74 68 65 20 70 65    (remove the pe
18a80 72 69 6f 64 73 29 2e 0d 0a 20 20 20 20 20 20 20  riods)...       
18a90 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
18aa0 76 65 72 73 69 6f 6e 20 5b 73 74 72 69 6e 67 20  version [string 
18ab0 6d 61 70 20 5b 6c 69 73 74 20 2e 20 22 22 5d 20  map [list . ""] 
18ac0 24 64 6f 74 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a  $dotVersion]....
18ad0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 54          if {[isT
18ae0 65 73 74 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20  estDotNetCore]} 
18af0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18b00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
18b10 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 75   NOTE: If the ru
18b20 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 77 61  ntime version wa
18b30 73 20 66 6f 75 6e 64 2c 20 61 64 64 20 61 20 74  s found, add a t
18b40 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 0d 0a  est constraint..
18b50 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18b60 20 20 66 6f 72 20 69 74 20 6e 6f 77 2e 0d 0a 20    for it now... 
18b70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
18b80 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18b90 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f  g length $versio
18ba0 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  n] > 0} then {..
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18bc0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
18bd0 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e  E: We are runnin
18be0 67 20 6f 6e 20 74 68 65 20 2e 4e 45 54 20 43 6f  g on the .NET Co
18bf0 72 65 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  re.  Keep track 
18c00 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  of the..        
18c10 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63      #       spec
18c20 69 66 69 63 20 76 65 72 73 69 6f 6e 20 66 6f 72  ific version for
18c30 20 75 73 61 67 65 20 69 6e 20 74 65 73 74 20 63   usage in test c
18c40 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
18c50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
18c60 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
18c70 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
18c80 73 20 64 6f 74 4e 65 74 43 6f 72 65 20 24 76 65  s dotNetCore $ve
18c90 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  rsion]..        
18ca0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
18cb0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 6f  t [appendArgs do
18cc0 74 4e 65 74 43 6f 72 65 20 24 76 65 72 73 69 6f  tNetCore $versio
18cd0 6e 20 4f 72 48 69 67 68 65 72 5d 0d 0a 20 20 20  n OrHigher]..   
18ce0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18cf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18d00 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f     # NOTE: We do
18d10 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 73 6b 69   not want to ski
18d20 70 20 61 6e 79 20 4d 6f 6e 6f 20 62 75 67 73 20  p any Mono bugs 
18d30 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2e 20 20 41  on .NET Core.  A
18d40 64 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  dd..          # 
18d50 20 20 20 20 20 20 74 68 65 20 6e 65 63 65 73 73        the necess
18d60 61 72 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ary constraints 
18d70 66 6f 72 20 65 61 63 68 20 76 65 72 73 69 6f 6e  for each version
18d80 20 6f 66 20 4d 6f 6e 6f 20 77 65 0d 0a 20 20 20   of Mono we..   
18d90 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6b         #       k
18da0 6e 6f 77 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20  now about...    
18db0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18dc0 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43     addKnownMonoC
18dd0 6f 6e 73 74 72 61 69 6e 74 73 20 66 61 6c 73 65  onstraints false
18de0 3b 20 23 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e  ; # running on .
18df0 4e 45 54 2e 0d 0a 20 20 20 20 20 20 20 20 7d 20  NET...        } 
18e00 65 6c 73 65 69 66 20 7b 5b 69 73 54 65 73 74 4d  elseif {[isTestM
18e10 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ono]} then {..  
18e20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18e30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
18e40 74 68 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73  the runtime vers
18e50 69 6f 6e 20 77 61 73 20 66 6f 75 6e 64 2c 20 61  ion was found, a
18e60 64 64 20 61 20 74 65 73 74 20 63 6f 6e 73 74 72  dd a test constr
18e70 61 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20  aint..          
18e80 23 20 20 20 20 20 20 20 66 6f 72 20 69 74 20 6e  #       for it n
18e90 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
18ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
18eb0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
18ec0 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  version] > 0} th
18ed0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18ee0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18ef0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
18f00 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d  are running on M
18f10 6f 6e 6f 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ono.  Keep track
18f20 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 63   of the specific
18f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18f40 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20  #       version 
18f50 66 6f 72 20 75 73 61 67 65 20 69 6e 20 74 65 73  for usage in tes
18f60 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a  t constraints...
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
18f90 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
18fa0 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 20 24 76  pendArgs mono $v
18fb0 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ersion]..       
18fc0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
18fd0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
18fe0 20 6d 6f 6e 6f 20 24 76 65 72 73 69 6f 6e 20 4f   mono $version O
18ff0 72 48 69 67 68 65 72 5d 0d 0a 20 20 20 20 20 20  rHigher]..      
19000 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19010 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19020 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
19030 74 6f 20 70 61 72 73 65 20 74 68 65 20 76 65 72  to parse the ver
19040 73 69 6f 6e 20 69 6e 74 6f 20 69 74 73 20 6d 61  sion into its ma
19050 6a 6f 72 20 61 6e 64 20 6d 69 6e 6f 72 0d 0a 20  jor and minor.. 
19060 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
19070 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20   components...  
19080 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19090 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
190a0 20 6c 65 6e 67 74 68 20 24 64 6f 74 56 65 72 73   length $dotVers
190b0 69 6f 6e 5d 20 3e 20 30 20 26 26 20 5b 72 65 67  ion] > 0 && [reg
190c0 65 78 70 20 2d 2d 20 7b 5e 28 5c 64 2b 29 5c 2e  exp -- {^(\d+)\.
190d0 28 5c 64 2b 29 24 7d 20 5c 0d 0a 20 20 20 20 20  (\d+)$} \..     
190e0 20 20 20 20 20 20 20 20 20 24 64 6f 74 56 65 72           $dotVer
190f0 73 69 6f 6e 20 64 75 6d 6d 79 20 6d 61 6a 6f 72  sion dummy major
19100 56 65 72 73 69 6f 6e 20 6d 69 6e 6f 72 56 65 72  Version minorVer
19110 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sion]} then {.. 
19120 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19130 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
19140 3a 20 54 68 69 73 20 69 73 20 74 68 65 20 6c 69  : This is the li
19150 73 74 20 6f 66 20 4d 6f 6e 6f 20 76 65 72 73 69  st of Mono versi
19160 6f 6e 73 20 74 6f 20 61 64 64 20 74 65 73 74 0d  ons to add test.
19170 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
19180 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
19190 20 66 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 20   for...         
191a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
191b0 20 20 73 65 74 20 6d 6f 6e 6f 56 65 72 73 69 6f    set monoVersio
191c0 6e 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  ns [list]....   
191d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
191e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
191f0 43 68 65 63 6b 20 65 61 63 68 20 4d 6f 6e 6f 20  Check each Mono 
19200 76 65 72 73 69 6f 6e 20 22 6b 6e 6f 77 6e 22 20  version "known" 
19210 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
19220 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
19230 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  #..            f
19240 6f 72 65 61 63 68 20 6d 6f 6e 6f 56 65 72 73 69  oreach monoVersi
19250 6f 6e 20 5b 67 65 74 4b 6e 6f 77 6e 4d 6f 6e 6f  on [getKnownMono
19260 56 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  Versions] {..   
19270 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19280 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
19290 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e  TE: Check for an
192a0 79 20 4d 6f 6e 6f 20 6d 61 6a 6f 72 20 76 65 72  y Mono major ver
192b0 73 69 6f 6e 20 58 20 6f 72 20 68 69 67 68 65 72  sion X or higher
192c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
192d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
192e0 20 20 69 66 20 7b 24 6d 61 6a 6f 72 56 65 72 73    if {$majorVers
192f0 69 6f 6e 20 3e 3d 20 5b 6c 69 6e 64 65 78 20 24  ion >= [lindex $
19300 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 30 5d 7d 20  monoVersion 0]} 
19310 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19320 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19330 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
19340 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 79  E: Check for any
19350 20 4d 6f 6e 6f 20 6d 61 6a 6f 72 2f 6d 69 6e 6f   Mono major/mino
19360 72 20 76 65 72 73 69 6f 6e 20 68 69 67 68 65 72  r version higher
19370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19380 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 58    #       than X
19390 2e 59 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .Y...           
193a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
193b0 20 20 20 20 20 20 20 20 69 66 20 7b 24 6d 61 6a          if {$maj
193c0 6f 72 56 65 72 73 69 6f 6e 20 3e 20 5b 6c 69 6e  orVersion > [lin
193d0 64 65 78 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e  dex $monoVersion
193e0 20 30 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20   0] || \..      
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6d                $m
19400 69 6e 6f 72 56 65 72 73 69 6f 6e 20 3e 20 5b 6c  inorVersion > [l
19410 69 6e 64 65 78 20 24 6d 6f 6e 6f 56 65 72 73 69  index $monoVersi
19420 6f 6e 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  on 1]} then {.. 
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19450 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
19460 64 20 74 68 69 73 20 22 6b 6e 6f 77 6e 22 20 76  d this "known" v
19470 65 72 73 69 6f 6e 20 6f 66 20 4d 6f 6e 6f 2e 0d  ersion of Mono..
19480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19490 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
194a0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
194b0 6d 6f 6e 6f 56 65 72 73 69 6f 6e 73 20 24 6d 6f  monoVersions $mo
194c0 6e 6f 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  noVersion..     
194d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
194e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
194f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
19500 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19510 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
19520 45 3a 20 41 64 64 20 74 68 65 20 6e 65 63 65 73  E: Add the neces
19530 73 61 72 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  sary constraints
19540 20 66 6f 72 20 65 61 63 68 20 76 65 72 73 69 6f   for each versio
19550 6e 20 6f 66 20 4d 6f 6e 6f 0d 0a 20 20 20 20 20  n of Mono..     
19560 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
19570 65 20 73 68 6f 75 6c 64 20 4e 4f 54 20 73 6b 69  e should NOT ski
19580 70 20 62 75 67 73 20 66 6f 72 2e 0d 0a 20 20 20  p bugs for...   
19590 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
195a0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
195b0 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 24 6d 6f 6e  monoVersion $mon
195c0 6f 56 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20 20  oVersions {..   
195d0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
195e0 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e  onstraintVersion
195f0 20 5b 6a 6f 69 6e 20 24 6d 6f 6e 6f 56 65 72 73   [join $monoVers
19600 69 6f 6e 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion ""]....     
19610 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
19620 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
19630 67 73 20 6d 6f 6e 6f 20 24 63 6f 6e 73 74 72 61  gs mono $constra
19640 69 6e 74 56 65 72 73 69 6f 6e 20 4f 72 48 69 67  intVersion OrHig
19650 68 65 72 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  her]..          
19660 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
19670 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f  t [appendArgs mo
19680 6e 6f 54 6f 44 6f 20 24 63 6f 6e 73 74 72 61 69  noToDo $constrai
19690 6e 74 56 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20  ntVersion]..    
196a0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
196b0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
196c0 72 67 73 20 6d 6f 6e 6f 42 75 67 20 24 63 6f 6e  rgs monoBug $con
196d0 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 5d 0d  straintVersion].
196e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
196f0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
19700 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 43 72 61  pendArgs monoCra
19710 73 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 56 65  sh $constraintVe
19720 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  rsion]..        
19730 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19750 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
19760 6b 20 61 6c 6c 20 6b 6e 6f 77 6e 20 76 65 72 73  k all known vers
19770 69 6f 6e 73 20 6f 66 20 4d 6f 6e 6f 20 66 6f 72  ions of Mono for
19780 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
19790 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20 20 20  with..          
197a0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63 75    #       the cu
197b0 72 72 65 6e 74 6c 79 20 72 75 6e 6e 69 6e 67 20  rrently running 
197c0 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  one...          
197d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
197e0 20 66 6f 72 65 61 63 68 20 6d 6f 6e 6f 56 65 72   foreach monoVer
197f0 73 69 6f 6e 20 5b 67 65 74 4b 6e 6f 77 6e 4d 6f  sion [getKnownMo
19800 6e 6f 56 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a 20  noVersions] {.. 
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
19830 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 4d  NOTE: Check if M
19840 6f 6e 6f 20 6d 61 6a 6f 72 2f 6d 69 6e 6f 72 20  ono major/minor 
19850 76 65 72 73 69 6f 6e 20 69 73 20 65 78 61 63 74  version is exact
19860 6c 79 20 74 68 65 20 6f 6e 65 0d 0a 20 20 20 20  ly the one..    
19870 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
19880 20 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74    we are current
19890 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 2e 0d 0a  ly processing...
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
198b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
198c0 65 74 20 63 6f 6e 73 74 72 61 69 6e 74 56 65 72  et constraintVer
198d0 73 69 6f 6e 20 5b 6a 6f 69 6e 20 24 6d 6f 6e 6f  sion [join $mono
198e0 56 65 72 73 69 6f 6e 20 22 22 5d 0d 0a 0d 0a 20  Version ""].... 
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
19900 7b 5b 6c 69 6e 64 65 78 20 24 6d 6f 6e 6f 56 65  {[lindex $monoVe
19910 72 73 69 6f 6e 20 30 5d 20 3d 3d 20 24 6d 61 6a  rsion 0] == $maj
19920 6f 72 56 65 72 73 69 6f 6e 20 26 26 20 5c 0d 0a  orVersion && \..
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 5b 6c 69 6e 64 65 78 20 24 6d 6f 6e 6f 56    [lindex $monoV
19950 65 72 73 69 6f 6e 20 31 5d 20 3d 3d 20 24 6d 69  ersion 1] == $mi
19960 6e 6f 72 56 65 72 73 69 6f 6e 7d 20 74 68 65 6e  norVersion} then
19970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19980 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19990 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
199a0 64 64 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  dd test constrai
199b0 6e 74 73 20 74 68 61 74 20 6f 6e 6c 79 20 61 70  nts that only ap
199c0 70 6c 79 20 74 6f 20 74 68 69 73 20 65 78 61 63  ply to this exac
199d0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
199e0 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69     #       versi
199f0 6f 6e 20 6f 66 20 4d 6f 6e 6f 2e 0d 0a 20 20 20  on of Mono...   
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
19a30 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 20 24  ppendArgs mono $
19a40 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f  constraintVersio
19a50 6e 20 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20  n Only]..       
19a60 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19a90 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
19aa0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
19ab0 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 61   that apply to a
19ac0 6c 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 0d 0a  ll versions of..
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 23 20 20 20 20 20 20 20 4d 6f 6e 6f 20 65 78 63  #       Mono exc
19af0 65 70 74 20 74 68 69 73 20 65 78 61 63 74 20 76  ept this exact v
19b00 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ersion...       
19b10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19b20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
19b30 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
19b40 64 41 72 67 73 20 6d 6f 6e 6f 54 6f 44 6f 20 24  dArgs monoToDo $
19b50 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f  constraintVersio
19b60 6e 20 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20  n Only]..       
19b70 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
19b80 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
19b90 67 73 20 6d 6f 6e 6f 42 75 67 20 24 63 6f 6e 73  gs monoBug $cons
19ba0 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e  traintVersion On
19bb0 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ly]..           
19bc0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
19bd0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d  nt [appendArgs m
19be0 6f 6e 6f 43 72 61 73 68 20 24 63 6f 6e 73 74 72  onoCrash $constr
19bf0 61 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79  aintVersion Only
19c00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
19c10 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
19c20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
19c30 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
19c40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
19c50 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19c60 20 49 66 20 74 68 65 20 72 75 6e 74 69 6d 65 20   If the runtime 
19c70 76 65 72 73 69 6f 6e 20 77 61 73 20 66 6f 75 6e  version was foun
19c80 64 2c 20 61 64 64 20 61 20 74 65 73 74 20 63 6f  d, add a test co
19c90 6e 73 74 72 61 69 6e 74 0d 0a 20 20 20 20 20 20  nstraint..      
19ca0 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
19cb0 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  it now...       
19cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19cd0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
19ce0 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3e 20 30  th $version] > 0
19cf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19d00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19d10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
19d20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 74  are running on t
19d30 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  he .NET Framewor
19d40 6b 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  k.  Keep track o
19d50 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  f the..         
19d60 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69     #       speci
19d70 66 69 63 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  fic version for 
19d80 75 73 61 67 65 20 69 6e 20 74 65 73 74 20 63 6f  usage in test co
19d90 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
19da0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19db0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
19dc0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
19dd0 20 64 6f 74 4e 65 74 20 24 76 65 72 73 69 6f 6e   dotNet $version
19de0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ]..            a
19df0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
19e00 70 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74 20  pendArgs dotNet 
19e10 24 76 65 72 73 69 6f 6e 20 4f 72 48 69 67 68 65  $version OrHighe
19e20 72 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  r]..          }.
19e30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
19e40 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
19e50 3a 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  : We do not want
19e60 20 74 6f 20 73 6b 69 70 20 61 6e 79 20 4d 6f 6e   to skip any Mon
19e70 6f 20 62 75 67 73 20 6f 6e 20 2e 4e 45 54 2e 20  o bugs on .NET. 
19e80 20 41 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20   Add the..      
19e90 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
19ea0 73 73 61 72 79 20 63 6f 6e 73 74 72 61 69 6e 74  ssary constraint
19eb0 73 20 66 6f 72 20 65 61 63 68 20 76 65 72 73 69  s for each versi
19ec0 6f 6e 20 6f 66 20 4d 6f 6e 6f 20 77 65 20 6b 6e  on of Mono we kn
19ed0 6f 77 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ow..          # 
19ee0 20 20 20 20 20 20 61 62 6f 75 74 2e 0d 0a 20 20        about...  
19ef0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19f00 20 20 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e       addKnownMon
19f10 6f 43 6f 6e 73 74 72 61 69 6e 74 73 20 66 61 6c  oConstraints fal
19f20 73 65 3b 20 23 20 72 75 6e 6e 69 6e 67 20 6f 6e  se; # running on
19f30 20 2e 4e 45 54 2e 0d 0a 20 20 20 20 20 20 20 20   .NET...        
19f40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
19f50 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
19f60 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19f70 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f         $::eagle_
19f80 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65  platform(runtime
19f90 56 65 72 73 69 6f 6e 29 20 22 20 28 22 20 24 64  Version) " (" $d
19fa0 6f 74 56 65 72 73 69 6f 6e 20 22 29 5c 6e 22 5d  otVersion ")\n"]
19fb0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
19fc0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
19fd0 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
19fe0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
19ff0 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
1a000 46 6f 72 50 72 6f 63 65 73 73 42 69 74 73 20 7b  ForProcessBits {
1a010 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
1a020 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1a030 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
1a040 67 20 66 6f 72 20 70 72 6f 63 65 73 73 20 62 69  g for process bi
1a050 74 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ts... "....     
1a060 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1a070 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
1a080 28 70 72 6f 63 65 73 73 42 69 74 73 29 5d 20 26  (processBits)] &
1a090 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1a0a0 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
1a0b0 72 20 2d 73 74 72 69 63 74 20 24 3a 3a 74 63 6c  r -strict $::tcl
1a0c0 5f 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63 65 73  _platform(proces
1a0d0 73 42 69 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  sBits)]} then {.
1a0e0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
1a0f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1a100 67 73 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  gs $::tcl_platfo
1a110 72 6d 28 70 72 6f 63 65 73 73 42 69 74 73 29 20  rm(processBits) 
1a120 62 69 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  bit]....        
1a130 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a140 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74 63  appendArgs $::tc
1a150 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63 65  l_platform(proce
1a160 73 73 42 69 74 73 29 20 2d 62 69 74 5c 6e 5d 0d  ssBits) -bit\n].
1a170 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1a180 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1a190 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
1a1a0 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
1a1b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1a1c0 68 65 63 6b 46 6f 72 4d 61 63 68 69 6e 65 20 7b  heckForMachine {
1a1d0 20 63 68 61 6e 6e 65 6c 20 62 69 74 73 20 6d 61   channel bits ma
1a1e0 63 68 69 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20  chine } {..     
1a1f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1a200 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
1a210 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6d  - checking for m
1a220 61 63 68 69 6e 65 20 5c 22 22 20 24 62 69 74 73  achine \"" $bits
1a230 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
1a240 62 69 74 20 22 20 24 6d 61 63 68 69 6e 65 20 22  bit " $machine "
1a250 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
1a260 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1a270 45 3a 20 57 68 61 74 20 61 72 65 20 74 68 65 20  E: What are the 
1a280 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
1a290 74 75 72 65 20 61 6e 64 20 74 68 65 0d 0a 20 20  ture and the..  
1a2a0 20 20 20 20 23 20 20 20 20 20 20 20 6e 75 6d 62      #       numb
1a2b0 65 72 20 6f 66 20 62 69 74 73 20 66 6f 72 20 74  er of bits for t
1a2c0 68 69 73 20 6f 70 65 72 61 74 69 6e 67 20 73 79  his operating sy
1a2d0 73 74 65 6d 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  stem?..      #..
1a2e0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1a2f0 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
1a300 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
1a310 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1a320 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1a330 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63  cl_platform(proc
1a340 65 73 73 42 69 74 73 29 5d 7d 20 74 68 65 6e 20  essBits)]} then 
1a350 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1a360 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
1a370 65 73 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61  es the machine a
1a380 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  nd number of bit
1a390 73 20 6d 61 74 63 68 0d 0a 20 20 20 20 20 20 20  s match..       
1a3a0 20 23 20 20 20 20 20 20 20 77 68 61 74 20 74 68   #       what th
1a3b0 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  e caller specifi
1a3c0 65 64 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed?..        #..
1a3d0 20 20 20 20 20 20 20 20 69 66 20 7b 24 3a 3a 74          if {$::t
1a3e0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
1a3f0 69 6e 65 29 20 65 71 20 24 6d 61 63 68 69 6e 65  ine) eq $machine
1a400 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1a410 20 20 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f     $::tcl_platfo
1a420 72 6d 28 70 72 6f 63 65 73 73 42 69 74 73 29 20  rm(processBits) 
1a430 65 71 20 24 62 69 74 73 7d 20 74 68 65 6e 20 7b  eq $bits} then {
1a440 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1a450 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a460 20 59 65 73 2c 20 69 74 20 6d 61 74 63 68 65 73   Yes, it matches
1a470 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1a480 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
1a490 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1a4a0 72 67 73 20 24 6d 61 63 68 69 6e 65 20 2e 20 24  rgs $machine . $
1a4b0 62 69 74 73 20 62 69 74 5d 0d 0a 0d 0a 20 20 20  bits bit]....   
1a4c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a4d0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
1a4e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a4f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a500 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
1a510 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1a520 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1a530 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1a540 22 6e 6f 2c 20 75 6e 6b 6e 6f 77 6e 5c 6e 22 0d  "no, unknown\n".
1a550 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1a560 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
1a570 63 6b 46 6f 72 54 65 73 74 43 61 6c 6c 53 74 61  ckForTestCallSta
1a580 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ck { channel } {
1a590 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
1a5a0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
1a5b0 63 6b 69 6e 67 20 66 6f 72 20 74 65 73 74 20 63  cking for test c
1a5c0 61 6c 6c 20 73 74 61 63 6b 2e 2e 2e 20 22 0d 0a  all stack... "..
1a5d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a5e0 20 23 20 4e 4f 54 45 3a 20 53 65 61 72 63 68 20   # NOTE: Search 
1a5f0 66 6f 72 20 61 20 63 61 6c 6c 20 66 72 61 6d 65  for a call frame
1a600 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64   with associated
1a610 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 20 20 20   arguments...   
1a620 20 20 20 23 20 20 20 20 20 20 20 41 74 20 74 68     #       At th
1a630 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20  is point, there 
1a640 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
1a650 20 6f 6e 65 20 73 75 63 68 20 63 61 6c 6c 0d 0a   one such call..
1a660 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 72        #       fr
1a670 61 6d 65 20 28 74 68 69 73 20 6f 6e 65 29 2e 20  ame (this one). 
1a680 20 54 68 65 72 65 66 6f 72 65 2c 20 74 68 69 73   Therefore, this
1a690 20 6c 6f 6f 70 20 77 69 6c 6c 20 61 6c 77 61 79   loop will alway
1a6a0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
1a6b0 20 74 65 72 6d 69 6e 61 74 65 2e 0d 0a 20 20 20   terminate...   
1a6c0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
1a6d0 69 6e 64 65 78 20 30 3b 20 73 65 74 20 61 72 67  index 0; set arg
1a6e0 75 6d 65 6e 74 73 20 5b 6c 69 73 74 5d 0d 0a 20  uments [list].. 
1a6f0 20 20 20 20 20 73 65 74 20 73 63 72 69 70 74 20       set script 
1a700 7b 69 6e 66 6f 20 6c 65 76 65 6c 20 5b 69 6e 66  {info level [inf
1a710 6f 20 6c 65 76 65 6c 5d 7d 0d 0a 0d 0a 20 20 20  o level]}....   
1a720 20 20 20 77 68 69 6c 65 20 7b 31 7d 20 7b 0d 0a     while {1} {..
1a730 20 20 20 20 20 20 20 20 73 65 74 20 6c 65 76 65          set leve
1a740 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 23 23  l [appendArgs ##
1a750 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20   $index]....    
1a760 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1a770 75 70 6c 65 76 65 6c 20 24 6c 65 76 65 6c 20 24  uplevel $level $
1a780 73 63 72 69 70 74 7d 20 61 72 67 75 6d 65 6e 74  script} argument
1a790 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1a7a0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1a7b0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1a7c0 20 20 20 20 20 20 20 69 6e 63 72 20 69 6e 64 65         incr inde
1a7d0 78 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  x..      }....  
1a7e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1a7f0 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 63 6f  OTE: Grab the co
1a800 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 72 6f 6d 20  mmand name from 
1a810 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 69  the arguments, i
1a820 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d  f any...      #.
1a830 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61  .      set comma
1a840 6e 64 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  nd [expr {..    
1a850 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72      [llength $ar
1a860 67 75 6d 65 6e 74 73 5d 20 3e 20 30 20 3f 20 5b  guments] > 0 ? [
1a870 6c 69 6e 64 65 78 20 24 61 72 67 75 6d 65 6e 74  lindex $argument
1a880 73 20 30 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20  s 0] : ""..     
1a890 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   }]....      #..
1a8a0 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 4d 61        # HACK: Ma
1a8b0 6b 65 20 73 75 72 65 20 74 68 65 20 63 61 6c 6c  ke sure the call
1a8c0 20 73 74 61 63 6b 20 64 6f 65 73 20 6e 6f 74 20   stack does not 
1a8d0 65 6e 64 20 75 70 20 63 6f 6e 66 75 73 69 6e 67  end up confusing
1a8e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1a8f0 74 68 65 20 74 65 73 74 73 20 74 68 61 74 20 72  the tests that r
1a900 65 6c 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  ely on absolute 
1a910 63 61 6c 6c 20 66 72 61 6d 65 73 2e 20 20 54 68  call frames.  Th
1a920 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1a930 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75   [runTestPrologu
1a940 65 5d 20 69 73 20 61 6c 6c 6f 77 65 64 20 68 65  e] is allowed he
1a950 72 65 20 62 65 63 61 75 73 65 20 69 74 20 77 69  re because it wi
1a960 6c 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ll..      #     
1a970 20 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20    not be active 
1a980 6f 6e 20 74 68 65 20 63 61 6c 6c 20 73 74 61 63  on the call stac
1a990 6b 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  k at the point t
1a9a0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
1a9b0 20 20 74 65 73 74 73 20 61 72 65 20 61 63 74 75    tests are actu
1a9c0 61 6c 6c 79 20 72 75 6e 2e 20 20 41 63 74 75 61  ally run.  Actua
1a9d0 6c 6c 79 2c 20 74 68 65 20 73 61 6d 65 20 74 68  lly, the same th
1a9e0 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
1a9f0 20 20 20 67 6f 65 73 20 66 6f 72 20 5b 63 68 65     goes for [che
1aa00 63 6b 46 6f 72 54 65 73 74 43 61 6c 6c 53 74 61  ckForTestCallSta
1aa10 63 6b 5d 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ck] as well...  
1aa20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1aa30 7b 24 63 6f 6d 6d 61 6e 64 20 69 6e 20 5c 0d 0a  {$command in \..
1aa40 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20            [list 
1aa50 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 20  runTestPrologue 
1aa60 63 68 65 63 6b 46 6f 72 54 65 73 74 43 61 6c 6c  checkForTestCall
1aa70 53 74 61 63 6b 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Stack]} then {..
1aa80 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1aa90 72 61 69 6e 74 20 74 65 73 74 43 61 6c 6c 53 74  raint testCallSt
1aaa0 61 63 6b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ack....        t
1aab0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1aac0 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
1aad0 5c 22 22 20 24 63 6f 6d 6d 61 6e 64 20 22 5c 22  \"" $command "\"
1aae0 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
1aaf0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ab00 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
1ab10 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
1ab20 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ab30 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
1ab40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74      }....      t
1ab50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1ab60 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 20 28 5c  ppendArgs "no (\
1ab70 22 22 20 24 63 6f 6d 6d 61 6e 64 20 22 5c 22 29  "" $command "\")
1ab80 5c 6e 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  \n"]..    }.....
1ab90 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
1aba0 72 47 61 72 75 64 61 44 6c 6c 20 7b 20 63 68 61  rGarudaDll { cha
1abb0 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
1abc0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1abd0 20 53 6b 69 70 20 61 75 74 6f 6d 61 74 69 63 20   Skip automatic 
1abe0 54 63 6c 20 73 68 65 6c 6c 20 6d 61 63 68 69 6e  Tcl shell machin
1abf0 65 20 64 65 74 65 63 74 69 6f 6e 20 69 66 20 77  e detection if w
1ac00 65 20 61 72 65 20 6e 6f 74 0d 0a 20 20 20 20 20  e are not..     
1ac10 20 23 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64   #       allowed
1ac20 20 74 6f 20 65 78 65 63 75 74 65 20 65 78 74 65   to execute exte
1ac30 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 73 2e 0d 0a  rnal commands...
1ac40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1ac50 66 20 7b 5b 63 61 6e 45 78 65 63 54 63 6c 53 68  f {[canExecTclSh
1ac60 65 6c 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ell]} then {..  
1ac70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ac80 20 23 20 4e 4f 54 45 3a 20 48 61 76 65 20 74 68   # NOTE: Have th
1ac90 65 20 5b 67 65 74 47 61 72 75 64 61 44 6c 6c 5d  e [getGarudaDll]
1aca0 20 70 72 6f 63 65 64 75 72 65 20 61 75 74 6f 6d   procedure autom
1acb0 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20  atically detect 
1acc0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
1acd0 20 20 20 20 20 6d 61 63 68 69 6e 65 2e 0d 0a 20       machine... 
1ace0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1acf0 20 20 73 65 74 20 6d 61 63 68 69 6e 65 20 22 22    set machine ""
1ad00 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1ad10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ad20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1ad30 20 74 68 65 20 6d 61 63 68 69 6e 65 20 66 6f 72   the machine for
1ad40 20 74 68 69 73 20 74 65 73 74 20 72 75 6e 2e 0d   this test run..
1ad50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1ad60 20 20 20 20 73 65 74 20 6d 61 63 68 69 6e 65 20      set machine 
1ad70 5b 67 65 74 54 65 73 74 4d 61 63 68 69 6e 65 5d  [getTestMachine]
1ad80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1ad90 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1ada0 69 6e 63 65 20 61 6e 20 65 6d 70 74 79 20 73 74  ince an empty st
1adb0 72 69 6e 67 20 6d 65 61 6e 73 20 22 61 75 74 6f  ring means "auto
1adc0 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74  matically detect
1add0 22 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  " to the..      
1ade0 20 20 23 20 20 20 20 20 20 20 5b 67 65 74 47 61    #       [getGa
1adf0 72 75 64 61 44 6c 6c 5d 20 70 72 6f 63 65 64 75  rudaDll] procedu
1ae00 72 65 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  re, we must make
1ae10 20 73 75 72 65 20 74 68 65 20 76 61 6c 75 65 20   sure the value 
1ae20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
1ae30 20 20 20 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c      something el
1ae40 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  se...        #..
1ae50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1ae60 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 61 63 68  ing length $mach
1ae70 69 6e 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ine] == 0} then 
1ae80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
1ae90 20 6d 61 63 68 69 6e 65 20 75 6e 6b 6e 6f 77 6e   machine unknown
1aea0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1aeb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
1aec0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
1aed0 68 65 63 6b 20 66 6f 72 20 74 68 65 20 47 61 72  heck for the Gar
1aee0 75 64 61 20 44 4c 4c 20 6f 66 20 74 68 65 20 73  uda DLL of the s
1aef0 61 6d 65 20 70 6c 61 74 66 6f 72 6d 20 28 69 2e  ame platform (i.
1af00 65 2e 20 6d 61 63 68 69 6e 65 0d 0a 20 20 20 20  e. machine..    
1af10 20 20 23 20 20 20 20 20 20 20 74 79 70 65 29 20    #       type) 
1af20 61 73 20 74 68 65 20 6e 61 74 69 76 65 20 54 63  as the native Tc
1af30 6c 20 73 68 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  l shell...      
1af40 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
1af50 5b 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 63  [checkForFile $c
1af60 68 61 6e 6e 65 6c 20 5b 67 65 74 47 61 72 75 64  hannel [getGarud
1af70 61 44 6c 6c 20 24 6d 61 63 68 69 6e 65 5d 5d 0d  aDll $machine]].
1af80 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1af90 72 6f 63 20 63 68 65 63 6b 46 6f 72 43 75 6c 74  roc checkForCult
1afa0 75 72 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ure { channel } 
1afb0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
1afc0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
1afd0 65 63 6b 69 6e 67 20 66 6f 72 20 63 75 6c 74 75  ecking for cultu
1afe0 72 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  re... "....     
1aff0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b000 3a 20 47 72 61 62 20 74 68 65 20 63 75 72 72 65  : Grab the curre
1b010 6e 74 20 63 75 6c 74 75 72 65 2e 0d 0a 20 20 20  nt culture...   
1b020 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
1b030 63 75 6c 74 75 72 65 20 5b 69 6e 66 6f 20 63 75  culture [info cu
1b040 6c 74 75 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  lture]....      
1b050 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1b060 74 68 20 24 63 75 6c 74 75 72 65 5d 20 3e 20 30  th $culture] > 0
1b070 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b080 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1b090 4f 54 45 3a 20 54 68 65 20 63 75 6c 74 75 72 65  OTE: The culture
1b0a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1b0b0 70 72 65 73 65 6e 74 2c 20 75 73 65 20 69 74 20  present, use it 
1b0c0 61 6e 64 20 73 68 6f 77 20 69 74 2e 0d 0a 20 20  and show it...  
1b0d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b0e0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
1b0f0 61 70 70 65 6e 64 41 72 67 73 20 63 75 6c 74 75  appendArgs cultu
1b100 72 65 2e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  re. [string map 
1b110 5b 6c 69 73 74 20 2d 20 5f 5d 20 24 63 75 6c 74  [list - _] $cult
1b120 75 72 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ure]]....       
1b130 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b140 5b 61 70 70 65 6e 64 41 72 67 73 20 24 63 75 6c  [appendArgs $cul
1b150 74 75 72 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ture \n]..      
1b160 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1b170 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b180 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
1b190 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b1a0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1b1b0 54 68 72 65 61 64 43 75 6c 74 75 72 65 20 7b 20  ThreadCulture { 
1b1c0 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
1b1d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b1e0 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
1b1f0 20 66 6f 72 20 74 68 72 65 61 64 20 63 75 6c 74   for thread cult
1b200 75 72 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ure... "....    
1b210 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b220 45 3a 20 47 72 61 62 20 74 68 65 20 63 75 72 72  E: Grab the curr
1b230 65 6e 74 20 74 68 72 65 61 64 20 63 75 6c 74 75  ent thread cultu
1b240 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
1b250 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1b260 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1b270 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 54   invoke System.T
1b280 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e  hreading.Thread.
1b290 43 75 72 72 65 6e 74 54 68 72 65 61 64 20 43 75  CurrentThread Cu
1b2a0 72 72 65 6e 74 43 75 6c 74 75 72 65 0d 0a 20 20  rrentCulture..  
1b2b0 20 20 20 20 7d 20 63 75 6c 74 75 72 65 5d 20 3d      } culture] =
1b2c0 3d 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  = 0 && [catch {.
1b2d0 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
1b2e0 69 6e 76 6f 6b 65 20 45 61 67 6c 65 2e 5f 43 6f  invoke Eagle._Co
1b2f0 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65  mponents.Private
1b300 2e 46 6f 72 6d 61 74 4f 70 73 20 43 75 6c 74 75  .FormatOps Cultu
1b310 72 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  reName \..      
1b320 20 20 20 20 20 20 24 63 75 6c 74 75 72 65 20 66        $culture f
1b330 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 20 63 75  alse..      } cu
1b340 6c 74 75 72 65 5d 20 3d 3d 20 30 20 26 26 20 5b  lture] == 0 && [
1b350 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63  string length $c
1b360 75 6c 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ulture] > 0} the
1b370 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1b380 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b390 54 68 65 20 63 75 6c 74 75 72 65 20 69 6e 66 6f  The culture info
1b3a0 72 6d 61 74 69 6f 6e 20 69 73 20 70 72 65 73 65  rmation is prese
1b3b0 6e 74 2c 20 75 73 65 20 69 74 20 61 6e 64 20 73  nt, use it and s
1b3c0 68 6f 77 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  how it...       
1b3d0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
1b3e0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1b3f0 64 41 72 67 73 20 74 68 72 65 61 64 43 75 6c 74  dArgs threadCult
1b400 75 72 65 2e 20 5b 73 74 72 69 6e 67 20 6d 61 70  ure. [string map
1b410 20 5b 6c 69 73 74 20 2d 20 5f 5d 20 5c 0d 0a 20   [list - _] \.. 
1b420 20 20 20 20 20 20 20 20 20 20 20 24 63 75 6c 74             $cult
1b430 75 72 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ure]]....       
1b440 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b450 5b 61 70 70 65 6e 64 41 72 67 73 20 24 63 75 6c  [appendArgs $cul
1b460 74 75 72 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ture \n]..      
1b470 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1b480 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b490 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
1b4a0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b4b0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1b4c0 51 75 69 65 74 20 7b 20 63 68 61 6e 6e 65 6c 20  Quiet { channel 
1b4d0 71 75 69 65 74 20 7d 20 7b 0d 0a 20 20 20 20 20  quiet } {..     
1b4e0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1b4f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
1b500 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1b510 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
1b520 71 75 69 65 74 2e 2e 2e 20 22 0d 0a 20 20 20 20  quiet... "..    
1b530 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1b540 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1b550 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1b560 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
1b570 41 63 74 69 76 65 20 51 75 69 65 74 0d 0a 20 20  Active Quiet..  
1b580 20 20 20 20 7d 20 69 73 51 75 69 65 74 5d 20 3d      } isQuiet] =
1b590 3d 20 30 20 26 26 20 24 69 73 51 75 69 65 74 7d  = 0 && $isQuiet}
1b5a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b5b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1b5c0 54 45 3a 20 59 65 73 2c 20 71 75 69 65 74 20 6d  TE: Yes, quiet m
1b5d0 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0d  ode is enabled..
1b5e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b5f0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1b600 74 20 71 75 69 65 74 0d 0a 0d 0a 20 20 20 20 20  t quiet....     
1b610 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1b620 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b630 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b640 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
1b650 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
1b660 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
1b670 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1b680 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1b690 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
1b6a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b6b0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1b6c0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 52 65   proc checkForRe
1b6d0 66 65 72 65 6e 63 65 43 6f 75 6e 74 54 72 61 63  ferenceCountTrac
1b6e0 6b 69 6e 67 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  king { channel }
1b6f0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1b700 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1b710 68 65 63 6b 69 6e 67 20 66 6f 72 20 6f 62 6a 65  hecking for obje
1b720 63 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ct reference cou
1b730 6e 74 20 74 72 61 63 6b 69 6e 67 2e 2e 2e 20 22  nt tracking... "
1b740 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
1b750 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67  nfo exists ::eag
1b760 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6d 70  le_platform(comp
1b770 69 6c 65 4f 70 74 69 6f 6e 73 29 5d 20 26 26 20  ileOptions)] && 
1b780 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 28 5b 6c  \..          ([l
1b790 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
1b7a0 6f 63 61 73 65 20 24 3a 3a 65 61 67 6c 65 5f 70  ocase $::eagle_p
1b7b0 6c 61 74 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f  latform(compileO
1b7c0 70 74 69 6f 6e 73 29 20 5c 0d 0a 20 20 20 20 20  ptions) \..     
1b7d0 20 20 20 20 20 20 20 20 20 4e 4f 54 49 46 59 5d           NOTIFY]
1b7e0 20 21 3d 20 2d 31 20 7c 7c 20 5c 0d 0a 20 20 20   != -1 || \..   
1b7f0 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68          [lsearch
1b800 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
1b810 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
1b820 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  m(compileOptions
1b830 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) \..           
1b840 20 20 20 4e 4f 54 49 46 59 5f 4f 42 4a 45 43 54     NOTIFY_OBJECT
1b850 5d 20 21 3d 20 2d 31 29 7d 20 74 68 65 6e 20 7b  ] != -1)} then {
1b860 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b870 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
1b880 2c 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6f 62  , support for ob
1b890 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 63  ject reference c
1b8a0 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 69 73  ount tracking is
1b8b0 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
1b8c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
1b8d0 64 43 6f 6e 73 74 72 61 69 6e 74 20 72 65 66 43  dConstraint refC
1b8e0 6f 75 6e 74 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ount....        
1b8f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
1b900 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
1b910 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1b920 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1b930 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
1b940 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1b950 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
1b960 74 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 6f  tion { channel o
1b970 70 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20  ption } {..     
1b980 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b990 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
1b9a0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72  - checking for r
1b9b0 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 5c 22  untime option \"
1b9c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  " \..          $
1b9d0 6f 70 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d  option "\"... "]
1b9e0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
1b9f0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67  nfo exists ::eag
1ba00 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74  le_platform(runt
1ba10 69 6d 65 4f 70 74 69 6f 6e 73 29 5d 20 26 26 20  imeOptions)] && 
1ba20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 73  \..          [ls
1ba30 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
1ba40 63 61 73 65 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  case $::eagle_pl
1ba50 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65 4f 70  atform(runtimeOp
1ba60 74 69 6f 6e 73 29 20 5c 0d 0a 20 20 20 20 20 20  tions) \..      
1ba70 20 20 20 20 20 20 20 20 24 6f 70 74 69 6f 6e 5d          $option]
1ba80 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
1ba90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1baa0 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
1bab0 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
1bac0 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  runtime option i
1bad0 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20  s present...    
1bae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
1baf0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
1bb00 70 65 6e 64 41 72 67 73 20 72 75 6e 74 69 6d 65  pendArgs runtime
1bb10 2e 20 24 6f 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  . $option]....  
1bb20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1bb30 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1bb40 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1bb50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1bb60 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
1bb70 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bb80 70 72 6f 63 20 74 65 73 74 46 6f 72 44 79 6e 61  proc testForDyna
1bb90 6d 69 63 4c 6f 61 64 69 6e 67 20 7b 20 7b 66 69  micLoading { {fi
1bba0 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
1bbb0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1bbc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1bbd0 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b  [isWindows] && [
1bbe0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
1bbf0 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  ileName] == 0} t
1bc00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1bc10 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 6b 65   set fileName ke
1bc20 72 6e 65 6c 33 32 3b 20 23 20 48 41 43 4b 3a 20  rnel32; # HACK: 
1bc30 41 6c 77 61 79 73 20 70 72 65 2d 6c 6f 61 64 65  Always pre-loade
1bc40 64 3f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  d?..        }...
1bc50 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72 72  .        set err
1bc60 6f 72 20 6e 75 6c 6c 0d 0a 0d 0a 20 20 20 20 20  or null....     
1bc70 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1bc80 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1bc90 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1bca0 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
1bcb0 6e 74 73 2e 50 72 69 76 61 74 65 2e 4e 61 74 69  nts.Private.Nati
1bcc0 76 65 4f 70 73 20 54 65 73 74 4c 6f 61 64 4c 69  veOps TestLoadLi
1bcd0 62 72 61 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  brary \..       
1bce0 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 65       $fileName e
1bcf0 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 63 6f  rror..      } co
1bd00 64 65 5d 20 3d 3d 20 30 20 26 26 20 24 63 6f 64  de] == 0 && $cod
1bd10 65 20 65 71 20 22 4f 6b 22 7d 20 74 68 65 6e 20  e eq "Ok"} then 
1bd20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
1bd30 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
1bd40 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1bd50 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
1bd60 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
1bd70 6f 72 44 79 6e 61 6d 69 63 4c 6f 61 64 69 6e 67  orDynamicLoading
1bd80 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
1bd90 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1bda0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
1bdb0 69 6e 67 20 66 6f 72 20 64 79 6e 61 6d 69 63 20  ing for dynamic 
1bdc0 6c 6f 61 64 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a  loading... "....
1bdd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1bde0 20 4e 4f 54 45 3a 20 41 73 20 66 61 72 20 61 73   NOTE: As far as
1bdf0 20 77 65 20 6b 6e 6f 77 2c 20 64 79 6e 61 6d 69   we know, dynami
1be00 63 20 6c 6f 61 64 69 6e 67 20 61 6c 77 61 79 73  c loading always
1be10 20 77 6f 72 6b 73 20 6f 6e 20 57 69 6e 64 6f 77   works on Window
1be20 73 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  s...      #     
1be30 20 20 4f 6e 20 73 6f 6d 65 20 55 6e 69 78 20 73    On some Unix s
1be40 79 73 74 65 6d 73 2c 20 64 6c 6f 70 65 6e 20 64  ystems, dlopen d
1be50 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 28 65 2e  oes not work (e.
1be60 67 2e 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20  g. because..    
1be70 20 20 23 20 20 20 20 20 20 20 4d 6f 6e 6f 20 69    #       Mono i
1be80 73 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  s statically lin
1be90 6b 65 64 2c 20 65 74 63 29 2e 0d 0a 20 20 20 20  ked, etc)...    
1bea0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1beb0 69 73 57 69 6e 64 6f 77 73 5d 20 7c 7c 20 5b 74  isWindows] || [t
1bec0 65 73 74 46 6f 72 44 79 6e 61 6d 69 63 4c 6f 61  estForDynamicLoa
1bed0 64 69 6e 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ding]} then {.. 
1bee0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bef0 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
1bf00 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
1bf10 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
1bf20 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1bf30 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1bf40 74 20 64 79 6e 61 6d 69 63 0d 0a 0d 0a 20 20 20  t dynamic....   
1bf50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1bf60 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
1bf70 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1bf80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1bf90 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
1bfa0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1bfb0 72 6f 63 20 63 68 65 63 6b 46 6f 72 57 69 6e 64  roc checkForWind
1bfc0 6f 77 73 46 6f 72 6d 73 20 7b 20 63 68 61 6e 6e  owsForms { chann
1bfd0 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
1bfe0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1bff0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
1c000 57 69 6e 64 6f 77 73 20 46 6f 72 6d 73 2e 2e 2e  Windows Forms...
1c010 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
1c020 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65       # HACK: Whe
1c030 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e  n running on Win
1c040 64 6f 77 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  dows, we do not 
1c050 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20 6f  need to do any o
1c060 74 68 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  ther..      #   
1c070 20 20 20 20 73 70 65 63 69 61 6c 20 63 68 65 63      special chec
1c080 6b 73 20 68 65 72 65 3b 20 68 6f 77 65 76 65 72  ks here; however
1c090 2c 20 6f 6e 20 55 6e 69 78 20 28 61 6e 64 20 4d  , on Unix (and M
1c0a0 61 63 20 4f 53 20 58 3f 29 2c 0d 0a 20 20 20 20  ac OS X?),..    
1c0b0 20 20 23 20 20 20 20 20 20 20 77 65 20 73 68 6f    #       we sho
1c0c0 75 6c 64 20 63 68 65 63 6b 20 66 6f 72 20 74 68  uld check for th
1c0d0 65 20 44 49 53 50 4c 41 59 20 65 6e 76 69 72 6f  e DISPLAY enviro
1c0e0 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 61  nment variable a
1c0f0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
1c100 20 73 6f 6d 65 20 62 61 73 69 63 20 69 6e 64 69   some basic indi
1c110 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  cation that the 
1c120 58 20 73 65 72 76 65 72 20 69 73 20 61 76 61 69  X server is avai
1c130 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 20  lable...      # 
1c140 20 20 20 20 20 20 54 68 69 73 20 61 70 70 65 61        This appea
1c150 72 73 20 74 6f 20 62 65 20 76 65 72 79 20 6e 65  rs to be very ne
1c160 63 65 73 73 61 72 79 20 6f 6e 20 4d 6f 6e 6f 20  cessary on Mono 
1c170 62 65 63 61 75 73 65 20 69 74 0d 0a 20 20 20 20  because it..    
1c180 20 20 23 20 20 20 20 20 20 20 63 72 61 73 68 65    #       crashe
1c190 73 20 61 66 74 65 72 20 72 65 70 65 61 74 65 64  s after repeated
1c1a0 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1c1b0 20 74 6f 20 63 72 65 61 74 65 20 61 0d 0a 20 20   to create a..  
1c1c0 20 20 20 20 23 20 20 20 20 20 20 20 57 69 6e 64      #       Wind
1c1d0 6f 77 73 20 46 6f 72 6d 20 77 68 65 6e 20 74 68  ows Form when th
1c1e0 65 20 58 20 73 65 72 76 65 72 20 69 73 20 75 6e  e X server is un
1c1f0 61 76 61 69 6c 61 62 6c 65 20 28 65 2e 67 2e 20  available (e.g. 
1c200 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
1c210 20 20 4f 70 65 6e 42 53 44 29 2e 0d 0a 20 20 20    OpenBSD)...   
1c220 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1c230 5b 69 73 57 69 6e 64 6f 77 73 5d 20 7c 7c 20 5b  [isWindows] || [
1c240 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
1c250 76 28 44 49 53 50 4c 41 59 29 5d 7d 20 74 68 65  v(DISPLAY)]} the
1c260 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1c270 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c280 49 73 20 74 68 65 20 57 69 6e 64 6f 77 73 20 46  Is the Windows F
1c290 6f 72 6d 73 20 61 73 73 65 6d 62 6c 79 20 61 76  orms assembly av
1c2a0 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
1c2b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1c2c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1c2d0 20 20 20 20 20 6f 62 6a 65 63 74 20 72 65 73 6f       object reso
1c2e0 6c 76 65 20 53 79 73 74 65 6d 2e 57 69 6e 64 6f  lve System.Windo
1c2f0 77 73 2e 46 6f 72 6d 73 0d 0a 20 20 20 20 20 20  ws.Forms..      
1c300 20 20 7d 20 61 73 73 65 6d 62 6c 79 5d 20 3d 3d    } assembly] ==
1c310 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1c320 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c330 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
1c340 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
1c350 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
1c360 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1c370 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1c380 74 72 61 69 6e 74 20 77 69 6e 46 6f 72 6d 73 0d  traint winForms.
1c390 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
1c3a0 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
1c3b0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n....          #
1c3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1c3d0 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
1c3e0 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
1c3f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1c400 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c410 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1c420 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
1c430 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1c440 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
1c450 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 57 6f   proc checkForWo
1c460 57 36 34 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  W64 { channel } 
1c470 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
1c480 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
1c490 65 63 6b 69 6e 67 20 66 6f 72 20 57 6f 57 36 34  ecking for WoW64
1c4a0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
1c4b0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1c4c0 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
1c4d0 28 77 6f 77 36 34 29 5d 20 26 26 20 5c 0d 0a 20  (wow64)] && \.. 
1c4e0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1c4f0 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72   is boolean -str
1c500 69 63 74 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61  ict $::eagle_pla
1c510 74 66 6f 72 6d 28 77 6f 77 36 34 29 5d 20 26 26  tform(wow64)] &&
1c520 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a   \..          $:
1c530 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
1c540 77 6f 77 36 34 29 7d 20 74 68 65 6e 20 7b 0d 0a  wow64)} then {..
1c550 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c560 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
1c570 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69  we are running i
1c580 6e 20 61 20 57 6f 57 36 34 20 70 72 6f 63 65 73  n a WoW64 proces
1c590 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1c5a0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1c5b0 61 69 6e 74 20 77 6f 77 36 34 0d 0a 0d 0a 20 20  aint wow64....  
1c5c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1c5d0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1c5e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1c5f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c600 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
1c610 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1c620 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 74 61  proc checkForSta
1c630 54 68 72 65 61 64 20 7b 20 63 68 61 6e 6e 65 6c  Thread { channel
1c640 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
1c650 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1c660 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 54   checking for ST
1c670 41 20 74 68 72 65 61 64 2e 2e 2e 20 22 0d 0a 0d  A thread... "...
1c680 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
1c690 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
1c6a0 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
1c6b0 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
1c6c0 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64  ad.CurrentThread
1c6d0 20 47 65 74 41 70 61 72 74 6d 65 6e 74 53 74 61   GetApartmentSta
1c6e0 74 65 0d 0a 20 20 20 20 20 20 7d 20 61 70 61 72  te..      } apar
1c6f0 74 6d 65 6e 74 53 74 61 74 65 5d 20 3d 3d 20 30  tmentState] == 0
1c700 20 26 26 20 24 61 70 61 72 74 6d 65 6e 74 53 74   && $apartmentSt
1c710 61 74 65 20 65 71 20 22 53 54 41 22 7d 20 74 68  ate eq "STA"} th
1c720 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1c730 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1c740 20 59 65 73 2c 20 77 65 20 61 72 65 20 72 75 6e   Yes, we are run
1c750 6e 69 6e 67 20 69 6e 20 61 6e 20 53 54 41 20 74  ning in an STA t
1c760 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  hread...        
1c770 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
1c780 6e 73 74 72 61 69 6e 74 20 73 74 61 54 68 72 65  nstraint staThre
1c790 61 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ad....        tp
1c7a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1c7b0 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
1c7c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1c7d0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
1c7e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1c7f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
1c800 63 6b 46 6f 72 57 69 6e 64 6f 77 73 50 72 65 73  ckForWindowsPres
1c810 65 6e 74 61 74 69 6f 6e 46 6f 75 6e 64 61 74 69  entationFoundati
1c820 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  on { channel } {
1c830 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
1c840 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
1c850 63 6b 69 6e 67 20 66 6f 72 20 57 69 6e 64 6f 77  cking for Window
1c860 73 20 50 72 65 73 65 6e 74 61 74 69 6f 6e 20 46  s Presentation F
1c870 6f 75 6e 64 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a  oundation... "..
1c880 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c890 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
1c8a0 57 69 6e 64 6f 77 73 20 50 72 65 73 65 6e 74 61  Windows Presenta
1c8b0 74 69 6f 6e 20 46 6f 75 6e 64 61 74 69 6f 6e 20  tion Foundation 
1c8c0 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
1c8d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1c8e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1c8f0 20 6f 62 6a 65 63 74 20 72 65 73 6f 6c 76 65 20   object resolve 
1c900 50 72 65 73 65 6e 74 61 74 69 6f 6e 46 72 61 6d  PresentationFram
1c910 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 7d 20 61  ework..      } a
1c920 73 73 65 6d 62 6c 79 5d 20 3d 3d 20 30 7d 20 74  ssembly] == 0} t
1c930 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1c940 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1c950 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
1c960 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61  s that it is ava
1c970 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
1c980 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
1c990 6f 6e 73 74 72 61 69 6e 74 20 77 70 66 0d 0a 0d  onstraint wpf...
1c9a0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1c9b0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
1c9c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c9d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c9e0 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
1c9f0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1ca00 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1ca10 44 61 74 61 62 61 73 65 20 7b 20 63 68 61 6e 6e  Database { chann
1ca20 65 6c 20 74 79 70 65 20 73 74 72 69 6e 67 20 7d  el type string }
1ca30 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1ca40 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1ca50 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 61 74 61  hecking for data
1ca60 62 61 73 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  base... "....   
1ca70 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41     #..      # HA
1ca80 43 4b 3a 20 44 69 73 61 62 6c 65 20 64 61 74 61  CK: Disable data
1ca90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 76 69 74  base connectivit
1caa0 79 20 74 65 73 74 69 6e 67 20 6f 6e 20 4d 6f 6e  y testing on Mon
1cab0 6f 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20  o because..     
1cac0 20 23 20 20 20 20 20 20 20 69 74 20 66 61 69 6c   #       it fail
1cad0 73 20 74 6f 20 74 69 6d 65 6f 75 74 20 28 75 6e  s to timeout (un
1cae0 6c 65 73 73 20 73 70 65 63 69 61 6c 20 74 65 73  less special tes
1caf0 74 20 73 75 69 74 65 20 68 61 63 6b 73 0d 0a 20  t suite hacks.. 
1cb00 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1cb10 20 4d 6f 6e 6f 20 68 61 76 65 20 62 65 65 6e 20   Mono have been 
1cb20 64 69 73 61 62 6c 65 64 20 62 79 20 74 68 65 20  disabled by the 
1cb30 75 73 65 72 29 2e 0d 0a 20 20 20 20 20 20 23 0d  user)...      #.
1cb40 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 73 54  .      if {![isT
1cb50 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b  estMono]} then {
1cb60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1cb70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6e       # NOTE: Can
1cb80 20 77 65 20 61 63 63 65 73 73 20 74 68 65 20 6c   we access the l
1cb90 6f 63 61 6c 20 64 61 74 61 62 61 73 65 3f 0d 0a  ocal database?..
1cba0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cbb0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73     if {[catch {s
1cbc0 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 24 74  ql open -type $t
1cbd0 79 70 65 20 24 73 74 72 69 6e 67 7d 20 63 6f 6e  ype $string} con
1cbe0 6e 65 63 74 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  nection] == 0} t
1cbf0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1cc00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1cc10 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70  NOTE: Yes, it ap
1cc20 70 65 61 72 73 20 74 68 61 74 20 77 65 20 63 61  pears that we ca
1cc30 6e 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  n connect to the
1cc40 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e   local database.
1cc50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1cc60 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1cc70 74 72 61 69 6e 74 20 64 61 74 61 62 61 73 65 0d  traint database.
1cc80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1cc90 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1cca0 3a 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 74 68  : Also record th
1ccb0 65 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  e test database 
1ccc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 79 70 65 20  connection type 
1ccd0 75 73 65 64 20 61 73 20 61 0d 0a 20 20 20 20 20  used as a..     
1cce0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1ccf0 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
1cd00 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1cd10 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1cd20 67 20 6c 65 6e 67 74 68 20 24 74 79 70 65 5d 20  g length $type] 
1cd30 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1cd40 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1cd50 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1cd60 67 73 20 64 61 74 61 62 61 73 65 2e 20 5b 73 74  gs database. [st
1cd70 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 24 74 79  ring tolower $ty
1cd80 70 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  pe]]..          
1cd90 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
1cda0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1cdb0 54 45 3a 20 43 6c 65 61 6e 75 70 20 74 68 65 20  TE: Cleanup the 
1cdc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1cdd0 69 6f 6e 20 77 65 20 6a 75 73 74 20 6f 70 65 6e  ion we just open
1cde0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
1cdf0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
1ce00 63 6c 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f  close $connectio
1ce10 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n....          t
1ce20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1ce30 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  s\n..        } e
1ce40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1ce50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1ce60 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  no\n..        }.
1ce70 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1ce80 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ce90 63 68 61 6e 6e 65 6c 20 64 69 73 61 62 6c 65 64  channel disabled
1cea0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
1ceb0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1cec0 63 68 65 63 6b 46 6f 72 4c 69 62 72 61 72 79 41  checkForLibraryA
1ced0 73 73 65 6d 62 6c 79 4e 61 6d 65 20 7b 20 63 68  ssemblyName { ch
1cee0 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
1cef0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1cf00 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1cf10 6f 72 20 6c 69 62 72 61 72 79 20 61 73 73 65 6d  or library assem
1cf20 62 6c 79 20 6e 61 6d 65 2e 2e 2e 20 22 0d 0a 0d  bly name... "...
1cf30 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1cf40 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20  # NOTE: What is 
1cf50 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1cf60 63 6f 72 65 20 6c 69 62 72 61 72 79 20 61 73 73  core library ass
1cf70 65 6d 62 6c 79 3f 20 20 4e 6f 72 6d 61 6c 6c 79  embly?  Normally
1cf80 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
1cf90 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 22 45   this will be "E
1cfa0 61 67 6c 65 22 3b 20 68 6f 77 65 76 65 72 2c 20  agle"; however, 
1cfb0 69 74 20 63 6f 75 6c 64 20 62 65 20 73 6f 6d 65  it could be some
1cfc0 74 68 69 6e 67 20 65 6c 73 65 2e 0d 0a 20 20 20  thing else...   
1cfd0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1cfe0 5b 63 61 74 63 68 20 7b 67 65 74 54 65 73 74 41  [catch {getTestA
1cff0 73 73 65 6d 62 6c 79 4e 61 6d 65 7d 20 61 73 73  ssemblyName} ass
1d000 65 6d 62 6c 79 4e 61 6d 65 5d 20 3d 3d 20 30 7d  emblyName] == 0}
1d010 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d020 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
1d030 61 70 70 65 6e 64 41 72 67 73 20 6c 69 62 72 61  appendArgs libra
1d040 72 79 41 73 73 65 6d 62 6c 79 4e 61 6d 65 2e 20  ryAssemblyName. 
1d050 24 61 73 73 65 6d 62 6c 79 4e 61 6d 65 5d 0d 0a  $assemblyName]..
1d060 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1d070 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d080 41 72 67 73 20 22 79 65 73 20 28 22 20 24 61 73  Args "yes (" $as
1d090 73 65 6d 62 6c 79 4e 61 6d 65 20 22 29 5c 6e 22  semblyName ")\n"
1d0a0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
1d0b0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1d0c0 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
1d0d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1d0e0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1d0f0 6b 46 6f 72 41 73 73 65 6d 62 6c 79 20 7b 20 63  kForAssembly { c
1d100 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
1d110 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
1d120 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d130 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
1d140 20 66 6f 72 20 61 73 73 65 6d 62 6c 79 20 5c 22   for assembly \"
1d150 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
1d160 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
1d170 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1d180 20 23 20 4e 4f 54 45 3a 20 43 61 6e 20 74 68 65   # NOTE: Can the
1d190 20 61 73 73 65 6d 62 6c 79 20 62 65 20 6c 6f 61   assembly be loa
1d1a0 64 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ded?..      #.. 
1d1b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1d1c0 7b 6f 62 6a 65 63 74 20 72 65 73 6f 6c 76 65 20  {object resolve 
1d1d0 24 6e 61 6d 65 7d 20 61 73 73 65 6d 62 6c 79 5d  $name} assembly]
1d1e0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1d1f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d200 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
1d210 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
1d220 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
1d230 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1d240 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1d250 74 20 24 6e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  t $name....     
1d260 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d270 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
1d280 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d290 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d2a0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
1d2b0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1d2c0 63 20 63 68 65 63 6b 46 6f 72 4f 62 6a 65 63 74  c checkForObject
1d2d0 4d 65 6d 62 65 72 20 7b 20 63 68 61 6e 6e 65 6c  Member { channel
1d2e0 20 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 20 7b   object member {
1d2f0 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20 7d  constraint ""} }
1d300 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
1d310 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d320 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
1d330 69 6e 67 20 66 6f 72 20 6f 62 6a 65 63 74 20 6d  ing for object m
1d340 65 6d 62 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  ember \"" \..   
1d350 20 20 20 20 20 20 20 24 6f 62 6a 65 63 74 20 2e         $object .
1d360 20 24 6d 65 6d 62 65 72 20 22 5c 22 2e 2e 2e 20   $member "\"... 
1d370 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
1d380 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1d390 20 20 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73    object members
1d3a0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1d3b0 69 63 20 2d 70 61 74 74 65 72 6e 20 24 6d 65 6d  ic -pattern $mem
1d3c0 62 65 72 20 24 6f 62 6a 65 63 74 0d 0a 20 20 20  ber $object..   
1d3d0 20 20 20 7d 20 6d 65 6d 62 65 72 73 5d 20 3d 3d     } members] ==
1d3e0 20 30 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24   0 && [llength $
1d3f0 6d 65 6d 62 65 72 73 5d 20 3e 20 30 7d 20 74 68  members] > 0} th
1d400 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1d410 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1d420 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
1d430 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69   that it is avai
1d440 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
1d450 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
1d460 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63  string length $c
1d470 6f 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20  onstraint] > 0} 
1d480 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d490 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1d4a0 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 65 6d 62  [appendArgs memb
1d4b0 65 72 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d  er_ $constraint]
1d4c0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1d4d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
1d4e0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1d4f0 65 6e 64 41 72 67 73 20 24 6f 62 6a 65 63 74 2e  endArgs $object.
1d500 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d   [string trim $m
1d510 65 6d 62 65 72 20 2a 3f 5d 5d 0d 0a 20 20 20 20  ember *?]]..    
1d520 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d530 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d540 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  yes\n..      } e
1d550 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1d560 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
1d570 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
1d580 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1d590 63 68 65 63 6b 46 6f 72 45 78 63 65 6c 55 73 61  checkForExcelUsa
1d5a0 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ble { channel } 
1d5b0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
1d5c0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
1d5d0 65 63 6b 69 6e 67 20 66 6f 72 20 75 73 61 62 6c  ecking for usabl
1d5e0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 45 78  e instance of Ex
1d5f0 63 65 6c 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  cel... "....    
1d600 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1d610 45 3a 20 41 73 20 6f 66 20 74 68 69 73 20 77 72  E: As of this wr
1d620 69 74 69 6e 67 2c 20 74 68 69 73 20 63 68 65 63  iting, this chec
1d630 6b 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  k is only suppor
1d640 74 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 0d  ted on Windows..
1d650 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1d660 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d  if {[isWindows]}
1d670 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d680 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1d690 54 45 3a 20 54 68 69 73 20 63 6f 6e 73 74 72 61  TE: This constra
1d6a0 69 6e 74 20 63 68 65 63 6b 20 6d 75 73 74 20 72  int check must r
1d6b0 75 6e 20 61 66 74 65 72 20 74 68 65 20 69 6e 74  un after the int
1d6c0 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 6f  erop assembly fo
1d6d0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
1d6e0 20 20 20 45 78 63 65 6c 20 68 61 73 20 62 65 65     Excel has bee
1d6f0 6e 20 64 65 74 65 63 74 65 64 2c 20 62 65 63 61  n detected, beca
1d700 75 73 65 20 74 68 69 73 20 63 68 65 63 6b 20 6d  use this check m
1d710 61 6b 65 73 20 75 73 65 20 6f 66 20 69 74 2e 0d  akes use of it..
1d720 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1d730 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e      if {[haveCon
1d740 73 74 72 61 69 6e 74 20 4d 69 63 72 6f 73 6f 66  straint Microsof
1d750 74 2e 4f 66 66 69 63 65 2e 49 6e 74 65 72 6f 70  t.Office.Interop
1d760 2e 45 78 63 65 6c 5d 7d 20 74 68 65 6e 20 7b 0d  .Excel]} then {.
1d770 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d780 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d790 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1d7a0 63 68 65 63 6b 20 72 65 71 75 69 72 65 73 20 74  check requires t
1d7b0 68 65 20 28 6f 70 74 69 6f 6e 61 6c 29 20 69 6e  he (optional) in
1d7c0 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20  terpreter..     
1d7d0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f       #       iso
1d7e0 6c 61 74 69 6f 6e 20 66 65 61 74 75 72 65 20 6f  lation feature o
1d7f0 66 20 45 61 67 6c 65 20 69 6e 20 6f 72 64 65 72  f Eagle in order
1d800 20 74 6f 20 6b 65 65 70 20 74 68 65 20 70 72 69   to keep the pri
1d810 6d 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  mary..          
1d820 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65  #       interpre
1d830 74 65 72 20 61 6e 64 20 41 70 70 44 6f 6d 61 69  ter and AppDomai
1d840 6e 20 74 69 64 79 2e 20 20 49 74 20 61 6c 73 6f  n tidy.  It also
1d850 20 72 65 71 75 69 72 65 73 20 61 63 63 65 73 73   requires access
1d860 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1d870 20 20 20 20 74 6f 20 6e 61 74 69 76 65 20 57 69      to native Wi
1d880 6e 64 6f 77 73 20 73 75 70 70 6f 72 74 20 69 6e  ndows support in
1d890 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20 74 68   order to use th
1d8a0 65 20 5b 69 6e 66 6f 20 68 77 6e 64 5d 0d 0a 20  e [info hwnd].. 
1d8b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1d8c0 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 2e 0d 0a 20   sub-command... 
1d8d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1d8e0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
1d8f0 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70 69 6c  onstraint compil
1d900 65 2e 49 53 4f 4c 41 54 45 44 5f 49 4e 54 45 52  e.ISOLATED_INTER
1d910 50 52 45 54 45 52 53 5d 20 26 26 20 5c 0d 0a 20  PRETERS] && \.. 
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61               [ha
1d930 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d  veConstraint com
1d940 70 69 6c 65 2e 4e 41 54 49 56 45 5d 20 26 26 20  pile.NATIVE] && 
1d950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d960 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
1d970 20 63 6f 6d 70 69 6c 65 2e 57 49 4e 44 4f 57 53   compile.WINDOWS
1d980 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1d990 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20         try {..  
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1d9b0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1d9c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1d9e0 4f 54 45 3a 20 49 6e 20 61 6e 20 61 74 74 65 6d  OTE: In an attem
1d9f0 70 74 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  pt to limit the 
1da00 61 73 73 65 6d 62 6c 69 65 73 20 6c 6f 61 64 65  assemblies loade
1da10 64 20 69 6e 74 6f 20 74 68 65 0d 0a 20 20 20 20  d into the..    
1da20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1da30 20 20 20 20 70 72 69 6d 61 72 79 20 41 70 70 44      primary AppD
1da40 6f 6d 61 69 6e 2c 20 63 72 65 61 74 65 20 61 6e  omain, create an
1da50 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
1da60 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
1da70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1da80 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
1da90 6e 74 65 72 70 20 5b 69 6e 74 65 72 70 20 63 72  nterp [interp cr
1daa0 65 61 74 65 20 2d 69 73 6f 6c 61 74 65 64 5d 0d  eate -isolated].
1dab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1dac0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1dad0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 69        # NOTE: Gi
1dae0 76 65 20 74 68 65 20 6e 65 77 6c 79 20 63 72 65  ve the newly cre
1daf0 61 74 65 64 20 28 69 73 6f 6c 61 74 65 64 29 20  ated (isolated) 
1db00 69 6e 74 65 72 70 72 65 74 65 72 20 61 20 6d 65  interpreter a me
1db10 61 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ans..           
1db20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
1db30 73 65 74 20 76 61 72 69 61 62 6c 65 73 20 69 6e  set variables in
1db40 20 74 68 65 20 70 61 72 65 6e 74 20 28 74 68 69   the parent (thi
1db50 73 29 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  s) interpreter..
1db60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1db80 20 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73      interp alias
1db90 20 24 69 6e 74 65 72 70 20 70 73 65 74 20 7b 7d   $interp pset {}
1dba0 20 73 65 74 3b 20 23 20 70 61 72 65 6e 74 20 73   set; # parent s
1dbb0 65 74 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  et....          
1dbc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1dbd0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1dbe0 20 45 76 61 6c 75 61 74 65 20 61 6c 6c 20 74 68   Evaluate all th
1dbf0 65 20 45 78 63 65 6c 20 69 6e 74 65 72 6f 70 20  e Excel interop 
1dc00 61 73 73 65 6d 62 6c 79 20 72 65 6c 61 74 65 64  assembly related
1dc10 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20   code..         
1dc20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
1dc30 6e 20 74 68 65 20 6f 74 68 65 72 20 41 70 70 44  n the other AppD
1dc40 6f 6d 61 69 6e 2e 0d 0a 20 20 20 20 20 20 20 20  omain...        
1dc50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1dc60 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72             inter
1dc70 70 20 65 76 61 6c 20 24 69 6e 74 65 72 70 20 7b  p eval $interp {
1dc80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1dc90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1dca0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1dcb0 20 46 69 72 73 74 2c 20 61 74 74 65 6d 70 74 20   First, attempt 
1dcc0 74 6f 20 6c 6f 61 64 20 74 68 65 20 45 78 63 65  to load the Exce
1dcd0 6c 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  l interop assemb
1dce0 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ly...           
1dcf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 49         #       I
1dd00 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65  f this fails, we
1dd10 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65   cannot continue
1dd20 20 61 6e 64 20 45 78 63 65 6c 20 69 73 20 6e 6f   and Excel is no
1dd30 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
1dd40 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
1dd50 73 69 64 65 72 65 64 20 75 73 61 62 6c 65 2e 0d  sidered usable..
1dd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1dd80 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65          set asse
1dd90 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61  mbly [object loa
1dda0 64 20 2d 69 6d 70 6f 72 74 20 2d 64 65 63 6c 61  d -import -decla
1ddb0 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 4d 69 63 72              Micr
1ddd0 6f 73 6f 66 74 2e 4f 66 66 69 63 65 2e 49 6e 74  osoft.Office.Int
1dde0 65 72 6f 70 2e 45 78 63 65 6c 5d 0d 0a 0d 0a 20  erop.Excel].... 
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1de10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
1de20 78 74 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 72  xt, attempt to r
1de30 75 6e 20 74 68 65 20 45 78 63 65 6c 20 61 70 70  un the Excel app
1de40 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 0d 0a  lication using..
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 23 20 20 20 20 20 20 20 69 74 73 20 61 75    #       its au
1de70 74 6f 6d 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  tomation object 
1de80 6d 6f 64 65 6c 2e 20 20 49 66 20 74 68 69 73 20  model.  If this 
1de90 66 61 69 6c 73 2c 20 77 65 0d 0a 20 20 20 20 20  fails, we..     
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1deb0 20 20 20 20 20 63 61 6e 6e 6f 74 20 63 6f 6e 74       cannot cont
1dec0 69 6e 75 65 20 61 6e 64 20 45 78 63 65 6c 20 69  inue and Excel i
1ded0 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1dee0 20 75 73 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20   usable...      
1def0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 73 65 74 20 61 70 70 6c 69 63 61 74 69 6f 6e   set application
1df20 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
1df30 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 4d 69 63 72 6f 73 6f 66 74 2e 4f 66 66 69 63 65  Microsoft.Office
1df60 2e 49 6e 74 65 72 6f 70 2e 45 78 63 65 6c 2e 41  .Interop.Excel.A
1df70 70 70 6c 69 63 61 74 69 6f 6e 43 6c 61 73 73 5d  pplicationClass]
1df80 3b 20 23 20 72 75 6e 0d 0a 0d 0a 20 20 20 20 20  ; # run....     
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
1dfc0 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61  attempt to extra
1dfd0 63 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 49  ct the process I
1dfe0 44 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20 20  D associated..  
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 23 20 20 20 20 20 20 20 77 69 74 68 20 74 68 65  #       with the
1e010 20 45 78 63 65 6c 20 61 70 70 6c 69 63 61 74 69   Excel applicati
1e020 6f 6e 20 77 69 6e 64 6f 77 2e 20 20 54 68 69 73  on window.  This
1e030 20 69 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20   is used to..   
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e050 20 20 20 20 20 20 20 68 65 6c 70 20 6d 61 6b 65         help make
1e060 20 73 75 72 65 20 74 68 65 20 72 75 6e 6e 69 6e   sure the runnin
1e070 67 20 45 78 63 65 6c 20 69 6e 73 74 61 6e 63 65  g Excel instance
1e080 20 69 73 20 63 6c 6f 73 65 64 0d 0a 20 20 20 20   is closed..    
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1e0a0 20 20 20 20 20 20 61 66 74 65 72 20 6f 75 72 20        after our 
1e0b0 74 65 73 74 69 6e 67 20 69 73 20 63 6f 6d 70 6c  testing is compl
1e0c0 65 74 65 2e 20 20 47 65 6e 65 72 61 6c 6c 79 2c  ete.  Generally,
1e0d0 20 74 68 69 73 20 77 69 6c 6c 0d 0a 20 20 20 20   this will..    
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1e0f0 20 20 20 20 20 20 6e 6f 74 20 66 61 69 6c 20 62        not fail b
1e100 65 63 61 75 73 65 20 77 65 20 6b 6e 6f 77 20 74  ecause we know t
1e110 68 65 20 5b 69 6e 66 6f 20 68 77 6e 64 5d 20 73  he [info hwnd] s
1e120 75 62 2d 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20  ub-command..    
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1e140 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
1e150 61 76 61 69 6c 61 62 6c 65 2c 20 64 75 65 20 74  available, due t
1e160 6f 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  o define constan
1e170 74 20 63 68 65 63 6b 73 2e 0d 0a 20 20 20 20 20  t checks...     
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 70 73 65 74 20 70 69 64 20 5b 67 65 74 44    pset pid [getD
1e1b0 69 63 74 69 6f 6e 61 72 79 56 61 6c 75 65 20 5c  ictionaryValue \
1e1c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e1d0 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 68 77          [info hw
1e1e0 6e 64 20 5b 24 61 70 70 6c 69 63 61 74 69 6f 6e  nd [$application
1e1f0 20 48 77 6e 64 5d 5d 20 70 72 6f 63 65 73 73 49   Hwnd]] processI
1e200 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  d]....          
1e210 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1e230 4f 54 45 3a 20 4e 65 78 74 2c 20 61 74 74 65 6d  OTE: Next, attem
1e240 70 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  pt to make sure 
1e250 74 68 61 74 20 74 68 65 20 45 78 63 65 6c 20 69  that the Excel i
1e260 6e 73 74 61 6e 63 65 0d 0a 20 20 20 20 20 20 20  nstance..       
1e270 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1e280 20 20 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c     is not visibl
1e290 65 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 64  e and will not d
1e2a0 69 73 70 6c 61 79 20 61 6c 65 72 74 73 2f 70 72  isplay alerts/pr
1e2b0 6f 6d 70 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  ompts...        
1e2c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1e2d0 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c    If this fails,
1e2e0 20 45 78 63 65 6c 20 69 73 20 6e 6f 74 20 63 6f   Excel is not co
1e2f0 6e 73 69 64 65 72 65 64 20 75 73 61 62 6c 65 2e  nsidered usable.
1e300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e320 20 20 20 20 20 20 20 20 20 24 61 70 70 6c 69 63           $applic
1e330 61 74 69 6f 6e 20 56 69 73 69 62 6c 65 20 66 61  ation Visible fa
1e340 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
1e350 20 20 20 20 20 20 20 24 61 70 70 6c 69 63 61 74         $applicat
1e360 69 6f 6e 20 44 69 73 70 6c 61 79 41 6c 65 72 74  ion DisplayAlert
1e370 73 20 66 61 6c 73 65 0d 0a 0d 0a 20 20 20 20 20  s false....     
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
1e3b0 63 72 65 61 74 65 20 61 20 76 61 6c 75 65 20 6f  create a value o
1e3c0 66 20 61 6e 20 65 6e 75 6d 65 72 61 74 65 64 20  f an enumerated 
1e3d0 74 79 70 65 20 65 78 70 6f 73 65 64 0d 0a 20 20  type exposed..  
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3f0 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20 45  #       by the E
1e400 78 63 65 6c 20 61 75 74 6f 6d 61 74 69 6f 6e 20  xcel automation 
1e410 6f 62 6a 65 63 74 20 6d 6f 64 65 6c 20 73 6f 20  object model so 
1e420 74 68 61 74 20 77 65 20 63 61 6e 0d 0a 20 20 20  that we can..   
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e440 20 20 20 20 20 20 20 61 64 64 20 61 20 6e 65 77         add a new
1e450 20 77 6f 72 6b 62 6f 6f 6b 2e 20 20 47 65 6e 65   workbook.  Gene
1e460 72 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65 73  rally, this does
1e470 20 6e 6f 74 20 66 61 69 6c 2e 0d 0a 20 20 20 20   not fail...    
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1e490 20 20 20 20 20 20 49 66 20 74 68 69 73 20 66 61        If this fa
1e4a0 69 6c 73 2c 20 45 78 63 65 6c 20 69 73 20 6e 6f  ils, Excel is no
1e4b0 74 20 63 6f 6e 73 69 64 65 72 65 64 20 75 73 61  t considered usa
1e4c0 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
1e4d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1e4f0 20 65 6e 75 6d 56 61 6c 75 65 20 5b 6f 62 6a 65   enumValue [obje
1e500 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74  ct invoke -creat
1e510 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1e520 20 20 20 20 20 20 20 20 20 20 20 45 6e 75 6d 20             Enum 
1e530 50 61 72 73 65 20 58 6c 57 42 41 54 65 6d 70 6c  Parse XlWBATempl
1e540 61 74 65 20 78 6c 57 42 41 54 57 6f 72 6b 73 68  ate xlWBATWorksh
1e550 65 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  eet]....        
1e560 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e580 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 61 74 74   NOTE: Next, att
1e590 65 6d 70 74 20 74 6f 20 61 64 64 20 61 20 6e 65  empt to add a ne
1e5a0 77 20 77 6f 72 6b 62 6f 6f 6b 2e 20 20 49 66 20  w workbook.  If 
1e5b0 74 68 69 73 20 66 61 69 6c 73 2c 0d 0a 20 20 20  this fails,..   
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e5d0 20 20 20 20 20 20 20 45 78 63 65 6c 20 69 73 20         Excel is 
1e5e0 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 75  not considered u
1e5f0 73 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  sable...        
1e600 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e620 65 74 20 77 6f 72 6b 62 6f 6f 6b 20 5b 6f 62 6a  et workbook [obj
1e630 65 63 74 20 69 6e 76 6f 6b 65 20 2d 61 6c 69 61  ect invoke -alia
1e640 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1e650 20 20 20 20 20 20 20 20 20 20 20 24 61 70 70 6c             $appl
1e660 69 63 61 74 69 6f 6e 2e 57 6f 72 6b 62 6f 6f 6b  ication.Workbook
1e670 73 20 41 64 64 20 24 65 6e 75 6d 56 61 6c 75 65  s Add $enumValue
1e680 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1e690 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1e6b0 54 45 3a 20 54 68 65 20 74 65 73 74 20 70 61 63  TE: The test pac
1e6c0 6b 61 67 65 20 69 73 20 6e 65 65 64 65 64 20 69  kage is needed i
1e6d0 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1e6e0 75 73 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  use of..        
1e6f0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1e700 20 20 74 68 65 20 5b 67 65 74 54 65 6d 70 6f 72    the [getTempor
1e710 61 72 79 46 69 6c 65 4e 61 6d 65 5d 20 70 72 6f  aryFileName] pro
1e720 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20  cedure...       
1e730 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
1e760 45 61 67 6c 65 2e 54 65 73 74 0d 0a 0d 0a 20 20  Eagle.Test....  
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1e790 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74       # NOTE: Set
1e7a0 75 70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  up a temporary f
1e7b0 69 6c 65 20 6e 61 6d 65 20 74 68 61 74 20 63 61  ile name that ca
1e7c0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 76  n be used to sav
1e7d0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1e7e0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1e7f0 20 45 78 63 65 6c 20 73 70 72 65 61 64 73 68 65   Excel spreadshe
1e800 65 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  et...           
1e810 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e820 20 20 20 20 20 20 20 20 20 20 20 20 70 73 65 74              pset
1e830 20 66 69 6c 65 4e 61 6d 65 20 5b 73 65 74 20 66   fileName [set f
1e840 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
1e850 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67    [appendArgs [g
1e880 65 74 54 65 6d 70 6f 72 61 72 79 46 69 6c 65 4e  etTemporaryFileN
1e890 61 6d 65 5d 20 2e 78 6c 73 5d 5d 5d 0d 0a 0d 0a  ame] .xls]]]....
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1e8c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
1e8d0 65 78 74 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ext, attempt to 
1e8e0 73 61 76 65 20 61 20 6e 65 77 20 77 6f 72 6b 62  save a new workb
1e8f0 6f 6f 6b 2e 20 20 49 66 20 74 68 69 73 20 66 61  ook.  If this fa
1e900 69 6c 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ils,..          
1e910 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1e920 45 78 63 65 6c 20 69 73 20 6e 6f 74 20 63 6f 6e  Excel is not con
1e930 73 69 64 65 72 65 64 20 75 73 61 62 6c 65 2e 0d  sidered usable..
1e940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e950 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e960 20 20 20 20 20 20 20 20 24 77 6f 72 6b 62 6f 6f          $workboo
1e970 6b 20 53 61 76 65 41 73 20 24 66 69 6c 65 4e 61  k SaveAs $fileNa
1e980 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  me....          
1e990 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1e9b0 4f 54 45 3a 20 4e 65 78 74 2c 20 61 74 74 65 6d  OTE: Next, attem
1e9c0 70 74 20 74 6f 20 63 6c 6f 73 65 20 45 78 63 65  pt to close Exce
1e9d0 6c 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  l.  If this fail
1e9e0 73 2c 20 45 78 63 65 6c 0d 0a 20 20 20 20 20 20  s, Excel..      
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1ea00 20 20 20 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69      is not consi
1ea10 64 65 72 65 64 20 75 73 61 62 6c 65 2e 0d 0a 20  dered usable... 
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ea40 20 20 20 20 20 20 24 61 70 70 6c 69 63 61 74 69        $applicati
1ea50 6f 6e 20 51 75 69 74 3b 20 23 20 63 6c 6f 73 65  on Quit; # close
1ea60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1ea70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ea80 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1ea90 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 63 6c 65 61  E: Finally, clea
1eaa0 6e 75 70 20 6f 75 72 20 6c 6f 63 61 6c 20 73 74  nup our local st
1eab0 61 74 65 20 6a 75 73 74 20 74 6f 20 62 65 20 74  ate just to be t
1eac0 69 64 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  idy...          
1ead0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
1eaf0 65 74 20 77 6f 72 6b 62 6f 6f 6b 20 65 6e 75 6d  et workbook enum
1eb00 56 61 6c 75 65 20 61 70 70 6c 69 63 61 74 69 6f  Value applicatio
1eb10 6e 20 61 73 73 65 6d 62 6c 79 3b 20 23 20 64 69  n assembly; # di
1eb20 73 70 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20  spose..         
1eb30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1eb40 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1eb50 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1eb80 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 20 61 70     # NOTE: It ap
1eb90 70 65 61 72 73 20 74 68 65 20 45 78 63 65 6c 20  pears the Excel 
1eba0 69 6e 73 74 61 6e 63 65 20 69 73 20 75 73 61 62  instance is usab
1ebb0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
1ebc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ebd0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1ebe0 72 61 69 6e 74 20 65 78 63 65 6c 2e 75 73 61 62  raint excel.usab
1ebf0 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  le....          
1ec00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ec10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ec20 20 53 68 6f 77 20 74 68 61 74 20 61 20 75 73 61   Show that a usa
1ec30 62 6c 65 20 45 78 63 65 6c 20 69 6e 73 74 61 6e  ble Excel instan
1ec40 63 65 20 77 61 73 20 66 6f 75 6e 64 2e 0d 0a 20  ce was found... 
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ec60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec70 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1ec80 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
1ec90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1ecc0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
1ecd0 69 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  is the list of e
1ece0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 70 61 74  rror message pat
1ecf0 74 65 72 6e 73 20 74 68 61 74 20 6d 61 79 0d 0a  terns that may..
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 23 20 20 20 20 20 20 20 69 6e 64 69 63 61 74 65  #       indicate
1ed20 20 61 20 74 72 69 61 6c 20 76 65 72 73 69 6f 6e   a trial version
1ed30 20 6f 66 20 45 78 63 65 6c 20 69 73 20 62 65 69   of Excel is bei
1ed40 6e 67 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  ng used...      
1ed50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1ed70 20 70 61 74 74 65 72 6e 73 20 5b 6c 69 73 74 20   patterns [list 
1ed80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ed90 20 20 20 20 20 20 20 22 2a 20 30 78 38 30 30 41         "* 0x800A
1eda0 43 34 37 32 2a 22 20 22 2a 20 30 78 38 30 30 41  C472*" "* 0x800A
1edb0 30 33 45 43 2a 22 20 5c 0d 0a 20 20 20 20 20 20  03EC*" \..      
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2a                "*
1edd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 73   application has
1ede0 20 65 78 70 69 72 65 64 2e 2a 22 5d 0d 0a 0d 0a   expired.*"]....
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1ee10 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1ee20 20 65 61 63 68 20 65 72 72 6f 72 20 6d 65 73 73   each error mess
1ee30 61 67 65 20 70 61 74 74 65 72 6e 2e 20 20 55 70  age pattern.  Up
1ee40 6f 6e 20 66 69 6e 64 69 6e 67 20 61 6e 79 0d 0a  on finding any..
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 23 20 20 20 20 20 20 20 6d 61 74 63 68 2c 20 6d  #       match, m
1ee70 61 72 6b 20 45 78 63 65 6c 20 61 73 20 75 6e 75  ark Excel as unu
1ee80 73 61 62 6c 65 20 64 75 65 20 74 6f 20 62 65 69  sable due to bei
1ee90 6e 67 20 61 20 74 72 69 61 6c 0d 0a 20 20 20 20  ng a trial..    
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1eeb0 20 20 20 20 65 64 69 74 69 6f 6e 20 61 6e 64 20      edition and 
1eec0 74 68 65 6e 20 73 74 6f 70 2e 0d 0a 20 20 20 20  then stop...    
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1eef0 6f 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24  oreach pattern $
1ef00 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20  patterns {..    
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1ef20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef30 20 20 20 23 20 54 4f 44 4f 3a 20 46 6f 72 20 6e     # TODO: For n
1ef40 6f 77 2c 20 6a 75 73 74 20 75 73 65 20 5b 73 74  ow, just use [st
1ef50 72 69 6e 67 20 6d 61 74 63 68 5d 20 68 65 72 65  ring match] here
1ef60 3b 20 65 76 65 6e 74 75 61 6c 6c 79 2c 0d 0a 20  ; eventually,.. 
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 23 20 20 20 20 20 20 20 72 65 67 75 6c 61 72   #       regular
1ef90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 61 79   expressions may
1efa0 20 62 65 20 6e 65 65 64 65 64 2e 0d 0a 20 20 20   be needed...   
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1efc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1efd0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1efe0 6d 61 74 63 68 20 24 70 61 74 74 65 72 6e 20 24  match $pattern $
1eff0 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
1f000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f010 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f020 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1f030 54 45 3a 20 49 74 20 61 70 70 65 61 72 73 20 74  TE: It appears t
1f040 68 61 74 20 45 78 63 65 6c 20 69 73 20 61 20 74  hat Excel is a t
1f050 72 69 61 6c 20 65 64 69 74 69 6f 6e 2e 0d 0a 20  rial edition... 
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f080 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
1f090 73 74 72 61 69 6e 74 20 65 78 63 65 6c 2e 74 72  straint excel.tr
1f0a0 69 61 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ial....         
1f0b0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
1f0e0 68 61 74 20 74 68 65 20 45 78 63 65 6c 20 74 72  hat the Excel tr
1f0f0 69 61 6c 20 65 64 69 74 69 6f 6e 20 77 61 73 20  ial edition was 
1f100 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
1f110 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f140 6c 20 22 6e 6f 2c 20 74 72 69 61 6c 5c 6e 22 0d  l "no, trial\n".
1f150 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1f160 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f180 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e  NOTE: We are don
1f190 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e  e here, return n
1f1a0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ow...           
1f1b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20  return..        
1f1e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1f200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f210 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1f220 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 20       # NOTE: It 
1f230 61 70 70 65 61 72 73 20 74 68 65 20 45 78 63 65  appears the Exce
1f240 6c 20 69 6e 73 74 61 6e 63 65 20 69 73 20 6e 6f  l instance is no
1f250 74 20 75 73 61 62 6c 65 2e 0d 0a 20 20 20 20 20  t usable...     
1f260 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
1f280 64 43 6f 6e 73 74 72 61 69 6e 74 20 65 78 63 65  dConstraint exce
1f290 6c 2e 75 6e 75 73 61 62 6c 65 0d 0a 0d 0a 20 20  l.unusable....  
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1f2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f2c0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
1f2d0 61 74 20 61 20 75 6e 75 73 61 62 6c 65 20 45 78  at a unusable Ex
1f2e0 63 65 6c 20 69 6e 73 74 61 6e 63 65 20 77 61 73  cel instance was
1f2f0 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
1f300 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f310 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f320 73 20 24 63 68 61 6e 6e 65 6c 20 22 6e 6f 2c 20  s $channel "no, 
1f330 62 72 6f 6b 65 6e 5c 6e 22 0d 0a 20 20 20 20 20  broken\n"..     
1f340 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f350 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
1f360 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y {..           
1f370 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f380 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
1f390 20 73 75 72 65 20 74 68 65 20 69 73 6f 6c 61 74   sure the isolat
1f3a0 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  ed interpreter i
1f3b0 73 20 64 65 6c 65 74 65 64 20 69 66 20 69 74 20  s deleted if it 
1f3c0 77 61 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  was..           
1f3d0 20 20 20 23 20 20 20 20 20 20 20 61 63 74 75 61     #       actua
1f3e0 6c 6c 79 20 63 72 65 61 74 65 64 2e 0d 0a 20 20  lly created...  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1f410 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 69 6e  {[info exists in
1f420 74 65 72 70 5d 20 26 26 20 5b 69 6e 74 65 72 70  terp] && [interp
1f430 20 65 78 69 73 74 73 20 24 69 6e 74 65 72 70 5d   exists $interp]
1f440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f450 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1f460 7b 69 6e 74 65 72 70 20 64 65 6c 65 74 65 20 24  {interp delete $
1f470 69 6e 74 65 72 70 7d 0d 0a 20 20 20 20 20 20 20  interp}..       
1f480 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f490 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f4a0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1f4b0 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
1f4c0 20 45 78 63 65 6c 20 70 72 6f 63 65 73 73 20 69   Excel process i
1f4d0 73 20 28 66 6f 72 63 69 62 6c 79 29 20 63 6c 6f  s (forcibly) clo
1f4e0 73 65 64 20 69 66 20 69 74 0d 0a 20 20 20 20 20  sed if it..     
1f4f0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1f500 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e   is still runnin
1f510 67 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  g at this point.
1f520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f530 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1f540 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f550 73 20 70 69 64 5d 20 26 26 20 24 70 69 64 20 69  s pid] && $pid i
1f560 6e 20 5b 67 65 74 50 72 6f 63 65 73 73 65 73 20  n [getProcesses 
1f570 65 78 63 65 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a  excel]} then {..
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 63 61 74 63 68 20 7b 6b 69 6c 6c 20 2d 66 6f 72  catch {kill -for
1f5a0 63 65 20 24 70 69 64 7d 0d 0a 20 20 20 20 20 20  ce $pid}..      
1f5b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f5c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1f5e0 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
1f5f0 65 20 74 65 6d 70 6f 72 61 72 79 20 73 70 72 65  e temporary spre
1f600 61 64 73 68 65 65 74 20 66 69 6c 65 20 69 73 20  adsheet file is 
1f610 64 65 6c 65 74 65 64 20 69 66 0d 0a 20 20 20 20  deleted if..    
1f620 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1f630 20 20 69 74 20 77 61 73 20 61 63 74 75 61 6c 6c    it was actuall
1f640 79 20 63 72 65 61 74 65 64 2e 0d 0a 20 20 20 20  y created...    
1f650 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f660 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1f670 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69 6c 65  info exists file
1f680 4e 61 6d 65 5d 20 26 26 20 5b 66 69 6c 65 20 65  Name] && [file e
1f690 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
1f6a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f6b0 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1f6c0 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
1f6d0 6c 65 4e 61 6d 65 7d 0d 0a 20 20 20 20 20 20 20  leName}..       
1f6e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f6f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f700 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1f710 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1f720 63 68 61 6e 6e 65 6c 20 22 75 6e 6b 6e 6f 77 6e  channel "unknown
1f730 2c 20 6d 69 73 73 69 6e 67 20 6f 70 74 69 6f 6e  , missing option
1f740 61 6c 20 66 65 61 74 75 72 65 5c 6e 22 0d 0a 20  al feature\n".. 
1f750 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f760 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1f770 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1f780 68 61 6e 6e 65 6c 20 22 75 6e 6b 6e 6f 77 6e 2c  hannel "unknown,
1f790 20 6e 6f 20 45 78 63 65 6c 20 69 6e 74 65 72 6f   no Excel intero
1f7a0 70 20 61 73 73 65 6d 62 6c 79 5c 6e 22 0d 0a 20  p assembly\n".. 
1f7b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f7c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1f7d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f7e0 20 22 75 6e 6b 6e 6f 77 6e 2c 20 6e 6f 74 20 72   "unknown, not r
1f7f0 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77  unning on Window
1f800 73 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  s\n"..      }.. 
1f810 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1f820 63 20 63 68 65 63 6b 46 6f 72 54 63 6c 49 6e 73  c checkForTclIns
1f830 74 61 6c 6c 73 20 7b 20 63 68 61 6e 6e 65 6c 20  talls { channel 
1f840 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
1f850 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
1f860 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c  checking for Tcl
1f870 20 69 6e 73 74 61 6c 6c 73 2e 2e 2e 20 22 0d 0a   installs... "..
1f880 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1f890 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
1f8a0 6f 72 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 6c  or dynamically l
1f8b0 6f 61 64 61 62 6c 65 20 54 63 6c 20 6c 69 62 72  oadable Tcl libr
1f8c0 61 72 69 65 73 20 28 66 6f 72 20 74 68 69 73 0d  aries (for this.
1f8d0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
1f8e0 72 63 68 69 74 65 63 74 75 72 65 20 6f 6e 6c 79  rchitecture only
1f8f0 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
1f900 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 74     if {[catch {t
1f910 63 6c 20 73 65 6c 65 63 74 20 2d 61 72 63 68 69  cl select -archi
1f920 74 65 63 74 75 72 65 7d 20 74 63 6c 5d 20 3d 3d  tecture} tcl] ==
1f930 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1f940 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f950 20 4e 4f 54 45 3a 20 46 6f 75 6e 64 20 6f 6e 65   NOTE: Found one
1f960 3f 20 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20 74  ?  Ok, attempt t
1f970 6f 20 67 72 61 62 20 74 68 65 20 69 6e 64 65 78  o grab the index
1f980 20 6f 66 20 74 68 65 20 76 65 72 73 69 6f 6e 0d   of the version.
1f990 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f9a0 20 66 69 65 6c 64 20 66 72 6f 6d 20 74 68 65 20   field from the 
1f9b0 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
1f9c0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
1f9d0 64 65 78 20 5b 6c 73 65 61 72 63 68 20 2d 65 78  dex [lsearch -ex
1f9e0 61 63 74 20 24 74 63 6c 20 76 65 72 73 69 6f 6e  act $tcl version
1f9f0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
1fa00 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 7d 20 74  {$index != -1} t
1fa10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1fa20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1fa30 4e 4f 54 45 3a 20 54 68 65 20 76 65 72 79 20 6e  NOTE: The very n
1fa40 65 78 74 20 6c 69 73 74 20 69 6e 64 65 78 20 63  ext list index c
1fa50 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
1fa60 65 20 28 69 2e 65 2e 20 6c 69 6b 65 0d 0a 20 20  e (i.e. like..  
1fa70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1fa80 61 20 54 63 6c 20 38 2e 35 2b 20 64 69 63 74 29  a Tcl 8.5+ dict)
1fa90 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1faa0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 6f            set do
1fab0 74 56 65 72 73 69 6f 6e 20 5b 6c 69 6e 64 65 78  tVersion [lindex
1fac0 20 24 74 63 6c 20 5b 69 6e 63 72 20 69 6e 64 65   $tcl [incr inde
1fad0 78 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  x]]....         
1fae0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1faf0 4e 4f 54 45 3a 20 44 6f 20 77 65 20 6b 6e 6f 77  NOTE: Do we know
1fb00 20 74 68 65 20 76 65 72 73 69 6f 6e 3f 0d 0a 20   the version?.. 
1fb10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1fb20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1fb30 67 20 6c 65 6e 67 74 68 20 24 64 6f 74 56 65 72  g length $dotVer
1fb40 73 69 6f 6e 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  sion] > 0 && \..
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 72                [r
1fb60 65 67 65 78 70 20 2d 2d 20 7b 5e 5c 64 2b 5c 2e  egexp -- {^\d+\.
1fb70 5c 64 2b 24 7d 20 24 64 6f 74 56 65 72 73 69 6f  \d+$} $dotVersio
1fb80 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
1fb90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fba0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
1fbb0 65 73 2c 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  es, some version
1fbc0 20 6f 66 20 54 63 6c 20 69 73 20 61 76 61 69 6c   of Tcl is avail
1fbd0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
1fbe0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1fbf0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1fc00 74 63 6c 4c 69 62 72 61 72 79 0d 0a 0d 0a 20 20  tclLibrary....  
1fc10 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1fc20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fc30 20 49 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   Is the version 
1fc40 38 2e 78 20 6f 72 20 68 69 67 68 65 72 3f 0d 0a  8.x or higher?..
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1fc60 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1fc70 63 68 20 74 63 6c 56 65 72 73 69 6f 6e 20 5b 6c  ch tclVersion [l
1fc80 72 65 76 65 72 73 65 20 5b 67 65 74 4b 6e 6f 77  reverse [getKnow
1fc90 6e 54 63 6c 56 65 72 73 69 6f 6e 73 5d 5d 20 7b  nTclVersions]] {
1fca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fcb0 69 66 20 7b 24 64 6f 74 56 65 72 73 69 6f 6e 20  if {$dotVersion 
1fcc0 3e 3d 20 5b 67 65 74 44 6f 74 74 65 64 56 65 72  >= [getDottedVer
1fcd0 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e  sion $tclVersion
1fce0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fcf0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
1fd00 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1fd10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 4c              tclL
1fd30 69 62 72 61 72 79 20 5b 67 65 74 44 6f 74 6c 65  ibrary [getDotle
1fd40 73 73 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65  ssVersion $tclVe
1fd50 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rsion]]....     
1fd60 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1fd80 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 74  NOTE: For now, t
1fd90 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 6c 79  here can be only
1fda0 20 6f 6e 65 20 54 63 6c 20 6c 69 62 72 61 72 79   one Tcl library
1fdb0 20 6d 61 74 63 68 3b 0d 0a 20 20 20 20 20 20 20   match;..       
1fdc0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1fdd0 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 61   therefore, we a
1fde0 72 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20  re done...      
1fdf0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1fe10 61 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak..            
1fe20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1fe30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1fe40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1fe50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 64 6f   [appendArgs $do
1fe60 74 56 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 0d 0a  tVersion \n]....
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1fe80 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1fe90 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68  E: We are done h
1fea0 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ere, return now.
1feb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1fec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1fed0 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  urn..          }
1fee0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1fef0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
1ff00 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1ff10 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
1ff20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 63   proc checkForTc
1ff30 6c 52 65 61 64 79 20 7b 20 63 68 61 6e 6e 65 6c  lReady { channel
1ff40 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
1ff50 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1ff60 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 63   checking for Tc
1ff70 6c 20 72 65 61 64 69 6e 65 73 73 2e 2e 2e 20 22  l readiness... "
1ff80 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
1ff90 61 74 63 68 20 7b 74 63 6c 20 72 65 61 64 79 7d  atch {tcl ready}
1ffa0 20 72 65 61 64 79 5d 20 3d 3d 20 30 20 26 26 20   ready] == 0 && 
1ffb0 24 72 65 61 64 79 7d 20 74 68 65 6e 20 7b 0d 0a  $ready} then {..
1ffc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ffd0 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
1ffe0 6e 61 74 69 76 65 20 54 63 6c 20 69 73 20 6c 6f  native Tcl is lo
1fff0 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 2e 0d  aded and ready..
20000 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20010 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
20020 74 20 74 63 6c 52 65 61 64 79 0d 0a 0d 0a 20 20  t tclReady....  
20030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20040 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 6e 61   # NOTE: Yes, na
20050 74 69 76 65 20 54 63 6c 20 69 73 20 72 65 61 64  tive Tcl is read
20060 79 20 2d 4f 52 2d 20 61 76 61 69 6c 61 62 6c 65  y -OR- available
20070 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20080 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
20090 69 6e 74 20 74 63 6c 52 65 61 64 79 4f 72 4c 69  int tclReadyOrLi
200a0 62 72 61 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20  brary....       
200b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
200c0 54 45 3a 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20  TE: Ok, attempt 
200d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
200e0 20 6c 6f 61 64 65 64 20 54 63 6c 20 76 65 72 73   loaded Tcl vers
200f0 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ion...        #.
20100 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
20110 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
20120 20 74 63 6c 20 65 76 61 6c 20 5b 74 63 6c 20 6d   tcl eval [tcl m
20130 61 73 74 65 72 5d 20 7b 69 6e 66 6f 20 74 63 6c  aster] {info tcl
20140 76 65 72 73 69 6f 6e 7d 0d 0a 20 20 20 20 20 20  version}..      
20150 20 20 7d 20 64 6f 74 56 65 72 73 69 6f 6e 5d 20    } dotVersion] 
20160 3d 3d 20 30 20 26 26 20 5b 72 65 67 65 78 70 20  == 0 && [regexp 
20170 2d 2d 20 7b 5e 5c 64 2b 5c 2e 5c 64 2b 24 7d 20  -- {^\d+\.\d+$} 
20180 24 64 6f 74 56 65 72 73 69 6f 6e 5d 7d 20 74 68  $dotVersion]} th
20190 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
201a0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
201b0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
201c0 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 52 65             tclRe
201d0 61 64 79 20 5b 67 65 74 44 6f 74 6c 65 73 73 56  ady [getDotlessV
201e0 65 72 73 69 6f 6e 20 24 64 6f 74 56 65 72 73 69  ersion $dotVersi
201f0 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]]....        
20200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
20210 20 4e 4f 54 45 3a 20 54 68 65 20 54 63 6c 20 6c   NOTE: The Tcl l
20220 69 62 72 61 72 79 20 69 73 20 72 65 61 64 79 3b  ibrary is ready;
20230 20 68 6f 77 65 76 65 72 2c 20 77 65 20 6e 65 65   however, we nee
20240 64 20 74 6f 20 61 64 64 20 74 68 65 0d 0a 20 20  d to add the..  
20250 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20260 61 70 70 72 6f 70 72 69 61 74 65 20 74 65 73 74  appropriate test
20270 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 69   constraint to i
20280 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 20 73  ndicate that a s
20290 70 65 63 69 66 69 63 0d 0a 20 20 20 20 20 20 20  pecific..       
202a0 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69     #       versi
202b0 6f 6e 20 6f 66 20 54 63 6c 20 69 73 20 22 65 69  on of Tcl is "ei
202c0 74 68 65 72 20 72 65 61 64 79 20 6f 72 20 61 76  ther ready or av
202d0 61 69 6c 61 62 6c 65 22 2e 0d 0a 20 20 20 20 20  ailable"...     
202e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
202f0 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72    foreach tclVer
20300 73 69 6f 6e 20 5b 6c 72 65 76 65 72 73 65 20 5b  sion [lreverse [
20310 67 65 74 4b 6e 6f 77 6e 54 63 6c 56 65 72 73 69  getKnownTclVersi
20320 6f 6e 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ons]] {..       
20330 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
20340 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73   [getDotlessVers
20350 69 6f 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e 5d  ion $tclVersion]
20360 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20370 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61  if {[haveConstra
20380 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
20390 74 63 6c 4c 69 62 72 61 72 79 20 24 76 65 72 73  tclLibrary $vers
203a0 69 6f 6e 5d 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ion]] && \..    
203b0 20 20 20 20 20 20 20 20 20 20 20 20 24 64 6f 74              $dot
203c0 56 65 72 73 69 6f 6e 20 3e 3d 20 5b 67 65 74 44  Version >= [getD
203d0 6f 74 74 65 64 56 65 72 73 69 6f 6e 20 24 74 63  ottedVersion $tc
203e0 6c 56 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20  lVersion]} then 
203f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20400 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
20410 61 70 70 65 6e 64 41 72 67 73 20 74 63 6c 52 65  appendArgs tclRe
20420 61 64 79 4f 72 4c 69 62 72 61 72 79 20 24 76 65  adyOrLibrary $ve
20430 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  rsion]....      
20440 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20450 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
20460 20 46 6f 72 20 6e 6f 77 2c 20 74 68 65 72 65 20   For now, there 
20470 63 61 6e 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20  can be only one 
20480 54 63 6c 20 6c 69 62 72 61 72 79 20 6d 61 74 63  Tcl library matc
20490 68 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  h;..            
204a0 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
204b0 6f 72 65 2c 20 77 65 20 61 72 65 20 64 6f 6e 65  ore, we are done
204c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
204d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
204e0 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20    break..       
204f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20500 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20510 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
20520 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
20530 20 28 22 20 24 64 6f 74 56 65 72 73 69 6f 6e 20   (" $dotVersion 
20540 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ")\n"]..        
20550 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
20560 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
20570 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 54 63 6c   # NOTE: The Tcl
20580 20 6c 69 62 72 61 72 79 20 69 73 20 72 65 61 64   library is read
20590 79 3b 20 68 6f 77 65 76 65 72 2c 20 77 65 20 68  y; however, we h
205a0 61 76 65 20 6e 6f 20 69 64 65 61 20 77 68 61 74  ave no idea what
205b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
205c0 20 20 20 20 76 65 72 73 69 6f 6e 20 69 74 20 61      version it a
205d0 63 74 75 61 6c 6c 79 20 69 73 3b 20 74 68 65 72  ctually is; ther
205e0 65 66 6f 72 65 2c 20 73 6b 69 70 20 61 64 64 69  efore, skip addi
205f0 6e 67 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  ng the test..   
20600 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
20610 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 69 6e 64  onstraint to ind
20620 69 63 61 74 65 20 74 68 61 74 20 61 20 73 70 65  icate that a spe
20630 63 69 66 69 63 20 76 65 72 73 69 6f 6e 20 6f 66  cific version of
20640 20 54 63 6c 0d 0a 20 20 20 20 20 20 20 20 20 20   Tcl..          
20650 23 20 20 20 20 20 20 20 69 73 20 22 65 69 74 68  #       is "eith
20660 65 72 20 72 65 61 64 79 20 6f 72 20 61 76 61 69  er ready or avai
20670 6c 61 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20 20  lable"...       
20680 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
20690 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
206a0 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  es\n..        }.
206b0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
206c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
206d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
206e0 54 63 6c 20 6c 69 62 72 61 72 79 20 69 73 20 6e  Tcl library is n
206f0 6f 74 20 72 65 61 64 79 3b 20 68 6f 77 65 76 65  ot ready; howeve
20700 72 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  r, we still need
20710 20 74 6f 20 61 64 64 0d 0a 20 20 20 20 20 20 20   to add..       
20720 20 23 20 20 20 20 20 20 20 74 68 65 20 61 70 70   #       the app
20730 72 6f 70 72 69 61 74 65 20 74 65 73 74 20 63 6f  ropriate test co
20740 6e 73 74 72 61 69 6e 74 20 74 6f 20 69 6e 64 69  nstraint to indi
20750 63 61 74 65 20 74 68 61 74 20 61 20 73 70 65 63  cate that a spec
20760 69 66 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20  ific..        # 
20770 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 6f 66        version of
20780 20 54 63 6c 20 69 73 20 22 65 69 74 68 65 72 20   Tcl is "either 
20790 72 65 61 64 79 20 6f 72 20 61 76 61 69 6c 61 62  ready or availab
207a0 6c 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  le"...        #.
207b0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
207c0 20 74 63 6c 56 65 72 73 69 6f 6e 20 5b 6c 72 65   tclVersion [lre
207d0 76 65 72 73 65 20 5b 67 65 74 4b 6e 6f 77 6e 54  verse [getKnownT
207e0 63 6c 56 65 72 73 69 6f 6e 73 5d 5d 20 7b 0d 0a  clVersions]] {..
207f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65            set ve
20800 72 73 69 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73  rsion [getDotles
20810 73 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72  sVersion $tclVer
20820 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sion]....       
20830 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
20840 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
20850 67 73 20 74 63 6c 4c 69 62 72 61 72 79 20 24 76  gs tclLibrary $v
20860 65 72 73 69 6f 6e 5d 5d 7d 20 74 68 65 6e 20 7b  ersion]]} then {
20870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
20880 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
20890 65 6e 64 41 72 67 73 20 74 63 6c 52 65 61 64 79  endArgs tclReady
208a0 4f 72 4c 69 62 72 61 72 79 20 24 76 65 72 73 69  OrLibrary $versi
208b0 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
208c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
208d0 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f    # NOTE: For no
208e0 77 2c 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  w, there can be 
208f0 6f 6e 6c 79 20 6f 6e 65 20 54 63 6c 20 6c 69 62  only one Tcl lib
20900 72 61 72 79 20 6d 61 74 63 68 3b 0d 0a 20 20 20  rary match;..   
20910 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
20920 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 61   therefore, we a
20930 72 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20  re done...      
20940 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20950 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20       break..    
20960 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
20970 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
20980 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
20990 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
209a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
209b0 68 65 63 6b 46 6f 72 54 63 6c 53 65 6c 65 63 74  heckForTclSelect
209c0 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
209d0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
209e0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
209f0 69 6e 67 20 66 6f 72 20 54 63 6c 20 6c 69 62 72  ing for Tcl libr
20a00 61 72 79 20 73 65 6c 65 63 74 69 6f 6e 2e 2e 2e  ary selection...
20a10 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
20a20 5b 63 61 74 63 68 20 7b 74 63 6c 20 73 65 6c 65  [catch {tcl sele
20a30 63 74 20 2d 61 72 63 68 69 74 65 63 74 75 72 65  ct -architecture
20a40 7d 20 73 65 6c 65 63 74 5d 20 3d 3d 20 30 7d 20  } select] == 0} 
20a50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20a60 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
20a70 45 3a 20 59 65 73 2c 20 6e 61 74 69 76 65 20 54  E: Yes, native T
20a80 63 6c 20 69 73 20 22 70 72 6f 62 61 62 6c 79 20  cl is "probably 
20a90 6c 6f 61 64 61 62 6c 65 22 2e 0d 0a 20 20 20 20  loadable"...    
20aa0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
20ab0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c  ddConstraint tcl
20ac0 53 65 6c 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20  Select....      
20ad0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20ae0 4f 54 45 3a 20 4f 6b 2c 20 61 74 74 65 6d 70 74  OTE: Ok, attempt
20af0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
20b00 65 20 73 65 6c 65 63 74 65 64 20 54 63 6c 20 76  e selected Tcl v
20b10 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ersion...       
20b20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
20b30 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
20b40 20 20 20 20 67 65 74 44 69 63 74 69 6f 6e 61 72      getDictionar
20b50 79 56 61 6c 75 65 20 24 73 65 6c 65 63 74 20 76  yValue $select v
20b60 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
20b70 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20  } version] == 0 
20b80 26 26 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e  && [regexp -- {^
20b90 5c 64 2b 5c 2e 5c 64 2b 24 7d 20 24 76 65 72 73  \d+\.\d+$} $vers
20ba0 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ion]} then {..  
20bb0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
20bc0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
20bd0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20be0 20 20 20 74 63 6c 53 65 6c 65 63 74 20 5b 73 74     tclSelect [st
20bf0 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e  ring map [list .
20c00 20 22 22 5d 20 24 76 65 72 73 69 6f 6e 5d 5d 0d   ""] $version]].
20c10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
20c20 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
20c30 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
20c40 24 73 65 6c 65 63 74 20 22 29 5c 6e 22 5d 0d 0a  $select ")\n"]..
20c50 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20c60 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
20c70 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
20c80 20 54 68 65 20 54 63 6c 20 6c 69 62 72 61 72 79   The Tcl library
20c90 20 69 73 20 22 70 72 6f 62 61 62 6c 79 20 6c 6f   is "probably lo
20ca0 61 64 61 62 6c 65 22 3b 20 68 6f 77 65 76 65 72  adable"; however
20cb0 2c 20 77 65 20 68 61 76 65 0d 0a 20 20 20 20 20  , we have..     
20cc0 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 20       #       no 
20cd0 69 64 65 61 20 77 68 61 74 20 76 65 72 73 69 6f  idea what versio
20ce0 6e 20 69 74 20 61 63 74 75 61 6c 6c 79 20 69 73  n it actually is
20cf0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
20d00 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20d10 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
20d20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20d30 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
20d40 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20d50 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
20d60 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
20d70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 63 6c 53  roc checkForTclS
20d80 68 65 6c 6c 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  hell { channel }
20d90 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
20da0 20 20 20 23 20 48 41 43 4b 3a 20 49 66 20 74 68     # HACK: If th
20db0 69 73 20 72 65 74 75 72 6e 73 20 22 65 72 72 6f  is returns "erro
20dc0 72 22 20 74 68 61 74 20 6e 6f 72 6d 61 6c 6c 79  r" that normally
20dd0 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65 72   indicates an er
20de0 72 6f 72 20 77 61 73 0d 0a 20 20 20 20 20 20 23  ror was..      #
20df0 20 20 20 20 20 20 20 63 61 75 67 68 74 20 64 75         caught du
20e00 72 69 6e 67 20 5b 65 78 65 63 5d 20 28 69 2e 65  ring [exec] (i.e
20e10 2e 20 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c  . the native Tcl
20e20 20 73 68 65 6c 6c 20 63 6f 75 6c 64 20 6e 6f 74   shell could not
20e30 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
20e40 20 20 20 65 78 65 63 75 74 65 64 29 2e 0d 0a 20     executed)... 
20e50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
20e60 74 20 70 72 65 66 69 78 20 22 2d 2d 2d 2d 20 63  t prefix "---- c
20e70 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c 20  hecking for Tcl 
20e80 73 68 65 6c 6c 20 76 65 72 73 69 6f 6e 2e 2e 2e  shell version...
20e90 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
20ea0 5b 63 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c  [canExecTclShell
20eb0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
20ec0 20 20 5b 63 61 74 63 68 20 7b 67 65 74 54 63 6c    [catch {getTcl
20ed0 56 65 72 73 69 6f 6e 46 6f 72 54 63 6c 53 68 65  VersionForTclShe
20ee0 6c 6c 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  ll} version] == 
20ef0 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
20f00 20 20 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 65    $version ne "e
20f10 72 72 6f 72 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror"} then {.. 
20f20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20f30 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61    # NOTE: Yes, a
20f40 20 6e 61 74 69 76 65 20 54 63 6c 20 73 68 65 6c   native Tcl shel
20f50 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  l appears to be 
20f60 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
20f70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
20f80 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c  ddConstraint tcl
20f90 53 68 65 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  Shell....       
20fa0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
20fb0 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65  TE: Now, add the
20fc0 20 76 65 72 73 69 6f 6e 20 73 70 65 63 69 66 69   version specifi
20fd0 63 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  c test constrain
20fe0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
20ff0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
21000 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
21010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21020 74 63 6c 53 68 65 6c 6c 20 5b 73 74 72 69 6e 67  tclShell [string
21030 20 6d 61 70 20 5b 6c 69 73 74 20 2e 20 22 22 5d   map [list . ""]
21040 20 24 76 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20   $version]].... 
21050 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
21060 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21070 73 20 24 70 72 65 66 69 78 20 22 79 65 73 20 28  s $prefix "yes (
21080 22 20 24 76 65 72 73 69 6f 6e 20 22 29 5c 6e 22  " $version ")\n"
21090 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
210a0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
210b0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
210c0 64 41 72 67 73 20 24 70 72 65 66 69 78 20 6e 6f  dArgs $prefix no
210d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
210e0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
210f0 20 63 68 65 63 6b 46 6f 72 54 6b 50 61 63 6b 61   checkForTkPacka
21100 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ge { channel } {
21110 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
21120 20 23 20 48 41 43 4b 3a 20 57 65 20 64 6f 20 6e   # HACK: We do n
21130 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
21140 65 20 54 6b 20 76 65 72 73 69 6f 6e 20 72 65 74  e Tk version ret
21150 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 0d  urned from this.
21160 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
21170 72 6f 63 65 64 75 72 65 2c 20 77 65 20 6f 6e 6c  rocedure, we onl
21180 79 20 63 61 72 65 20 69 66 20 69 74 20 72 65 74  y care if it ret
21190 75 72 6e 73 20 22 65 72 72 6f 72 22 20 62 65 63  urns "error" bec
211a0 61 75 73 65 20 74 68 61 74 0d 0a 20 20 20 20 20  ause that..     
211b0 20 23 20 20 20 20 20 20 20 77 6f 75 6c 64 20 69   #       would i
211c0 6e 64 69 63 61 74 65 20 61 6e 20 65 72 72 6f 72  ndicate an error
211d0 20 77 61 73 20 63 61 75 67 68 74 20 64 75 72 69   was caught duri
211e0 6e 67 20 5b 65 78 65 63 5d 20 28 69 2e 65 2e 20  ng [exec] (i.e. 
211f0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
21200 20 20 20 6e 61 74 69 76 65 20 54 63 6c 20 73 68     native Tcl sh
21210 65 6c 6c 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ell could not be
21220 20 65 78 65 63 75 74 65 64 29 2e 0d 0a 20 20 20   executed)...   
21230 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
21240 70 72 65 66 69 78 20 22 2d 2d 2d 2d 20 63 68 65  prefix "---- che
21250 63 6b 69 6e 67 20 66 6f 72 20 54 6b 20 70 61 63  cking for Tk pac
21260 6b 61 67 65 20 76 65 72 73 69 6f 6e 2e 2e 2e 20  kage version... 
21270 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
21280 63 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c 5d  canExecTclShell]
21290 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
212a0 20 5b 63 61 74 63 68 20 7b 67 65 74 54 6b 56 65   [catch {getTkVe
212b0 72 73 69 6f 6e 46 6f 72 54 63 6c 53 68 65 6c 6c  rsionForTclShell
212c0 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20  } version] == 0 
212d0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
212e0 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 65 72 72  $version ne "err
212f0 6f 72 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or"} then {..   
21300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21310 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 20 6e  # NOTE: Yes, a n
21320 61 74 69 76 65 20 54 6b 20 70 61 63 6b 61 67 65  ative Tk package
21330 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61   appears to be a
21340 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
21350 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
21360 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 6b 50 61  dConstraint tkPa
21370 63 6b 61 67 65 0d 0a 0d 0a 20 20 20 20 20 20 20  ckage....       
21380 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
21390 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72 65  [appendArgs $pre
213a0 66 69 78 20 22 79 65 73 20 28 22 20 24 76 65 72  fix "yes (" $ver
213b0 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  sion ")\n"]..   
213c0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
213d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
213e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
213f0 24 70 72 65 66 69 78 20 6e 6f 5c 6e 5d 0d 0a 20  $prefix no\n].. 
21400 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
21410 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
21420 46 6f 72 50 6f 77 65 72 53 68 65 6c 6c 20 7b 20  ForPowerShell { 
21430 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
21440 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21450 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
21460 20 66 6f 72 20 50 6f 77 65 72 53 68 65 6c 6c 2e   for PowerShell.
21470 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .. "....      #.
21480 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
21490 61 6e 20 74 68 65 20 50 6f 77 65 72 53 68 65 6c  an the PowerShel
214a0 6c 20 61 73 73 65 6d 62 6c 79 20 62 65 20 6c 6f  l assembly be lo
214b0 61 64 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  aded?..      #..
214c0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
214d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
214e0 63 74 20 72 65 73 6f 6c 76 65 20 53 79 73 74 65  ct resolve Syste
214f0 6d 2e 4d 61 6e 61 67 65 6d 65 6e 74 2e 41 75 74  m.Management.Aut
21500 6f 6d 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  omation..      }
21510 20 61 73 73 65 6d 62 6c 79 5d 20 3d 3d 20 30 7d   assembly] == 0}
21520 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21530 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
21540 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65  TE: Yes, it appe
21550 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61  ars that it is a
21560 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
21570 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
21580 64 43 6f 6e 73 74 72 61 69 6e 74 20 70 6f 77 65  dConstraint powe
21590 72 53 68 65 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20  rShell....      
215a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
215b0 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
215c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
215d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
215e0 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
215f0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
21600 20 63 68 65 63 6b 46 6f 72 57 69 78 20 7b 20 63   checkForWix { c
21610 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
21620 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21630 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
21640 66 6f 72 20 57 69 58 2e 2e 2e 20 22 0d 0a 0d 0a  for WiX... "....
21650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
21660 20 4e 4f 54 45 3a 20 50 6c 61 74 66 6f 72 6d 20   NOTE: Platform 
21670 6d 75 73 74 20 62 65 20 57 69 6e 64 6f 77 73 20  must be Windows 
21680 66 6f 72 20 74 68 69 73 20 63 6f 6e 73 74 72 61  for this constra
21690 69 6e 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  int to..      # 
216a0 20 20 20 20 20 20 65 76 65 6e 20 62 65 20 63 68        even be ch
216b0 65 63 6b 65 64 20 28 69 2e 65 2e 20 77 65 20 72  ecked (i.e. we r
216c0 65 71 75 69 72 65 20 74 68 65 20 72 65 67 69 73  equire the regis
216d0 74 72 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  try)...      #..
216e0 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
216f0 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
21700 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21710 20 20 23 20 4e 4f 54 45 3a 20 49 6e 64 69 63 61    # NOTE: Indica
21720 74 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20  te that we have 
21730 6e 6f 74 20 66 6f 75 6e 64 20 69 74 20 79 65 74  not found it yet
21740 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21750 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
21760 6f 72 79 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20  ory ""....      
21770 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
21780 4f 54 45 3a 20 48 61 76 65 20 77 65 20 6e 6f 74  OTE: Have we not
21790 20 66 6f 75 6e 64 20 74 68 65 20 64 69 72 65 63   found the direc
217a0 74 6f 72 79 20 79 65 74 3f 0d 0a 20 20 20 20 20  tory yet?..     
217b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
217c0 20 20 20 20 20 20 59 65 73 2c 20 74 68 69 73 20        Yes, this 
217d0 69 73 20 73 6f 6d 65 77 68 61 74 20 72 65 64 75  is somewhat redu
217e0 6e 64 61 6e 74 20 62 65 63 61 75 73 65 20 77 65  ndant because we
217f0 20 6a 75 73 74 20 73 65 74 0d 0a 20 20 20 20 20   just set..     
21800 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
21810 69 72 65 63 74 6f 72 79 20 74 6f 20 61 6e 20 65  irectory to an e
21820 6d 70 74 79 20 73 74 72 69 6e 67 20 28 61 62 6f  mpty string (abo
21830 76 65 29 3b 20 68 6f 77 65 76 65 72 2c 0d 0a 20  ve); however,.. 
21840 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
21850 61 69 6e 74 61 69 6e 69 6e 67 20 61 20 75 6e 69  aintaining a uni
21860 66 6f 72 6d 20 70 61 74 74 65 72 6e 20 69 73 20  form pattern is 
21870 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 2e 0d  more important..
21880 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21890 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
218a0 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72  length $director
218b0 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
218c0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
218d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
218e0 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 57 49  Check for the WI
218f0 58 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  X environment va
21900 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  riable...       
21910 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21920 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
21930 20 3a 3a 65 6e 76 28 57 49 58 29 5d 7d 20 74 68   ::env(WIX)]} th
21940 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21950 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20    set directory 
21960 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
21970 5b 73 74 72 69 6e 67 20 74 72 69 6d 72 69 67 68  [string trimrigh
21980 74 20 24 3a 3a 65 6e 76 28 57 49 58 29 5d 5d 0d  t $::env(WIX)]].
21990 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
219a0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
219b0 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  h $directory] > 
219c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
219d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
219e0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
219f0 3a 20 57 65 20 6e 65 65 64 20 74 68 65 20 64 69  : We need the di
21a00 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
21a10 6e 67 20 74 68 65 20 62 69 6e 61 72 69 65 73 2e  ng the binaries.
21a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21a30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
21a40 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
21a50 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
21a60 74 6f 72 79 20 62 69 6e 5d 0d 0a 0d 0a 20 20 20  tory bin]....   
21a70 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
21a80 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
21a90 54 45 3a 20 44 6f 65 73 20 74 68 65 20 64 69 72  TE: Does the dir
21aa0 65 63 74 6f 72 79 20 61 63 74 75 61 6c 6c 79 20  ectory actually 
21ab0 65 78 69 73 74 3f 0d 0a 20 20 20 20 20 20 20 20  exist?..        
21ac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21ad0 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
21ae0 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69   isdirectory $di
21af0 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
21b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21b10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
21b20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
21b30 20 66 69 6c 65 20 6e 61 6d 65 20 6f 66 20 74 68   file name of th
21b40 65 20 70 72 69 6d 61 72 79 20 57 69 58 20 61 73  e primary WiX as
21b50 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
21b60 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
21b70 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
21b80 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
21b90 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 77  oin $directory w
21ba0 69 78 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ix.dll]....     
21bb0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21bd0 4e 4f 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20  NOTE: We do not 
21be0 6b 6e 6f 77 20 74 68 65 20 66 69 6c 65 20 76 65  know the file ve
21bf0 72 73 69 6f 6e 20 79 65 74 2e 0d 0a 20 20 20 20  rsion yet...    
21c00 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21c20 65 74 20 76 65 72 73 69 6f 6e 20 22 22 0d 0a 0d  et version ""...
21c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21c40 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
21c50 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
21c60 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74 68 65  mpt to query the
21c70 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
21c80 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
21c90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21ca0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
21cb0 61 74 63 68 20 7b 66 69 6c 65 20 76 65 72 73 69  atch {file versi
21cc0 6f 6e 20 24 66 69 6c 65 4e 61 6d 65 7d 20 76 65  on $fileName} ve
21cd0 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26 20 5c  rsion] == 0 && \
21ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21cf0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
21d00 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3e  ngth $version] >
21d10 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
21d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d40 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 64 69 63     # NOTE: Indic
21d50 61 74 65 20 77 68 65 72 65 20 77 65 20 66 6f 75  ate where we fou
21d60 6e 64 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  nd the file...  
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
21d90 20 20 20 20 20 73 65 74 20 77 68 65 72 65 20 65       set where e
21da0 6e 76 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20  nvironment..    
21db0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
21dc0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
21dd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
21df0 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
21e00 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
21e10 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0d  is not properly.
21e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e30 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69     #       versi
21e40 6f 6e 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  oned...         
21e50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
21e70 74 20 64 69 72 65 63 74 6f 72 79 20 22 22 0d 0a  t directory ""..
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
21ea0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
21eb0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21ed0 4e 4f 54 45 3a 20 54 68 65 20 64 69 72 65 63 74  NOTE: The direct
21ee0 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
21ef0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st...           
21f00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21f10 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
21f20 63 74 6f 72 79 20 22 22 0d 0a 20 20 20 20 20 20  ctory ""..      
21f30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21f40 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21f50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
21f60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
21f70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 48         # NOTE: H
21f80 61 76 65 20 77 65 20 6e 6f 74 20 66 6f 75 6e 64  ave we not found
21f90 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 79   the directory y
21fa0 65 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  et?..        #..
21fb0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
21fc0 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
21fd0 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  ctory] == 0} the
21fe0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
21ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
22000 54 45 3a 20 52 65 67 69 73 74 72 79 20 68 69 76  TE: Registry hiv
22010 65 20 77 68 65 72 65 20 57 69 58 20 69 6e 73 74  e where WiX inst
22020 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
22030 69 73 20 73 74 6f 72 65 64 2e 20 20 4d 61 6b 65  is stored.  Make
22040 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
22050 20 20 20 20 73 75 72 65 20 74 6f 20 6c 6f 6f 6b      sure to look
22060 20 69 6e 20 74 68 65 20 57 6f 57 36 34 20 72 65   in the WoW64 re
22070 67 69 73 74 72 79 20 62 65 63 61 75 73 65 20 57  gistry because W
22080 69 58 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0d  iX is currently.
22090 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
220a0 20 20 20 61 6c 77 61 79 73 20 69 6e 73 74 61 6c     always instal
220b0 6c 65 64 20 61 73 20 61 20 33 32 2d 62 69 74 20  led as a 32-bit 
220c0 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0d 0a 20 20  application...  
220d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
220e0 20 20 20 20 20 73 65 74 20 6b 65 79 20 5b 61 70       set key [ap
220f0 70 65 6e 64 41 72 67 73 20 48 4b 45 59 5f 4c 4f  pendArgs HKEY_LO
22100 43 41 4c 5f 4d 41 43 48 49 4e 45 5c 5c 20 5c 0d  CAL_MACHINE\\ \.
22110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
22120 67 65 74 53 6f 66 74 77 61 72 65 52 65 67 69 73  getSoftwareRegis
22130 74 72 79 4b 65 79 20 74 72 75 65 5d 20 7b 5c 4d  tryKey true] {\M
22140 69 63 72 6f 73 6f 66 74 5c 57 69 6e 64 6f 77 73  icrosoft\Windows
22150 20 49 6e 73 74 61 6c 6c 65 72 20 58 4d 4c 7d 5d   Installer XML}]
22160 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
22170 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
22180 45 3a 20 54 68 65 20 76 65 72 73 69 6f 6e 73 20  E: The versions 
22190 6f 66 20 57 69 58 20 74 68 61 74 20 77 65 20 73  of WiX that we s
221a0 75 70 70 6f 72 74 2e 0d 0a 20 20 20 20 20 20 20  upport...       
221b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
221c0 73 65 74 20 76 65 72 73 69 6f 6e 73 20 5b 6c 69  set versions [li
221d0 73 74 20 33 2e 31 31 20 33 2e 31 30 20 33 2e 39  st 3.11 3.10 3.9
221e0 20 33 2e 38 20 33 2e 37 20 33 2e 36 20 33 2e 35   3.8 3.7 3.6 3.5
221f0 20 33 2e 30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20   3.0]....       
22200 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
22210 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 65 61  # NOTE: Check ea
22220 63 68 20 76 65 72 73 69 6f 6e 2c 20 73 74 6f 70  ch version, stop
22230 70 69 6e 67 20 77 68 65 6e 20 6f 6e 65 20 69 73  ping when one is
22240 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
22250 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
22260 66 6f 72 65 61 63 68 20 76 65 72 73 69 6f 6e 20  foreach version 
22270 24 76 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20 20  $versions {..   
22280 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22290 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
222a0 41 74 74 65 6d 70 74 20 74 6f 20 66 65 74 63 68  Attempt to fetch
222b0 20 74 68 65 20 57 69 58 20 69 6e 73 74 61 6c 6c   the WiX install
222c0 20 64 69 72 65 63 74 6f 72 79 20 76 61 6c 75 65   directory value
222d0 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20 20   from the..     
222e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
222f0 65 67 69 73 74 72 79 2c 20 72 65 6d 6f 76 69 6e  egistry, removin
22300 67 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 62  g the trailing b
22310 61 63 6b 73 6c 61 73 68 2c 20 69 66 20 61 6e 79  ackslash, if any
22320 2e 20 20 44 6f 65 73 0d 0a 20 20 20 20 20 20 20  .  Does..       
22330 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
22340 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20   directory name 
22350 6c 6f 6f 6b 20 76 61 6c 69 64 20 61 6e 64 20 64  look valid and d
22360 6f 65 73 20 69 74 20 61 63 74 75 61 6c 6c 79 20  oes it actually 
22370 65 78 69 73 74 3f 0d 0a 20 20 20 20 20 20 20 20  exist?..        
22380 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22390 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66     if {[catch {f
223a0 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 73  ile normalize [s
223b0 74 72 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20  tring trimright 
223c0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c  [object invoke \
223d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
223e0 20 20 20 20 20 20 4d 69 63 72 6f 73 6f 66 74 2e        Microsoft.
223f0 57 69 6e 33 32 2e 52 65 67 69 73 74 72 79 20 47  Win32.Registry G
22400 65 74 56 61 6c 75 65 20 5b 61 70 70 65 6e 64 41  etValue [appendA
22410 72 67 73 20 24 6b 65 79 20 5c 5c 20 5c 0d 0a 20  rgs $key \\ \.. 
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 24 76 65 72 73 69 6f 6e 5d 20 49 6e 73     $version] Ins
22440 74 61 6c 6c 52 6f 6f 74 20 6e 75 6c 6c 5d 20 5c  tallRoot null] \
22450 5c 5d 7d 20 64 69 72 65 63 74 6f 72 79 5d 20 3d  \]} directory] =
22460 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  = 0 && \..      
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
22480 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69  tring length $di
22490 72 65 63 74 6f 72 79 5d 20 3e 20 30 20 26 26 20  rectory] > 0 && 
224a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
224b0 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63     [file isdirec
224c0 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d  tory $directory]
224d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
224e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
224f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
22500 20 54 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f   The file name o
22510 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 57 69  f the primary Wi
22520 58 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  X assembly...   
22530 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
22540 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
22550 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
22560 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 77  oin $directory w
22570 69 78 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ix.dll]....     
22580 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22590 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
225a0 3a 20 57 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  : We do not know
225b0 20 74 68 65 20 66 69 6c 65 20 76 65 72 73 69 6f   the file versio
225c0 6e 20 79 65 74 2e 0d 0a 20 20 20 20 20 20 20 20  n yet...        
225d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
225e0 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
225f0 6f 6e 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 20  on ""....       
22600 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22610 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
22620 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79  Attempt to query
22630 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
22640 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  the file...     
22650 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22660 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
22670 61 74 63 68 20 7b 66 69 6c 65 20 76 65 72 73 69  atch {file versi
22680 6f 6e 20 24 66 69 6c 65 4e 61 6d 65 7d 20 76 65  on $fileName} ve
22690 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26 20 5c  rsion] == 0 && \
226a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
226b0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
226c0 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3e 20 30  th $version] > 0
226d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
226e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
22700 4f 54 45 3a 20 49 6e 64 69 63 61 74 65 20 77 68  OTE: Indicate wh
22710 65 72 65 20 77 65 20 66 6f 75 6e 64 20 74 68 65  ere we found the
22720 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
22730 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22740 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 77             set w
22750 68 65 72 65 20 72 65 67 69 73 74 72 79 0d 0a 0d  here registry...
22760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22770 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
22780 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66      # NOTE: We f
22790 6f 75 6e 64 20 69 74 2c 20 62 61 69 6c 20 6f 75  ound it, bail ou
227a0 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  t now...        
227b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
227c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
227d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
227e0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
227f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
22810 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
22820 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
22830 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0d  is not properly.
22840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22850 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
22860 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
22870 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22880 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
22890 63 74 6f 72 79 20 22 22 0d 0a 20 20 20 20 20 20  ctory ""..      
228a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
228b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
228c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
228d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
228e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
228f0 69 64 20 77 65 20 66 69 6e 64 20 74 68 65 20 64  id we find the d
22900 69 72 65 63 74 6f 72 79 3f 0d 0a 20 20 20 20 20  irectory?..     
22910 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
22920 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
22930 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30   $directory] > 0
22940 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
22950 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63     [file isdirec
22960 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d  tory $directory]
22970 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22980 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22990 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74   # NOTE: Yes, it
229a0 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
229b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
229c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
229d0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
229e0 61 69 6e 74 20 77 69 78 0d 0a 0d 0a 20 20 20 20  aint wix....    
229f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22a00 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20     # NOTE: Save 
22a10 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 6f  the directory fo
22a20 72 20 6c 61 74 65 72 20 75 73 61 67 65 20 62 79  r later usage by
22a30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
22a40 20 20 20 20 74 68 65 20 74 65 73 74 20 69 74 73      the test its
22a50 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  elf...          
22a60 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
22a70 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
22a80 3a 6e 6f 28 73 65 74 57 69 78 29 5d 7d 20 74 68  :no(setWix)]} th
22a90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22aa0 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 77 69 78    set ::test_wix
22ab0 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20   $directory..   
22ac0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22ae0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
22af0 77 68 65 72 65 20 77 65 20 66 6f 75 6e 64 20 69  where we found i
22b00 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
22b10 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
22b20 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
22b30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
22b40 20 20 20 20 20 20 20 22 79 65 73 20 28 22 20 24         "yes (" $
22b50 76 65 72 73 69 6f 6e 20 22 2c 20 76 69 61 20 22  version ", via "
22b60 20 24 77 68 65 72 65 20 22 2c 20 5c 22 22 20 5c   $where ", \"" \
22b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b80 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22 29 5c  $directory "\")\
22b90 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
22ba0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
22bb0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e  NOTE: We are don
22bc0 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e  e here, return n
22bd0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
22be0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
22bf0 72 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  rn..        }.. 
22c00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22c10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
22c20 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  o\n..    }..... 
22c30 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
22c40 54 61 72 67 65 74 46 72 61 6d 65 77 6f 72 6b 20  TargetFramework 
22c50 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
22c60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22c70 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
22c80 6e 67 20 66 6f 72 20 74 61 72 67 65 74 20 66 72  ng for target fr
22c90 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a  amework... "....
22ca0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
22cb0 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70  exists ::eagle_p
22cc0 6c 61 74 66 6f 72 6d 28 74 61 72 67 65 74 46 72  latform(targetFr
22cd0 61 6d 65 77 6f 72 6b 29 5d 20 26 26 20 5c 0d 0a  amework)] && \..
22ce0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
22cf0 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c  g length $::eagl
22d00 65 5f 70 6c 61 74 66 6f 72 6d 28 74 61 72 67 65  e_platform(targe
22d10 74 46 72 61 6d 65 77 6f 72 6b 29 5d 20 3e 20 30  tFramework)] > 0
22d20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22d30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22d40 4f 54 45 3a 20 4e 6f 77 20 63 72 65 61 74 65 20  OTE: Now create 
22d50 61 20 73 74 72 69 6e 67 20 66 6f 72 20 75 73 65  a string for use
22d60 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
22d70 6e 74 20 6e 61 6d 65 20 28 72 65 6d 6f 76 65 0d  nt name (remove.
22d80 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
22d90 20 74 68 65 20 69 6e 76 61 6c 69 64 20 63 68 61   the invalid cha
22da0 72 61 63 74 65 72 73 29 2e 20 20 46 6f 72 20 65  racters).  For e
22db0 78 61 6d 70 6c 65 3a 0d 0a 20 20 20 20 20 20 20  xample:..       
22dc0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
22dd0 20 20 20 20 22 2e 4e 45 54 46 72 61 6d 65 77 6f      ".NETFramewo
22de0 72 6b 2c 56 65 72 73 69 6f 6e 3d 76 32 2e 30 22  rk,Version=v2.0"
22df0 20 2d 2d 3e 20 22 4e 45 54 46 72 61 6d 65 77 6f   --> "NETFramewo
22e00 72 6b 2e 56 65 72 73 69 6f 6e 2e 76 32 2e 30 22  rk.Version.v2.0"
22e10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22e20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
22e30 72 61 6d 65 77 6f 72 6b 20 5b 73 74 72 69 6e 67  ramework [string
22e40 20 74 72 69 6d 6c 65 66 74 20 5b 73 74 72 69 6e   trimleft [strin
22e50 67 20 6d 61 70 20 5b 6c 69 73 74 20 2c 20 2e 20  g map [list , . 
22e60 3d 20 2e 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  = .] \..        
22e70 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61      $::eagle_pla
22e80 74 66 6f 72 6d 28 74 61 72 67 65 74 46 72 61 6d  tform(targetFram
22e90 65 77 6f 72 6b 29 5d 20 2e 5d 0d 0a 0d 0a 20 20  ework)] .]....  
22ea0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22eb0 20 23 20 4e 4f 54 45 3a 20 4b 65 65 70 20 74 72   # NOTE: Keep tr
22ec0 61 63 6b 20 6f 66 20 74 68 65 20 73 70 65 63 69  ack of the speci
22ed0 66 69 63 20 74 61 72 67 65 74 20 66 72 61 6d 65  fic target frame
22ee0 77 6f 72 6b 20 66 6f 72 20 75 73 61 67 65 20 69  work for usage i
22ef0 6e 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  n test..        
22f00 23 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69  #       constrai
22f10 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nts...        #.
22f20 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
22f30 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
22f40 67 73 20 74 61 72 67 65 74 46 72 61 6d 65 77 6f  gs targetFramewo
22f50 72 6b 2e 20 24 74 61 72 67 65 74 46 72 61 6d 65  rk. $targetFrame
22f60 77 6f 72 6b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  work]....       
22f70 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
22f80 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
22f90 20 28 22 20 24 74 61 72 67 65 74 46 72 61 6d 65   (" $targetFrame
22fa0 77 6f 72 6b 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  work ")\n"]..   
22fb0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
22fc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22fd0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
22fe0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
22ff0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 4e 61   proc checkForNa
23000 74 69 76 65 55 74 69 6c 69 74 79 20 7b 20 63 68  tiveUtility { ch
23010 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
23020 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23030 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
23040 6f 72 20 6e 61 74 69 76 65 20 75 74 69 6c 69 74  or native utilit
23050 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
23060 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
23070 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72   ::eagle_platfor
23080 6d 28 6e 61 74 69 76 65 55 74 69 6c 69 74 79 29  m(nativeUtility)
23090 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
230a0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
230b0 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f   $::eagle_platfo
230c0 72 6d 28 6e 61 74 69 76 65 55 74 69 6c 69 74 79  rm(nativeUtility
230d0 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
230e0 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
230f0 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 65 61 67 6c   [lindex $::eagl
23100 65 5f 70 6c 61 74 66 6f 72 6d 28 6e 61 74 69 76  e_platform(nativ
23110 65 55 74 69 6c 69 74 79 29 20 30 5d 0d 0a 0d 0a  eUtility) 0]....
23120 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
23130 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
23140 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
23150 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
23160 73 69 6f 6e 20 5b 6c 69 6e 64 65 78 20 24 3a 3a  sion [lindex $::
23170 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 6e  eagle_platform(n
23180 61 74 69 76 65 55 74 69 6c 69 74 79 29 20 31 5d  ativeUtility) 1]
23190 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
231a0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
231b0 20 24 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20   $version] > 0} 
231c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
231d0 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 55 74      set nativeUt
231e0 69 6c 69 74 79 20 5b 61 70 70 65 6e 64 41 72 67  ility [appendArg
231f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
23200 20 20 20 20 20 24 6e 61 6d 65 20 2e 20 5b 67 65       $name . [ge
23210 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56 65 72 73 69  tMajorMinorVersi
23220 6f 6e 20 24 76 65 72 73 69 6f 6e 5d 5d 0d 0a 20  on $version]].. 
23230 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
23240 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
23250 65 74 20 6e 61 74 69 76 65 55 74 69 6c 69 74 79  et nativeUtility
23260 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20   $name..        
23270 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
23280 20 69 66 20 7b 24 6e 61 74 69 76 65 55 74 69 6c   if {$nativeUtil
23290 69 74 79 20 6e 69 20 22 64 69 73 61 62 6c 65 64  ity ni "disabled
232a0 20 75 6e 61 76 61 69 6c 61 62 6c 65 22 7d 20 74   unavailable"} t
232b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
232c0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
232d0 20 6e 61 74 69 76 65 55 74 69 6c 69 74 79 0d 0a   nativeUtility..
232e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
232f0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
23300 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
23310 67 73 20 6e 61 74 69 76 65 55 74 69 6c 69 74 79  gs nativeUtility
23320 2e 20 24 6e 61 74 69 76 65 55 74 69 6c 69 74 79  . $nativeUtility
23330 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ]....          t
23340 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
23350 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
23360 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 61             $::ea
23370 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 6e 61 74  gle_platform(nat
23380 69 76 65 55 74 69 6c 69 74 79 29 20 22 20 28 22  iveUtility) " ("
23390 20 24 6e 61 74 69 76 65 55 74 69 6c 69 74 79 20   $nativeUtility 
233a0 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ")\n"]..        
233b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
233c0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
233d0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
233e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
233f0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
23400 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23410 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
23420 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
23430 63 20 63 68 65 63 6b 46 6f 72 4e 65 74 46 78 32  c checkForNetFx2
23440 30 53 65 72 76 69 63 65 50 61 63 6b 20 7b 20 63  0ServicePack { c
23450 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
23460 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
23470 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
23480 66 6f 72 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  for .NET Framewo
23490 72 6b 20 32 2e 30 20 53 65 72 76 69 63 65 20 50  rk 2.0 Service P
234a0 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ack... "....    
234b0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
234c0 45 3a 20 50 6c 61 74 66 6f 72 6d 20 6d 75 73 74  E: Platform must
234d0 20 62 65 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   be Windows for 
234e0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
234f0 74 6f 20 65 76 65 6e 20 62 65 0d 0a 20 20 20 20  to even be..    
23500 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 65    #       checke
23510 64 20 28 69 2e 65 2e 20 77 65 20 72 65 71 75 69  d (i.e. we requi
23520 72 65 20 74 68 65 20 72 65 67 69 73 74 72 79 29  re the registry)
23530 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
23540 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
23550 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
23560 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
23570 4e 4f 54 45 3a 20 52 65 67 69 73 74 72 79 20 68  NOTE: Registry h
23580 69 76 65 20 77 68 65 72 65 20 74 68 65 20 2e 4e  ive where the .N
23590 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 32 2e 30  ET Framework 2.0
235a0 20 73 65 74 75 70 20 61 6e 64 0d 0a 20 20 20 20   setup and..    
235b0 20 20 20 20 23 20 20 20 20 20 20 20 73 65 72 76      #       serv
235c0 69 63 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  icing informatio
235d0 6e 20 69 73 20 73 74 6f 72 65 64 2e 20 20 4e 6f  n is stored.  No
235e0 20 6e 65 65 64 20 74 6f 20 6c 6f 6f 6b 20 69 6e   need to look in
235f0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23600 20 20 74 68 65 20 57 6f 57 36 34 20 72 65 67 69    the WoW64 regi
23610 73 74 72 79 20 62 65 63 61 75 73 65 20 74 68 65  stry because the
23620 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
23630 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20  should..        
23640 23 20 20 20 20 20 20 20 62 65 20 69 6e 73 74 61  #       be insta
23650 6c 6c 65 64 20 6e 61 74 69 76 65 6c 79 20 61 73  lled natively as
23660 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   well...        
23670 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6b  #..        set k
23680 65 79 20 5b 61 70 70 65 6e 64 41 72 67 73 20 48  ey [appendArgs H
23690 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e  KEY_LOCAL_MACHIN
236a0 45 5c 5c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  E\\ \..         
236b0 20 20 20 7b 53 6f 66 74 77 61 72 65 5c 4d 69 63     {Software\Mic
236c0 72 6f 73 6f 66 74 5c 4e 45 54 20 46 72 61 6d 65  rosoft\NET Frame
236d0 77 6f 72 6b 20 53 65 74 75 70 5c 4e 44 50 5c 76  work Setup\NDP\v
236e0 32 2e 30 2e 35 30 37 32 37 7d 5d 0d 0a 0d 0a 20  2.0.50727}].... 
236f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23700 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
23710 74 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 2e  t to fetch the .
23720 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 32 2e  NET Framework 2.
23730 30 20 22 53 50 22 20 76 61 6c 75 65 20 66 72 6f  0 "SP" value fro
23740 6d 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  m the..        #
23750 20 20 20 20 20 20 20 73 65 72 76 69 63 69 6e 67         servicing
23760 20 72 65 67 69 73 74 72 79 20 68 69 76 65 2e 20   registry hive. 
23770 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 64   If this value d
23780 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 2d 4f  oes not exist -O
23790 52 2d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  R-..        #   
237a0 20 20 20 20 69 73 20 6c 65 73 73 20 74 68 61 6e      is less than
237b0 20 31 2c 20 74 68 65 6e 20 6e 6f 20 2e 4e 45 54   1, then no .NET
237c0 20 46 72 61 6d 65 77 6f 72 6b 20 32 2e 30 20 73   Framework 2.0 s
237d0 65 72 76 69 63 65 20 70 61 63 6b 20 69 73 0d 0a  ervice pack is..
237e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
237f0 69 6e 73 74 61 6c 6c 65 64 2e 20 20 49 66 20 74  installed.  If t
23800 68 69 73 20 72 61 69 73 65 73 20 61 20 73 63 72  his raises a scr
23810 69 70 74 20 65 72 72 6f 72 2c 20 74 68 61 74 20  ipt error, that 
23820 77 69 6c 6c 20 61 6c 6d 6f 73 74 0d 0a 20 20 20  will almost..   
23830 20 20 20 20 20 23 20 20 20 20 20 20 20 63 65 72       #       cer
23840 74 61 69 6e 6c 79 20 63 61 75 73 65 20 74 68 65  tainly cause the
23850 20 72 65 73 75 6c 74 20 74 6f 20 62 65 20 61 20   result to be a 
23860 6e 6f 6e 2d 69 6e 74 65 67 65 72 2c 20 74 68 69  non-integer, thi
23870 73 20 66 61 69 6c 69 6e 67 0d 0a 20 20 20 20 20  s failing..     
23880 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63     #       the c
23890 68 65 63 6b 20 62 65 6c 6f 77 2e 0d 0a 20 20 20  heck below...   
238a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
238b0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
238c0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
238d0 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33 32   Microsoft.Win32
238e0 2e 52 65 67 69 73 74 72 79 20 47 65 74 56 61 6c  .Registry GetVal
238f0 75 65 20 24 6b 65 79 20 53 50 20 6e 75 6c 6c 0d  ue $key SP null.
23900 0a 20 20 20 20 20 20 20 20 7d 20 73 65 72 76 69  .        } servi
23910 63 65 50 61 63 6b 0d 0a 0d 0a 20 20 20 20 20 20  cePack....      
23920 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
23930 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74   integer -strict
23940 20 24 73 65 72 76 69 63 65 50 61 63 6b 5d 7d 20   $servicePack]} 
23950 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23960 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
23970 20 4e 4f 54 45 3a 20 53 65 72 76 69 63 65 20 70   NOTE: Service p
23980 61 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  acks are always 
23990 63 75 6d 75 6c 61 74 69 76 65 3b 20 74 68 65 72  cumulative; ther
239a0 65 66 6f 72 65 2c 20 61 64 64 20 74 65 73 74 0d  efore, add test.
239b0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
239c0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66     constraints f
239d0 6f 72 20 61 6c 6c 20 73 65 72 76 69 63 65 20 70  or all service p
239e0 61 63 6b 20 6c 65 76 65 6c 73 20 75 70 20 74 6f  ack levels up to
239f0 20 74 68 65 20 6f 6e 65 20 74 68 61 74 0d 0a 20   the one that.. 
23a00 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
23a10 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 73   is actually ins
23a20 74 61 6c 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20  talled...       
23a30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
23a40 66 6f 72 20 7b 73 65 74 20 6c 65 76 65 6c 20 30  for {set level 0
23a50 7d 20 7b 24 6c 65 76 65 6c 20 3c 3d 20 24 73 65  } {$level <= $se
23a60 72 76 69 63 65 50 61 63 6b 7d 20 7b 69 6e 63 72  rvicePack} {incr
23a70 20 6c 65 76 65 6c 7d 20 7b 0d 0a 20 20 20 20 20   level} {..     
23a80 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
23a90 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
23aa0 20 64 6f 74 4e 65 74 32 30 53 70 20 24 6c 65 76   dotNet20Sp $lev
23ab0 65 6c 20 4f 72 48 69 67 68 65 72 5d 0d 0a 20 20  el OrHigher]..  
23ac0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23ad0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23ae0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f      # NOTE: Also
23af0 20 61 64 64 20 74 68 65 20 22 65 78 61 63 74 22   add the "exact"
23b00 20 73 65 72 76 69 63 65 20 70 61 63 6b 20 74 65   service pack te
23b10 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 76  st constraint ev
23b20 65 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  en..          # 
23b30 20 20 20 20 20 20 74 68 6f 75 67 68 20 69 74 20        though it 
23b40 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 6e 65  should almost ne
23b50 76 65 72 20 62 65 20 75 73 65 64 2e 0d 0a 20 20  ver be used...  
23b60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23b70 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
23b80 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64  nt [appendArgs d
23b90 6f 74 4e 65 74 32 30 53 70 20 24 73 65 72 76 69  otNet20Sp $servi
23ba0 63 65 50 61 63 6b 5d 0d 0a 0d 0a 20 20 20 20 20  cePack]....     
23bb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23bc0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
23bd0 68 65 20 22 73 65 72 76 69 63 65 50 61 63 6b 22  he "servicePack"
23be0 20 76 61 6c 75 65 20 77 65 20 66 6f 75 6e 64 20   value we found 
23bf0 69 6e 20 74 68 65 20 72 65 67 69 73 74 72 79 2e  in the registry.
23c00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
23c10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23c20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23c30 72 67 73 20 22 79 65 73 20 28 22 20 24 73 65 72  rgs "yes (" $ser
23c40 76 69 63 65 50 61 63 6b 20 22 29 5c 6e 22 5d 0d  vicePack ")\n"].
23c50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
23c60 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
23c70 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65  : We are done he
23c80 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d  re, return now..
23c90 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
23ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
23cb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23cc0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74   }....      tput
23cd0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
23ce0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
23cf0 72 6f 63 20 67 65 74 46 72 61 6d 65 77 6f 72 6b  roc getFramework
23d00 53 65 74 75 70 34 35 31 56 61 6c 75 65 20 7b 7d  Setup451Value {}
23d10 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
23d20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
23d30 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69   if we are runni
23d40 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 38 2e  ng on Windows 8.
23d50 31 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  1...      #..   
23d60 20 20 20 23 20 42 55 47 42 55 47 3a 20 49 73 20     # BUGBUG: Is 
23d70 65 78 61 63 74 20 6d 61 74 63 68 69 6e 67 20 63  exact matching c
23d80 6f 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20  orrect here?..  
23d90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
23da0 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
23db0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
23dc0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
23dd0 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20  rsion)] && \..  
23de0 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70          $::tcl_p
23df0 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f  latform(osVersio
23e00 6e 29 20 3d 3d 20 36 2e 33 7d 20 74 68 65 6e 20  n) == 6.3} then 
23e10 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
23e20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
23e30 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
23e40 57 69 6e 64 6f 77 73 20 38 2e 31 2c 20 72 65 74  Windows 8.1, ret
23e50 75 72 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20  urn the special 
23e60 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
23e70 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
23e80 6e 20 33 37 38 36 37 35 0d 0a 20 20 20 20 20 20  n 378675..      
23e90 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
23ea0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
23eb0 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f  re not running o
23ec0 6e 20 57 69 6e 64 6f 77 73 20 38 2e 31 2c 20 72  n Windows 8.1, r
23ed0 65 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  eturn the normal
23ee0 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23   value...      #
23ef0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ..      return 3
23f00 37 38 37 35 38 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  78758..    }....
23f10 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 72 61  .    proc getFra
23f20 6d 65 77 6f 72 6b 53 65 74 75 70 34 36 56 61 6c  meworkSetup46Val
23f30 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
23f40 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
23f50 43 68 65 63 6b 20 69 66 20 77 65 20 61 72 65 20  Check if we are 
23f60 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
23f70 77 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d  ws 10 or later..
23f80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
23f90 23 20 42 55 47 42 55 47 3a 20 49 73 20 67 72 65  # BUGBUG: Is gre
23fa0 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75  ater-than-or-equ
23fb0 61 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63  al-to matching c
23fc0 6f 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20  orrect here?..  
23fd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
23fe0 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
23ff0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
24000 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
24010 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20  rsion)] && \..  
24020 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70          $::tcl_p
24030 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f  latform(osVersio
24040 6e 29 20 3e 3d 20 31 30 2e 30 7d 20 74 68 65 6e  n) >= 10.0} then
24050 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
24060 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
24070 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
24080 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74   Windows 10, ret
24090 75 72 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20  urn the special 
240a0 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
240b0 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
240c0 6e 20 33 39 33 32 39 35 0d 0a 20 20 20 20 20 20  n 393295..      
240d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
240e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
240f0 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f  re not running o
24100 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65  n Windows 10, re
24110 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20  turn the normal 
24120 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d  value...      #.
24130 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 39  .      return 39
24140 33 32 39 37 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  3297..    }.....
24150 20 20 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d      proc getFram
24160 65 77 6f 72 6b 53 65 74 75 70 34 36 31 56 61 6c  eworkSetup461Val
24170 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
24180 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
24190 43 68 65 63 6b 20 69 66 20 77 65 20 61 72 65 20  Check if we are 
241a0 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
241b0 77 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d  ws 10 or later..
241c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
241d0 23 20 42 55 47 42 55 47 3a 20 49 73 20 67 72 65  # BUGBUG: Is gre
241e0 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75  ater-than-or-equ
241f0 61 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63  al-to matching c
24200 6f 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20  orrect here?..  
24210 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
24220 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
24230 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
24240 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
24250 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20  rsion)] && \..  
24260 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70          $::tcl_p
24270 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f  latform(osVersio
24280 6e 29 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c 0d  n) >= 10.0 && \.
24290 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
242a0 54 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74  TclPlatformOsExt
242b0 72 61 55 70 64 61 74 65 4e 61 6d 65 20 22 4e 6f  raUpdateName "No
242c0 76 65 6d 62 65 72 20 55 70 64 61 74 65 22 5d 7d  vember Update"]}
242d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
242e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
242f0 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69  TE: We are runni
24300 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30  ng on Windows 10
24310 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73 70 65  , return the spe
24320 63 69 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20  cial value...   
24330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24340 72 65 74 75 72 6e 20 33 39 34 32 35 34 3b 20 23  return 394254; #
24350 20 42 55 47 42 55 47 3a 20 4e 6f 76 65 6d 62 65   BUGBUG: Novembe
24360 72 20 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d 0a  r Update only?..
24370 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24380 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
24390 3a 20 57 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  : We are not run
243a0 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ning on Windows 
243b0 31 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e  10, return the n
243c0 6f 72 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20  ormal value...  
243d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
243e0 75 72 6e 20 33 39 34 32 37 31 0d 0a 20 20 20 20  urn 394271..    
243f0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
24400 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70  etFrameworkSetup
24410 34 36 32 56 61 6c 75 65 20 7b 7d 20 7b 0d 0a 20  462Value {} {.. 
24420 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
24430 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 77  NOTE: Check if w
24440 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
24450 20 57 69 6e 64 6f 77 73 20 31 30 20 6f 72 20 6c   Windows 10 or l
24460 61 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ater...      #..
24470 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a 20        # BUGBUG: 
24480 49 73 20 67 72 65 61 74 65 72 2d 74 68 61 6e 2d  Is greater-than-
24490 6f 72 2d 65 71 75 61 6c 2d 74 6f 20 6d 61 74 63  or-equal-to matc
244a0 68 69 6e 67 20 63 6f 72 72 65 63 74 20 68 65 72  hing correct her
244b0 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
244c0 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77     if {[isWindow
244d0 73 5d 20 26 26 20 5b 69 6e 66 6f 20 65 78 69 73  s] && [info exis
244e0 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
244f0 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d 20 26 26  m(osVersion)] &&
24500 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a   \..          $:
24510 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73  :tcl_platform(os
24520 56 65 72 73 69 6f 6e 29 20 3e 3d 20 31 30 2e 30  Version) >= 10.0
24530 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
24540 20 5b 68 61 76 65 54 63 6c 50 6c 61 74 66 6f 72   [haveTclPlatfor
24550 6d 4f 73 45 78 74 72 61 55 70 64 61 74 65 4e 61  mOsExtraUpdateNa
24560 6d 65 20 22 41 6e 6e 69 76 65 72 73 61 72 79 20  me "Anniversary 
24570 55 70 64 61 74 65 22 5d 7d 20 74 68 65 6e 20 7b  Update"]} then {
24580 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24590 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
245a0 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  are running on W
245b0 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72  indows 10, retur
245c0 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76 61  n the special va
245d0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
245e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
245f0 33 39 34 38 30 32 3b 20 23 20 42 55 47 42 55 47  394802; # BUGBUG
24600 3a 20 41 6e 6e 69 76 65 72 73 61 72 79 20 55 70  : Anniversary Up
24610 64 61 74 65 20 6f 6e 6c 79 3f 0d 0a 20 20 20 20  date only?..    
24620 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
24630 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
24640 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67   are not running
24650 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20   on Windows 10, 
24660 72 65 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61  return the norma
24670 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  l value...      
24680 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
24690 33 39 34 38 30 36 0d 0a 20 20 20 20 7d 0d 0a 0c  394806..    }...
246a0 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 72  ..    proc getFr
246b0 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 37 56 61  ameworkSetup47Va
246c0 6c 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  lue {} {..      
246d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
246e0 20 43 68 65 63 6b 20 69 66 20 77 65 20 61 72 65   Check if we are
246f0 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64   running on Wind
24700 6f 77 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e  ows 10 or later.
24710 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24720 20 23 20 42 55 47 42 55 47 3a 20 49 73 20 67 72   # BUGBUG: Is gr
24730 65 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71  eater-than-or-eq
24740 75 61 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20  ual-to matching 
24750 63 6f 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20  correct here?.. 
24760 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
24770 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26   {[isWindows] &&
24780 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a   [info exists ::
24790 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56  tcl_platform(osV
247a0 65 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20  ersion)] && \.. 
247b0 20 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f           $::tcl_
247c0 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69  platform(osVersi
247d0 6f 6e 29 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c  on) >= 10.0 && \
247e0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
247f0 65 54 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78  eTclPlatformOsEx
24800 74 72 61 55 70 64 61 74 65 4e 61 6d 65 20 22 43  traUpdateName "C
24810 72 65 61 74 6f 72 73 20 55 70 64 61 74 65 22 5d  reators Update"]
24820 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24830 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24840 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e  OTE: We are runn
24850 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31  ing on Windows 1
24860 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73 70  0, return the sp
24870 65 63 69 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20  ecial value...  
24880 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24890 20 72 65 74 75 72 6e 20 34 36 30 37 39 38 3b 20   return 460798; 
248a0 23 20 42 55 47 42 55 47 3a 20 43 72 65 61 74 6f  # BUGBUG: Creato
248b0 72 73 20 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d  rs Update only?.
248c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
248d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
248e0 45 3a 20 57 65 20 61 72 65 20 6e 6f 74 20 72 75  E: We are not ru
248f0 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73  nning on Windows
24900 20 31 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20   10, return the 
24910 6e 6f 72 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20  normal value... 
24920 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
24930 74 75 72 6e 20 34 36 30 38 30 35 0d 0a 20 20 20  turn 460805..   
24940 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
24950 67 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74 75  getFrameworkSetu
24960 70 34 37 31 56 61 6c 75 65 20 7b 7d 20 7b 0d 0a  p471Value {} {..
24970 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
24980 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
24990 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
249a0 6e 20 57 69 6e 64 6f 77 73 20 31 30 20 6f 72 20  n Windows 10 or 
249b0 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  later...      #.
249c0 0a 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a  .      # BUGBUG:
249d0 20 49 73 20 67 72 65 61 74 65 72 2d 74 68 61 6e   Is greater-than
249e0 2d 6f 72 2d 65 71 75 61 6c 2d 74 6f 20 6d 61 74  -or-equal-to mat
249f0 63 68 69 6e 67 20 63 6f 72 72 65 63 74 20 68 65  ching correct he
24a00 72 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re?..      #..  
24a10 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f      if {[isWindo
24a20 77 73 5d 20 26 26 20 5b 69 6e 66 6f 20 65 78 69  ws] && [info exi
24a30 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
24a40 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d 20 26  rm(osVersion)] &
24a50 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  & \..          $
24a60 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f  ::tcl_platform(o
24a70 73 56 65 72 73 69 6f 6e 29 20 3e 3d 20 31 30 2e  sVersion) >= 10.
24a80 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
24a90 20 20 5b 68 61 76 65 54 63 6c 50 6c 61 74 66 6f    [haveTclPlatfo
24aa0 72 6d 4f 73 45 78 74 72 61 55 70 64 61 74 65 4e  rmOsExtraUpdateN
24ab0 61 6d 65 20 22 46 61 6c 6c 20 43 72 65 61 74 6f  ame "Fall Creato
24ac0 72 73 20 55 70 64 61 74 65 22 5d 7d 20 74 68 65  rs Update"]} the
24ad0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
24ae0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
24af0 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  We are running o
24b00 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65  n Windows 10, re
24b10 74 75 72 6e 20 74 68 65 20 73 70 65 63 69 61 6c  turn the special
24b20 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
24b30 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
24b40 72 6e 20 34 36 31 33 30 38 3b 20 23 20 42 55 47  rn 461308; # BUG
24b50 42 55 47 3a 20 46 61 6c 6c 20 43 72 65 61 74 6f  BUG: Fall Creato
24b60 72 73 20 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d  rs Update only?.
24b70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
24b80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
24b90 45 3a 20 57 65 20 61 72 65 20 6e 6f 74 20 72 75  E: We are not ru
24ba0 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73  nning on Windows
24bb0 20 31 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20   10, return the 
24bc0 6e 6f 72 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20  normal value... 
24bd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
24be0 74 75 72 6e 20 34 36 31 33 31 30 0d 0a 20 20 20  turn 461310..   
24bf0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
24c00 67 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74 75  getFrameworkSetu
24c10 70 34 37 32 56 61 6c 75 65 20 7b 7d 20 7b 0d 0a  p472Value {} {..
24c20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
24c30 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
24c40 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
24c50 6e 20 57 69 6e 64 6f 77 73 20 31 30 20 6f 72 20  n Windows 10 or 
24c60 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  later...      #.
24c70 0a 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a  .      # BUGBUG:
24c80 20 49 73 20 67 72 65 61 74 65 72 2d 74 68 61 6e   Is greater-than
24c90 2d 6f 72 2d 65 71 75 61 6c 2d 74 6f 20 6d 61 74  -or-equal-to mat
24ca0 63 68 69 6e 67 20 63 6f 72 72 65 63 74 20 68 65  ching correct he
24cb0 72 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re?..      #..  
24cc0 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f      if {[isWindo
24cd0 77 73 5d 20 26 26 20 5b 69 6e 66 6f 20 65 78 69  ws] && [info exi
24ce0 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
24cf0 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d 20 26  rm(osVersion)] &
24d00 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  & \..          $
24d10 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f  ::tcl_platform(o
24d20 73 56 65 72 73 69 6f 6e 29 20 3e 3d 20 31 30 2e  sVersion) >= 10.
24d30 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
24d40 20 20 5b 68 61 76 65 54 63 6c 50 6c 61 74 66 6f    [haveTclPlatfo
24d50 72 6d 4f 73 45 78 74 72 61 55 70 64 61 74 65 4e  rmOsExtraUpdateN
24d60 61 6d 65 20 22 41 70 72 69 6c 20 32 30 31 38 20  ame "April 2018 
24d70 55 70 64 61 74 65 22 5d 7d 20 74 68 65 6e 20 7b  Update"]} then {
24d80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24d90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
24da0 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  are running on W
24db0 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72  indows 10, retur
24dc0 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76 61  n the special va
24dd0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
24de0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24df0 34 36 31 38 30 38 3b 20 23 20 42 55 47 42 55 47  461808; # BUGBUG
24e00 3a 20 46 61 6c 6c 20 43 72 65 61 74 6f 72 73 20  : Fall Creators 
24e10 55 70 64 61 74 65 20 6f 6e 6c 79 3f 0d 0a 20 20  Update only?..  
24e20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
24e30 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
24e40 57 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  We are not runni
24e50 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30  ng on Windows 10
24e60 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 6f 72  , return the nor
24e70 6d 61 6c 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  mal value...    
24e80 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
24e90 6e 20 34 36 31 38 31 34 0d 0a 20 20 20 20 7d 0d  n 461814..    }.
24ea0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
24eb0 63 6b 46 6f 72 4e 65 74 46 78 34 78 20 7b 20 63  ckForNetFx4x { c
24ec0 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
24ed0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
24ee0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
24ef0 66 6f 72 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  for .NET Framewo
24f00 72 6b 20 34 2e 78 2e 2e 2e 20 22 0d 0a 0d 0a 20  rk 4.x... ".... 
24f10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
24f20 4e 4f 54 45 3a 20 50 6c 61 74 66 6f 72 6d 20 6d  NOTE: Platform m
24f30 75 73 74 20 62 65 20 57 69 6e 64 6f 77 73 20 66  ust be Windows f
24f40 6f 72 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  or this constrai
24f50 6e 74 20 74 6f 20 65 76 65 6e 20 62 65 0d 0a 20  nt to even be.. 
24f60 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65       #       che
24f70 63 6b 65 64 20 28 69 2e 65 2e 20 77 65 20 72 65  cked (i.e. we re
24f80 71 75 69 72 65 20 74 68 65 20 72 65 67 69 73 74  quire the regist
24f90 72 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ry)...      #.. 
24fa0 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64       if {[isWind
24fb0 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ows]} then {..  
24fc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24fd0 20 23 20 4e 4f 54 45 3a 20 52 65 67 69 73 74 72   # NOTE: Registr
24fe0 79 20 68 69 76 65 20 77 68 65 72 65 20 74 68 65  y hive where the
24ff0 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
25000 34 2e 30 20 73 65 74 75 70 20 61 6e 64 0d 0a 20  4.0 setup and.. 
25010 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
25020 65 72 76 69 63 69 6e 67 20 69 6e 66 6f 72 6d 61  ervicing informa
25030 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 2e 20  tion is stored. 
25040 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 6f 6b   No need to look
25050 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20   in..        #  
25060 20 20 20 20 20 74 68 65 20 57 6f 57 36 34 20 72       the WoW64 r
25070 65 67 69 73 74 72 79 20 62 65 63 61 75 73 65 20  egistry because 
25080 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  the .NET Framewo
25090 72 6b 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20  rk should..     
250a0 20 20 20 23 20 20 20 20 20 20 20 62 65 20 69 6e     #       be in
250b0 73 74 61 6c 6c 65 64 20 6e 61 74 69 76 65 6c 79  stalled natively
250c0 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20   as well...     
250d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
250e0 74 20 6b 65 79 20 5b 61 70 70 65 6e 64 41 72 67  t key [appendArg
250f0 73 20 48 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41 43  s HKEY_LOCAL_MAC
25100 48 49 4e 45 5c 5c 20 5c 0d 0a 20 20 20 20 20 20  HINE\\ \..      
25110 20 20 20 20 20 20 7b 53 6f 66 74 77 61 72 65 5c        {Software\
25120 4d 69 63 72 6f 73 6f 66 74 5c 4e 45 54 20 46 72  Microsoft\NET Fr
25130 61 6d 65 77 6f 72 6b 20 53 65 74 75 70 5c 4e 44  amework Setup\ND
25140 50 5c 76 34 5c 46 75 6c 6c 7d 5d 0d 0a 0d 0a 20  P\v4\Full}].... 
25150 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25160 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
25170 74 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 2e  t to fetch the .
25180 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 34 2e  NET Framework 4.
25190 30 20 22 72 65 6c 65 61 73 65 22 20 76 61 6c 75  0 "release" valu
251a0 65 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20  e from..        
251b0 23 20 20 20 20 20 20 20 74 68 65 20 73 65 72 76  #       the serv
251c0 69 63 69 6e 67 20 72 65 67 69 73 74 72 79 20 68  icing registry h
251d0 69 76 65 2e 20 20 49 66 20 74 68 69 73 20 76 61  ive.  If this va
251e0 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  lue does not exi
251f0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
25200 20 20 20 20 2d 4f 52 2d 20 69 73 20 6c 65 73 73      -OR- is less
25210 20 74 68 61 6e 20 33 37 38 33 38 39 2c 20 74 68   than 378389, th
25220 65 6e 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d  en the .NET Fram
25230 65 77 6f 72 6b 20 34 2e 35 20 69 73 20 6e 6f 74  ework 4.5 is not
25240 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
25250 20 20 69 6e 73 74 61 6c 6c 65 64 2e 20 20 49 66    installed.  If
25260 20 74 68 69 73 20 72 61 69 73 65 73 20 61 20 73   this raises a s
25270 63 72 69 70 74 20 65 72 72 6f 72 2c 20 74 68 61  cript error, tha
25280 74 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 0d 0a 20  t will almost.. 
25290 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
252a0 65 72 74 61 69 6e 6c 79 20 63 61 75 73 65 20 74  ertainly cause t
252b0 68 65 20 72 65 73 75 6c 74 20 74 6f 20 62 65 20  he result to be 
252c0 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 2c 20 74  a non-integer, t
252d0 68 69 73 20 66 61 69 6c 69 6e 67 0d 0a 20 20 20  his failing..   
252e0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
252f0 20 63 68 65 63 6b 20 62 65 6c 6f 77 2e 0d 0a 20   check below... 
25300 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25310 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
25320 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
25330 6b 65 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69 6e  ke Microsoft.Win
25340 33 32 2e 52 65 67 69 73 74 72 79 20 47 65 74 56  32.Registry GetV
25350 61 6c 75 65 20 24 6b 65 79 20 52 65 6c 65 61 73  alue $key Releas
25360 65 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  e null..        
25370 7d 20 72 65 6c 65 61 73 65 0d 0a 0d 0a 20 20 20  } release....   
25380 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
25390 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72   is integer -str
253a0 69 63 74 20 24 72 65 6c 65 61 73 65 5d 20 26 26  ict $release] &&
253b0 20 24 72 65 6c 65 61 73 65 20 3e 3d 20 33 37 38   $release >= 378
253c0 33 38 39 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  389} then {..   
253d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
253e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
253f0 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
25400 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
25410 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
25420 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
25430 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35  straint dotNet45
25440 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20 20  OrHigher....    
25450 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25460 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
25470 65 20 22 72 65 6c 65 61 73 65 22 20 76 61 6c 75  e "release" valu
25480 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
25490 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 33 37  n or equal to 37
254a0 38 37 35 38 0d 0a 20 20 20 20 20 20 20 20 20 20  8758..          
254b0 23 20 20 20 20 20 20 20 28 6f 72 20 33 37 38 36  #       (or 3786
254c0 37 35 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 38  75 for Windows 8
254d0 2e 31 29 2c 20 74 68 65 6e 20 74 68 65 20 2e 4e  .1), then the .N
254e0 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 34 2e 35  ET Framework 4.5
254f0 2e 31 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  .1..          # 
25500 20 20 20 20 20 20 69 73 20 69 6e 73 74 61 6c 6c        is install
25510 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  ed.  However, if
25520 20 74 68 65 20 22 72 65 6c 65 61 73 65 22 20 76   the "release" v
25530 61 6c 75 65 20 69 73 20 61 6c 73 6f 0d 0a 20 20  alue is also..  
25540 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
25550 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
25560 65 71 75 61 6c 20 74 6f 20 33 37 39 38 39 33 2c  equal to 379893,
25570 20 74 68 65 6e 20 74 68 65 20 2e 4e 45 54 20 46   then the .NET F
25580 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20  ramework..      
25590 20 20 20 20 23 20 20 20 20 20 20 20 34 2e 35 2e      #       4.5.
255a0 32 20 69 73 20 69 6e 73 74 61 6c 6c 65 64 2c 20  2 is installed, 
255b0 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e 2d 70  which is an in-p
255c0 6c 61 63 65 20 75 70 67 72 61 64 65 20 74 6f 20  lace upgrade to 
255d0 34 2e 35 2e 31 0d 0a 20 20 20 20 20 20 20 20 20  4.5.1..         
255e0 20 23 20 20 20 20 20 20 20 28 61 6e 64 20 34 2e   #       (and 4.
255f0 35 29 2e 20 20 49 66 20 74 68 65 20 22 72 65 6c  5).  If the "rel
25600 65 61 73 65 22 20 76 61 6c 75 65 20 69 73 20 61  ease" value is a
25610 6c 73 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  lso greater than
25620 20 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23   or..          #
25630 20 20 20 20 20 20 20 65 71 75 61 6c 20 74 6f 20         equal to 
25640 33 39 33 32 39 37 20 28 33 39 33 32 39 35 20 6f  393297 (393295 o
25650 6e 20 57 69 6e 64 6f 77 73 20 31 30 29 2c 20 74  n Windows 10), t
25660 68 65 6e 20 74 68 65 20 2e 4e 45 54 0d 0a 20 20  hen the .NET..  
25670 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
25680 46 72 61 6d 65 77 6f 72 6b 20 34 2e 36 20 69 73  Framework 4.6 is
25690 20 69 6e 73 74 61 6c 6c 65 64 2c 20 77 68 69 63   installed, whic
256a0 68 20 69 73 20 61 6e 20 69 6e 2d 70 6c 61 63 65  h is an in-place
256b0 20 75 70 67 72 61 64 65 0d 0a 20 20 20 20 20 20   upgrade..      
256c0 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 34      #       to 4
256d0 2e 35 2e 78 2e 20 20 53 69 6d 69 6c 61 72 20 68  .5.x.  Similar h
256e0 61 6e 64 6c 69 6e 67 20 69 73 20 6e 65 63 65 73  andling is neces
256f0 73 61 72 79 20 66 6f 72 20 74 68 65 20 2e 4e 45  sary for the .NE
25700 54 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  T..          #  
25710 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b 20 34       Framework 4
25720 2e 36 2e 31 2c 20 34 2e 36 2e 32 2c 20 34 2e 37  .6.1, 4.6.2, 4.7
25730 2c 20 34 2e 37 2e 31 2c 20 61 6e 64 20 34 2e 37  , 4.7.1, and 4.7
25740 2e 32 2e 20 20 46 6f 72 20 6d 6f 72 65 0d 0a 20  .2.  For more.. 
25750 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
25760 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65   information, se
25770 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e:..          #.
25780 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
25790 20 20 20 68 74 74 70 73 3a 2f 2f 6d 73 64 6e 2e     https://msdn.
257a0 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e  microsoft.com/en
257b0 2d 75 73 2f 6c 69 62 72 61 72 79 2f 68 68 39 32  -us/library/hh92
257c0 35 35 36 38 2e 61 73 70 78 0d 0a 20 20 20 20 20  5568.aspx..     
257d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
257e0 20 20 69 66 20 7b 24 72 65 6c 65 61 73 65 20 3e    if {$release >
257f0 3d 20 5b 67 65 74 46 72 61 6d 65 77 6f 72 6b 53  = [getFrameworkS
25800 65 74 75 70 34 37 32 56 61 6c 75 65 5d 7d 20 74  etup472Value]} t
25810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25820 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
25830 20 64 6f 74 4e 65 74 34 35 31 4f 72 48 69 67 68   dotNet451OrHigh
25840 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
25850 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
25860 74 4e 65 74 34 35 32 4f 72 48 69 67 68 65 72 0d  tNet452OrHigher.
25870 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
25880 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
25890 74 34 36 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  t46OrHigher..   
258a0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
258b0 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 31  traint dotNet461
258c0 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20  OrHigher..      
258d0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
258e0 69 6e 74 20 64 6f 74 4e 65 74 34 36 32 4f 72 48  int dotNet462OrH
258f0 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20  igher..         
25900 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
25910 20 64 6f 74 4e 65 74 34 37 4f 72 48 69 67 68 65   dotNet47OrHighe
25920 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  r..            a
25930 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
25940 4e 65 74 34 37 31 4f 72 48 69 67 68 65 72 0d 0a  Net471OrHigher..
25950 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
25960 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
25970 34 37 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  472..           
25980 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
25990 6f 74 4e 65 74 34 37 32 4f 72 48 69 67 68 65 72  otNet472OrHigher
259a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
259b0 73 65 74 20 76 65 72 73 69 6f 6e 20 34 2e 37 2e  set version 4.7.
259c0 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  2..          } e
259d0 6c 73 65 69 66 20 7b 24 72 65 6c 65 61 73 65 20  lseif {$release 
259e0 3e 3d 20 5b 67 65 74 46 72 61 6d 65 77 6f 72 6b  >= [getFramework
259f0 53 65 74 75 70 34 37 31 56 61 6c 75 65 5d 7d 20  Setup471Value]} 
25a00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25a10 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
25a20 74 20 64 6f 74 4e 65 74 34 35 31 4f 72 48 69 67  t dotNet451OrHig
25a30 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  her..           
25a40 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
25a50 6f 74 4e 65 74 34 35 32 4f 72 48 69 67 68 65 72  otNet452OrHigher
25a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
25a70 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
25a80 65 74 34 36 4f 72 48 69 67 68 65 72 0d 0a 20 20  et46OrHigher..  
25a90 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
25aa0 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36  straint dotNet46
25ab0 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20  1OrHigher..     
25ac0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
25ad0 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 32 4f 72  aint dotNet462Or
25ae0 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20  Higher..        
25af0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
25b00 74 20 64 6f 74 4e 65 74 34 37 4f 72 48 69 67 68  t dotNet47OrHigh
25b10 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
25b20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
25b30 74 4e 65 74 34 37 31 0d 0a 20 20 20 20 20 20 20  tNet471..       
25b40 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
25b50 6e 74 20 64 6f 74 4e 65 74 34 37 31 4f 72 48 69  nt dotNet471OrHi
25b60 67 68 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gher....        
25b70 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
25b80 34 2e 37 2e 31 0d 0a 20 20 20 20 20 20 20 20 20  4.7.1..         
25b90 20 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 6c 65   } elseif {$rele
25ba0 61 73 65 20 3e 3d 20 5b 67 65 74 46 72 61 6d 65  ase >= [getFrame
25bb0 77 6f 72 6b 53 65 74 75 70 34 37 56 61 6c 75 65  workSetup47Value
25bc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25bd0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
25be0 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 31 4f 72  aint dotNet451Or
25bf0 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20  Higher..        
25c00 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
25c10 74 20 64 6f 74 4e 65 74 34 35 32 4f 72 48 69 67  t dotNet452OrHig
25c20 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  her..           
25c30 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
25c40 6f 74 4e 65 74 34 36 4f 72 48 69 67 68 65 72 0d  otNet46OrHigher.
25c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
25c60 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
25c70 74 34 36 31 4f 72 48 69 67 68 65 72 0d 0a 20 20  t461OrHigher..  
25c80 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
25c90 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36  straint dotNet46
25ca0 32 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20  2OrHigher..     
25cb0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
25cc0 61 69 6e 74 20 64 6f 74 4e 65 74 34 37 0d 0a 20  aint dotNet47.. 
25cd0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
25ce0 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34  nstraint dotNet4
25cf0 37 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20  7OrHigher....   
25d00 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
25d10 73 69 6f 6e 20 34 2e 37 0d 0a 20 20 20 20 20 20  sion 4.7..      
25d20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 72      } elseif {$r
25d30 65 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74 46 72  elease >= [getFr
25d40 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 36 32 56  ameworkSetup462V
25d50 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
25d60 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
25d70 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34  nstraint dotNet4
25d80 35 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20  51OrHigher..    
25d90 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
25da0 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32 4f  raint dotNet452O
25db0 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20  rHigher..       
25dc0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
25dd0 6e 74 20 64 6f 74 4e 65 74 34 36 4f 72 48 69 67  nt dotNet46OrHig
25de0 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  her..           
25df0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
25e00 6f 74 4e 65 74 34 36 31 4f 72 48 69 67 68 65 72  otNet461OrHigher
25e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
25e20 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
25e30 65 74 34 36 32 0d 0a 20 20 20 20 20 20 20 20 20  et462..         
25e40 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
25e50 20 64 6f 74 4e 65 74 34 36 32 4f 72 48 69 67 68   dotNet462OrHigh
25e60 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  er....          
25e70 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 34 2e    set version 4.
25e80 36 2e 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  6.2..          }
25e90 20 65 6c 73 65 69 66 20 7b 24 72 65 6c 65 61 73   elseif {$releas
25ea0 65 20 3e 3d 20 5b 67 65 74 46 72 61 6d 65 77 6f  e >= [getFramewo
25eb0 72 6b 53 65 74 75 70 34 36 31 56 61 6c 75 65 5d  rkSetup461Value]
25ec0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25ed0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
25ee0 69 6e 74 20 64 6f 74 4e 65 74 34 35 31 4f 72 48  int dotNet451OrH
25ef0 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20  igher..         
25f00 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
25f10 20 64 6f 74 4e 65 74 34 35 32 4f 72 48 69 67 68   dotNet452OrHigh
25f20 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
25f30 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
25f40 74 4e 65 74 34 36 4f 72 48 69 67 68 65 72 0d 0a  tNet46OrHigher..
25f50 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
25f60 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
25f70 34 36 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20  461..           
25f80 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
25f90 6f 74 4e 65 74 34 36 31 4f 72 48 69 67 68 65 72  otNet461OrHigher
25fa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25fb0 73 65 74 20 76 65 72 73 69 6f 6e 20 34 2e 36 2e  set version 4.6.
25fc0 31 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  1..          } e
25fd0 6c 73 65 69 66 20 7b 24 72 65 6c 65 61 73 65 20  lseif {$release 
25fe0 3e 3d 20 5b 67 65 74 46 72 61 6d 65 77 6f 72 6b  >= [getFramework
25ff0 53 65 74 75 70 34 36 56 61 6c 75 65 5d 7d 20 74  Setup46Value]} t
26000 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26010 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
26020 20 64 6f 74 4e 65 74 34 35 31 4f 72 48 69 67 68   dotNet451OrHigh
26030 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
26040 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
26050 74 4e 65 74 34 35 32 4f 72 48 69 67 68 65 72 0d  tNet452OrHigher.
26060 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
26070 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
26080 74 34 36 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t46..           
26090 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
260a0 6f 74 4e 65 74 34 36 4f 72 48 69 67 68 65 72 0d  otNet46OrHigher.
260b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
260c0 65 74 20 76 65 72 73 69 6f 6e 20 34 2e 36 0d 0a  et version 4.6..
260d0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
260e0 69 66 20 7b 24 72 65 6c 65 61 73 65 20 3e 3d 20  if {$release >= 
260f0 33 37 39 38 39 33 7d 20 74 68 65 6e 20 7b 0d 0a  379893} then {..
26100 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
26110 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
26120 34 35 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  451OrHigher..   
26130 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
26140 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32  traint dotNet452
26150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
26160 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
26170 65 74 34 35 32 4f 72 48 69 67 68 65 72 0d 0a 0d  et452OrHigher...
26180 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
26190 20 76 65 72 73 69 6f 6e 20 34 2e 35 2e 32 0d 0a   version 4.5.2..
261a0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
261b0 69 66 20 7b 24 72 65 6c 65 61 73 65 20 3e 3d 20  if {$release >= 
261c0 5b 67 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74  [getFrameworkSet
261d0 75 70 34 35 31 56 61 6c 75 65 5d 7d 20 74 68 65  up451Value]} the
261e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
261f0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
26200 6f 74 4e 65 74 34 35 31 0d 0a 20 20 20 20 20 20  otNet451..      
26210 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
26220 69 6e 74 20 64 6f 74 4e 65 74 34 35 31 4f 72 48  int dotNet451OrH
26230 69 67 68 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  igher....       
26240 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
26250 20 34 2e 35 2e 31 0d 0a 20 20 20 20 20 20 20 20   4.5.1..        
26260 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
26270 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
26280 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 0d 0a  raint dotNet45..
26290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
262a0 74 20 76 65 72 73 69 6f 6e 20 34 2e 35 0d 0a 20  t version 4.5.. 
262b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
262c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
262d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
262e0 77 20 74 68 65 20 22 72 65 6c 65 61 73 65 22 20  w the "release" 
262f0 76 61 6c 75 65 20 77 65 20 66 6f 75 6e 64 20 69  value we found i
26300 6e 20 74 68 65 20 72 65 67 69 73 74 72 79 2e 0d  n the registry..
26310 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
26320 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
26330 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
26340 67 73 20 22 79 65 73 20 28 22 20 24 72 65 6c 65  gs "yes (" $rele
26350 61 73 65 20 22 2c 20 22 20 24 76 65 72 73 69 6f  ase ", " $versio
26360 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
26370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26380 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
26390 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
263a0 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
263b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
263c0 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
263d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
263e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
263f0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
26400 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
26410 63 6b 46 6f 72 56 69 73 75 61 6c 53 74 75 64 69  ckForVisualStudi
26420 6f 56 69 61 52 65 67 69 73 74 72 79 20 7b 20 63  oViaRegistry { c
26430 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
26440 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
26450 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
26460 66 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69  for Visual Studi
26470 6f 20 75 73 69 6e 67 20 72 65 67 69 73 74 72 79  o using registry
26480 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23  ... "....      #
26490 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
264a0 49 6e 69 74 69 61 6c 6c 79 2c 20 6e 6f 20 76 65  Initially, no ve
264b0 72 73 69 6f 6e 73 20 6f 66 20 56 69 73 75 61 6c  rsions of Visual
264c0 20 53 74 75 64 69 6f 20 68 61 76 65 20 62 65 65   Studio have bee
264d0 6e 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  n found...      
264e0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 76 69 73  #..      set vis
264f0 75 61 6c 53 74 75 64 69 6f 56 65 72 73 69 6f 6e  ualStudioVersion
26500 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
26510 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
26520 45 3a 20 50 6c 61 74 66 6f 72 6d 20 6d 75 73 74  E: Platform must
26530 20 62 65 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   be Windows for 
26540 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
26550 74 6f 20 65 76 65 6e 20 62 65 0d 0a 20 20 20 20  to even be..    
26560 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 65    #       checke
26570 64 20 28 69 2e 65 2e 20 77 65 20 72 65 71 75 69  d (i.e. we requi
26580 72 65 20 74 68 65 20 72 65 67 69 73 74 72 79 29  re the registry)
26590 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
265a0 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
265b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
265c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
265d0 4e 4f 54 45 3a 20 52 65 67 69 73 74 72 79 20 68  NOTE: Registry h
265e0 69 76 65 20 77 68 65 72 65 20 56 69 73 75 61 6c  ive where Visual
265f0 20 53 74 75 64 69 6f 20 69 6e 73 74 61 6c 6c 20   Studio install 
26600 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 0d 0a  information is..
26610 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26620 73 74 6f 72 65 64 2e 20 20 4d 61 6b 65 20 73 75  stored.  Make su
26630 72 65 20 74 6f 20 6c 6f 6f 6b 20 69 6e 20 74 68  re to look in th
26640 65 20 57 6f 57 36 34 20 72 65 67 69 73 74 72 79  e WoW64 registry
26650 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20   because..      
26660 20 20 23 20 20 20 20 20 20 20 56 69 73 75 61 6c    #       Visual
26670 20 53 74 75 64 69 6f 20 69 73 20 63 75 72 72 65   Studio is curre
26680 6e 74 6c 79 20 61 6c 77 61 79 73 20 61 20 33 32  ntly always a 32
26690 2d 62 69 74 20 61 70 70 6c 69 63 61 74 69 6f 6e  -bit application
266a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
266b0 20 20 20 20 20 20 73 65 74 20 6b 65 79 20 5b 61        set key [a
266c0 70 70 65 6e 64 41 72 67 73 20 48 4b 45 59 5f 4c  ppendArgs HKEY_L
266d0 4f 43 41 4c 5f 4d 41 43 48 49 4e 45 5c 5c 20 5c  OCAL_MACHINE\\ \
266e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
266f0 65 74 53 6f 66 74 77 61 72 65 52 65 67 69 73 74  etSoftwareRegist
26700 72 79 4b 65 79 20 74 72 75 65 5d 20 7b 5c 4d 69  ryKey true] {\Mi
26710 63 72 6f 73 6f 66 74 5c 56 69 73 75 61 6c 53 74  crosoft\VisualSt
26720 75 64 69 6f 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  udio}]....      
26730 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
26740 4f 54 45 3a 20 54 68 65 20 76 65 72 73 69 6f 6e  OTE: The version
26750 73 20 6f 66 20 56 69 73 75 61 6c 20 53 74 75 64  s of Visual Stud
26760 69 6f 20 74 68 61 74 20 77 65 20 73 75 70 70 6f  io that we suppo
26770 72 74 20 64 65 74 65 63 74 69 6f 6e 0d 0a 20 20  rt detection..  
26780 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
26790 20 75 73 69 6e 67 20 74 68 65 20 72 65 67 69 73   using the regis
267a0 74 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  try...        #.
267b0 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72  .        set ver
267c0 73 69 6f 6e 73 20 5b 6c 69 73 74 20 5b 6c 69 73  sions [list [lis
267d0 74 20 38 2e 30 20 32 30 30 35 5d 20 5b 6c 69 73  t 8.0 2005] [lis
267e0 74 20 39 2e 30 20 32 30 30 38 5d 20 5c 0d 0a 20  t 9.0 2008] \.. 
267f0 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74             [list
26800 20 31 30 2e 30 20 32 30 31 30 5d 20 5b 6c 69 73   10.0 2010] [lis
26810 74 20 31 31 2e 30 20 32 30 31 32 5d 20 5b 6c 69  t 11.0 2012] [li
26820 73 74 20 31 32 2e 30 20 32 30 31 33 5d 20 5c 0d  st 12.0 2013] \.
26830 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69  .            [li
26840 73 74 20 31 34 2e 30 20 32 30 31 35 5d 5d 0d 0a  st 14.0 2015]]..
26850 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26860 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
26870 63 6b 20 65 61 63 68 20 76 65 72 73 69 6f 6e 20  ck each version 
26880 61 6e 64 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  and keep track o
26890 66 20 74 68 65 20 6f 6e 65 73 20 77 65 20 66 69  f the ones we fi
268a0 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  nd...        #..
268b0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
268c0 76 65 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e  version $version
268d0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  s {..          #
268e0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
268f0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
26900 65 74 63 68 20 74 68 65 20 56 69 73 75 61 6c 20  etch the Visual 
26910 53 74 75 64 69 6f 20 69 6e 73 74 61 6c 6c 20 64  Studio install d
26920 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
26930 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
26940 65 20 66 72 6f 6d 20 74 68 65 20 72 65 67 69 73  e from the regis
26950 74 72 79 2c 20 72 65 6d 6f 76 69 6e 67 20 74 68  try, removing th
26960 65 20 74 72 61 69 6c 69 6e 67 20 62 61 63 6b 73  e trailing backs
26970 6c 61 73 68 2c 0d 0a 20 20 20 20 20 20 20 20 20  lash,..         
26980 20 23 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e   #       if any.
26990 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
269a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
269b0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
269c0 20 20 20 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a     file normaliz
269d0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 73 74  e [file join [st
269e0 72 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20 5b  ring trimright [
269f0 6f 62 6a 65 63 74 20 5c 0d 0a 20 20 20 20 20 20  object \..      
26a00 20 20 20 20 20 20 20 20 20 20 69 6e 76 6f 6b 65            invoke
26a10 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33 32   Microsoft.Win32
26a20 2e 52 65 67 69 73 74 72 79 20 47 65 74 56 61 6c  .Registry GetVal
26a30 75 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  ue [appendArgs \
26a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26a50 20 20 24 6b 65 79 20 5c 5c 20 5b 6c 69 6e 64 65    $key \\ [linde
26a60 78 20 24 76 65 72 73 69 6f 6e 20 30 5d 5d 20 49  x $version 0]] I
26a70 6e 73 74 61 6c 6c 44 69 72 20 6e 75 6c 6c 5d 20  nstallDir null] 
26a80 5c 5c 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \\] \..         
26a90 20 20 20 20 20 20 20 6d 73 65 6e 76 2e 64 6c 6c         msenv.dll
26aa0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 66  ]..          } f
26ab0 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  ileName] == 0} t
26ac0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
26ae0 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74    # NOTE: Does t
26af0 68 65 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  he directory nam
26b00 65 20 6c 6f 6f 6b 20 76 61 6c 69 64 20 61 6e 64  e look valid and
26b10 20 64 6f 65 73 20 69 74 0d 0a 20 20 20 20 20 20   does it..      
26b20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 63        #       ac
26b30 74 75 61 6c 6c 79 20 65 78 69 73 74 3f 0d 0a 20  tually exist?.. 
26b40 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
26b50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
26b60 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
26b70 6c 65 4e 61 6d 65 5d 20 3e 20 30 20 26 26 20 5c  leName] > 0 && \
26b80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26b90 20 20 5b 66 69 6c 65 20 69 73 66 69 6c 65 20 24    [file isfile $
26ba0 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
26bb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26bc0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
26bd0 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
26be0 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
26bf0 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  t is available..
26c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
26c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26c20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
26c30 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
26c50 69 73 75 61 6c 53 74 75 64 69 6f 20 5b 6c 69 6e  isualStudio [lin
26c60 64 65 78 20 24 76 65 72 73 69 6f 6e 20 31 5d 5d  dex $version 1]]
26c70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26c80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
26c90 20 20 20 23 20 4e 4f 54 45 3a 20 4b 65 65 70 20     # NOTE: Keep 
26ca0 74 72 61 63 6b 20 6f 66 20 61 6c 6c 20 74 68 65  track of all the
26cb0 20 76 65 72 73 69 6f 6e 73 20 74 68 61 74 20 77   versions that w
26cc0 65 20 66 69 6e 64 2e 0d 0a 20 20 20 20 20 20 20  e find...       
26cd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26ce0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
26cf0 76 69 73 75 61 6c 53 74 75 64 69 6f 56 65 72 73  visualStudioVers
26d00 69 6f 6e 73 20 5b 6c 69 6e 64 65 78 20 24 76 65  ions [lindex $ve
26d10 72 73 69 6f 6e 20 31 5d 0d 0a 0d 0a 20 20 20 20  rsion 1]....    
26d20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26d30 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
26d40 45 3a 20 53 61 76 65 20 74 68 65 20 64 69 72 65  E: Save the dire
26d50 63 74 6f 72 79 20 66 6f 72 20 6c 61 74 65 72 20  ctory for later 
26d60 75 73 61 67 65 20 62 79 20 74 68 65 20 74 65 73  usage by the tes
26d70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
26d80 20 23 20 20 20 20 20 20 20 73 75 69 74 65 20 69   #       suite i
26d90 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20  tself...        
26da0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26db0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
26dc0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65  o exists ::no(se
26dd0 74 56 69 73 75 61 6c 53 74 75 64 69 6f 29 5d 7d  tVisualStudio)]}
26de0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26df0 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
26e00 65 73 74 5f 76 69 73 75 61 6c 5f 73 74 75 64 69  est_visual_studi
26e10 6f 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  o [file dirname 
26e20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
26e30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
26e40 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
26e50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26e60 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
26e70 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
26e80 68 20 24 76 69 73 75 61 6c 53 74 75 64 69 6f 56  h $visualStudioV
26e90 65 72 73 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68  ersions] > 0} th
26ea0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
26eb0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
26ec0 20 53 68 6f 77 20 77 68 65 72 65 20 77 65 20 66   Show where we f
26ed0 6f 75 6e 64 20 74 68 65 20 6c 61 74 65 73 74 20  ound the latest 
26ee0 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  version...      
26ef0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
26f00 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
26f10 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
26f20 20 20 20 20 20 20 20 22 79 65 73 20 28 22 20 24         "yes (" $
26f30 76 69 73 75 61 6c 53 74 75 64 69 6f 56 65 72 73  visualStudioVers
26f40 69 6f 6e 73 20 22 2c 20 5c 22 22 20 5c 0d 0a 20  ions ", \"" \.. 
26f50 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
26f60 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
26f70 3a 74 65 73 74 5f 76 69 73 75 61 6c 5f 73 74 75  :test_visual_stu
26f80 64 69 6f 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  dio] ? \..      
26f90 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 65 73            $::tes
26fa0 74 5f 76 69 73 75 61 6c 5f 73 74 75 64 69 6f 20  t_visual_studio 
26fb0 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 22 5c 22  : "<none>"}] "\"
26fc0 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
26fd0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
26fe0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
26ff0 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
27000 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
27010 63 68 65 63 6b 46 6f 72 4e 61 74 69 76 65 44 65  checkForNativeDe
27020 62 75 67 67 65 72 20 7b 20 63 68 61 6e 6e 65 6c  bugger { channel
27030 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
27040 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
27050 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6e 61   checking for na
27060 74 69 76 65 20 64 65 62 75 67 67 65 72 2e 2e 2e  tive debugger...
27070 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
27080 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
27090 74 68 65 20 6e 61 74 69 76 65 20 64 65 62 75 67  the native debug
270a0 67 65 72 20 70 72 65 73 65 6e 74 3f 0d 0a 20 20  ger present?..  
270b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
270c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
270d0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
270e0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
270f0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
27100 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
27110 6e 74 73 2e 50 72 69 76 61 74 65 2e 4e 61 74 69  nts.Private.Nati
27120 76 65 4f 70 73 2b 53 61 66 65 4e 61 74 69 76 65  veOps+SafeNative
27130 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
27140 20 20 20 20 20 20 20 49 73 44 65 62 75 67 67 65         IsDebugge
27150 72 50 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20  rPresent..      
27160 7d 20 70 72 65 73 65 6e 74 5d 20 3d 3d 20 30 20  } present] == 0 
27170 26 26 20 24 70 72 65 73 65 6e 74 7d 20 74 68 65  && $present} the
27180 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
27190 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
271a0 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
271b0 74 68 61 74 20 69 74 20 69 73 20 70 72 65 73 65  that it is prese
271c0 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  nt...        #..
271d0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
271e0 72 61 69 6e 74 20 6e 61 74 69 76 65 44 65 62 75  raint nativeDebu
271f0 67 67 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gger....        
27200 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
27210 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
27220 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
27230 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
27240 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
27250 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
27260 68 65 63 6b 46 6f 72 4d 61 6e 61 67 65 64 44 65  heckForManagedDe
27270 62 75 67 67 65 72 20 7b 20 63 68 61 6e 6e 65 6c  bugger { channel
27280 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
27290 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
272a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6d 61   checking for ma
272b0 6e 61 67 65 64 20 64 65 62 75 67 67 65 72 2e 2e  naged debugger..
272c0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  . "....      #..
272d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73        # NOTE: Is
272e0 20 74 68 65 20 6d 61 6e 61 67 65 64 20 64 65 62   the managed deb
272f0 75 67 67 65 72 20 61 74 74 61 63 68 65 64 3f 0d  ugger attached?.
27300 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27310 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
27320 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
27330 6f 6b 65 20 53 79 73 74 65 6d 2e 44 69 61 67 6e  oke System.Diagn
27340 6f 73 74 69 63 73 2e 44 65 62 75 67 67 65 72 20  ostics.Debugger 
27350 49 73 41 74 74 61 63 68 65 64 0d 0a 20 20 20 20  IsAttached..    
27360 20 20 7d 20 61 74 74 61 63 68 65 64 5d 20 3d 3d    } attached] ==
27370 20 30 20 26 26 20 24 61 74 74 61 63 68 65 64 7d   0 && $attached}
27380 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27390 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
273a0 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65  TE: Yes, it appe
273b0 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61  ars that it is a
273c0 74 74 61 63 68 65 64 2e 0d 0a 20 20 20 20 20 20  ttached...      
273d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
273e0 43 6f 6e 73 74 72 61 69 6e 74 20 6d 61 6e 61 67  Constraint manag
273f0 65 64 44 65 62 75 67 67 65 72 0d 0a 0d 0a 20 20  edDebugger....  
27400 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
27410 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
27420 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
27430 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
27440 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
27450 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
27460 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 63 72  proc checkForScr
27470 69 70 74 44 65 62 75 67 67 65 72 20 7b 20 63 68  iptDebugger { ch
27480 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
27490 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
274a0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
274b0 6f 72 20 73 63 72 69 70 74 20 64 65 62 75 67 67  or script debugg
274c0 65 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  er... "....     
274d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
274e0 3a 20 49 73 20 74 68 65 20 73 63 72 69 70 74 20  : Is the script 
274f0 64 65 62 75 67 67 65 72 20 61 76 61 69 6c 61 62  debugger availab
27500 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le?..      #..  
27510 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
27520 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
27530 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
27540 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
27550 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
27560 44 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20  Debugger..      
27570 7d 20 64 65 62 75 67 67 65 72 5d 20 3d 3d 20 30  } debugger] == 0
27580 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27590 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
275a0 4f 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 6f  OTE: We do not o
275b0 77 6e 20 74 68 69 73 2c 20 64 6f 20 6e 6f 74 20  wn this, do not 
275c0 64 69 73 70 6f 73 65 20 69 74 2e 0d 0a 20 20 20  dispose it...   
275d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
275e0 69 66 20 7b 5b 69 73 4e 6f 6e 4e 75 6c 6c 4f 62  if {[isNonNullOb
275f0 6a 65 63 74 48 61 6e 64 6c 65 20 24 64 65 62 75  jectHandle $debu
27600 67 67 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gger]} then {.. 
27610 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
27620 6f 62 6a 65 63 74 20 66 6c 61 67 73 20 24 64 65  object flags $de
27630 62 75 67 67 65 72 20 2b 4e 6f 44 69 73 70 6f 73  bugger +NoDispos
27640 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  e}..        }...
27650 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65  .        if {[re
27660 67 65 78 70 20 2d 2d 20 7b 5e 44 65 62 75 67 67  gexp -- {^Debugg
27670 65 72 23 5c 64 2b 24 7d 20 24 64 65 62 75 67 67  er#\d+$} $debugg
27680 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  er]} then {..   
27690 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
276a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
276b0 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
276c0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
276d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
276e0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
276f0 73 74 72 61 69 6e 74 20 73 63 72 69 70 74 44 65  straint scriptDe
27700 62 75 67 67 65 72 0d 0a 0d 0a 20 20 20 20 20 20  bugger....      
27710 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
27720 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
27730 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27740 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
27750 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
27760 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
27770 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27780 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
27790 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
277a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
277b0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
277c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
277d0 63 6b 46 6f 72 53 63 72 69 70 74 44 65 62 75 67  ckForScriptDebug
277e0 67 65 72 49 6e 74 65 72 70 72 65 74 65 72 20 7b  gerInterpreter {
277f0 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
27800 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
27810 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
27820 67 20 66 6f 72 20 73 63 72 69 70 74 20 64 65 62  g for script deb
27830 75 67 67 65 72 20 69 6e 74 65 72 70 72 65 74 65  ugger interprete
27840 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
27850 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
27860 20 49 73 20 74 68 65 20 73 63 72 69 70 74 20 64   Is the script d
27870 65 62 75 67 67 65 72 20 69 6e 74 65 72 70 72 65  ebugger interpre
27880 74 65 72 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  ter available?..
27890 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
278a0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
278b0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
278c0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
278d0 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
278e0 2e 47 65 74 41 63 74 69 76 65 20 44 65 62 75 67  .GetActive Debug
278f0 67 65 72 0d 0a 20 20 20 20 20 20 7d 20 64 65 62  ger..      } deb
27900 75 67 67 65 72 5d 20 3d 3d 20 30 7d 20 74 68 65  ugger] == 0} the
27910 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
27920 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
27930 57 65 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68  We do not own th
27940 69 73 2c 20 64 6f 20 6e 6f 74 20 64 69 73 70 6f  is, do not dispo
27950 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
27960 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
27970 69 73 4e 6f 6e 4e 75 6c 6c 4f 62 6a 65 63 74 48  isNonNullObjectH
27980 61 6e 64 6c 65 20 24 64 65 62 75 67 67 65 72 5d  andle $debugger]
27990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
279a0 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63      catch {objec
279b0 74 20 66 6c 61 67 73 20 24 64 65 62 75 67 67 65  t flags $debugge
279c0 72 20 2b 4e 6f 44 69 73 70 6f 73 65 7d 0d 0a 20  r +NoDispose}.. 
279d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
279e0 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
279f0 2d 2d 20 7b 5e 44 65 62 75 67 67 65 72 23 5c 64  -- {^Debugger#\d
27a00 2b 24 7d 20 24 64 65 62 75 67 67 65 72 5d 20 26  +$} $debugger] &
27a10 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27a20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20   [catch {object 
27a30 69 6e 76 6f 6b 65 20 24 64 65 62 75 67 67 65 72  invoke $debugger
27a40 20 49 6e 74 65 72 70 72 65 74 65 72 7d 20 69 6e   Interpreter} in
27a50 74 65 72 70 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  terp] == 0} then
27a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
27a70 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
27a80 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 6f 77 6e  E: We do not own
27a90 20 74 68 69 73 2c 20 64 6f 20 6e 6f 74 20 64 69   this, do not di
27aa0 73 70 6f 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  spose it...     
27ab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27ac0 20 20 69 66 20 7b 5b 69 73 4e 6f 6e 4e 75 6c 6c    if {[isNonNull
27ad0 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 69 6e  ObjectHandle $in
27ae0 74 65 72 70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  terp]} then {.. 
27af0 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
27b00 20 7b 6f 62 6a 65 63 74 20 66 6c 61 67 73 20 24   {object flags $
27b10 69 6e 74 65 72 70 20 2b 4e 6f 44 69 73 70 6f 73  interp +NoDispos
27b20 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e}..          }.
27b30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
27b40 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e 49 6e  {[regexp -- {^In
27b50 74 65 72 70 72 65 74 65 72 23 5c 64 2b 24 7d 20  terpreter#\d+$} 
27b60 24 69 6e 74 65 72 70 5d 7d 20 74 68 65 6e 20 7b  $interp]} then {
27b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
27b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
27b90 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70  OTE: Yes, it app
27ba0 65 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20  ears that it is 
27bb0 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
27bc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27bd0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
27be0 61 69 6e 74 20 73 63 72 69 70 74 44 65 62 75 67  aint scriptDebug
27bf0 67 65 72 49 6e 74 65 72 70 72 65 74 65 72 0d 0a  gerInterpreter..
27c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
27c10 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
27c20 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  \n....          
27c30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
27c40 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
27c50 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72  done here, retur
27c60 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  n now...        
27c70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27c80 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
27c90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
27ca0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
27cb0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
27cc0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
27cd0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
27ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27cf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d20 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
27d30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d40 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f  #### END Eagle O
27d50 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
27d60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d70 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
27d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27da0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27db0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27dc0 23 23 23 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d  ###..  } else {.
27dd0 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
27de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27df0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e20 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
27e30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e40 23 23 23 20 42 45 47 49 4e 20 54 63 6c 20 4f 4e  ### BEGIN Tcl ON
27e50 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23  LY #############
27e60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e70 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
27e80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27ea0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27eb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27ec0 23 23 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ##....    #..   
27ed0 20 23 20 4e 4f 54 45 3a 20 57 65 20 6e 65 65 64   # NOTE: We need
27ee0 20 73 65 76 65 72 61 6c 20 6f 66 20 6f 75 72 20   several of our 
27ef0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
27f00 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 73  related commands
27f10 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 23 20 20   in the..    #  
27f20 20 20 20 20 20 67 6c 6f 62 61 6c 20 6e 61 6d 65       global name
27f30 73 70 61 63 65 2e 0d 0a 20 20 20 20 23 0d 0a 20  space...    #.. 
27f40 20 20 20 65 78 70 6f 72 74 41 6e 64 49 6d 70 6f     exportAndImpo
27f50 72 74 50 61 63 6b 61 67 65 43 6f 6d 6d 61 6e 64  rtPackageCommand
27f60 73 20 5b 6e 61 6d 65 73 70 61 63 65 20 63 75 72  s [namespace cur
27f70 72 65 6e 74 5d 20 5b 6c 69 73 74 20 5c 0d 0a 20  rent] [list \.. 
27f80 20 20 20 20 20 20 20 67 65 74 4b 6e 6f 77 6e 42         getKnownB
27f90 75 69 6c 64 54 79 70 65 73 20 67 65 74 4b 6e 6f  uildTypes getKno
27fa0 77 6e 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  wnCompileOptions
27fb0 20 67 65 74 4b 6e 6f 77 6e 4d 6f 6e 6f 56 65 72   getKnownMonoVer
27fc0 73 69 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20  sions \..       
27fd0 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e   addKnownMonoCon
27fe0 73 74 72 61 69 6e 74 73 20 67 65 74 44 6f 74 4e  straints getDotN
27ff0 65 74 43 6f 72 65 4c 69 62 50 61 74 68 44 69 72  etCoreLibPathDir
28000 65 63 74 6f 72 79 4e 61 6d 65 4f 6e 6c 79 20 5c  ectoryNameOnly \
28010 0d 0a 20 20 20 20 20 20 20 20 6c 70 65 72 6d 75  ..        lpermu
28020 74 65 20 61 6c 77 61 79 73 46 75 6c 6c 49 6e 74  te alwaysFullInt
28030 65 72 70 52 65 61 64 79 20 63 61 6e 45 78 65 63  erpReady canExec
28040 43 6f 6d 53 70 65 63 20 63 61 6e 45 78 65 63 57  ComSpec canExecW
28050 68 6f 41 6d 49 20 5c 0d 0a 20 20 20 20 20 20 20  hoAmI \..       
28060 20 63 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c   canExecTclShell
28070 20 63 61 6e 45 78 65 63 46 6f 73 73 69 6c 20 63   canExecFossil c
28080 61 6e 45 78 65 63 56 73 57 68 65 72 65 20 69 73  anExecVsWhere is
28090 54 65 73 74 4d 6f 6e 6f 20 5c 0d 0a 20 20 20 20  TestMono \..    
280a0 20 20 20 20 69 73 54 65 73 74 44 6f 74 4e 65 74      isTestDotNet
280b0 43 6f 72 65 20 69 73 54 65 73 74 41 64 6d 69 6e  Core isTestAdmin
280c0 69 73 74 72 61 74 6f 72 20 63 61 6e 50 69 6e 67  istrator canPing
280d0 20 63 6c 65 61 6e 43 6f 6e 73 74 72 61 69 6e 74   cleanConstraint
280e0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
280f0 63 6c 65 61 6e 50 61 63 6b 61 67 65 4e 61 6d 65  cleanPackageName
28100 20 68 61 76 65 54 63 6c 50 6c 61 74 66 6f 72 6d   haveTclPlatform
28110 4f 73 45 78 74 72 61 55 70 64 61 74 65 4e 61 6d  OsExtraUpdateNam
28120 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65  e \..        che
28130 63 6b 46 6f 72 54 65 73 74 53 75 69 74 65 46 69  ckForTestSuiteFi
28140 6c 65 73 20 63 68 65 63 6b 46 6f 72 50 6c 61 74  les checkForPlat
28150 66 6f 72 6d 20 63 68 65 63 6b 46 6f 72 57 69 6e  form checkForWin
28160 64 6f 77 73 56 65 72 73 69 6f 6e 20 5c 0d 0a 20  dowsVersion \.. 
28170 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 4f         checkForO
28180 70 65 72 61 74 69 6e 67 53 79 73 74 65 6d 55 70  peratingSystemUp
28190 64 61 74 65 20 63 68 65 63 6b 46 6f 72 53 63 72  date checkForScr
281a0 69 70 74 4c 69 62 72 61 72 79 20 63 68 65 63 6b  iptLibrary check
281b0 46 6f 72 56 61 72 69 61 62 6c 65 20 5c 0d 0a 20  ForVariable \.. 
281c0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 54         checkForT
281d0 63 6c 4f 70 74 69 6f 6e 73 20 63 68 65 63 6b 46  clOptions checkF
281e0 6f 72 57 69 6e 64 6f 77 73 43 6f 6d 6d 61 6e 64  orWindowsCommand
281f0 50 72 6f 63 65 73 73 6f 72 20 63 68 65 63 6b 46  Processor checkF
28200 6f 72 50 61 63 6b 61 67 65 20 5c 0d 0a 20 20 20  orPackage \..   
28210 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 6f 73       checkForFos
28220 73 69 6c 20 63 68 65 63 6b 46 6f 72 56 69 73 75  sil checkForVisu
28230 61 6c 53 74 75 64 69 6f 56 69 61 56 73 57 68 65  alStudioViaVsWhe
28240 72 65 20 63 68 65 63 6b 46 6f 72 45 61 67 6c 65  re checkForEagle
28250 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   \..        chec
28260 6b 46 6f 72 53 79 6d 62 6f 6c 73 20 63 68 65 63  kForSymbols chec
28270 6b 46 6f 72 4c 6f 67 46 69 6c 65 20 63 68 65 63  kForLogFile chec
28280 6b 46 6f 72 47 61 72 75 64 61 20 63 68 65 63 6b  kForGaruda check
28290 46 6f 72 53 68 65 6c 6c 20 5c 0d 0a 20 20 20 20  ForShell \..    
282a0 20 20 20 20 63 68 65 63 6b 46 6f 72 4f 66 66 69      checkForOffi
282b0 63 69 61 6c 53 74 61 62 6c 65 52 65 6c 65 61 73  cialStableReleas
282c0 65 49 6e 50 72 6f 67 72 65 73 73 20 63 68 65 63  eInProgress chec
282d0 6b 46 6f 72 44 65 62 75 67 20 63 68 65 63 6b 46  kForDebug checkF
282e0 6f 72 54 6b 20 5c 0d 0a 20 20 20 20 20 20 20 20  orTk \..        
282f0 63 68 65 63 6b 46 6f 72 56 65 72 73 69 6f 6e 20  checkForVersion 
28300 63 68 65 63 6b 46 6f 72 43 6f 6d 6d 61 6e 64 20  checkForCommand 
28310 63 68 65 63 6b 46 6f 72 53 75 62 43 6f 6d 6d 61  checkForSubComma
28320 6e 64 20 63 68 65 63 6b 46 6f 72 4e 61 6d 65 73  nd checkForNames
28330 70 61 63 65 73 20 5c 0d 0a 20 20 20 20 20 20 20  paces \..       
28340 20 63 68 65 63 6b 46 6f 72 54 65 73 74 45 78 65   checkForTestExe
28350 63 20 63 68 65 63 6b 46 6f 72 54 65 73 74 4d 61  c checkForTestMa
28360 63 68 69 6e 65 20 63 68 65 63 6b 46 6f 72 54 65  chine checkForTe
28370 73 74 50 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20  stPlatform \..  
28380 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 54 65        checkForTe
28390 73 74 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  stConfiguration 
283a0 63 68 65 63 6b 46 6f 72 54 65 73 74 53 75 66 66  checkForTestSuff
283b0 69 78 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20  ix checkForFile 
283c0 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  \..        check
283d0 46 6f 72 50 61 74 68 46 69 6c 65 20 63 68 65 63  ForPathFile chec
283e0 6b 46 6f 72 4e 61 74 69 76 65 43 6f 64 65 20 63  kForNativeCode c
283f0 68 65 63 6b 46 6f 72 54 69 70 31 32 37 20 63 68  heckForTip127 ch
28400 65 63 6b 46 6f 72 54 69 70 31 39 34 20 5c 0d 0a  eckForTip194 \..
28410 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
28420 54 69 70 32 30 37 20 63 68 65 63 6b 46 6f 72 54  Tip207 checkForT
28430 69 70 32 34 31 20 63 68 65 63 6b 46 6f 72 54 69  ip241 checkForTi
28440 70 32 38 35 20 63 68 65 63 6b 46 6f 72 54 69 70  p285 checkForTip
28450 34 30 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 63  405 \..        c
28460 68 65 63 6b 46 6f 72 54 69 70 34 32 31 20 63 68  heckForTip421 ch
28470 65 63 6b 46 6f 72 54 69 70 34 32 36 20 63 68 65  eckForTip426 che
28480 63 6b 46 6f 72 54 69 70 34 32 39 20 63 68 65 63  ckForTip429 chec
28490 6b 46 6f 72 54 69 70 34 34 30 20 5c 0d 0a 20 20  kForTip440 \..  
284a0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 54 69        checkForTi
284b0 70 34 36 31 20 63 68 65 63 6b 46 6f 72 54 69 70  p461 checkForTip
284c0 34 36 33 20 63 68 65 63 6b 46 6f 72 54 69 70 34  463 checkForTip4
284d0 37 31 20 63 68 65 63 6b 46 6f 72 54 69 6d 69 6e  71 checkForTimin
284e0 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65  g \..        che
284f0 63 6b 46 6f 72 50 65 72 66 6f 72 6d 61 6e 63 65  ckForPerformance
28500 20 63 68 65 63 6b 46 6f 72 42 69 67 4c 69 73 74   checkForBigList
28510 73 20 63 68 65 63 6b 46 6f 72 50 72 6f 63 65 73  s checkForProces
28520 73 6f 72 49 6e 74 65 6e 73 69 76 65 20 5c 0d 0a  sorIntensive \..
28530 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
28540 54 69 6d 65 49 6e 74 65 6e 73 69 76 65 20 63 68  TimeIntensive ch
28550 65 63 6b 46 6f 72 46 75 6c 6c 54 65 73 74 20 63  eckForFullTest c
28560 68 65 63 6b 46 6f 72 4d 65 6d 6f 72 79 49 6e 74  heckForMemoryInt
28570 65 6e 73 69 76 65 20 5c 0d 0a 20 20 20 20 20 20  ensive \..      
28580 20 20 63 68 65 63 6b 46 6f 72 53 74 61 63 6b 49    checkForStackI
28590 6e 74 65 6e 73 69 76 65 20 63 68 65 63 6b 46 6f  ntensive checkFo
285a0 72 53 74 61 63 6b 53 69 7a 65 20 63 68 65 63 6b  rStackSize check
285b0 46 6f 72 49 6e 74 65 72 61 63 74 69 76 65 20 5c  ForInteractive \
285c0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
285d0 6f 72 49 6e 74 65 72 61 63 74 69 76 65 43 6f 6d  orInteractiveCom
285e0 6d 61 6e 64 20 63 68 65 63 6b 46 6f 72 55 73 65  mand checkForUse
285f0 72 49 6e 74 65 72 61 63 74 69 6f 6e 20 63 68 65  rInteraction che
28600 63 6b 46 6f 72 4e 65 74 77 6f 72 6b 20 5c 0d 0a  ckForNetwork \..
28610 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
28620 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 63 68  CompileOption ch
28630 65 63 6b 46 6f 72 4b 6e 6f 77 6e 43 6f 6d 70 69  eckForKnownCompi
28640 6c 65 4f 70 74 69 6f 6e 73 5d 20 66 61 6c 73 65  leOptions] false
28650 20 66 61 6c 73 65 0d 0a 0d 0a 20 20 20 20 23 23   false....    ##
28660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28670 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28680 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28690 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
286a0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
286b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
286c0 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
286d0 44 20 54 63 6c 20 4f 4e 4c 59 20 23 23 23 23 23  D Tcl ONLY #####
286e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
286f0 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
28700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28730 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28740 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d  ###########..  }
28750 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  .....  #..  # NO
28760 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20  TE: Provide the 
28770 45 61 67 6c 65 20 22 74 65 73 74 20 63 6f 6e 73  Eagle "test cons
28780 74 72 61 69 6e 74 73 22 20 70 61 63 6b 61 67 65  traints" package
28790 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
287a0 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
287b0 6b 61 67 65 20 70 72 6f 76 69 64 65 20 45 61 67  kage provide Eag
287c0 6c 65 2e 54 65 73 74 2e 43 6f 6e 73 74 72 61 69  le.Test.Constrai
287d0 6e 74 73 20 5c 0d 0a 20 20 20 20 5b 65 78 70 72  nts \..    [expr
287e0 20 7b 5b 69 73 45 61 67 6c 65 5d 20 3f 20 5b 69   {[isEagle] ? [i
287f0 6e 66 6f 20 65 6e 67 69 6e 65 20 50 61 74 63 68  nfo engine Patch
28800 4c 65 76 65 6c 5d 20 3a 20 22 31 2e 30 22 7d 5d  Level] : "1.0"}]
28810 0d 0a 7d 0d 0a 0c                                ..}...