System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact fde029097ff6973fd1a0603b84991c371bfbacb9:


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 46 4f 52 43 45 5f 54 52 41 43 45 20      FORCE_TRACE 
07f0: 48 41 56 45 5f 53 49 5a 45 4f 46 20 48 49 53 54  HAVE_SIZEOF HIST
0800: 4f 52 59 20 49 41 36 34 20 49 4e 54 45 52 41 43  ORY IA64 INTERAC
0810: 54 49 56 45 5f 43 4f 4d 4d 41 4e 44 53 20 5c 0d  TIVE_COMMANDS \.
0820: 0a 20 20 20 20 20 20 20 20 49 4e 54 45 52 4e 41  .        INTERNA
0830: 4c 53 5f 56 49 53 49 42 4c 45 5f 54 4f 20 49 53  LS_VISIBLE_TO IS
0840: 4f 4c 41 54 45 44 5f 49 4e 54 45 52 50 52 45 54  OLATED_INTERPRET
0850: 45 52 53 20 49 53 4f 4c 41 54 45 44 5f 50 4c 55  ERS ISOLATED_PLU
0860: 47 49 4e 53 20 4c 49 42 52 41 52 59 20 5c 0d 0a  GINS LIBRARY \..
0870: 20 20 20 20 20 20 20 20 4c 49 43 45 4e 53 49 4e          LICENSIN
0880: 47 20 4c 49 43 45 4e 53 45 5f 4d 41 4e 41 47 45  G LICENSE_MANAGE
0890: 52 20 4c 49 4d 49 54 45 44 5f 45 44 49 54 49 4f  R LIMITED_EDITIO
08a0: 4e 20 4c 49 53 54 5f 43 41 43 48 45 20 4d 4f 4e  N LIST_CACHE MON
08b0: 4f 20 4d 4f 4e 4f 5f 42 55 49 4c 44 20 5c 0d 0a  O MONO_BUILD \..
08c0: 20 20 20 20 20 20 20 20 4d 4f 4e 4f 5f 48 41 43          MONO_HAC
08d0: 4b 53 20 4d 4f 4e 4f 5f 4c 45 47 41 43 59 20 4e  KS MONO_LEGACY N
08e0: 41 54 49 56 45 20 4e 41 54 49 56 45 5f 50 41 43  ATIVE NATIVE_PAC
08f0: 4b 41 47 45 20 4e 41 54 49 56 45 5f 54 48 52 45  KAGE NATIVE_THRE
0900: 41 44 5f 49 44 20 5c 0d 0a 20 20 20 20 20 20 20  AD_ID \..       
0910: 20 4e 41 54 49 56 45 5f 55 54 49 4c 49 54 59 20   NATIVE_UTILITY 
0920: 4e 41 54 49 56 45 5f 55 54 49 4c 49 54 59 5f 42  NATIVE_UTILITY_B
0930: 53 54 52 20 4e 45 54 57 4f 52 4b 20 4e 45 54 5f  STR NETWORK NET_
0940: 32 30 20 4e 45 54 5f 32 30 5f 46 41 53 54 5f 45  20 NET_20_FAST_E
0950: 4e 55 4d 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e  NUM \..        N
0960: 45 54 5f 32 30 5f 4f 4e 4c 59 20 4e 45 54 5f 32  ET_20_ONLY NET_2
0970: 30 5f 53 50 31 20 4e 45 54 5f 32 30 5f 53 50 32  0_SP1 NET_20_SP2
0980: 20 4e 45 54 5f 33 30 20 4e 45 54 5f 33 35 20 4e   NET_30 NET_35 N
0990: 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
09a0: 5f 34 35 31 20 5c 0d 0a 20 20 20 20 20 20 20 20  _451 \..        
09b0: 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34 36 20 4e  NET_452 NET_46 N
09c0: 45 54 5f 34 36 31 20 4e 45 54 5f 34 36 32 20 4e  ET_461 NET_462 N
09d0: 45 54 5f 34 37 20 4e 45 54 5f 34 37 31 20 4e 45  ET_47 NET_471 NE
09e0: 54 5f 34 37 32 20 4e 45 54 5f 43 4f 52 45 5f 32  T_472 NET_CORE_2
09f0: 30 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e 45 54  0 \..        NET
0a00: 5f 53 54 41 4e 44 41 52 44 5f 32 30 20 4e 4f 4e  _STANDARD_20 NON
0a10: 5f 57 4f 52 4b 49 4e 47 5f 43 4f 44 45 20 4e 4f  _WORKING_CODE NO
0a20: 54 49 46 59 20 4e 4f 54 49 46 59 5f 41 43 54 49  TIFY NOTIFY_ACTI
0a30: 56 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e 4f  VE \..        NO
0a40: 54 49 46 59 5f 41 52 47 55 4d 45 4e 54 53 20 4e  TIFY_ARGUMENTS N
0a50: 4f 54 49 46 59 5f 45 58 43 45 50 54 49 4f 4e 20  OTIFY_EXCEPTION 
0a60: 4e 4f 54 49 46 59 5f 45 58 45 43 55 54 45 20 4e  NOTIFY_EXECUTE N
0a70: 4f 54 49 46 59 5f 45 58 50 52 45 53 53 49 4f 4e  OTIFY_EXPRESSION
0a80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 4e 4f 54 49   \..        NOTI
0a90: 46 59 5f 47 4c 4f 42 41 4c 20 4e 4f 54 49 46 59  FY_GLOBAL NOTIFY
0aa0: 5f 4f 42 4a 45 43 54 20 4f 42 53 4f 4c 45 54 45  _OBJECT OBSOLETE
0ab0: 20 4f 42 46 55 53 43 41 54 49 4f 4e 20 4f 46 46   OBFUSCATION OFF
0ac0: 49 43 49 41 4c 20 50 41 52 53 45 5f 43 41 43 48  ICIAL PARSE_CACH
0ad0: 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 50 41 54  E \..        PAT
0ae0: 43 48 4c 45 56 45 4c 20 50 4c 55 47 49 4e 5f 43  CHLEVEL PLUGIN_C
0af0: 4f 4d 4d 41 4e 44 53 20 50 4f 4c 49 43 59 5f 54  OMMANDS POLICY_T
0b00: 52 41 43 45 20 50 52 45 56 49 4f 55 53 5f 52 45  RACE PREVIOUS_RE
0b10: 53 55 4c 54 20 52 41 4e 44 4f 4d 49 5a 45 5f 49  SULT RANDOMIZE_I
0b20: 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 52 45 4d  D \..        REM
0b30: 4f 54 49 4e 47 20 52 45 53 55 4c 54 5f 4c 49 4d  OTING RESULT_LIM
0b40: 49 54 53 20 53 41 4d 50 4c 45 20 53 45 43 55 52  ITS SAMPLE SECUR
0b50: 49 54 59 20 53 45 52 49 41 4c 49 5a 41 54 49 4f  ITY SERIALIZATIO
0b60: 4e 20 53 48 41 52 45 44 5f 49 44 5f 50 4f 4f 4c  N SHARED_ID_POOL
0b70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 53 48 45 4c   \..        SHEL
0b80: 4c 20 53 4f 55 52 43 45 5f 49 44 20 53 4f 55 52  L SOURCE_ID SOUR
0b90: 43 45 5f 54 49 4d 45 53 54 41 4d 50 20 53 54 41  CE_TIMESTAMP STA
0ba0: 54 49 43 20 54 43 4c 20 54 43 4c 5f 4b 49 54 53  TIC TCL TCL_KITS
0bb0: 20 54 43 4c 5f 54 48 52 45 41 44 45 44 20 5c 0d   TCL_THREADED \.
0bc0: 0a 20 20 20 20 20 20 20 20 54 43 4c 5f 54 48 52  .        TCL_THR
0bd0: 45 41 44 53 20 54 43 4c 5f 55 4e 49 43 4f 44 45  EADS TCL_UNICODE
0be0: 20 54 43 4c 5f 57 52 41 50 50 45 52 20 54 45 53   TCL_WRAPPER TES
0bf0: 54 20 54 45 53 54 5f 50 4c 55 47 49 4e 20 54 48  T TEST_PLUGIN TH
0c00: 52 45 41 44 49 4e 47 20 5c 0d 0a 20 20 20 20 20  READING \..     
0c10: 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50     THROW_ON_DISP
0c20: 4f 53 45 44 20 54 52 41 43 45 20 54 59 50 45 5f  OSED TRACE TYPE_
0c30: 43 41 43 48 45 20 55 4e 49 58 20 55 53 45 5f 41  CACHE UNIX USE_A
0c40: 50 50 44 4f 4d 41 49 4e 5f 46 4f 52 5f 49 44 20  PPDOMAIN_FOR_ID 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 55 53 45 5f 4e  \..        USE_N
0c60: 41 4d 45 53 50 41 43 45 53 20 56 45 52 42 4f 53  AMESPACES VERBOS
0c70: 45 20 57 45 42 20 57 49 4e 44 4f 57 53 20 57 49  E WEB WINDOWS WI
0c80: 4e 46 4f 52 4d 53 20 57 49 58 5f 33 30 20 57 49  NFORMS WIX_30 WI
0c90: 58 5f 33 35 20 57 49 58 5f 33 36 20 5c 0d 0a 20  X_35 WIX_36 \.. 
0ca0: 20 20 20 20 20 20 20 57 49 58 5f 33 37 20 57 49         WIX_37 WI
0cb0: 58 5f 33 38 20 57 49 58 5f 33 39 20 57 49 58 5f  X_38 WIX_39 WIX_
0cc0: 33 31 30 20 57 49 58 5f 33 31 31 20 58 36 34 20  310 WIX_311 X64 
0cd0: 58 38 36 20 58 4d 4c 5d 0d 0a 20 20 7d 0d 0a 0c  X86 XML]..  }...
0ce0: 0d 0a 20 20 70 72 6f 63 20 67 65 74 4b 6e 6f 77  ..  proc getKnow
0cf0: 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e 73 20 7b 20  nMonoVersions { 
0d00: 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20  {force false} } 
0d10: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
0d20: 4e 4f 54 45 3a 20 54 68 69 73 20 6a 6f 62 20 6f  NOTE: This job o
0d30: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
0d40: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 20 74 68   is to return th
0d50: 65 20 6c 69 73 74 20 6f 66 20 22 6b 6e 6f 77 6e  e list of "known
0d60: 22 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 76  "..    #       v
0d70: 65 72 73 69 6f 6e 73 20 6f 66 20 4d 6f 6e 6f 20  ersions of Mono 
0d80: 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65  supported by the
0d90: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
0da0: 61 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20  astructure...   
0db0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
0dc0: 4f 74 68 65 72 20 74 68 61 6e 20 76 65 72 73 69  Other than versi
0dd0: 6f 6e 20 32 2e 31 31 20 28 77 68 69 63 68 20 77  on 2.11 (which w
0de0: 61 73 20 6f 66 66 69 63 69 61 6c 6c 79 20 61 6e  as officially an
0df0: 6e 6f 75 6e 63 65 64 20 61 6e 64 0d 0a 20 20 20  nounced and..   
0e00: 20 23 20 20 20 20 20 20 20 72 65 6c 65 61 73 65   #       release
0e10: 64 29 2c 20 61 6c 6c 20 6f 66 20 74 68 65 73 65  d), all of these
0e20: 20 72 65 6c 65 61 73 65 73 20 61 72 65 20 6c 69   releases are li
0e30: 73 74 65 64 20 6f 6e 20 74 68 65 20 6f 66 66 69  sted on the offi
0e40: 63 69 61 6c 0d 0a 20 20 20 20 23 20 20 20 20 20  cial..    #     
0e50: 20 20 72 65 6c 65 61 73 65 20 68 69 73 74 6f 72    release histor
0e60: 79 20 70 61 67 65 73 3a 0d 0a 20 20 20 20 23 0d  y pages:..    #.
0e70: 0a 20 20 20 20 23 20 20 20 20 20 20 20 68 74 74  .    #       htt
0e80: 70 73 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69  ps://en.wikipedi
0e90: 61 2e 6f 72 67 2f 77 69 6b 69 2f 4d 6f 6e 6f 5f  a.org/wiki/Mono_
0ea0: 25 32 38 73 6f 66 74 77 61 72 65 25 32 39 0d 0a  %28software%29..
0eb0: 20 20 20 20 23 20 20 20 20 20 20 20 68 74 74 70      #       http
0ec0: 73 3a 2f 2f 77 77 77 2e 6d 6f 6e 6f 2d 70 72 6f  s://www.mono-pro
0ed0: 6a 65 63 74 2e 63 6f 6d 2f 64 6f 63 73 2f 61 62  ject.com/docs/ab
0ee0: 6f 75 74 2d 6d 6f 6e 6f 2f 72 65 6c 65 61 73 65  out-mono/release
0ef0: 73 2f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  s/..    #..    #
0f00: 20 54 4f 44 4f 3a 20 54 68 69 73 20 6c 69 73 74   TODO: This list
0f10: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 6e 75 61   should be manua
0f20: 6c 6c 79 20 75 70 64 61 74 65 64 20 77 68 65 6e  lly updated when
0f30: 20 61 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f   a new version o
0f40: 66 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74  f..    #       t
0f50: 68 65 20 4d 6f 6e 6f 20 72 75 6e 74 69 6d 65 20  he Mono runtime 
0f60: 69 73 20 72 65 6c 65 61 73 65 64 2e 0d 0a 20 20  is released...  
0f70: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 24 66 6f    #..    if {$fo
0f80: 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
0f90: 69 73 74 73 20 3a 3a 6e 6f 28 6d 6f 6e 6f 56 65  ists ::no(monoVe
0fa0: 72 73 69 6f 6e 73 29 5d 7d 20 74 68 65 6e 20 7b  rsions)]} then {
0fb0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
0fc0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
0fd0: 20 20 5b 6c 69 73 74 20 32 20 30 5d 20 5b 6c 69    [list 2 0] [li
0fe0: 73 74 20 32 20 32 5d 20 5b 6c 69 73 74 20 32 20  st 2 2] [list 2 
0ff0: 34 5d 20 5b 6c 69 73 74 20 32 20 36 5d 20 5b 6c  4] [list 2 6] [l
1000: 69 73 74 20 32 20 38 5d 20 5b 6c 69 73 74 20 32  ist 2 8] [list 2
1010: 20 31 30 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20   10] \..        
1020: 20 20 5b 6c 69 73 74 20 32 20 31 31 5d 20 5b 6c    [list 2 11] [l
1030: 69 73 74 20 33 20 30 5d 20 5b 6c 69 73 74 20 33  ist 3 0] [list 3
1040: 20 31 5d 20 5b 6c 69 73 74 20 33 20 32 5d 20 5b   1] [list 3 2] [
1050: 6c 69 73 74 20 33 20 34 5d 20 5b 6c 69 73 74 20  list 3 4] [list 
1060: 33 20 36 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  3 6] \..        
1070: 20 20 5b 6c 69 73 74 20 33 20 38 5d 20 5b 6c 69    [list 3 8] [li
1080: 73 74 20 33 20 31 30 5d 20 5b 6c 69 73 74 20 33  st 3 10] [list 3
1090: 20 31 32 5d 20 5b 6c 69 73 74 20 34 20 30 5d 20   12] [list 4 0] 
10a0: 5b 6c 69 73 74 20 34 20 32 5d 20 5b 6c 69 73 74  [list 4 2] [list
10b0: 20 34 20 34 5d 20 5c 0d 0a 20 20 20 20 20 20 20   4 4] \..       
10c0: 20 20 20 5b 6c 69 73 74 20 34 20 36 5d 20 5b 6c     [list 4 6] [l
10d0: 69 73 74 20 34 20 38 5d 20 5b 6c 69 73 74 20 35  ist 4 8] [list 5
10e0: 20 30 5d 20 5b 6c 69 73 74 20 35 20 32 5d 20 5b   0] [list 5 2] [
10f0: 6c 69 73 74 20 35 20 34 5d 20 5b 6c 69 73 74 20  list 5 4] [list 
1100: 35 20 38 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  5 8] \..        
1110: 20 20 5b 6c 69 73 74 20 35 20 31 30 5d 20 5b 6c    [list 5 10] [l
1120: 69 73 74 20 35 20 31 32 5d 20 5b 6c 69 73 74 20  ist 5 12] [list 
1130: 35 20 31 34 5d 20 5b 6c 69 73 74 20 35 20 31 36  5 14] [list 5 16
1140: 5d 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ]]..    } else {
1150: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
1160: 6c 69 73 74 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20  list]..    }..  
1170: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 61 64 64  }.....  proc add
1180: 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61  KnownMonoConstra
1190: 69 6e 74 73 20 7b 20 67 65 6e 65 72 69 63 20 7d  ints { generic }
11a0: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
11b0: 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20   NOTE: Does the 
11c0: 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 61  caller want to a
11d0: 64 64 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 73  dd the version-s
11e0: 70 65 63 69 66 69 63 20 63 6f 6e 73 74 72 61 69  pecific constrai
11f0: 6e 74 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20  nts..    #      
1200: 20 6f 72 20 74 68 65 20 67 65 6e 65 72 69 63 20   or the generic 
1210: 6f 6e 65 73 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  ones?..    #..  
1220: 20 20 69 66 20 7b 21 24 67 65 6e 65 72 69 63 7d    if {!$generic}
1230: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
1240: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1250: 41 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  Add the necessar
1260: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  y constraints fo
1270: 72 20 65 61 63 68 20 76 65 72 73 69 6f 6e 20 6f  r each version o
1280: 66 20 4d 6f 6e 6f 20 74 68 61 74 0d 0a 20 20 20  f Mono that..   
1290: 20 20 20 23 20 20 20 20 20 20 20 77 65 20 6b 6e     #       we kn
12a0: 6f 77 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20  ow about...     
12b0: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
12c0: 68 20 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 5b 67  h monoVersion [g
12d0: 65 74 4b 6e 6f 77 6e 4d 6f 6e 6f 56 65 72 73 69  etKnownMonoVersi
12e0: 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
12f0: 73 65 74 20 63 6f 6e 73 74 72 61 69 6e 74 56 65  set constraintVe
1300: 72 73 69 6f 6e 20 5b 6a 6f 69 6e 20 24 6d 6f 6e  rsion [join $mon
1310: 6f 56 65 72 73 69 6f 6e 20 22 22 5d 0d 0a 0d 0a  oVersion ""]....
1320: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1330: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1340: 73 20 6d 6f 6e 6f 54 6f 44 6f 20 24 63 6f 6e 73  s monoToDo $cons
1350: 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 5d 0d 0a  traintVersion]..
1360: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1370: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1380: 73 20 6d 6f 6e 6f 54 6f 44 6f 20 24 63 6f 6e 73  s monoToDo $cons
1390: 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e  traintVersion On
13a0: 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ly]..        add
13b0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
13c0: 6e 64 41 72 67 73 20 6d 6f 6e 6f 42 75 67 20 24  ndArgs monoBug $
13d0: 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f  constraintVersio
13e0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  n]..        addC
13f0: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1400: 64 41 72 67 73 20 6d 6f 6e 6f 42 75 67 20 24 63  dArgs monoBug $c
1410: 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e  onstraintVersion
1420: 20 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20   Only]..        
1430: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
1440: 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 43 72  ppendArgs monoCr
1450: 61 73 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 56  ash $constraintV
1460: 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ersion]..       
1470: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
1480: 61 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 43  appendArgs monoC
1490: 72 61 73 68 20 24 63 6f 6e 73 74 72 61 69 6e 74  rash $constraint
14a0: 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a 20  Version Only].. 
14b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c       }..    } el
14c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  se {..      #.. 
14d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73       # NOTE: Als
14e0: 6f 20 61 64 64 20 6a 75 73 74 20 74 68 65 20 67  o add just the g
14f0: 65 6e 65 72 69 63 20 4d 6f 6e 6f 20 63 6f 6e 73  eneric Mono cons
1500: 74 72 61 69 6e 74 73 20 74 68 61 74 20 64 6f 20  traints that do 
1510: 6e 6f 74 20 68 61 76 65 0d 0a 20 20 20 20 20 20  not have..      
1520: 23 20 20 20 20 20 20 20 61 20 74 72 61 69 6c 69  #       a traili
1530: 6e 67 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20  ng version...   
1540: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
1550: 63 6f 6e 73 74 72 61 69 6e 74 73 20 5b 6c 69 73  constraints [lis
1560: 74 20 6d 6f 6e 6f 54 6f 44 6f 20 6d 6f 6e 6f 42  t monoToDo monoB
1570: 75 67 20 6d 6f 6e 6f 43 72 61 73 68 5d 0d 0a 0d  ug monoCrash]...
1580: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63  .      foreach c
1590: 6f 6e 73 74 72 61 69 6e 74 20 24 63 6f 6e 73 74  onstraint $const
15a0: 72 61 69 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20  raints {..      
15b0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
15c0: 24 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 20 20 20  $constraint..   
15d0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d     }..    }..  }
15e0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 67 65 74 4b  .....  proc getK
15f0: 6e 6f 77 6e 54 63 6c 56 65 72 73 69 6f 6e 73 20  nownTclVersions 
1600: 7b 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20  { {force false} 
1610: 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  } {..    #..    
1620: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 6a 6f 62  # NOTE: This job
1630: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
1640: 72 65 20 69 73 20 74 6f 20 72 65 74 75 72 6e 20  re is to return 
1650: 74 68 65 20 6c 69 73 74 20 6f 66 20 22 6b 6e 6f  the list of "kno
1660: 77 6e 22 0d 0a 20 20 20 20 23 20 20 20 20 20 20  wn"..    #      
1670: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 54 63 6c   versions of Tcl
1680: 2f 54 6b 20 73 75 70 70 6f 72 74 65 64 20 62 79  /Tk supported by
1690: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
16a0: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 2e 0d  infrastructure..
16b0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
16c0: 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f  $force || ![info
16d0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 74 63 6c   exists ::no(tcl
16e0: 56 65 72 73 69 6f 6e 73 29 5d 7d 20 74 68 65 6e  Versions)]} then
16f0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1700: 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 38 20 34   [list [list 8 4
1710: 5d 20 5b 6c 69 73 74 20 38 20 35 5d 20 5b 6c 69  ] [list 8 5] [li
1720: 73 74 20 38 20 36 5d 20 5b 6c 69 73 74 20 38 20  st 8 6] [list 8 
1730: 37 5d 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  7]]..    } else 
1740: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
1750: 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 7d 0d 0a 20  [list]..    }.. 
1760: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 66 69   }.....  proc fi
1770: 6c 74 65 72 4b 6e 6f 77 6e 56 65 72 73 69 6f 6e  lterKnownVersion
1780: 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 76  s {..          v
1790: 65 72 73 69 6f 6e 73 20 7b 6d 69 6e 69 6d 75 6d  ersions {minimum
17a0: 56 65 72 73 69 6f 6e 20 22 22 7d 20 7b 6d 61 78  Version ""} {max
17b0: 69 6d 75 6d 56 65 72 73 69 6f 6e 20 22 22 7d 20  imumVersion ""} 
17c0: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74  } {..    if {[st
17d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 69 6e  ring length $min
17e0: 69 6d 75 6d 56 65 72 73 69 6f 6e 5d 20 3e 20 30  imumVersion] > 0
17f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1800: 73 65 74 20 64 6f 74 4d 69 6e 69 6d 75 6d 56 65  set dotMinimumVe
1810: 72 73 69 6f 6e 20 5b 67 65 74 44 6f 74 74 65 64  rsion [getDotted
1820: 56 65 72 73 69 6f 6e 20 24 6d 69 6e 69 6d 75 6d  Version $minimum
1830: 56 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 7d 20  Version]..    } 
1840: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 73 65  else {..      se
1850: 74 20 64 6f 74 4d 69 6e 69 6d 75 6d 56 65 72 73  t dotMinimumVers
1860: 69 6f 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0d  ion ""..    }...
1870: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
1880: 20 6c 65 6e 67 74 68 20 24 6d 61 78 69 6d 75 6d   length $maximum
1890: 56 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  Version] > 0} th
18a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20  en {..      set 
18b0: 64 6f 74 4d 61 78 69 6d 75 6d 56 65 72 73 69 6f  dotMaximumVersio
18c0: 6e 20 5b 67 65 74 44 6f 74 74 65 64 56 65 72 73  n [getDottedVers
18d0: 69 6f 6e 20 24 6d 61 78 69 6d 75 6d 56 65 72 73  ion $maximumVers
18e0: 69 6f 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65  ion]..    } else
18f0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 6f   {..      set do
1900: 74 4d 61 78 69 6d 75 6d 56 65 72 73 69 6f 6e 20  tMaximumVersion 
1910: 22 22 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ""..    }....   
1920: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
1930: 74 5d 0d 0a 0d 0a 20 20 20 20 66 6f 72 65 61 63  t]....    foreac
1940: 68 20 76 65 72 73 69 6f 6e 20 24 76 65 72 73 69  h version $versi
1950: 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  ons {..      set
1960: 20 64 6f 74 56 65 72 73 69 6f 6e 20 5b 67 65 74   dotVersion [get
1970: 44 6f 74 74 65 64 56 65 72 73 69 6f 6e 20 24 76  DottedVersion $v
1980: 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ersion]....     
1990: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
19a0: 67 74 68 20 24 64 6f 74 4d 69 6e 69 6d 75 6d 56  gth $dotMinimumV
19b0: 65 72 73 69 6f 6e 5d 20 3e 20 30 20 26 26 20 5c  ersion] > 0 && \
19c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 6f 74  ..          $dot
19d0: 56 65 72 73 69 6f 6e 20 3c 20 24 64 6f 74 4d 69  Version < $dotMi
19e0: 6e 69 6d 75 6d 56 65 72 73 69 6f 6e 7d 20 74 68  nimumVersion} th
19f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
1a00: 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 7d 0d  ntinue..      }.
1a10: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
1a20: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 6f 74  ring length $dot
1a30: 4d 61 78 69 6d 75 6d 56 65 72 73 69 6f 6e 5d 20  MaximumVersion] 
1a40: 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
1a50: 20 20 20 20 24 64 6f 74 56 65 72 73 69 6f 6e 20      $dotVersion 
1a60: 3e 20 24 64 6f 74 4d 61 78 69 6d 75 6d 56 65 72  > $dotMaximumVer
1a70: 73 69 6f 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  sion} then {..  
1a80: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0d 0a        continue..
1a90: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1aa0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
1ab0: 24 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 7d 0d  $version..    }.
1ac0: 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72  ...    return $r
1ad0: 65 73 75 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20  esult..  }..... 
1ae0: 20 70 72 6f 63 20 67 65 74 44 6f 74 4e 65 74 43   proc getDotNetC
1af0: 6f 72 65 44 69 72 65 63 74 6f 72 79 4e 61 6d 65  oreDirectoryName
1b00: 4f 6e 6c 79 20 7b 20 70 61 74 68 20 7d 20 7b 0d  Only { path } {.
1b10: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41  .    #..    # HA
1b20: 43 4b 3a 20 4f 62 74 61 69 6e 20 70 61 72 65 6e  CK: Obtain paren
1b30: 74 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65  t directory name
1b40: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 22 6e   that matches "n
1b50: 65 74 2a 22 2c 20 69 66 20 61 6e 79 20 28 65 2e  et*", if any (e.
1b60: 67 2e 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  g...    #       
1b70: 22 6e 65 74 63 6f 72 65 61 70 70 32 2e 30 22 2c  "netcoreapp2.0",
1b80: 20 22 6e 65 74 73 74 61 6e 64 61 72 64 32 2e 30   "netstandard2.0
1b90: 22 2c 20 65 74 63 29 2e 0d 0a 20 20 20 20 23 0d  ", etc)...    #.
1ba0: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
1bb0: 20 6c 65 6e 67 74 68 20 24 70 61 74 68 5d 20 3e   length $path] >
1bc0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1bd0: 20 20 73 65 74 20 74 61 69 6c 20 5b 66 69 6c 65    set tail [file
1be0: 20 74 61 69 6c 20 24 70 61 74 68 5d 0d 0a 0d 0a   tail $path]....
1bf0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1c00: 67 20 6d 61 74 63 68 20 6e 65 74 2a 20 24 74 61  g match net* $ta
1c10: 69 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  il]} then {..   
1c20: 20 20 20 20 20 72 65 74 75 72 6e 20 24 74 61 69       return $tai
1c30: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  l..      }..    
1c40: 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  }....    return 
1c50: 22 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  ""..  }.....  pr
1c60: 6f 63 20 67 65 74 44 6f 74 4e 65 74 43 6f 72 65  oc getDotNetCore
1c70: 4c 69 62 50 61 74 68 44 69 72 65 63 74 6f 72 79  LibPathDirectory
1c80: 4e 61 6d 65 4f 6e 6c 79 20 7b 20 7b 6e 61 6d 65  NameOnly { {name
1c90: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d   ""} } {..    #.
1ca0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 61  .    # NOTE: Sea
1cb0: 72 63 68 20 66 6f 72 20 6d 61 74 63 68 69 6e 67  rch for matching
1cc0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 62 61 73   directories bas
1cd0: 65 64 20 6f 6e 20 74 68 65 20 67 6c 6f 62 61 6c  ed on the global
1ce0: 6c 79 20 64 65 74 65 63 74 65 64 0d 0a 20 20 20  ly detected..   
1cf0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
1d00: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
1d10: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
1d20: 74 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d  t core library..
1d30: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
1d40: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
1d50: 6f 72 65 5f 6c 69 62 5f 70 61 74 68 5d 20 26 26  ore_lib_path] &&
1d60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72   \..        [str
1d70: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f  ing length $::co
1d80: 72 65 5f 6c 69 62 5f 70 61 74 68 5d 20 3e 20 30  re_lib_path] > 0
1d90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1da0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1db0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   Make sure the d
1dc0: 69 72 65 63 74 6f 72 79 20 61 63 74 75 61 6c 6c  irectory actuall
1dd0: 79 20 65 78 69 73 74 73 20 62 65 66 6f 72 65 20  y exists before 
1de0: 74 72 79 69 6e 67 20 74 6f 20 66 69 6e 64 0d 0a  trying to find..
1df0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1e00: 69 6e 67 73 20 77 69 74 68 69 6e 20 69 74 2e 0d  ings within it..
1e10: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1e20: 69 66 20 7b 5b 66 69 6c 65 20 69 73 64 69 72 65  if {[file isdire
1e30: 63 74 6f 72 79 20 24 3a 3a 63 6f 72 65 5f 6c 69  ctory $::core_li
1e40: 62 5f 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d  b_path]} then {.
1e50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
1e70: 20 61 6c 6c 20 64 69 72 65 63 74 6f 72 69 65 73   all directories
1e80: 20 74 68 61 74 20 61 72 65 20 64 69 72 65 63 74   that are direct
1e90: 6c 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 64  ly beneath the d
1ea0: 65 74 65 63 74 65 64 0d 0a 20 20 20 20 20 20 20  etected..       
1eb0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
1ec0: 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0d 0a   path, if any...
1ed0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ee0: 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
1ef0: 74 6f 72 79 20 5b 67 6c 6f 62 20 5c 0d 0a 20 20  tory [glob \..  
1f00: 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 6f 6d            -nocom
1f10: 70 6c 61 69 6e 20 2d 74 79 70 65 73 20 7b 64 7d  plain -types {d}
1f20: 20 2d 2d 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24   -- [file join $
1f30: 3a 3a 63 6f 72 65 5f 6c 69 62 5f 70 61 74 68 20  ::core_lib_path 
1f40: 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  *]] {..         
1f50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1f60: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63 61 6c  NOTE: If the cal
1f70: 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
1f80: 28 70 6c 75 67 69 6e 29 20 6e 61 6d 65 20 74 6f  (plugin) name to
1f90: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 2c 0d   match against,.
1fa0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1fb0: 20 20 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20     make sure it 
1fc0: 6d 61 74 63 68 65 73 3b 20 6f 74 68 65 72 77 69  matches; otherwi
1fd0: 73 65 2c 20 73 6b 69 70 20 74 68 69 73 20 64 69  se, skip this di
1fe0: 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20  rectory...      
1ff0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2000: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
2010: 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 20 26  gth $name] > 0 &
2020: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2030: 20 20 20 21 5b 73 74 72 69 6e 67 20 6d 61 74 63     ![string matc
2040: 68 20 24 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  h $name [file ta
2050: 69 6c 20 24 64 69 72 65 63 74 6f 72 79 5d 5d 7d  il $directory]]}
2060: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2070: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 20       continue.. 
2080: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2090: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e       # NOTE: Fin
20b0: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 62 65  d directories be
20c0: 6e 65 61 74 68 20 74 68 65 20 63 75 72 72 65 6e  neath the curren
20d0: 74 20 63 61 6e 64 69 64 61 74 65 20 64 69 72 65  t candidate dire
20e0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  ctory..         
20f0: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 61 72   #       that ar
2100: 65 20 2e 4e 45 54 20 43 6f 72 65 20 6f 75 74 70  e .NET Core outp
2110: 75 74 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d  ut directories..
2120: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2130: 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
2140: 63 74 6f 72 69 65 73 20 5b 67 6c 6f 62 20 5c 0d  ctories [glob \.
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  .              -
2160: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d 74 79 70 65  nocomplain -type
2170: 73 20 7b 64 7d 20 2d 2d 20 5b 66 69 6c 65 20 6a  s {d} -- [file j
2180: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 6e  oin $directory n
2190: 65 74 2a 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  et*]]....       
21a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21b0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
21c0: 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
21d0: 20 6d 61 74 63 68 2c 20 77 65 20 61 72 65 20 64   match, we are d
21e0: 6f 6e 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  one.  Return the
21f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2200: 20 20 20 20 66 69 6e 61 6c 20 70 61 74 68 20 73      final path s
2210: 65 67 6d 65 6e 74 20 6f 66 20 74 68 65 20 64 69  egment of the di
2220: 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 74 6f 20  rectory name to 
2230: 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  the caller...   
2240: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2250: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
2260: 20 24 64 69 72 65 63 74 6f 72 69 65 73 5d 20 3e   $directories] >
2270: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2280: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2290: 66 69 6c 65 20 74 61 69 6c 20 5b 6c 69 6e 64 65  file tail [linde
22a0: 78 20 24 64 69 72 65 63 74 6f 72 69 65 73 20 30  x $directories 0
22b0: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ]]..          }.
22c0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
22d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
22e0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
22f0: 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6d 61   There was no ma
2300: 74 63 68 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  tch, just return
2310: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 62 76 69 6f   something obvio
2320: 75 73 6c 79 20 69 6e 76 61 6c 69 64 2e 0d 0a 20  usly invalid... 
2330: 20 20 20 23 0d 0a 20 20 20 20 72 65 74 75 72 6e     #..    return
2340: 20 22 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70   ""..  }.....  p
2350: 72 6f 63 20 67 65 74 44 6f 74 74 65 64 56 65 72  roc getDottedVer
2360: 73 69 6f 6e 20 7b 20 76 65 72 73 69 6f 6e 20 7d  sion { version }
2370: 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b   {..    return [
2380: 6a 6f 69 6e 20 24 76 65 72 73 69 6f 6e 20 2e 5d  join $version .]
2390: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
23a0: 20 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69   getDotlessVersi
23b0: 6f 6e 20 7b 20 76 65 72 73 69 6f 6e 20 7d 20 7b  on { version } {
23c0: 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  ..    if {[strin
23d0: 67 20 66 69 72 73 74 20 2e 20 24 76 65 72 73 69  g first . $versi
23e0: 6f 6e 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  on] != -1} then 
23f0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
2400: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
2410: 74 20 2e 20 22 22 5d 20 24 76 65 72 73 69 6f 6e  t . ""] $version
2420: 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  ]..    } else {.
2430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a  .      return [j
2440: 6f 69 6e 20 24 76 65 72 73 69 6f 6e 20 22 22 5d  oin $version ""]
2450: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
2460: 0a 20 20 70 72 6f 63 20 67 65 74 4d 61 6a 6f 72  .  proc getMajor
2470: 4d 69 6e 6f 72 56 65 72 73 69 6f 6e 20 7b 20 76  MinorVersion { v
2480: 65 72 73 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20  ersion } {..    
2490: 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 6c 72  return [join [lr
24a0: 61 6e 67 65 20 5b 73 70 6c 69 74 20 24 76 65 72  ange [split $ver
24b0: 73 69 6f 6e 20 2e 5d 20 30 20 31 5d 20 2e 5d 0d  sion .] 0 1] .].
24c0: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20  .  }.....  #..  
24d0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
24e0: 63 65 64 75 72 65 20 77 61 73 20 61 64 61 70 74  cedure was adapt
24f0: 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 6e 65 20  ed from the one 
2500: 6c 69 73 74 65 64 20 6f 6e 20 74 68 65 20 54 63  listed on the Tc
2510: 6c 20 57 69 6b 69 20 70 61 67 65 0d 0a 20 20 23  l Wiki page..  #
2520: 20 20 20 20 20 20 20 61 74 20 22 68 74 74 70 73         at "https
2530: 3a 2f 2f 77 69 6b 69 2e 74 63 6c 2e 74 6b 2f 34  ://wiki.tcl.tk/4
2540: 33 22 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  3".  It is only 
2550: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2560: 73 65 64 20 6f 6e 20 76 65 72 79 0d 0a 20 20 23  sed on very..  #
2570: 20 20 20 20 20 20 20 73 6d 61 6c 6c 20 6c 69 73         small lis
2580: 74 73 20 62 65 63 61 75 73 65 20 6f 66 20 69 74  ts because of it
2590: 73 20 68 65 61 76 79 20 75 73 65 20 6f 66 20 72  s heavy use of r
25a0: 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 63 6f 6d  ecursion and com
25b0: 70 6c 65 78 69 74 79 20 6f 6e 0d 0a 20 20 23 20  plexity on..  # 
25c0: 20 20 20 20 20 20 74 68 65 20 6f 72 64 65 72 20        the order 
25d0: 6f 66 20 4f 28 4e 21 29 2e 0d 0a 20 20 23 0d 0a  of O(N!)...  #..
25e0: 20 20 70 72 6f 63 20 6c 70 65 72 6d 75 74 65 20    proc lpermute 
25f0: 7b 20 6c 69 73 74 20 7d 20 7b 0d 0a 20 20 20 20  { list } {..    
2600: 73 65 74 20 6c 65 6e 67 74 68 20 5b 6c 6c 65 6e  set length [llen
2610: 67 74 68 20 24 6c 69 73 74 5d 0d 0a 20 20 20 20  gth $list]..    
2620: 69 66 20 7b 24 6c 65 6e 67 74 68 20 3c 20 32 7d  if {$length < 2}
2630: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
2640: 20 5b 6c 69 73 74 20 24 6c 69 73 74 5d 0d 0a 20   [list $list].. 
2650: 20 20 20 7d 0d 0a 20 20 20 20 73 65 74 20 69 6e     }..    set in
2660: 64 65 78 20 30 0d 0a 20 20 20 20 66 6f 72 65 61  dex 0..    forea
2670: 63 68 20 65 6c 65 6d 65 6e 74 31 20 24 6c 69 73  ch element1 $lis
2680: 74 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  t {..      if {$
2690: 69 6e 64 65 78 20 3d 3d 20 30 7d 20 74 68 65 6e  index == 0} then
26a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
26b0: 72 65 73 74 20 5b 6c 72 61 6e 67 65 20 24 6c 69  rest [lrange $li
26c0: 73 74 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20  st 1 end]..     
26d0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e 64 65   } elseif {$inde
26e0: 78 20 3d 3d 20 24 6c 65 6e 67 74 68 20 2d 20 31  x == $length - 1
26f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2700: 20 20 73 65 74 20 72 65 73 74 20 5b 6c 72 61 6e    set rest [lran
2710: 67 65 20 24 6c 69 73 74 20 30 20 65 6e 64 2d 31  ge $list 0 end-1
2720: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
2730: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 72  {..        set r
2740: 65 73 74 20 5b 63 6f 6e 63 61 74 20 5c 0d 0a 20  est [concat \.. 
2750: 20 20 20 20 20 20 20 20 20 20 20 5b 6c 72 61 6e             [lran
2760: 67 65 20 24 6c 69 73 74 20 30 20 5b 65 78 70 72  ge $list 0 [expr
2770: 20 7b 24 69 6e 64 65 78 20 2d 20 31 7d 5d 5d 20   {$index - 1}]] 
2780: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2790: 6c 72 61 6e 67 65 20 24 6c 69 73 74 20 5b 65 78  lrange $list [ex
27a0: 70 72 20 7b 24 69 6e 64 65 78 20 2b 20 31 7d 5d  pr {$index + 1}]
27b0: 20 65 6e 64 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d   end]]..      }.
27c0: 0a 20 20 20 20 20 20 69 6e 63 72 20 69 6e 64 65  .      incr inde
27d0: 78 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  x..      foreach
27e0: 20 6c 69 73 74 32 20 5b 6c 70 65 72 6d 75 74 65   list2 [lpermute
27f0: 20 24 72 65 73 74 5d 20 7b 0d 0a 20 20 20 20 20   $rest] {..     
2800: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
2810: 74 20 5b 63 6f 6e 63 61 74 20 5b 6c 69 73 74 20  t [concat [list 
2820: 24 65 6c 65 6d 65 6e 74 31 5d 20 24 6c 69 73 74  $element1] $list
2830: 32 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  2]..      }..   
2840: 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 24   }..    return $
2850: 72 65 73 75 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a  result..  }.....
2860: 20 20 70 72 6f 63 20 61 6c 77 61 79 73 46 75 6c    proc alwaysFul
2870: 6c 49 6e 74 65 72 70 52 65 61 64 79 20 7b 7d 20  lInterpReady {} 
2880: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
2890: 4e 4f 54 45 3a 20 54 68 65 20 5b 69 6e 74 65 72  NOTE: The [inter
28a0: 70 20 72 65 61 64 79 6c 69 6d 69 74 5d 20 73 75  p readylimit] su
28b0: 62 2d 63 6f 6d 6d 61 6e 64 20 69 73 20 6f 6e 6c  b-command is onl
28c0: 79 20 69 6e 20 45 61 67 6c 65 2e 0d 0a 20 20 20  y in Eagle...   
28d0: 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 73   #..    if {![is
28e0: 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Eagle]} then {..
28f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
2900: 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  e..    }....    
2910: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  #..    # NOTE: I
2920: 66 20 74 68 69 73 20 45 61 67 6c 65 20 76 65 72  f this Eagle ver
2930: 73 69 6f 6e 20 6c 61 63 6b 73 20 5b 69 6e 74 65  sion lacks [inte
2940: 72 70 20 72 65 61 64 79 6c 69 6d 69 74 5d 20 2d  rp readylimit] -
2950: 4f 52 2d 20 69 74 20 68 61 73 0d 0a 20 20 20 20  OR- it has..    
2960: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
2970: 75 6c 74 20 76 61 6c 75 65 20 28 69 2e 65 2e 20  ult value (i.e. 
2980: 69 74 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  it always fully 
2990: 63 68 65 63 6b 73 20 72 65 61 64 69 6e 65 73 73  checks readiness
29a0: 29 2c 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  ),..    #       
29b0: 72 65 74 75 72 6e 20 74 72 75 65 2e 0d 0a 20 20  return true...  
29c0: 20 20 23 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    #..    return 
29d0: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 5b  [expr {..      [
29e0: 63 61 74 63 68 20 7b 69 6e 74 65 72 70 20 72 65  catch {interp re
29f0: 61 64 79 6c 69 6d 69 74 20 7b 7d 7d 20 72 65 61  adylimit {}} rea
2a00: 64 79 6c 69 6d 69 74 5d 20 7c 7c 20 24 72 65 61  dylimit] || $rea
2a10: 64 79 6c 69 6d 69 74 20 3d 3d 20 30 0d 0a 20 20  dylimit == 0..  
2a20: 20 20 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20    }]..  }.....  
2a30: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
2a40: 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  s procedure shou
2a50: 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ld return non-ze
2a60: 72 6f 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ro if the operat
2a70: 69 6e 67 20 73 79 73 74 65 6d 0d 0a 20 20 23 20  ing system..  # 
2a80: 20 20 20 20 20 20 73 68 65 6c 6c 20 6d 61 79 20        shell may 
2a90: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 74  be executed by t
2aa0: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e  he test suite in
2ab0: 66 72 61 73 74 72 75 63 74 75 72 65 20 6f 75 74  frastructure out
2ac0: 73 69 64 65 0d 0a 20 20 23 20 20 20 20 20 20 20  side..  #       
2ad0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
2ae0: 6e 79 20 73 70 65 63 69 66 69 63 20 74 65 73 74  ny specific test
2af0: 73 2e 20 20 54 68 65 20 73 70 65 63 69 66 69 63  s.  The specific
2b00: 20 74 65 73 74 73 20 74 68 65 6d 73 65 6c 76 65   tests themselve
2b10: 73 0d 0a 20 20 23 20 20 20 20 20 20 20 6d 75 73  s..  #       mus
2b20: 74 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68  t make use of th
2b30: 65 69 72 20 6f 77 6e 20 63 6f 6e 73 74 72 61 69  eir own constrai
2b40: 6e 74 73 20 74 6f 20 70 72 65 76 65 6e 74 20 69  nts to prevent i
2b50: 74 73 20 65 78 65 63 75 74 69 6f 6e 2e 0d 0a 20  ts execution... 
2b60: 20 23 0d 0a 20 20 70 72 6f 63 20 63 61 6e 45 78   #..  proc canEx
2b70: 65 63 43 6f 6d 53 70 65 63 20 7b 7d 20 7b 0d 0a  ecComSpec {} {..
2b80: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2b90: 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d  ists ::no(exec)]
2ba0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2bb0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
2bc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b    }....    if {[
2bd0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2be0: 28 63 6f 6d 53 70 65 63 29 5d 7d 20 74 68 65 6e  (comSpec)]} then
2bf0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
2c00: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   false..    }...
2c10: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
2c20: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 45 78  xists ::no(canEx
2c30: 65 63 43 6f 6d 53 70 65 63 29 5d 7d 20 74 68 65  ecComSpec)]} the
2c40: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
2c50: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
2c60: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  ..    return tru
2c70: 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  e..  }.....  #..
2c80: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
2c90: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
2ca0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
2cb0: 69 66 20 74 68 65 20 22 77 68 6f 61 6d 69 22 20  if the "whoami" 
2cc0: 63 6f 6d 6d 61 6e 64 20 6d 61 79 0d 0a 20 20 23  command may..  #
2cd0: 20 20 20 20 20 20 20 62 65 20 65 78 65 63 75 74         be execut
2ce0: 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
2cf0: 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63 74  uite infrastruct
2d00: 75 72 65 20 6f 75 74 73 69 64 65 20 74 68 65 20  ure outside the 
2d10: 63 6f 6e 74 65 78 74 0d 0a 20 20 23 20 20 20 20  context..  #    
2d20: 20 20 20 6f 66 20 61 6e 79 20 73 70 65 63 69 66     of any specif
2d30: 69 63 20 74 65 73 74 73 2e 20 20 54 68 65 20 73  ic tests.  The s
2d40: 70 65 63 69 66 69 63 20 74 65 73 74 73 20 74 68  pecific tests th
2d50: 65 6d 73 65 6c 76 65 73 20 6d 75 73 74 20 6d 61  emselves must ma
2d60: 6b 65 0d 0a 20 20 23 20 20 20 20 20 20 20 75 73  ke..  #       us
2d70: 65 20 6f 66 20 74 68 65 69 72 20 6f 77 6e 20 63  e of their own c
2d80: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 70 72  onstraints to pr
2d90: 65 76 65 6e 74 20 69 74 73 20 65 78 65 63 75 74  event its execut
2da0: 69 6f 6e 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f  ion...  #..  pro
2db0: 63 20 63 61 6e 45 78 65 63 57 68 6f 41 6d 49 20  c canExecWhoAmI 
2dc0: 7b 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69  {} {..    if {[i
2dd0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2de0: 65 78 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  exec)]} then {..
2df0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2e00: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
2e10: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2e20: 73 20 3a 3a 6e 6f 28 77 68 6f 61 6d 69 29 5d 7d  s ::no(whoami)]}
2e30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72   then {..      r
2e40: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2e50: 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69   }....    if {[i
2e60: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2e70: 63 61 6e 45 78 65 63 57 68 6f 41 6d 49 29 5d 7d  canExecWhoAmI)]}
2e80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72   then {..      r
2e90: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2ea0: 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e   }....    return
2eb0: 20 74 72 75 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20   true..  }..... 
2ec0: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68   #..  # NOTE: Th
2ed0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  is procedure sho
2ee0: 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  uld return non-z
2ef0: 65 72 6f 20 69 66 20 74 68 65 20 6e 61 74 69 76  ero if the nativ
2f00: 65 20 54 63 6c 20 73 68 65 6c 6c 20 6d 61 79 0d  e Tcl shell may.
2f10: 0a 20 20 23 20 20 20 20 20 20 20 62 65 20 65 78  .  #       be ex
2f20: 65 63 75 74 65 64 20 62 79 20 74 68 65 20 74 65  ecuted by the te
2f30: 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74  st suite infrast
2f40: 72 75 63 74 75 72 65 20 6f 75 74 73 69 64 65 20  ructure outside 
2f50: 74 68 65 20 63 6f 6e 74 65 78 74 0d 0a 20 20 23  the context..  #
2f60: 20 20 20 20 20 20 20 6f 66 20 61 6e 79 20 73 70         of any sp
2f70: 65 63 69 66 69 63 20 74 65 73 74 73 2e 20 20 54  ecific tests.  T
2f80: 68 65 20 73 70 65 63 69 66 69 63 20 74 65 73 74  he specific test
2f90: 73 20 74 68 65 6d 73 65 6c 76 65 73 20 6d 75 73  s themselves mus
2fa0: 74 20 6d 61 6b 65 0d 0a 20 20 23 20 20 20 20 20  t make..  #     
2fb0: 20 20 75 73 65 20 6f 66 20 74 68 65 69 72 20 6f    use of their o
2fc0: 77 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  wn constraints t
2fd0: 6f 20 70 72 65 76 65 6e 74 20 69 74 73 20 65 78  o prevent its ex
2fe0: 65 63 75 74 69 6f 6e 2e 0d 0a 20 20 23 0d 0a 20  ecution...  #.. 
2ff0: 20 70 72 6f 63 20 63 61 6e 45 78 65 63 54 63 6c   proc canExecTcl
3000: 53 68 65 6c 6c 20 7b 7d 20 7b 0d 0a 20 20 20 20  Shell {} {..    
3010: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3020: 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 7d 20 74 68   ::no(exec)]} th
3030: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75  en {..      retu
3040: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
3050: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
3060: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 74 63 6c   exists ::no(tcl
3070: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
3080: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3090: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20      }....    if 
30a0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
30b0: 6e 6f 28 63 61 6e 45 78 65 63 54 63 6c 53 68 65  no(canExecTclShe
30c0: 6c 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ll)]} then {..  
30d0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
30e0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72  ..    }....    r
30f0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 7d 0d  eturn true..  }.
3100: 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
3110: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
3120: 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  e should return 
3130: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 46 6f 73 73  non-zero if Foss
3140: 69 6c 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  il may be execut
3150: 65 64 20 62 79 0d 0a 20 20 23 20 20 20 20 20 20  ed by..  #      
3160: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
3170: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 6f  infrastructure o
3180: 75 74 73 69 64 65 20 74 68 65 20 63 6f 6e 74 65  utside the conte
3190: 78 74 20 6f 66 20 61 6e 79 20 73 70 65 63 69 66  xt of any specif
31a0: 69 63 0d 0a 20 20 23 20 20 20 20 20 20 20 74 65  ic..  #       te
31b0: 73 74 73 2e 20 20 54 68 65 20 73 70 65 63 69 66  sts.  The specif
31c0: 69 63 20 74 65 73 74 73 20 74 68 65 6d 73 65 6c  ic tests themsel
31d0: 76 65 73 20 6d 75 73 74 20 6d 61 6b 65 20 75 73  ves must make us
31e0: 65 20 6f 66 20 74 68 65 69 72 20 6f 77 6e 0d 0a  e of their own..
31f0: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 73 74 72    #       constr
3200: 61 69 6e 74 73 20 74 6f 20 70 72 65 76 65 6e 74  aints to prevent
3210: 20 69 74 73 20 65 78 65 63 75 74 69 6f 6e 2e 0d   its execution..
3220: 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 63 61 6e  .  #..  proc can
3230: 45 78 65 63 46 6f 73 73 69 6c 20 7b 7d 20 7b 0d  ExecFossil {} {.
3240: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
3250: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29  xists ::no(exec)
3260: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3270: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
3280: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b     }....    if {
3290: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
32a0: 6f 28 66 6f 73 73 69 6c 29 5d 7d 20 74 68 65 6e  o(fossil)]} then
32b0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
32c0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   false..    }...
32d0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
32e0: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 61 6e 45 78  xists ::no(canEx
32f0: 65 63 46 6f 73 73 69 6c 29 5d 7d 20 74 68 65 6e  ecFossil)]} then
3300: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
3310: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   false..    }...
3320: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65  .    return true
3330: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
3340: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
3350: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
3360: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
3370: 66 20 74 68 65 20 22 76 73 77 68 65 72 65 22 20  f the "vswhere" 
3380: 74 6f 6f 6c 20 6d 61 79 20 62 65 0d 0a 20 20 23  tool may be..  #
3390: 20 20 20 20 20 20 20 65 78 65 63 75 74 65 64 20         executed 
33a0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
33b0: 65 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  e infrastructure
33c0: 20 6f 75 74 73 69 64 65 20 74 68 65 20 63 6f 6e   outside the con
33d0: 74 65 78 74 20 6f 66 0d 0a 20 20 23 20 20 20 20  text of..  #    
33e0: 20 20 20 61 6e 79 20 73 70 65 63 69 66 69 63 20     any specific 
33f0: 74 65 73 74 73 2e 20 20 54 68 65 20 73 70 65 63  tests.  The spec
3400: 69 66 69 63 20 74 65 73 74 73 20 74 68 65 6d 73  ific tests thems
3410: 65 6c 76 65 73 20 6d 75 73 74 20 6d 61 6b 65 20  elves must make 
3420: 75 73 65 0d 0a 20 20 23 20 20 20 20 20 20 20 6f  use..  #       o
3430: 66 20 74 68 65 69 72 20 6f 77 6e 20 63 6f 6e 73  f their own cons
3440: 74 72 61 69 6e 74 73 20 74 6f 20 70 72 65 76 65  traints to preve
3450: 6e 74 20 69 74 73 20 65 78 65 63 75 74 69 6f 6e  nt its execution
3460: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 63  ...  #..  proc c
3470: 61 6e 45 78 65 63 56 73 57 68 65 72 65 20 7b 7d  anExecVsWhere {}
3480: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66   {..    if {[inf
3490: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78  o exists ::no(ex
34a0: 65 63 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ec)]} then {..  
34b0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
34c0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
34d0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
34e0: 3a 3a 6e 6f 28 76 73 77 68 65 72 65 29 5d 7d 20  ::no(vswhere)]} 
34f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65  then {..      re
3500: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
3510: 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  }....    if {[in
3520: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
3530: 61 6e 45 78 65 63 56 73 57 68 65 72 65 29 5d 7d  anExecVsWhere)]}
3540: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72   then {..      r
3550: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
3560: 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e   }....    return
3570: 20 74 72 75 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20   true..  }..... 
3580: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68   #..  # NOTE: Th
3590: 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  is procedure sho
35a0: 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  uld return non-z
35b0: 65 72 6f 20 69 66 20 74 68 65 20 74 65 73 74 20  ero if the test 
35c0: 73 75 69 74 65 20 73 68 6f 75 6c 64 20 62 65 0d  suite should be.
35d0: 0a 20 20 23 20 20 20 20 20 20 20 63 6f 6e 73 69  .  #       consi
35e0: 64 65 72 65 64 20 74 6f 20 62 65 20 72 75 6e 6e  dered to be runn
35f0: 69 6e 67 20 6f 6e 20 4d 6f 6e 6f 2e 0d 0a 20 20  ing on Mono...  
3600: 23 0d 0a 20 20 70 72 6f 63 20 69 73 54 65 73 74  #..  proc isTest
3610: 4d 6f 6e 6f 20 7b 7d 20 7b 0d 0a 20 20 20 20 72  Mono {} {..    r
3620: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 21 5b 69  eturn [expr {![i
3630: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3640: 6d 6f 6e 6f 29 5d 20 26 26 20 5b 69 73 4d 6f 6e  mono)] && [isMon
3650: 6f 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  o]}]..  }.....  
3660: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
3670: 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  s procedure shou
3680: 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ld return non-ze
3690: 72 6f 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ro if the test s
36a0: 75 69 74 65 20 73 68 6f 75 6c 64 20 62 65 0d 0a  uite should be..
36b0: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 73 69 64    #       consid
36c0: 65 72 65 64 20 74 6f 20 62 65 20 72 75 6e 6e 69  ered to be runni
36d0: 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2e  ng on .NET Core.
36e0: 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 69 73  ..  #..  proc is
36f0: 54 65 73 74 44 6f 74 4e 65 74 43 6f 72 65 20 7b  TestDotNetCore {
3700: 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  } {..    return 
3710: 5b 65 78 70 72 20 7b 21 5b 69 6e 66 6f 20 65 78  [expr {![info ex
3720: 69 73 74 73 20 3a 3a 6e 6f 28 64 6f 74 4e 65 74  ists ::no(dotNet
3730: 43 6f 72 65 29 5d 20 26 26 20 5b 69 73 44 6f 74  Core)] && [isDot
3740: 4e 65 74 43 6f 72 65 5d 7d 5d 0d 0a 20 20 7d 0d  NetCore]}]..  }.
3750: 0a 0c 0d 0a 20 20 70 72 6f 63 20 69 73 54 65 73  ....  proc isTes
3760: 74 41 64 6d 69 6e 69 73 74 72 61 74 6f 72 20 7b  tAdministrator {
3770: 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d   {force false} }
3780: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
3790: 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 61   NOTE: This is a
37a0: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 66 6f 72 20   workaround for 
37b0: 74 68 65 20 5b 69 73 41 64 6d 69 6e 69 73 74 72  the [isAdministr
37c0: 61 74 6f 72 5d 20 70 72 6f 63 65 64 75 72 65 20  ator] procedure 
37d0: 62 65 69 6e 67 0d 0a 20 20 20 20 23 20 20 20 20  being..    #    
37e0: 20 20 20 69 6e 61 63 63 75 72 61 74 65 20 66 6f     inaccurate fo
37f0: 72 20 4d 6f 6e 6f 20 6f 6e 20 57 69 6e 64 6f 77  r Mono on Window
3800: 73 2c 20 70 72 69 6d 61 72 69 6c 79 20 64 75 65  s, primarily due
3810: 20 74 6f 20 74 68 65 20 69 6e 61 62 69 6c 69 74   to the inabilit
3820: 79 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 6f  y..    #       o
3830: 66 20 4d 6f 6e 6f 20 74 6f 20 63 61 6c 6c 20 61  f Mono to call a
3840: 20 50 2f 49 6e 76 6f 6b 65 20 6d 65 74 68 6f 64   P/Invoke method
3850: 20 62 79 20 6f 72 64 69 6e 61 6c 2e 20 20 41 6c   by ordinal.  Al
3860: 73 6f 2c 20 74 68 69 73 20 63 61 6e 0d 0a 20 20  so, this can..  
3870: 20 20 23 20 20 20 20 20 20 20 62 65 20 75 73 65    #       be use
3880: 64 20 66 6f 72 20 6e 61 74 69 76 65 20 54 63 6c  d for native Tcl
3890: 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68   on Windows.  Th
38a0: 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  is only works on
38b0: 20 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 23   Windows...    #
38c0: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e  ..    if {[isWin
38d0: 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
38e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
38f0: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
3900: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3910: 64 20 66 6f 72 20 6e 61 74 69 76 65 20 54 63 6c  d for native Tcl
3920: 20 6f 72 20 45 61 67 6c 65 20 6f 6e 20 4d 6f 6e   or Eagle on Mon
3930: 6f 3b 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  o;..      #     
3940: 20 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61    however, it ca
3950: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 45 61  n be used for Ea
3960: 67 6c 65 20 6f 6e 20 74 68 65 20 2e 4e 45 54 20  gle on the .NET 
3970: 46 72 61 6d 65 77 6f 72 6b 20 69 66 0d 0a 20 20  Framework if..  
3980: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 63      #       forc
3990: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
39a0: 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
39b0: 7c 20 21 5b 69 73 45 61 67 6c 65 5d 20 7c 7c 20  | ![isEagle] || 
39c0: 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68  [isTestMono]} th
39d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
39e0: 20 7b 5b 63 61 6e 45 78 65 63 57 68 6f 41 6d 49   {[canExecWhoAmI
39f0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
3a00: 20 20 20 20 5b 63 61 74 63 68 20 7b 65 78 65 63      [catch {exec
3a10: 20 2d 2d 20 77 68 6f 61 6d 69 20 2f 67 72 6f 75   -- whoami /grou
3a20: 70 73 7d 20 67 72 6f 75 70 73 5d 20 3d 3d 20 30  ps} groups] == 0
3a30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3a40: 20 20 20 20 73 65 74 20 67 72 6f 75 70 73 20 5b      set groups [
3a50: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
3a60: 20 5c 72 5c 6e 20 5c 6e 5d 20 24 67 72 6f 75 70   \r\n \n] $group
3a70: 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  s]....          
3a80: 66 6f 72 65 61 63 68 20 67 72 6f 75 70 20 5b 73  foreach group [s
3a90: 70 6c 69 74 20 24 67 72 6f 75 70 73 20 5c 6e 5d  plit $groups \n]
3aa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3ab0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
3ac0: 20 4e 4f 54 45 3a 20 4d 61 74 63 68 20 74 68 69   NOTE: Match thi
3ad0: 73 20 67 72 6f 75 70 20 6c 69 6e 65 20 61 67 61  s group line aga
3ae0: 69 6e 73 74 20 74 68 65 20 22 77 65 6c 6c 2d 6b  inst the "well-k
3af0: 6e 6f 77 6e 22 20 53 49 44 20 66 6f 72 0d 0a 20  nown" SID for.. 
3b00: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
3b10: 20 20 20 74 68 65 20 22 41 64 6d 69 6e 69 73 74     the "Administ
3b20: 72 61 74 6f 72 73 22 20 67 72 6f 75 70 20 6f 6e  rators" group on
3b30: 20 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 20   Windows...     
3b40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3b50: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
3b60: 70 20 2d 2d 20 7b 5c 73 53 2d 31 2d 35 2d 33 32  p -- {\sS-1-5-32
3b70: 2d 35 34 34 5c 73 7d 20 24 67 72 6f 75 70 5d 7d  -544\s} $group]}
3b80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3b90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3ba0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3bb0: 4d 61 74 63 68 20 74 68 69 73 20 67 72 6f 75 70  Match this group
3bc0: 20 6c 69 6e 65 20 61 67 61 69 6e 73 74 20 74 68   line against th
3bd0: 65 20 61 74 74 72 69 62 75 74 65 73 20 63 6f 6c  e attributes col
3be0: 75 6d 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  umn..           
3bf0: 20 20 20 23 20 20 20 20 20 20 20 73 75 62 2d 76     #       sub-v
3c00: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
3c10: 20 62 65 20 70 72 65 73 65 6e 74 20 77 68 65 6e   be present when
3c20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 0d 0a 20   running with.. 
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
3c40: 20 20 20 20 20 65 6c 65 76 61 74 65 64 20 61 64       elevated ad
3c50: 6d 69 6e 69 73 74 72 61 74 6f 72 20 63 72 65 64  ministrator cred
3c60: 65 6e 74 69 61 6c 73 2e 0d 0a 20 20 20 20 20 20  entials...      
3c70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3c80: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65           if {[re
3c90: 67 65 78 70 20 2d 2d 20 7b 5c 73 45 6e 61 62 6c  gexp -- {\sEnabl
3ca0: 65 64 20 67 72 6f 75 70 28 3f 3a 2c 7c 5c 73 29  ed group(?:,|\s)
3cb0: 7d 20 24 67 72 6f 75 70 5d 7d 20 74 68 65 6e 20  } $group]} then 
3cc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3cd0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
3cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
3d00: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3d10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
3d20: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
3d30: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20  .    # NOTE: We 
3d40: 6d 75 73 74 20 62 65 20 72 75 6e 6e 69 6e 67 20  must be running 
3d50: 69 6e 20 6e 61 74 69 76 65 20 54 63 6c 2c 20 72  in native Tcl, r
3d60: 75 6e 6e 69 6e 67 20 6f 6e 20 55 6e 69 78 2c 20  unning on Unix, 
3d70: 72 75 6e 6e 69 6e 67 20 69 6e 0d 0a 20 20 20 20  running in..    
3d80: 23 20 20 20 20 20 20 20 45 61 67 6c 65 20 6f 6e  #       Eagle on
3d90: 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
3da0: 6f 72 6b 2c 20 6f 72 20 75 6e 61 62 6c 65 20 74  ork, or unable t
3db0: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 22 77  o execute the "w
3dc0: 68 6f 61 6d 69 22 0d 0a 20 20 20 20 23 20 20 20  hoami"..    #   
3dd0: 20 20 20 20 63 6f 6d 6d 61 6e 64 2e 20 20 49 66      command.  If
3de0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 45 61 67 6c   running in Eagl
3df0: 65 2c 20 77 65 20 63 61 6e 20 6a 75 73 74 20 66  e, we can just f
3e00: 61 6c 6c 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  allback to using
3e10: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 68  ..    #       th
3e20: 65 20 5b 69 73 41 64 6d 69 6e 69 73 74 72 61 74  e [isAdministrat
3e30: 6f 72 5d 20 70 72 6f 63 65 64 75 72 65 3b 20 6f  or] procedure; o
3e40: 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72  therwise, just r
3e50: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20 20  eturn false...  
3e60: 20 20 23 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    #..    return 
3e70: 5b 65 78 70 72 20 7b 5b 69 73 45 61 67 6c 65 5d  [expr {[isEagle]
3e80: 20 3f 20 5b 69 73 41 64 6d 69 6e 69 73 74 72 61   ? [isAdministra
3e90: 74 6f 72 5d 20 3a 20 66 61 6c 73 65 7d 5d 0d 0a  tor] : false}]..
3ea0: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
3eb0: 61 6e 50 69 6e 67 20 7b 20 7b 76 61 72 4e 61 6d  anPing { {varNam
3ec0: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 23  e ""} } {..    #
3ed0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66  ..    # NOTE: If
3ee0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
3ef0: 65 20 63 61 6c 6c 65 72 2c 20 70 72 6f 76 69 64  e caller, provid
3f00: 65 20 61 20 72 65 61 73 6f 6e 20 77 68 65 6e 65  e a reason whene
3f10: 76 65 72 20 66 61 6c 73 65 20 69 73 0d 0a 20 20  ver false is..  
3f20: 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
3f30: 65 64 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f  ed from this pro
3f40: 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 23 0d 0a  cedure...    #..
3f50: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
3f60: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
3f70: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
3f80: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
3f90: 4e 61 6d 65 20 72 65 61 73 6f 6e 0d 0a 20 20 20  Name reason..   
3fa0: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
3fb0: 20 23 20 4e 4f 54 45 3a 20 4e 61 74 69 76 65 20   # NOTE: Native 
3fc0: 54 63 6c 20 28 77 69 74 68 6f 75 74 20 65 78 74  Tcl (without ext
3fd0: 72 61 20 70 61 63 6b 61 67 65 73 29 20 64 6f 65  ra packages) doe
3fe0: 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 73 75  s not provide su
3ff0: 70 70 6f 72 74 20 66 6f 72 0d 0a 20 20 20 20 23  pport for..    #
4000: 20 20 20 20 20 20 20 70 69 6e 67 69 6e 67 20 61         pinging a
4010: 20 6e 65 74 77 6f 72 6b 20 68 6f 73 74 2e 0d 0a   network host...
4020: 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
4030: 69 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b  isEagle]} then {
4040: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 54  ..      if {[isT
4050: 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b  estMono]} then {
4060: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4070: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 69       # NOTE: Usi
4080: 6e 67 20 5b 75 72 69 20 70 69 6e 67 5d 20 6f 6e  ng [uri ping] on
4090: 20 74 68 65 20 4d 6f 6e 6f 20 33 2e 33 2e 30 20   the Mono 3.3.0 
40a0: 28 6f 72 20 33 2e 34 2e 30 3f 29 20 72 65 6c 65  (or 3.4.0?) rele
40b0: 61 73 65 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20  ase will..      
40c0: 20 20 23 20 20 20 20 20 20 20 6c 6f 63 6b 20 75    #       lock u
40d0: 70 20 74 68 65 20 70 72 6f 63 65 73 73 3b 20 74  p the process; t
40e0: 68 65 72 65 66 6f 72 65 2c 20 73 6b 69 70 20 69  herefore, skip i
40f0: 74 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0d  t in that case..
4100: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4110: 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e      if {[haveCon
4120: 73 74 72 61 69 6e 74 20 6d 6f 6e 6f 33 33 5d 20  straint mono33] 
4130: 7c 7c 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  || [haveConstrai
4140: 6e 74 20 6d 6f 6e 6f 33 34 5d 7d 20 74 68 65 6e  nt mono34]} then
4150: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
4160: 74 20 72 65 61 73 6f 6e 20 22 73 6b 69 70 70 65  t reason "skippe
4170: 64 2c 20 6d 61 79 20 68 61 6e 67 20 6f 6e 20 4d  d, may hang on M
4180: 6f 6e 6f 20 33 2e 33 2e 30 20 61 6e 64 20 33 2e  ono 3.3.0 and 3.
4190: 34 2e 30 22 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0"..          
41a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
41b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
41c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
41d0: 4e 4f 54 45 3a 20 4f 74 68 65 72 20 76 65 72 73  NOTE: Other vers
41e0: 69 6f 6e 73 20 6f 66 20 4d 6f 6e 6f 2c 20 65 2e  ions of Mono, e.
41f0: 67 2e 20 33 2e 31 32 2c 20 61 70 70 65 61 72 20  g. 3.12, appear 
4200: 74 6f 20 72 65 71 75 69 72 65 20 65 6c 65 76 61  to require eleva
4210: 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
4220: 20 20 20 20 20 70 72 69 76 69 6c 65 67 65 73 20       privileges 
4230: 28 69 2e 65 2e 20 66 75 6c 6c 20 61 64 6d 69 6e  (i.e. full admin
4240: 69 73 74 72 61 74 6f 72 29 20 69 6e 20 6f 72 64  istrator) in ord
4250: 65 72 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c  er to successful
4260: 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
4270: 20 20 20 20 65 78 65 63 75 74 65 20 5b 75 72 69      execute [uri
4280: 20 70 69 6e 67 5d 2e 20 20 54 68 69 73 20 68 61   ping].  This ha
4290: 73 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  s been verified 
42a0: 6f 6e 20 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20  on Windows...   
42b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
42c0: 69 66 20 7b 21 5b 69 73 54 65 73 74 41 64 6d 69  if {![isTestAdmi
42d0: 6e 69 73 74 72 61 74 6f 72 5d 7d 20 74 68 65 6e  nistrator]} then
42e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
42f0: 74 20 72 65 61 73 6f 6e 20 22 73 6b 69 70 70 65  t reason "skippe
4300: 64 2c 20 6e 65 65 64 20 61 64 6d 69 6e 69 73 74  d, need administ
4310: 72 61 74 6f 72 20 70 72 69 76 69 6c 65 67 65 73  rator privileges
4320: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  "..          ret
4330: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
4340: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
4350: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4360: 23 20 4e 4f 54 45 3a 20 45 61 67 6c 65 2c 20 77  # NOTE: Eagle, w
4370: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 74  hen running on t
4380: 68 65 20 4d 69 63 72 6f 73 6f 66 74 20 2e 4e 45  he Microsoft .NE
4390: 54 20 46 72 61 6d 65 77 6f 72 6b 2c 20 73 75 70  T Framework, sup
43a0: 70 6f 72 74 73 0d 0a 20 20 20 20 20 20 23 20 20  ports..      #  
43b0: 20 20 20 20 20 70 69 6e 67 69 6e 67 20 61 20 6e       pinging a n
43c0: 65 74 77 6f 72 6b 20 68 6f 73 74 20 61 73 20 6c  etwork host as l
43d0: 6f 6e 67 20 61 73 20 69 74 20 77 61 73 20 63 6f  ong as it was co
43e0: 6d 70 69 6c 65 64 20 77 69 74 68 20 6e 65 74 77  mpiled with netw
43f0: 6f 72 6b 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ork..      #    
4400: 20 20 20 73 75 70 70 6f 72 74 20 28 77 68 69 63     support (whic
4410: 68 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  h this procedure
4420: 20 70 75 72 70 6f 73 65 6c 79 20 64 6f 65 73 20   purposely does 
4430: 6e 6f 74 20 63 68 65 63 6b 29 2e 20 20 54 68 61  not check).  Tha
4440: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
4450: 20 69 73 20 64 6f 6e 65 20 75 73 69 6e 67 20 5b   is done using [
4460: 63 68 65 63 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f  checkForCompileO
4470: 70 74 69 6f 6e 5d 2c 20 62 79 20 74 68 65 20 74  ption], by the t
4480: 65 73 74 20 70 72 6f 6c 6f 67 75 65 2e 0d 0a 20  est prologue... 
4490: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
44a0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
44b0: 0d 0a 0d 0a 20 20 20 20 73 65 74 20 72 65 61 73  ....    set reas
44c0: 6f 6e 20 22 73 6b 69 70 70 65 64 2c 20 6e 65 65  on "skipped, nee
44d0: 64 20 45 61 67 6c 65 22 0d 0a 20 20 20 20 72 65  d Eagle"..    re
44e0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 7d 0d  turn false..  }.
44f0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 6c 65 61 6e  ....  proc clean
4500: 43 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20 7b  ConstraintName {
4510: 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 23   name } {..    #
4520: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74  ..    # NOTE: St
4530: 61 72 74 20 77 69 74 68 20 74 68 65 20 6f 72 69  art with the ori
4540: 67 69 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74  ginal constraint
4550: 20 6e 61 6d 65 2c 20 72 65 6d 6f 76 69 6e 67 20   name, removing 
4560: 73 75 72 72 6f 75 6e 64 69 6e 67 0d 0a 20 20 20  surrounding..   
4570: 20 23 20 20 20 20 20 20 20 77 68 69 74 65 73 70   #       whitesp
4580: 61 63 65 2e 20 20 49 66 20 74 68 69 73 20 72 65  ace.  If this re
4590: 73 75 6c 74 73 20 69 6e 20 61 6e 20 65 6d 70 74  sults in an empt
45a0: 79 20 73 74 72 69 6e 67 2c 20 77 65 20 61 72 65  y string, we are
45b0: 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 23 0d 0a 20   done...    #.. 
45c0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73     set result [s
45d0: 74 72 69 6e 67 20 74 72 69 6d 20 24 6e 61 6d 65  tring trim $name
45e0: 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74  ]....    if {[st
45f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73  ring length $res
4600: 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
4610: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
4620: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
4630: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
4640: 4f 54 45 3a 20 54 68 65 20 63 6f 6e 73 74 72 61  OTE: The constra
4650: 69 6e 74 73 20 66 6f 72 20 61 20 74 65 73 74 20  ints for a test 
4660: 61 72 65 20 61 63 74 75 61 6c 6c 79 20 61 20 6c  are actually a l
4670: 69 73 74 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ist; therefore, 
4680: 77 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  we..    #       
4690: 6d 75 73 74 20 72 65 6d 6f 76 65 20 61 6e 79 74  must remove anyt
46a0: 68 69 6e 67 20 74 68 61 74 20 6d 69 67 68 74 20  hing that might 
46b0: 63 6f 6e 66 75 73 65 20 74 68 65 20 6c 69 73 74  confuse the list
46c0: 20 70 61 72 73 65 72 2e 0d 0a 20 20 20 20 23 0d   parser...    #.
46d0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
46e0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
46f0: 74 20 5c 22 20 22 22 20 5c 5c 20 22 22 20 5c 7b  t \" "" \\ "" \{
4700: 20 22 22 20 5c 7d 20 22 22 5d 20 24 72 65 73 75   "" \} ""] $resu
4710: 6c 74 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  lt]....    #..  
4720: 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64    # NOTE: In ord
4730: 65 72 20 74 6f 20 61 76 6f 69 64 20 73 65 6d 61  er to avoid sema
4740: 6e 74 69 63 20 63 6f 6e 66 75 73 69 6f 6e 2c 20  ntic confusion, 
4750: 72 65 6d 6f 76 65 20 6f 74 68 65 72 20 63 68 61  remove other cha
4760: 72 61 63 74 65 72 73 0d 0a 20 20 20 20 23 20 20  racters..    #  
4770: 20 20 20 20 20 74 68 61 74 20 6d 61 79 20 62 65       that may be
4780: 20 72 65 73 65 72 76 65 64 20 62 79 20 74 68 65   reserved by the
4790: 20 74 65 73 74 20 73 75 69 74 65 20 73 75 62 73   test suite subs
47a0: 79 73 74 65 6d 73 2e 0d 0a 20 20 20 20 23 0d 0a  ystems...    #..
47b0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
47c0: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
47d0: 20 21 20 22 22 20 23 20 22 22 20 5c 24 20 22 22   ! "" # "" \$ ""
47e0: 20 5c 3b 20 22 22 20 5c 5b 20 22 22 20 5c 5d 20   \; "" \[ "" \] 
47f0: 22 22 5d 20 24 72 65 73 75 6c 74 5d 0d 0a 0d 0a  ""] $result]....
4800: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
4810: 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 72 65 6d 6f  E: Finally, remo
4820: 76 65 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  ve all remaining
4830: 20 77 68 69 74 65 73 70 61 63 65 2e 0d 0a 20 20   whitespace...  
4840: 20 20 23 0d 0a 20 20 20 20 72 65 67 73 75 62 20    #..    regsub 
4850: 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 7d 20 24 72 65  -all -- {\s} $re
4860: 73 75 6c 74 20 22 22 20 72 65 73 75 6c 74 3b 20  sult "" result; 
4870: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
4880: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
4890: 6c 65 61 6e 50 61 63 6b 61 67 65 4e 61 6d 65 20  leanPackageName 
48a0: 7b 20 70 61 63 6b 61 67 65 20 66 75 6c 6c 20 7d  { package full }
48b0: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
48c0: 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 6f 75 74   NOTE: Start out
48d0: 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e   with the origin
48e0: 61 6c 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 2c  al package name,
48f0: 20 72 65 6d 6f 76 69 6e 67 20 73 75 72 72 6f 75   removing surrou
4900: 6e 64 69 6e 67 0d 0a 20 20 20 20 23 20 20 20 20  nding..    #    
4910: 20 20 20 77 68 69 74 65 73 70 61 63 65 2e 20 20     whitespace.  
4920: 49 66 20 74 68 69 73 20 72 65 73 75 6c 74 73 20  If this results 
4930: 69 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  in an empty stri
4940: 6e 67 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e  ng, we are done.
4950: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74  ..    #..    set
4960: 20 72 65 73 75 6c 74 20 5b 73 74 72 69 6e 67 20   result [string 
4970: 74 72 69 6d 20 24 70 61 63 6b 61 67 65 5d 0d 0a  trim $package]..
4980: 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  ..    if {[strin
4990: 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74  g length $result
49a0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
49b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
49c0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  sult..    }.... 
49d0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
49e0: 3a 20 49 66 20 74 68 65 20 66 75 6c 6c 20 70 61  : If the full pa
49f0: 63 6b 61 67 65 20 6e 61 6d 65 20 69 73 20 4e 4f  ckage name is NO
4a00: 54 20 77 61 6e 74 65 64 2c 20 75 73 65 20 74 68  T wanted, use th
4a10: 65 20 73 68 6f 72 74 20 6e 61 6d 65 2e 20 20 49  e short name.  I
4a20: 74 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 77  t..    #       w
4a30: 69 6c 6c 20 62 65 20 77 68 61 74 65 76 65 72 20  ill be whatever 
4a40: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 68  occurs before th
4a50: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 2e 20 20  e first comma.  
4a60: 49 66 20 74 68 69 73 20 72 65 73 75 6c 74 73 0d  If this results.
4a70: 0a 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20  .    #       in 
4a80: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
4a90: 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d 0a 20   we are done... 
4aa0: 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 24     #..    if {!$
4ab0: 66 75 6c 6c 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  full} then {..  
4ac0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
4ad0: 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 6c 69 6e  string trim [lin
4ae0: 64 65 78 20 5b 73 70 6c 69 74 20 24 72 65 73 75  dex [split $resu
4af0: 6c 74 20 2c 5d 20 30 5d 5d 0d 0a 0d 0a 20 20 20  lt ,] 0]]....   
4b00: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4b10: 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3d  ength $result] =
4b20: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
4b30: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
4b40: 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ult..      }..  
4b50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20    }....    #..  
4b60: 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20 69    # HACK: This i
4b70: 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 22 73  s the list of "s
4b80: 70 65 63 69 61 6c 22 20 63 68 61 72 61 63 74 65  pecial" characte
4b90: 72 73 20 74 68 61 74 20 61 72 65 20 64 6f 63 75  rs that are docu
4ba0: 6d 65 6e 74 65 64 20 74 6f 0d 0a 20 20 20 20 23  mented to..    #
4bb0: 20 20 20 20 20 20 20 62 65 20 75 73 65 64 20 77         be used w
4bc0: 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  hen constructing
4bd0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4be0: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
4bf0: 74 79 70 65 0d 0a 20 20 20 20 23 20 20 20 20 20  type..    #     
4c00: 20 20 6e 61 6d 65 73 2e 20 20 46 6f 72 20 6e 6f    names.  For no
4c10: 77 2c 20 74 68 65 79 20 61 72 65 20 61 6c 6c 20  w, they are all 
4c20: 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 75 6e  replaced with un
4c30: 64 65 72 73 63 6f 72 65 73 20 62 79 20 74 68 69  derscores by thi
4c40: 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 70  s..    #       p
4c50: 72 6f 63 65 64 75 72 65 2e 20 20 41 6e 79 20 65  rocedure.  Any e
4c60: 78 69 73 74 69 6e 67 20 75 6e 64 65 72 73 63 6f  xisting undersco
4c70: 72 65 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  res in the strin
4c80: 67 20 61 72 65 20 64 6f 75 62 6c 65 64 2e 0d 0a  g are doubled...
4c90: 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 63      #..    set c
4ca0: 68 61 72 4d 61 70 20 5b 6c 69 73 74 20 5f 20 5f  harMap [list _ _
4cb0: 5f 20 22 20 22 20 5f 20 2b 20 5f 20 2c 20 5f 20  _ " " _ + _ , _ 
4cc0: 2e 20 5f 20 3d 20 5f 20 5c 5b 20 5f 20 5c 5c 20  . _ = _ \[ _ \\ 
4cd0: 5f 20 5c 5d 20 5f 20 60 20 5f 5d 0d 0a 0d 0a 20  _ \] _ ` _].... 
4ce0: 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e     return [strin
4cf0: 67 20 6d 61 70 20 24 63 68 61 72 4d 61 70 20 24  g map $charMap $
4d00: 72 65 73 75 6c 74 5d 0d 0a 20 20 7d 0d 0a 0c 0d  result]..  }....
4d10: 0a 20 20 70 72 6f 63 20 68 61 76 65 54 63 6c 50  .  proc haveTclP
4d20: 6c 61 74 66 6f 72 6d 4f 73 45 78 74 72 61 55 70  latformOsExtraUp
4d30: 64 61 74 65 4e 61 6d 65 20 7b 20 6e 61 6d 65 20  dateName { name 
4d40: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  } {..    if {[in
4d50: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
4d60: 70 6c 61 74 66 6f 72 6d 28 6f 73 45 78 74 72 61  platform(osExtra
4d70: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
4d80: 20 20 73 65 74 20 75 70 64 61 74 65 4e 61 6d 65    set updateName
4d90: 73 20 5b 67 65 74 44 69 63 74 69 6f 6e 61 72 79  s [getDictionary
4da0: 56 61 6c 75 65 20 24 3a 3a 74 63 6c 5f 70 6c 61  Value $::tcl_pla
4db0: 74 66 6f 72 6d 28 6f 73 45 78 74 72 61 29 20 5c  tform(osExtra) \
4dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 55 70 64 61  ..          Upda
4dd0: 74 65 4e 61 6d 65 73 5d 0d 0a 0d 0a 20 20 20 20  teNames]....    
4de0: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
4df0: 65 78 61 63 74 20 24 75 70 64 61 74 65 4e 61 6d  exact $updateNam
4e00: 65 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d  es $name] != -1}
4e10: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4e20: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
4e30: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
4e40: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
4e50: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
4e60: 20 63 68 65 63 6b 46 6f 72 54 65 73 74 53 75 69   checkForTestSui
4e70: 74 65 46 69 6c 65 73 20 7b 20 63 68 61 6e 6e 65  teFiles { channe
4e80: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
4e90: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
4ea0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 65 73  checking for tes
4eb0: 74 20 73 75 69 74 65 20 66 69 6c 65 73 2e 2e 2e  t suite files...
4ec0: 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   "....    #..   
4ed0: 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 6f   # NOTE: Start o
4ee0: 75 74 20 77 69 74 68 20 6e 6f 20 74 65 73 74 20  ut with no test 
4ef0: 73 75 69 74 65 20 66 69 6c 65 73 20 74 6f 20 63  suite files to c
4f00: 68 65 63 6b 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  heck...    #..  
4f10: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 20    set fileNames 
4f20: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 23 0d  [list]....    #.
4f30: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65  .    # NOTE: Che
4f40: 63 6b 20 69 66 20 74 68 65 20 62 61 73 65 20 70  ck if the base p
4f50: 61 63 6b 61 67 65 20 70 61 74 68 20 69 73 20 61  ackage path is a
4f60: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 23  vailable...    #
4f70: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
4f80: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 61  exists ::test_pa
4f90: 63 6b 61 67 65 5f 70 61 74 68 5d 7d 20 74 68 65  ckage_path]} the
4fa0: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
4fb0: 20 20 20 20 23 20 54 4f 44 4f 3a 20 49 66 20 61      # TODO: If a
4fc0: 64 64 69 74 69 6f 6e 61 6c 20 74 65 73 74 20 73  dditional test s
4fd0: 75 69 74 65 20 66 69 6c 65 73 20 61 72 65 20 61  uite files are a
4fe0: 64 64 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  dded within the 
4ff0: 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  base..      #   
5000: 20 20 20 20 70 61 63 6b 61 67 65 20 70 61 74 68      package path
5010: 2c 20 61 64 64 20 74 68 65 6d 20 68 65 72 65 20  , add them here 
5020: 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  as well...      
5030: 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  #..      foreach
5040: 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 6c   fileNameOnly [l
5050: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
5060: 20 61 75 78 69 6c 69 61 72 79 2e 65 61 67 6c 65   auxiliary.eagle
5070: 20 63 6f 6d 70 61 74 2e 65 61 67 6c 65 20 63 73   compat.eagle cs
5080: 68 61 72 70 2e 65 61 67 6c 65 20 64 61 74 61 62  harp.eagle datab
5090: 61 73 65 2e 65 61 67 6c 65 20 5c 0d 0a 20 20 20  ase.eagle \..   
50a0: 20 20 20 20 20 20 20 65 6d 62 65 64 2e 65 61 67         embed.eag
50b0: 6c 65 20 65 78 65 63 2e 65 61 67 6c 65 20 66 69  le exec.eagle fi
50c0: 6c 65 31 2e 65 61 67 6c 65 20 66 69 6c 65 32 2e  le1.eagle file2.
50d0: 65 61 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  eagle \..       
50e0: 20 20 20 66 69 6c 65 33 2e 65 61 67 6c 65 20 69     file3.eagle i
50f0: 6e 66 6f 2e 65 61 67 6c 65 20 69 6e 69 74 2e 65  nfo.eagle init.e
5100: 61 67 6c 65 20 6c 69 73 74 2e 65 61 67 6c 65 20  agle list.eagle 
5110: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  \..          obj
5120: 65 63 74 2e 65 61 67 6c 65 20 70 6b 67 49 6e 64  ect.eagle pkgInd
5130: 65 78 2e 65 61 67 6c 65 20 70 6b 67 49 6e 64 65  ex.eagle pkgInde
5140: 78 2e 74 63 6c 20 70 6b 67 74 2e 65 61 67 6c 65  x.tcl pkgt.eagle
5150: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 70 6c   \..          pl
5160: 61 74 66 6f 72 6d 2e 65 61 67 6c 65 20 70 72 6f  atform.eagle pro
5170: 63 65 73 73 2e 65 61 67 6c 65 20 72 75 6e 6f 70  cess.eagle runop
5180: 74 2e 65 61 67 6c 65 20 73 61 66 65 2e 65 61 67  t.eagle safe.eag
5190: 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
51a0: 73 68 65 6c 6c 2e 65 61 67 6c 65 20 73 68 69 6d  shell.eagle shim
51b0: 2e 65 61 67 6c 65 20 74 65 73 74 2e 65 61 67 6c  .eagle test.eagl
51c0: 65 20 74 65 73 74 6c 6f 67 2e 65 61 67 6c 65 20  e testlog.eagle 
51d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 6b  \..          unk
51e0: 6f 62 6a 2e 65 61 67 6c 65 20 75 6e 7a 69 70 2e  obj.eagle unzip.
51f0: 65 61 67 6c 65 20 75 70 64 61 74 65 2e 65 61 67  eagle update.eag
5200: 6c 65 20 76 65 6e 64 6f 72 2e 65 61 67 6c 65 20  le vendor.eagle 
5210: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 77 6f 72  \..          wor
5220: 64 2e 74 63 6c 5d 20 7b 0d 0a 20 20 20 20 20 20  d.tcl] {..      
5230: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5240: 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65 63  OTE: First, chec
5250: 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 72 65  k if the file re
5260: 73 69 64 65 73 20 69 6e 20 74 68 65 20 45 61 67  sides in the Eag
5270: 6c 65 2d 73 70 65 63 69 66 69 63 0d 0a 20 20 20  le-specific..   
5280: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 63       #       pac
5290: 6b 61 67 65 20 73 75 62 2d 64 69 72 65 63 74 6f  kage sub-directo
52a0: 72 79 2e 20 20 46 61 69 6c 69 6e 67 20 74 68 61  ry.  Failing tha
52b0: 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 75  t, fallback to u
52c0: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
52d0: 20 20 20 20 20 20 74 68 65 20 62 61 73 65 20 70        the base p
52e0: 61 63 6b 61 67 65 20 70 61 74 68 20 69 74 73 65  ackage path itse
52f0: 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  lf...        #..
5300: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5310: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
5320: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
5330: 3a 3a 74 65 73 74 5f 70 61 63 6b 61 67 65 5f 70  ::test_package_p
5340: 61 74 68 20 45 61 67 6c 65 31 2e 30 20 24 66 69  ath Eagle1.0 $fi
5350: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d 0a 0d 0a 20  leNameOnly].... 
5360: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
5370: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
5380: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5390: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
53a0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
53b0: 3a 3a 74 65 73 74 5f 70 61 63 6b 61 67 65 5f 70  ::test_package_p
53c0: 61 74 68 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ath $fileNameOnl
53d0: 79 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  y]..        }...
53e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
53f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
5400: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 66 69  he test suite fi
5410: 6c 65 20 65 78 69 73 74 73 2c 20 61 64 64 20 69  le exists, add i
5420: 74 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  t to the list of
5430: 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
5440: 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20         names to 
5450: 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
5460: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
5470: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5480: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5490: 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
54a0: 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73 20 24 66  end fileNames $f
54b0: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
54c0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
54d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
54e0: 54 4f 44 4f 3a 20 49 66 20 61 64 64 69 74 69 6f  TODO: If additio
54f0: 6e 61 6c 20 74 65 73 74 20 73 75 69 74 65 20 66  nal test suite f
5500: 69 6c 65 73 20 61 72 65 20 61 64 64 65 64 20 77  iles are added w
5510: 69 74 68 69 6e 20 74 68 65 20 74 65 73 74 0d 0a  ithin the test..
5520: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
5530: 63 6b 61 67 65 20 70 61 74 68 2c 20 61 64 64 20  ckage path, add 
5540: 74 68 65 6d 20 68 65 72 65 20 61 73 20 77 65 6c  them here as wel
5550: 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  l...      #..   
5560: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
5570: 61 6d 65 4f 6e 6c 79 20 5b 6c 69 73 74 20 5c 0d  ameOnly [list \.
5580: 0a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 2e 65  .          all.e
5590: 61 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  agle constraints
55a0: 2e 65 61 67 6c 65 20 65 70 69 6c 6f 67 75 65 2e  .eagle epilogue.
55b0: 65 61 67 6c 65 20 70 6b 67 49 6e 64 65 78 2e 65  eagle pkgIndex.e
55c0: 61 67 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  agle \..        
55d0: 20 20 70 6b 67 49 6e 64 65 78 2e 74 63 6c 20 70    pkgIndex.tcl p
55e0: 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 5d 20 7b  rologue.eagle] {
55f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5600: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
5610: 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  st, check if the
5620: 20 66 69 6c 65 20 72 65 73 69 64 65 73 20 69 6e   file resides in
5630: 20 74 68 65 20 45 61 67 6c 65 2d 73 70 65 63 69   the Eagle-speci
5640: 66 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20  fic..        #  
5650: 20 20 20 20 20 70 61 63 6b 61 67 65 20 73 75 62       package sub
5660: 2d 64 69 72 65 63 74 6f 72 79 2e 20 20 46 61 69  -directory.  Fai
5670: 6c 69 6e 67 20 74 68 61 74 2c 20 66 61 6c 6c 62  ling that, fallb
5680: 61 63 6b 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20  ack to using..  
5690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
56a0: 65 20 62 61 73 65 20 70 61 63 6b 61 67 65 20 70  e base package p
56b0: 61 74 68 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20  ath itself...   
56c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
56d0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
56e0: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
56f0: 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 70         $::test_p
5700: 61 63 6b 61 67 65 5f 70 61 74 68 20 54 65 73 74  ackage_path Test
5710: 31 2e 30 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  1.0 $fileNameOnl
5720: 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  y]....        if
5730: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
5740: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
5760: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5770: 20 6a 6f 69 6e 20 24 3a 3a 74 65 73 74 5f 70 61   join $::test_pa
5780: 63 6b 61 67 65 5f 70 61 74 68 20 24 66 69 6c 65  ckage_path $file
5790: 4e 61 6d 65 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20  NameOnly]..     
57a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
57b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
57c0: 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73  E: If the test s
57d0: 75 69 74 65 20 66 69 6c 65 20 65 78 69 73 74 73  uite file exists
57e0: 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
57f0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 0d 0a 20 20  list of file..  
5800: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5810: 6d 65 73 20 74 6f 20 70 72 6f 63 65 73 73 2e 0d  mes to process..
5820: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5830: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5840: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5850: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5860: 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e     lappend fileN
5870: 61 6d 65 73 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  ames $fileName..
5880: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5890: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
58a0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
58b0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73  Check if the tes
58c0: 74 20 70 61 63 6b 61 67 65 20 70 61 74 68 20 69  t package path i
58d0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
58e0: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e    #..    if {[in
58f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
5900: 5f 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a  _path]} then {..
5910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5920: 20 54 4f 44 4f 3a 20 49 66 20 61 64 64 69 74 69   TODO: If additi
5930: 6f 6e 61 6c 20 74 65 73 74 20 73 75 69 74 65 20  onal test suite 
5940: 66 69 6c 65 73 20 61 72 65 20 61 64 64 65 64 20  files are added 
5950: 77 69 74 68 69 6e 20 74 68 65 20 74 65 73 74 0d  within the test.
5960: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
5970: 75 69 74 65 20 70 61 74 68 2c 20 61 64 64 20 74  uite path, add t
5980: 68 65 6d 20 68 65 72 65 20 61 73 20 77 65 6c 6c  hem here as well
5990: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
59a0: 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
59b0: 6d 65 4f 6e 6c 79 20 5b 6c 69 73 74 20 61 6c 6c  meOnly [list all
59c0: 2e 65 61 67 6c 65 20 65 70 69 6c 6f 67 75 65 2e  .eagle epilogue.
59d0: 65 61 67 6c 65 20 70 72 6f 6c 6f 67 75 65 2e 65  eagle prologue.e
59e0: 61 67 6c 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20  agle] {..       
59f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5a00: 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
5a10: 20 66 69 6c 65 20 72 65 73 69 64 65 73 20 69 6e   file resides in
5a20: 20 74 68 65 20 74 65 73 74 20 70 61 63 6b 61 67   the test packag
5a30: 65 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  e directory...  
5a40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5a50: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
5a60: 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 74 65 73 74  ile join $::test
5a70: 5f 70 61 74 68 20 24 66 69 6c 65 4e 61 6d 65 4f  _path $fileNameO
5a80: 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nly]....        
5a90: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5aa0: 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73  E: If the test s
5ab0: 75 69 74 65 20 66 69 6c 65 20 65 78 69 73 74 73  uite file exists
5ac0: 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
5ad0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 0d 0a 20 20  list of file..  
5ae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5af0: 6d 65 73 20 74 6f 20 70 72 6f 63 65 73 73 2e 0d  mes to process..
5b00: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5b10: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5b20: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5b30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5b40: 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e     lappend fileN
5b50: 61 6d 65 73 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  ames $fileName..
5b60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5b70: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
5b80: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
5b90: 44 69 64 20 77 65 20 66 69 6e 64 20 61 6e 79 20  Did we find any 
5ba0: 74 65 73 74 20 73 75 69 74 65 20 66 69 6c 65 73  test suite files
5bb0: 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ?..    #..    if
5bc0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65   {[llength $file
5bd0: 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  Names] > 0} then
5be0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
5bf0: 20 20 20 23 20 4e 4f 54 45 3a 20 45 61 67 6c 65     # NOTE: Eagle
5c00: 20 68 61 73 20 61 20 62 75 69 6c 74 2d 69 6e 20   has a built-in 
5c10: 68 61 73 68 69 6e 67 20 63 6f 6d 6d 61 6e 64 3b  hashing command;
5c20: 20 68 6f 77 65 76 65 72 2c 20 54 63 6c 20 72 65   however, Tcl re
5c30: 71 75 69 72 65 73 0d 0a 20 20 20 20 20 20 23 20  quires..      # 
5c40: 20 20 20 20 20 20 61 20 70 61 63 6b 61 67 65 2e        a package.
5c50: 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 63    Make sure we c
5c60: 61 6e 20 68 61 73 68 20 63 6f 6e 74 65 6e 74 20  an hash content 
5c70: 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e  before proceedin
5c80: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
5c90: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
5ca0: 20 7c 7c 20 5b 63 61 74 63 68 20 7b 70 61 63 6b   || [catch {pack
5cb0: 61 67 65 20 72 65 71 75 69 72 65 20 73 68 61 31  age require sha1
5cc0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
5cd0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
5ce0: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
5cf0: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
5d00: 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e   fileName $fileN
5d10: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
5d20: 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
5d30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5d40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5d50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
5d60: 74 68 65 20 72 65 6c 61 74 69 76 65 6c 79 20 6e  the relatively n
5d70: 65 77 20 2d 66 69 6c 65 6e 61 6d 65 20 6f 70 74  ew -filename opt
5d80: 69 6f 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65  ion to the Eagle
5d90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
5da0: 20 20 20 20 20 20 5b 68 61 73 68 5d 20 63 6f 6d        [hash] com
5db0: 6d 61 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  mand...         
5dc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5dd0: 20 20 73 65 74 20 73 68 61 31 20 5b 68 61 73 68    set sha1 [hash
5de0: 20 6e 6f 72 6d 61 6c 20 2d 66 69 6c 65 6e 61 6d   normal -filenam
5df0: 65 20 73 68 61 31 20 24 66 69 6c 65 4e 61 6d 65  e sha1 $fileName
5e00: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
5e10: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
5e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5e30: 20 20 23 20 42 55 47 42 55 47 3a 20 41 70 70 61    # BUGBUG: Appa
5e40: 72 65 6e 74 6c 79 2c 20 74 68 65 20 41 63 74 69  rently, the Acti
5e50: 76 65 53 74 61 74 65 20 74 63 6c 6c 69 62 20 73  veState tcllib s
5e60: 68 61 31 20 70 61 63 6b 61 67 65 20 6d 61 79 0d  ha1 package may.
5e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
5e80: 20 20 20 20 20 20 20 68 61 76 65 20 61 20 62 75         have a bu
5e90: 67 20 74 68 61 74 20 70 72 6f 64 75 63 65 73 20  g that produces 
5ea0: 74 68 65 20 77 72 6f 6e 67 20 76 61 6c 75 65 73  the wrong values
5eb0: 20 68 65 72 65 2e 20 20 4e 6f 0d 0a 20 20 20 20   here.  No..    
5ec0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5ed0: 20 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64    attempt is mad
5ee0: 65 20 68 65 72 65 20 74 6f 20 77 6f 72 6b 20 61  e here to work a
5ef0: 72 6f 75 6e 64 20 61 6e 79 20 73 75 63 68 20 62  round any such b
5f00: 75 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ug...           
5f10: 20 23 20 20 20 20 20 20 20 20 20 46 6f 72 20 66   #         For f
5f20: 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
5f30: 6f 6e 2c 20 70 6c 65 61 73 65 20 73 65 65 3a 0d  on, please see:.
5f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
5f60: 20 20 20 20 20 20 68 74 74 70 73 3a 2f 2f 63 6f        https://co
5f70: 72 65 2e 74 63 6c 2e 74 6b 2f 74 63 6c 6c 69 62  re.tcl.tk/tcllib
5f80: 2f 69 6e 66 6f 2f 61 64 32 30 34 35 34 30 32 33  /info/ad20454023
5f90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
5fb0: 20 73 68 61 31 20 5b 73 68 61 31 3a 3a 73 68 61   sha1 [sha1::sha
5fc0: 31 20 2d 68 65 78 20 2d 66 69 6c 65 6e 61 6d 65  1 -hex -filename
5fd0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
5fe0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
5ff0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
6000: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
6010: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6020: 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 5c 22 22    "---- file \""
6030: 20 24 66 69 6c 65 4e 61 6d 65 20 22 5c 22 2e 2e   $fileName "\"..
6040: 2e 20 73 68 61 31 20 28 22 20 24 73 68 61 31 20  . sha1 (" $sha1 
6050: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ")\n"]..        
6060: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
6070: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6080: 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65  We are done here
6090: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20  , return now... 
60a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
60b0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
60c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
60d0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
60e0: 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70  o\n..  }.....  p
60f0: 72 6f 63 20 63 68 65 63 6b 46 6f 72 50 6c 61 74  roc checkForPlat
6100: 66 6f 72 6d 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  form { channel }
6110: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
6120: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
6130: 63 6b 69 6e 67 20 66 6f 72 20 70 6c 61 74 66 6f  cking for platfo
6140: 72 6d 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69  rm... "....    i
6150: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6160: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  ::tcl_platform(p
6170: 6c 61 74 66 6f 72 6d 29 5d 7d 20 74 68 65 6e 20  latform)]} then 
6180: 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  {..      addCons
6190: 74 72 61 69 6e 74 20 24 3a 3a 74 63 6c 5f 70 6c  traint $::tcl_pl
61a0: 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
61b0: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
61c0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
61d0: 41 72 67 73 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  Args $::tcl_plat
61e0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 5c  form(platform) \
61f0: 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  n]..    } else {
6200: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
6210: 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
6220: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
6260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6270: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
6280: 20 20 69 66 20 7b 21 5b 69 73 45 61 67 6c 65 5d    if {![isEagle]
6290: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
62a0: 23 0d 0a 20 20 20 20 20 20 23 20 42 55 47 46 49  #..      # BUGFI
62b0: 58 3a 20 57 65 20 64 6f 20 6e 6f 74 20 6e 6f 72  X: We do not nor
62c0: 6d 61 6c 6c 79 20 77 61 6e 74 20 74 6f 20 73 6b  mally want to sk
62d0: 69 70 20 61 6e 79 20 4d 6f 6e 6f 20 62 75 67 73  ip any Mono bugs
62e0: 20 69 6e 20 6e 61 74 69 76 65 20 54 63 6c 2e 0d   in native Tcl..
62f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6300: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
6310: 73 20 3a 3a 6e 6f 28 72 75 6e 74 69 6d 65 56 65  s ::no(runtimeVe
6320: 72 73 69 6f 6e 29 5d 7d 20 74 68 65 6e 20 7b 0d  rsion)]} then {.
6330: 0a 20 20 20 20 20 20 20 20 61 64 64 4b 6e 6f 77  .        addKnow
6340: 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61 69 6e 74 73  nMonoConstraints
6350: 20 74 72 75 65 3b 20 23 20 72 75 6e 6e 69 6e 67   true; # running
6360: 20 69 6e 20 6e 61 74 69 76 65 20 54 63 6c 2e 0d   in native Tcl..
6370: 0a 20 20 20 20 20 20 20 20 61 64 64 4b 6e 6f 77  .        addKnow
6380: 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61 69 6e 74 73  nMonoConstraints
6390: 20 66 61 6c 73 65 3b 20 23 20 72 75 6e 6e 69 6e   false; # runnin
63a0: 67 20 69 6e 20 6e 61 74 69 76 65 20 54 63 6c 2e  g in native Tcl.
63b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
63c0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
63d0: 20 63 68 65 63 6b 46 6f 72 57 69 6e 64 6f 77 73   checkForWindows
63e0: 56 65 72 73 69 6f 6e 20 7b 20 63 68 61 6e 6e 65  Version { channe
63f0: 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
6400: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
6410: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 57 69 6e  checking for Win
6420: 64 6f 77 73 20 76 65 72 73 69 6f 6e 2e 2e 2e 20  dows version... 
6430: 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  "....    #..    
6440: 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 72  # NOTE: Are we r
6450: 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77  unning on Window
6460: 73 20 61 74 20 61 6c 6c 3f 0d 0a 20 20 20 20 23  s at all?..    #
6470: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e  ..    if {[isWin
6480: 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
6490: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
64a0: 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70 65  NOTE: Is the spe
64b0: 63 69 66 69 63 20 4f 53 20 6e 61 6d 65 20 61 6e  cific OS name an
64c0: 64 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  d version number
64d0: 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20   available?..   
64e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
64f0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
6500: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 5d  cl_platform(os)]
6510: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
6520: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
6530: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
6540: 6f 73 29 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  os)] > 0 && \.. 
6550: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
6560: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
6570: 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d  form(osVersion)]
6580: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
6590: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
65a0: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
65b0: 6f 73 56 65 72 73 69 6f 6e 29 5d 20 3e 20 30 20  osVersion)] > 0 
65c0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
65d0: 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e 5c 64 2b  [regexp -- {^\d+
65e0: 5c 2e 5c 64 2b 24 7d 20 24 3a 3a 74 63 6c 5f 70  \.\d+$} $::tcl_p
65f0: 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f  latform(osVersio
6600: 6e 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  n)]} then {..   
6610: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6620: 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
6630: 20 72 65 70 6f 72 74 65 64 20 57 69 6e 64 6f 77   reported Window
6640: 73 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20  s version...    
6650: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
6660: 65 74 20 6f 73 56 65 72 73 69 6f 6e 20 24 3a 3a  et osVersion $::
6670: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56  tcl_platform(osV
6680: 65 72 73 69 6f 6e 29 0d 0a 0d 0a 20 20 20 20 20  ersion)....     
6690: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
66a0: 4e 4f 54 45 3a 20 44 6f 75 62 6c 65 20 63 68 65  NOTE: Double che
66b0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 6e  ck that we are n
66c0: 6f 74 20 62 65 69 6e 67 20 6c 69 65 64 20 74 6f  ot being lied to
66d0: 20 62 79 20 57 69 6e 64 6f 77 73 0d 0a 20 20 20   by Windows..   
66e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6f       #       abo
66f0: 75 74 20 69 74 73 20 72 65 61 6c 20 76 65 72 73  ut its real vers
6700: 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d 0a 20 20 20  ion number...   
6710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6720: 73 65 74 20 65 78 74 72 61 20 22 22 0d 0a 0d 0a  set extra ""....
6730: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 6e          if {[can
6740: 45 78 65 63 43 6f 6d 53 70 65 63 5d 20 26 26 20  ExecComSpec] && 
6750: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
6760: 6e 76 28 43 6f 6d 53 70 65 63 29 5d 7d 20 74 68  nv(ComSpec)]} th
6770: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
6780: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
6790: 4f 54 45 3a 20 54 61 6b 65 20 61 64 76 61 6e 74  OTE: Take advant
67a0: 61 67 65 20 6f 66 20 74 68 65 20 57 69 6e 64 6f  age of the Windo
67b0: 77 73 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 63 65  ws command proce
67c0: 73 73 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 20  ssor to..       
67d0: 20 20 20 23 20 20 20 20 20 20 20 72 75 6e 20 69     #       run i
67e0: 74 73 20 69 6e 74 65 72 6e 61 6c 20 56 45 52 20  ts internal VER 
67f0: 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20 61  command, which a
6800: 70 70 65 61 72 73 20 74 6f 20 61 6c 77 61 79 73  ppears to always
6810: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
6820: 20 20 20 20 72 65 70 6f 72 74 20 74 68 65 20 72      report the r
6830: 65 61 6c 20 57 69 6e 64 6f 77 73 20 76 65 72 73  eal Windows vers
6840: 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d 0a 20 20 20  ion number...   
6850: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6860: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
6870: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ..            ex
6880: 65 63 20 24 3a 3a 65 6e 76 28 43 6f 6d 53 70 65  ec $::env(ComSpe
6890: 63 29 20 2f 43 20 56 45 52 0d 0a 20 20 20 20 20  c) /C VER..     
68a0: 20 20 20 20 20 7d 20 63 6f 6d 53 70 65 63 56 65       } comSpecVe
68b0: 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26 20 5c  rsion] == 0 && \
68c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
68d0: 5b 72 65 67 65 78 70 20 2d 2d 20 7b 56 65 72 73  [regexp -- {Vers
68e0: 69 6f 6e 20 28 5c 64 2b 5c 2e 5c 64 2b 29 7d 20  ion (\d+\.\d+)} 
68f0: 24 63 6f 6d 53 70 65 63 56 65 72 73 69 6f 6e 20  $comSpecVersion 
6900: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
6910: 20 64 75 6d 6d 79 20 63 6f 6d 53 70 65 63 56 65   dummy comSpecVe
6920: 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rsion]} then {..
6930: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
6940: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
6950: 45 3a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  E: If the value 
6960: 72 65 70 6f 72 74 65 64 20 74 6f 20 74 68 65 20  reported to the 
6970: 70 72 6f 63 65 73 73 20 64 6f 65 73 20 6e 6f 74  process does not
6980: 20 6d 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20   match..        
6990: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
69a0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 66  value returned f
69b0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
69c0: 63 6f 6d 6d 61 6e 64 20 70 72 6f 63 65 73 73 6f  command processo
69d0: 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r,..            
69e0: 23 20 20 20 20 20 20 20 72 65 70 6c 61 63 65 20  #       replace 
69f0: 69 74 2e 20 20 57 65 20 6d 75 73 74 20 6b 6e 6f  it.  We must kno
6a00: 77 20 74 68 65 20 72 65 61 6c 20 57 69 6e 64 6f  w the real Windo
6a10: 77 73 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20  ws version...   
6a20: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
6a30: 20 20 20 20 20 20 20 20 69 66 20 7b 24 6f 73 56          if {$osV
6a40: 65 72 73 69 6f 6e 20 65 71 20 24 63 6f 6d 53 70  ersion eq $comSp
6a50: 65 63 56 65 72 73 69 6f 6e 7d 20 74 68 65 6e 20  ecVersion} then 
6a60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
6a70: 20 73 65 74 20 65 78 74 72 61 20 22 2d 2d 2d 2d   set extra "----
6a80: 20 72 65 70 6f 72 74 65 64 20 61 6e 64 20 64 65   reported and de
6a90: 74 65 63 74 65 64 20 57 69 6e 64 6f 77 73 20 76  tected Windows v
6aa0: 65 72 73 69 6f 6e 73 20 6d 61 74 63 68 5c 6e 22  ersions match\n"
6ab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
6ac0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
6ad0: 20 20 20 20 20 20 73 65 74 20 65 78 74 72 61 20        set extra 
6ae0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
6b10: 72 65 70 6f 72 74 65 64 20 61 6e 64 20 64 65 74  reported and det
6b20: 65 63 74 65 64 20 57 69 6e 64 6f 77 73 20 76 65  ected Windows ve
6b30: 72 73 69 6f 6e 73 20 22 20 5c 0d 0a 20 20 20 20  rsions " \..    
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 64                "d
6b50: 6f 20 6e 6f 74 20 6d 61 74 63 68 3a 20 22 20 24  o not match: " $
6b60: 6f 73 56 65 72 73 69 6f 6e 20 22 20 76 65 72 73  osVersion " vers
6b70: 75 73 20 22 20 24 63 6f 6d 53 70 65 63 56 65 72  us " $comSpecVer
6b80: 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
6b90: 20 20 20 20 20 20 20 20 20 20 22 2c 20 72 65 73            ", res
6ba0: 65 74 74 69 6e 67 2e 2e 2e 5c 6e 22 5d 0d 0a 0d  etting...\n"]...
6bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
6bc0: 65 74 20 6f 73 56 65 72 73 69 6f 6e 20 24 63 6f  et osVersion $co
6bd0: 6d 53 70 65 63 56 65 72 73 69 6f 6e 0d 0a 20 20  mSpecVersion..  
6be0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
6bf0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6c00: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
6c10: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6c20: 3a 20 53 74 61 72 74 20 6f 75 74 20 77 69 74 68  : Start out with
6c30: 20 74 68 65 20 4f 53 20 6e 61 6d 65 2c 20 72 65   the OS name, re
6c40: 6d 6f 76 69 6e 67 20 61 6c 6c 20 73 70 61 63 65  moving all space
6c50: 73 20 61 6e 64 20 74 68 65 6e 0d 0a 20 20 20 20  s and then..    
6c60: 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65      #       appe
6c70: 6e 64 20 74 68 65 20 72 65 70 6f 72 74 65 64 20  nd the reported 
6c80: 28 6f 72 20 64 65 74 65 63 74 65 64 29 20 4f 53  (or detected) OS
6c90: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e   version number.
6ca0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6cb0: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
6cc0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
6ce0: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22 20  ing map [list " 
6cf0: 22 20 22 22 5d 20 24 3a 3a 74 63 6c 5f 70 6c 61  " ""] $::tcl_pla
6d00: 74 66 6f 72 6d 28 6f 73 29 5d 20 5f 20 5c 0d 0a  tform(os)] _ \..
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 24 6f 73 56              $osV
6d20: 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ersion]....     
6d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6d40: 4e 4f 54 45 3a 20 41 64 64 20 63 6f 6e 73 74 72  NOTE: Add constr
6d50: 61 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  aint containing 
6d60: 74 68 65 20 4f 53 20 6e 61 6d 65 20 61 6e 64 20  the OS name and 
6d70: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 0d  version number..
6d80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6d90: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
6da0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6f 73  t [appendArgs os
6db0: 56 65 72 73 69 6f 6e 2e 20 24 76 65 72 73 69 6f  Version. $versio
6dc0: 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
6dd0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6de0: 20 53 68 6f 77 20 77 68 61 74 20 77 65 20 66 6f   Show what we fo
6df0: 75 6e 64 20 66 6f 72 20 74 68 65 20 4f 53 20 6e  und for the OS n
6e00: 61 6d 65 20 61 6e 64 20 76 65 72 73 69 6f 6e 20  ame and version 
6e10: 6e 75 6d 62 65 72 2e 0d 0a 20 20 20 20 20 20 20  number...       
6e20: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
6e30: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
6e40: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
6e50: 20 20 20 20 20 20 22 79 65 73 20 28 22 20 24 3a        "yes (" $:
6e60: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73  :tcl_platform(os
6e70: 29 20 22 20 76 22 20 24 6f 73 56 65 72 73 69 6f  ) " v" $osVersio
6e80: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
6e90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6ea0: 20 4e 4f 54 45 3a 20 4c 6f 67 20 61 6e 79 20 65   NOTE: Log any e
6eb0: 78 74 72 61 20 6d 65 73 73 61 67 65 20 6e 6f 77  xtra message now
6ec0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6ed0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
6ee0: 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d  g length $extra]
6ef0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
6f00: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
6f10: 68 61 6e 6e 65 6c 20 24 65 78 74 72 61 0d 0a 20  hannel $extra.. 
6f20: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
6f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6f40: 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f   NOTE: We are do
6f50: 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20  ne here, return 
6f60: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
6f70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
6f80: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6f90: 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  ...    tputs $ch
6fa0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d  annel no\n..  }.
6fb0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
6fc0: 46 6f 72 4f 70 65 72 61 74 69 6e 67 53 79 73 74  ForOperatingSyst
6fd0: 65 6d 55 70 64 61 74 65 20 7b 20 63 68 61 6e 6e  emUpdate { chann
6fe0: 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  el name } {..   
6ff0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
7000: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
7010: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
7020: 63 6b 69 6e 67 20 66 6f 72 20 6f 70 65 72 61 74  cking for operat
7030: 69 6e 67 20 73 79 73 74 65 6d 20 75 70 64 61 74  ing system updat
7040: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
7050: 20 24 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d   $name "\"... "]
7060: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
7070: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70   NOTE: Is the sp
7080: 65 63 69 66 69 63 20 4f 53 20 75 70 64 61 74 65  ecific OS update
7090: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 73 74 61   currently insta
70a0: 6c 6c 65 64 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  lled?..    #..  
70b0: 20 20 69 66 20 7b 5b 68 61 76 65 54 63 6c 50 6c    if {[haveTclPl
70c0: 61 74 66 6f 72 6d 4f 73 45 78 74 72 61 55 70 64  atformOsExtraUpd
70d0: 61 74 65 4e 61 6d 65 20 24 6e 61 6d 65 5d 7d 20  ateName $name]} 
70e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
70f0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
7100: 65 6e 64 41 72 67 73 20 6f 73 55 70 64 61 74 65  endArgs osUpdate
7110: 20 2e 20 5b 63 6c 65 61 6e 43 6f 6e 73 74 72 61   . [cleanConstra
7120: 69 6e 74 4e 61 6d 65 20 24 6e 61 6d 65 5d 5d 0d  intName $name]].
7130: 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
7140: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
7150: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7160: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
7170: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
7180: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
7190: 65 63 6b 46 6f 72 53 63 72 69 70 74 4c 69 62 72  eckForScriptLibr
71a0: 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ary { channel } 
71b0: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
71c0: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
71d0: 6b 69 6e 67 20 66 6f 72 20 73 63 72 69 70 74 20  king for script 
71e0: 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
71f0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
7200: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 76 61  E: See if the va
7210: 72 69 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  riable containin
7220: 67 20 74 68 65 20 73 63 72 69 70 74 20 6c 69 62  g the script lib
7230: 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 0d 0a 20  rary location.. 
7240: 20 20 20 23 20 20 20 20 20 20 20 65 78 69 73 74     #       exist
7250: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  s...    #..    i
7260: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
7270: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26  ::tcl_library] &
7280: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74  & \..        [st
7290: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
72a0: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 7d  cl_library] > 0}
72b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
72c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
72d0: 4e 6f 77 20 73 65 65 20 69 66 20 74 68 65 20 73  Now see if the s
72e0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 69 73  cript library is
72f0: 20 65 78 74 65 72 6e 61 6c 20 6f 72 20 65 6d 62   external or emb
7300: 65 64 64 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  edded...      #.
7310: 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
7320: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a 3a   isdirectory $::
7330: 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68  tcl_library]} th
7340: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
7350: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
7360: 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
7370: 20 74 6f 20 62 65 20 61 20 64 69 72 65 63 74 6f   to be a directo
7380: 72 79 20 6e 61 6d 65 2c 20 77 68 69 63 68 20 73  ry name, which s
7390: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23  hould..        #
73a0: 20 20 20 20 20 20 20 6d 65 61 6e 20 74 68 61 74         mean that
73b0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 66   the necessary f
73c0: 69 6c 65 73 20 61 72 65 20 70 68 79 73 69 63 61  iles are physica
73d0: 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 0d 0a 20  lly contained.. 
73e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
73f0: 69 74 68 69 6e 20 69 74 2e 0d 0a 20 20 20 20 20  ithin it...     
7400: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
7410: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 5f  dConstraint tcl_
7420: 6c 69 62 72 61 72 79 5f 65 78 74 65 72 6e 61 6c  library_external
7430: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
7440: 73 20 24 63 68 61 6e 6e 65 6c 20 22 79 65 73 20  s $channel "yes 
7450: 28 65 78 74 65 72 6e 61 6c 29 5c 6e 22 0d 0a 0d  (external)\n"...
7460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
7480: 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65  re done here, re
7490: 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  turn now...     
74a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
74b0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  turn..      } el
74c0: 73 65 69 66 20 7b 5b 66 69 6c 65 20 69 73 66 69  seif {[file isfi
74d0: 6c 65 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  le $::tcl_librar
74e0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
74f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7500: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61   NOTE: Yes, it a
7510: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 66  ppears to be a f
7520: 69 6c 65 20 6e 61 6d 65 2c 20 77 68 69 63 68 20  ile name, which 
7530: 73 68 6f 75 6c 64 20 6d 65 61 6e 0d 0a 20 20 20  should mean..   
7540: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
7550: 74 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  t the necessary 
7560: 66 69 6c 65 73 20 61 72 65 20 70 68 79 73 69 63  files are physic
7570: 61 6c 6c 79 20 65 6d 62 65 64 64 65 64 20 77 69  ally embedded wi
7580: 74 68 69 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  thin..        # 
7590: 20 20 20 20 20 20 69 74 2e 0d 0a 20 20 20 20 20        it...     
75a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
75b0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 5f  dConstraint tcl_
75c0: 6c 69 62 72 61 72 79 5f 65 6d 62 65 64 64 65 64  library_embedded
75d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
75e0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 79 65 73 20  s $channel "yes 
75f0: 28 65 6d 62 65 64 64 65 64 29 5c 6e 22 0d 0a 0d  (embedded)\n"...
7600: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7610: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
7620: 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65  re done here, re
7630: 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  turn now...     
7640: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7650: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  turn..      }.. 
7660: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74     }....    tput
7670: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
7680: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
7690: 63 68 65 63 6b 46 6f 72 56 61 72 69 61 62 6c 65  checkForVariable
76a0: 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20   { channel name 
76b0: 7b 6e 6f 74 45 6d 70 74 79 20 74 72 75 65 7d 20  {notEmpty true} 
76c0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20  {constraint ""} 
76d0: 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
76e0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
76f0: 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
7700: 6e 67 20 66 6f 72 20 76 61 72 69 61 62 6c 65 20  ng for variable 
7710: 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20  \"" $name \..   
7720: 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
7730: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
7740: 4f 54 45 3a 20 46 69 72 73 74 2c 20 6e 6f 72 6d  OTE: First, norm
7750: 61 6c 69 7a 65 20 74 68 65 20 76 61 72 69 61 62  alize the variab
7760: 6c 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 69 6e  le name to be in
7770: 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 63 6f 70   the global scop
7780: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  e...    #..    s
7790: 65 74 20 6e 65 77 4e 61 6d 65 20 5b 61 70 70 65  et newName [appe
77a0: 6e 64 41 72 67 73 20 3a 3a 20 5b 73 74 72 69 6e  ndArgs :: [strin
77b0: 67 20 74 72 69 6d 6c 65 66 74 20 24 6e 61 6d 65  g trimleft $name
77c0: 20 3a 5d 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20   :]]....    #.. 
77d0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c     # NOTE: Next,
77e0: 20 61 6c 77 61 79 73 20 63 68 65 63 6b 20 69 66   always check if
77f0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69   it actually exi
7800: 73 74 73 20 28 61 73 20 6f 66 20 72 69 67 68 74  sts (as of right
7810: 20 6e 6f 77 29 2e 0d 0a 20 20 20 20 23 0d 0a 20   now)...    #.. 
7820: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
7830: 73 74 73 20 24 6e 65 77 4e 61 6d 65 5d 7d 20 74  sts $newName]} t
7840: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  hen {..      #..
7850: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
7860: 78 74 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 63  xt, optionally c
7870: 68 65 63 6b 20 69 66 20 69 74 20 63 6f 6e 73 74  heck if it const
7880: 61 69 6e 73 20 61 6e 79 74 68 69 6e 67 2e 0d 0a  ains anything...
7890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
78a0: 66 20 7b 21 24 6e 6f 74 45 6d 70 74 79 20 7c 7c  f {!$notEmpty ||
78b0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
78c0: 5b 73 65 74 20 24 6e 65 77 4e 61 6d 65 5d 5d 20  [set $newName]] 
78d0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
78e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
78f0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
7900: 61 62 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  able exists and 
7910: 69 74 20 65 69 74 68 65 72 20 63 6f 6e 74 61 69  it either contai
7920: 6e 73 20 73 6f 6d 65 74 68 69 6e 67 0d 0a 20 20  ns something..  
7930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 72        #       or
7940: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
7950: 61 62 6f 75 74 20 69 74 73 20 63 6f 6e 74 65 6e  about its conten
7960: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
7970: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
7980: 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73  ing length $cons
7990: 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20 74 68 65  traint] > 0} the
79a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61  n {..          a
79b0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
79c0: 70 65 6e 64 41 72 67 73 20 76 61 72 69 61 62 6c  pendArgs variabl
79d0: 65 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 0d  e_ $constraint].
79e0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
79f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  {..          add
7a00: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
7a10: 6e 64 41 72 67 73 20 76 61 72 69 61 62 6c 65 5f  ndArgs variable_
7a20: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 6c 65 66   [string trimlef
7a30: 74 20 24 6e 65 77 4e 61 6d 65 20 3a 5d 5d 0d 0a  t $newName :]]..
7a40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
7a50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7a60: 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
7a70: 74 20 77 65 20 66 6f 75 6e 64 20 74 68 65 20 76  t we found the v
7a80: 61 72 69 61 62 6c 65 20 61 6e 64 20 77 68 65 74  ariable and whet
7a90: 68 65 72 20 69 74 20 61 63 74 75 61 6c 6c 79 0d  her it actually.
7aa0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7ab0: 20 63 6f 6e 74 61 69 6e 65 64 20 61 6e 79 74 68   contained anyth
7ac0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ing...        #.
7ad0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
7ae0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
7af0: 72 67 73 20 22 79 65 73 20 28 22 20 5c 0d 0a 20  rgs "yes (" \.. 
7b00: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
7b10: 20 7b 24 6e 6f 74 45 6d 70 74 79 20 3f 20 22 65   {$notEmpty ? "e
7b20: 78 69 73 74 73 2c 20 6e 6f 74 20 65 6d 70 74 79  xists, not empty
7b30: 22 20 3a 20 22 65 78 69 73 74 73 22 7d 5d 20 22  " : "exists"}] "
7b40: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
7b50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7b60: 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
7b70: 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
7b80: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7b90: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
7ba0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
7bb0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7bc0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d  el no\n..  }....
7bd0: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
7be0: 54 63 6c 4f 70 74 69 6f 6e 73 20 7b 20 63 68 61  TclOptions { cha
7bf0: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
7c00: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
7c10: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
7c20: 54 63 6c 20 6f 70 74 69 6f 6e 73 2e 2e 2e 20 22  Tcl options... "
7c30: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 73  ....    if {![is
7c40: 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Eagle]} then {..
7c50: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
7c60: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
7c70: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7c80: 3a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 73  : This test cons
7c90: 74 72 61 69 6e 74 20 69 73 20 6e 65 65 64 65 64  traint is needed
7ca0: 20 62 79 20 74 65 73 74 20 22 62 65 6e 63 68 6d   by test "benchm
7cb0: 61 72 6b 2d 31 2e 32 32 22 2e 0d 0a 20 20 20 20  ark-1.22"...    
7cc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
7cd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
7ce0: 6f 28 63 6f 6d 70 69 6c 65 4e 61 74 69 76 65 29  o(compileNative)
7cf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7d00: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
7d10: 74 20 63 6f 6d 70 69 6c 65 2e 4e 41 54 49 56 45  t compile.NATIVE
7d20: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
7d30: 73 74 72 61 69 6e 74 20 63 6f 6d 70 69 6c 65 2e  straint compile.
7d40: 4e 41 54 49 56 45 0d 0a 20 20 20 20 20 20 7d 0d  NATIVE..      }.
7d50: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7d60: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 74    # NOTE: This t
7d70: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  est constraint i
7d80: 73 20 6e 65 65 64 65 64 20 62 79 20 74 65 73 74  s needed by test
7d90: 20 22 62 65 6e 63 68 6d 61 72 6b 2d 31 2e 32 32   "benchmark-1.22
7da0: 22 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  "...      #..   
7db0: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
7dc0: 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 6d 70 69 6c  ists ::no(compil
7dd0: 65 57 69 6e 64 6f 77 73 29 5d 7d 20 74 68 65 6e  eWindows)]} then
7de0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7df0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
7e00: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c  f the current pl
7e10: 61 74 66 6f 72 6d 20 69 73 20 57 69 6e 64 6f 77  atform is Window
7e20: 73 20 74 68 65 20 54 63 6c 20 62 69 6e 61 72 79  s the Tcl binary
7e30: 20 6d 75 73 74 20 68 61 76 65 0d 0a 20 20 20 20   must have..    
7e40: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e      #       been
7e50: 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72 20 57 69   compiled for Wi
7e60: 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20 20 20  ndows...        
7e70: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
7e80: 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
7e90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61   {..          la
7ea0: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 63 6f 6d  ppend result com
7eb0: 70 69 6c 65 2e 57 49 4e 44 4f 57 53 0d 0a 20 20  pile.WINDOWS..  
7ec0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
7ed0: 72 61 69 6e 74 20 63 6f 6d 70 69 6c 65 2e 57 49  raint compile.WI
7ee0: 4e 44 4f 57 53 0d 0a 20 20 20 20 20 20 20 20 7d  NDOWS..        }
7ef0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7f00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7f10: 54 45 3a 20 54 68 65 73 65 20 74 65 73 74 20 63  TE: These test c
7f20: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e  onstraints are n
7f30: 65 65 64 65 64 20 62 79 20 74 65 73 74 73 20 22  eeded by tests "
7f40: 73 6f 63 6b 65 74 2d 2a 2e 2a 22 2e 0d 0a 20 20  socket-*.*"...  
7f50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7f60: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
7f70: 3a 6e 6f 28 63 6f 6d 70 69 6c 65 4e 65 74 77 6f  :no(compileNetwo
7f80: 72 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rk)]} then {..  
7f90: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
7fa0: 73 75 6c 74 20 63 6f 6d 70 69 6c 65 2e 4e 45 54  sult compile.NET
7fb0: 57 4f 52 4b 0d 0a 20 20 20 20 20 20 20 20 61 64  WORK..        ad
7fc0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70  dConstraint comp
7fd0: 69 6c 65 2e 4e 45 54 57 4f 52 4b 0d 0a 20 20 20  ile.NETWORK..   
7fe0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
7ff0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
8000: 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 43 6f 6e 66  ::no(compileConf
8010: 69 67 75 72 61 74 69 6f 6e 29 5d 7d 20 74 68 65  iguration)]} the
8020: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  n {..        lap
8030: 70 65 6e 64 20 72 65 73 75 6c 74 20 63 6f 6d 70  pend result comp
8040: 69 6c 65 2e 43 4f 4e 46 49 47 55 52 41 54 49 4f  ile.CONFIGURATIO
8050: 4e 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  N..        addCo
8060: 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70 69 6c 65  nstraint compile
8070: 2e 43 4f 4e 46 49 47 55 52 41 54 49 4f 4e 0d 0a  .CONFIGURATION..
8080: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8090: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
80a0: 3a 20 4a 75 73 74 20 66 61 6b 65 20 74 68 65 20  : Just fake the 
80b0: 69 6e 76 61 72 69 61 6e 74 20 63 75 6c 74 75 72  invariant cultur
80c0: 65 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  e when running i
80d0: 6e 20 6e 61 74 69 76 65 20 54 63 6c 2e 0d 0a 20  n native Tcl... 
80e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
80f0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
8100: 3a 3a 6e 6f 28 63 75 6c 74 75 72 65 29 5d 7d 20  ::no(culture)]} 
8110: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8120: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 63  lappend result c
8130: 75 6c 74 75 72 65 2e 69 6e 76 61 72 69 61 6e 74  ulture.invariant
8140: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
8150: 73 74 72 61 69 6e 74 20 63 75 6c 74 75 72 65 2e  straint culture.
8160: 69 6e 76 61 72 69 61 6e 74 0d 0a 20 20 20 20 20  invariant..     
8170: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74   }....      tput
8180: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
8190: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
81a0: 72 65 73 75 6c 74 20 22 29 5c 6e 22 5d 0d 0a 20  result ")\n"].. 
81b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
81c0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
81d0: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
81e0: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
81f0: 65 63 6b 46 6f 72 57 69 6e 64 6f 77 73 43 6f 6d  eckForWindowsCom
8200: 6d 61 6e 64 50 72 6f 63 65 73 73 6f 72 20 7b 20  mandProcessor { 
8210: 63 68 61 6e 6e 65 6c 20 70 61 74 74 65 72 6e 20  channel pattern 
8220: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 22 22 7d 20  {constraint ""} 
8230: 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
8240: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
8250: 65 63 6b 69 6e 67 20 66 6f 72 20 57 69 6e 64 6f  ecking for Windo
8260: 77 73 20 43 6f 6d 6d 61 6e 64 20 50 72 6f 63 65  ws Command Proce
8270: 73 73 6f 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ssor... "....   
8280: 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d   if {[isWindows]
8290: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
82a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
82b0: 20 47 72 61 62 20 74 68 65 20 22 43 6f 6d 53 70   Grab the "ComSp
82c0: 65 63 22 20 66 72 6f 6d 20 74 68 65 20 57 69 6e  ec" from the Win
82d0: 64 6f 77 73 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  dows environment
82e0: 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69   and make sure i
82f0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
8300: 20 6d 61 74 63 68 65 73 20 74 68 65 20 66 69 6c   matches the fil
8310: 65 20 70 61 74 74 65 72 6e 20 73 75 70 70 6c 69  e pattern suppli
8320: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
8330: 20 28 65 2e 67 2e 20 22 63 6d 64 2e 65 78 65 22   (e.g. "cmd.exe"
8340: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
8350: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
8360: 73 74 73 20 3a 3a 65 6e 76 28 43 6f 6d 53 70 65  sts ::env(ComSpe
8370: 63 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  c)] && \..      
8380: 20 20 20 20 5b 73 74 72 69 6e 67 20 6d 61 74 63      [string matc
8390: 68 20 2d 6e 6f 63 61 73 65 20 24 70 61 74 74 65  h -nocase $patte
83a0: 72 6e 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  rn [file tail $:
83b0: 3a 65 6e 76 28 43 6f 6d 53 70 65 63 29 5d 5d 7d  :env(ComSpec)]]}
83c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
83d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
83e0: 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69  TE: We are runni
83f0: 6e 67 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  ng with a matchi
8400: 6e 67 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 63 65  ng command proce
8410: 73 73 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  ssor...        #
8420: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
8430: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 6f  tring length $co
8440: 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20 74  nstraint] > 0} t
8450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
8460: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
8470: 61 70 70 65 6e 64 41 72 67 73 20 63 6f 6d 53 70  appendArgs comSp
8480: 65 63 5f 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d  ec_ $constraint]
8490: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
84a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
84b0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
84c0: 65 6e 64 41 72 67 73 20 63 6f 6d 53 70 65 63 5f  endArgs comSpec_
84d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
84e0: 20 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c    [string map [l
84f0: 69 73 74 20 2a 20 5f 20 2d 20 5f 20 3f 20 5f 20  ist * _ - _ ? _ 
8500: 5c 5b 20 5f 20 5c 5c 20 5f 20 5c 5d 20 5f 5d 20  \[ _ \\ _ \] _] 
8510: 24 70 61 74 74 65 72 6e 5d 5d 0d 0a 20 20 20 20  $pattern]]..    
8520: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8530: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
8540: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
8550: 20 28 5c 22 22 20 24 3a 3a 65 6e 76 28 43 6f 6d   (\"" $::env(Com
8560: 53 70 65 63 29 20 22 5c 22 29 5c 6e 22 5d 0d 0a  Spec) "\")\n"]..
8570: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8580: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
8590: 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72  are done here, r
85a0: 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20  eturn now...    
85b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
85c0: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
85d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75      }....    tpu
85e0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
85f0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
8600: 20 63 68 65 63 6b 46 6f 72 50 61 63 6b 61 67 65   checkForPackage
8610: 20 7b 20 63 68 61 6e 6e 65 6c 20 70 61 74 74 65   { channel patte
8620: 72 6e 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74  rn } {..    tput
8630: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
8640: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8650: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
8660: 20 66 6f 72 20 6c 6f 61 64 65 64 20 70 61 63 6b   for loaded pack
8670: 61 67 65 20 6d 61 74 63 68 69 6e 67 20 5c 22 22  age matching \""
8680: 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 70 61 74   \..        $pat
8690: 74 65 72 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tern "\"... "]..
86a0: 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68  ..    if {[catch
86b0: 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   {..      foreac
86c0: 68 20 6c 6f 61 64 65 64 20 5b 69 6e 66 6f 20 6c  h loaded [info l
86d0: 6f 61 64 65 64 5d 20 7b 0d 0a 20 20 20 20 20 20  oaded] {..      
86e0: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d    if {[regexp --
86f0: 20 24 70 61 74 74 65 72 6e 20 5b 6c 69 6e 64 65   $pattern [linde
8700: 78 20 24 6c 6f 61 64 65 64 20 65 6e 64 5d 5d 7d  x $loaded end]]}
8710: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8720: 20 20 20 73 65 74 20 70 61 63 6b 61 67 65 20 5b     set package [
8730: 6c 69 6e 64 65 78 20 24 6c 6f 61 64 65 64 20 31  lindex $loaded 1
8740: 5d 3b 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20  ]; break..      
8750: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
8760: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
8770: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8780: 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
8790: 75 72 65 20 74 68 61 74 20 61 20 6d 61 74 63 68  ure that a match
87a0: 69 6e 67 20 70 61 63 6b 61 67 65 20 6e 61 6d 65  ing package name
87b0: 20 77 61 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20   was found...   
87c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
87d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 61 63  [info exists pac
87e0: 6b 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  kage]} then {.. 
87f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8800: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69    # NOTE: Yes, i
8810: 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  t appears that i
8820: 74 20 69 73 20 6c 6f 61 64 65 64 2e 0d 0a 20 20  t is loaded...  
8830: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8840: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
8850: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8860: 20 20 20 20 20 20 20 20 20 20 6c 6f 61 64 65 64            loaded
8870: 2e 6e 61 6d 65 2e 20 5b 63 6c 65 61 6e 50 61 63  .name. [cleanPac
8880: 6b 61 67 65 4e 61 6d 65 20 24 70 61 63 6b 61 67  kageName $packag
8890: 65 20 66 61 6c 73 65 5d 5d 0d 0a 0d 0a 20 20 20  e false]]....   
88a0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
88b0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
88c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ..            lo
88d0: 61 64 65 64 2e 66 75 6c 6c 4e 61 6d 65 2e 20 5b  aded.fullName. [
88e0: 63 6c 65 61 6e 50 61 63 6b 61 67 65 4e 61 6d 65  cleanPackageName
88f0: 20 24 70 61 63 6b 61 67 65 20 74 72 75 65 5d 5d   $package true]]
8900: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
8910: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
8920: 68 6f 77 20 74 68 61 74 20 74 68 65 20 73 75 62  how that the sub
8930: 2d 63 6f 6d 6d 61 6e 64 20 77 61 73 20 66 6f 75  -command was fou
8940: 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  nd...        #..
8950: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
8960: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a  hannel yes\n....
8970: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8980: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
8990: 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
89a0: 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
89b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
89c0: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  urn..      }..  
89d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73    }....    tputs
89e0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
89f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
8a00: 68 65 63 6b 46 6f 72 46 6f 73 73 69 6c 20 7b 20  heckForFossil { 
8a10: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
8a20: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
8a30: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
8a40: 6f 72 20 46 6f 73 73 69 6c 2e 2e 2e 20 22 0d 0a  or Fossil... "..
8a50: 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78  ..    if {[canEx
8a60: 65 63 46 6f 73 73 69 6c 5d 20 26 26 20 5c 0d 0a  ecFossil] && \..
8a70: 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
8a80: 65 78 65 63 20 2d 2d 20 66 6f 73 73 69 6c 20 76  exec -- fossil v
8a90: 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d  ersion} version]
8aa0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
8ab0: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
8ac0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 76   [string trim $v
8ad0: 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ersion]....     
8ae0: 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 54   set pattern {^T
8af0: 68 69 73 20 69 73 20 66 6f 73 73 69 6c 20 76 65  his is fossil ve
8b00: 72 73 69 6f 6e 20 28 2e 2a 29 20 5c 5b 28 5b 30  rsion (.*) \[([0
8b10: 2d 39 61 2d 66 5d 2b 29 5c 5d 5c 0d 0a 20 20 20  -9a-f]+)\]\..   
8b20: 20 20 20 20 20 20 20 5c 64 7b 34 7d 2d 5c 64 7b         \d{4}-\d{
8b30: 32 7d 2d 5c 64 7b 32 7d 20 5c 64 7b 32 7d 3a 5c  2}-\d{2} \d{2}:\
8b40: 64 7b 32 7d 3a 5c 64 7b 32 7d 20 55 54 43 24 7d  d{2}:\d{2} UTC$}
8b50: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 72  ....      if {[r
8b60: 65 67 65 78 70 20 2d 2d 20 24 70 61 74 74 65 72  egexp -- $patter
8b70: 6e 20 24 76 65 72 73 69 6f 6e 20 64 75 6d 6d 79  n $version dummy
8b80: 20 76 65 72 73 69 6f 6e 20 73 6f 75 72 63 65 49   version sourceI
8b90: 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
8ba0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8bb0: 20 4e 4f 54 45 3a 20 41 64 64 20 61 20 63 6f 6e   NOTE: Add a con
8bc0: 73 74 72 61 69 6e 74 20 74 6f 20 73 68 6f 77 20  straint to show 
8bd0: 74 68 61 74 20 74 68 65 20 46 6f 73 73 69 6c 20  that the Fossil 
8be0: 65 78 65 63 75 74 61 62 6c 65 0d 0a 20 20 20 20  executable..    
8bf0: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
8c00: 6c 66 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  lf is available.
8c10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8c20: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
8c30: 6e 74 20 66 6f 73 73 69 6c 5f 76 65 72 73 69 6f  nt fossil_versio
8c40: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
8c50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8c60: 41 70 70 65 6e 64 20 74 68 65 20 76 65 72 73 69  Append the versi
8c70: 6f 6e 20 6f 66 20 46 6f 73 73 69 6c 20 63 75 72  on of Fossil cur
8c80: 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0d 0a  rently in use...
8c90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ca0: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
8cb0: 20 76 65 72 73 69 6f 6e 20 22 20 22 20 24 76 65   version " " $ve
8cc0: 72 73 69 6f 6e 20 22 20 5c 5b 22 20 24 73 6f 75  rsion " \[" $sou
8cd0: 72 63 65 49 64 20 5c 5d 0d 0a 0d 0a 20 20 20 20  rceId \]....    
8ce0: 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78 65 63      if {[canExec
8cf0: 46 6f 73 73 69 6c 5d 20 26 26 20 5c 0d 0a 20 20  Fossil] && \..  
8d00: 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68            [catch
8d10: 20 7b 65 78 65 63 20 2d 2d 20 66 6f 73 73 69 6c   {exec -- fossil
8d20: 20 72 65 6d 6f 74 65 2d 75 72 6c 7d 20 72 65 6d   remote-url} rem
8d30: 6f 74 65 55 72 6c 5d 20 3d 3d 20 30 7d 20 74 68  oteUrl] == 0} th
8d40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8d50: 73 65 74 20 72 65 6d 6f 74 65 55 72 6c 20 5b 73  set remoteUrl [s
8d60: 74 72 69 6e 67 20 74 72 69 6d 20 24 72 65 6d 6f  tring trim $remo
8d70: 74 65 55 72 6c 5d 3b 20 73 65 74 20 76 61 6c 69  teUrl]; set vali
8d80: 64 55 72 6c 20 66 61 6c 73 65 0d 0a 0d 0a 20 20  dUrl false....  
8d90: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45          if {[isE
8da0: 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  agle]} then {.. 
8db0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
8dc0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
8dd0: 3a 20 57 69 74 68 20 45 61 67 6c 65 2c 20 77 65  : With Eagle, we
8de0: 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 76 61   can actually va
8df0: 6c 69 64 61 74 65 20 74 68 65 20 55 52 4c 2e 0d  lidate the URL..
8e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
8e20: 5b 75 72 69 20 69 73 76 61 6c 69 64 20 24 72 65  [uri isvalid $re
8e30: 6d 6f 74 65 55 72 6c 5d 7d 20 74 68 65 6e 20 7b  moteUrl]} then {
8e40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8e50: 73 65 74 20 76 61 6c 69 64 55 72 6c 20 74 72 75  set validUrl tru
8e60: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
8e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
8e80: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
8e90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8ea0: 20 23 20 48 41 43 4b 3a 20 43 75 72 72 65 6e 74   # HACK: Current
8eb0: 6c 79 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ly, there is no 
8ec0: 73 69 6d 70 6c 65 20 77 61 79 20 74 6f 20 76 61  simple way to va
8ed0: 6c 69 64 61 74 65 0d 0a 20 20 20 20 20 20 20 20  lidate..        
8ee0: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20 61      #       an a
8ef0: 72 62 69 74 72 61 72 79 20 55 52 4c 20 77 69 74  rbitrary URL wit
8f00: 68 20 54 63 6c 20 28 69 2e 65 2e 20 77 69 74 68  h Tcl (i.e. with
8f10: 6f 75 74 20 75 73 69 6e 67 0d 0a 20 20 20 20 20  out using..     
8f20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
8f30: 6f 6d 65 20 68 69 64 65 6f 75 73 6c 79 20 63 6f  ome hideously co
8f40: 6d 70 6c 65 78 20 72 65 67 75 6c 61 72 20 65 78  mplex regular ex
8f50: 70 72 65 73 73 69 6f 6e 29 2e 0d 0a 20 20 20 20  pression)...    
8f60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8f70: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
8f80: 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 6d 6f 74  ng length $remot
8f90: 65 55 72 6c 5d 20 3e 20 30 7d 20 74 68 65 6e 20  eUrl] > 0} then 
8fa0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8fb0: 20 73 65 74 20 76 61 6c 69 64 55 72 6c 20 74 72   set validUrl tr
8fc0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
8fd0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
8fe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
8ff0: 24 76 61 6c 69 64 55 72 6c 7d 20 74 68 65 6e 20  $validUrl} then 
9000: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
9010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
9020: 4e 4f 54 45 3a 20 41 64 64 20 61 20 63 6f 6e 73  NOTE: Add a cons
9030: 74 72 61 69 6e 74 20 74 6f 20 73 68 6f 77 20 74  traint to show t
9040: 68 61 74 20 61 20 76 61 6c 69 64 20 46 6f 73 73  hat a valid Foss
9050: 69 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  il..            
9060: 23 20 20 20 20 20 20 20 72 65 70 6f 73 69 74 6f  #       reposito
9070: 72 79 20 55 52 4c 20 61 70 70 65 61 72 73 20 74  ry URL appears t
9080: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
9090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
90b0: 6f 6e 73 74 72 61 69 6e 74 20 66 6f 73 73 69 6c  onstraint fossil
90c0: 5f 72 65 70 6f 73 69 74 6f 72 79 5f 75 72 6c 0d  _repository_url.
90d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
90e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
90f0: 4e 4f 54 45 3a 20 49 66 20 77 65 20 61 72 65 20  NOTE: If we are 
9100: 6e 6f 74 20 70 72 65 76 65 6e 74 65 64 20 66 72  not prevented fr
9110: 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 73 61 76  om doing so, sav
9120: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
9130: 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 20         the test 
9140: 72 65 70 6f 73 69 74 6f 72 79 20 55 52 4c 20 74  repository URL t
9150: 6f 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  o the repository
9160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
9170: 20 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20        currently 
9180: 69 6e 20 75 73 65 20 74 6f 20 61 20 73 75 69 74  in use to a suit
9190: 61 62 6c 79 20 6e 61 6d 65 64 20 67 6c 6f 62 61  ably named globa
91a0: 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  l..            #
91b0: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 2e         variable.
91c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
91d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
91e0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
91f0: 3a 6e 6f 28 73 65 74 52 65 70 6f 73 69 74 6f 72  :no(setRepositor
9200: 79 55 72 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  yUrl)]} then {..
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9220: 74 20 3a 3a 74 65 73 74 5f 72 65 70 6f 73 69 74  t ::test_reposit
9230: 6f 72 79 5f 75 72 6c 20 24 72 65 6d 6f 74 65 55  ory_url $remoteU
9240: 72 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rl..            
9250: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
9260: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
9270: 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 74  # NOTE: Append t
9280: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 55 52  he repository UR
9290: 4c 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  L currently in u
92a0: 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se...           
92b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
92c0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 22 2c  append result ",
92d0: 20 72 65 6d 6f 74 65 20 55 52 4c 20 5c 22 22 20   remote URL \"" 
92e0: 24 72 65 6d 6f 74 65 55 72 6c 20 5c 22 0d 0a 20  $remoteUrl \".. 
92f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9300: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
9310: 20 69 66 20 7b 5b 63 61 6e 45 78 65 63 46 6f 73   if {[canExecFos
9320: 73 69 6c 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  sil] && \..     
9330: 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 65         [catch {e
9340: 78 65 63 20 2d 2d 20 66 6f 73 73 69 6c 20 69 6e  xec -- fossil in
9350: 66 6f 7d 20 69 6e 66 6f 5d 20 3d 3d 20 30 7d 20  fo} info] == 0} 
9360: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9370: 20 20 73 65 74 20 69 6e 66 6f 20 5b 73 74 72 69    set info [stri
9380: 6e 67 20 74 72 69 6d 20 24 69 6e 66 6f 5d 3b 20  ng trim $info]; 
9390: 73 65 74 20 76 61 6c 69 64 46 69 6c 65 20 66 61  set validFile fa
93a0: 6c 73 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  lse....         
93b0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
93c0: 67 74 68 20 24 69 6e 66 6f 5d 20 3e 20 30 7d 20  gth $info] > 0} 
93d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
93e0: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
93f0: 7b 5e 72 65 70 6f 73 69 74 6f 72 79 3a 5c 73 2b  {^repository:\s+
9400: 28 2e 2a 3f 29 24 7d 0d 0a 0d 0a 20 20 20 20 20  (.*?)$}....     
9410: 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65         if {[rege
9420: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
9430: 74 65 72 6e 20 24 69 6e 66 6f 20 64 75 6d 6d 79  tern $info dummy
9440: 20 72 65 70 6f 73 69 74 6f 72 79 5d 7d 20 74 68   repository]} th
9450: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9460: 20 20 20 20 73 65 74 20 72 65 70 6f 73 69 74 6f      set reposito
9470: 72 79 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  ry [string trim 
9480: 24 72 65 70 6f 73 69 74 6f 72 79 5d 0d 0a 0d 0a  $repository]....
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
94a0: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
94b0: 72 65 70 6f 73 69 74 6f 72 79 5d 7d 20 74 68 65  repository]} the
94c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
94d0: 20 20 20 20 20 73 65 74 20 76 61 6c 69 64 46 69       set validFi
94e0: 6c 65 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  le true..       
94f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9500: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9510: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
9520: 20 20 69 66 20 7b 24 76 61 6c 69 64 46 69 6c 65    if {$validFile
9530: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9540: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9550: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
9560: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f   a constraint to
9570: 20 73 68 6f 77 20 74 68 61 74 20 61 20 76 61 6c   show that a val
9580: 69 64 20 46 6f 73 73 69 6c 0d 0a 20 20 20 20 20  id Fossil..     
9590: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
95a0: 65 70 6f 73 69 74 6f 72 79 20 66 69 6c 65 20 61  epository file a
95b0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61  ppears to be ava
95c0: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
95d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
95e0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
95f0: 74 20 66 6f 73 73 69 6c 5f 72 65 70 6f 73 69 74  t fossil_reposit
9600: 6f 72 79 5f 66 69 6c 65 0d 0a 0d 0a 20 20 20 20  ory_file....    
9610: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9620: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
9630: 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c  ake sure the fil
9640: 65 20 6e 61 6d 65 20 69 73 20 66 75 6c 6c 79 20  e name is fully 
9650: 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20 20  normalized...   
9660: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9670: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 70 6f          set repo
9680: 73 69 74 6f 72 79 20 5b 66 69 6c 65 20 6e 6f 72  sitory [file nor
9690: 6d 61 6c 69 7a 65 20 24 72 65 70 6f 73 69 74 6f  malize $reposito
96a0: 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ry]....         
96b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
96c0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 77 65 20    # NOTE: If we 
96d0: 61 72 65 20 6e 6f 74 20 70 72 65 76 65 6e 74 65  are not prevente
96e0: 64 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c  d from doing so,
96f0: 20 73 61 76 65 0d 0a 20 20 20 20 20 20 20 20 20   save..         
9700: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
9710: 65 73 74 20 72 65 70 6f 73 69 74 6f 72 79 20 66  est repository f
9720: 69 6c 65 20 66 6f 72 20 74 68 65 20 72 65 70 6f  ile for the repo
9730: 73 69 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  sitory..        
9740: 20 20 20 20 23 20 20 20 20 20 20 20 63 75 72 72      #       curr
9750: 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 74 6f 20  ently in use to 
9760: 61 20 73 75 69 74 61 62 6c 79 20 6e 61 6d 65 64  a suitably named
9770: 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20   global..       
9780: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
9790: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
97a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
97b0: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
97c0: 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 52 65 70  ists ::no(setRep
97d0: 6f 73 69 74 6f 72 79 46 69 6c 65 29 5d 7d 20 74  ositoryFile)]} t
97e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
97f0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
9800: 72 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 20  repository_file 
9810: 24 72 65 70 6f 73 69 74 6f 72 79 0d 0a 20 20 20  $repository..   
9820: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
9830: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9840: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9850: 20 41 70 70 65 6e 64 20 74 68 65 20 72 65 70 6f   Append the repo
9860: 73 69 74 6f 72 79 20 66 69 6c 65 20 63 75 72 72  sitory file curr
9870: 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0d 0a 20  ently in use... 
9880: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
9890: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
98a0: 20 72 65 73 75 6c 74 20 22 2c 20 6c 6f 63 61 6c   result ", local
98b0: 20 66 69 6c 65 20 5c 22 22 20 24 72 65 70 6f 73   file \"" $repos
98c0: 69 74 6f 72 79 20 5c 22 0d 0a 20 20 20 20 20 20  itory \"..      
98d0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
98e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
98f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
9900: 68 6f 77 20 74 68 65 20 72 65 73 75 6c 74 20 6f  how the result o
9910: 66 20 74 68 65 20 63 68 65 63 6b 69 6e 67 2e 0d  f the checking..
9920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9930: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9940: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
9950: 79 65 73 20 28 22 20 24 72 65 73 75 6c 74 20 22  yes (" $result "
9960: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
9970: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9980: 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
9990: 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
99a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
99b0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
99c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
99d0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
99e0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d  el no\n..  }....
99f0: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
9a00: 56 69 73 75 61 6c 53 74 75 64 69 6f 56 69 61 56  VisualStudioViaV
9a10: 73 57 68 65 72 65 20 7b 20 63 68 61 6e 6e 65 6c  sWhere { channel
9a20: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
9a30: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
9a40: 68 65 63 6b 69 6e 67 20 66 6f 72 20 56 69 73 75  hecking for Visu
9a50: 61 6c 20 53 74 75 64 69 6f 20 75 73 69 6e 67 20  al Studio using 
9a60: 5c 22 76 73 77 68 65 72 65 5c 22 2e 2e 2e 20 22  \"vswhere\"... "
9a70: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
9a80: 20 4e 4f 54 45 3a 20 49 6e 69 74 69 61 6c 6c 79   NOTE: Initially
9a90: 2c 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  , no versions of
9aa0: 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 68   Visual Studio h
9ab0: 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0d  ave been found..
9ac0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20  .    #..    set 
9ad0: 76 69 73 75 61 6c 53 74 75 64 69 6f 56 65 72 73  visualStudioVers
9ae0: 69 6f 6e 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ions [list].... 
9af0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
9b00: 3a 20 55 73 65 20 6f 66 20 74 68 65 20 22 76 73  : Use of the "vs
9b10: 77 68 65 72 65 22 20 74 6f 6f 6c 20 6d 75 73 74  where" tool must
9b20: 20 62 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20   be enabled for 
9b30: 75 73 20 74 6f 20 64 65 74 65 63 74 0d 0a 20 20  us to detect..  
9b40: 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 69 6e    #       any in
9b50: 73 74 61 6e 63 65 73 20 6f 66 20 56 69 73 75 61  stances of Visua
9b60: 6c 20 53 74 75 64 69 6f 2e 0d 0a 20 20 20 20 23  l Studio...    #
9b70: 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78  ..    if {[canEx
9b80: 65 63 56 73 57 68 65 72 65 5d 7d 20 74 68 65 6e  ecVsWhere]} then
9b90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9ba0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
9bb0: 65 72 73 69 6f 6e 73 20 6f 66 20 56 69 73 75 61  ersions of Visua
9bc0: 6c 20 53 74 75 64 69 6f 20 74 68 61 74 20 77 65  l Studio that we
9bd0: 20 73 75 70 70 6f 72 74 20 64 65 74 65 63 74 69   support detecti
9be0: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
9bf0: 20 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20 22    of using the "
9c00: 76 73 77 68 65 72 65 22 20 74 6f 6f 6c 2e 0d 0a  vswhere" tool...
9c10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
9c20: 65 74 20 76 65 72 73 69 6f 6e 73 20 5b 6c 69 73  et versions [lis
9c30: 74 20 5b 6c 69 73 74 20 31 35 2e 30 20 32 30 31  t [list 15.0 201
9c40: 37 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  7]]....      #..
9c50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
9c60: 65 63 6b 20 65 61 63 68 20 76 65 72 73 69 6f 6e  eck each version
9c70: 20 61 6e 64 20 6b 65 65 70 20 74 72 61 63 6b 20   and keep track 
9c80: 6f 66 20 74 68 65 20 6f 6e 65 73 20 77 65 20 66  of the ones we f
9c90: 69 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ind...      #.. 
9ca0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 65 72       foreach ver
9cb0: 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e 73 20 7b  sion $versions {
9cc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9cd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
9ce0: 65 6d 70 74 20 74 6f 20 66 65 74 63 68 20 56 69  empt to fetch Vi
9cf0: 73 75 61 6c 20 53 74 75 64 69 6f 20 69 6e 73 74  sual Studio inst
9d00: 61 6c 6c 20 64 69 72 65 63 74 6f 72 69 65 73 0d  all directories.
9d10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
9d20: 20 76 61 6c 75 65 20 75 73 69 6e 67 20 74 68 65   value using the
9d30: 20 22 76 73 77 68 65 72 65 22 20 74 6f 6f 6c 2e   "vswhere" tool.
9d40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9d50: 20 20 20 20 20 69 66 20 7b 5b 63 61 6e 45 78 65       if {[canExe
9d60: 63 56 73 57 68 65 72 65 5d 20 26 26 20 5b 63 61  cVsWhere] && [ca
9d70: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
9d80: 20 65 78 65 63 20 2d 6e 6f 63 61 72 72 69 61 67   exec -nocarriag
9d90: 65 72 65 74 75 72 6e 73 20 2d 2d 20 76 73 77 68  ereturns -- vswh
9da0: 65 72 65 20 2d 70 72 6f 64 75 63 74 73 20 2a 20  ere -products * 
9db0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9dc0: 20 2d 76 65 72 73 69 6f 6e 20 5b 6c 69 6e 64 65   -version [linde
9dd0: 78 20 24 76 65 72 73 69 6f 6e 20 30 5d 20 2d 70  x $version 0] -p
9de0: 72 6f 70 65 72 74 79 20 69 6e 73 74 61 6c 6c 61  roperty installa
9df0: 74 69 6f 6e 50 61 74 68 0d 0a 20 20 20 20 20 20  tionPath..      
9e00: 20 20 7d 20 69 6e 73 74 61 6c 6c 61 74 69 6f 6e    } installation
9e10: 50 61 74 68 73 5d 20 3d 3d 20 30 7d 20 74 68 65  Paths] == 0} the
9e20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
9e30: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
9e40: 54 45 3a 20 43 68 65 63 6b 20 65 61 63 68 20 56  TE: Check each V
9e50: 69 73 75 61 6c 20 53 74 75 64 69 6f 20 69 6e 73  isual Studio ins
9e60: 74 61 6c 6c 20 64 69 72 65 63 74 6f 72 79 2c 20  tall directory, 
9e70: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  in the..        
9e80: 20 20 23 20 20 20 20 20 20 20 6f 72 64 65 72 20    #       order 
9e90: 74 68 65 79 20 77 65 72 65 20 72 65 74 75 72 6e  they were return
9ea0: 65 64 2c 20 61 66 74 65 72 20 73 70 6c 69 74 74  ed, after splitt
9eb0: 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 0d 0a 20  ing them into.. 
9ec0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
9ed0: 20 61 20 70 72 6f 70 65 72 20 54 63 6c 20 6c 69   a proper Tcl li
9ee0: 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
9ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
9f00: 69 6e 73 74 61 6c 6c 61 74 69 6f 6e 50 61 74 68  installationPath
9f10: 73 20 5b 73 70 6c 69 74 20 5c 0d 0a 20 20 20 20  s [split \..    
9f20: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
9f30: 67 20 74 72 69 6d 20 24 69 6e 73 74 61 6c 6c 61  g trim $installa
9f40: 74 69 6f 6e 50 61 74 68 73 5d 20 5c 6e 5d 0d 0a  tionPaths] \n]..
9f50: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
9f60: 61 63 68 20 69 6e 73 74 61 6c 6c 61 74 69 6f 6e  ach installation
9f70: 50 61 74 68 20 24 69 6e 73 74 61 6c 6c 61 74 69  Path $installati
9f80: 6f 6e 50 61 74 68 73 20 7b 0d 0a 20 20 20 20 20  onPaths {..     
9f90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
9fb0: 6d 6f 76 65 20 74 68 65 20 74 72 61 69 6c 69 6e  move the trailin
9fc0: 67 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 66 20  g backslash, if 
9fd0: 61 6e 79 2e 20 20 44 6f 65 73 20 74 68 65 0d 0a  any.  Does the..
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
9ff0: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 6e 61      directory na
a000: 6d 65 20 6c 6f 6f 6b 20 76 61 6c 69 64 20 61 6e  me look valid an
a010: 64 20 64 6f 65 73 20 69 74 20 61 63 74 75 61 6c  d does it actual
a020: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
a030: 23 20 20 20 20 20 20 20 65 78 69 73 74 3f 0d 0a  #       exist?..
a040: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
a050: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66             set f
a060: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
a070: 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
a080: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72        [string tr
a090: 69 6d 72 69 67 68 74 20 24 69 6e 73 74 61 6c 6c  imright $install
a0a0: 61 74 69 6f 6e 50 61 74 68 20 5c 5c 5d 20 43 6f  ationPath \\] Co
a0b0: 6d 6d 6f 6e 37 20 49 44 45 20 5c 0d 0a 20 20 20  mmon7 IDE \..   
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 65               mse
a0d0: 6e 76 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  nv.dll]....     
a0e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
a0f0: 20 69 73 66 69 6c 65 20 24 66 69 6c 65 4e 61 6d   isfile $fileNam
a100: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
a110: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a120: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
a130: 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61  E: Yes, it appea
a140: 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76  rs that it is av
a150: 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
a160: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a170: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
a180: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
a190: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a1a0: 20 20 20 20 20 20 20 20 76 69 73 75 61 6c 53 74          visualSt
a1b0: 75 64 69 6f 20 5b 6c 69 6e 64 65 78 20 24 76 65  udio [lindex $ve
a1c0: 72 73 69 6f 6e 20 31 5d 5d 0d 0a 0d 0a 20 20 20  rsion 1]]....   
a1d0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
a1f0: 54 45 3a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  TE: Keep track o
a200: 66 20 61 6c 6c 20 74 68 65 20 76 65 72 73 69 6f  f all the versio
a210: 6e 73 20 74 68 61 74 20 77 65 20 66 69 6e 64 2e  ns that we find.
a220: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a230: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
a240: 20 6c 61 70 70 65 6e 64 20 76 69 73 75 61 6c 53   lappend visualS
a250: 74 75 64 69 6f 56 65 72 73 69 6f 6e 73 20 5b 6c  tudioVersions [l
a260: 69 6e 64 65 78 20 24 76 65 72 73 69 6f 6e 20 31  index $version 1
a270: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
a280: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a290: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65      # NOTE: Save
a2a0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
a2b0: 6f 72 20 6c 61 74 65 72 20 75 73 61 67 65 20 62  or later usage b
a2c0: 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20  y the test..    
a2d0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
a2e0: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
a2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
a300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a310: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
a320: 73 20 3a 3a 6e 6f 28 73 65 74 56 69 73 75 61 6c  s ::no(setVisual
a330: 53 74 75 64 69 6f 29 5d 7d 20 74 68 65 6e 20 7b  Studio)]} then {
a340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a350: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 76 69 73    set ::test_vis
a360: 75 61 6c 5f 73 74 75 64 69 6f 20 5b 66 69 6c 65  ual_studio [file
a370: 20 64 69 72 6e 61 6d 65 20 24 66 69 6c 65 4e 61   dirname $fileNa
a380: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me]..           
a390: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
a3a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a3b0: 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 53         # HACK: S
a3c0: 74 6f 70 20 61 66 74 65 72 20 77 65 20 66 69 6e  top after we fin
a3d0: 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  d the first inst
a3e0: 61 6e 63 65 20 6f 66 20 56 69 73 75 61 6c 0d 0a  ance of Visual..
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
a400: 20 20 20 20 20 20 53 74 75 64 69 6f 20 77 69 74        Studio wit
a410: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
a420: 76 65 72 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  version...      
a430: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a440: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a           break..
a450: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
a460: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a470: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a480: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20      }....    if 
a490: 7b 5b 6c 6c 65 6e 67 74 68 20 24 76 69 73 75 61  {[llength $visua
a4a0: 6c 53 74 75 64 69 6f 56 65 72 73 69 6f 6e 73 5d  lStudioVersions]
a4b0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
a4c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a4d0: 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 72 65 20  OTE: Show where 
a4e0: 77 65 20 66 6f 75 6e 64 20 74 68 65 20 6c 61 74  we found the lat
a4f0: 65 73 74 20 76 65 72 73 69 6f 6e 2e 0d 0a 20 20  est version...  
a500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75      #..      tpu
a510: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a520: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a530: 20 20 20 20 20 22 79 65 73 20 28 22 20 24 76 69       "yes (" $vi
a540: 73 75 61 6c 53 74 75 64 69 6f 56 65 72 73 69 6f  sualStudioVersio
a550: 6e 73 20 22 2c 20 5c 22 22 20 5c 0d 0a 20 20 20  ns ", \"" \..   
a560: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 69         [expr {[i
a570: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
a580: 74 5f 76 69 73 75 61 6c 5f 73 74 75 64 69 6f 5d  t_visual_studio]
a590: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
a5a0: 20 20 20 20 24 3a 3a 74 65 73 74 5f 76 69 73 75      $::test_visu
a5b0: 61 6c 5f 73 74 75 64 69 6f 20 3a 20 22 3c 6e 6f  al_studio : "<no
a5c0: 6e 65 3e 22 7d 5d 20 22 5c 22 29 5c 6e 22 5d 0d  ne>"}] "\")\n"].
a5d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
a5e0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
a5f0: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
a600: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
a610: 63 68 65 63 6b 46 6f 72 45 61 67 6c 65 20 7b 20  checkForEagle { 
a620: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
a630: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a640: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
a650: 6f 72 20 45 61 67 6c 65 2e 2e 2e 20 22 0d 0a 0d  or Eagle... "...
a660: 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c  .    if {[isEagl
a670: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
a680: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a690: 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69 6e  E: We are runnin
a6a0: 67 20 69 6e 73 69 64 65 20 45 61 67 6c 65 2e 0d  g inside Eagle..
a6b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a6c0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 65 61  addConstraint ea
a6d0: 67 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  gle....      #..
a6e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
a6f0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
a700: 73 6b 69 70 20 62 75 67 73 20 6f 72 20 63 72 61  skip bugs or cra
a710: 73 68 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20  shing..      #  
a720: 20 20 20 20 20 69 73 73 75 65 73 20 66 6f 72 20       issues for 
a730: 54 63 6c 20 73 69 6e 63 65 20 77 65 20 61 72 65  Tcl since we are
a740: 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 0d 0a 20 20   not running..  
a750: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 54      #       in T
a760: 63 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  cl...      #..  
a770: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
a780: 74 20 74 63 6c 42 75 67 0d 0a 20 20 20 20 20 20  t tclBug..      
a790: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 63  addConstraint tc
a7a0: 6c 43 72 61 73 68 0d 0a 0d 0a 20 20 20 20 20 20  lCrash....      
a7b0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a7c0: 20 41 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   Add the necessa
a7d0: 72 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  ry constraints f
a7e0: 6f 72 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23  or each..      #
a7f0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 6f         version o
a800: 66 20 54 63 6c 20 77 65 20 6b 6e 6f 77 20 61 62  f Tcl we know ab
a810: 6f 75 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  out...      #.. 
a820: 20 20 20 20 20 66 6f 72 65 61 63 68 20 74 63 6c       foreach tcl
a830: 56 65 72 73 69 6f 6e 20 5b 67 65 74 4b 6e 6f 77  Version [getKnow
a840: 6e 54 63 6c 56 65 72 73 69 6f 6e 73 5d 20 7b 0d  nTclVersions] {.
a850: 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72  .        set ver
a860: 73 69 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73 73  sion [getDotless
a870: 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73  Version $tclVers
a880: 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ion]....        
a890: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
a8a0: 70 70 65 6e 64 41 72 67 73 20 74 63 6c 42 75 67  ppendArgs tclBug
a8b0: 20 24 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20   $version]..    
a8c0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
a8d0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63  t [appendArgs tc
a8e0: 6c 43 72 61 73 68 20 24 76 65 72 73 69 6f 6e 5d  lCrash $version]
a8f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
a900: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a910: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65  l yes\n..    } e
a920: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  lse {..      #..
a930: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
a940: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 73   are running ins
a950: 69 64 65 20 54 63 6c 2e 0d 0a 20 20 20 20 20 20  ide Tcl...      
a960: 23 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  #..      addCons
a970: 74 72 61 69 6e 74 20 74 63 6c 0d 0a 0d 0a 20 20  traint tcl....  
a980: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a990: 4f 54 45 3a 20 45 61 63 68 20 54 63 6c 20 62 75  OTE: Each Tcl bu
a9a0: 67 20 61 6e 64 20 63 72 61 73 68 20 63 6f 6e 73  g and crash cons
a9b0: 74 72 61 69 6e 74 20 69 73 20 73 65 74 0d 0a 20  traint is set.. 
a9c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 61 73       #       bas
a9d0: 65 64 20 6f 6e 20 74 68 65 20 65 78 61 63 74 20  ed on the exact 
a9e0: 54 63 6c 20 76 65 72 73 69 6f 6e 20 28 69 2e 65  Tcl version (i.e
a9f0: 2e 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20  . not..      #  
aa00: 20 20 20 20 20 67 72 65 61 74 65 72 20 74 68 61       greater tha
aa10: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 29 2e 0d  n or equal to)..
aa20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
aa30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
aa40: 20 3a 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 5d 7d   ::tcl_version]}
aa50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
aa60: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
aa70: 54 45 3a 20 46 6f 72 20 65 61 63 68 20 54 63 6c  TE: For each Tcl
aa80: 20 76 65 72 73 69 6f 6e 20 77 65 20 6b 6e 6f 77   version we know
aa90: 20 61 62 6f 75 74 2c 0d 0a 20 20 20 20 20 20 20   about,..       
aaa0: 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 20 69   #       check i
aab0: 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 75  t against the cu
aac0: 72 72 65 6e 74 6c 79 20 72 75 6e 6e 69 6e 67 0d  rrently running.
aad0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
aae0: 20 54 63 6c 20 76 65 72 73 69 6f 6e 2e 20 20 49   Tcl version.  I
aaf0: 66 20 74 68 65 20 74 77 6f 20 61 72 65 20 6e 6f  f the two are no
ab00: 74 20 65 71 75 61 6c 2c 0d 0a 20 20 20 20 20 20  t equal,..      
ab10: 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74 68    #       add th
ab20: 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
ab30: 74 73 20 74 68 61 74 20 70 72 65 76 65 6e 74 0d  ts that prevent.
ab40: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
ab50: 20 73 6b 69 70 70 69 6e 67 20 74 68 6f 73 65 20   skipping those 
ab60: 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20 62  tests that are b
ab70: 75 67 67 79 0d 0a 20 20 20 20 20 20 20 20 23 20  uggy..        # 
ab80: 20 20 20 20 20 20 6f 6e 6c 79 20 66 6f 72 20 74        only for t
ab90: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 65  he particular ve
aba0: 72 73 69 6f 6e 20 6f 66 20 54 63 6c 2e 0d 0a 20  rsion of Tcl... 
abb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
abc0: 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72    foreach tclVer
abd0: 73 69 6f 6e 20 5b 67 65 74 4b 6e 6f 77 6e 54 63  sion [getKnownTc
abe0: 6c 56 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a 20 20  lVersions] {..  
abf0: 20 20 20 20 20 20 20 20 73 65 74 20 64 6f 74 56          set dotV
ac00: 65 72 73 69 6f 6e 20 5b 67 65 74 44 6f 74 74 65  ersion [getDotte
ac10: 64 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72  dVersion $tclVer
ac20: 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sion]....       
ac30: 20 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 76 65     if {$::tcl_ve
ac40: 72 73 69 6f 6e 20 6e 65 20 24 64 6f 74 56 65 72  rsion ne $dotVer
ac50: 73 69 6f 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  sion} then {..  
ac60: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65            set ve
ac70: 72 73 69 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73  rsion [getDotles
ac80: 73 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72  sVersion $tclVer
ac90: 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sion]....       
aca0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
acb0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74  nt [appendArgs t
acc0: 63 6c 42 75 67 20 24 76 65 72 73 69 6f 6e 5d 0d  clBug $version].
acd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
ace0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
acf0: 6e 64 41 72 67 73 20 74 63 6c 43 72 61 73 68 20  ndArgs tclCrash 
ad00: 24 76 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20  $version]..     
ad10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ad20: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
ad30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ad40: 4f 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 77  OTE: We do not w
ad50: 61 6e 74 20 74 6f 20 73 6b 69 70 20 62 75 67 73  ant to skip bugs
ad60: 20 6f 72 20 63 72 61 73 68 69 6e 67 0d 0a 20 20   or crashing..  
ad70: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 73 75      #       issu
ad80: 65 73 20 66 6f 72 20 45 61 67 6c 65 20 73 69 6e  es for Eagle sin
ad90: 63 65 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ce we are not ru
ada0: 6e 6e 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20  nning..      #  
adb0: 20 20 20 20 20 69 6e 20 45 61 67 6c 65 2e 0d 0a       in Eagle...
adc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61        #..      a
add0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 65 61 67  ddConstraint eag
ade0: 6c 65 42 75 67 0d 0a 20 20 20 20 20 20 61 64 64  leBug..      add
adf0: 43 6f 6e 73 74 72 61 69 6e 74 20 65 61 67 6c 65  Constraint eagle
ae00: 43 72 61 73 68 0d 0a 0d 0a 20 20 20 20 20 20 74  Crash....      t
ae10: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
ae20: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
ae30: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
ae40: 6f 72 53 79 6d 62 6f 6c 73 20 7b 20 63 68 61 6e  orSymbols { chan
ae50: 6e 65 6c 20 6e 61 6d 65 20 7b 63 6f 6e 73 74 72  nel name {constr
ae60: 61 69 6e 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  aint ""} } {..  
ae70: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
ae80: 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b  file normalize [
ae90: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
aea0: 20 72 6f 6f 74 6e 61 6d 65 20 24 6e 61 6d 65 5d   rootname $name]
aeb0: 20 2e 70 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 74   .pdb]]....    t
aec0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
aed0: 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
aee0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 79 6d  checking for sym
aef0: 62 6f 6c 73 20 5c 22 22 20 24 66 69 6c 65 4e 61  bols \"" $fileNa
af00: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 22 5c  me \..        "\
af10: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69  "... "]....    i
af20: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
af30: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
af40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
af50: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
af60: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 68  ile appears to h
af70: 61 76 65 20 61 73 73 6f 63 69 61 74 65 64 20 73  ave associated s
af80: 79 6d 62 6f 6c 73 20 61 76 61 69 6c 61 62 6c 65  ymbols available
af90: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
afa0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
afb0: 6e 67 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74  ngth $constraint
afc0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
afd0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
afe0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
aff0: 20 73 79 6d 62 6f 6c 73 5f 20 24 63 6f 6e 73 74   symbols_ $const
b000: 72 61 69 6e 74 5d 0d 0a 20 20 20 20 20 20 7d 20  raint]..      } 
b010: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b020: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
b030: 70 70 65 6e 64 41 72 67 73 20 73 79 6d 62 6f 6c  ppendArgs symbol
b040: 73 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e  s_ [file tail $n
b050: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame]]..      }..
b060: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
b070: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
b080: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b090: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b0a0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
b0b0: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
b0c0: 63 6b 46 6f 72 4c 6f 67 46 69 6c 65 20 7b 20 63  ckForLogFile { c
b0d0: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
b0e0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
b0f0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
b100: 72 20 6c 6f 67 20 66 69 6c 65 2e 2e 2e 20 22 0d  r log file... ".
b110: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
b120: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6c   exists ::test_l
b130: 6f 67 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  og] && \..      
b140: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
b150: 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 5d 20 3e 20   $::test_log] > 
b160: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
b170: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a  [file exists $::
b180: 74 65 73 74 5f 6c 6f 67 5d 7d 20 74 68 65 6e 20  test_log]} then 
b190: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
b1a0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
b1b0: 67 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  g file appears t
b1c0: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
b1d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b1e0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6c 6f  addConstraint lo
b1f0: 67 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 74  gFile....      t
b200: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
b210: 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
b220: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
b230: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
b240: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
b250: 72 6f 63 20 63 68 65 63 6b 46 6f 72 47 61 72 75  roc checkForGaru
b260: 64 61 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  da { channel } {
b270: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
b280: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
b290: 69 6e 67 20 66 6f 72 20 47 61 72 75 64 61 2e 2e  ing for Garuda..
b2a0: 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  . "....    if {[
b2b0: 68 61 76 65 47 61 72 75 64 61 20 70 61 63 6b 61  haveGaruda packa
b2c0: 67 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  geId]} then {.. 
b2d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b2e0: 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e  NOTE: We are run
b2f0: 6e 69 6e 67 20 77 69 74 68 20 6f 72 20 76 69 61  ning with or via
b300: 20 47 61 72 75 64 61 2e 0d 0a 20 20 20 20 20 20   Garuda...      
b310: 23 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  #..      addCons
b320: 74 72 61 69 6e 74 20 67 61 72 75 64 61 0d 0a 0d  traint garuda...
b330: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
b340: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
b350: 73 20 22 79 65 73 20 28 22 20 24 70 61 63 6b 61  s "yes (" $packa
b360: 67 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  geId ")\n"]..   
b370: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b380: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b390: 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  no\n..    }..  }
b3a0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
b3b0: 6b 46 6f 72 53 68 65 6c 6c 20 7b 20 63 68 61 6e  kForShell { chan
b3c0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  nel } {..    tpu
b3d0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
b3e0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73  - checking for s
b3f0: 68 65 6c 6c 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  hell... "....   
b400: 20 73 65 74 20 6e 61 6d 65 20 5b 66 69 6c 65 20   set name [file 
b410: 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74  rootname [file t
b420: 61 69 6c 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66  ail [info nameof
b430: 65 78 65 63 75 74 61 62 6c 65 5d 5d 5d 0d 0a 0d  executable]]]...
b440: 0a 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c  .    if {[isEagl
b450: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
b460: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b470: 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 75  E: By default, u
b480: 73 65 20 73 74 72 69 63 74 20 6d 61 74 63 68 69  se strict matchi
b490: 6e 67 20 6f 66 20 74 68 65 20 73 68 65 6c 6c 20  ng of the shell 
b4a0: 65 78 65 63 75 74 61 62 6c 65 0d 0a 20 20 20 20  executable..    
b4b0: 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 28    #       name (
b4c0: 65 78 61 63 74 29 3b 20 6f 74 68 65 72 77 69 73  exact); otherwis
b4d0: 65 2c 20 6d 61 74 63 68 20 61 6e 79 20 65 78 65  e, match any exe
b4e0: 63 75 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 68  cutable names th
b4f0: 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  at..      #     
b500: 20 20 73 74 61 72 74 20 77 69 74 68 20 22 45 61    start with "Ea
b510: 67 6c 65 22 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  gle"...      #..
b520: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
b530: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 74 72   exists ::no(str
b540: 69 63 74 43 68 65 63 6b 46 6f 72 53 68 65 6c 6c  ictCheckForShell
b550: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
b560: 20 20 20 20 73 65 74 20 6d 61 74 63 68 20 5b 65      set match [e
b570: 78 70 72 20 7b 24 6e 61 6d 65 20 65 71 20 22 45  xpr {$name eq "E
b580: 61 67 6c 65 22 20 7c 7c 20 24 6e 61 6d 65 20 65  agle" || $name e
b590: 71 20 22 45 61 67 6c 65 53 68 65 6c 6c 22 7d 5d  q "EagleShell"}]
b5a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b5b0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ..        set ma
b5c0: 74 63 68 20 5b 73 74 72 69 6e 67 20 6d 61 74 63  tch [string matc
b5d0: 68 20 45 61 67 6c 65 2a 20 24 6e 61 6d 65 5d 0d  h Eagle* $name].
b5e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b5f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b600: 45 3a 20 44 6f 65 73 20 74 68 65 20 6e 61 6d 65  E: Does the name
b610: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
b620: 6c 65 20 66 69 6c 65 20 61 70 70 65 61 72 20 74  le file appear t
b630: 6f 20 62 65 20 61 20 6d 61 74 63 68 0d 0a 20 20  o be a match..  
b640: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
b650: 6f 6e 65 20 6f 66 20 74 68 65 20 22 77 65 6c 6c  one of the "well
b660: 2d 6b 6e 6f 77 6e 22 20 73 68 65 6c 6c 73 3f 0d  -known" shells?.
b670: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b680: 69 66 20 7b 24 6d 61 74 63 68 7d 20 74 68 65 6e  if {$match} then
b690: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b6a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
b6b0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e  e are running in
b6c0: 20 45 61 67 6c 65 20 76 69 61 20 74 68 65 20 45   Eagle via the E
b6d0: 61 67 6c 65 53 68 65 6c 6c 2e 0d 0a 20 20 20 20  agleShell...    
b6e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
b6f0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 68 65  ddConstraint she
b700: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  ll..        addC
b710: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
b720: 64 41 72 67 73 20 73 68 65 6c 6c 2e 20 24 6e 61  dArgs shell. $na
b730: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  me]..        add
b740: 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
b750: 74 43 6f 72 65 4f 72 53 68 65 6c 6c 0d 0a 0d 0a  tCoreOrShell....
b760: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
b770: 68 61 6e 6e 65 6c 20 22 79 65 73 20 28 45 61 67  hannel "yes (Eag
b780: 6c 65 29 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  le)\n"....      
b790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
b7a0: 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65  OTE: We are done
b7b0: 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f   here, return no
b7c0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
b7d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
b7e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c       }..    } el
b7f0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  se {..      if {
b800: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 74 63  [string match tc
b810: 6c 73 68 2a 20 24 6e 61 6d 65 5d 7d 20 74 68 65  lsh* $name]} the
b820: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
b830: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b840: 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69  We are running i
b850: 6e 20 54 63 6c 20 76 69 61 20 74 63 6c 73 68 2e  n Tcl via tclsh.
b860: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b870: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
b880: 6e 74 20 73 68 65 6c 6c 0d 0a 20 20 20 20 20 20  nt shell..      
b890: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
b8a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 73 68 65 6c  [appendArgs shel
b8b0: 6c 2e 20 24 6e 61 6d 65 5d 0d 0a 20 20 20 20 20  l. $name]..     
b8c0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b8d0: 20 64 6f 74 4e 65 74 43 6f 72 65 4f 72 53 68 65   dotNetCoreOrShe
b8e0: 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ll....        tp
b8f0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 79 65  uts $channel "ye
b900: 73 20 28 54 63 6c 29 5c 6e 22 0d 0a 0d 0a 20 20  s (Tcl)\n"....  
b910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b920: 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
b930: 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75 72  done here, retur
b940: 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  n now...        
b950: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
b960: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
b970: 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24  }....    tputs $
b980: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
b990: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
b9a0: 63 6b 46 6f 72 4f 66 66 69 63 69 61 6c 53 74 61  ckForOfficialSta
b9b0: 62 6c 65 52 65 6c 65 61 73 65 49 6e 50 72 6f 67  bleReleaseInProg
b9c0: 72 65 73 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  ress { channel }
b9d0: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
b9e0: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
b9f0: 73 74 73 20 61 70 70 65 61 72 20 74 6f 20 62 65  sts appear to be
ba00: 20 72 75 6e 6e 69 6e 67 20 61 73 20 70 61 72 74   running as part
ba10: 20 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c   of the official
ba20: 20 73 74 61 62 6c 65 0d 0a 20 20 20 20 23 20 20   stable..    #  
ba30: 20 20 20 20 20 72 65 6c 65 61 73 65 20 70 72 6f       release pro
ba40: 63 65 73 73 20 66 6f 72 20 45 61 67 6c 65 2c 20  cess for Eagle, 
ba50: 74 68 65 6e 20 61 64 64 20 74 68 65 20 74 65 73  then add the tes
ba60: 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61  t constraint tha
ba70: 74 20 77 69 6c 6c 0d 0a 20 20 20 20 23 20 20 20  t will..    #   
ba80: 20 20 20 20 62 65 20 63 68 65 63 6b 65 64 20 62      be checked b
ba90: 79 20 74 68 65 20 5b 66 69 78 54 69 6d 69 6e 67  y the [fixTiming
baa0: 43 6f 6e 73 74 72 61 69 6e 74 73 5d 20 70 72 6f  Constraints] pro
bab0: 63 65 64 75 72 65 2c 20 73 6f 20 74 68 61 74 20  cedure, so that 
bac0: 74 65 73 74 73 0d 0a 20 20 20 20 23 20 20 20 20  tests..    #    
bad0: 20 20 20 75 73 69 6e 67 20 69 74 20 77 69 6c 6c     using it will
bae0: 20 6e 6f 74 20 62 65 20 63 6f 75 6e 74 65 64 20   not be counted 
baf0: 61 67 61 69 6e 73 74 20 74 68 65 20 6f 76 65 72  against the over
bb00: 61 6c 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  all results of t
bb10: 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  he..    #       
bb20: 74 65 73 74 20 72 75 6e 2e 0d 0a 20 20 20 20 23  test run...    #
bb30: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
bb40: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
bb50: 69 6e 67 20 66 6f 72 20 6f 66 66 69 63 69 61 6c  ing for official
bb60: 20 73 74 61 62 6c 65 20 72 65 6c 65 61 73 65 20   stable release 
bb70: 69 6e 20 70 72 6f 67 72 65 73 73 2e 2e 2e 20 22  in progress... "
bb80: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66  ....    if {[inf
bb90: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 4f  o exists ::env(O
bba0: 46 46 49 43 49 41 4c 29 5d 20 26 26 20 5b 69 6e  FFICIAL)] && [in
bbb0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
bbc0: 53 54 41 42 4c 45 29 5d 7d 20 74 68 65 6e 20 7b  STABLE)]} then {
bbd0: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
bbe0: 72 61 69 6e 74 20 6f 66 66 69 63 69 61 6c 53 74  raint officialSt
bbf0: 61 62 6c 65 52 65 6c 65 61 73 65 49 6e 50 72 6f  ableReleaseInPro
bc00: 67 72 65 73 73 0d 0a 0d 0a 20 20 20 20 20 20 74  gress....      t
bc10: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
bc20: 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
bc30: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
bc40: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
bc50: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
bc60: 72 6f 63 20 63 68 65 63 6b 46 6f 72 44 65 62 75  roc checkForDebu
bc70: 67 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  g { channel } {.
bc80: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
bc90: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
bca0: 6e 67 20 66 6f 72 20 64 65 62 75 67 2e 2e 2e 20  ng for debug... 
bcb0: 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  "....    if {[in
bcc0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
bcd0: 70 6c 61 74 66 6f 72 6d 28 64 65 62 75 67 29 5d  platform(debug)]
bce0: 20 26 26 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66   && $::tcl_platf
bcf0: 6f 72 6d 28 64 65 62 75 67 29 7d 20 74 68 65 6e  orm(debug)} then
bd00: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
bd10: 73 74 72 61 69 6e 74 20 64 65 62 75 67 0d 0a 0d  straint debug...
bd20: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
bd30: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
bd40: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
bd50: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
bd60: 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  no\n..    }..  }
bd70: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
bd80: 6b 46 6f 72 54 6b 20 7b 20 63 68 61 6e 6e 65 6c  kForTk { channel
bd90: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
bda0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
bdb0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 6b 2e 2e  hecking for Tk..
bdc0: 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  . "....    #..  
bdd0: 20 20 23 20 48 41 43 4b 3a 20 46 6f 72 20 6e 6f    # HACK: For no
bde0: 77 2c 20 64 69 73 61 62 6c 65 20 74 65 73 74 69  w, disable testi
bdf0: 6e 67 20 54 6b 20 38 2e 34 2f 38 2e 35 20 77 68  ng Tk 8.4/8.5 wh
be00: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 45 61  en running in Ea
be10: 67 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  gle...    #..   
be20: 20 69 66 20 7b 21 5b 69 73 45 61 67 6c 65 5d 20   if {![isEagle] 
be30: 7c 7c 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  || [haveConstrai
be40: 6e 74 20 74 63 6c 4c 69 62 72 61 72 79 38 36 5d  nt tclLibrary86]
be50: 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b   || \..        [
be60: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 74  haveConstraint t
be70: 63 6c 4c 69 62 72 61 72 79 38 37 5d 7d 20 74 68  clLibrary87]} th
be80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43  en {..      addC
be90: 6f 6e 73 74 72 61 69 6e 74 20 74 6b 0d 0a 0d 0a  onstraint tk....
bea0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
beb0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
bec0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
bed0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
bee0: 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  o\n..    }..  }.
bef0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
bf00: 46 6f 72 56 65 72 73 69 6f 6e 20 7b 20 63 68 61  ForVersion { cha
bf10: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
bf20: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
bf30: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
bf40: 6c 61 6e 67 75 61 67 65 20 76 65 72 73 69 6f 6e  language version
bf50: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20  ... "....    if 
bf60: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
bf70: 74 63 6c 5f 76 65 72 73 69 6f 6e 5d 7d 20 74 68  tcl_version]} th
bf80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
bf90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
bfa0: 73 74 2c 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  st, obtain the l
bfb0: 69 73 74 20 6f 66 20 61 6c 6c 20 22 6b 6e 6f 77  ist of all "know
bfc0: 6e 22 20 54 63 6c 20 76 65 72 73 69 6f 6e 73 2e  n" Tcl versions.
bfd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
bfe0: 20 73 65 74 20 74 63 6c 56 65 72 73 69 6f 6e 73   set tclVersions
bff0: 20 5b 67 65 74 4b 6e 6f 77 6e 54 63 6c 56 65 72   [getKnownTclVer
c000: 73 69 6f 6e 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  sions]....      
c010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c020: 20 2a 45 41 47 4c 45 2a 20 57 65 20 64 6f 20 77   *EAGLE* We do w
c030: 61 6e 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 61  ant to include a
c040: 6e 79 20 74 65 73 74 73 20 74 68 61 74 20 74 61  ny tests that ta
c050: 72 67 65 74 0d 0a 20 20 20 20 20 20 23 20 20 20  rget..      #   
c060: 20 20 20 20 22 54 63 6c 20 38 2e 58 20 6f 72 20      "Tcl 8.X or 
c070: 68 69 67 68 65 72 22 20 66 65 61 74 75 72 65 73  higher" features
c080: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
c090: 65 73 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ests..      #   
c0a0: 20 20 20 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65      would not be
c0b0: 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 75 69   in the test sui
c0c0: 74 65 20 69 66 20 77 65 20 64 69 64 20 6e 6f 74  te if we did not
c0d0: 20 73 75 70 70 6f 72 74 0d 0a 20 20 20 20 20 20   support..      
c0e0: 23 20 20 20 20 20 20 20 74 68 61 74 20 70 61 72  #       that par
c0f0: 74 69 63 75 6c 61 72 20 66 65 61 74 75 72 65 2c  ticular feature,
c100: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
c110: 68 65 20 6c 61 6e 67 75 61 67 65 0d 0a 20 20 20  he language..   
c120: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69     #       versi
c130: 6f 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  on...      #..  
c140: 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
c150: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
c160: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
c170: 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73 20 65 61  NOTE: Process ea
c180: 63 68 20 22 6b 6e 6f 77 6e 22 20 54 63 6c 20 76  ch "known" Tcl v
c190: 65 72 73 69 6f 6e 2c 20 61 64 64 69 6e 67 20 65  ersion, adding e
c1a0: 61 63 68 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ach of..        
c1b0: 23 20 20 20 20 20 20 20 74 68 65 20 22 66 65 61  #       the "fea
c1c0: 74 75 72 65 22 20 63 6f 6e 73 74 72 61 69 6e 74  ture" constraint
c1d0: 73 20 28 69 2e 65 2e 20 73 69 6e 63 65 20 74 68  s (i.e. since th
c1e0: 69 73 20 69 73 20 61 6e 0d 0a 20 20 20 20 20 20  is is an..      
c1f0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
c200: 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72 61  test suite infra
c210: 73 74 72 75 63 74 75 72 65 20 70 61 63 6b 61 67  structure packag
c220: 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e)...        #..
c230: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
c240: 74 63 6c 56 65 72 73 69 6f 6e 28 31 29 20 24 74  tclVersion(1) $t
c250: 63 6c 56 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20  clVersions {..  
c260: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
c270: 69 6f 6e 28 31 29 20 5b 67 65 74 44 6f 74 6c 65  ion(1) [getDotle
c280: 73 73 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65  ssVersion $tclVe
c290: 72 73 69 6f 6e 28 31 29 5d 0d 0a 20 20 20 20 20  rsion(1)]..     
c2a0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
c2b0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74  nt [appendArgs t
c2c0: 63 6c 20 24 76 65 72 73 69 6f 6e 28 31 29 20 46  cl $version(1) F
c2d0: 65 61 74 75 72 65 5d 0d 0a 20 20 20 20 20 20 20  eature]..       
c2e0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
c2f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
c300: 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73 20 65 61  NOTE: Process ea
c310: 63 68 20 22 6b 6e 6f 77 6e 22 20 54 63 6c 20 76  ch "known" Tcl v
c320: 65 72 73 69 6f 6e 2c 20 63 68 65 63 6b 69 6e 67  ersion, checking
c330: 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20 23   for an..      #
c340: 20 20 20 20 20 20 20 65 78 61 63 74 20 6d 61 74         exact mat
c350: 63 68 20 77 69 74 68 20 74 68 65 20 72 75 6e 6e  ch with the runn
c360: 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 2e  ing Tcl version.
c370: 20 20 57 68 65 6e 20 61 6e 0d 0a 20 20 20 20 20    When an..     
c380: 20 23 20 20 20 20 20 20 20 65 78 61 63 74 20 6d   #       exact m
c390: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 61  atch is found, a
c3a0: 64 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  dd appropriate c
c3b0: 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
c3c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
c3d0: 61 63 68 20 74 63 6c 56 65 72 73 69 6f 6e 28 31  ach tclVersion(1
c3e0: 29 20 24 74 63 6c 56 65 72 73 69 6f 6e 73 20 7b  ) $tclVersions {
c3f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
c410: 73 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 54 63  s the running Tc
c420: 6c 20 76 65 72 73 69 6f 6e 20 6d 61 74 63 68 20  l version match 
c430: 74 68 69 73 20 22 6b 6e 6f 77 6e 22 0d 0a 20 20  this "known"..  
c440: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 63        #       Tc
c450: 6c 20 76 65 72 73 69 6f 6e 20 65 78 61 63 74 6c  l version exactl
c460: 79 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y?..        #.. 
c470: 20 20 20 20 20 20 20 69 66 20 7b 24 3a 3a 74 63         if {$::tc
c480: 6c 5f 76 65 72 73 69 6f 6e 20 65 71 20 5b 67 65  l_version eq [ge
c490: 74 44 6f 74 74 65 64 56 65 72 73 69 6f 6e 20 24  tDottedVersion $
c4a0: 74 63 6c 56 65 72 73 69 6f 6e 28 31 29 5d 7d 20  tclVersion(1)]} 
c4b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c4c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
c4d0: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 64   NOTE: Yes, it d
c4e0: 6f 65 73 2e 20 20 46 69 72 73 74 2c 20 61 64 64  oes.  First, add
c4f0: 20 74 68 65 20 22 65 78 61 63 74 22 20 6d 61 74   the "exact" mat
c500: 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ch..          # 
c510: 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
c520: 2e 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 20  .  There can be 
c530: 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 73  only one of thes
c540: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
c550: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
c560: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
c570: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c580: 20 20 20 20 20 20 74 63 6c 20 5b 67 65 74 44 6f        tcl [getDo
c590: 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 24 74 63  tlessVersion $tc
c5a0: 6c 56 65 72 73 69 6f 6e 28 31 29 5d 5d 0d 0a 0d  lVersion(1)]]...
c5b0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
c5c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c5d0: 4e 65 78 74 2c 20 70 72 6f 63 65 73 73 20 65 61  Next, process ea
c5e0: 63 68 20 6f 66 20 74 68 65 20 22 6b 6e 6f 77 6e  ch of the "known
c5f0: 22 20 54 63 6c 20 76 65 72 73 69 6f 6e 73 0d 0a  " Tcl versions..
c600: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
c610: 20 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65    less than or e
c620: 71 75 61 6c 20 74 6f 20 74 68 65 20 72 75 6e 6e  qual to the runn
c630: 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 2c  ing Tcl version,
c640: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
c650: 20 20 20 20 77 68 69 6c 65 20 61 64 64 69 6e 67      while adding
c660: 20 62 6f 74 68 20 74 68 65 20 22 66 65 61 74 75   both the "featu
c670: 72 65 22 20 61 6e 64 20 22 6f 72 20 68 69 67 68  re" and "or high
c680: 65 72 22 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er"..          #
c690: 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
c6a0: 74 73 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20  ts.  There will 
c6b0: 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61  always be at lea
c6c0: 73 74 20 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20  st one..        
c6d0: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
c6e0: 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  se...          #
c6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
c700: 61 63 68 20 74 63 6c 56 65 72 73 69 6f 6e 28 32  ach tclVersion(2
c710: 29 20 5b 66 69 6c 74 65 72 4b 6e 6f 77 6e 56 65  ) [filterKnownVe
c720: 72 73 69 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20  rsions \..      
c730: 20 20 20 20 20 20 20 20 24 74 63 6c 56 65 72 73          $tclVers
c740: 69 6f 6e 73 20 22 22 20 24 74 63 6c 56 65 72 73  ions "" $tclVers
c750: 69 6f 6e 28 31 29 5d 20 7b 0d 0a 20 20 20 20 20  ion(1)] {..     
c760: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
c770: 6f 6e 28 32 29 20 5b 67 65 74 44 6f 74 6c 65 73  on(2) [getDotles
c780: 73 56 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72  sVersion $tclVer
c790: 73 69 6f 6e 28 32 29 5d 0d 0a 20 20 20 20 20 20  sion(2)]..      
c7a0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
c7b0: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
c7c0: 74 63 6c 20 24 76 65 72 73 69 6f 6e 28 32 29 20  tcl $version(2) 
c7d0: 46 65 61 74 75 72 65 5d 0d 0a 20 20 20 20 20 20  Feature]..      
c7e0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
c7f0: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
c800: 74 63 6c 20 24 76 65 72 73 69 6f 6e 28 32 29 20  tcl $version(2) 
c810: 4f 72 48 69 67 68 65 72 5d 0d 0a 20 20 20 20 20  OrHigher]..     
c820: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c830: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c840: 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79   # NOTE: Finally
c850: 2c 20 70 72 6f 63 65 73 73 20 65 61 63 68 20 6f  , process each o
c860: 66 20 74 68 65 20 22 6b 6e 6f 77 6e 22 20 54 63  f the "known" Tc
c870: 6c 20 76 65 72 73 69 6f 6e 73 0d 0a 20 20 20 20  l versions..    
c880: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 67 72        #       gr
c890: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
c8a0: 75 61 6c 20 74 6f 20 74 68 65 20 72 75 6e 6e 69  ual to the runni
c8b0: 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 2c 0d  ng Tcl version,.
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
c8d0: 20 20 20 77 68 69 6c 65 20 61 64 64 69 6e 67 20     while adding 
c8e0: 74 68 65 20 22 6f 72 20 6c 6f 77 65 72 22 20 63  the "or lower" c
c8f0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 54 68 65  onstraints.  The
c900: 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
c910: 20 20 20 20 20 20 77 69 6c 6c 20 61 6c 77 61 79        will alway
c920: 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
c930: 65 20 6f 66 20 74 68 65 73 65 2e 0d 0a 20 20 20  e of these...   
c940: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c950: 20 20 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56      foreach tclV
c960: 65 72 73 69 6f 6e 28 33 29 20 5b 66 69 6c 74 65  ersion(3) [filte
c970: 72 4b 6e 6f 77 6e 56 65 72 73 69 6f 6e 73 20 5c  rKnownVersions \
c980: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c990: 24 74 63 6c 56 65 72 73 69 6f 6e 73 20 24 74 63  $tclVersions $tc
c9a0: 6c 56 65 72 73 69 6f 6e 28 31 29 20 22 22 5d 20  lVersion(1) ""] 
c9b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
c9c0: 65 74 20 76 65 72 73 69 6f 6e 28 33 29 20 5b 67  et version(3) [g
c9d0: 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e  etDotlessVersion
c9e0: 20 24 74 63 6c 56 65 72 73 69 6f 6e 28 33 29 5d   $tclVersion(3)]
c9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
ca00: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
ca10: 65 6e 64 41 72 67 73 20 74 63 6c 20 24 76 65 72  endArgs tcl $ver
ca20: 73 69 6f 6e 28 33 29 20 4f 72 4c 6f 77 65 72 5d  sion(3) OrLower]
ca30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
ca40: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ca50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ca60: 54 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 6c  There can be onl
ca70: 79 20 6f 6e 65 20 65 78 61 63 74 20 54 63 6c 20  y one exact Tcl 
ca80: 76 65 72 73 69 6f 6e 20 6d 61 74 63 68 3b 0d 0a  version match;..
ca90: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
caa0: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20    therefore, we 
cab0: 61 72 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20  are done...     
cac0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
cad0: 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20    break..       
cae0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
caf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
cb00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
cb10: 24 3a 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 20 5c  $::tcl_version \
cb20: 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  n]..    } else {
cb30: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
cb40: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
cb50: 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
cb60: 6f 63 20 63 68 65 63 6b 46 6f 72 43 6f 6d 6d 61  oc checkForComma
cb70: 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  nd { channel nam
cb80: 65 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  e } {..    tputs
cb90: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
cba0: 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
cbb0: 6b 69 6e 67 20 66 6f 72 20 63 6f 6d 6d 61 6e 64  king for command
cbc0: 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20   \"" $name \..  
cbd0: 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d        "\"... "].
cbe0: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
cbf0: 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 63 6f 6d  NOTE: Is the com
cc00: 6d 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 3f 0d  mand available?.
cc10: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
cc20: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
cc30: 6f 6d 6d 61 6e 64 73 20 24 6e 61 6d 65 5d 5d 20  ommands $name]] 
cc40: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
cc50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cc60: 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65  TE: Yes, it appe
cc70: 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61  ars that it is a
cc80: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
cc90: 20 23 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   #..      addCon
cca0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
ccb0: 72 67 73 20 63 6f 6d 6d 61 6e 64 2e 20 24 6e 61  rgs command. $na
ccc0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  me]....      tpu
ccd0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
cce0: 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
ccf0: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
cd00: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
cd10: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
cd20: 63 20 63 68 65 63 6b 46 6f 72 53 75 62 43 6f 6d  c checkForSubCom
cd30: 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  mand { channel n
cd40: 61 6d 65 73 20 7d 20 7b 0d 0a 20 20 20 20 74 70  ames } {..    tp
cd50: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
cd60: 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
cd70: 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 75 62 2d  hecking for sub-
cd80: 63 6f 6d 6d 61 6e 64 20 5c 22 22 20 24 6e 61 6d  command \"" $nam
cd90: 65 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 22 5c  es \..        "\
cda0: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 23  "... "]....    #
cdb0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73  ..    # NOTE: Is
cdc0: 20 74 68 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64   the sub-command
cdd0: 20 61 76 61 69 6c 61 62 6c 65 3f 20 20 54 68 65   available?  The
cde0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6d   list of names m
cdf0: 75 73 74 20 68 61 76 65 0d 0a 20 20 20 20 23 20  ust have..    # 
ce00: 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 74 77        exactly tw
ce10: 6f 20 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 65  o elements.  The
ce20: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6d   first element m
ce30: 75 73 74 20 62 65 20 74 68 65 20 63 6f 6d 6d 61  ust be the comma
ce40: 6e 64 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  nd..    #       
ce50: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 73 65 63  name and the sec
ce60: 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6d 75 73 74  ond element must
ce70: 20 62 65 20 74 68 65 20 73 75 62 2d 63 6f 6d 6d   be the sub-comm
ce80: 61 6e 64 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 23  and name...    #
ce90: 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67  ..    if {[lleng
cea0: 74 68 20 24 6e 61 6d 65 73 5d 20 3d 3d 20 32 7d  th $names] == 2}
ceb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73   then {..      s
cec0: 65 74 20 63 6f 6d 6d 61 6e 64 4e 61 6d 65 20 5b  et commandName [
ced0: 6c 69 6e 64 65 78 20 24 6e 61 6d 65 73 20 30 5d  lindex $names 0]
cee0: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 75 62 43  ..      set subC
cef0: 6f 6d 6d 61 6e 64 4e 61 6d 65 20 5b 6c 69 6e 64  ommandName [lind
cf00: 65 78 20 24 6e 61 6d 65 73 20 31 5d 0d 0a 0d 0a  ex $names 1]....
cf10: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67        if {[isEag
cf20: 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  le]} then {..   
cf30: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
cf40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
cf50: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
cf60: 3a 20 46 6f 72 20 45 61 67 6c 65 2c 20 75 73 65  : For Eagle, use
cf70: 20 74 68 65 20 5b 69 6e 66 6f 20 73 75 62 63 6f   the [info subco
cf80: 6d 6d 61 6e 64 73 5d 20 73 75 62 2d 63 6f 6d 6d  mmands] sub-comm
cf90: 61 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  and...          
cfa0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 66  #..          inf
cfb0: 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20 24 63  o subcommands $c
cfc0: 6f 6d 6d 61 6e 64 4e 61 6d 65 0d 0a 20 20 20 20  ommandName..    
cfd0: 20 20 20 20 7d 20 73 75 62 43 6f 6d 6d 61 6e 64      } subCommand
cfe0: 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
cff0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
d000: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
d010: 2d 20 24 73 75 62 43 6f 6d 6d 61 6e 64 73 20 24  - $subCommands $
d020: 73 75 62 43 6f 6d 6d 61 6e 64 4e 61 6d 65 5d 20  subCommandName] 
d030: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
d040: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
d050: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
d060: 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
d070: 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61  s that it is ava
d080: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
d090: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d0a0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
d0b0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  t [appendArgs \.
d0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0d0: 20 73 75 62 43 6f 6d 6d 61 6e 64 2e 20 24 63 6f   subCommand. $co
d0e0: 6d 6d 61 6e 64 4e 61 6d 65 20 2e 20 24 73 75 62  mmandName . $sub
d0f0: 43 6f 6d 6d 61 6e 64 4e 61 6d 65 5d 0d 0a 0d 0a  CommandName]....
d100: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
d110: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
d120: 45 3a 20 53 68 6f 77 20 74 68 61 74 20 74 68 65  E: Show that the
d130: 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 77 61 73   sub-command was
d140: 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
d150: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d160: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d170: 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
d180: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d190: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
d1a0: 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
d1b0: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
d1c0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d1d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d           return.
d1e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d1f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
d200: 20 65 6c 73 65 69 66 20 7b 24 3a 3a 74 63 6c 5f   elseif {$::tcl_
d210: 76 65 72 73 69 6f 6e 20 3e 3d 20 38 2e 35 7d 20  version >= 8.5} 
d220: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d230: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
d240: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d250: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
d260: 20 54 63 6c 20 38 2e 35 2b 2c 20 75 73 65 20 74   Tcl 8.5+, use t
d270: 68 65 20 5b 6e 61 6d 65 73 70 61 63 65 20 65 6e  he [namespace en
d280: 73 65 6d 62 6c 65 5d 20 73 75 62 2d 63 6f 6d 6d  semble] sub-comm
d290: 61 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  and...          
d2a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 61 6d  #..          nam
d2b0: 65 73 70 61 63 65 20 65 6e 73 65 6d 62 6c 65 20  espace ensemble 
d2c0: 63 6f 6e 66 69 67 75 72 65 20 24 63 6f 6d 6d 61  configure $comma
d2d0: 6e 64 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  ndName..        
d2e0: 7d 20 73 75 62 43 6f 6d 6d 61 6e 64 73 5d 20 3d  } subCommands] =
d2f0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d300: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b         foreach {
d310: 6e 61 6d 65 20 76 61 6c 75 65 7d 20 5b 67 65 74  name value} [get
d320: 44 69 63 74 69 6f 6e 61 72 79 56 61 6c 75 65 20  DictionaryValue 
d330: 24 73 75 62 43 6f 6d 6d 61 6e 64 73 20 2d 6d 61  $subCommands -ma
d340: 70 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  p] {..          
d350: 20 20 69 66 20 7b 24 6e 61 6d 65 20 65 71 20 24    if {$name eq $
d360: 73 75 62 43 6f 6d 6d 61 6e 64 4e 61 6d 65 7d 20  subCommandName} 
d370: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d380: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d390: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
d3a0: 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74  es, it appears t
d3b0: 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c 61  hat it is availa
d3c0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
d3d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d3e0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d3f0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
d400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d410: 20 20 20 20 73 75 62 43 6f 6d 6d 61 6e 64 2e 20      subCommand. 
d420: 24 63 6f 6d 6d 61 6e 64 4e 61 6d 65 20 2e 20 24  $commandName . $
d430: 73 75 62 43 6f 6d 6d 61 6e 64 4e 61 6d 65 5d 0d  subCommandName].
d440: 0a 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 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
d470: 68 61 74 20 74 68 65 20 73 75 62 2d 63 6f 6d 6d  hat the sub-comm
d480: 61 6e 64 20 77 61 73 20 66 6f 75 6e 64 2e 0d 0a  and was found...
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
d4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
d4b0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
d4c0: 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  s\n....         
d4d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d4e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
d4f0: 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20   are done here, 
d500: 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20  return now...   
d510: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
d520: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
d530: 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn..            
d540: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
d550: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
d560: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
d570: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d580: 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  no\n..  }.....  
d590: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 45 46 6f  proc checkForEFo
d5a0: 72 6d 61 74 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  rmat { channel }
d5b0: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
d5c0: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
d5d0: 63 6b 69 6e 67 20 66 6f 72 20 5c 22 65 66 6f 72  cking for \"efor
d5e0: 6d 61 74 5c 22 20 73 75 70 70 6f 72 74 2e 2e 2e  mat\" support...
d5f0: 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 63   "....    if {[c
d600: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 23 0d  atch {..      #.
d610: 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54  .      # HACK: T
d620: 68 69 73 20 74 65 73 74 20 77 61 73 20 73 74 6f  his test was sto
d630: 6c 65 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f  len directly fro
d640: 6d 20 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c  m the native Tcl
d650: 20 73 6f 75 72 63 65 0d 0a 20 20 20 20 20 20 23   source..      #
d660: 20 20 20 20 20 20 20 66 69 6c 65 20 22 6c 69 62         file "lib
d670: 72 61 72 79 2f 74 63 6c 74 65 73 74 2f 74 63 6c  rary/tcltest/tcl
d680: 74 65 73 74 2e 74 63 6c 22 2c 20 77 68 69 63 68  test.tcl", which
d690: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0d   is part of the.
d6a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
d6b0: 74 63 6c 74 65 73 74 22 20 70 61 63 6b 61 67 65  tcltest" package
d6c0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d6d0: 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d    if {[isEagle]}
d6e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d6f0: 20 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20   expr {..       
d700: 20 20 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c     [string equal
d710: 20 5b 66 6f 72 6d 61 74 20 25 2e 30 65 20 35 65   [format %.0e 5e
d720: 2d 35 5d 20 35 65 2d 30 35 5d 20 26 26 20 5c 0d  -5] 5e-05] && \.
d730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
d740: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 5b 66 6f  string equal [fo
d750: 72 6d 61 74 20 25 23 2e 35 67 20 30 5d 20 30 2e  rmat %#.5g 0] 0.
d760: 30 30 30 30 5d 0d 0a 20 20 20 20 20 20 20 20 7d  0000]..        }
d770: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
d780: 0d 0a 20 20 20 20 20 20 20 20 65 78 70 72 20 7b  ..        expr {
d790: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
d7a0: 69 6e 67 20 65 71 75 61 6c 20 5b 66 6f 72 6d 61  ing equal [forma
d7b0: 74 20 25 67 20 35 65 2d 35 5d 20 35 65 2d 30 35  t %g 5e-5] 5e-05
d7c0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
d7d0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 65 71        [string eq
d7e0: 75 61 6c 20 5b 66 6f 72 6d 61 74 20 25 23 2e 35  ual [format %#.5
d7f0: 67 20 30 5d 20 30 2e 30 30 30 30 5d 0d 0a 20 20  g 0] 0.0000]..  
d800: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
d810: 0d 0a 20 20 20 20 7d 20 65 66 6f 72 6d 61 74 5d  ..    } eformat]
d820: 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67   == 0 && [string
d830: 20 69 73 20 74 72 75 65 20 2d 73 74 72 69 63 74   is true -strict
d840: 20 24 65 66 6f 72 6d 61 74 5d 7d 20 74 68 65 6e   $eformat]} then
d850: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
d860: 73 74 72 61 69 6e 74 20 65 66 6f 72 6d 61 74 0d  straint eformat.
d870: 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
d880: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
d890: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
d8a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d8b0: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
d8c0: 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
d8d0: 65 63 6b 46 6f 72 4e 61 6d 65 73 70 61 63 65 73  eckForNamespaces
d8e0: 20 7b 20 63 68 61 6e 6e 65 6c 20 71 75 69 65 74   { channel quiet
d8f0: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
d900: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
d910: 68 65 63 6b 69 6e 67 20 66 6f 72 20 6e 61 6d 65  hecking for name
d920: 73 70 61 63 65 20 73 75 70 70 6f 72 74 2e 2e 2e  space support...
d930: 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69   "....    if {[i
d940: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
d950: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d960: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
d970: 20 6e 61 6d 65 73 70 61 63 65 20 73 75 70 70 6f   namespace suppo
d980: 72 74 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20  rt was compiled 
d990: 69 6e 74 6f 20 74 68 65 20 63 6f 72 65 0d 0a 20  into the core.. 
d9a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
d9b0: 72 61 72 79 20 28 69 2e 65 2e 20 74 68 69 73 20  rary (i.e. this 
d9c0: 69 73 20 62 65 74 61 20 33 30 20 6f 72 20 6c 61  is beta 30 or la
d9d0: 74 65 72 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ter)...      #..
d9e0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
d9f0: 20 7b 6e 61 6d 65 73 70 61 63 65 20 65 6e 61 62   {namespace enab
da00: 6c 65 7d 20 65 6e 61 62 6c 65 64 5d 20 3d 3d 20  le} enabled] == 
da10: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
da20: 20 20 20 73 65 74 20 61 76 61 69 6c 61 62 6c 65     set available
da30: 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
da40: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e   addConstraint n
da50: 61 6d 65 73 70 61 63 65 73 2e 61 76 61 69 6c 61  amespaces.availa
da60: 62 6c 65 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ble..      } els
da70: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
da80: 20 61 76 61 69 6c 61 62 6c 65 20 66 61 6c 73 65   available false
da90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  ....        addC
daa0: 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65 73 70  onstraint namesp
dab0: 61 63 65 73 2e 75 6e 61 76 61 69 6c 61 62 6c 65  aces.unavailable
dac0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
dad0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
dae0: 54 45 3a 20 57 65 20 77 65 72 65 20 61 62 6c 65  TE: We were able
daf0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 6e 61   to query for na
db00: 6d 65 73 70 61 63 65 20 73 75 70 70 6f 72 74 20  mespace support 
db10: 28 69 2e 65 2e 20 74 68 69 73 0d 0a 20 20 20 20  (i.e. this..    
db20: 20 20 23 20 20 20 20 20 20 20 6d 75 73 74 20 62    #       must b
db30: 65 20 62 65 74 61 20 32 39 20 6f 72 20 6c 61 74  e beta 29 or lat
db40: 65 72 29 3b 20 68 6f 77 65 76 65 72 2c 20 77 65  er); however, we
db50: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 0d 0a   still need to..
db60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68        #       ch
db70: 65 63 6b 20 69 66 20 69 74 20 68 61 73 20 62 65  eck if it has be
db80: 65 6e 20 65 6e 61 62 6c 65 64 20 61 74 20 72 75  en enabled at ru
db90: 6e 74 69 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d  ntime...      #.
dba0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
dbb0: 6e 67 20 69 73 20 74 72 75 65 20 2d 73 74 72 69  ng is true -stri
dbc0: 63 74 20 24 65 6e 61 62 6c 65 64 5d 7d 20 74 68  ct $enabled]} th
dbd0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
dbe0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
dbf0: 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
dc00: 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69   that it is avai
dc10: 6c 61 62 6c 65 20 61 6e 64 20 65 6e 61 62 6c 65  lable and enable
dc20: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
dc30: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
dc40: 61 69 6e 74 20 6e 61 6d 65 73 70 61 63 65 73 0d  aint namespaces.
dc50: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
dc60: 20 24 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65   $channel enable
dc70: 64 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  d\n..      } els
dc80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
dc90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 64 69 73 61  ts $channel disa
dca0: 62 6c 65 64 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20  bled\n....      
dcb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
dcc0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 6e 61  OTE: Check if na
dcd0: 6d 65 73 70 61 63 65 20 73 75 70 70 6f 72 74 20  mespace support 
dce0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74  was compiled int
dcf0: 6f 20 74 68 65 20 63 6f 72 65 0d 0a 20 20 20 20  o the core..    
dd00: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
dd10: 61 72 79 20 28 69 2e 65 2e 20 69 73 20 74 68 69  ary (i.e. is thi
dd20: 73 20 62 65 74 61 20 33 30 20 6f 72 20 6c 61 74  s beta 30 or lat
dd30: 65 72 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  er)...        #.
dd40: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
dd50: 75 69 65 74 20 26 26 20 24 61 76 61 69 6c 61 62  uiet && $availab
dd60: 6c 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  le} then {..    
dd70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dd80: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 74     # NOTE: The t
dd90: 65 73 74 73 20 73 65 65 6d 20 74 6f 20 62 65 20  ests seem to be 
dda0: 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6e 61 6d  running with nam
ddb0: 65 73 70 61 63 65 20 73 75 70 70 6f 72 74 0d 0a  espace support..
ddc0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
ddd0: 20 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 75 74    available, but
dde0: 20 64 69 73 61 62 6c 65 64 2e 20 20 45 6d 69 74   disabled.  Emit
ddf0: 20 61 20 77 61 72 6e 69 6e 67 20 69 6e 74 6f 20   a warning into 
de00: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  the..          #
de10: 20 20 20 20 20 20 20 74 65 73 74 20 6c 6f 67 20         test log 
de20: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
de30: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   #..          tp
de40: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a  uts $channel \..
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
de60: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 72 75 6e  === WARNING: run
de70: 6e 69 6e 67 20 77 69 74 68 20 6e 61 6d 65 73 70  ning with namesp
de80: 61 63 65 73 20 61 76 61 69 6c 61 62 6c 65 20 61  aces available a
de90: 6e 64 20 64 69 73 61 62 6c 65 64 5c 6e 22 0d 0a  nd disabled\n"..
dea0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
deb0: 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   }..    } else {
dec0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ded0: 20 23 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 70   # NOTE: All sup
dee0: 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e 73 20  ported versions 
def0: 6f 66 20 6e 61 74 69 76 65 20 54 63 6c 20 68 61  of native Tcl ha
df00: 76 65 20 6e 61 6d 65 73 70 61 63 65 73 20 65 6e  ve namespaces en
df10: 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 23 20 20  abled..      #  
df20: 20 20 20 20 20 61 6e 64 20 61 76 61 69 6c 61 62       and availab
df30: 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
df40: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
df50: 74 20 6e 61 6d 65 73 70 61 63 65 73 2e 61 76 61  t namespaces.ava
df60: 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 61 64  ilable..      ad
df70: 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65  dConstraint name
df80: 73 70 61 63 65 73 0d 0a 0d 0a 20 20 20 20 20 20  spaces....      
df90: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65  tputs $channel e
dfa0: 6e 61 62 6c 65 64 5c 6e 0d 0a 20 20 20 20 7d 0d  nabled\n..    }.
dfb0: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
dfc0: 63 68 65 63 6b 46 6f 72 54 65 73 74 45 78 65 63  checkForTestExec
dfd0: 20 7b 20 63 68 61 6e 6e 65 6c 20 71 75 69 65 74   { channel quiet
dfe0: 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
dff0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
e000: 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 65 73 74  hecking for test
e010: 20 75 73 65 20 6f 66 20 5c 22 65 78 65 63 5c 22   use of \"exec\"
e020: 20 63 6f 6d 6d 61 6e 64 2e 2e 2e 20 22 0d 0a 0d   command... "...
e030: 0a 20 20 20 20 73 65 74 20 70 72 6f 63 4e 61 6d  .    set procNam
e040: 65 20 5b 6c 69 6e 64 65 78 20 5b 69 6e 66 6f 20  e [lindex [info 
e050: 6c 65 76 65 6c 20 5b 69 6e 66 6f 20 6c 65 76 65  level [info leve
e060: 6c 5d 5d 20 30 5d 0d 0a 0d 0a 20 20 20 20 69 66  l]] 0]....    if
e070: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
e080: 3a 3a 6e 6f 28 74 65 73 74 45 78 65 63 29 5d 20  ::no(testExec)] 
e090: 26 26 20 5b 63 61 6e 54 65 73 74 45 78 65 63 20  && [canTestExec 
e0a0: 24 70 72 6f 63 4e 61 6d 65 5d 7d 20 74 68 65 6e  $procName]} then
e0b0: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
e0c0: 73 74 72 61 69 6e 74 20 74 65 73 74 45 78 65 63  straint testExec
e0d0: 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
e0e0: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
e0f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
e100: 69 65 74 20 26 26 20 5b 69 6e 66 6f 20 65 78 69  iet && [info exi
e110: 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 7d  sts ::no(exec)]}
e120: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e130: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e140: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
e150: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 72 75  ==== WARNING: ru
e160: 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65 20 5c  nning with the \
e170: 22 74 65 73 74 45 78 65 63 5c 22 20 70 72 6f 63  "testExec\" proc
e180: 65 64 75 72 65 20 64 69 73 61 62 6c 65 64 5c 6e  edure disabled\n
e190: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
e1a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e1b0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
e1c0: 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  o\n..    }..  }.
e1d0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
e1e0: 46 6f 72 54 65 73 74 4d 61 63 68 69 6e 65 20 7b  ForTestMachine {
e1f0: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
e200: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e210: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
e220: 66 6f 72 20 74 65 73 74 20 6d 61 63 68 69 6e 65  for test machine
e230: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20  ... "....    if 
e240: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
e250: 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26  test_machine] &&
e260: 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72   \..        [str
e270: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
e280: 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d  st_machine] > 0}
e290: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
e2a0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
e2b0: 70 65 6e 64 41 72 67 73 20 6d 61 63 68 69 6e 65  pendArgs machine
e2c0: 2e 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  . $::test_machin
e2d0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  e]....      tput
e2e0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e2f0: 6e 64 41 72 67 73 20 24 3a 3a 74 65 73 74 5f 6d  ndArgs $::test_m
e300: 61 63 68 69 6e 65 20 5c 6e 5d 0d 0a 20 20 20 20  achine \n]..    
e310: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e320: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75  tputs $channel u
e330: 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 7d 0d  nknown\n..    }.
e340: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
e350: 63 68 65 63 6b 46 6f 72 54 65 73 74 50 6c 61 74  checkForTestPlat
e360: 66 6f 72 6d 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  form { channel }
e370: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
e380: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
e390: 63 6b 69 6e 67 20 66 6f 72 20 74 65 73 74 20 70  cking for test p
e3a0: 6c 61 74 66 6f 72 6d 2e 2e 2e 20 22 0d 0a 0d 0a  latform... "....
e3b0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
e3c0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74  ists ::test_plat
e3d0: 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20  form] && \..    
e3e0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
e3f0: 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66  th $::test_platf
e400: 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
e410: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
e420: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
e430: 73 20 70 6c 61 74 66 6f 72 6d 2e 20 24 3a 3a 74  s platform. $::t
e440: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  est_platform]...
e450: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
e460: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
e470: 73 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  s $::test_platfo
e480: 72 6d 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c  rm \n]..    } el
e490: 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  se {..      tput
e4a0: 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  s $channel unkno
e4b0: 77 6e 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  wn\n..    }..  }
e4c0: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
e4d0: 6b 46 6f 72 54 65 73 74 43 6f 6e 66 69 67 75 72  kForTestConfigur
e4e0: 61 74 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20  ation { channel 
e4f0: 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
e500: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
e510: 65 63 6b 69 6e 67 20 66 6f 72 20 74 65 73 74 20  ecking for test 
e520: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e  configuration...
e530: 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69   "....    if {[i
e540: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
e550: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  t_configuration]
e560: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b   && \..        [
e570: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
e580: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
e590: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
e5a0: 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
e5b0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
e5c0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  s configuration.
e5d0: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
e5e0: 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ration]....     
e5f0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e600: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a 74  [appendArgs $::t
e610: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
e620: 6e 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73  n \n]..    } els
e630: 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e {..      tputs
e640: 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77   $channel unknow
e650: 6e 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  n\n..    }..  }.
e660: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
e670: 46 6f 72 54 65 73 74 4e 61 6d 65 50 72 65 66 69  ForTestNamePrefi
e680: 78 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  x { channel } {.
e690: 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
e6a0: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
e6b0: 6e 67 20 66 6f 72 20 74 65 73 74 20 6e 61 6d 65  ng for test name
e6c0: 20 70 72 65 66 69 78 2e 2e 2e 20 22 0d 0a 0d 0a   prefix... "....
e6d0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
e6e0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 61 6d 65  ists ::test_name
e6f0: 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a 20  _prefix] && \.. 
e700: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
e710: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 61  ength $::test_na
e720: 6d 65 5f 70 72 65 66 69 78 5d 20 3e 20 30 7d 20  me_prefix] > 0} 
e730: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
e740: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
e750: 65 6e 64 41 72 67 73 20 6e 61 6d 65 50 72 65 66  endArgs namePref
e760: 69 78 2e 20 24 3a 3a 74 65 73 74 5f 6e 61 6d 65  ix. $::test_name
e770: 5f 70 72 65 66 69 78 5d 0d 0a 0d 0a 20 20 20 20  _prefix]....    
e780: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e790: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 3a 3a   [appendArgs $::
e7a0: 74 65 73 74 5f 6e 61 6d 65 5f 70 72 65 66 69 78  test_name_prefix
e7b0: 20 5c 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65   \n]..    } else
e7c0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
e7d0: 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  $channel unknown
e7e0: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
e7f0: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
e800: 6f 72 54 65 73 74 53 75 66 66 69 78 20 7b 20 63  orTestSuffix { c
e810: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
e820: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
e830: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
e840: 72 20 74 65 73 74 20 73 75 66 66 69 78 2e 2e 2e  r test suffix...
e850: 20 22 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 69   "....    if {[i
e860: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
e870: 74 5f 73 75 66 66 69 78 5d 20 26 26 20 5c 0d 0a  t_suffix] && \..
e880: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
e890: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 73  length $::test_s
e8a0: 75 66 66 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e  uffix] > 0} then
e8b0: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
e8c0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
e8d0: 72 67 73 20 73 75 66 66 69 78 2e 20 24 3a 3a 74  rgs suffix. $::t
e8e0: 65 73 74 5f 73 75 66 66 69 78 5d 0d 0a 0d 0a 20  est_suffix].... 
e8f0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e900: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e910: 24 3a 3a 74 65 73 74 5f 73 75 66 66 69 78 20 5c  $::test_suffix \
e920: 6e 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  n]..    } else {
e930: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
e940: 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
e950: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d  ..    }..  }....
e960: 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72  .  proc checkFor
e970: 46 69 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  File { channel n
e980: 61 6d 65 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20  ame {constraint 
e990: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  ""} } {..    tpu
e9a0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
e9b0: 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
e9c0: 65 63 6b 69 6e 67 20 66 6f 72 20 66 69 6c 65 20  ecking for file 
e9d0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  \"" \..        [
e9e0: 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24  file normalize $
e9f0: 6e 61 6d 65 5d 20 22 5c 22 2e 2e 2e 20 22 5d 0d  name] "\"... "].
ea00: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  ...    if {[file
ea10: 20 65 78 69 73 74 73 20 24 6e 61 6d 65 5d 7d 20   exists $name]} 
ea20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
ea30: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59  .      # NOTE: Y
ea40: 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74  es, it appears t
ea50: 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c 61  hat it is availa
ea60: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble...      #.. 
ea70: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
ea80: 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73 74 72 61   length $constra
ea90: 69 6e 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  int] > 0} then {
eaa0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
eab0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
eac0: 72 67 73 20 66 69 6c 65 5f 20 24 63 6f 6e 73 74  rgs file_ $const
ead0: 72 61 69 6e 74 5d 0d 0a 20 20 20 20 20 20 7d 20  raint]..      } 
eae0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
eaf0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
eb00: 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
eb10: 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 61 6d 65  [file tail $name
eb20: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
eb30: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
eb40: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
eb50: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
eb60: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
eb70: 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
eb80: 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
eb90: 6f 72 50 61 74 68 46 69 6c 65 20 7b 20 63 68 61  orPathFile { cha
eba0: 6e 6e 65 6c 20 6e 61 6d 65 20 7b 63 6f 6e 73 74  nnel name {const
ebb0: 72 61 69 6e 74 20 22 22 7d 20 7d 20 7b 0d 0a 20  raint ""} } {.. 
ebc0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ebd0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
ebe0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
ebf0: 20 66 69 6c 65 20 5c 22 22 20 24 6e 61 6d 65 20   file \"" $name 
ec00: 5c 0d 0a 20 20 20 20 20 20 20 20 22 5c 22 20 61  \..        "\" a
ec10: 6c 6f 6e 67 20 50 41 54 48 2e 2e 2e 20 22 5d 0d  long PATH... "].
ec20: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  ...    if {[file
ec30: 20 65 78 69 73 74 73 20 24 6e 61 6d 65 5d 7d 20   exists $name]} 
ec40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
ec50: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59  .      # NOTE: Y
ec60: 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74  es, it appears t
ec70: 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c 61  hat it is availa
ec80: 62 6c 65 20 5b 69 6e 20 74 68 65 20 65 78 61 63  ble [in the exac
ec90: 74 20 6c 6f 63 61 74 69 6f 6e 20 74 68 65 79 0d  t location they.
eca0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
ecb0: 70 65 63 69 66 69 65 64 5d 2e 0d 0a 20 20 20 20  pecified]...    
ecc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
ecd0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 63  string length $c
ece0: 6f 6e 73 74 72 61 69 6e 74 5d 20 3e 20 30 7d 20  onstraint] > 0} 
ecf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ed00: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
ed10: 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
ed20: 24 63 6f 6e 73 74 72 61 69 6e 74 5d 0d 0a 20 20  $constraint]..  
ed30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ed40: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ed50: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
ed60: 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c  file_ [file tail
ed70: 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20   $name]]..      
ed80: 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  }....      tputs
ed90: 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
eda0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
edb0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
edc0: 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
edd0: 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  rn now...      #
ede0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a  ..      return..
edf0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ee00: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ee10: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 61 70 70  OTE: Use the app
ee20: 72 6f 70 72 69 61 74 65 20 65 6e 76 69 72 6f 6e  ropriate environ
ee30: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 66 6f  ment variable fo
ee40: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
ee50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ee60: 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d  if {[isWindows]}
ee70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ee80: 20 73 65 74 20 70 61 74 68 4e 61 6d 65 20 50 41   set pathName PA
ee90: 54 48 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  TH..      } else
eea0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
eeb0: 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 46         # HACK: F
eec0: 6f 72 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  or shared librar
eed0: 69 65 73 2c 20 75 73 65 20 74 68 65 20 4c 44 5f  ies, use the LD_
eee0: 4c 49 42 52 41 52 59 5f 50 41 54 48 2e 0d 0a 20  LIBRARY_PATH... 
eef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ef00: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 74 65    if {[file exte
ef10: 6e 73 69 6f 6e 20 24 6e 61 6d 65 5d 20 65 71 20  nsion $name] eq 
ef20: 5b 69 6e 66 6f 20 73 68 61 72 65 64 6c 69 62 65  [info sharedlibe
ef30: 78 74 65 6e 73 69 6f 6e 5d 7d 20 74 68 65 6e 20  xtension]} then 
ef40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
ef50: 20 70 61 74 68 4e 61 6d 65 20 4c 44 5f 4c 49 42   pathName LD_LIB
ef60: 52 41 52 59 5f 50 41 54 48 0d 0a 20 20 20 20 20  RARY_PATH..     
ef70: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ef80: 20 20 20 20 20 20 20 73 65 74 20 70 61 74 68 4e         set pathN
ef90: 61 6d 65 20 50 41 54 48 0d 0a 20 20 20 20 20 20  ame PATH..      
efa0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
efb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
efc0: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 72 65   NOTE: Is the re
efd0: 71 75 69 72 65 64 20 65 6e 76 69 72 6f 6e 6d 65  quired environme
efe0: 6e 74 20 76 61 72 69 61 62 6c 65 20 61 76 61 69  nt variable avai
eff0: 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d  lable?..      #.
f000: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
f010: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 70   exists ::env($p
f020: 61 74 68 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20  athName)]} then 
f030: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
f040: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6b        # NOTE: Ok
f050: 2c 20 67 72 61 62 20 69 74 20 6e 6f 77 2e 0d 0a  , grab it now...
f060: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f070: 20 20 20 73 65 74 20 70 61 74 68 20 24 3a 3a 65     set path $::e
f080: 6e 76 28 24 70 61 74 68 4e 61 6d 65 29 0d 0a 0d  nv($pathName)...
f090: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f0a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
f0b0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
f0c0: 70 61 74 68 20 73 65 70 61 72 61 74 6f 72 20 66  path separator f
f0d0: 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e  or the platform.
f0e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f0f0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
f100: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
f110: 66 6f 72 6d 28 70 61 74 68 53 65 70 61 72 61 74  form(pathSeparat
f120: 6f 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  or)]} then {..  
f130: 20 20 20 20 20 20 20 20 73 65 74 20 73 65 70 61          set sepa
f140: 72 61 74 6f 72 20 24 3a 3a 74 63 6c 5f 70 6c 61  rator $::tcl_pla
f150: 74 66 6f 72 6d 28 70 61 74 68 53 65 70 61 72 61  tform(pathSepara
f160: 74 6f 72 29 0d 0a 20 20 20 20 20 20 20 20 7d 20  tor)..        } 
f170: 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f  elseif {[isWindo
f180: 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ws]} then {..   
f190: 20 20 20 20 20 20 20 73 65 74 20 73 65 70 61 72         set separ
f1a0: 61 74 6f 72 20 5c 3b 0d 0a 20 20 20 20 20 20 20  ator \;..       
f1b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
f1c0: 20 20 20 20 20 73 65 74 20 73 65 70 61 72 61 74       set separat
f1d0: 6f 72 20 3a 0d 0a 20 20 20 20 20 20 20 20 7d 0d  or :..        }.
f1e0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f1f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
f200: 61 62 20 6a 75 73 74 20 74 68 65 20 66 69 6c 65  ab just the file
f210: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 70   name from the p
f220: 6f 73 73 69 62 6c 79 20 66 75 6c 6c 79 20 71 75  ossibly fully qu
f230: 61 6c 69 66 69 65 64 20 66 69 6c 65 0d 0a 20 20  alified file..  
f240: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
f250: 6d 65 20 70 72 6f 76 69 64 65 64 20 62 79 20 74  me provided by t
f260: 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  he caller...    
f270: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
f280: 65 74 20 74 61 69 6c 20 5b 66 69 6c 65 20 74 61  et tail [file ta
f290: 69 6c 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  il $name]....   
f2a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f2b0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 65 61  # NOTE: Check ea
f2c0: 63 68 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20  ch directory in 
f2d0: 74 68 65 20 50 41 54 48 20 66 6f 72 20 74 68 65  the PATH for the
f2e0: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
f2f0: 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
f300: 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 73 70  ch directory [sp
f310: 6c 69 74 20 24 70 61 74 68 20 24 73 65 70 61 72  lit $path $separ
f320: 61 74 6f 72 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ator] {..       
f330: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f340: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
f350: 72 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  r the file in th
f360: 69 73 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  is directory con
f370: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 50 41  tained in the PA
f380: 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  TH...          #
f390: 20 20 20 20 20 20 20 54 68 69 73 20 73 74 72 69         This stri
f3a0: 70 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ps the directory
f3b0: 20 70 6f 72 74 69 6f 6e 20 6f 66 66 20 74 68 65   portion off the
f3c0: 20 66 69 6c 65 20 6e 61 6d 65 20 73 70 65 63 69   file name speci
f3d0: 66 69 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  fied..          
f3e0: 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20 63  #       by the c
f3f0: 61 6c 6c 65 72 2c 20 69 66 20 61 6e 79 2c 20 62  aller, if any, b
f400: 65 66 6f 72 65 20 6a 6f 69 6e 69 6e 67 20 74 68  efore joining th
f410: 61 74 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  at file name to 
f420: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  the..          #
f430: 20 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64         current d
f440: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
f450: 50 41 54 48 20 62 65 69 6e 67 20 73 65 61 72 63  PATH being searc
f460: 68 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  hed...          
f470: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
f480: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 5b 66  {[file exists [f
f490: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
f4a0: 6f 72 79 20 24 74 61 69 6c 5d 5d 7d 20 74 68 65  ory $tail]]} the
f4b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
f4c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
f4d0: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
f4e0: 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
f4f0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
f500: 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20 20  the PATH...     
f510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f520: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
f530: 67 20 6c 65 6e 67 74 68 20 24 63 6f 6e 73 74 72  g length $constr
f540: 61 69 6e 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  aint] > 0} then 
f550: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
f560: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
f570: 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
f580: 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 0d 0a 20   $constraint].. 
f590: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
f5a0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
f5b0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
f5c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
f5d0: 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e  e_ [file tail $n
f5e0: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ame]]..         
f5f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
f600: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f610: 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
f620: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f630: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
f640: 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
f650: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
f660: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
f670: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d           return.
f680: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f690: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
f6a0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74  ..    }....    t
f6b0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
f6c0: 5c 6e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72  \n..  }.....  pr
f6d0: 6f 63 20 63 68 65 63 6b 46 6f 72 4e 61 74 69 76  oc checkForNativ
f6e0: 65 43 6f 64 65 20 7b 20 63 68 61 6e 6e 65 6c 20  eCode { channel 
f6f0: 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
f700: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
f710: 65 63 6b 69 6e 67 20 66 6f 72 20 6e 61 74 69 76  ecking for nativ
f720: 65 20 63 6f 64 65 2e 2e 2e 20 22 0d 0a 0d 0a 20  e code... ".... 
f730: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
f740: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f750: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
f760: 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72   ::eagle_platfor
f770: 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  m(compileOptions
f780: 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
f790: 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20     [info exists 
f7a0: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  ::tcl_platform(p
f7b0: 6c 61 74 66 6f 72 6d 29 5d 20 26 26 20 5c 0d 0a  latform)] && \..
f7c0: 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72            [lsear
f7d0: 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
f7e0: 65 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  e $::eagle_platf
f7f0: 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f  orm(compileOptio
f800: 6e 73 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ns) \..         
f810: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
f820: 28 70 6c 61 74 66 6f 72 6d 29 5d 20 21 3d 20 2d  (platform)] != -
f830: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
f840: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f850: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 62  NOTE: Yes, the b
f860: 69 6e 61 72 79 20 6d 61 74 63 68 65 73 20 74 68  inary matches th
f870: 65 20 63 75 72 72 65 6e 74 20 70 6c 61 74 66 6f  e current platfo
f880: 72 6d 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  rm,..        #  
f890: 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 64 65       native code
f8a0: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0d 0a 20   can be used... 
f8b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f8c0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
f8d0: 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20  native....      
f8e0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f8f0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
f900: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
f910: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
f920: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
f930: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f940: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
f950: 45 3a 20 54 63 6c 20 69 73 20 61 6c 77 61 79 73  E: Tcl is always
f960: 20 6e 61 74 69 76 65 20 63 6f 64 65 20 61 6e 64   native code and
f970: 20 63 61 6e 20 61 6c 77 61 79 73 20 65 78 65 63   can always exec
f980: 75 74 65 20 6e 61 74 69 76 65 20 63 6f 64 65 2e  ute native code.
f990: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f9a0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6e   addConstraint n
f9b0: 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 74  ative....      t
f9c0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
f9d0: 73 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  s\n..    }..  }.
f9e0: 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b  ....  proc check
f9f0: 46 6f 72 54 69 70 31 32 37 20 7b 20 63 68 61 6e  ForTip127 { chan
fa00: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75  nel } {..    tpu
fa10: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
fa20: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54  - checking for T
fa30: 49 50 20 23 31 32 37 2e 2e 2e 20 22 0d 0a 0d 0a  IP #127... "....
fa40: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
fa50: 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65 72 70  E: Is the interp
fa60: 72 65 74 65 72 20 54 49 50 20 23 31 32 37 20 72  reter TIP #127 r
fa70: 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20  eady?..    #..  
fa80: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6c 73    if {[catch {ls
fa90: 65 61 72 63 68 20 2d 69 6e 64 65 78 20 30 20 30  earch -index 0 0
faa0: 20 30 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20   0}] == 0} then 
fab0: 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73  {..      addCons
fac0: 74 72 61 69 6e 74 20 74 69 70 31 32 37 0d 0a 0d  traint tip127...
fad0: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
fae0: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
faf0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
fb00: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
fb10: 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  no\n..    }..  }
fb20: 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63  .....  proc chec
fb30: 6b 46 6f 72 54 69 70 31 39 34 20 7b 20 63 68 61  kForTip194 { cha
fb40: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
fb50: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
fb60: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fb70: 54 49 50 20 23 31 39 34 2e 2e 2e 20 22 0d 0a 0d  TIP #194... "...
fb80: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
fb90: 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65 72  TE: Is the inter
fba0: 70 72 65 74 65 72 20 54 49 50 20 23 31 39 34 20  preter TIP #194 
fbb0: 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20  ready?..    #.. 
fbc0: 20 20 20 63 61 74 63 68 20 7b 61 70 70 6c 79 7d     catch {apply}
fbd0: 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 69 66   error....    if
fbe0: 20 7b 24 65 72 72 6f 72 20 6e 65 20 7b 69 6e 76   {$error ne {inv
fbf0: 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  alid command nam
fc00: 65 20 22 61 70 70 6c 79 22 7d 7d 20 74 68 65 6e  e "apply"}} then
fc10: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
fc20: 73 74 72 61 69 6e 74 20 74 69 70 31 39 34 0d 0a  straint tip194..
fc30: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
fc40: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
fc50: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
fc60: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fc70: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
fc80: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
fc90: 63 6b 46 6f 72 54 69 70 32 30 37 20 7b 20 63 68  ckForTip207 { ch
fca0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
fcb0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
fcc0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
fcd0: 20 54 49 50 20 23 32 30 37 2e 2e 2e 20 22 0d 0a   TIP #207... "..
fce0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
fcf0: 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65  OTE: Is the inte
fd00: 72 70 72 65 74 65 72 20 54 49 50 20 23 32 30 37  rpreter TIP #207
fd10: 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a   ready?..    #..
fd20: 20 20 20 20 63 61 74 63 68 20 7b 69 6e 74 65 72      catch {inter
fd30: 70 20 69 6e 76 6f 6b 65 68 69 64 64 65 6e 20 7b  p invokehidden {
fd40: 7d 20 2d 6e 61 6d 65 73 70 61 63 65 20 2d 2d 20  } -namespace -- 
fd50: 69 6e 66 6f 7d 20 65 72 72 6f 72 0d 0a 0d 0a 20  info} error.... 
fd60: 20 20 20 69 66 20 7b 21 5b 73 74 72 69 6e 67 20     if {![string 
fd70: 6d 61 74 63 68 20 7b 62 61 64 20 6f 70 74 69 6f  match {bad optio
fd80: 6e 20 22 2d 6e 61 6d 65 73 70 61 63 65 22 3a 20  n "-namespace": 
fd90: 2a 7d 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  *} $error]} then
fda0: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
fdb0: 73 74 72 61 69 6e 74 20 74 69 70 32 30 37 0d 0a  straint tip207..
fdc0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
fdd0: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
fde0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
fdf0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fe00: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
fe10: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
fe20: 63 6b 46 6f 72 54 69 70 32 34 31 20 7b 20 63 68  ckForTip241 { ch
fe30: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
fe40: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
fe50: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
fe60: 20 54 49 50 20 23 32 34 31 2e 2e 2e 20 22 0d 0a   TIP #241... "..
fe70: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
fe80: 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74 65  OTE: Is the inte
fe90: 72 70 72 65 74 65 72 20 54 49 50 20 23 32 34 31  rpreter TIP #241
fea0: 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d 0a   ready?..    #..
feb0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
fec0: 6c 73 65 61 72 63 68 20 2d 6e 6f 63 61 73 65 20  lsearch -nocase 
fed0: 30 20 30 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  0 0}] == 0} then
fee0: 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
fef0: 73 74 72 61 69 6e 74 20 74 69 70 32 34 31 0d 0a  straint tip241..
ff00: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
ff10: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
ff20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ff30: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ff40: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
ff50: 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
ff60: 63 6b 46 6f 72 54 69 70 32 38 35 20 7b 20 63 68  ckForTip285 { ch
ff70: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74  annel } {..    t
ff80: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
ff90: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
ffa0: 20 54 49 50 20 23 32 38 35 2e 2e 2e 20 22 0d 0a   TIP #285... "..
ffb0: 0d 0a 20 20 20 20 69 66 20 7b 5b 61 6c 77 61 79  ..    if {[alway
ffc0: 73 46 75 6c 6c 49 6e 74 65 72 70 52 65 61 64 79  sFullInterpReady
ffd0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
ffe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fff0: 3a 20 49 73 20 74 68 65 20 69 6e 74 65 72 70 72  : Is the interpr
10000 65 74 65 72 20 54 49 50 20 23 32 38 35 20 72 65  eter TIP #285 re
10010 61 64 79 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ady?..      #.. 
10020 20 20 20 20 20 63 61 74 63 68 20 7b 69 6e 74 65       catch {inte
10030 72 70 20 63 61 6e 63 65 6c 7d 20 65 72 72 6f 72  rp cancel} error
10040 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 65  ....      if {$e
10050 72 72 6f 72 20 65 71 20 22 65 76 61 6c 20 63 61  rror eq "eval ca
10060 6e 63 65 6c 65 64 22 7d 20 74 68 65 6e 20 7b 0d  nceled"} then {.
10070 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
10080 74 72 61 69 6e 74 20 74 69 70 32 38 35 0d 0a 0d  traint tip285...
10090 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
100a0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
100b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
100c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
100d0 72 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65  re done here, re
100e0 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  turn now...     
100f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
10100 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  turn..      }.. 
10110 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75 74     }....    tput
10120 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
10130 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
10140 63 68 65 63 6b 46 6f 72 54 69 70 34 30 35 20 7b  checkForTip405 {
10150 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
10160 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10170 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
10180 66 6f 72 20 54 49 50 20 23 34 30 35 2e 2e 2e 20  for TIP #405... 
10190 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  "....    #..    
101a0 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65  # NOTE: Does the
101b0 20 69 6e 74 65 72 70 72 65 74 65 72 20 68 61 76   interpreter hav
101c0 65 20 54 49 50 20 23 34 30 35 20 28 69 2e 65 2e  e TIP #405 (i.e.
101d0 20 5b 6c 6d 61 70 5d 29 3f 0d 0a 20 20 20 20 23   [lmap])?..    #
101e0 0d 0a 20 20 20 20 63 61 74 63 68 20 7b 6c 6d 61  ..    catch {lma
101f0 70 7d 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20  p} error....    
10200 69 66 20 7b 24 65 72 72 6f 72 20 6e 65 20 22 69  if {$error ne "i
10210 6e 76 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6e  nvalid command n
10220 61 6d 65 20 5c 22 6c 6d 61 70 5c 22 22 7d 20 74  ame \"lmap\""} t
10230 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64  hen {..      add
10240 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70 34 30  Constraint tip40
10250 35 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  5....      tputs
10260 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
10270 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
10280 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
10290 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
102a0 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
102b0 63 68 65 63 6b 46 6f 72 54 69 70 34 32 31 20 7b  checkForTip421 {
102c0 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
102d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
102e0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
102f0 66 6f 72 20 54 49 50 20 23 34 32 31 2e 2e 2e 20  for TIP #421... 
10300 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  "....    #..    
10310 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69  # NOTE: Is the i
10320 6e 74 65 72 70 72 65 74 65 72 20 54 49 50 20 23  nterpreter TIP #
10330 34 32 31 20 72 65 61 64 79 3f 0d 0a 20 20 20 20  421 ready?..    
10340 23 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63  #..    if {[catc
10350 68 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 61  h {..      set a
10360 72 72 61 79 28 31 29 20 6f 6e 65 3b 20 73 65 74  rray(1) one; set
10370 20 6c 69 73 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a   list [list]....
10380 20 20 20 20 20 20 61 72 72 61 79 20 66 6f 72 20        array for 
10390 7b 6e 61 6d 65 20 76 61 6c 75 65 7d 20 61 72 72  {name value} arr
103a0 61 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  ay {..        la
103b0 70 70 65 6e 64 20 6c 69 73 74 20 24 6e 61 6d 65  ppend list $name
103c0 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 7d   $value..      }
103d0 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 6c 69  ....      set li
103e0 73 74 0d 0a 20 20 20 20 7d 20 72 65 73 75 6c 74  st..    } result
103f0 5d 20 3d 3d 20 30 20 26 26 20 24 72 65 73 75 6c  ] == 0 && $resul
10400 74 20 65 71 20 5b 6c 69 73 74 20 31 20 6f 6e 65  t eq [list 1 one
10410 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10420 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74   addConstraint t
10430 69 70 34 32 31 0d 0a 0d 0a 20 20 20 20 20 20 74  ip421....      t
10440 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
10450 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  s\n..    } else 
10460 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
10470 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
10480 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
10490 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 70 34  roc checkForTip4
104a0 32 36 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  26 { channel } {
104b0 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
104c0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
104d0 69 6e 67 20 66 6f 72 20 54 49 50 20 23 34 32 36  ing for TIP #426
104e0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
104f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
10500 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 54  he interpreter T
10510 49 50 20 23 34 32 36 20 72 65 61 64 79 3f 0d 0a  IP #426 ready?..
10520 20 20 20 20 23 0d 0a 20 20 20 20 63 61 74 63 68      #..    catch
10530 20 7b 69 6e 66 6f 20 63 6d 64 74 79 70 65 7d 20   {info cmdtype} 
10540 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 69 66 20  error....    if 
10550 7b 24 65 72 72 6f 72 20 65 71 20 7b 77 72 6f 6e  {$error eq {wron
10560 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10570 20 62 65 20 22 69 6e 66 6f 20 63 6d 64 74 79 70   be "info cmdtyp
10580 65 20 63 6f 6d 6d 61 6e 64 4e 61 6d 65 22 7d 7d  e commandName"}}
10590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
105a0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70  ddConstraint tip
105b0 34 32 36 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75  426....      tpu
105c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
105d0 6e 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  n..    } else {.
105e0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
105f0 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
10600 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f  }..  }.....  pro
10610 63 20 63 68 65 63 6b 46 6f 72 54 69 70 34 32 39  c checkForTip429
10620 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
10630 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10640 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
10650 67 20 66 6f 72 20 54 49 50 20 23 34 32 39 2e 2e  g for TIP #429..
10660 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  . "....    #..  
10670 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
10680 20 69 6e 74 65 72 70 72 65 74 65 72 20 54 49 50   interpreter TIP
10690 20 23 34 32 39 20 72 65 61 64 79 3f 0d 0a 20 20   #429 ready?..  
106a0 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 63 61    #..    if {[ca
106b0 74 63 68 20 7b 73 74 72 69 6e 67 20 63 61 74 7d  tch {string cat}
106c0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
106d0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
106e0 69 6e 74 20 74 69 70 34 32 39 0d 0a 0d 0a 20 20  int tip429....  
106f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10700 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20  el yes\n..    } 
10710 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70  else {..      tp
10720 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
10730 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  n..    }..  }...
10740 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
10750 72 54 69 70 34 34 30 20 7b 20 63 68 61 6e 6e 65  rTip440 { channe
10760 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73  l } {..    tputs
10770 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
10780 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 54 49 50  checking for TIP
10790 20 23 34 34 30 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   #440... "....  
107a0 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
107b0 20 49 73 20 74 68 65 20 69 6e 74 65 72 70 72 65   Is the interpre
107c0 74 65 72 20 54 49 50 20 23 34 34 30 20 72 65 61  ter TIP #440 rea
107d0 64 79 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  dy?..    #..    
107e0 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65 74 20  if {[catch {set 
107f0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 65  ::tcl_platform(e
10800 6e 67 69 6e 65 29 7d 20 65 6e 67 69 6e 65 5d 20  ngine)} engine] 
10810 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
10820 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
10830 74 20 74 69 70 34 34 30 0d 0a 0d 0a 20 20 20 20  t tip440....    
10840 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10850 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
10860 73 20 28 22 20 24 65 6e 67 69 6e 65 20 22 29 5c  s (" $engine ")\
10870 6e 22 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  n"]..    } else 
10880 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
10890 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
108a0 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70    }..  }.....  p
108b0 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69 70 34  roc checkForTip4
108c0 36 31 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  61 { channel } {
108d0 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61  ..    tputs $cha
108e0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
108f0 69 6e 67 20 66 6f 72 20 54 49 50 20 23 34 36 31  ing for TIP #461
10900 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
10910 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
10920 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 54  he interpreter T
10930 49 50 20 23 34 36 31 20 72 65 61 64 79 3f 0d 0a  IP #461 ready?..
10940 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b      #..    if {[
10950 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 73  catch {..      s
10960 65 74 20 65 78 70 72 28 67 65 29 20 7b 69 6e 74  et expr(ge) {int
10970 28 22 61 62 63 22 20 67 65 20 22 61 62 63 22 29  ("abc" ge "abc")
10980 7d 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 70  }..      set exp
10990 72 28 67 74 29 20 7b 69 6e 74 28 22 61 62 63 22  r(gt) {int("abc"
109a0 20 67 74 20 22 61 62 63 22 29 7d 0d 0a 20 20 20   gt "abc")}..   
109b0 20 20 20 73 65 74 20 65 78 70 72 28 6c 65 29 20     set expr(le) 
109c0 7b 69 6e 74 28 22 61 62 63 22 20 6c 65 20 22 61  {int("abc" le "a
109d0 62 63 22 29 7d 0d 0a 20 20 20 20 20 20 73 65 74  bc")}..      set
109e0 20 65 78 70 72 28 6c 74 29 20 7b 69 6e 74 28 22   expr(lt) {int("
109f0 61 62 63 22 20 6c 74 20 22 61 62 63 22 29 7d 0d  abc" lt "abc")}.
10a00 0a 0d 0a 20 20 20 20 20 20 6c 69 73 74 20 5b 65  ...      list [e
10a10 78 70 72 20 24 65 78 70 72 28 67 65 29 5d 20 5b  xpr $expr(ge)] [
10a20 65 78 70 72 20 24 65 78 70 72 28 67 74 29 5d 20  expr $expr(gt)] 
10a30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65 78  \..          [ex
10a40 70 72 20 24 65 78 70 72 28 6c 65 29 5d 20 5b 65  pr $expr(le)] [e
10a50 78 70 72 20 24 65 78 70 72 28 6c 74 29 5d 0d 0a  xpr $expr(lt)]..
10a60 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
10a70 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f  n {..      addCo
10a80 6e 73 74 72 61 69 6e 74 20 74 69 70 34 36 31 0d  nstraint tip461.
10a90 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
10aa0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
10ab0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10ac0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10ad0 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20  l no\n..    }.. 
10ae0 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68   }.....  proc ch
10af0 65 63 6b 46 6f 72 54 69 70 34 36 33 20 7b 20 63  eckForTip463 { c
10b00 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
10b10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
10b20 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
10b30 72 20 54 49 50 20 23 34 36 33 2e 2e 2e 20 22 0d  r TIP #463... ".
10b40 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
10b50 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 69 6e 74  NOTE: Is the int
10b60 65 72 70 72 65 74 65 72 20 54 49 50 20 23 34 36  erpreter TIP #46
10b70 33 20 72 65 61 64 79 3f 0d 0a 20 20 20 20 23 0d  3 ready?..    #.
10b80 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20  .    if {[catch 
10b90 7b 0d 0a 20 20 20 20 20 20 72 65 67 73 75 62 20  {..      regsub 
10ba0 2d 63 6f 6d 6d 61 6e 64 20 2e 20 2e 20 6c 69 73  -command . . lis
10bb0 74 0d 0a 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  t..    }] == 0} 
10bc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
10bd0 64 43 6f 6e 73 74 72 61 69 6e 74 20 74 69 70 34  dConstraint tip4
10be0 36 33 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  63....      tput
10bf0 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
10c00 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
10c10 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10c20 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d  nnel no\n..    }
10c30 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63  ..  }.....  proc
10c40 20 63 68 65 63 6b 46 6f 72 54 69 70 34 37 31 20   checkForTip471 
10c50 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
10c60 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10c70 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
10c80 20 66 6f 72 20 54 49 50 20 23 34 37 31 2e 2e 2e   for TIP #471...
10c90 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   "....    #..   
10ca0 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
10cb0 69 6e 74 65 72 70 72 65 74 65 72 20 54 49 50 20  interpreter TIP 
10cc0 23 34 37 31 20 72 65 61 64 79 3f 0d 0a 20 20 20  #471 ready?..   
10cd0 20 23 0d 0a 20 20 20 20 63 61 74 63 68 20 7b 69   #..    catch {i
10ce0 6e 66 6f 20 6c 69 6e 6b 65 64 6e 61 6d 65 7d 20  nfo linkedname} 
10cf0 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 69 66 20  error....    if 
10d00 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 7b  {[string match {
10d10 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10d20 6f 75 6c 64 20 62 65 20 22 2a 7d 20 24 65 72 72  ould be "*} $err
10d30 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
10d40 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
10d50 20 74 69 70 34 37 31 0d 0a 0d 0a 20 20 20 20 20   tip471....     
10d60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10d70 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 20 65 6c 73  yes\n..    } els
10d80 65 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e {..      tputs
10d90 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
10da0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20      }..  }..... 
10db0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 69   proc checkForTi
10dc0 6d 69 6e 67 20 7b 0d 0a 20 20 20 20 20 20 20 20  ming {..        
10dd0 20 20 63 68 61 6e 6e 65 6c 20 74 68 72 65 73 68    channel thresh
10de0 6f 6c 64 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20  old {constraint 
10df0 22 22 7d 20 7b 74 72 69 65 73 20 31 7d 20 7b 64  ""} {tries 1} {d
10e00 65 6c 61 79 20 31 30 30 30 7d 0d 0a 20 20 20 20  elay 1000}..    
10e10 20 20 20 20 20 20 7b 61 76 65 72 61 67 65 20 66        {average f
10e20 61 6c 73 65 7d 20 7b 61 73 79 6e 63 68 72 6f 6e  alse} {asynchron
10e30 6f 75 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ous false} } {..
10e40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10e50 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
10e60 0d 0a 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20  ..        "---- 
10e70 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 70 72 65  checking for pre
10e80 63 69 73 69 6f 6e 20 74 69 6d 69 6e 67 20 28 74  cision timing (t
10e90 68 72 65 73 68 6f 6c 64 20 6f 66 20 22 20 24 74  hreshold of " $t
10ea0 68 72 65 73 68 6f 6c 64 20 5c 0d 0a 20 20 20 20  hreshold \..    
10eb0 20 20 20 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e      " millisecon
10ec0 64 73 22 20 5b 65 78 70 72 20 7b 24 61 76 65 72  ds" [expr {$aver
10ed0 61 67 65 20 3f 20 22 20 61 76 65 72 61 67 65 22  age ? " average"
10ee0 20 3a 20 22 22 7d 5d 20 22 2c 20 64 65 6c 61 79   : ""}] ", delay
10ef0 20 6f 66 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   of " \..       
10f00 20 24 64 65 6c 61 79 20 22 20 6d 69 6c 6c 69 73   $delay " millis
10f10 65 63 6f 6e 64 73 29 2e 2e 2e 20 22 5d 0d 0a 0d  econds)... "]...
10f20 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41  .    #..    # HA
10f30 43 4b 3a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  CK: Sometimes th
10f40 65 20 66 69 72 73 74 20 74 72 79 20 74 61 6b 65  e first try take
10f50 73 20 71 75 69 74 65 20 61 20 62 69 74 20 6c 6f  s quite a bit lo
10f60 6e 67 65 72 20 74 68 61 6e 20 73 75 62 73 65 71  nger than subseq
10f70 75 65 6e 74 0d 0a 20 20 20 20 23 20 20 20 20 20  uent..    #     
10f80 20 20 74 72 69 65 73 2e 20 20 57 65 20 61 74 74    tries.  We att
10f90 65 6d 70 74 20 74 6f 20 62 79 70 61 73 73 20 74  empt to bypass t
10fa0 68 69 73 20 70 72 6f 62 6c 65 6d 20 62 79 20 72  his problem by r
10fb0 65 74 72 79 69 6e 67 20 61 20 73 65 74 20 6e 75  etrying a set nu
10fc0 6d 62 65 72 0d 0a 20 20 20 20 23 20 20 20 20 20  mber..    #     
10fd0 20 20 6f 66 20 74 69 6d 65 73 20 28 77 68 69 63    of times (whic
10fe0 68 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  h can be overrid
10ff0 64 65 6e 20 62 79 20 74 68 65 20 63 61 6c 6c 65  den by the calle
11000 72 29 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  r) before giving
11010 20 75 70 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20   up...    #..   
11020 20 73 65 74 20 74 6f 74 61 6c 20 30 0d 0a 20 20   set total 0..  
11030 20 20 73 65 74 20 64 69 66 66 65 72 65 6e 63 65    set difference
11040 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
11050 66 6f 72 20 7b 73 65 74 20 74 72 79 20 30 7d 20  for {set try 0} 
11060 7b 24 74 72 79 20 3c 20 24 74 72 69 65 73 7d 20  {$try < $tries} 
11070 7b 69 6e 63 72 20 74 72 79 7d 20 7b 0d 0a 20 20  {incr try} {..  
11080 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11090 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 73 63  OTE: Create a sc
110a0 72 69 70 74 20 74 68 61 74 20 77 69 6c 6c 20 73  ript that will s
110b0 65 74 20 74 68 65 20 66 69 6e 61 6c 20 63 6c 69  et the final cli
110c0 63 6b 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  cks value.  This
110d0 20 6d 75 73 74 0d 0a 20 20 20 20 20 20 23 20 20   must..      #  
110e0 20 20 20 20 20 75 73 65 20 61 20 67 6c 6f 62 61       use a globa
110f0 6c 20 76 61 72 69 61 62 6c 65 20 64 75 65 20 74  l variable due t
11100 6f 20 74 68 65 20 6e 61 74 75 72 65 20 6f 66 20  o the nature of 
11110 5b 61 66 74 65 72 5d 2e 0d 0a 20 20 20 20 20 20  [after]...      
11120 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 6f  #..      set sto
11130 70 53 63 72 69 70 74 20 7b 0d 0a 20 20 20 20 20  pScript {..     
11140 20 20 20 73 65 74 20 3a 3a 73 74 6f 70 43 6c 69     set ::stopCli
11150 63 6b 73 20 5b 65 78 70 72 20 7b 5b 63 6c 6f 63  cks [expr {[cloc
11160 6b 20 63 6c 69 63 6b 73 20 2d 6d 69 6c 6c 69 73  k clicks -millis
11170 65 63 6f 6e 64 73 5d 20 26 20 30 78 37 66 66 66  econds] & 0x7fff
11180 66 66 66 66 7d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ffff}]..      }.
11190 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
111a0 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 20 74 68    # NOTE: Set th
111b0 65 20 69 6e 69 74 69 61 6c 20 63 6c 69 63 6b 73  e initial clicks
111c0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 6e 20   value and then 
111d0 61 74 74 65 6d 70 74 20 74 6f 20 77 61 69 74 20  attempt to wait 
111e0 66 6f 72 20 61 62 6f 75 74 0d 0a 20 20 20 20 20  for about..     
111f0 20 23 20 20 20 20 20 20 20 6f 6e 65 20 73 65 63   #       one sec
11200 6f 6e 64 2c 20 65 69 74 68 65 72 20 73 79 6e 63  ond, either sync
11210 68 72 6f 6e 6f 75 73 6c 79 20 6f 72 20 61 73 79  hronously or asy
11220 6e 63 68 72 6f 6e 6f 75 73 6c 79 2c 20 64 65 70  nchronously, dep
11230 65 6e 64 69 6e 67 20 6f 6e 0d 0a 20 20 20 20 20  ending on..     
11240 20 23 20 20 20 20 20 20 20 74 68 65 20 70 72 65   #       the pre
11250 66 65 72 65 6e 63 65 20 6f 66 20 74 68 65 20 63  ference of the c
11260 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
11270 0a 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74  .      set start
11280 20 5b 65 78 70 72 20 7b 5b 63 6c 6f 63 6b 20 63   [expr {[clock c
11290 6c 69 63 6b 73 20 2d 6d 69 6c 6c 69 73 65 63 6f  licks -milliseco
112a0 6e 64 73 5d 20 26 20 30 78 37 66 66 66 66 66 66  nds] & 0x7ffffff
112b0 66 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  f}]....      if 
112c0 7b 24 61 73 79 6e 63 68 72 6f 6e 6f 75 73 7d 20  {$asynchronous} 
112d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
112e0 73 65 74 20 65 76 65 6e 74 20 5b 61 66 74 65 72  set event [after
112f0 20 24 64 65 6c 61 79 20 24 73 74 6f 70 53 63 72   $delay $stopScr
11300 69 70 74 5d 3b 20 76 77 61 69 74 20 3a 3a 73 74  ipt]; vwait ::st
11310 6f 70 43 6c 69 63 6b 73 0d 0a 20 20 20 20 20 20  opClicks..      
11320 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
11330 20 20 61 66 74 65 72 20 24 64 65 6c 61 79 3b 20    after $delay; 
11340 65 76 61 6c 20 24 73 74 6f 70 53 63 72 69 70 74  eval $stopScript
11350 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11360 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11370 54 45 3a 20 4d 6f 76 65 20 74 68 65 20 66 69 6e  TE: Move the fin
11380 61 6c 20 63 6c 69 63 6b 73 20 76 61 6c 75 65 20  al clicks value 
11390 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20  from the global 
113a0 66 72 61 6d 65 20 74 6f 20 74 68 69 73 20 6f 6e  frame to this on
113b0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
113c0 20 20 20 73 65 74 20 73 74 6f 70 20 24 3a 3a 73     set stop $::s
113d0 74 6f 70 43 6c 69 63 6b 73 3b 20 75 6e 73 65 74  topClicks; unset
113e0 20 3a 3a 73 74 6f 70 43 6c 69 63 6b 73 0d 0a 0d   ::stopClicks...
113f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11400 23 20 4e 4f 54 45 3a 20 43 61 6c 63 75 6c 61 74  # NOTE: Calculat
11410 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
11420 20 62 65 74 77 65 65 6e 20 74 68 65 20 61 63 74   between the act
11430 75 61 6c 20 61 6e 64 20 65 78 70 65 63 74 65 64  ual and expected
11440 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11450 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
11460 65 63 6f 6e 64 73 2e 0d 0a 20 20 20 20 20 20 23  econds...      #
11470 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69 66 66  ..      set diff
11480 65 72 65 6e 63 65 20 5b 65 78 70 72 20 7b 61 62  erence [expr {ab
11490 73 28 24 73 74 6f 70 20 2d 20 24 73 74 61 72 74  s($stop - $start
114a0 20 2d 20 24 64 65 6c 61 79 29 7d 5d 0d 0a 0d 0a   - $delay)}]....
114b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
114c0 20 4e 4f 54 45 3a 20 4b 65 65 70 20 74 72 61 63   NOTE: Keep trac
114d0 6b 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  k of the total n
114e0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
114f0 63 6f 6e 64 73 20 65 6c 61 70 73 65 64 20 66 6f  conds elapsed fo
11500 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
11510 20 61 6c 6c 20 69 74 65 72 61 74 69 6f 6e 73 20   all iterations 
11520 6f 66 20 74 68 69 73 20 6c 6f 6f 70 2e 0d 0a 20  of this loop... 
11530 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 6e       #..      in
11540 63 72 20 74 6f 74 61 6c 20 24 64 69 66 66 65 72  cr total $differ
11550 65 6e 63 65 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ence....      #.
11560 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
11570 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
11580 68 65 20 61 76 65 72 61 67 65 20 64 69 66 66 65  he average diffe
11590 72 65 6e 63 65 2c 20 68 61 6e 64 6c 65 20 74 68  rence, handle th
115a0 61 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  at now...      #
115b0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 76 65  ..      if {$ave
115c0 72 61 67 65 20 26 26 20 24 74 72 69 65 73 20 3e  rage && $tries >
115d0 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
115e0 20 20 20 20 73 65 74 20 64 69 66 66 65 72 65 6e      set differen
115f0 63 65 20 5b 65 78 70 72 20 7b 24 74 6f 74 61 6c  ce [expr {$total
11600 20 2f 20 24 74 72 69 65 73 7d 5d 0d 0a 20 20 20   / $tries}]..   
11610 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
11620 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
11630 72 65 20 77 65 20 77 69 74 68 69 6e 20 74 68 65  re we within the
11640 20 74 68 72 65 73 68 6f 6c 64 20 73 70 65 63 69   threshold speci
11650 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  fied by the call
11660 65 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er?..      #..  
11670 20 20 20 20 69 66 20 7b 24 64 69 66 66 65 72 65      if {$differe
11680 6e 63 65 20 3e 3d 20 30 20 26 26 20 24 64 69 66  nce >= 0 && $dif
11690 66 65 72 65 6e 63 65 20 3c 3d 20 24 74 68 72 65  ference <= $thre
116a0 73 68 6f 6c 64 7d 20 74 68 65 6e 20 7b 0d 0a 20  shold} then {.. 
116b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
116c0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 70 70    # NOTE: We app
116d0 65 61 72 20 74 6f 20 62 65 20 63 61 70 61 62 6c  ear to be capabl
116e0 65 20 6f 66 20 66 61 69 72 6c 79 20 70 72 65 63  e of fairly prec
116f0 69 73 65 20 74 69 6d 69 6e 67 2e 0d 0a 20 20 20  ise timing...   
11700 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11710 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
11720 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d 20  th $constraint] 
11730 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
11740 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 73          set cons
11750 74 72 61 69 6e 74 20 74 69 6d 69 6e 67 0d 0a 20  traint timing.. 
11760 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11770 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
11780 74 20 24 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 0d  t $constraint...
11790 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
117a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
117b0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
117c0 20 20 20 22 79 65 73 20 28 30 20 3c 3d 20 22 20     "yes (0 <= " 
117d0 24 64 69 66 66 65 72 65 6e 63 65 20 22 20 3c 3d  $difference " <=
117e0 20 22 20 24 74 68 72 65 73 68 6f 6c 64 20 22 20   " $threshold " 
117f0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 20 5c 0d  milliseconds" \.
11800 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
11810 70 72 20 7b 24 61 76 65 72 61 67 65 20 3f 20 22  pr {$average ? "
11820 20 61 76 65 72 61 67 65 22 20 3a 20 22 22 7d 5d   average" : ""}]
11830 20 22 2c 20 74 72 69 65 64 20 22 20 5b 65 78 70   ", tried " [exp
11840 72 20 7b 24 74 72 79 20 2b 20 31 7d 5d 20 5c 0d  r {$try + 1}] \.
11850 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 6f  .            " o
11860 75 74 20 6f 66 20 22 20 24 74 72 69 65 73 20 22  ut of " $tries "
11870 20 22 20 5b 65 78 70 72 20 7b 24 74 72 69 65 73   " [expr {$tries
11880 20 3e 20 31 20 3f 20 22 74 69 6d 65 73 22 20 3a   > 1 ? "times" :
11890 20 22 74 69 6d 65 22 7d 5d 20 5c 0d 0a 20 20 20   "time"}] \..   
118a0 20 20 20 20 20 20 20 20 20 22 2c 20 5c 22 22 20           ", \"" 
118b0 24 63 6f 6e 73 74 72 61 69 6e 74 20 22 5c 22 29  $constraint "\")
118c0 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
118d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
118e0 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68  E: We are done h
118f0 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ere, return now.
11900 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11910 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
11920 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
11930 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11940 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
11950 0a 20 20 20 20 20 20 20 20 22 6e 6f 20 28 30 20  .        "no (0 
11960 3c 3d 20 22 20 24 64 69 66 66 65 72 65 6e 63 65  <= " $difference
11970 20 22 20 3e 20 22 20 24 74 68 72 65 73 68 6f 6c   " > " $threshol
11980 64 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  d " milliseconds
11990 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 65 78  " \..        [ex
119a0 70 72 20 7b 24 61 76 65 72 61 67 65 20 3f 20 22  pr {$average ? "
119b0 20 61 76 65 72 61 67 65 22 20 3a 20 22 22 7d 5d   average" : ""}]
119c0 20 22 2c 20 74 72 69 65 64 20 22 20 24 74 72 79   ", tried " $try
119d0 20 22 20 6f 75 74 20 6f 66 20 22 20 5c 0d 0a 20   " out of " \.. 
119e0 20 20 20 20 20 20 20 24 74 72 69 65 73 20 22 20         $tries " 
119f0 22 20 5b 65 78 70 72 20 7b 24 74 72 69 65 73 20  " [expr {$tries 
11a00 3e 20 31 20 3f 20 22 74 69 6d 65 73 22 20 3a 20  > 1 ? "times" : 
11a10 22 74 69 6d 65 22 7d 5d 20 22 29 5c 6e 22 5d 0d  "time"}] ")\n"].
11a20 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
11a30 63 68 65 63 6b 46 6f 72 50 65 72 66 6f 72 6d 61  checkForPerforma
11a40 6e 63 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  nce { channel } 
11a50 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
11a60 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
11a70 6b 69 6e 67 20 66 6f 72 20 70 65 72 66 6f 72 6d  king for perform
11a80 61 6e 63 65 20 74 65 73 74 69 6e 67 2e 2e 2e 20  ance testing... 
11a90 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  "....    #..    
11aa0 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 61  # NOTE: Are we a
11ab0 6c 6c 6f 77 65 64 20 74 6f 20 64 6f 20 70 65 72  llowed to do per
11ac0 66 6f 72 6d 61 6e 63 65 20 74 65 73 74 69 6e 67  formance testing
11ad0 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ?..    #..    if
11ae0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
11af0 3a 3a 6e 6f 28 70 65 72 66 6f 72 6d 61 6e 63 65  ::no(performance
11b00 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
11b10 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
11b20 70 65 72 66 6f 72 6d 61 6e 63 65 0d 0a 0d 0a 20  performance.... 
11b30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11b40 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
11b50 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
11b60 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11b70 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
11b80 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
11b90 6f 72 42 69 67 4c 69 73 74 73 20 7b 20 63 68 61  orBigLists { cha
11ba0 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 74 70  nnel } {..    tp
11bb0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
11bc0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
11bd0 62 69 67 20 6c 69 73 74 20 74 65 73 74 69 6e 67  big list testing
11be0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
11bf0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20      # NOTE: Are 
11c00 77 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f  we allowed to do
11c10 20 62 69 67 20 6c 69 73 74 20 74 65 73 74 69 6e   big list testin
11c20 67 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  g?..    #..    i
11c30 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
11c40 20 3a 3a 6e 6f 28 62 69 67 4c 69 73 74 73 29 5d   ::no(bigLists)]
11c50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11c60 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74  if {[isEagle]} t
11c70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
11c80 0d 0a 20 20 20 20 20 20 20 20 23 20 4d 4f 4e 4f  ..        # MONO
11c90 3a 20 55 73 69 6e 67 20 74 68 65 20 6e 61 74 69  : Using the nati
11ca0 76 65 20 75 74 69 6c 69 74 79 20 6c 69 62 72 61  ve utility libra
11cb0 72 79 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  ry when running 
11cc0 6f 6e 20 4d 6f 6e 6f 20 74 6f 0d 0a 20 20 20 20  on Mono to..    
11cd0 20 20 20 20 23 20 20 20 20 20 20 20 6a 6f 69 6e      #       join
11ce0 20 62 69 67 20 6c 69 73 74 73 20 73 65 65 6d 73   big lists seems
11cf0 20 74 6f 20 63 61 75 73 65 20 53 74 61 63 6b 4f   to cause StackO
11d00 76 65 72 66 6c 6f 77 45 78 63 65 70 74 69 6f 6e  verflowException
11d10 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
11d20 20 20 20 20 20 62 65 20 74 68 72 6f 77 6e 2e 0d       be thrown..
11d30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11d40 20 20 20 20 69 66 20 7b 21 5b 69 73 54 65 73 74      if {![isTest
11d50 4d 6f 6e 6f 5d 20 7c 7c 20 21 5b 68 61 76 65 43  Mono] || ![haveC
11d60 6f 6e 73 74 72 61 69 6e 74 20 6e 61 74 69 76 65  onstraint native
11d70 55 74 69 6c 69 74 79 5d 7d 20 74 68 65 6e 20 7b  Utility]} then {
11d80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
11d90 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
11da0 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
11db0 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69   that it is avai
11dc0 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
11dd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
11de0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 69 67  ddConstraint big
11df0 4c 69 73 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20  Lists....       
11e00 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11e10 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
11e20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
11e30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11e40 6e 65 6c 20 22 6e 6f 2c 20 62 72 6f 6b 65 6e 20  nel "no, broken 
11e50 6f 6e 20 4d 6f 6e 6f 20 77 69 74 68 20 6e 61 74  on Mono with nat
11e60 69 76 65 20 75 74 69 6c 69 74 79 5c 6e 22 0d 0a  ive utility\n"..
11e70 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11e80 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
11e90 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
11ea0 20 62 69 67 4c 69 73 74 73 0d 0a 0d 0a 20 20 20   bigLists....   
11eb0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11ec0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
11ed0 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   }..    } else {
11ee0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
11ef0 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
11f00 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
11f10 6f 63 20 63 68 65 63 6b 46 6f 72 50 72 6f 63 65  oc checkForProce
11f20 73 73 6f 72 49 6e 74 65 6e 73 69 76 65 20 7b 20  ssorIntensive { 
11f30 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
11f40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11f50 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
11f60 6f 72 20 70 72 6f 63 65 73 73 6f 72 20 69 6e 74  or processor int
11f70 65 6e 73 69 76 65 20 74 65 73 74 69 6e 67 2e 2e  ensive testing..
11f80 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  . "....    #..  
11f90 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65    # NOTE: Are we
11fa0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f 20 70   allowed to do p
11fb0 72 6f 63 65 73 73 6f 72 20 69 6e 74 65 6e 73 69  rocessor intensi
11fc0 76 65 20 74 65 73 74 69 6e 67 3f 0d 0a 20 20 20  ve testing?..   
11fd0 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e   #..    if {![in
11fe0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70  fo exists ::no(p
11ff0 72 6f 63 65 73 73 6f 72 49 6e 74 65 6e 73 69 76  rocessorIntensiv
12000 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
12010 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
12020 20 6d 61 79 62 65 50 72 6f 63 65 73 73 6f 72 49   maybeProcessorI
12030 6e 74 65 6e 73 69 76 65 0d 0a 20 20 20 20 20 20  ntensive..      
12040 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 70 72  addConstraint pr
12050 6f 63 65 73 73 6f 72 49 6e 74 65 6e 73 69 76 65  ocessorIntensive
12060 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
12070 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
12080 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12090 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
120a0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
120b0 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
120c0 68 65 63 6b 46 6f 72 54 69 6d 65 49 6e 74 65 6e  heckForTimeInten
120d0 73 69 76 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  sive { channel }
120e0 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
120f0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
12100 63 6b 69 6e 67 20 66 6f 72 20 74 69 6d 65 20 69  cking for time i
12110 6e 74 65 6e 73 69 76 65 20 74 65 73 74 69 6e 67  ntensive testing
12120 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a  ... "....    #..
12130 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20      # NOTE: Are 
12140 77 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f  we allowed to do
12150 20 74 69 6d 65 20 69 6e 74 65 6e 73 69 76 65 20   time intensive 
12160 74 65 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d  testing?..    #.
12170 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
12180 65 78 69 73 74 73 20 3a 3a 6e 6f 28 74 69 6d 65  exists ::no(time
12190 49 6e 74 65 6e 73 69 76 65 29 5d 7d 20 74 68 65  Intensive)]} the
121a0 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f  n {..      addCo
121b0 6e 73 74 72 61 69 6e 74 20 6d 61 79 62 65 54 69  nstraint maybeTi
121c0 6d 65 49 6e 74 65 6e 73 69 76 65 0d 0a 20 20 20  meIntensive..   
121d0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
121e0 20 74 69 6d 65 49 6e 74 65 6e 73 69 76 65 0d 0a   timeIntensive..
121f0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
12200 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
12210 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12220 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12230 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20   no\n..    }..  
12240 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65  }.....  proc che
12250 63 6b 46 6f 72 46 75 6c 6c 54 65 73 74 20 7b 20  ckForFullTest { 
12260 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
12270 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12280 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
12290 6f 72 20 66 75 6c 6c 20 74 65 73 74 69 6e 67 2e  or full testing.
122a0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20  .. "....    #.. 
122b0 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77     # NOTE: Are w
122c0 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f 20  e allowed to do 
122d0 66 75 6c 6c 20 74 65 73 74 69 6e 67 20 28 69 2e  full testing (i.
122e0 65 2e 20 74 6f 20 72 75 6e 20 72 61 72 65 6c 79  e. to run rarely
122f0 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 6e 65  ..    #       ne
12300 65 64 65 64 20 74 65 73 74 73 29 3f 0d 0a 20 20  eded tests)?..  
12310 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69    #..    if {![i
12320 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
12330 66 75 6c 6c 54 65 73 74 29 5d 7d 20 74 68 65 6e  fullTest)]} then
12340 20 7b 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e   {..      addCon
12350 73 74 72 61 69 6e 74 20 66 75 6c 6c 54 65 73 74  straint fullTest
12360 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
12370 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
12380 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12390 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
123a0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
123b0 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
123c0 68 65 63 6b 46 6f 72 4d 65 6d 6f 72 79 49 6e 74  heckForMemoryInt
123d0 65 6e 73 69 76 65 20 7b 20 63 68 61 6e 6e 65 6c  ensive { channel
123e0 20 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20   } {..    tputs 
123f0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
12400 68 65 63 6b 69 6e 67 20 66 6f 72 20 6d 65 6d 6f  hecking for memo
12410 72 79 20 69 6e 74 65 6e 73 69 76 65 20 74 65 73  ry intensive tes
12420 74 69 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ting... "....   
12430 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
12440 41 72 65 20 77 65 20 61 6c 6c 6f 77 65 64 20 74  Are we allowed t
12450 6f 20 64 6f 20 6d 65 6d 6f 72 79 20 69 6e 74 65  o do memory inte
12460 6e 73 69 76 65 20 74 65 73 74 69 6e 67 3f 0d 0a  nsive testing?..
12470 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 21      #..    if {!
12480 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
12490 6f 28 6d 65 6d 6f 72 79 49 6e 74 65 6e 73 69 76  o(memoryIntensiv
124a0 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
124b0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
124c0 20 6d 65 6d 6f 72 79 49 6e 74 65 6e 73 69 76 65   memoryIntensive
124d0 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20  ....      tputs 
124e0 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
124f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12500 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12510 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
12520 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
12530 68 65 63 6b 46 6f 72 53 74 61 63 6b 49 6e 74 65  heckForStackInte
12540 6e 73 69 76 65 20 7b 20 63 68 61 6e 6e 65 6c 20  nsive { channel 
12550 7d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  } {..    tputs $
12560 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
12570 65 63 6b 69 6e 67 20 66 6f 72 20 73 74 61 63 6b  ecking for stack
12580 20 69 6e 74 65 6e 73 69 76 65 20 74 65 73 74 69   intensive testi
12590 6e 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 23  ng... "....    #
125a0 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72  ..    # NOTE: Ar
125b0 65 20 77 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e we allowed to 
125c0 64 6f 20 73 74 61 63 6b 20 69 6e 74 65 6e 73 69  do stack intensi
125d0 76 65 20 74 65 73 74 69 6e 67 3f 0d 0a 20 20 20  ve testing?..   
125e0 20 23 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e   #..    if {![in
125f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
12600 74 61 63 6b 49 6e 74 65 6e 73 69 76 65 29 5d 7d  tackIntensive)]}
12610 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 69   then {..      i
12620 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68  f {[isEagle]} th
12630 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
12640 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
12650 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
12660 79 20 66 6f 72 20 6e 61 74 69 76 65 20 73 74 61  y for native sta
12670 63 6b 20 63 68 65 63 6b 69 6e 67 20 69 6e 20 45  ck checking in E
12680 61 67 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  agle...        #
12690 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
126a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
126b0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
126c0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
126d0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
126e0 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e     Eagle._Compon
126f0 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 4e 61 74  ents.Private.Nat
12700 69 76 65 53 74 61 63 6b 20 43 61 6e 51 75 65 72  iveStack CanQuer
12710 79 54 68 72 65 61 64 0d 0a 20 20 20 20 20 20 20  yThread..       
12720 20 7d 20 63 61 6e 51 75 65 72 79 54 68 72 65 61   } canQueryThrea
12730 64 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20  d] == 0 && \..  
12740 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
12750 67 20 69 73 20 74 72 75 65 20 2d 73 74 72 69 63  g is true -stric
12760 74 20 24 63 61 6e 51 75 65 72 79 54 68 72 65 61  t $canQueryThrea
12770 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
12780 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12790 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
127a0 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
127b0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
127c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
127d0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
127e0 74 72 61 69 6e 74 20 73 74 61 63 6b 49 6e 74 65  traint stackInte
127f0 6e 73 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20  nsive....       
12800 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12810 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
12820 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
12830 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12840 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
12850 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
12860 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  e {..        add
12870 43 6f 6e 73 74 72 61 69 6e 74 20 73 74 61 63 6b  Constraint stack
12880 49 6e 74 65 6e 73 69 76 65 0d 0a 0d 0a 20 20 20  Intensive....   
12890 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
128a0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
128b0 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   }..    } else {
128c0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
128d0 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
128e0 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72   }..  }.....  pr
128f0 6f 63 20 63 68 65 63 6b 46 6f 72 53 74 61 63 6b  oc checkForStack
12900 53 69 7a 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  Size { channel }
12910 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63   {..    tputs $c
12920 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
12930 63 6b 69 6e 67 20 66 6f 72 20 73 74 61 63 6b 20  cking for stack 
12940 73 69 7a 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  size... "....   
12950 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
12960 41 72 65 20 77 65 20 61 6c 6c 6f 77 65 64 20 74  Are we allowed t
12970 6f 20 64 6f 20 73 74 61 63 6b 20 73 69 7a 65 20  o do stack size 
12980 74 65 73 74 69 6e 67 3f 0d 0a 20 20 20 20 23 0d  testing?..    #.
12990 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
129a0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 74 61 63  exists ::no(stac
129b0 6b 53 69 7a 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  kSize)]} then {.
129c0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 61  .      if {[isEa
129d0 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gle]} then {..  
129e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
129f0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
12a00 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
12a10 65 20 65 78 65 63 75 74 61 62 6c 65 20 73 74 61  e executable sta
12a20 63 6b 20 73 69 7a 65 2e 0d 0a 20 20 20 20 20 20  ck size...      
12a30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
12a40 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
12a50 20 20 20 20 20 73 65 74 20 72 65 73 65 72 76 65       set reserve
12a60 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
12a70 2d 63 72 65 61 74 65 20 55 49 6e 74 50 74 72 20  -create UIntPtr 
12a80 5a 65 72 6f 5d 0d 0a 20 20 20 20 20 20 20 20 20  Zero]..         
12a90 20 73 65 74 20 63 6f 6d 6d 69 74 20 5b 6f 62 6a   set commit [obj
12aa0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61  ect invoke -crea
12ab0 74 65 20 55 49 6e 74 50 74 72 20 5a 65 72 6f 5d  te UIntPtr Zero]
12ac0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
12ad0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
12ae0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
12af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
12b00 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  agle._Components
12b10 2e 50 72 69 76 61 74 65 2e 46 69 6c 65 4f 70 73  .Private.FileOps
12b20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12b30 20 20 47 65 74 50 65 46 69 6c 65 53 74 61 63 6b    GetPeFileStack
12b40 52 65 73 65 72 76 65 41 6e 64 43 6f 6d 6d 69 74  ReserveAndCommit
12b50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12b60 20 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78    [info nameofex
12b70 65 63 75 74 61 62 6c 65 5d 20 72 65 73 65 72 76  ecutable] reserv
12b80 65 20 63 6f 6d 6d 69 74 0d 0a 0d 0a 20 20 20 20  e commit....    
12b90 20 20 20 20 20 20 73 65 74 20 72 65 73 65 72 76        set reserv
12ba0 65 3b 20 23 20 70 72 69 6d 69 74 69 76 65 2c 20  e; # primitive, 
12bb0 61 6c 72 65 61 64 79 20 6e 75 6d 65 72 69 63 2e  already numeric.
12bc0 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 74 61 63  ..        } stac
12bd0 6b 53 69 7a 65 5d 20 3d 3d 20 30 20 26 26 20 5c  kSize] == 0 && \
12be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ..            [s
12bf0 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
12c00 20 2d 73 74 72 69 63 74 20 24 73 74 61 63 6b 53   -strict $stackS
12c10 69 7a 65 5d 20 26 26 20 24 73 74 61 63 6b 53 69  ize] && $stackSi
12c20 7a 65 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ze > 0} then {..
12c30 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
12c40 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
12c50 72 67 73 20 73 74 61 63 6b 53 69 7a 65 2e 30 78  rgs stackSize.0x
12c60 20 5b 66 6f 72 6d 61 74 20 25 78 20 24 73 74 61   [format %x $sta
12c70 63 6b 53 69 7a 65 5d 5d 0d 0a 0d 0a 20 20 20 20  ckSize]]....    
12c80 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12c90 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12ca0 20 22 79 65 73 20 28 22 20 24 73 74 61 63 6b 53   "yes (" $stackS
12cb0 69 7a 65 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  ize ")\n"]..    
12cc0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12cd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12ce0 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
12cf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
12d00 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12d10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12d20 45 3a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63  E: There is no c
12d30 72 6f 73 73 2d 70 6c 61 74 66 6f 72 6d 20 77 61  ross-platform wa
12d40 79 20 74 6f 20 63 68 65 63 6b 20 74 68 69 73 20  y to check this 
12d50 69 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  in..        #   
12d60 20 20 20 20 6e 61 74 69 76 65 20 54 63 6c 2e 0d      native Tcl..
12d70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12d80 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
12d90 74 20 73 74 61 63 6b 53 69 7a 65 2e 75 6e 6c 69  t stackSize.unli
12da0 6d 69 74 65 64 3b 20 23 20 54 4f 44 4f 3a 20 46  mited; # TODO: F
12db0 69 78 20 6d 65 3f 0d 0a 0d 0a 20 20 20 20 20 20  ix me?....      
12dc0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12dd0 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d   yes\n..      }.
12de0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
12df0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12e00 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
12e10 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
12e20 63 68 65 63 6b 46 6f 72 49 6e 74 65 72 61 63 74  checkForInteract
12e30 69 76 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ive { channel } 
12e40 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 63 68  {..    tputs $ch
12e50 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
12e60 6b 69 6e 67 20 66 6f 72 20 69 6e 74 65 72 61 63  king for interac
12e70 74 69 76 65 20 75 73 65 72 2e 2e 2e 20 22 0d 0a  tive user... "..
12e80 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
12e90 4f 54 45 3a 20 49 73 20 74 68 65 72 65 20 61 6e  OTE: Is there an
12ea0 20 69 6e 74 65 72 61 63 74 69 76 65 20 75 73 65   interactive use
12eb0 72 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  r?..    #..    i
12ec0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
12ed0 3a 3a 74 63 6c 5f 69 6e 74 65 72 61 63 74 69 76  ::tcl_interactiv
12ee0 65 5d 20 26 26 20 24 3a 3a 74 63 6c 5f 69 6e 74  e] && $::tcl_int
12ef0 65 72 61 63 74 69 76 65 7d 20 74 68 65 6e 20 7b  eractive} then {
12f00 0d 0a 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74  ..      addConst
12f10 72 61 69 6e 74 20 69 6e 74 65 72 61 63 74 69 76  raint interactiv
12f20 65 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  e....      tputs
12f30 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
12f40 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
12f50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12f60 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
12f70 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20  .  }.....  proc 
12f80 63 68 65 63 6b 46 6f 72 49 6e 74 65 72 61 63 74  checkForInteract
12f90 69 76 65 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61  iveCommand { cha
12fa0 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
12fb0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12fc0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
12fd0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
12fe0 20 69 6e 74 65 72 61 63 74 69 76 65 20 63 6f 6d   interactive com
12ff0 6d 61 6e 64 20 5c 22 22 20 5c 0d 0a 20 20 20 20  mand \"" \..    
13000 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e 2e      $name "\"...
13010 20 22 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20   "]....    #..  
13020 20 20 23 20 4e 4f 54 45 3a 20 43 75 72 72 65 6e    # NOTE: Curren
13030 74 6c 79 2c 20 6f 6e 6c 79 20 45 61 67 6c 65 20  tly, only Eagle 
13040 68 61 73 20 22 69 6e 74 65 72 61 63 74 69 76 65  has "interactive
13050 20 63 6f 6d 6d 61 6e 64 73 22 2e 0d 0a 20 20 20   commands"...   
13060 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 69 73 45   #..    if {[isE
13070 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  agle]} then {.. 
13080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13090 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
130a0 20 71 75 65 72 79 20 74 68 65 20 69 6e 74 65 72   query the inter
130b0 61 63 74 69 76 65 20 63 6f 6d 6d 61 6e 64 20 6e  active command n
130c0 61 6d 65 73 20 66 72 6f 6d 20 45 61 67 6c 65 2e  ames from Eagle.
130d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
130e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
130f0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
13100 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 47 65 74  voke Utility Get
13110 49 6e 74 65 72 61 63 74 69 76 65 43 6f 6d 6d 61  InteractiveComma
13120 6e 64 4e 61 6d 65 73 20 22 22 20 24 6e 61 6d 65  ndNames "" $name
13130 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 20   false..      } 
13140 6e 61 6d 65 73 5d 20 3d 3d 20 30 20 26 26 20 5b  names] == 0 && [
13150 6c 6c 65 6e 67 74 68 20 24 6e 61 6d 65 73 5d 20  llength $names] 
13160 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
13170 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13180 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
13190 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
131a0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
131b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
131c0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
131d0 5b 61 70 70 65 6e 64 41 72 67 73 20 69 6e 74 65  [appendArgs inte
131e0 72 61 63 74 69 76 65 43 6f 6d 6d 61 6e 64 2e 20  ractiveCommand. 
131f0 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
13200 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13210 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20   yes\n....      
13220 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13230 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65  OTE: We are done
13240 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f   here, return no
13250 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
13260 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
13270 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
13280 0a 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e  .    tputs $chan
13290 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 7d 0d 0a 0c  nel no\n..  }...
132a0 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f  ..  proc checkFo
132b0 72 55 73 65 72 49 6e 74 65 72 61 63 74 69 6f 6e  rUserInteraction
132c0 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
132d0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
132e0 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
132f0 67 20 66 6f 72 20 75 73 65 72 20 69 6e 74 65 72  g for user inter
13300 61 63 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  action... ".... 
13310 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41 43 4b     #..    # HACK
13320 3a 20 46 6f 72 20 6e 6f 77 2c 20 64 6f 20 74 68  : For now, do th
13330 65 20 65 78 61 63 74 20 73 61 6d 65 20 63 68 65  e exact same che
13340 63 6b 20 61 73 20 63 68 65 63 6b 46 6f 72 49 6e  ck as checkForIn
13350 74 65 72 61 63 74 69 76 65 3b 20 68 6f 77 65 76  teractive; howev
13360 65 72 2c 0d 0a 20 20 20 20 23 20 20 20 20 20 20  er,..    #      
13370 20 74 68 69 73 20 69 73 20 73 74 69 6c 6c 20 75   this is still u
13380 73 65 66 75 6c 20 61 73 20 61 20 73 65 70 61 72  seful as a separ
13390 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 62  ate constraint b
133a0 65 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65  ecause it can be
133b0 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69 6e  ..    #       in
133c0 64 69 76 69 64 75 61 6c 6c 79 20 64 69 73 61 62  dividually disab
133d0 6c 65 64 20 69 6e 20 22 70 72 6f 6c 6f 67 75 65  led in "prologue
133e0 2e 65 61 67 6c 65 22 2e 0d 0a 20 20 20 20 23 0d  .eagle"...    #.
133f0 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
13400 78 69 73 74 73 20 3a 3a 74 63 6c 5f 69 6e 74 65  xists ::tcl_inte
13410 72 61 63 74 69 76 65 5d 20 26 26 20 24 3a 3a 74  ractive] && $::t
13420 63 6c 5f 69 6e 74 65 72 61 63 74 69 76 65 7d 20  cl_interactive} 
13430 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61 64  then {..      ad
13440 64 43 6f 6e 73 74 72 61 69 6e 74 20 75 73 65 72  dConstraint user
13450 49 6e 74 65 72 61 63 74 69 6f 6e 0d 0a 0d 0a 20  Interaction.... 
13460 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13470 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d  nel yes\n..    }
13480 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74   else {..      t
13490 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
134a0 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  \n..    }..  }..
134b0 0c 0d 0a 20 20 70 72 6f 63 20 63 68 65 63 6b 46  ...  proc checkF
134c0 6f 72 4e 65 74 77 6f 72 6b 20 7b 20 63 68 61 6e  orNetwork { chan
134d0 6e 65 6c 20 68 6f 73 74 20 74 69 6d 65 6f 75 74  nel host timeout
134e0 20 7b 73 75 63 63 65 73 73 4f 6e 6c 79 20 66 61   {successOnly fa
134f0 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 74 70  lse} } {..    tp
13500 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13510 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13520 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
13530 6e 67 20 66 6f 72 20 6e 65 74 77 6f 72 6b 20 63  ng for network c
13540 6f 6e 6e 65 63 74 69 76 69 74 79 20 74 6f 20 68  onnectivity to h
13550 6f 73 74 20 5c 22 22 20 24 68 6f 73 74 20 22 5c  ost \"" $host "\
13560 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 69  "... "]....    i
13570 66 20 7b 5b 69 73 45 61 67 6c 65 5d 7d 20 74 68  f {[isEagle]} th
13580 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
13590 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e       # NOTE: Run
135a0 6e 69 6e 67 20 74 68 69 73 20 63 68 65 63 6b 20  ning this check 
135b0 6f 6e 20 74 68 65 20 4d 6f 6e 6f 20 33 2e 33 2e  on the Mono 3.3.
135c0 30 20 28 6f 72 20 33 2e 34 2e 30 3f 29 20 72 65  0 (or 3.4.0?) re
135d0 6c 65 61 73 65 20 62 75 69 6c 64 0d 0a 20 20 20  lease build..   
135e0 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20     #       will 
135f0 6c 6f 63 6b 20 75 70 20 74 68 65 20 70 72 6f 63  lock up the proc
13600 65 73 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ess; therefore, 
13610 73 6b 69 70 20 69 74 20 69 6e 20 74 68 61 74 20  skip it in that 
13620 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  case...      #..
13630 20 20 20 20 20 20 73 65 74 20 72 65 61 73 6f 6e        set reason
13640 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
13650 20 20 69 66 20 7b 5b 63 61 6e 50 69 6e 67 20 72    if {[canPing r
13660 65 61 73 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eason]} then {..
13670 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13680 20 20 20 23 20 42 55 47 42 55 47 3a 20 54 63 6c     # BUGBUG: Tcl
13690 20 38 2e 34 20 64 6f 65 73 20 6e 6f 74 20 6c 69   8.4 does not li
136a0 6b 65 20 74 68 69 73 20 65 78 70 72 65 73 73 69  ke this expressi
136b0 6f 6e 20 28 61 6e 64 20 54 63 6c 20 74 72 69 65  on (and Tcl trie
136c0 73 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  s to..        # 
136d0 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20          compile 
136e0 69 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  it even though i
136f0 74 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 63 74 75  t will only actu
13700 61 6c 6c 79 20 65 76 65 72 20 62 65 0d 0a 20 20  ally ever be..  
13710 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
13720 65 76 61 6c 75 61 74 65 64 20 69 6e 20 45 61 67  evaluated in Eag
13730 6c 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  le)...        #.
13740 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78 70  .        set exp
13750 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
13760 6f 20 63 6f 6d 6d 61 6e 64 73 20 75 72 69 5d 5d  o commands uri]]
13770 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
13780 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 75         [catch {u
13790 72 69 20 70 69 6e 67 20 24 68 6f 73 74 20 24 74  ri ping $host $t
137a0 69 6d 65 6f 75 74 7d 20 72 65 73 70 6f 6e 73 65  imeout} response
137b0 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20  ] == 0 && \..   
137c0 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78           [lindex
137d0 20 24 72 65 73 70 6f 6e 73 65 20 30 5d 20 69 6e   $response 0] in
137e0 20 28 24 73 75 63 63 65 73 73 4f 6e 6c 79 20 3f   ($successOnly ?
137f0 20 5b 6c 69 73 74 20 53 75 63 63 65 73 73 5d 20   [list Success] 
13800 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  : \..           
13810 20 5b 6c 69 73 74 20 53 75 63 63 65 73 73 20 54   [list Success T
13820 69 6d 65 64 4f 75 74 5d 29 20 26 26 20 5b 73 74  imedOut]) && [st
13830 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20  ring is integer 
13840 2d 73 74 72 69 63 74 20 5c 0d 0a 20 20 20 20 20  -strict \..     
13850 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24         [lindex $
13860 72 65 73 70 6f 6e 73 65 20 31 5d 5d 20 26 26 20  response 1]] && 
13870 5b 6c 69 6e 64 65 78 20 24 72 65 73 70 6f 6e 73  [lindex $respons
13880 65 20 31 5d 20 3c 3d 20 24 74 69 6d 65 6f 75 74  e 1] <= $timeout
13890 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
138a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
138b0 44 6f 65 73 20 69 74 20 6c 6f 6f 6b 20 6c 69 6b  Does it look lik
138c0 65 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  e we are able to
138d0 20 63 6f 6e 74 61 63 74 20 74 68 65 20 6e 65 74   contact the net
138e0 77 6f 72 6b 20 68 6f 73 74 3f 0d 0a 20 20 20 20  work host?..    
138f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
13900 66 20 7b 5b 65 78 70 72 20 24 65 78 70 72 5d 7d  f {[expr $expr]}
13910 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13920 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13930 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
13940 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
13950 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
13960 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
13970 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
13980 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
13990 6e 65 74 77 6f 72 6b 5f 20 24 68 6f 73 74 5d 0d  network_ $host].
139a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
139b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
139c0 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
139d0 24 72 65 73 70 6f 6e 73 65 20 22 29 5c 6e 22 5d  $response ")\n"]
139e0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
139f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
13a00 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
13a10 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  n..        }..  
13a20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13a30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13a40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13a50 20 24 72 65 61 73 6f 6e 20 5c 6e 5d 0d 0a 20 20   $reason \n]..  
13a60 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73      }..    } els
13a70 65 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e {..      #..  
13a80 20 20 20 20 23 20 48 41 43 4b 3a 20 52 75 6e 6e      # HACK: Runn
13a90 69 6e 67 20 69 6e 20 54 63 6c 2c 20 6a 75 73 74  ing in Tcl, just
13aa0 20 61 73 73 75 6d 65 20 77 65 20 68 61 76 65 20   assume we have 
13ab0 6e 65 74 77 6f 72 6b 20 61 63 63 65 73 73 2e 0d  network access..
13ac0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13ad0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
13ae0 70 70 65 6e 64 41 72 67 73 20 6e 65 74 77 6f 72  ppendArgs networ
13af0 6b 5f 20 24 68 6f 73 74 5d 0d 0a 0d 0a 20 20 20  k_ $host]....   
13b00 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13b10 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  l yes\n..    }..
13b20 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
13b30 68 65 63 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f 70  heckForCompileOp
13b40 74 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 6f  tion { channel o
13b50 70 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 74  ption } {..    t
13b60 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13b70 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
13b80 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 63 6f 6d  checking for com
13b90 70 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20  pile option \"" 
13ba0 5c 0d 0a 20 20 20 20 20 20 20 20 24 6f 70 74 69  \..        $opti
13bb0 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  on "\"... "]....
13bc0 20 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65      if {[isEagle
13bd0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13be0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
13bf0 73 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f  s ::eagle_platfo
13c00 72 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  rm(compileOption
13c10 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
13c20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78      [lsearch -ex
13c30 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 3a 3a 65  act -nocase $::e
13c40 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f  agle_platform(co
13c50 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29 20 5c 0d  mpileOptions) \.
13c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
13c70 6f 70 74 69 6f 6e 5d 20 21 3d 20 2d 31 7d 20 74  option] != -1} t
13c80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
13c90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
13ca0 3a 20 59 65 73 2c 20 73 75 70 70 6f 72 74 20 66  : Yes, support f
13cb0 6f 72 20 74 68 65 20 45 61 67 6c 65 20 63 6f 6d  or the Eagle com
13cc0 70 69 6c 65 20 6f 70 74 69 6f 6e 20 69 73 20 70  pile option is p
13cd0 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20  resent...       
13ce0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
13cf0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
13d00 64 41 72 67 73 20 63 6f 6d 70 69 6c 65 2e 20 24  dArgs compile. $
13d10 6f 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  option]....     
13d20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13d30 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
13d40 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13d50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13d60 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
13d70 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13d80 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13d90 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e 6e 69  TE: We are runni
13da0 6e 67 20 69 6e 73 69 64 65 20 54 63 6c 3b 20 68  ng inside Tcl; h
13db0 6f 77 65 76 65 72 2c 20 77 65 20 6e 65 65 64 20  owever, we need 
13dc0 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 0d  to check for an.
13dd0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
13de0 61 67 6c 65 20 63 6f 6d 70 69 6c 65 20 6f 70 74  agle compile opt
13df0 69 6f 6e 2e 20 20 54 68 69 73 20 63 61 6e 20 6e  ion.  This can n
13e00 6f 77 20 62 65 20 61 63 63 6f 6d 70 6c 69 73 68  ow be accomplish
13e10 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
13e20 20 20 23 20 20 20 20 20 20 20 5b 65 61 67 6c 65    #       [eagle
13e30 5d 20 63 6f 6d 6d 61 6e 64 20 73 75 70 70 6c 69  ] command suppli
13e40 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20  ed by the Eagle 
13e50 50 61 63 6b 61 67 65 20 66 6f 72 20 54 63 6c 2c  Package for Tcl,
13e60 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
13e70 20 20 20 69 74 20 69 73 20 61 63 74 75 61 6c 6c     it is actuall
13e80 79 20 6c 6f 61 64 65 64 20 61 6e 64 20 61 76 61  y loaded and ava
13e90 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
13ea0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
13eb0 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
13ec0 6e 64 73 20 65 61 67 6c 65 5d 5d 20 3e 20 30 7d  nds eagle]] > 0}
13ed0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13ee0 20 73 65 74 20 6f 70 74 69 6f 6e 73 20 5b 65 61   set options [ea
13ef0 67 6c 65 20 5b 6c 69 73 74 20 65 78 70 72 20 7b  gle [list expr {
13f00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a  [info exists \..
13f10 20 20 20 20 20 20 20 20 20 20 20 20 3a 3a 65 61              ::ea
13f20 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6d  gle_platform(com
13f30 70 69 6c 65 4f 70 74 69 6f 6e 73 29 5d 20 3f 20  pileOptions)] ? 
13f40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
13f50 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
13f60 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29  (compileOptions)
13f70 20 3a 20 5b 6c 69 73 74 5d 7d 5d 5d 0d 0a 0d 0a   : [list]}]]....
13f80 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
13f90 61 72 63 68 20 2d 65 78 61 63 74 20 24 6f 70 74  arch -exact $opt
13fa0 69 6f 6e 73 20 24 6f 70 74 69 6f 6e 5d 20 21 3d  ions $option] !=
13fb0 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
13fc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13fd0 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
13fe0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
13ff0 20 45 61 67 6c 65 20 63 6f 6d 70 69 6c 65 20 6f   Eagle compile o
14000 70 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74  ption is present
14010 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14020 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
14030 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
14040 72 67 73 20 63 6f 6d 70 69 6c 65 2e 20 24 6f 70  rgs compile. $op
14050 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tion]....       
14060 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14070 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20  l yes\n....     
14080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14090 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
140a0 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
140b0 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  rn now...       
140c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
140d0 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20  return..        
140e0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
140f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14100 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
14110 20 20 7d 0d 0a 0c 0d 0a 20 20 70 72 6f 63 20 63    }.....  proc c
14120 68 65 63 6b 46 6f 72 4b 6e 6f 77 6e 43 6f 6d 70  heckForKnownComp
14130 69 6c 65 4f 70 74 69 6f 6e 73 20 7b 20 63 68 61  ileOptions { cha
14140 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 23 0d  nnel } {..    #.
14150 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65  .    # NOTE: Che
14160 63 6b 20 66 6f 72 20 61 6c 6c 20 22 6b 6e 6f 77  ck for all "know
14170 6e 22 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f  n" compile optio
14180 6e 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ns...    #..    
14190 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
141a0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
141b0 72 20 6b 6e 6f 77 6e 20 63 6f 6d 70 69 6c 65 20  r known compile 
141c0 6f 70 74 69 6f 6e 73 2e 2e 2e 20 22 0d 0a 0d 0a  options... "....
141d0 20 20 20 20 73 65 74 20 6f 70 74 69 6f 6e 73 20      set options 
141e0 5b 67 65 74 4b 6e 6f 77 6e 43 6f 6d 70 69 6c 65  [getKnownCompile
141f0 4f 70 74 69 6f 6e 73 5d 0d 0a 0d 0a 20 20 20 20  Options]....    
14200 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6f 70  if {[llength $op
14210 74 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e  tions] > 0} then
14220 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
14230 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
14240 41 72 67 73 20 22 79 65 73 20 28 22 20 5b 6c 6c  Args "yes (" [ll
14250 65 6e 67 74 68 20 24 6f 70 74 69 6f 6e 73 5d 20  ength $options] 
14260 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ")\n"]....      
14270 66 6f 72 65 61 63 68 20 6f 70 74 69 6f 6e 20 24  foreach option $
14280 6f 70 74 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20  options {..     
14290 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
142a0 69 73 74 73 20 5b 61 70 70 65 6e 64 41 72 67 73  ists [appendArgs
142b0 20 3a 3a 6e 6f 28 63 6f 6d 70 69 6c 65 2e 20 24   ::no(compile. $
142c0 6f 70 74 69 6f 6e 20 29 5d 5d 7d 20 74 68 65 6e  option )]]} then
142d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
142e0 65 63 6b 46 6f 72 43 6f 6d 70 69 6c 65 4f 70 74  eckForCompileOpt
142f0 69 6f 6e 20 24 63 68 61 6e 6e 65 6c 20 24 6f 70  ion $channel $op
14300 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tion..        }.
14310 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20  .      }..    } 
14320 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 74 70  else {..      tp
14330 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
14340 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c  n..    }..  }...
14350 0d 0a 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65  ..  if {[isEagle
14360 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 23  ]} then {..    #
14370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14390 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
143a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
143b0 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
143c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
143d0 23 23 23 23 23 23 23 23 23 23 23 23 20 42 45 47  ############ BEG
143e0 49 4e 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23  IN Eagle ONLY ##
143f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14400 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
14410 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
14420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14450 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
14460 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
14470 72 53 65 63 75 72 69 74 79 20 7b 20 63 68 61 6e  rSecurity { chan
14480 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
14490 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
144a0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
144b0 20 73 65 63 75 72 69 74 79 2e 2e 2e 20 22 0d 0a   security... "..
144c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
144d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
144e0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
144f0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e  gs +NonPublic In
14500 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
14510 69 76 65 20 48 61 73 53 65 63 75 72 69 74 79 0d  ive HasSecurity.
14520 0a 20 20 20 20 20 20 7d 20 73 65 63 75 72 69 74  .      } securit
14530 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
14540 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
14550 72 69 6e 67 20 69 73 20 74 72 75 65 20 2d 73 74  ring is true -st
14560 72 69 63 74 20 24 73 65 63 75 72 69 74 79 5d 7d  rict $security]}
14570 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14580 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
14590 20 73 65 63 75 72 69 74 79 2e 65 6e 61 62 6c 65   security.enable
145a0 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  d....          t
145b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
145c0 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  s\n..        } e
145d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
145e0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
145f0 65 63 75 72 69 74 79 2e 64 69 73 61 62 6c 65 64  ecurity.disabled
14600 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
14610 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
14620 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  n..        }..  
14630 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
14640 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
14650 69 6e 74 20 73 65 63 75 72 69 74 79 2e 75 6e 61  int security.una
14660 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20  vailable....    
14670 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14680 65 6c 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e  el unavailable\n
14690 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
146a0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
146b0 65 63 6b 46 6f 72 53 6f 66 74 77 61 72 65 55 70  eckForSoftwareUp
146c0 64 61 74 65 54 72 75 73 74 20 7b 20 63 68 61 6e  dateTrust { chan
146d0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
146e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
146f0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
14700 20 73 6f 66 74 77 61 72 65 20 75 70 64 61 74 65   software update
14710 20 74 72 75 73 74 2e 2e 2e 20 22 0d 0a 0d 0a 20   trust... ".... 
14720 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
14730 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
14740 20 75 72 69 5d 5d 20 3e 20 30 20 26 26 20 5c 0d   uri]] > 0 && \.
14750 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63  .          [catc
14760 68 20 7b 75 72 69 20 73 6f 66 74 77 61 72 65 75  h {uri softwareu
14770 70 64 61 74 65 73 7d 20 74 72 75 73 74 5d 20 3d  pdates} trust] =
14780 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  = 0 && \..      
14790 20 20 20 20 24 74 72 75 73 74 20 65 71 20 22 73      $trust eq "s
147a0 6f 66 74 77 61 72 65 20 75 70 64 61 74 65 20 63  oftware update c
147b0 65 72 74 69 66 69 63 61 74 65 20 69 73 20 74 72  ertificate is tr
147c0 75 73 74 65 64 22 7d 20 74 68 65 6e 20 7b 0d 0a  usted"} then {..
147d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
147e0 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
147f0 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20  it appears that 
14800 77 65 20 74 72 75 73 74 20 6f 75 72 20 73 6f 66  we trust our sof
14810 74 77 61 72 65 20 75 70 64 61 74 65 73 2e 0d 0a  tware updates...
14820 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14830 53 69 6e 63 65 20 74 68 69 73 20 73 65 74 74 69  Since this setti
14840 6e 67 20 69 73 20 6f 66 66 20 62 79 20 64 65 66  ng is off by def
14850 61 75 6c 74 2c 20 74 68 65 20 75 73 65 72 20 28  ault, the user (
14860 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
14870 20 20 20 20 61 20 73 63 72 69 70 74 20 65 76 61      a script eva
14880 6c 75 61 74 65 64 20 62 79 20 74 68 65 20 75 73  luated by the us
14890 65 72 29 20 6d 75 73 74 20 68 61 76 65 20 6d 61  er) must have ma
148a0 6e 75 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  nually..        
148b0 23 20 20 20 20 20 20 20 74 75 72 6e 65 64 20 69  #       turned i
148c0 74 20 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23  t on...        #
148d0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
148e0 73 74 72 61 69 6e 74 20 73 6f 66 74 77 61 72 65  straint software
148f0 55 70 64 61 74 65 0d 0a 0d 0a 20 20 20 20 20 20  Update....      
14900 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14910 20 74 72 75 73 74 65 64 5c 6e 0d 0a 20 20 20 20   trusted\n..    
14920 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14930 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14940 65 6c 20 75 6e 74 72 75 73 74 65 64 5c 6e 0d 0a  el untrusted\n..
14950 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
14960 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
14970 6b 46 6f 72 4d 61 6e 61 67 65 64 44 65 62 75 67  kForManagedDebug
14980 67 69 6e 67 41 73 73 69 73 74 61 6e 74 73 20 7b  gingAssistants {
14990 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
149a0 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
149b0 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
149c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 69 6e   [appendArgs [in
149d0 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75 74 61  fo nameofexecuta
149e0 62 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ble] \..        
149f0 20 20 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d    .mda.config]].
14a00 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
14a10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14a20 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14a30 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
14a40 66 6f 72 20 6d 61 6e 61 67 65 64 20 64 65 62 75  for managed debu
14a50 67 67 69 6e 67 20 61 73 73 69 73 74 61 6e 74 73  gging assistants
14a60 20 65 6e 61 62 6c 65 64 20 76 69 61 20 5c 22 22   enabled via \""
14a70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 66   \..          $f
14a80 69 6c 65 4e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22  ileName "\"... "
14a90 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
14aa0 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
14ab0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
14ac0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14ad0 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
14ae0 20 74 68 65 20 53 79 73 74 65 6d 2e 58 6d 6c 20   the System.Xml 
14af0 61 73 73 65 6d 62 6c 79 20 6d 61 79 20 6e 6f 74  assembly may not
14b00 20 62 65 20 6c 6f 61 64 65 64 2c 20 77 72 61 70   be loaded, wrap
14b10 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
14b20 20 20 20 20 20 20 64 65 74 65 63 74 69 6f 6e 20        detection 
14b30 69 6e 20 61 20 5b 63 61 74 63 68 5d 20 62 6c 6f  in a [catch] blo
14b40 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ck...        #..
14b50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
14b60 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
14b70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14b80 4f 54 45 3a 20 43 72 65 61 74 65 20 61 6e 64 20  OTE: Create and 
14b90 6c 6f 61 64 20 61 6e 20 58 4d 4c 20 64 6f 63 75  load an XML docu
14ba0 6d 65 6e 74 20 62 61 73 65 64 20 6f 6e 20 74 68  ment based on th
14bb0 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 0d  e data from the.
14bc0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
14bd0 20 20 20 4d 44 41 20 63 6f 6e 66 69 67 75 72 61     MDA configura
14be0 74 69 6f 6e 20 66 69 6c 65 20 61 73 73 6f 63 69  tion file associ
14bf0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65 78  ated with the ex
14c00 65 63 75 74 61 62 6c 65 20 74 68 61 74 0d 0a 20  ecutable that.. 
14c10 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14c20 20 73 74 61 72 74 65 64 20 74 68 69 73 20 70 72   started this pr
14c30 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
14c40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
14c50 65 74 20 64 6f 63 75 6d 65 6e 74 20 5b 6f 62 6a  et document [obj
14c60 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
14c70 73 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 58 6d 6c  s System.Xml.Xml
14c80 44 6f 63 75 6d 65 6e 74 5d 0d 0a 20 20 20 20 20  Document]..     
14c90 20 20 20 20 20 24 64 6f 63 75 6d 65 6e 74 20 4c       $document L
14ca0 6f 61 64 58 6d 6c 20 5b 72 65 61 64 46 69 6c 65  oadXml [readFile
14cb0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
14cc0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14cd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
14ce0 74 75 70 20 74 68 65 20 58 4d 4c 20 6e 61 6d 65  tup the XML name
14cf0 73 70 61 63 65 20 6d 61 6e 61 67 65 72 20 66 6f  space manager fo
14d00 72 20 75 73 65 20 77 68 65 6e 20 75 73 69 6e 67  r use when using
14d10 20 58 50 61 74 68 0d 0a 20 20 20 20 20 20 20 20   XPath..        
14d20 20 20 23 20 20 20 20 20 20 20 74 6f 20 71 75 65    #       to que
14d30 72 79 20 74 68 65 20 58 4d 4c 20 64 6f 63 75 6d  ry the XML docum
14d40 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ent...          
14d50 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
14d60 20 6e 61 6d 65 54 61 62 6c 65 20 5b 24 64 6f 63   nameTable [$doc
14d70 75 6d 65 6e 74 20 4e 61 6d 65 54 61 62 6c 65 5d  ument NameTable]
14d80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
14d90 74 20 6e 61 6d 65 73 70 61 63 65 4d 61 6e 61 67  t namespaceManag
14da0 65 72 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  er [object creat
14db0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
14dc0 20 20 20 2d 61 6c 69 61 73 20 53 79 73 74 65 6d     -alias System
14dd0 2e 58 6d 6c 2e 58 6d 6c 4e 61 6d 65 73 70 61 63  .Xml.XmlNamespac
14de0 65 4d 61 6e 61 67 65 72 20 24 6e 61 6d 65 54 61  eManager $nameTa
14df0 62 6c 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ble]....        
14e00 20 20 24 6e 61 6d 65 73 70 61 63 65 4d 61 6e 61    $namespaceMana
14e10 67 65 72 20 41 64 64 4e 61 6d 65 73 70 61 63 65  ger AddNamespace
14e20 20 6d 64 61 20 5c 0d 0a 20 20 20 20 20 20 20 20   mda \..        
14e30 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 63 68        http://sch
14e40 65 6d 61 73 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  emas.microsoft.c
14e50 6f 6d 2f 43 4c 52 2f 32 30 30 34 2f 31 30 2f 6d  om/CLR/2004/10/m
14e60 64 61 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  da....          
14e70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14e80 4f 54 45 3a 20 53 65 6c 65 63 74 20 61 6c 6c 20  OTE: Select all 
14e90 6e 6f 64 65 73 20 75 6e 64 65 72 6e 65 61 74 68  nodes underneath
14ea0 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68   the location wh
14eb0 65 72 65 20 74 68 65 79 20 73 68 6f 75 6c 64 0d  ere they should.
14ec0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
14ed0 20 20 20 72 65 73 69 64 65 20 69 6e 20 74 68 65     reside in the
14ee0 20 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69   MDA configurati
14ef0 6f 6e 20 58 4d 4c 20 64 6f 63 75 6d 65 6e 74 2e  on XML document.
14f00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
14f10 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 64           set nod
14f20 65 73 20 5b 24 64 6f 63 75 6d 65 6e 74 20 53 65  es [$document Se
14f30 6c 65 63 74 4e 6f 64 65 73 20 5c 0d 0a 20 20 20  lectNodes \..   
14f40 20 20 20 20 20 20 20 20 20 20 20 2f 6d 64 61 3a             /mda:
14f50 6d 64 61 43 6f 6e 66 69 67 2f 6d 64 61 3a 61 73  mdaConfig/mda:as
14f60 73 69 73 74 61 6e 74 73 2f 2a 20 24 6e 61 6d 65  sistants/* $name
14f70 73 70 61 63 65 4d 61 6e 61 67 65 72 5d 0d 0a 0d  spaceManager]...
14f80 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14f90 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14fa0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63  Populate the loc
14fb0 61 6c 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  al result variab
14fc0 6c 65 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  le with the name
14fd0 73 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20  s of..          
14fe0 23 20 20 20 20 20 20 20 61 6c 6c 20 74 68 65 20  #       all the 
14ff0 58 4d 4c 20 6e 6f 64 65 73 20 66 6f 75 6e 64 2e  XML nodes found.
15000 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15010 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d           set nam
15020 65 73 20 5b 6f 62 6a 65 63 74 20 6c 6d 61 70 20  es [object lmap 
15030 2d 61 6c 69 61 73 20 6e 6f 64 65 20 24 6e 6f 64  -alias node $nod
15040 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
15050 20 20 24 6e 6f 64 65 20 4e 61 6d 65 0d 0a 20 20    $node Name..  
15060 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20          }]..    
15070 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
15080 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
15090 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
150a0 54 45 3a 20 4f 6b 2c 20 74 68 65 20 58 4d 4c 20  TE: Ok, the XML 
150b0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
150c0 6c 65 20 77 61 73 20 6c 6f 61 64 65 64 20 61 6e  le was loaded an
150d0 64 20 70 61 72 73 65 64 0d 0a 20 20 20 20 20 20  d parsed..      
150e0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 72      #       corr
150f0 65 63 74 6c 79 2c 20 73 65 65 20 69 66 20 61 6e  ectly, see if an
15100 79 20 6d 61 6e 61 67 65 64 20 64 65 62 75 67 67  y managed debugg
15110 69 6e 67 20 61 73 73 69 73 74 61 6e 74 73 20 77  ing assistants w
15120 65 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ere..          #
15130 20 20 20 20 20 20 20 66 6f 75 6e 64 20 65 6e 61         found ena
15140 62 6c 65 64 20 77 69 74 68 69 6e 20 69 74 2e 0d  bled within it..
15150 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15160 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
15170 6f 20 65 78 69 73 74 73 20 6e 61 6d 65 73 5d 20  o exists names] 
15180 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 6e 61 6d  && [llength $nam
15190 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
151a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
151b0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
151c0 54 45 3a 20 41 64 64 20 61 20 74 65 73 74 20 63  TE: Add a test c
151d0 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 65 61  onstraint for ea
151e0 63 68 20 6d 61 6e 61 67 65 64 20 64 65 62 75 67  ch managed debug
151f0 67 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20  ging..          
15200 20 20 23 20 20 20 20 20 20 20 61 73 73 69 73 74    #       assist
15210 61 6e 74 20 74 68 61 74 20 61 70 70 65 61 72 73  ant that appears
15220 20 74 6f 20 62 65 20 65 6e 61 62 6c 65 64 2e 0d   to be enabled..
15230 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
15240 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
15250 6f 6e 73 74 72 61 69 6e 74 20 6d 64 61 0d 0a 0d  onstraint mda...
15260 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
15270 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
15280 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15290 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
152a0 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 64 61 2e  [appendArgs mda.
152b0 20 24 6e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20   $name]..       
152c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
152d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
152e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76       # NOTE: Sav
152f0 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  e the list of ma
15300 6e 61 67 65 64 20 64 65 62 75 67 67 69 6e 67 20  naged debugging 
15310 61 73 73 69 73 74 61 6e 74 73 20 66 6f 72 0d 0a  assistants for..
15320 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
15330 20 20 20 20 6c 61 74 65 72 20 75 73 65 20 62 79      later use by
15340 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
15350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
15360 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15370 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
15380 3a 6e 6f 28 73 65 74 4d 64 61 73 29 5d 7d 20 74  :no(setMdas)]} t
15390 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
153a0 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
153b0 6d 64 61 73 20 24 6e 61 6d 65 73 0d 0a 20 20 20  mdas $names..   
153c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
153d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
153e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
153f0 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
15400 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6f   that at least o
15410 6e 65 20 6d 61 6e 61 67 65 64 20 64 65 62 75 67  ne managed debug
15420 67 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20  ging..          
15430 20 20 23 20 20 20 20 20 20 20 61 73 73 69 73 74    #       assist
15440 61 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0d  ant is enabled..
15450 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
15460 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
15470 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
15480 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
15490 6e 61 6d 65 73 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  names ")\n"]....
154a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
154b0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
154c0 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68  E: We are done h
154d0 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ere, return now.
154e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
154f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
15500 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  urn..          }
15510 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
15520 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
15530 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
15540 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
15550 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 74   proc checkForSt
15560 72 6f 6e 67 4e 61 6d 65 20 7b 20 63 68 61 6e 6e  rongName { chann
15570 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
15580 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
15590 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
155a0 73 74 72 6f 6e 67 20 6e 61 6d 65 2e 2e 2e 20 22  strong name... "
155b0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
155c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
155d0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
155e0 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
155f0 69 76 65 20 47 65 74 53 74 72 6f 6e 67 4e 61 6d  ive GetStrongNam
15600 65 0d 0a 20 20 20 20 20 20 7d 20 73 74 72 6f 6e  e..      } stron
15610 67 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20 5b  gName] == 0 && [
15620 69 73 4e 6f 6e 4e 75 6c 6c 4f 62 6a 65 63 74 48  isNonNullObjectH
15630 61 6e 64 6c 65 20 24 73 74 72 6f 6e 67 4e 61 6d  andle $strongNam
15640 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
15650 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15660 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61   NOTE: Yes, it a
15670 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65 20  ppears that the 
15680 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
15690 20 73 69 67 6e 65 64 20 77 69 74 68 20 61 0d 0a   signed with a..
156a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
156b0 73 74 72 6f 6e 67 20 6e 61 6d 65 20 6b 65 79 2e  strong name key.
156c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
156d0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
156e0 6e 74 20 73 74 72 6f 6e 67 4e 61 6d 65 0d 0a 0d  nt strongName...
156f0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
15700 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
15710 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
15720 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15730 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
15740 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
15750 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
15760 53 74 72 6f 6e 67 4e 61 6d 65 4b 65 79 20 7b 20  StrongNameKey { 
15770 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
15780 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
15790 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
157a0 20 66 6f 72 20 73 74 72 6f 6e 67 20 6e 61 6d 65   for strong name
157b0 20 6b 65 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20   key... "....   
157c0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 69     if {[catch {i
157d0 6e 66 6f 20 65 6e 67 69 6e 65 20 50 75 62 6c 69  nfo engine Publi
157e0 63 4b 65 79 54 6f 6b 65 6e 7d 20 70 75 62 6c 69  cKeyToken} publi
157f0 63 4b 65 79 54 6f 6b 65 6e 5d 20 3d 3d 20 30 20  cKeyToken] == 0 
15800 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
15810 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
15820 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 5d 20  publicKeyToken] 
15830 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
15840 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15850 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 20 74 65  # NOTE: Add a te
15860 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
15870 72 20 74 68 69 73 20 73 70 65 63 69 66 69 63 20  r this specific 
15880 73 74 72 6f 6e 67 20 6e 61 6d 65 20 6b 65 79 2e  strong name key.
15890 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
158a0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
158b0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73  nt [appendArgs s
158c0 74 72 6f 6e 67 4e 61 6d 65 2e 20 24 70 75 62 6c  trongName. $publ
158d0 69 63 4b 65 79 54 6f 6b 65 6e 5d 0d 0a 0d 0a 20  icKeyToken].... 
158e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
158f0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
15900 68 65 20 73 74 72 6f 6e 67 20 6e 61 6d 65 20 6b  he strong name k
15910 65 79 20 74 68 61 74 20 77 65 20 66 6f 75 6e 64  ey that we found
15920 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15930 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15940 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15950 20 22 79 65 73 20 28 22 20 24 70 75 62 6c 69 63   "yes (" $public
15960 4b 65 79 54 6f 6b 65 6e 20 22 29 5c 6e 22 5d 0d  KeyToken ")\n"].
15970 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15980 20 20 20 20 20 20 23 20 42 55 47 42 55 47 3a 20        # BUGBUG: 
15990 54 63 6c 20 38 2e 34 20 64 6f 65 73 20 6e 6f 74  Tcl 8.4 does not
159a0 20 73 65 65 6d 20 74 6f 20 6c 69 6b 65 20 74 68   seem to like th
159b0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  is expression be
159c0 63 61 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  cause it..      
159d0 20 20 23 20 20 20 20 20 20 20 20 20 63 6f 6e 74    #         cont
159e0 61 69 6e 73 20 74 68 65 20 22 6e 69 22 20 6f 70  ains the "ni" op
159f0 65 72 61 74 6f 72 20 61 64 64 65 64 20 69 6e 20  erator added in 
15a00 54 63 6c 20 38 2e 35 20 28 61 6e 64 20 54 63 6c  Tcl 8.5 (and Tcl
15a10 20 38 2e 34 0d 0a 20 20 20 20 20 20 20 20 23 20   8.4..        # 
15a20 20 20 20 20 20 20 20 20 74 72 69 65 73 20 74 6f          tries to
15a30 20 63 6f 6d 70 69 6c 65 20 69 74 20 65 76 65 6e   compile it even
15a40 20 74 68 6f 75 67 68 20 69 74 20 77 69 6c 6c 20   though it will 
15a50 6f 6e 6c 79 20 62 65 20 65 76 61 6c 75 61 74 65  only be evaluate
15a60 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
15a70 20 20 20 20 20 69 6e 20 45 61 67 6c 65 29 2e 0d       in Eagle)..
15a80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15a90 20 20 20 20 73 65 74 20 65 78 70 72 20 7b 24 70      set expr {$p
15aa0 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20 6e 69  ublicKeyToken ni
15ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15ac0 22 32 39 63 36 32 39 37 36 33 30 62 65 30 35 65  "29c6297630be05e
15ad0 62 20 31 65 32 32 65 63 36 37 38 37 39 37 33 39  b 1e22ec67879739
15ae0 61 32 20 33 35 38 30 33 30 30 36 33 61 38 33 32  a2 358030063a832
15af0 62 63 33 22 7d 0d 0a 0d 0a 20 20 20 20 20 20 20  bc3"}....       
15b00 20 69 66 20 7b 5b 65 78 70 72 20 24 65 78 70 72   if {[expr $expr
15b10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15b20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15b30 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 45 61    # NOTE: The Ea
15b40 67 6c 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  gle core library
15b50 20 69 73 20 73 74 72 6f 6e 67 20 6e 61 6d 65 20   is strong name 
15b60 73 69 67 6e 65 64 20 77 69 74 68 20 61 20 6b 65  signed with a ke
15b70 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  y that..        
15b80 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f 74    #       is not
15b90 20 6f 66 66 69 63 69 61 6c 2e 20 20 54 68 69 73   official.  This
15ba0 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 61 6e 20   is also not an 
15bb0 65 72 72 6f 72 2c 20 70 65 72 20 73 65 3b 20 68  error, per se; h
15bc0 6f 77 65 76 65 72 2c 0d 0a 20 20 20 20 20 20 20  owever,..       
15bd0 20 20 20 23 20 20 20 20 20 20 20 69 74 20 6d 61     #       it ma
15be0 79 20 63 61 75 73 65 20 73 6f 6d 65 20 74 65 73  y cause some tes
15bf0 74 73 20 74 6f 20 66 61 69 6c 20 61 6e 64 20 69  ts to fail and i
15c00 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 70 6f  t should be repo
15c10 72 74 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  rted to..       
15c20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
15c30 73 65 72 20 61 6e 64 20 6e 6f 74 65 64 20 69 6e  ser and noted in
15c40 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
15c50 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
15c60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15c70 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
15c80 73 74 72 6f 6e 67 4e 61 6d 65 2e 75 6e 6f 66 66  strongName.unoff
15c90 69 63 69 61 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  icial....       
15ca0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15cb0 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 66  # NOTE: Unless f
15cc0 6f 72 62 69 64 64 65 6e 2c 20 69 73 73 75 65 20  orbidden, issue 
15cd0 61 6e 64 20 6c 6f 67 20 61 20 77 61 72 6e 69 6e  and log a warnin
15ce0 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  g...          #.
15cf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
15d00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f 28  [info exists no(
15d10 77 61 72 6e 69 6e 67 46 6f 72 53 74 72 6f 6e 67  warningForStrong
15d20 4e 61 6d 65 4b 65 79 29 5d 20 26 26 20 5c 0d 0a  NameKey)] && \..
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
15d40 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 71  haveConstraint q
15d50 75 69 65 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  uiet]} then {.. 
15d60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15d70 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15d80 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15d90 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
15da0 41 52 4e 49 4e 47 3a 20 75 6e 6f 66 66 69 63 69  ARNING: unoffici
15db0 61 6c 20 45 61 67 6c 65 20 73 74 72 6f 6e 67 20  al Eagle strong 
15dc0 6e 61 6d 65 20 73 69 67 6e 61 74 75 72 65 20 22  name signature "
15dd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15de0 20 20 20 20 22 64 65 74 65 63 74 65 64 3a 20 22      "detected: "
15df0 20 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e   $publicKeyToken
15e00 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
15e10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
15e20 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
15e30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
15e40 54 45 3a 20 53 65 76 65 72 61 6c 20 74 65 73 74  TE: Several test
15e50 73 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 66  s require one of
15e60 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20 73 74   the official st
15e70 72 6f 6e 67 20 6e 61 6d 65 20 6b 65 79 73 20 74  rong name keys t
15e80 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  o..          #  
15e90 20 20 20 20 20 62 65 20 75 73 65 64 20 69 6e 20       be used in 
15ea0 6f 72 64 65 72 20 66 6f 72 20 74 68 65 6d 20 74  order for them t
15eb0 6f 20 70 61 73 73 2e 0d 0a 20 20 20 20 20 20 20  o pass...       
15ec0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15ed0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 74  addConstraint st
15ee0 72 6f 6e 67 4e 61 6d 65 2e 6f 66 66 69 63 69 61  rongName.officia
15ef0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  l....          t
15f00 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
15f10 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15f20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
15f30 20 6f 66 66 69 63 69 61 6c 20 45 61 67 6c 65 20   official Eagle 
15f40 73 74 72 6f 6e 67 20 6e 61 6d 65 20 73 69 67 6e  strong name sign
15f50 61 74 75 72 65 20 64 65 74 65 63 74 65 64 3a 20  ature detected: 
15f60 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15f70 20 20 20 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b     $publicKeyTok
15f80 65 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  en \n]..        
15f90 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
15fa0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
15fb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
15fc0 65 20 45 61 67 6c 65 20 63 6f 72 65 20 6c 69 62  e Eagle core lib
15fd0 72 61 72 79 20 69 73 20 6e 6f 74 20 73 69 67 6e  rary is not sign
15fe0 65 64 20 77 69 74 68 20 61 20 73 74 72 6f 6e 67  ed with a strong
15ff0 20 6e 61 6d 65 20 6b 65 79 2e 0d 0a 20 20 20 20   name key...    
16000 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
16010 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
16020 2c 20 70 65 72 20 73 65 3b 20 68 6f 77 65 76 65  , per se; howeve
16030 72 2c 20 69 74 20 6d 61 79 20 63 61 75 73 65 20  r, it may cause 
16040 73 65 6c 65 63 74 65 64 0d 0a 20 20 20 20 20 20  selected..      
16050 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20    #       tests 
16060 74 6f 20 66 61 69 6c 20 61 6e 64 20 69 74 20 73  to fail and it s
16070 68 6f 75 6c 64 20 62 65 20 72 65 70 6f 72 74 65  hould be reporte
16080 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61 6e  d to the user an
16090 64 20 6e 6f 74 65 64 0d 0a 20 20 20 20 20 20 20  d noted..       
160a0 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
160b0 74 65 73 74 20 73 75 69 74 65 20 6c 6f 67 20 66  test suite log f
160c0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
160d0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
160e0 74 72 61 69 6e 74 20 73 74 72 6f 6e 67 4e 61 6d  traint strongNam
160f0 65 2e 6e 6f 6e 65 0d 0a 0d 0a 20 20 20 20 20 20  e.none....      
16100 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16110 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
16120 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  e did not find a
16130 20 73 74 72 6f 6e 67 20 6e 61 6d 65 20 6b 65 79   strong name key
16140 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
16150 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16160 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
16170 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16180 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 66  # NOTE: Unless f
16190 6f 72 62 69 64 64 65 6e 2c 20 69 73 73 75 65 20  orbidden, issue 
161a0 61 6e 64 20 6c 6f 67 20 61 20 77 61 72 6e 69 6e  and log a warnin
161b0 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  g...        #.. 
161c0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
161d0 6f 20 65 78 69 73 74 73 20 6e 6f 28 77 61 72 6e  o exists no(warn
161e0 69 6e 67 46 6f 72 53 74 72 6f 6e 67 4e 61 6d 65  ingForStrongName
161f0 4b 65 79 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  Key)] && \..    
16200 20 20 20 20 20 20 20 20 21 5b 68 61 76 65 43 6f          ![haveCo
16210 6e 73 74 72 61 69 6e 74 20 71 75 69 65 74 5d 7d  nstraint quiet]}
16220 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16230 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16240 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
16250 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
16260 3a 20 6e 6f 20 45 61 67 6c 65 20 73 74 72 6f 6e  : no Eagle stron
16270 67 20 6e 61 6d 65 20 73 69 67 6e 61 74 75 72 65  g name signature
16280 20 64 65 74 65 63 74 65 64 2e 2e 2e 5c 6e 22 0d   detected...\n".
16290 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
162a0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
162b0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
162c0 43 65 72 74 69 66 69 63 61 74 65 20 7b 20 63 68  Certificate { ch
162d0 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
162e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
162f0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
16300 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 2e 2e  or certificate..
16310 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
16320 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
16330 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
16340 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
16350 41 63 74 69 76 65 20 47 65 74 43 65 72 74 69 66  Active GetCertif
16360 69 63 61 74 65 0d 0a 20 20 20 20 20 20 7d 20 63  icate..      } c
16370 65 72 74 69 66 69 63 61 74 65 5d 20 3d 3d 20 30  ertificate] == 0
16380 20 26 26 20 5b 69 73 4e 6f 6e 4e 75 6c 6c 4f 62   && [isNonNullOb
16390 6a 65 63 74 48 61 6e 64 6c 65 20 24 63 65 72 74  jectHandle $cert
163a0 69 66 69 63 61 74 65 5d 7d 20 74 68 65 6e 20 7b  ificate]} then {
163b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
163c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
163d0 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61  , it appears tha
163e0 74 20 74 68 65 20 63 6f 72 65 20 6c 69 62 72 61  t the core libra
163f0 72 79 20 77 61 73 20 73 69 67 6e 65 64 20 77 69  ry was signed wi
16400 74 68 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20  th a..        # 
16410 20 20 20 20 20 20 63 6f 64 65 2d 73 69 67 6e 69        code-signi
16420 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 2e 0d  ng certificate..
16430 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16440 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
16450 74 20 63 65 72 74 69 66 69 63 61 74 65 0d 0a 0d  t certificate...
16460 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16470 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
16480 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74 68 65  mpt to query the
16490 20 73 75 62 6a 65 63 74 20 66 72 6f 6d 20 74 68   subject from th
164a0 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 0d 0a  e certificate...
164b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
164c0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
164d0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
164e0 74 20 69 6e 76 6f 6b 65 20 24 63 65 72 74 69 66  t invoke $certif
164f0 69 63 61 74 65 20 53 75 62 6a 65 63 74 0d 0a 20  icate Subject.. 
16500 20 20 20 20 20 20 20 7d 20 73 75 62 6a 65 63 74         } subject
16510 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] || [string len
16520 67 74 68 20 24 73 75 62 6a 65 63 74 5d 20 3d 3d  gth $subject] ==
16530 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16540 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16550 20 20 20 23 20 54 4f 44 4f 3a 20 4e 6f 20 63 65     # TODO: No ce
16560 72 74 69 66 69 63 61 74 65 20 73 75 62 6a 65 63  rtificate subjec
16570 74 2c 20 62 65 74 74 65 72 20 68 61 6e 64 6c 69  t, better handli
16580 6e 67 20 68 65 72 65 3f 0d 0a 20 20 20 20 20 20  ng here?..      
16590 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
165a0 20 73 65 74 20 73 75 62 6a 65 63 74 20 75 6e 6b   set subject unk
165b0 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
165c0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
165d0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
165e0 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 73  dArgs "yes (" $s
165f0 75 62 6a 65 63 74 20 22 29 5c 6e 22 5d 0d 0a 20  ubject ")\n"].. 
16600 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16610 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
16620 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
16630 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
16640 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
16650 43 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 7b 20  CompileCSharp { 
16660 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
16670 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16680 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
16690 20 66 6f 72 20 74 65 73 74 20 75 73 65 20 6f 66   for test use of
166a0 20 43 23 20 63 6f 6d 70 69 6c 65 72 2e 2e 2e 20   C# compiler... 
166b0 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  "....      if {!
166c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
166d0 6f 28 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 29  o(compileCSharp)
166e0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
166f0 20 20 5b 64 6f 65 73 43 6f 6d 70 69 6c 65 43 53    [doesCompileCS
16700 68 61 72 70 57 6f 72 6b 5d 7d 20 74 68 65 6e 20  harpWork]} then 
16710 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
16720 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70 69 6c 65  nstraint compile
16730 43 53 68 61 72 70 0d 0a 0d 0a 20 20 20 20 20 20  CSharp....      
16740 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16750 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
16760 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
16770 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
16780 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
16790 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
167a0 20 63 68 65 63 6b 46 6f 72 41 64 6d 69 6e 69 73   checkForAdminis
167b0 74 72 61 74 6f 72 20 7b 20 63 68 61 6e 6e 65 6c  trator { channel
167c0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
167d0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
167e0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 64   checking for ad
167f0 6d 69 6e 69 73 74 72 61 74 6f 72 2e 2e 2e 20 22  ministrator... "
16800 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
16810 73 54 65 73 74 41 64 6d 69 6e 69 73 74 72 61 74  sTestAdministrat
16820 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
16830 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
16840 6e 74 20 61 64 6d 69 6e 69 73 74 72 61 74 6f 72  nt administrator
16850 3b 20 23 20 72 75 6e 6e 69 6e 67 20 61 73 20 66  ; # running as f
16860 75 6c 6c 20 61 64 6d 69 6e 2e 0d 0a 0d 0a 20 20  ull admin.....  
16870 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16880 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
16890 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
168a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
168b0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
168c0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
168d0 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 48 6f 73  proc checkForHos
168e0 74 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  t { channel } {.
168f0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
16900 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
16910 6b 69 6e 67 20 66 6f 72 20 68 6f 73 74 2e 2e 2e  king for host...
16920 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
16930 5b 63 61 74 63 68 20 7b 68 6f 73 74 20 69 73 6f  [catch {host iso
16940 70 65 6e 7d 20 6f 70 65 6e 5d 20 3d 3d 20 30 7d  pen} open] == 0}
16950 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16960 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
16970 74 72 75 65 20 2d 73 74 72 69 63 74 20 24 6f 70  true -strict $op
16980 65 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  en]} then {..   
16990 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
169a0 61 69 6e 74 20 68 6f 73 74 49 73 4f 70 65 6e 0d  aint hostIsOpen.
169b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
169c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 6f 70 65 6e  ts $channel open
169d0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  \n..        } el
169e0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
169f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 68 6f 73 74  if {[catch {host
16a00 20 72 65 64 69 72 65 63 74 65 64 20 49 6e 70 75   redirected Inpu
16a10 74 7d 20 72 65 64 69 72 65 63 74 65 64 5d 20 3d  t} redirected] =
16a20 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
16a30 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
16a40 72 69 6e 67 20 69 73 20 74 72 75 65 20 2d 73 74  ring is true -st
16a50 72 69 63 74 20 24 72 65 64 69 72 65 63 74 65 64  rict $redirected
16a60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16a70 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
16a80 74 72 61 69 6e 74 20 68 6f 73 74 49 6e 70 75 74  traint hostInput
16a90 52 65 64 69 72 65 63 74 65 64 0d 0a 0d 0a 20 20  Redirected....  
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16ab0 73 20 24 63 68 61 6e 6e 65 6c 20 72 65 64 69 72  s $channel redir
16ac0 65 63 74 65 64 5c 6e 0d 0a 20 20 20 20 20 20 20  ected\n..       
16ad0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
16af0 43 6f 6e 73 74 72 61 69 6e 74 20 68 6f 73 74 49  Constraint hostI
16b00 73 43 6c 6f 73 65 64 0d 0a 0d 0a 20 20 20 20 20  sClosed....     
16b10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16b20 63 68 61 6e 6e 65 6c 20 63 6c 6f 73 65 64 5c 6e  channel closed\n
16b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
16b40 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
16b50 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
16b60 20 74 6c 6f 67 20 24 72 65 64 69 72 65 63 74 65   tlog $redirecte
16b70 64 3b 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65  d; tputs $channe
16b80 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20  l error\n..     
16b90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16ba0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
16bb0 7b 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20  {..        tlog 
16bc0 24 6f 70 65 6e 3b 20 74 70 75 74 73 20 24 63 68  $open; tputs $ch
16bd0 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20  annel error\n.. 
16be0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
16bf0 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
16c00 46 6f 72 48 6f 73 74 54 79 70 65 20 7b 20 63 68  ForHostType { ch
16c10 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
16c20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
16c30 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
16c40 6f 72 20 68 6f 73 74 20 74 79 70 65 2e 2e 2e 20  or host type... 
16c50 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
16c60 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
16c70 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
16c80 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
16c90 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 48  eter.GetActive.H
16ca0 6f 73 74 2e 47 65 74 54 79 70 65 20 54 6f 53 74  ost.GetType ToSt
16cb0 72 69 6e 67 0d 0a 20 20 20 20 20 20 7d 20 68 6f  ring..      } ho
16cc0 73 74 54 79 70 65 5d 5d 20 3d 3d 20 30 20 26 26  stType]] == 0 &&
16cd0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
16ce0 24 68 6f 73 74 54 79 70 65 5d 20 3e 20 30 7d 20  $hostType] > 0} 
16cf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16d00 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
16d10 70 70 65 6e 64 41 72 67 73 20 68 6f 73 74 54 79  ppendArgs hostTy
16d20 70 65 2e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  pe. [string map 
16d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
16d40 6c 69 73 74 20 2c 20 5f 20 2b 20 5f 20 26 20 5f  list , _ + _ & _
16d50 20 2a 20 5f 20 5c 5b 20 5f 20 5c 5d 20 5f 20 2e   * _ \[ _ \] _ .
16d60 20 5f 20 5c 5c 20 5f 5d 20 24 68 6f 73 74 54 79   _ \\ _] $hostTy
16d70 70 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  pe]]....        
16d80 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
16d90 61 70 70 65 6e 64 41 72 67 73 20 24 68 6f 73 74  appendArgs $host
16da0 54 79 70 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  Type \n]..      
16db0 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20  } elseif {$code 
16dc0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16dd0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16de0 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
16df0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
16e00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
16e10 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a  hannel error\n..
16e20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
16e30 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
16e40 6b 46 6f 72 50 72 69 6d 61 72 79 54 68 72 65 61  kForPrimaryThrea
16e50 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  d { channel } {.
16e60 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
16e70 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
16e80 6b 69 6e 67 20 66 6f 72 20 70 72 69 6d 61 72 79  king for primary
16e90 20 74 68 72 65 61 64 2e 2e 2e 20 22 0d 0a 0d 0a   thread... "....
16ea0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
16eb0 74 69 64 5d 20 3d 3d 20 5b 73 65 74 20 74 68 72  tid] == [set thr
16ec0 65 61 64 49 64 20 5b 69 6e 66 6f 20 70 74 69 64  eadId [info ptid
16ed0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
16ee0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
16ef0 74 20 70 72 69 6d 61 72 79 54 68 72 65 61 64 0d  t primaryThread.
16f00 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
16f10 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
16f20 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 74  dArgs "yes (" $t
16f30 68 72 65 61 64 49 64 20 22 29 5c 6e 22 5d 0d 0a  hreadId ")\n"]..
16f40 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
16f50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
16f60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16f70 67 73 20 22 6e 6f 20 28 22 20 24 74 68 72 65 61  gs "no (" $threa
16f80 64 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  dId ")\n"]..    
16f90 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
16fa0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
16fb0 44 65 66 61 75 6c 74 41 70 70 44 6f 6d 61 69 6e  DefaultAppDomain
16fc0 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
16fd0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16fe0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
16ff0 69 6e 67 20 66 6f 72 20 64 65 66 61 75 6c 74 20  ing for default 
17000 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
17010 69 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  in... "....     
17020 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
17030 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
17040 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 20 43  voke AppDomain C
17050 75 72 72 65 6e 74 44 6f 6d 61 69 6e 0d 0a 20 20  urrentDomain..  
17060 20 20 20 20 7d 20 61 70 70 44 6f 6d 61 69 6e 5d      } appDomain]
17070 20 3d 3d 20 30 20 26 26 20 5b 69 73 4e 6f 6e 4e   == 0 && [isNonN
17080 75 6c 6c 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  ullObjectHandle 
17090 24 61 70 70 44 6f 6d 61 69 6e 5d 7d 20 74 68 65  $appDomain]} the
170a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
170b0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
170c0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
170d0 6b 65 20 24 61 70 70 44 6f 6d 61 69 6e 20 49 73  ke $appDomain Is
170e0 44 65 66 61 75 6c 74 41 70 70 44 6f 6d 61 69 6e  DefaultAppDomain
170f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 64 65 66 61  ..        } defa
17100 75 6c 74 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20  ult] || [string 
17110 6c 65 6e 67 74 68 20 24 64 65 66 61 75 6c 74 5d  length $default]
17120 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
17130 20 20 20 20 20 20 20 20 20 73 65 74 20 64 65 66           set def
17140 61 75 6c 74 20 66 61 6c 73 65 0d 0a 20 20 20 20  ault false..    
17150 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17160 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
17170 65 63 74 20 69 6e 76 6f 6b 65 20 24 61 70 70 44  ect invoke $appD
17180 6f 6d 61 69 6e 20 49 64 7d 20 69 64 5d 20 7c 7c  omain Id} id] ||
17190 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
171a0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
171b0 69 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  id] == 0} then {
171c0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
171d0 69 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  id unknown..    
171e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
171f0 20 69 66 20 7b 24 64 65 66 61 75 6c 74 7d 20 74   if {$default} t
17200 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17210 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
17220 65 66 61 75 6c 74 41 70 70 44 6f 6d 61 69 6e 0d  efaultAppDomain.
17230 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
17240 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17250 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
17260 24 69 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  $id ")\n"]..    
17270 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
17280 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17290 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
172a0 67 73 20 22 6e 6f 20 28 22 20 24 69 64 20 22 29  gs "no (" $id ")
172b0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
172c0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
172d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
172e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
172f0 72 67 73 20 22 6e 6f 20 28 6e 75 6c 6c 29 5c 6e  rgs "no (null)\n
17300 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  "]..      }..   
17310 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
17320 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 20  checkForRuntime 
17330 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
17340 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17350 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
17360 6e 67 20 66 6f 72 20 72 75 6e 74 69 6d 65 2e 2e  ng for runtime..
17370 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  . "....      #..
17380 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72        # NOTE: Ar
17390 65 20 77 65 20 72 75 6e 6e 69 6e 67 20 69 6e 73  e we running ins
173a0 69 64 65 20 4d 6f 6e 6f 20 2d 4f 52 2d 20 6f 6e  ide Mono -OR- on
173b0 20 2e 4e 45 54 20 43 6f 72 65 20 28 72 65 67 61   .NET Core (rega
173c0 72 64 6c 65 73 73 0d 0a 20 20 20 20 20 20 23 20  rdless..      # 
173d0 20 20 20 20 20 20 6f 66 20 6f 70 65 72 61 74 69        of operati
173e0 6e 67 20 73 79 73 74 65 6d 29 3f 0d 0a 20 20 20  ng system)?..   
173f0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
17400 5b 69 73 54 65 73 74 44 6f 74 4e 65 74 43 6f 72  [isTestDotNetCor
17410 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
17420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
17430 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61   NOTE: Yes, it a
17440 70 70 65 61 72 73 20 74 68 61 74 20 77 65 20 61  ppears that we a
17450 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e  re running on .N
17460 45 54 20 43 6f 72 65 2e 0d 0a 20 20 20 20 20 20  ET Core...      
17470 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
17480 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
17490 74 43 6f 72 65 3b 20 23 20 72 75 6e 6e 69 6e 67  tCore; # running
174a0 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2e 0d 0a   on .NET Core...
174b0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
174c0 72 61 69 6e 74 20 64 6f 74 4e 65 74 4f 72 44 6f  raint dotNetOrDo
174d0 74 4e 65 74 43 6f 72 65 0d 0a 20 20 20 20 20 20  tNetCore..      
174e0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
174f0 64 6f 74 4e 65 74 43 6f 72 65 4f 72 53 68 65 6c  dotNetCoreOrShel
17500 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
17510 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17520 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
17530 6f 20 73 6b 69 70 20 4d 6f 6e 6f 20 62 75 67 73  o skip Mono bugs
17540 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2e 0d 0a   on .NET Core...
17550 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17560 20 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43     addKnownMonoC
17570 6f 6e 73 74 72 61 69 6e 74 73 20 74 72 75 65 3b  onstraints true;
17580 20 23 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e   # running on .N
17590 45 54 20 43 6f 72 65 2e 0d 0a 0d 0a 20 20 20 20  ET Core.....    
175a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
175b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
175c0 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73  expr {[info exis
175d0 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ts \..          
175e0 20 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f    ::eagle_platfo
175f0 72 6d 28 72 75 6e 74 69 6d 65 29 5d 20 3f 20 5c  rm(runtime)] ? \
17600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a  ..            $:
17610 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
17620 72 75 6e 74 69 6d 65 29 20 3a 20 22 2e 4e 45 54  runtime) : ".NET
17630 20 43 6f 72 65 22 7d 5d 20 5c 6e 5d 0d 0a 20 20   Core"}] \n]..  
17640 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
17650 73 54 65 73 74 4d 6f 6e 6f 5d 7d 20 74 68 65 6e  sTestMono]} then
17660 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
17670 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
17680 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74  es, it appears t
17690 68 61 74 20 77 65 20 61 72 65 20 72 75 6e 6e 69  hat we are runni
176a0 6e 67 20 69 6e 73 69 64 65 20 4d 6f 6e 6f 2e 0d  ng inside Mono..
176b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
176c0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
176d0 74 20 6d 6f 6e 6f 3b 20 23 20 72 75 6e 6e 69 6e  t mono; # runnin
176e0 67 20 6f 6e 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20  g on Mono...    
176f0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
17700 74 20 6d 6f 6e 6f 4f 72 44 6f 74 4e 65 74 43 6f  t monoOrDotNetCo
17710 72 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  re....        tp
17720 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17730 70 65 6e 64 41 72 67 73 20 5b 65 78 70 72 20 7b  pendArgs [expr {
17740 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a  [info exists \..
17750 20 20 20 20 20 20 20 20 20 20 20 20 3a 3a 65 61              ::ea
17760 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e  gle_platform(run
17770 74 69 6d 65 29 5d 20 3f 20 5c 0d 0a 20 20 20 20  time)] ? \..    
17780 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65          $::eagle
17790 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d  _platform(runtim
177a0 65 29 20 3a 20 22 4d 6f 6e 6f 22 7d 5d 20 5c 6e  e) : "Mono"}] \n
177b0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
177c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
177d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74        # NOTE: It
177e0 20 61 70 70 65 61 72 73 20 74 68 61 74 20 77 65   appears that we
177f0 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
17800 74 68 65 20 66 75 6c 6c 20 2e 4e 45 54 2e 0d 0a  the full .NET...
17810 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17820 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
17830 20 64 6f 74 4e 65 74 3b 20 23 20 72 75 6e 6e 69   dotNet; # runni
17840 6e 67 20 6f 6e 20 2e 4e 45 54 2e 0d 0a 20 20 20  ng on .NET...   
17850 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
17860 6e 74 20 64 6f 74 4e 65 74 4f 72 44 6f 74 4e 65  nt dotNetOrDotNe
17870 74 43 6f 72 65 0d 0a 0d 0a 20 20 20 20 20 20 20  tCore....       
17880 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
17890 54 45 3a 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  TE: We do not wa
178a0 6e 74 20 74 6f 20 73 6b 69 70 20 4d 6f 6e 6f 20  nt to skip Mono 
178b0 62 75 67 73 20 6f 6e 20 2e 4e 45 54 2e 0d 0a 20  bugs on .NET... 
178c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
178d0 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f    addKnownMonoCo
178e0 6e 73 74 72 61 69 6e 74 73 20 74 72 75 65 3b 20  nstraints true; 
178f0 23 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  # running on .NE
17900 54 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  T.....        tp
17910 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17920 70 65 6e 64 41 72 67 73 20 5b 65 78 70 72 20 7b  pendArgs [expr {
17930 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a  [info exists \..
17940 20 20 20 20 20 20 20 20 20 20 20 20 3a 3a 65 61              ::ea
17950 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e  gle_platform(run
17960 74 69 6d 65 29 5d 20 3f 20 5c 0d 0a 20 20 20 20  time)] ? \..    
17970 20 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65          $::eagle
17980 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d  _platform(runtim
17990 65 29 20 3a 20 22 4d 69 63 72 6f 73 6f 66 74 2e  e) : "Microsoft.
179a0 4e 45 54 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  NET"}] \n]..    
179b0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
179c0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
179d0 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73  ImageRuntimeVers
179e0 69 6f 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  ion { channel } 
179f0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
17a00 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
17a10 65 63 6b 69 6e 67 20 66 6f 72 20 69 6d 61 67 65  ecking for image
17a20 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
17a30 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
17a40 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
17a50 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
17a60 28 69 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72  (imageRuntimeVer
17a70 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20  sion)] && \..   
17a80 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17a90 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c 65 5f 70  ength $::eagle_p
17aa0 6c 61 74 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e  latform(imageRun
17ab0 74 69 6d 65 56 65 72 73 69 6f 6e 29 5d 20 3e 20  timeVersion)] > 
17ac0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17ae0 4e 4f 54 45 3a 20 47 65 74 20 74 68 65 20 6d 61  NOTE: Get the ma
17af0 6a 6f 72 20 61 6e 64 20 6d 69 6e 6f 72 20 70 6f  jor and minor po
17b00 72 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 65  rtions of the ve
17b10 72 73 69 6f 6e 20 6f 6e 6c 79 2e 0d 0a 20 20 20  rsion only...   
17b20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17b30 73 65 74 20 64 6f 74 56 65 72 73 69 6f 6e 20 5b  set dotVersion [
17b40 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56 65 72  getMajorMinorVer
17b50 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
17b60 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61      $::eagle_pla
17b70 74 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e 74 69  tform(imageRunti
17b80 6d 65 56 65 72 73 69 6f 6e 29 5d 0d 0a 0d 0a 20  meVersion)].... 
17b90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17ba0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63 72    # NOTE: Now cr
17bb0 65 61 74 65 20 61 20 76 65 72 73 69 6f 6e 20 73  eate a version s
17bc0 74 72 69 6e 67 20 66 6f 72 20 75 73 65 20 69 6e  tring for use in
17bd0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
17be0 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
17bf0 20 20 20 20 20 20 28 72 65 6d 6f 76 65 20 74 68        (remove th
17c00 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a 20 20 20  e periods)...   
17c10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17c20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 73 74 72  set version [str
17c30 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 76 20  ing map [list v 
17c40 22 22 20 2e 20 22 22 5d 20 24 64 6f 74 56 65 72  "" . ""] $dotVer
17c50 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sion]....       
17c60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
17c70 54 45 3a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  TE: Keep track o
17c80 66 20 74 68 65 20 73 70 65 63 69 66 69 63 20 69  f the specific i
17c90 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72  mage runtime ver
17ca0 73 69 6f 6e 20 66 6f 72 20 75 73 61 67 65 20 69  sion for usage i
17cb0 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
17cc0 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69     test constrai
17cd0 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nts...        #.
17ce0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
17cf0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
17d00 67 73 20 69 6d 61 67 65 52 75 6e 74 69 6d 65 20  gs imageRuntime 
17d10 24 76 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20  $version]....   
17d20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17d30 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17d40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
17d50 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
17d60 28 69 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72  (imageRuntimeVer
17d70 73 69 6f 6e 29 20 22 20 28 22 20 24 64 6f 74 56  sion) " (" $dotV
17d80 65 72 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20  ersion ")\n"].. 
17d90 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
17da0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
17db0 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
17dc0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
17dd0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
17de0 46 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  FrameworkVersion
17df0 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
17e00 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
17e10 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
17e20 69 6e 67 20 66 6f 72 20 66 72 61 6d 65 77 6f 72  ing for framewor
17e30 6b 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a  k version... "..
17e40 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
17e50 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65  o exists ::eagle
17e60 5f 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d 65 77  _platform(framew
17e70 6f 72 6b 56 65 72 73 69 6f 6e 29 5d 20 26 26 20  orkVersion)] && 
17e80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
17e90 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65  ring length $::e
17ea0 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 66 72  agle_platform(fr
17eb0 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 5d  ameworkVersion)]
17ec0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
17ed0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17ee0 20 23 20 4e 4f 54 45 3a 20 47 65 74 20 74 68 65   # NOTE: Get the
17ef0 20 6d 61 6a 6f 72 20 61 6e 64 20 6d 69 6e 6f 72   major and minor
17f00 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65   portions of the
17f10 20 76 65 72 73 69 6f 6e 20 6f 6e 6c 79 2e 0d 0a   version only...
17f20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17f30 20 20 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f     set dotVersio
17f40 6e 20 5b 67 65 74 4d 61 6a 6f 72 4d 69 6e 6f 72  n [getMajorMinor
17f50 56 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  Version \..     
17f60 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f         $::eagle_
17f70 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d 65 77 6f  platform(framewo
17f80 72 6b 56 65 72 73 69 6f 6e 29 5d 0d 0a 0d 0a 20  rkVersion)].... 
17f90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17fa0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63 72    # NOTE: Now cr
17fb0 65 61 74 65 20 61 20 76 65 72 73 69 6f 6e 20 73  eate a version s
17fc0 74 72 69 6e 67 20 66 6f 72 20 75 73 65 20 69 6e  tring for use in
17fd0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
17fe0 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
17ff0 20 20 20 20 20 20 28 72 65 6d 6f 76 65 20 74 68        (remove th
18000 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a 20 20 20  e periods)...   
18010 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18020 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  set version [get
18030 44 6f 74 6c 65 73 73 56 65 72 73 69 6f 6e 20 24  DotlessVersion $
18040 64 6f 74 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20  dotVersion].... 
18050 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18060 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
18070 20 66 72 61 6d 65 77 6f 72 6b 20 76 65 72 73 69   framework versi
18080 6f 6e 20 77 61 73 20 66 6f 75 6e 64 2c 20 61 64  on was found, ad
18090 64 20 61 20 74 65 73 74 20 63 6f 6e 73 74 72 61  d a test constra
180a0 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
180b0 20 20 20 20 20 66 6f 72 20 69 74 20 6e 6f 77 2e       for it now.
180c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
180d0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
180e0 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e   length $version
180f0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
18100 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
18110 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
18120 67 73 20 66 72 61 6d 65 77 6f 72 6b 20 24 76 65  gs framework $ve
18130 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  rsion]..        
18140 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
18150 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
18160 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18170 20 20 20 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f         $::eagle_
18180 70 6c 61 74 66 6f 72 6d 28 66 72 61 6d 65 77 6f  platform(framewo
18190 72 6b 56 65 72 73 69 6f 6e 29 20 22 20 28 22 20  rkVersion) " (" 
181a0 24 64 6f 74 56 65 72 73 69 6f 6e 20 22 29 5c 6e  $dotVersion ")\n
181b0 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
181c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
181d0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
181e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
181f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
18200 63 6b 46 6f 72 4d 61 74 63 68 69 6e 67 46 72 61  ckForMatchingFra
18210 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 20 7b 20  meworkVersion { 
18220 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
18230 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
18240 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
18250 20 66 6f 72 20 6d 61 74 63 68 69 6e 67 20 66 72   for matching fr
18260 61 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 2e  amework version.
18270 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
18280 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
18290 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
182a0 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
182b0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
182c0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
182d0 68 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  h $::eagle_platf
182e0 6f 72 6d 28 66 72 61 6d 65 77 6f 72 6b 56 65 72  orm(frameworkVer
182f0 73 69 6f 6e 29 5d 20 3e 20 30 7d 20 74 68 65 6e  sion)] > 0} then
18300 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
18310 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
18320 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 69 6d  agle_platform(im
18330 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
18340 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  n)] && \..      
18350 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
18360 6e 67 74 68 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  ngth $::eagle_pl
18370 61 74 66 6f 72 6d 28 69 6d 61 67 65 52 75 6e 74  atform(imageRunt
18380 69 6d 65 56 65 72 73 69 6f 6e 29 5d 20 3e 20 30  imeVersion)] > 0
18390 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
183a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
183b0 20 23 20 4e 4f 54 45 3a 20 47 65 74 20 74 68 65   # NOTE: Get the
183c0 20 6d 61 6a 6f 72 20 61 6e 64 20 6d 69 6e 6f 72   major and minor
183d0 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65   portions of the
183e0 20 76 65 72 73 69 6f 6e 73 20 6f 6e 6c 79 2e 0d   versions only..
183f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
18400 20 20 20 20 20 20 20 20 73 65 74 20 64 6f 74 56          set dotV
18410 65 72 73 69 6f 6e 28 31 29 20 5b 67 65 74 4d 61  ersion(1) [getMa
18420 6a 6f 72 4d 69 6e 6f 72 56 65 72 73 69 6f 6e 20  jorMinorVersion 
18430 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18440 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f   $::eagle_platfo
18450 72 6d 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  rm(frameworkVers
18460 69 6f 6e 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ion)]....       
18470 20 20 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f     set dotVersio
18480 6e 28 32 29 20 5b 67 65 74 4d 61 6a 6f 72 4d 69  n(2) [getMajorMi
18490 6e 6f 72 56 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  norVersion \..  
184a0 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65              $::e
184b0 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 69 6d  agle_platform(im
184c0 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
184d0 6e 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n)]....         
184e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
184f0 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 73 69 6e  NOTE: Remove sin
18500 67 6c 65 20 6c 65 61 64 69 6e 67 20 22 76 22 20  gle leading "v" 
18510 63 68 61 72 61 63 74 65 72 73 2c 20 69 66 20 61  characters, if a
18520 70 70 6c 69 63 61 62 6c 65 2e 0d 0a 20 20 20 20  pplicable...    
18530 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18540 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
18550 6e 64 65 78 20 24 64 6f 74 56 65 72 73 69 6f 6e  ndex $dotVersion
18560 28 31 29 20 30 5d 20 65 71 20 22 76 22 7d 20 74  (1) 0] eq "v"} t
18570 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18580 20 20 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f     set dotVersio
18590 6e 28 31 29 20 5b 73 74 72 69 6e 67 20 72 61 6e  n(1) [string ran
185a0 67 65 20 24 64 6f 74 56 65 72 73 69 6f 6e 28 31  ge $dotVersion(1
185b0 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20  ) 1 end]..      
185c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
185d0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
185e0 6e 64 65 78 20 24 64 6f 74 56 65 72 73 69 6f 6e  ndex $dotVersion
185f0 28 32 29 20 30 5d 20 65 71 20 22 76 22 7d 20 74  (2) 0] eq "v"} t
18600 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18610 20 20 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f     set dotVersio
18620 6e 28 32 29 20 5b 73 74 72 69 6e 67 20 72 61 6e  n(2) [string ran
18630 67 65 20 24 64 6f 74 56 65 72 73 69 6f 6e 28 32  ge $dotVersion(2
18640 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20  ) 1 end]..      
18650 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
18660 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18670 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63 72 65 61  # NOTE: Now crea
18680 74 65 20 61 20 76 65 72 73 69 6f 6e 20 73 74 72  te a version str
18690 69 6e 67 20 66 6f 72 20 75 73 65 20 69 6e 20 74  ing for use in t
186a0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 20  he constraint.. 
186b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
186c0 20 6e 61 6d 65 20 28 72 65 6d 6f 76 65 20 74 68   name (remove th
186d0 65 20 70 65 72 69 6f 64 73 29 2e 0d 0a 20 20 20  e periods)...   
186e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
186f0 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 28      set version(
18700 31 29 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  1) [string map [
18710 6c 69 73 74 20 2e 20 22 22 5d 20 24 64 6f 74 56  list . ""] $dotV
18720 65 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20  ersion(1)]....  
18730 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18740 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
18750 63 6b 20 66 6f 72 20 61 6e 20 65 78 61 63 74 20  ck for an exact 
18760 6d 61 74 63 68 20 62 65 74 77 65 65 6e 20 74 68  match between th
18770 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 0d  e image runtime.
18780 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
18790 20 20 20 76 65 72 73 69 6f 6e 20 61 6e 64 20 74     version and t
187a0 68 65 20 66 72 61 6d 65 77 6f 72 6b 20 76 65 72  he framework ver
187b0 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  sion...         
187c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
187d0 20 7b 24 64 6f 74 56 65 72 73 69 6f 6e 28 31 29   {$dotVersion(1)
187e0 20 65 71 20 24 64 6f 74 56 65 72 73 69 6f 6e 28   eq $dotVersion(
187f0 32 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  2)} then {..    
18800 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18810 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
18820 65 73 2c 20 74 68 65 20 69 6d 61 67 65 20 72 75  es, the image ru
18830 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 6d 61  ntime version ma
18840 74 63 68 65 73 20 74 68 65 20 66 72 61 6d 65 77  tches the framew
18850 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ork...          
18860 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18870 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 6d   addConstraint m
18880 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20  atchFramework.. 
18890 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
188a0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
188b0 41 72 67 73 20 6d 61 74 63 68 46 72 61 6d 65 77  Args matchFramew
188c0 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31 29 5d  ork $version(1)]
188d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
188e0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
188f0 74 4e 65 74 4d 61 74 63 68 46 72 61 6d 65 77 6f  tNetMatchFramewo
18900 72 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rk..            
18910 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
18920 70 70 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74  ppendArgs dotNet
18930 4d 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 20 24  MatchFramework $
18940 76 65 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20  version(1)].... 
18950 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
18960 6e 73 74 72 61 69 6e 74 20 6d 6f 6e 6f 4d 61 74  nstraint monoMat
18970 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20  chFramework..   
18980 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
18990 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
189a0 67 73 20 6d 6f 6e 6f 4d 61 74 63 68 46 72 61 6d  gs monoMatchFram
189b0 65 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31  ework $version(1
189c0 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  )]....          
189d0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
189e0 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74 63 68 46  dotNetCoreMatchF
189f0 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20  ramework..      
18a00 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
18a10 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
18a20 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74 63 68 46  dotNetCoreMatchF
18a30 72 61 6d 65 77 6f 72 6b 20 24 76 65 72 73 69 6f  ramework $versio
18a40 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  n(1)]....       
18a50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18a60 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
18a70 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
18a80 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18a90 69 73 54 65 73 74 44 6f 74 4e 65 74 43 6f 72 65  isTestDotNetCore
18aa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18ab0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
18ac0 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 4d 61 74  traint dotNetMat
18ad0 63 68 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20  chFramework..   
18ae0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
18af0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
18b00 41 72 67 73 20 64 6f 74 4e 65 74 4d 61 74 63 68  Args dotNetMatch
18b10 46 72 61 6d 65 77 6f 72 6b 20 24 76 65 72 73 69  Framework $versi
18b20 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20  on(1)]....      
18b30 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
18b40 72 61 69 6e 74 20 6d 6f 6e 6f 4d 61 74 63 68 46  raint monoMatchF
18b50 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20  ramework..      
18b60 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
18b70 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
18b80 73 20 6d 6f 6e 6f 4d 61 74 63 68 46 72 61 6d 65  s monoMatchFrame
18b90 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31 29  work $version(1)
18ba0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
18bb0 20 65 6c 73 65 69 66 20 7b 5b 69 73 54 65 73 74   elseif {[isTest
18bc0 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Mono]} then {.. 
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
18be0 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
18bf0 74 4d 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 0d  tMatchFramework.
18c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
18c10 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
18c20 70 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74 4d  pendArgs dotNetM
18c30 61 74 63 68 46 72 61 6d 65 77 6f 72 6b 20 24 76  atchFramework $v
18c40 65 72 73 69 6f 6e 28 31 29 5d 0d 0a 0d 0a 20 20  ersion(1)]....  
18c50 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
18c60 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
18c70 43 6f 72 65 4d 61 74 63 68 46 72 61 6d 65 77 6f  CoreMatchFramewo
18c80 72 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rk..            
18c90 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18ca0 5b 61 70 70 65 6e 64 41 72 67 73 20 64 6f 74 4e  [appendArgs dotN
18cb0 65 74 43 6f 72 65 4d 61 74 63 68 46 72 61 6d 65  etCoreMatchFrame
18cc0 77 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31 29  work $version(1)
18cd0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
18ce0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
18cf0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
18d00 61 69 6e 74 20 6d 6f 6e 6f 4d 61 74 63 68 46 72  aint monoMatchFr
18d10 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20 20  amework..       
18d20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
18d30 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
18d40 20 6d 6f 6e 6f 4d 61 74 63 68 46 72 61 6d 65 77   monoMatchFramew
18d50 6f 72 6b 20 24 76 65 72 73 69 6f 6e 28 31 29 5d  ork $version(1)]
18d60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18d70 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18d80 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74 63 68 46  dotNetCoreMatchF
18d90 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20 20 20 20  ramework..      
18da0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
18db0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
18dc0 73 20 64 6f 74 4e 65 74 43 6f 72 65 4d 61 74 63  s dotNetCoreMatc
18dd0 68 46 72 61 6d 65 77 6f 72 6b 20 24 76 65 72 73  hFramework $vers
18de0 69 6f 6e 28 31 29 5d 0d 0a 20 20 20 20 20 20 20  ion(1)]..       
18df0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18e00 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
18e10 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
18e20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18e30 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18e40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
18e50 65 6c 20 22 6e 6f 2c 20 6d 69 73 73 69 6e 67 20  el "no, missing 
18e60 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65  image runtime ve
18e70 72 73 69 6f 6e 5c 6e 22 0d 0a 20 20 20 20 20 20  rsion\n"..      
18e80 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
18e90 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
18ea0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 6e 6f 2c  ts $channel "no,
18eb0 20 6d 69 73 73 69 6e 67 20 66 72 61 6d 65 77 6f   missing framewo
18ec0 72 6b 20 76 65 72 73 69 6f 6e 5c 6e 22 0d 0a 20  rk version\n".. 
18ed0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
18ee0 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
18ef0 46 6f 72 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ForRuntimeVersio
18f00 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  n { channel } {.
18f10 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
18f20 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
18f30 6b 69 6e 67 20 66 6f 72 20 72 75 6e 74 69 6d 65  king for runtime
18f40 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d   version... "...
18f50 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
18f60 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f   exists ::eagle_
18f70 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65  platform(runtime
18f80 56 65 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a  Version)] && \..
18f90 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
18fa0 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67 6c  g length $::eagl
18fb0 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e 74 69  e_platform(runti
18fc0 6d 65 56 65 72 73 69 6f 6e 29 5d 20 3e 20 30 7d  meVersion)] > 0}
18fd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18fe0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
18ff0 54 45 3a 20 47 65 74 20 74 68 65 20 6d 61 6a 6f  TE: Get the majo
19000 72 20 61 6e 64 20 6d 69 6e 6f 72 20 70 6f 72 74  r and minor port
19010 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 65 72 73  ions of the vers
19020 69 6f 6e 20 6f 6e 6c 79 2e 0d 0a 20 20 20 20 20  ion only...     
19030 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
19040 74 20 64 6f 74 56 65 72 73 69 6f 6e 20 5b 67 65  t dotVersion [ge
19050 74 4d 61 6a 6f 72 4d 69 6e 6f 72 56 65 72 73 69  tMajorMinorVersi
19060 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
19070 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66    $::eagle_platf
19080 6f 72 6d 28 72 75 6e 74 69 6d 65 56 65 72 73 69  orm(runtimeVersi
19090 6f 6e 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on)]....        
190a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
190b0 45 3a 20 4e 6f 77 20 63 72 65 61 74 65 20 61 20  E: Now create a 
190c0 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
190d0 6f 72 20 75 73 65 20 69 6e 20 74 68 65 20 63 6f  or use in the co
190e0 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65 0d 0a 20  nstraint name.. 
190f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28         #       (
19100 72 65 6d 6f 76 65 20 74 68 65 20 70 65 72 69 6f  remove the perio
19110 64 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ds)...        #.
19120 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72  .        set ver
19130 73 69 6f 6e 20 5b 73 74 72 69 6e 67 20 6d 61 70  sion [string map
19140 20 5b 6c 69 73 74 20 2e 20 22 22 5d 20 24 64 6f   [list . ""] $do
19150 74 56 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20  tVersion]....   
19160 20 20 20 20 20 69 66 20 7b 5b 69 73 54 65 73 74       if {[isTest
19170 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65  DotNetCore]} the
19180 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
19190 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
191a0 54 45 3a 20 49 66 20 74 68 65 20 72 75 6e 74 69  TE: If the runti
191b0 6d 65 20 76 65 72 73 69 6f 6e 20 77 61 73 20 66  me version was f
191c0 6f 75 6e 64 2c 20 61 64 64 20 61 20 74 65 73 74  ound, add a test
191d0 20 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 20 20 20   constraint..   
191e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
191f0 6f 72 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20  or it now...    
19200 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19210 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
19220 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
19230 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
19240 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19250 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19260 57 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  We are running o
19270 6e 20 74 68 65 20 2e 4e 45 54 20 43 6f 72 65 2e  n the .NET Core.
19280 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
19290 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
192a0 20 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69   #       specifi
192b0 63 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73  c version for us
192c0 61 67 65 20 69 6e 20 74 65 73 74 20 63 6f 6e 73  age in test cons
192d0 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20  traints...      
192e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
192f0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
19300 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64  nt [appendArgs d
19310 6f 74 4e 65 74 43 6f 72 65 20 24 76 65 72 73 69  otNetCore $versi
19320 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on]..           
19330 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
19340 61 70 70 65 6e 64 41 72 67 73 20 64 6f 74 4e 65  appendArgs dotNe
19350 74 43 6f 72 65 20 24 76 65 72 73 69 6f 6e 20 4f  tCore $version O
19360 72 48 69 67 68 65 72 5d 0d 0a 20 20 20 20 20 20  rHigher]..      
19370 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19380 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19390 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f 20 6e 6f  # NOTE: We do no
193a0 74 20 77 61 6e 74 20 74 6f 20 73 6b 69 70 20 61  t want to skip a
193b0 6e 79 20 4d 6f 6e 6f 20 62 75 67 73 20 6f 6e 20  ny Mono bugs on 
193c0 2e 4e 45 54 20 43 6f 72 65 2e 20 20 41 64 64 0d  .NET Core.  Add.
193d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
193e0 20 20 20 74 68 65 20 6e 65 63 65 73 73 61 72 79     the necessary
193f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
19400 20 65 61 63 68 20 76 65 72 73 69 6f 6e 20 6f 66   each version of
19410 20 4d 6f 6e 6f 20 77 65 0d 0a 20 20 20 20 20 20   Mono we..      
19420 20 20 20 20 23 20 20 20 20 20 20 20 6b 6e 6f 77      #       know
19430 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20   about...       
19440 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19450 61 64 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e 73  addKnownMonoCons
19460 74 72 61 69 6e 74 73 20 66 61 6c 73 65 3b 20 23  traints false; #
19470 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54   running on .NET
19480 2e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ...        } els
19490 65 69 66 20 7b 5b 69 73 54 65 73 74 4d 6f 6e 6f  eif {[isTestMono
194a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
194b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
194c0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
194d0 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
194e0 20 77 61 73 20 66 6f 75 6e 64 2c 20 61 64 64 20   was found, add 
194f0 61 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  a test constrain
19500 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
19510 20 20 20 20 20 66 6f 72 20 69 74 20 6e 6f 77 2e       for it now.
19520 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
19530 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
19540 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
19550 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
19560 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19570 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19580 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
19590 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4d 6f 6e 6f   running on Mono
195a0 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
195b0 20 74 68 65 20 73 70 65 63 69 66 69 63 0d 0a 20   the specific.. 
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
195d0 20 20 20 20 20 76 65 72 73 69 6f 6e 20 66 6f 72       version for
195e0 20 75 73 61 67 65 20 69 6e 20 74 65 73 74 20 63   usage in test c
195f0 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
19600 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19610 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
19620 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
19630 64 41 72 67 73 20 6d 6f 6e 6f 20 24 76 65 72 73  dArgs mono $vers
19640 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ion]..          
19650 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
19660 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f  t [appendArgs mo
19670 6e 6f 20 24 76 65 72 73 69 6f 6e 20 4f 72 48 69  no $version OrHi
19680 67 68 65 72 5d 0d 0a 20 20 20 20 20 20 20 20 20  gher]..         
19690 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
196a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
196b0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
196c0 70 61 72 73 65 20 74 68 65 20 76 65 72 73 69 6f  parse the versio
196d0 6e 20 69 6e 74 6f 20 69 74 73 20 6d 61 6a 6f 72  n into its major
196e0 20 61 6e 64 20 6d 69 6e 6f 72 0d 0a 20 20 20 20   and minor..    
196f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
19700 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
19710 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19720 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
19730 6e 67 74 68 20 24 64 6f 74 56 65 72 73 69 6f 6e  ngth $dotVersion
19740 5d 20 3e 20 30 20 26 26 20 5b 72 65 67 65 78 70  ] > 0 && [regexp
19750 20 2d 2d 20 7b 5e 28 5c 64 2b 29 5c 2e 28 5c 64   -- {^(\d+)\.(\d
19760 2b 29 24 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  +)$} \..        
19770 20 20 20 20 20 20 24 64 6f 74 56 65 72 73 69 6f        $dotVersio
19780 6e 20 64 75 6d 6d 79 20 6d 61 6a 6f 72 56 65 72  n dummy majorVer
19790 73 69 6f 6e 20 6d 69 6e 6f 72 56 65 72 73 69 6f  sion minorVersio
197a0 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
197b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
197c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
197d0 68 69 73 20 69 73 20 74 68 65 20 6c 69 73 74 20  his is the list 
197e0 6f 66 20 4d 6f 6e 6f 20 76 65 72 73 69 6f 6e 73  of Mono versions
197f0 20 74 6f 20 61 64 64 20 74 65 73 74 0d 0a 20 20   to add test..  
19800 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
19810 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f    constraints fo
19820 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
19830 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
19840 65 74 20 6d 6f 6e 6f 56 65 72 73 69 6f 6e 73 20  et monoVersions 
19850 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
19860 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19870 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
19880 63 6b 20 65 61 63 68 20 4d 6f 6e 6f 20 76 65 72  ck each Mono ver
19890 73 69 6f 6e 20 22 6b 6e 6f 77 6e 22 20 74 6f 20  sion "known" to 
198a0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
198b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
198c0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
198d0 61 63 68 20 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20  ach monoVersion 
198e0 5b 67 65 74 4b 6e 6f 77 6e 4d 6f 6e 6f 56 65 72  [getKnownMonoVer
198f0 73 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  sions] {..      
19900 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19910 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19920 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 79 20 4d   Check for any M
19930 6f 6e 6f 20 6d 61 6a 6f 72 20 76 65 72 73 69 6f  ono major versio
19940 6e 20 58 20 6f 72 20 68 69 67 68 65 72 2e 0d 0a  n X or higher...
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
19960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
19970 66 20 7b 24 6d 61 6a 6f 72 56 65 72 73 69 6f 6e  f {$majorVersion
19980 20 3e 3d 20 5b 6c 69 6e 64 65 78 20 24 6d 6f 6e   >= [lindex $mon
19990 6f 56 65 72 73 69 6f 6e 20 30 5d 7d 20 74 68 65  oVersion 0]} the
199a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
199b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
199c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
199d0 43 68 65 63 6b 20 66 6f 72 20 61 6e 79 20 4d 6f  Check for any Mo
199e0 6e 6f 20 6d 61 6a 6f 72 2f 6d 69 6e 6f 72 20 76  no major/minor v
199f0 65 72 73 69 6f 6e 20 68 69 67 68 65 72 0d 0a 20  ersion higher.. 
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
19a10 20 20 20 20 20 20 20 74 68 61 6e 20 58 2e 59 2e         than X.Y.
19a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19a30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19a40 20 20 20 20 20 69 66 20 7b 24 6d 61 6a 6f 72 56       if {$majorV
19a50 65 72 73 69 6f 6e 20 3e 20 5b 6c 69 6e 64 65 78  ersion > [lindex
19a60 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20 30 5d   $monoVersion 0]
19a70 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
19a80 20 20 20 20 20 20 20 20 20 20 20 24 6d 69 6e 6f             $mino
19a90 72 56 65 72 73 69 6f 6e 20 3e 20 5b 6c 69 6e 64  rVersion > [lind
19aa0 65 78 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e 20  ex $monoVersion 
19ab0 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  1]} then {..    
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
19ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ae0 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
19af0 68 69 73 20 22 6b 6e 6f 77 6e 22 20 76 65 72 73  his "known" vers
19b00 69 6f 6e 20 6f 66 20 4d 6f 6e 6f 2e 0d 0a 20 20  ion of Mono...  
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
19b30 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 6f 6e       lappend mon
19b40 6f 56 65 72 73 69 6f 6e 73 20 24 6d 6f 6e 6f 56  oVersions $monoV
19b50 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
19b60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19b70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19b80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19b90 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19ba0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19bb0 41 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  Add the necessar
19bc0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  y constraints fo
19bd0 72 20 65 61 63 68 20 76 65 72 73 69 6f 6e 20 6f  r each version o
19be0 66 20 4d 6f 6e 6f 0d 0a 20 20 20 20 20 20 20 20  f Mono..        
19bf0 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 73      #       we s
19c00 68 6f 75 6c 64 20 4e 4f 54 20 73 6b 69 70 20 62  hould NOT skip b
19c10 75 67 73 20 66 6f 72 2e 0d 0a 20 20 20 20 20 20  ugs for...      
19c20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19c30 20 20 20 20 20 66 6f 72 65 61 63 68 20 6d 6f 6e       foreach mon
19c40 6f 56 65 72 73 69 6f 6e 20 24 6d 6f 6e 6f 56 65  oVersion $monoVe
19c50 72 73 69 6f 6e 73 20 7b 0d 0a 20 20 20 20 20 20  rsions {..      
19c60 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 73          set cons
19c70 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 5b 6a  traintVersion [j
19c80 6f 69 6e 20 24 6d 6f 6e 6f 56 65 72 73 69 6f 6e  oin $monoVersion
19c90 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   ""]....        
19ca0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
19cb0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
19cc0 6d 6f 6e 6f 20 24 63 6f 6e 73 74 72 61 69 6e 74  mono $constraint
19cd0 56 65 72 73 69 6f 6e 20 4f 72 48 69 67 68 65 72  Version OrHigher
19ce0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
19cf0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
19d00 61 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f 54  appendArgs monoT
19d10 6f 44 6f 20 24 63 6f 6e 73 74 72 61 69 6e 74 56  oDo $constraintV
19d20 65 72 73 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ersion]..       
19d30 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
19d40 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
19d50 20 6d 6f 6e 6f 42 75 67 20 24 63 6f 6e 73 74 72   monoBug $constr
19d60 61 69 6e 74 56 65 72 73 69 6f 6e 5d 0d 0a 20 20  aintVersion]..  
19d70 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
19d80 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
19d90 64 41 72 67 73 20 6d 6f 6e 6f 43 72 61 73 68 20  dArgs monoCrash 
19da0 24 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69  $constraintVersi
19db0 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on]..           
19dc0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
19dd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19de0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 61   # NOTE: Check a
19df0 6c 6c 20 6b 6e 6f 77 6e 20 76 65 72 73 69 6f 6e  ll known version
19e00 73 20 6f 66 20 4d 6f 6e 6f 20 66 6f 72 20 61 6e  s of Mono for an
19e10 20 65 78 61 63 74 20 6d 61 74 63 68 20 77 69 74   exact match wit
19e20 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  h..            #
19e30 20 20 20 20 20 20 20 74 68 65 20 63 75 72 72 65         the curre
19e40 6e 74 6c 79 20 72 75 6e 6e 69 6e 67 20 6f 6e 65  ntly running one
19e50 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
19e60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ..            fo
19e70 72 65 61 63 68 20 6d 6f 6e 6f 56 65 72 73 69 6f  reach monoVersio
19e80 6e 20 5b 67 65 74 4b 6e 6f 77 6e 4d 6f 6e 6f 56  n [getKnownMonoV
19e90 65 72 73 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ersions] {..    
19ea0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
19eb0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
19ec0 45 3a 20 43 68 65 63 6b 20 69 66 20 4d 6f 6e 6f  E: Check if Mono
19ed0 20 6d 61 6a 6f 72 2f 6d 69 6e 6f 72 20 76 65 72   major/minor ver
19ee0 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  sion is exactly 
19ef0 74 68 65 20 6f 6e 65 0d 0a 20 20 20 20 20 20 20  the one..       
19f00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
19f10 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
19f20 70 72 6f 63 65 73 73 69 6e 67 2e 0d 0a 20 20 20  processing...   
19f30 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19f40 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
19f50 63 6f 6e 73 74 72 61 69 6e 74 56 65 72 73 69 6f  constraintVersio
19f60 6e 20 5b 6a 6f 69 6e 20 24 6d 6f 6e 6f 56 65 72  n [join $monoVer
19f70 73 69 6f 6e 20 22 22 5d 0d 0a 0d 0a 20 20 20 20  sion ""]....    
19f80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
19f90 69 6e 64 65 78 20 24 6d 6f 6e 6f 56 65 72 73 69  index $monoVersi
19fa0 6f 6e 20 30 5d 20 3d 3d 20 24 6d 61 6a 6f 72 56  on 0] == $majorV
19fb0 65 72 73 69 6f 6e 20 26 26 20 5c 0d 0a 20 20 20  ersion && \..   
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
19fd0 6c 69 6e 64 65 78 20 24 6d 6f 6e 6f 56 65 72 73  lindex $monoVers
19fe0 69 6f 6e 20 31 5d 20 3d 3d 20 24 6d 69 6e 6f 72  ion 1] == $minor
19ff0 56 65 72 73 69 6f 6e 7d 20 74 68 65 6e 20 7b 0d  Version} then {.
1a000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a010 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1a020 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
1a030 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
1a040 20 74 68 61 74 20 6f 6e 6c 79 20 61 70 70 6c 79   that only apply
1a050 20 74 6f 20 74 68 69 73 20 65 78 61 63 74 0d 0a   to this exact..
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20  #       version 
1a080 6f 66 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20  of Mono...      
1a090 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
1a0b0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1a0c0 6e 64 41 72 67 73 20 6d 6f 6e 6f 20 24 63 6f 6e  ndArgs mono $con
1a0d0 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 4f  straintVersion O
1a0e0 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  nly]..          
1a0f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1a110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a120 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 65 73   # NOTE: Add tes
1a130 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  t constraints th
1a140 61 74 20 61 70 70 6c 79 20 74 6f 20 61 6c 6c 20  at apply to all 
1a150 76 65 72 73 69 6f 6e 73 20 6f 66 0d 0a 20 20 20  versions of..   
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1a170 20 20 20 20 20 4d 6f 6e 6f 20 65 78 63 65 70 74       Mono except
1a180 20 74 68 69 73 20 65 78 61 63 74 20 76 65 72 73   this exact vers
1a190 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
1a1a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a1b0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1a1c0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1a1d0 67 73 20 6d 6f 6e 6f 54 6f 44 6f 20 24 63 6f 6e  gs monoToDo $con
1a1e0 73 74 72 61 69 6e 74 56 65 72 73 69 6f 6e 20 4f  straintVersion O
1a1f0 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  nly]..          
1a200 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
1a210 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
1a220 6d 6f 6e 6f 42 75 67 20 24 63 6f 6e 73 74 72 61  monoBug $constra
1a230 69 6e 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d  intVersion Only]
1a240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a250 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1a260 5b 61 70 70 65 6e 64 41 72 67 73 20 6d 6f 6e 6f  [appendArgs mono
1a270 43 72 61 73 68 20 24 63 6f 6e 73 74 72 61 69 6e  Crash $constrain
1a280 74 56 65 72 73 69 6f 6e 20 4f 6e 6c 79 5d 0d 0a  tVersion Only]..
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1a2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a2b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1a2c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a2d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a2e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
1a2f0 20 74 68 65 20 72 75 6e 74 69 6d 65 20 76 65 72   the runtime ver
1a300 73 69 6f 6e 20 77 61 73 20 66 6f 75 6e 64 2c 20  sion was found, 
1a310 61 64 64 20 61 20 74 65 73 74 20 63 6f 6e 73 74  add a test const
1a320 72 61 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 20  raint..         
1a330 20 23 20 20 20 20 20 20 20 66 6f 72 20 69 74 20   #       for it 
1a340 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
1a350 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1a360 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1a370 24 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74  $version] > 0} t
1a380 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a390 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a3a0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
1a3b0 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 74 68 65 20   running on the 
1a3c0 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20  .NET Framework. 
1a3d0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
1a3e0 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
1a3f0 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  #       specific
1a400 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 61   version for usa
1a410 67 65 20 69 6e 20 74 65 73 74 20 63 6f 6e 73 74  ge in test const
1a420 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
1a430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a440 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1a450 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 6f  t [appendArgs do
1a460 74 4e 65 74 20 24 76 65 72 73 69 6f 6e 5d 0d 0a  tNet $version]..
1a470 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
1a480 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1a490 64 41 72 67 73 20 64 6f 74 4e 65 74 20 24 76 65  dArgs dotNet $ve
1a4a0 72 73 69 6f 6e 20 4f 72 48 69 67 68 65 72 5d 0d  rsion OrHigher].
1a4b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1a4c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a4d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
1a4e0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
1a4f0 20 73 6b 69 70 20 61 6e 79 20 4d 6f 6e 6f 20 62   skip any Mono b
1a500 75 67 73 20 6f 6e 20 2e 4e 45 54 2e 20 20 41 64  ugs on .NET.  Ad
1a510 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  d the..         
1a520 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61   #       necessa
1a530 72 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  ry constraints f
1a540 6f 72 20 65 61 63 68 20 76 65 72 73 69 6f 6e 20  or each version 
1a550 6f 66 20 4d 6f 6e 6f 20 77 65 20 6b 6e 6f 77 0d  of Mono we know.
1a560 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1a570 20 20 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20     about...     
1a580 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a590 20 20 61 64 64 4b 6e 6f 77 6e 4d 6f 6e 6f 43 6f    addKnownMonoCo
1a5a0 6e 73 74 72 61 69 6e 74 73 20 66 61 6c 73 65 3b  nstraints false;
1a5b0 20 23 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e   # running on .N
1a5c0 45 54 2e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ET...        }..
1a5d0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1a5e0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a5f0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a600 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61      $::eagle_pla
1a610 74 66 6f 72 6d 28 72 75 6e 74 69 6d 65 56 65 72  tform(runtimeVer
1a620 73 69 6f 6e 29 20 22 20 28 22 20 24 64 6f 74 56  sion) " (" $dotV
1a630 65 72 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20  ersion ")\n"].. 
1a640 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a650 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a660 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
1a670 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1a680 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1a690 50 72 6f 63 65 73 73 42 69 74 73 20 7b 20 63 68  ProcessBits { ch
1a6a0 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
1a6b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1a6c0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1a6d0 6f 72 20 70 72 6f 63 65 73 73 20 62 69 74 73 2e  or process bits.
1a6e0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
1a6f0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1a700 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 72  :tcl_platform(pr
1a710 6f 63 65 73 73 42 69 74 73 29 5d 20 26 26 20 5c  ocessBits)] && \
1a720 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1a730 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d  ing is integer -
1a740 73 74 72 69 63 74 20 24 3a 3a 74 63 6c 5f 70 6c  strict $::tcl_pl
1a750 61 74 66 6f 72 6d 28 70 72 6f 63 65 73 73 42 69  atform(processBi
1a760 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
1a770 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
1a780 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
1a790 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
1a7a0 70 72 6f 63 65 73 73 42 69 74 73 29 20 62 69 74  processBits) bit
1a7b0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
1a7c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1a7d0 65 6e 64 41 72 67 73 20 24 3a 3a 74 63 6c 5f 70  endArgs $::tcl_p
1a7e0 6c 61 74 66 6f 72 6d 28 70 72 6f 63 65 73 73 42  latform(processB
1a7f0 69 74 73 29 20 2d 62 69 74 5c 6e 5d 0d 0a 20 20  its) -bit\n]..  
1a800 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1a810 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1a820 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
1a830 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1a840 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1a850 6b 46 6f 72 4d 61 63 68 69 6e 65 20 7b 20 63 68  kForMachine { ch
1a860 61 6e 6e 65 6c 20 62 69 74 73 20 6d 61 63 68 69  annel bits machi
1a870 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  ne } {..      tp
1a880 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1a890 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
1a8a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 6d 61 63 68  hecking for mach
1a8b0 69 6e 65 20 5c 22 22 20 24 62 69 74 73 20 5c 0d  ine \"" $bits \.
1a8c0 0a 20 20 20 20 20 20 20 20 20 20 22 2d 62 69 74  .          "-bit
1a8d0 20 22 20 24 6d 61 63 68 69 6e 65 20 22 5c 22 2e   " $machine "\".
1a8e0 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  .. "]....      #
1a8f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a900 57 68 61 74 20 61 72 65 20 74 68 65 20 6d 61 63  What are the mac
1a910 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72  hine architectur
1a920 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
1a930 20 23 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20   #       number 
1a940 6f 66 20 62 69 74 73 20 66 6f 72 20 74 68 69 73  of bits for this
1a950 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1a960 6d 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m?..      #..   
1a970 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1a980 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
1a990 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 26 26 20  rm(machine)] && 
1a9a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e  \..          [in
1a9b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
1a9c0 70 6c 61 74 66 6f 72 6d 28 70 72 6f 63 65 73 73  platform(process
1a9d0 42 69 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Bits)]} then {..
1a9e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a9f0 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
1aa00 74 68 65 20 6d 61 63 68 69 6e 65 20 61 6e 64 20  the machine and 
1aa10 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 6d  number of bits m
1aa20 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 23 20  atch..        # 
1aa30 20 20 20 20 20 20 77 68 61 74 20 74 68 65 20 63        what the c
1aa40 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 3f  aller specified?
1aa50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1aa60 20 20 20 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f       if {$::tcl_
1aa70 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
1aa80 29 20 65 71 20 24 6d 61 63 68 69 6e 65 20 26 26  ) eq $machine &&
1aa90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1aaa0 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
1aab0 70 72 6f 63 65 73 73 42 69 74 73 29 20 65 71 20  processBits) eq 
1aac0 24 62 69 74 73 7d 20 74 68 65 6e 20 7b 0d 0a 20  $bits} then {.. 
1aad0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1aae0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
1aaf0 73 2c 20 69 74 20 6d 61 74 63 68 65 73 2e 0d 0a  s, it matches...
1ab00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ab10 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1ab20 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1ab30 20 24 6d 61 63 68 69 6e 65 20 2e 20 24 62 69 74   $machine . $bit
1ab40 73 20 62 69 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  s bit]....      
1ab50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1ab60 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
1ab70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ab80 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1ab90 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
1aba0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1abb0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1abc0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 6e 6f  uts $channel "no
1abd0 2c 20 75 6e 6b 6e 6f 77 6e 5c 6e 22 0d 0a 20 20  , unknown\n"..  
1abe0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1abf0 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
1ac00 6f 72 54 65 73 74 43 61 6c 6c 53 74 61 63 6b 20  orTestCallStack 
1ac10 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
1ac20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ac30 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
1ac40 6e 67 20 66 6f 72 20 74 65 73 74 20 63 61 6c 6c  ng for test call
1ac50 20 73 74 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20   stack... ".... 
1ac60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1ac70 4e 4f 54 45 3a 20 53 65 61 72 63 68 20 66 6f 72  NOTE: Search for
1ac80 20 61 20 63 61 6c 6c 20 66 72 61 6d 65 20 77 69   a call frame wi
1ac90 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 61 72  th associated ar
1aca0 67 75 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20  guments...      
1acb0 23 20 20 20 20 20 20 20 41 74 20 74 68 69 73 20  #       At this 
1acc0 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 6d 75 73  point, there mus
1acd0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
1ace0 65 20 73 75 63 68 20 63 61 6c 6c 0d 0a 20 20 20  e such call..   
1acf0 20 20 20 23 20 20 20 20 20 20 20 66 72 61 6d 65     #       frame
1ad00 20 28 74 68 69 73 20 6f 6e 65 29 2e 20 20 54 68   (this one).  Th
1ad10 65 72 65 66 6f 72 65 2c 20 74 68 69 73 20 6c 6f  erefore, this lo
1ad20 6f 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 0d 0a  op will always..
1ad30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
1ad40 72 6d 69 6e 61 74 65 2e 0d 0a 20 20 20 20 20 20  rminate...      
1ad50 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 6e 64  #..      set ind
1ad60 65 78 20 30 3b 20 73 65 74 20 61 72 67 75 6d 65  ex 0; set argume
1ad70 6e 74 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20  nts [list]..    
1ad80 20 20 73 65 74 20 73 63 72 69 70 74 20 7b 69 6e    set script {in
1ad90 66 6f 20 6c 65 76 65 6c 20 5b 69 6e 66 6f 20 6c  fo level [info l
1ada0 65 76 65 6c 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20  evel]}....      
1adb0 77 68 69 6c 65 20 7b 31 7d 20 7b 0d 0a 20 20 20  while {1} {..   
1adc0 20 20 20 20 20 73 65 74 20 6c 65 76 65 6c 20 5b       set level [
1add0 61 70 70 65 6e 64 41 72 67 73 20 23 23 20 24 69  appendArgs ## $i
1ade0 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ndex]....       
1adf0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c   if {[catch {upl
1ae00 65 76 65 6c 20 24 6c 65 76 65 6c 20 24 73 63 72  evel $level $scr
1ae10 69 70 74 7d 20 61 72 67 75 6d 65 6e 74 73 5d 20  ipt} arguments] 
1ae20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1ae30 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20          break.. 
1ae40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ae50 20 20 20 20 69 6e 63 72 20 69 6e 64 65 78 0d 0a      incr index..
1ae60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ae70 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1ae80 3a 20 47 72 61 62 20 74 68 65 20 63 6f 6d 6d 61  : Grab the comma
1ae90 6e 64 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  nd name from the
1aea0 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61   arguments, if a
1aeb0 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ny...      #..  
1aec0 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20      set command 
1aed0 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
1aee0 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 75 6d   [llength $argum
1aef0 65 6e 74 73 5d 20 3e 20 30 20 3f 20 5b 6c 69 6e  ents] > 0 ? [lin
1af00 64 65 78 20 24 61 72 67 75 6d 65 6e 74 73 20 30  dex $arguments 0
1af10 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 7d 5d  ] : ""..      }]
1af20 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1af30 20 20 20 23 20 48 41 43 4b 3a 20 4d 61 6b 65 20     # HACK: Make 
1af40 73 75 72 65 20 74 68 65 20 63 61 6c 6c 20 73 74  sure the call st
1af50 61 63 6b 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64  ack does not end
1af60 20 75 70 20 63 6f 6e 66 75 73 69 6e 67 0d 0a 20   up confusing.. 
1af70 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1af80 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
1af90 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 63 61 6c   on absolute cal
1afa0 6c 20 66 72 61 6d 65 73 2e 20 20 54 68 65 0d 0a  l frames.  The..
1afb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 72        #       [r
1afc0 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
1afd0 69 73 20 61 6c 6c 6f 77 65 64 20 68 65 72 65 20  is allowed here 
1afe0 62 65 63 61 75 73 65 20 69 74 20 77 69 6c 6c 0d  because it will.
1aff0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
1b000 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
1b010 74 68 65 20 63 61 6c 6c 20 73 74 61 63 6b 20 61  the call stack a
1b020 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 65 0d  t the point the.
1b030 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
1b040 65 73 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ests are actuall
1b050 79 20 72 75 6e 2e 20 20 41 63 74 75 61 6c 6c 79  y run.  Actually
1b060 2c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  , the same thing
1b070 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b080 67 6f 65 73 20 66 6f 72 20 5b 63 68 65 63 6b 46  goes for [checkF
1b090 6f 72 54 65 73 74 43 61 6c 6c 53 74 61 63 6b 5d  orTestCallStack]
1b0a0 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20   as well...     
1b0b0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63   #..      if {$c
1b0c0 6f 6d 6d 61 6e 64 20 69 6e 20 5c 0d 0a 20 20 20  ommand in \..   
1b0d0 20 20 20 20 20 20 20 5b 6c 69 73 74 20 72 75 6e         [list run
1b0e0 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 63 68 65  TestPrologue che
1b0f0 63 6b 46 6f 72 54 65 73 74 43 61 6c 6c 53 74 61  ckForTestCallSta
1b100 63 6b 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ck]} then {..   
1b110 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1b120 6e 74 20 74 65 73 74 43 61 6c 6c 53 74 61 63 6b  nt testCallStack
1b130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1b140 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1b150 6e 64 41 72 67 73 20 22 79 65 73 20 28 5c 22 22  ndArgs "yes (\""
1b160 20 24 63 6f 6d 6d 61 6e 64 20 22 5c 22 29 5c 6e   $command "\")\n
1b170 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  "]....        #.
1b180 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b190 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   We are done her
1b1a0 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a  e, return now...
1b1b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b1c0 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
1b1d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74   }....      tput
1b1e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1b1f0 6e 64 41 72 67 73 20 22 6e 6f 20 28 5c 22 22 20  ndArgs "no (\"" 
1b200 24 63 6f 6d 6d 61 6e 64 20 22 5c 22 29 5c 6e 22  $command "\")\n"
1b210 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
1b220 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 47 61   proc checkForGa
1b230 72 75 64 61 44 6c 6c 20 7b 20 63 68 61 6e 6e 65  rudaDll { channe
1b240 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  l } {..      #..
1b250 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1b260 69 70 20 61 75 74 6f 6d 61 74 69 63 20 54 63 6c  ip automatic Tcl
1b270 20 73 68 65 6c 6c 20 6d 61 63 68 69 6e 65 20 64   shell machine d
1b280 65 74 65 63 74 69 6f 6e 20 69 66 20 77 65 20 61  etection if we a
1b290 72 65 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20  re not..      # 
1b2a0 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f        allowed to
1b2b0 20 65 78 65 63 75 74 65 20 65 78 74 65 72 6e 61   execute externa
1b2c0 6c 20 63 6f 6d 6d 61 6e 64 73 2e 0d 0a 20 20 20  l commands...   
1b2d0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1b2e0 5b 63 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c  [canExecTclShell
1b2f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b300 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b310 4e 4f 54 45 3a 20 48 61 76 65 20 74 68 65 20 5b  NOTE: Have the [
1b320 67 65 74 47 61 72 75 64 61 44 6c 6c 5d 20 70 72  getGarudaDll] pr
1b330 6f 63 65 64 75 72 65 20 61 75 74 6f 6d 61 74 69  ocedure automati
1b340 63 61 6c 6c 79 20 64 65 74 65 63 74 20 74 68 65  cally detect the
1b350 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1b360 20 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20    machine...    
1b370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1b380 65 74 20 6d 61 63 68 69 6e 65 20 22 22 0d 0a 20  et machine "".. 
1b390 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1b3a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b3b0 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1b3c0 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68  e machine for th
1b3d0 69 73 20 74 65 73 74 20 72 75 6e 2e 0d 0a 20 20  is test run...  
1b3e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b3f0 20 73 65 74 20 6d 61 63 68 69 6e 65 20 5b 67 65   set machine [ge
1b400 74 54 65 73 74 4d 61 63 68 69 6e 65 5d 0d 0a 0d  tTestMachine]...
1b410 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b420 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63      # NOTE: Sinc
1b430 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
1b440 67 20 6d 65 61 6e 73 20 22 61 75 74 6f 6d 61 74  g means "automat
1b450 69 63 61 6c 6c 79 20 64 65 74 65 63 74 22 20 74  ically detect" t
1b460 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  o the..        #
1b470 20 20 20 20 20 20 20 5b 67 65 74 47 61 72 75 64         [getGarud
1b480 61 44 6c 6c 5d 20 70 72 6f 63 65 64 75 72 65 2c  aDll] procedure,
1b490 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
1b4a0 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 0d  re the value is.
1b4b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1b4c0 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 2e   something else.
1b4d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b4e0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1b4f0 20 6c 65 6e 67 74 68 20 24 6d 61 63 68 69 6e 65   length $machine
1b500 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1b510 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 61            set ma
1b520 63 68 69 6e 65 20 75 6e 6b 6e 6f 77 6e 0d 0a 20  chine unknown.. 
1b530 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b540 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1b550 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1b560 6b 20 66 6f 72 20 74 68 65 20 47 61 72 75 64 61  k for the Garuda
1b570 20 44 4c 4c 20 6f 66 20 74 68 65 20 73 61 6d 65   DLL of the same
1b580 20 70 6c 61 74 66 6f 72 6d 20 28 69 2e 65 2e 20   platform (i.e. 
1b590 6d 61 63 68 69 6e 65 0d 0a 20 20 20 20 20 20 23  machine..      #
1b5a0 20 20 20 20 20 20 20 74 79 70 65 29 20 61 73 20         type) as 
1b5b0 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c 20 73  the native Tcl s
1b5c0 68 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  hell...      #..
1b5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 63 68        return [ch
1b5e0 65 63 6b 46 6f 72 46 69 6c 65 20 24 63 68 61 6e  eckForFile $chan
1b5f0 6e 65 6c 20 5b 67 65 74 47 61 72 75 64 61 44 6c  nel [getGarudaDl
1b600 6c 20 24 6d 61 63 68 69 6e 65 5d 5d 0d 0a 20 20  l $machine]]..  
1b610 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1b620 20 63 68 65 63 6b 46 6f 72 43 75 6c 74 75 72 65   checkForCulture
1b630 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
1b640 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b650 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
1b660 69 6e 67 20 66 6f 72 20 63 75 6c 74 75 72 65 2e  ing for culture.
1b670 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .. "....      #.
1b680 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47  .      # NOTE: G
1b690 72 61 62 20 74 68 65 20 63 75 72 72 65 6e 74 20  rab the current 
1b6a0 63 75 6c 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  culture...      
1b6b0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 75 6c  #..      set cul
1b6c0 74 75 72 65 20 5b 69 6e 66 6f 20 63 75 6c 74 75  ture [info cultu
1b6d0 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  re]....      if 
1b6e0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1b6f0 24 63 75 6c 74 75 72 65 5d 20 3e 20 30 7d 20 74  $culture] > 0} t
1b700 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1b710 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1b720 3a 20 54 68 65 20 63 75 6c 74 75 72 65 20 69 6e  : The culture in
1b730 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 72 65  formation is pre
1b740 73 65 6e 74 2c 20 75 73 65 20 69 74 20 61 6e 64  sent, use it and
1b750 20 73 68 6f 77 20 69 74 2e 0d 0a 20 20 20 20 20   show it...     
1b760 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
1b770 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1b780 65 6e 64 41 72 67 73 20 63 75 6c 74 75 72 65 2e  endArgs culture.
1b790 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
1b7a0 73 74 20 2d 20 5f 5d 20 24 63 75 6c 74 75 72 65  st - _] $culture
1b7b0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ]]....        tp
1b7c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1b7d0 70 65 6e 64 41 72 67 73 20 24 63 75 6c 74 75 72  pendArgs $cultur
1b7e0 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  e \n]..      } e
1b7f0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1b800 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e  puts $channel un
1b810 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 7d  known\n..      }
1b820 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1b830 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 54 68 72  proc checkForThr
1b840 65 61 64 43 75 6c 74 75 72 65 20 7b 20 63 68 61  eadCulture { cha
1b850 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
1b860 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1b870 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
1b880 72 20 74 68 72 65 61 64 20 63 75 6c 74 75 72 65  r thread culture
1b890 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23  ... "....      #
1b8a0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1b8b0 47 72 61 62 20 74 68 65 20 63 75 72 72 65 6e 74  Grab the current
1b8c0 20 74 68 72 65 61 64 20 63 75 6c 74 75 72 65 2e   thread culture.
1b8d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b8e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1b8f0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1b900 76 6f 6b 65 20 53 79 73 74 65 6d 2e 54 68 72 65  voke System.Thre
1b910 61 64 69 6e 67 2e 54 68 72 65 61 64 2e 43 75 72  ading.Thread.Cur
1b920 72 65 6e 74 54 68 72 65 61 64 20 43 75 72 72 65  rentThread Curre
1b930 6e 74 43 75 6c 74 75 72 65 0d 0a 20 20 20 20 20  ntCulture..     
1b940 20 7d 20 63 75 6c 74 75 72 65 5d 20 3d 3d 20 30   } culture] == 0
1b950 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
1b960 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1b970 6f 6b 65 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f  oke Eagle._Compo
1b980 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f  nents.Private.Fo
1b990 72 6d 61 74 4f 70 73 20 43 75 6c 74 75 72 65 4e  rmatOps CultureN
1b9a0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1b9b0 20 20 20 24 63 75 6c 74 75 72 65 20 66 61 6c 73     $culture fals
1b9c0 65 0d 0a 20 20 20 20 20 20 7d 20 63 75 6c 74 75  e..      } cultu
1b9d0 72 65 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72  re] == 0 && [str
1b9e0 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 75 6c 74  ing length $cult
1b9f0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
1ba00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ba10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
1ba20 20 63 75 6c 74 75 72 65 20 69 6e 66 6f 72 6d 61   culture informa
1ba30 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 2c  tion is present,
1ba40 20 75 73 65 20 69 74 20 61 6e 64 20 73 68 6f 77   use it and show
1ba50 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
1ba60 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
1ba70 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1ba80 67 73 20 74 68 72 65 61 64 43 75 6c 74 75 72 65  gs threadCulture
1ba90 2e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  . [string map [l
1baa0 69 73 74 20 2d 20 5f 5d 20 5c 0d 0a 20 20 20 20  ist - _] \..    
1bab0 20 20 20 20 20 20 20 20 24 63 75 6c 74 75 72 65          $culture
1bac0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ]]....        tp
1bad0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1bae0 70 65 6e 64 41 72 67 73 20 24 63 75 6c 74 75 72  pendArgs $cultur
1baf0 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  e \n]..      } e
1bb00 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1bb10 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e  puts $channel un
1bb20 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 7d  known\n..      }
1bb30 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bb40 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 51 75 69  proc checkForQui
1bb50 65 74 20 7b 20 63 68 61 6e 6e 65 6c 20 71 75 69  et { channel qui
1bb60 65 74 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  et } {..      if
1bb70 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1bb80 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1bb90 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
1bba0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 71 75 69  checking for qui
1bbb0 65 74 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  et... "..      }
1bbc0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
1bbd0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1bbe0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
1bbf0 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1bc00 69 76 65 20 51 75 69 65 74 0d 0a 20 20 20 20 20  ive Quiet..     
1bc10 20 7d 20 69 73 51 75 69 65 74 5d 20 3d 3d 20 30   } isQuiet] == 0
1bc20 20 26 26 20 5b 73 74 72 69 6e 67 20 69 73 20 74   && [string is t
1bc30 72 75 65 20 2d 73 74 72 69 63 74 20 24 69 73 51  rue -strict $isQ
1bc40 75 69 65 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  uiet]} then {.. 
1bc50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bc60 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 71    # NOTE: Yes, q
1bc70 75 69 65 74 20 6d 6f 64 65 20 69 73 20 65 6e 61  uiet mode is ena
1bc80 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  bled...        #
1bc90 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1bca0 73 74 72 61 69 6e 74 20 71 75 69 65 74 0d 0a 0d  straint quiet...
1bcb0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
1bcc0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1bcd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1bce0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
1bcf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1bd00 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bd10 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1bd20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bd30 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
1bd40 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  o\n..        }..
1bd50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1bd60 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1bd70 6b 46 6f 72 52 65 66 65 72 65 6e 63 65 43 6f 75  kForReferenceCou
1bd80 6e 74 54 72 61 63 6b 69 6e 67 20 7b 20 63 68 61  ntTracking { cha
1bd90 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
1bda0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1bdb0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
1bdc0 72 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  r object referen
1bdd0 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
1bde0 67 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  g... "....      
1bdf0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1be00 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72   ::eagle_platfor
1be10 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  m(compileOptions
1be20 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
1be30 20 20 20 28 5b 6c 73 65 61 72 63 68 20 2d 65 78     ([lsearch -ex
1be40 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 3a 3a 65  act -nocase $::e
1be50 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f  agle_platform(co
1be60 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 29 20 5c 0d  mpileOptions) \.
1be70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e  .              N
1be80 4f 54 49 46 59 5d 20 21 3d 20 2d 31 20 7c 7c 20  OTIFY] != -1 || 
1be90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 5b 6c  \..           [l
1bea0 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
1beb0 6f 63 61 73 65 20 24 3a 3a 65 61 67 6c 65 5f 70  ocase $::eagle_p
1bec0 6c 61 74 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f  latform(compileO
1bed0 70 74 69 6f 6e 73 29 20 5c 0d 0a 20 20 20 20 20  ptions) \..     
1bee0 20 20 20 20 20 20 20 20 20 4e 4f 54 49 46 59 5f           NOTIFY_
1bef0 4f 42 4a 45 43 54 5d 20 21 3d 20 2d 31 29 7d 20  OBJECT] != -1)} 
1bf00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bf10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1bf20 45 3a 20 59 65 73 2c 20 73 75 70 70 6f 72 74 20  E: Yes, support 
1bf30 66 6f 72 20 6f 62 6a 65 63 74 20 72 65 66 65 72  for object refer
1bf40 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
1bf50 69 6e 67 20 69 73 20 70 72 65 73 65 6e 74 2e 0d  ing is present..
1bf60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1bf70 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1bf80 74 20 72 65 66 43 6f 75 6e 74 0d 0a 0d 0a 20 20  t refCount....  
1bf90 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1bfa0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1bfb0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1bfc0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1bfd0 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
1bfe0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bff0 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 52 75 6e  proc checkForRun
1c000 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 63 68 61  timeOption { cha
1c010 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 7d 20 7b 0d  nnel option } {.
1c020 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
1c030 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c040 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
1c050 20 66 6f 72 20 72 75 6e 74 69 6d 65 20 6f 70 74   for runtime opt
1c060 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
1c070 20 20 20 20 20 24 6f 70 74 69 6f 6e 20 22 5c 22       $option "\"
1c080 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
1c090 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1c0a0 20 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72   ::eagle_platfor
1c0b0 6d 28 72 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 73  m(runtimeOptions
1c0c0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
1c0d0 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61     [lsearch -exa
1c0e0 63 74 20 2d 6e 6f 63 61 73 65 20 24 3a 3a 65 61  ct -nocase $::ea
1c0f0 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 72 75 6e  gle_platform(run
1c100 74 69 6d 65 4f 70 74 69 6f 6e 73 29 20 5c 0d 0a  timeOptions) \..
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6f                $o
1c120 70 74 69 6f 6e 5d 20 21 3d 20 2d 31 7d 20 74 68  ption] != -1} th
1c130 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1c140 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1c150 20 59 65 73 2c 20 73 75 70 70 6f 72 74 20 66 6f   Yes, support fo
1c160 72 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 70  r the runtime op
1c170 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 2e  tion is present.
1c180 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c190 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1c1a0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 72  nt [appendArgs r
1c1b0 75 6e 74 69 6d 65 2e 20 24 6f 70 74 69 6f 6e 5d  untime. $option]
1c1c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1c1d0 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
1c1e0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1c1f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1c200 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
1c210 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1c220 0d 0a 20 20 20 20 70 72 6f 63 20 74 65 73 74 46  ..    proc testF
1c230 6f 72 44 79 6e 61 6d 69 63 4c 6f 61 64 69 6e 67  orDynamicLoading
1c240 20 7b 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d   { {fileName ""}
1c250 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1c260 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1c270 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1c280 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
1c290 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1c2a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57          if {[isW
1c2b0 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d  indows]} then {.
1c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
1c2d0 20 66 69 6c 65 4e 61 6d 65 20 6b 65 72 6e 65 6c   fileName kernel
1c2e0 33 32 3b 20 23 20 48 41 43 4b 3a 20 41 6c 77 61  32; # HACK: Alwa
1c2f0 79 73 20 70 72 65 2d 6c 6f 61 64 65 64 3f 0d 0a  ys pre-loaded?..
1c300 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1c310 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1c320 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
1c330 6f 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  os)] && \..     
1c340 20 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f           $::tcl_
1c350 70 6c 61 74 66 6f 72 6d 28 6f 73 29 20 65 71 20  platform(os) eq 
1c360 22 44 61 72 77 69 6e 22 7d 20 74 68 65 6e 20 7b  "Darwin"} then {
1c370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1c380 74 20 66 69 6c 65 4e 61 6d 65 20 6c 69 62 64 6c  t fileName libdl
1c390 2e 64 79 6c 69 62 3b 20 23 20 54 4f 44 4f 3a 20  .dylib; # TODO: 
1c3a0 47 6f 6f 64 20 64 65 66 61 75 6c 74 3f 0d 0a 20  Good default?.. 
1c3b0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1c3c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
1c3d0 65 74 20 66 69 6c 65 4e 61 6d 65 20 6c 69 62 64  et fileName libd
1c3e0 6c 2e 73 6f 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  l.so; # TODO: Go
1c3f0 6f 64 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20  od default?..   
1c400 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c410 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
1c420 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 0d 0a 0d  et error null...
1c430 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
1c440 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1c450 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1c460 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43          Eagle._C
1c470 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74  omponents.Privat
1c480 65 2e 4e 61 74 69 76 65 4f 70 73 20 54 65 73 74  e.NativeOps Test
1c490 4c 6f 61 64 4c 69 62 72 61 72 79 20 5c 0d 0a 20  LoadLibrary \.. 
1c4a0 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
1c4b0 4e 61 6d 65 20 65 72 72 6f 72 0d 0a 20 20 20 20  Name error..    
1c4c0 20 20 7d 20 63 6f 64 65 5d 20 3d 3d 20 30 20 26    } code] == 0 &
1c4d0 26 20 24 63 6f 64 65 20 65 71 20 22 4f 6b 22 7d  & $code eq "Ok"}
1c4e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c4f0 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
1c500 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
1c510 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
1c520 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1c530 63 68 65 63 6b 46 6f 72 44 79 6e 61 6d 69 63 4c  checkForDynamicL
1c540 6f 61 64 69 6e 67 20 7b 20 63 68 61 6e 6e 65 6c  oading { channel
1c550 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
1c560 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1c570 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 79   checking for dy
1c580 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67 2e 2e 2e  namic loading...
1c590 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
1c5a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 73 20       # NOTE: As 
1c5b0 66 61 72 20 61 73 20 77 65 20 6b 6e 6f 77 2c 20  far as we know, 
1c5c0 64 79 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67 20  dynamic loading 
1c5d0 61 6c 77 61 79 73 20 77 6f 72 6b 73 20 6f 6e 20  always works on 
1c5e0 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20  Windows...      
1c5f0 23 20 20 20 20 20 20 20 4f 6e 20 73 6f 6d 65 20  #       On some 
1c600 55 6e 69 78 20 73 79 73 74 65 6d 73 2c 20 64 6c  Unix systems, dl
1c610 6f 70 65 6e 20 64 6f 65 73 20 6e 6f 74 20 77 6f  open does not wo
1c620 72 6b 20 28 65 2e 67 2e 20 62 65 63 61 75 73 65  rk (e.g. because
1c630 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c640 4d 6f 6e 6f 20 69 73 20 73 74 61 74 69 63 61 6c  Mono is statical
1c650 6c 79 20 6c 69 6e 6b 65 64 2c 20 65 74 63 29 2e  ly linked, etc).
1c660 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c670 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d   if {[isWindows]
1c680 20 7c 7c 20 5b 74 65 73 74 46 6f 72 44 79 6e 61   || [testForDyna
1c690 6d 69 63 4c 6f 61 64 69 6e 67 5d 7d 20 74 68 65  micLoading]} the
1c6a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1c6b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c6c0 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
1c6d0 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c  that it is avail
1c6e0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
1c6f0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1c700 73 74 72 61 69 6e 74 20 64 79 6e 61 6d 69 63 0d  straint dynamic.
1c710 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1c720 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
1c730 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1c740 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1c750 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
1c760 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1c770 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
1c780 6f 72 57 69 6e 64 6f 77 73 46 6f 72 6d 73 20 7b  orWindowsForms {
1c790 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
1c7a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c7b0 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
1c7c0 67 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 46 6f  g for Windows Fo
1c7d0 72 6d 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  rms... "....    
1c7e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43    #..      # HAC
1c7f0 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  K: When running 
1c800 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 64  on Windows, we d
1c810 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f  o not need to do
1c820 20 61 6e 79 20 6f 74 68 65 72 0d 0a 20 20 20 20   any other..    
1c830 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69 61    #       specia
1c840 6c 20 63 68 65 63 6b 73 20 68 65 72 65 3b 20 68  l checks here; h
1c850 6f 77 65 76 65 72 2c 20 6f 6e 20 55 6e 69 78 20  owever, on Unix 
1c860 28 61 6e 64 20 4d 61 63 20 4f 53 20 58 3f 29 2c  (and Mac OS X?),
1c870 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c880 77 65 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 20  we should check 
1c890 66 6f 72 20 74 68 65 20 44 49 53 50 4c 41 59 20  for the DISPLAY 
1c8a0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1c8b0 61 62 6c 65 20 61 73 0d 0a 20 20 20 20 20 20 23  able as..      #
1c8c0 20 20 20 20 20 20 20 73 6f 6d 65 20 62 61 73 69         some basi
1c8d0 63 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 68 61  c indication tha
1c8e0 74 20 74 68 65 20 58 20 73 65 72 76 65 72 20 69  t the X server i
1c8f0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
1c900 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
1c910 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 76   appears to be v
1c920 65 72 79 20 6e 65 63 65 73 73 61 72 79 20 6f 6e  ery necessary on
1c930 20 4d 6f 6e 6f 20 62 65 63 61 75 73 65 20 69 74   Mono because it
1c940 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c950 63 72 61 73 68 65 73 20 61 66 74 65 72 20 72 65  crashes after re
1c960 70 65 61 74 65 64 20 66 61 69 6c 65 64 20 61 74  peated failed at
1c970 74 65 6d 70 74 73 20 74 6f 20 63 72 65 61 74 65  tempts to create
1c980 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   a..      #     
1c990 20 20 57 69 6e 64 6f 77 73 20 46 6f 72 6d 20 77    Windows Form w
1c9a0 68 65 6e 20 74 68 65 20 58 20 73 65 72 76 65 72  hen the X server
1c9b0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 20   is unavailable 
1c9c0 28 65 2e 67 2e 20 6f 6e 0d 0a 20 20 20 20 20 20  (e.g. on..      
1c9d0 23 20 20 20 20 20 20 20 4f 70 65 6e 42 53 44 29  #       OpenBSD)
1c9e0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c9f0 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
1ca00 5d 20 7c 7c 20 5b 69 6e 66 6f 20 65 78 69 73 74  ] || [info exist
1ca10 73 20 3a 3a 65 6e 76 28 44 49 53 50 4c 41 59 29  s ::env(DISPLAY)
1ca20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ca30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1ca40 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 57 69 6e  NOTE: Is the Win
1ca50 64 6f 77 73 20 46 6f 72 6d 73 20 61 73 73 65 6d  dows Forms assem
1ca60 62 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  bly available?..
1ca70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ca80 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1ca90 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1caa0 74 20 72 65 73 6f 6c 76 65 20 53 79 73 74 65 6d  t resolve System
1cab0 2e 57 69 6e 64 6f 77 73 2e 46 6f 72 6d 73 0d 0a  .Windows.Forms..
1cac0 20 20 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62          } assemb
1cad0 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ly] == 0} then {
1cae0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1caf0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1cb00 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73   Yes, it appears
1cb10 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69   that it is avai
1cb20 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
1cb30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
1cb40 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 77 69 6e  ddConstraint win
1cb50 46 6f 72 6d 73 0d 0a 0d 0a 20 20 20 20 20 20 20  Forms....       
1cb60 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1cb70 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20  l yes\n....     
1cb80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cb90 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65    # NOTE: We are
1cba0 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74 75   done here, retu
1cbb0 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  rn now...       
1cbc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1cbd0 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20  return..        
1cbe0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1cbf0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1cc00 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  el no\n..    }..
1cc10 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
1cc20 6b 46 6f 72 57 6f 57 36 34 20 7b 20 63 68 61 6e  kForWoW64 { chan
1cc30 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
1cc40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1cc50 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1cc60 20 57 6f 57 36 34 2e 2e 2e 20 22 0d 0a 0d 0a 20   WoW64... ".... 
1cc70 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1cc80 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70 6c  xists ::eagle_pl
1cc90 61 74 66 6f 72 6d 28 77 6f 77 36 34 29 5d 20 26  atform(wow64)] &
1cca0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1ccb0 73 74 72 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61  string is boolea
1ccc0 6e 20 2d 73 74 72 69 63 74 20 24 3a 3a 65 61 67  n -strict $::eag
1ccd0 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 77 6f 77 36  le_platform(wow6
1cce0 34 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  4)] && \..      
1ccf0 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61      $::eagle_pla
1cd00 74 66 6f 72 6d 28 77 6f 77 36 34 29 7d 20 74 68  tform(wow64)} th
1cd10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1cd20 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1cd30 20 59 65 73 2c 20 77 65 20 61 72 65 20 72 75 6e   Yes, we are run
1cd40 6e 69 6e 67 20 69 6e 20 61 20 57 6f 57 36 34 20  ning in a WoW64 
1cd50 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
1cd60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
1cd70 43 6f 6e 73 74 72 61 69 6e 74 20 77 6f 77 36 34  Constraint wow64
1cd80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1cd90 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
1cda0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1cdb0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1cdc0 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
1cdd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1cde0 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
1cdf0 46 6f 72 53 74 61 54 68 72 65 61 64 20 7b 20 63  ForStaThread { c
1ce00 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
1ce10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1ce20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
1ce30 66 6f 72 20 53 54 41 20 74 68 72 65 61 64 2e 2e  for STA thread..
1ce40 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
1ce50 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ce60 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1ce70 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e   System.Threadin
1ce80 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  g.Thread.Current
1ce90 54 68 72 65 61 64 20 47 65 74 41 70 61 72 74 6d  Thread GetApartm
1cea0 65 6e 74 53 74 61 74 65 0d 0a 20 20 20 20 20 20  entState..      
1ceb0 7d 20 61 70 61 72 74 6d 65 6e 74 53 74 61 74 65  } apartmentState
1cec0 5d 20 3d 3d 20 30 20 26 26 20 24 61 70 61 72 74  ] == 0 && $apart
1ced0 6d 65 6e 74 53 74 61 74 65 20 65 71 20 22 53 54  mentState eq "ST
1cee0 41 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  A"} then {..    
1cef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1cf00 20 4e 4f 54 45 3a 20 59 65 73 2c 20 77 65 20 61   NOTE: Yes, we a
1cf10 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 6e  re running in an
1cf20 20 53 54 41 20 74 68 72 65 61 64 2e 0d 0a 20 20   STA thread...  
1cf30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1cf40 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
1cf50 74 61 54 68 72 65 61 64 0d 0a 0d 0a 20 20 20 20  taThread....    
1cf60 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1cf70 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
1cf80 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1cf90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1cfa0 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
1cfb0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1cfc0 6f 63 20 63 68 65 63 6b 46 6f 72 57 69 6e 64 6f  oc checkForWindo
1cfd0 77 73 50 72 65 73 65 6e 74 61 74 69 6f 6e 46 6f  wsPresentationFo
1cfe0 75 6e 64 61 74 69 6f 6e 20 7b 20 63 68 61 6e 6e  undation { chann
1cff0 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
1d000 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
1d010 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
1d020 57 69 6e 64 6f 77 73 20 50 72 65 73 65 6e 74 61  Windows Presenta
1d030 74 69 6f 6e 20 46 6f 75 6e 64 61 74 69 6f 6e 2e  tion Foundation.
1d040 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .. "....      #.
1d050 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
1d060 73 20 74 68 65 20 57 69 6e 64 6f 77 73 20 50 72  s the Windows Pr
1d070 65 73 65 6e 74 61 74 69 6f 6e 20 46 6f 75 6e 64  esentation Found
1d080 61 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 3f  ation available?
1d090 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1d0a0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1d0b0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 72 65         object re
1d0c0 73 6f 6c 76 65 20 50 72 65 73 65 6e 74 61 74 69  solve Presentati
1d0d0 6f 6e 46 72 61 6d 65 77 6f 72 6b 0d 0a 20 20 20  onFramework..   
1d0e0 20 20 20 7d 20 61 73 73 65 6d 62 6c 79 5d 20 3d     } assembly] =
1d0f0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1d100 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d110 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20  # NOTE: Yes, it 
1d120 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
1d130 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
1d140 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d150 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1d160 77 70 66 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  wpf....        t
1d170 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
1d180 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
1d190 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
1d1a0 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
1d1b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1d1c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
1d1d0 65 63 6b 46 6f 72 44 61 74 61 62 61 73 65 20 7b  eckForDatabase {
1d1e0 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 74   channel type st
1d1f0 72 69 6e 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20  ring } {..      
1d200 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1d210 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
1d220 72 20 64 61 74 61 62 61 73 65 2e 2e 2e 20 22 0d  r database... ".
1d230 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1d240 20 20 23 20 48 41 43 4b 3a 20 44 69 73 61 62 6c    # HACK: Disabl
1d250 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1d260 63 74 69 76 69 74 79 20 74 65 73 74 69 6e 67 20  ctivity testing 
1d270 6f 6e 20 4d 6f 6e 6f 20 62 65 63 61 75 73 65 0d  on Mono because.
1d280 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
1d290 74 20 66 61 69 6c 73 20 74 6f 20 74 69 6d 65 6f  t fails to timeo
1d2a0 75 74 20 28 75 6e 6c 65 73 73 20 73 70 65 63 69  ut (unless speci
1d2b0 61 6c 20 74 65 73 74 20 73 75 69 74 65 20 68 61  al test suite ha
1d2c0 63 6b 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  cks..      #    
1d2d0 20 20 20 66 6f 72 20 4d 6f 6e 6f 20 68 61 76 65     for Mono have
1d2e0 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 20 62   been disabled b
1d2f0 79 20 74 68 65 20 75 73 65 72 29 2e 0d 0a 20 20  y the user)...  
1d300 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d310 7b 21 5b 69 73 54 65 73 74 4d 6f 6e 6f 5d 7d 20  {![isTestMono]} 
1d320 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d330 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1d340 45 3a 20 43 61 6e 20 77 65 20 61 63 63 65 73 73  E: Can we access
1d350 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62   the local datab
1d360 61 73 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ase?..        #.
1d370 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1d380 74 63 68 20 7b 73 71 6c 20 6f 70 65 6e 20 2d 74  tch {sql open -t
1d390 79 70 65 20 24 74 79 70 65 20 24 73 74 72 69 6e  ype $type $strin
1d3a0 67 7d 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 3d  g} connection] =
1d3b0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1d3c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d3d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
1d3e0 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
1d3f0 20 77 65 20 63 61 6e 20 63 6f 6e 6e 65 63 74 20   we can connect 
1d400 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  to the local dat
1d410 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 20 20  abase...        
1d420 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
1d430 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 61 74  ddConstraint dat
1d440 61 62 61 73 65 0d 0a 0d 0a 20 20 20 20 20 20 20  abase....       
1d450 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d460 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 63  # NOTE: Also rec
1d470 6f 72 64 20 74 68 65 20 74 65 73 74 20 64 61 74  ord the test dat
1d480 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d490 20 74 79 70 65 20 75 73 65 64 20 61 73 20 61 0d   type used as a.
1d4a0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1d4b0 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69     test constrai
1d4c0 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nt...          #
1d4d0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d4e0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1d4f0 74 79 70 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  type] > 0} then 
1d500 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
1d510 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
1d520 70 65 6e 64 41 72 67 73 20 64 61 74 61 62 61 73  pendArgs databas
1d530 65 2e 20 5b 73 74 72 69 6e 67 20 74 6f 6c 6f 77  e. [string tolow
1d540 65 72 20 24 74 79 70 65 5d 5d 0d 0a 20 20 20 20  er $type]]..    
1d550 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d570 20 20 23 20 4e 4f 54 45 3a 20 43 6c 65 61 6e 75    # NOTE: Cleanu
1d580 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  p the database c
1d590 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 20 6a 75 73  onnection we jus
1d5a0 74 20 6f 70 65 6e 65 64 2e 0d 0a 20 20 20 20 20  t opened...     
1d5b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d5c0 20 20 73 71 6c 20 63 6c 6f 73 65 20 24 63 6f 6e    sql close $con
1d5d0 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
1d5e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d5f0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
1d600 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1d610 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1d620 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
1d630 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
1d640 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
1d650 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 64 69  puts $channel di
1d660 73 61 62 6c 65 64 5c 6e 0d 0a 20 20 20 20 20 20  sabled\n..      
1d670 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1d680 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 4c 69   proc checkForLi
1d690 62 72 61 72 79 41 73 73 65 6d 62 6c 79 4e 61 6d  braryAssemblyNam
1d6a0 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  e { channel } {.
1d6b0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
1d6c0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
1d6d0 6b 69 6e 67 20 66 6f 72 20 6c 69 62 72 61 72 79  king for library
1d6e0 20 61 73 73 65 6d 62 6c 79 20 6e 61 6d 65 2e 2e   assembly name..
1d6f0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  . "....      #..
1d700 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
1d710 61 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  at is the name o
1d720 66 20 74 68 65 20 63 6f 72 65 20 6c 69 62 72 61  f the core libra
1d730 72 79 20 61 73 73 65 6d 62 6c 79 3f 20 20 4e 6f  ry assembly?  No
1d740 72 6d 61 6c 6c 79 2c 0d 0a 20 20 20 20 20 20 23  rmally,..      #
1d750 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c         this will
1d760 20 62 65 20 22 45 61 67 6c 65 22 3b 20 68 6f 77   be "Eagle"; how
1d770 65 76 65 72 2c 20 69 74 20 63 6f 75 6c 64 20 62  ever, it could b
1d780 65 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65  e something else
1d790 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1d7a0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 67 65    if {[catch {ge
1d7b0 74 54 65 73 74 41 73 73 65 6d 62 6c 79 4e 61 6d  tTestAssemblyNam
1d7c0 65 7d 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65 5d  e} assemblyName]
1d7d0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1d7e0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1d7f0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1d800 20 6c 69 62 72 61 72 79 41 73 73 65 6d 62 6c 79   libraryAssembly
1d810 4e 61 6d 65 2e 20 24 61 73 73 65 6d 62 6c 79 4e  Name. $assemblyN
1d820 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
1d830 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1d840 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
1d850 28 22 20 24 61 73 73 65 6d 62 6c 79 4e 61 6d 65  (" $assemblyName
1d860 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
1d870 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d880 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d890 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
1d8a0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1d8b0 63 20 63 68 65 63 6b 46 6f 72 41 73 73 65 6d 62  c checkForAssemb
1d8c0 6c 79 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ly { channel nam
1d8d0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  e } {..      tpu
1d8e0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d8f0 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
1d900 65 63 6b 69 6e 67 20 66 6f 72 20 61 73 73 65 6d  ecking for assem
1d910 62 6c 79 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d  bly \"" $name \.
1d920 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e  .          "\"..
1d930 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  . "]....      #.
1d940 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
1d950 61 6e 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  an the assembly 
1d960 62 65 20 6c 6f 61 64 65 64 3f 0d 0a 20 20 20 20  be loaded?..    
1d970 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1d980 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 72 65  catch {object re
1d990 73 6f 6c 76 65 20 24 6e 61 6d 65 7d 20 61 73 73  solve $name} ass
1d9a0 65 6d 62 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65  embly] == 0} the
1d9b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1d9c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d9d0 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
1d9e0 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c  that it is avail
1d9f0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
1da00 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1da10 73 74 72 61 69 6e 74 20 24 6e 61 6d 65 0d 0a 0d  straint $name...
1da20 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1da30 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
1da40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1da50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1da60 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
1da70 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1da80 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
1da90 4f 62 6a 65 63 74 4d 65 6d 62 65 72 20 7b 20 63  ObjectMember { c
1daa0 68 61 6e 6e 65 6c 20 6f 62 6a 65 63 74 20 6d 65  hannel object me
1dab0 6d 62 65 72 20 7b 63 6f 6e 73 74 72 61 69 6e 74  mber {constraint
1dac0 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
1dad0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1dae0 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d  appendArgs "----
1daf0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 6f 62   checking for ob
1db00 6a 65 63 74 20 6d 65 6d 62 65 72 20 5c 22 22 20  ject member \"" 
1db10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6f 62  \..          $ob
1db20 6a 65 63 74 20 2e 20 24 6d 65 6d 62 65 72 20 22  ject . $member "
1db30 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
1db40 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1db50 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 6d          object m
1db60 65 6d 62 65 72 73 20 2d 66 6c 61 67 73 20 2b 4e  embers -flags +N
1db70 6f 6e 50 75 62 6c 69 63 20 2d 70 61 74 74 65 72  onPublic -patter
1db80 6e 20 24 6d 65 6d 62 65 72 20 24 6f 62 6a 65 63  n $member $objec
1db90 74 0d 0a 20 20 20 20 20 20 7d 20 6d 65 6d 62 65  t..      } membe
1dba0 72 73 5d 20 3d 3d 20 30 20 26 26 20 5b 6c 6c 65  rs] == 0 && [lle
1dbb0 6e 67 74 68 20 24 6d 65 6d 62 65 72 73 5d 20 3e  ngth $members] >
1dbc0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1dbd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1dbe0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61   NOTE: Yes, it a
1dbf0 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 69  ppears that it i
1dc00 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
1dc10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1dc20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1dc30 67 74 68 20 24 63 6f 6e 73 74 72 61 69 6e 74 5d  gth $constraint]
1dc40 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1dc50 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1dc60 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1dc70 73 20 6d 65 6d 62 65 72 5f 20 24 63 6f 6e 73 74  s member_ $const
1dc80 72 61 69 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  raint]..        
1dc90 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1dca0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1dcb0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6f  t [appendArgs $o
1dcc0 62 6a 65 63 74 2e 20 5b 73 74 72 69 6e 67 20 74  bject. [string t
1dcd0 72 69 6d 20 24 6d 65 6d 62 65 72 20 2a 3f 5d 5d  rim $member *?]]
1dce0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1dcf0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1dd00 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
1dd10 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1dd20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1dd30 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
1dd40 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1dd50 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 45 78   proc checkForEx
1dd60 63 65 6c 55 73 61 62 6c 65 20 7b 20 63 68 61 6e  celUsable { chan
1dd70 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
1dd80 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1dd90 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1dda0 20 75 73 61 62 6c 65 20 69 6e 73 74 61 6e 63 65   usable instance
1ddb0 20 6f 66 20 45 78 63 65 6c 2e 2e 2e 20 22 0d 0a   of Excel... "..
1ddc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1ddd0 20 23 20 4e 4f 54 45 3a 20 41 73 20 6f 66 20 74   # NOTE: As of t
1dde0 68 69 73 20 77 72 69 74 69 6e 67 2c 20 74 68 69  his writing, thi
1ddf0 73 20 63 68 65 63 6b 20 69 73 20 6f 6e 6c 79 20  s check is only 
1de00 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 57 69 6e  supported on Win
1de10 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  dows...      #..
1de20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
1de30 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
1de40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1de50 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63    # NOTE: This c
1de60 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 20  onstraint check 
1de70 6d 75 73 74 20 72 75 6e 20 61 66 74 65 72 20 74  must run after t
1de80 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
1de90 62 6c 79 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  bly for..       
1dea0 20 23 20 20 20 20 20 20 20 45 78 63 65 6c 20 68   #       Excel h
1deb0 61 73 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  as been detected
1dec0 2c 20 62 65 63 61 75 73 65 20 74 68 69 73 20 63  , because this c
1ded0 68 65 63 6b 20 6d 61 6b 65 73 20 75 73 65 20 6f  heck makes use o
1dee0 66 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  f it...        #
1def0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1df00 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 4d 69  aveConstraint Mi
1df10 63 72 6f 73 6f 66 74 2e 4f 66 66 69 63 65 2e 49  crosoft.Office.I
1df20 6e 74 65 72 6f 70 2e 45 78 63 65 6c 5d 7d 20 74  nterop.Excel]} t
1df30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1df40 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1df50 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6e 73 74  NOTE: This const
1df60 72 61 69 6e 74 20 63 68 65 63 6b 20 72 65 71 75  raint check requ
1df70 69 72 65 73 20 74 68 65 20 28 6f 70 74 69 6f 6e  ires the (option
1df80 61 6c 29 20 69 6e 74 65 72 70 72 65 74 65 72 0d  al) interpreter.
1df90 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1dfa0 20 20 20 69 73 6f 6c 61 74 69 6f 6e 20 66 65 61     isolation fea
1dfb0 74 75 72 65 20 6f 66 20 45 61 67 6c 65 20 69 6e  ture of Eagle in
1dfc0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
1dfd0 68 65 20 70 72 69 6d 61 72 79 0d 0a 20 20 20 20  he primary..    
1dfe0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
1dff0 74 65 72 70 72 65 74 65 72 20 61 6e 64 20 41 70  terpreter and Ap
1e000 70 44 6f 6d 61 69 6e 20 74 69 64 79 2e 20 20 49  pDomain tidy.  I
1e010 74 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 20  t also requires 
1e020 61 63 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20  access..        
1e030 20 20 23 20 20 20 20 20 20 20 74 6f 20 6e 61 74    #       to nat
1e040 69 76 65 20 57 69 6e 64 6f 77 73 20 73 75 70 70  ive Windows supp
1e050 6f 72 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ort in order to 
1e060 75 73 65 20 74 68 65 20 5b 69 6e 66 6f 20 68 77  use the [info hw
1e070 6e 64 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nd]..          #
1e080 20 20 20 20 20 20 20 73 75 62 2d 63 6f 6d 6d 61         sub-comma
1e090 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nd...          #
1e0a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1e0b0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
1e0c0 63 6f 6d 70 69 6c 65 2e 49 53 4f 4c 41 54 45 44  compile.ISOLATED
1e0d0 5f 49 4e 54 45 52 50 52 45 54 45 52 53 5d 20 26  _INTERPRETERS] &
1e0e0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1e0f0 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
1e100 6e 74 20 63 6f 6d 70 69 6c 65 2e 4e 41 54 49 56  nt compile.NATIV
1e110 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  E] && \..       
1e120 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
1e130 74 72 61 69 6e 74 20 63 6f 6d 70 69 6c 65 2e 57  traint compile.W
1e140 49 4e 44 4f 57 53 5d 7d 20 74 68 65 6e 20 7b 0d  INDOWS]} then {.
1e150 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1e160 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1e170 54 45 3a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74  TE: Allocate a t
1e180 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1e190 6d 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  me that can be u
1e1a0 73 65 64 20 74 6f 20 73 61 76 65 0d 0a 20 20 20  sed to save..   
1e1b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e1c0 20 74 68 65 20 45 78 63 65 6c 20 73 70 72 65 61   the Excel sprea
1e1d0 64 73 68 65 65 74 2e 20 20 54 68 69 73 20 6e 61  dsheet.  This na
1e1e0 6d 65 20 77 69 6c 6c 20 62 65 20 70 72 6f 76 69  me will be provi
1e1f0 64 65 64 20 74 6f 20 61 0d 0a 20 20 20 20 20 20  ded to a..      
1e200 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68        #       ch
1e210 69 6c 64 20 69 6e 74 65 72 70 72 65 74 65 72 20  ild interpreter 
1e220 66 6f 72 20 69 74 73 20 75 73 65 20 2d 41 4e 44  for its use -AND
1e230 2d 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20  - cleaned up by 
1e240 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  this..          
1e250 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70    #       interp
1e260 72 65 74 65 72 20 62 65 66 6f 72 65 20 65 78 69  reter before exi
1e270 74 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65 64  ting this proced
1e280 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ure...          
1e290 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1e2a0 20 73 65 74 20 74 65 6d 70 4e 61 6d 65 28 31 29   set tempName(1)
1e2b0 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 46 69   [getTemporaryFi
1e2c0 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
1e2d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e2e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1e2f0 65 20 61 20 74 72 79 2f 66 69 6e 61 6c 6c 79 20  e a try/finally 
1e300 62 6c 6f 63 6b 20 74 6f 20 63 6c 65 61 6e 75 70  block to cleanup
1e310 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1e320 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1e330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
1e340 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y {..           
1e350 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1e360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e370 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1e380 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 61      # NOTE: In a
1e390 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 69 6d  n attempt to lim
1e3a0 69 74 20 74 68 65 20 61 73 73 65 6d 62 6c 69 65  it the assemblie
1e3b0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  s loaded into th
1e3c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1e3d0 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61     #       prima
1e3e0 72 79 20 41 70 70 44 6f 6d 61 69 6e 2c 20 63 72  ry AppDomain, cr
1e3f0 65 61 74 65 20 61 6e 20 69 73 6f 6c 61 74 65 64  eate an isolated
1e400 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e430 20 20 73 65 74 20 69 6e 74 65 72 70 20 5b 69 6e    set interp [in
1e440 74 65 72 70 20 63 72 65 61 74 65 20 2d 69 73 6f  terp create -iso
1e450 6c 61 74 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20  lated]....      
1e460 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1e480 4f 54 45 3a 20 47 69 76 65 20 74 68 65 20 6e 65  OTE: Give the ne
1e490 77 6c 79 20 63 72 65 61 74 65 64 20 28 69 73 6f  wly created (iso
1e4a0 6c 61 74 65 64 29 20 69 6e 74 65 72 70 72 65 74  lated) interpret
1e4b0 65 72 20 61 20 6d 65 61 6e 73 0d 0a 20 20 20 20  er a means..    
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1e4d0 20 20 20 20 74 6f 20 73 65 74 20 76 61 72 69 61      to set varia
1e4e0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65  bles in the pare
1e4f0 6e 74 20 28 74 68 69 73 29 20 69 6e 74 65 72 70  nt (this) interp
1e500 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
1e510 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e520 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72             inter
1e530 70 20 61 6c 69 61 73 20 24 69 6e 74 65 72 70 20  p alias $interp 
1e540 70 73 65 74 20 7b 7d 20 73 65 74 3b 20 23 20 70  pset {} set; # p
1e550 61 72 65 6e 74 20 73 65 74 0d 0a 0d 0a 20 20 20  arent set....   
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 23 20 4e 4f 54 45 3a 20 47 69 76 65 20 74 68 65  # NOTE: Give the
1e590 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 28   newly created (
1e5a0 69 73 6f 6c 61 74 65 64 29 20 69 6e 74 65 72 70  isolated) interp
1e5b0 72 65 74 65 72 20 61 20 62 61 73 65 0d 0a 20 20  reter a base..  
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1e5d0 20 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 61        name for a
1e5e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1e5f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e600 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1e610 20 20 20 20 20 69 6e 74 65 72 70 20 73 65 74 20       interp set 
1e620 24 69 6e 74 65 72 70 20 74 65 6d 70 4e 61 6d 65  $interp tempName
1e630 28 31 29 20 24 74 65 6d 70 4e 61 6d 65 28 31 29  (1) $tempName(1)
1e640 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e650 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e660 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45         # NOTE: E
1e670 76 61 6c 75 61 74 65 20 61 6c 6c 20 74 68 65 20  valuate all the 
1e680 45 78 63 65 6c 20 69 6e 74 65 72 6f 70 20 61 73  Excel interop as
1e690 73 65 6d 62 6c 79 20 72 65 6c 61 74 65 64 20 63  sembly related c
1e6a0 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ode..           
1e6b0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
1e6c0 74 68 65 20 6f 74 68 65 72 20 41 70 70 44 6f 6d  the other AppDom
1e6d0 61 69 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ain...          
1e6e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e6f0 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 20           interp 
1e700 65 76 61 6c 20 24 69 6e 74 65 72 70 20 7b 0d 0a  eval $interp {..
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1e730 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1e740 69 72 73 74 2c 20 61 74 74 65 6d 70 74 20 74 6f  irst, attempt to
1e750 20 6c 6f 61 64 20 74 68 65 20 45 78 63 65 6c 20   load the Excel 
1e760 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
1e770 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1e780 20 20 20 20 20 23 20 20 20 20 20 20 20 49 66 20       #       If 
1e790 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63  this fails, we c
1e7a0 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 20 61  annot continue a
1e7b0 6e 64 20 45 78 63 65 6c 20 69 73 20 6e 6f 74 0d  nd Excel is not.
1e7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e7d0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 73 69     #       consi
1e7e0 64 65 72 65 64 20 75 73 61 62 6c 65 2e 0d 0a 20  dered usable... 
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1e810 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62        set assemb
1e820 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20  ly [object load 
1e830 2d 69 6d 70 6f 72 74 20 2d 64 65 63 6c 61 72 65  -import -declare
1e840 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e850 20 20 20 20 20 20 20 20 20 20 4d 69 63 72 6f 73            Micros
1e860 6f 66 74 2e 4f 66 66 69 63 65 2e 49 6e 74 65 72  oft.Office.Inter
1e870 6f 70 2e 45 78 63 65 6c 5d 0d 0a 0d 0a 20 20 20  op.Excel]....   
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e8a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
1e8b0 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 72 75 6e  , attempt to run
1e8c0 20 74 68 65 20 45 78 63 65 6c 20 61 70 70 6c 69   the Excel appli
1e8d0 63 61 74 69 6f 6e 20 75 73 69 6e 67 0d 0a 20 20  cation using..  
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 23 20 20 20 20 20 20 20 69 74 73 20 61 75 74 6f  #       its auto
1e900 6d 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 6d 6f  mation object mo
1e910 64 65 6c 2e 20 20 49 66 20 74 68 69 73 20 66 61  del.  If this fa
1e920 69 6c 73 2c 20 77 65 0d 0a 20 20 20 20 20 20 20  ils, we..       
1e930 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1e940 20 20 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e     cannot contin
1e950 75 65 20 61 6e 64 20 45 78 63 65 6c 20 69 73 20  ue and Excel is 
1e960 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 75  not considered u
1e970 73 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  sable...        
1e980 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e9a0 65 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 5b  et application [
1e9b0 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
1e9c0 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 69                Mi
1e9e0 63 72 6f 73 6f 66 74 2e 4f 66 66 69 63 65 2e 49  crosoft.Office.I
1e9f0 6e 74 65 72 6f 70 2e 45 78 63 65 6c 2e 41 70 70  nterop.Excel.App
1ea00 6c 69 63 61 74 69 6f 6e 43 6c 61 73 73 5d 3b 20  licationClass]; 
1ea10 23 20 72 75 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  # run....       
1ea20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 61 74  # NOTE: Next, at
1ea50 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
1ea60 20 74 68 65 20 70 72 6f 63 65 73 73 20 49 44 20   the process ID 
1ea70 61 73 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20  associated..    
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1ea90 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 45        with the E
1eaa0 78 63 65 6c 20 61 70 70 6c 69 63 61 74 69 6f 6e  xcel application
1eab0 20 77 69 6e 64 6f 77 2e 20 20 54 68 69 73 20 69   window.  This i
1eac0 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1eae0 20 20 20 20 20 68 65 6c 70 20 6d 61 6b 65 20 73       help make s
1eaf0 75 72 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20  ure the running 
1eb00 45 78 63 65 6c 20 69 6e 73 74 61 6e 63 65 20 69  Excel instance i
1eb10 73 20 63 6c 6f 73 65 64 0d 0a 20 20 20 20 20 20  s closed..      
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1eb30 20 20 20 20 61 66 74 65 72 20 6f 75 72 20 74 65      after our te
1eb40 73 74 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74  sting is complet
1eb50 65 2e 20 20 47 65 6e 65 72 61 6c 6c 79 2c 20 74  e.  Generally, t
1eb60 68 69 73 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20  his will..      
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1eb80 20 20 20 20 6e 6f 74 20 66 61 69 6c 20 62 65 63      not fail bec
1eb90 61 75 73 65 20 77 65 20 6b 6e 6f 77 20 74 68 65  ause we know the
1eba0 20 5b 69 6e 66 6f 20 68 77 6e 64 5d 20 73 75 62   [info hwnd] sub
1ebb0 2d 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20  -command..      
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1ebd0 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 61 76      should be av
1ebe0 61 69 6c 61 62 6c 65 2c 20 64 75 65 20 74 6f 20  ailable, due to 
1ebf0 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20  define constant 
1ec00 63 68 65 63 6b 73 2e 0d 0a 20 20 20 20 20 20 20  checks...       
1ec10 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 70 73 65 74 20 70 69 64 20 5b 67 65 74 44 69 63  pset pid [getDic
1ec40 74 69 6f 6e 61 72 79 56 61 6c 75 65 20 5c 0d 0a  tionaryValue \..
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 5b 69 6e 66 6f 20 68 77 6e 64        [info hwnd
1ec70 20 5b 24 61 70 70 6c 69 63 61 74 69 6f 6e 20 48   [$application H
1ec80 77 6e 64 5d 5d 20 70 72 6f 63 65 73 73 49 64 5d  wnd]] processId]
1ec90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1eca0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ecb0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1ecc0 45 3a 20 4e 65 78 74 2c 20 61 74 74 65 6d 70 74  E: Next, attempt
1ecd0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1ece0 61 74 20 74 68 65 20 45 78 63 65 6c 20 69 6e 73  at the Excel ins
1ecf0 74 61 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20  tance..         
1ed00 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1ed10 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 20   is not visible 
1ed20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 64 69 73  and will not dis
1ed30 70 6c 61 79 20 61 6c 65 72 74 73 2f 70 72 6f 6d  play alerts/prom
1ed40 70 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  pts...          
1ed50 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ed60 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 45  If this fails, E
1ed70 78 63 65 6c 20 69 73 20 6e 6f 74 20 63 6f 6e 73  xcel is not cons
1ed80 69 64 65 72 65 64 20 75 73 61 62 6c 65 2e 0d 0a  idered usable...
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1edb0 20 20 20 20 20 20 20 24 61 70 70 6c 69 63 61 74         $applicat
1edc0 69 6f 6e 20 56 69 73 69 62 6c 65 20 66 61 6c 73  ion Visible fals
1edd0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1ede0 20 20 20 20 20 24 61 70 70 6c 69 63 61 74 69 6f       $applicatio
1edf0 6e 20 44 69 73 70 6c 61 79 41 6c 65 72 74 73 20  n DisplayAlerts 
1ee00 66 61 6c 73 65 0d 0a 0d 0a 20 20 20 20 20 20 20  false....       
1ee10 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 63 72  # NOTE: Next, cr
1ee40 65 61 74 65 20 61 20 76 61 6c 75 65 20 6f 66 20  eate a value of 
1ee50 61 6e 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79  an enumerated ty
1ee60 70 65 20 65 78 70 6f 73 65 64 0d 0a 20 20 20 20  pe exposed..    
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1ee80 20 20 20 20 20 20 62 79 20 74 68 65 20 45 78 63        by the Exc
1ee90 65 6c 20 61 75 74 6f 6d 61 74 69 6f 6e 20 6f 62  el automation ob
1eea0 6a 65 63 74 20 6d 6f 64 65 6c 20 73 6f 20 74 68  ject model so th
1eeb0 61 74 20 77 65 20 63 61 6e 0d 0a 20 20 20 20 20  at we can..     
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1eed0 20 20 20 20 20 61 64 64 20 61 20 6e 65 77 20 77       add a new w
1eee0 6f 72 6b 62 6f 6f 6b 2e 20 20 47 65 6e 65 72 61  orkbook.  Genera
1eef0 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  lly, this does n
1ef00 6f 74 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  ot fail...      
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1ef20 20 20 20 20 49 66 20 74 68 69 73 20 66 61 69 6c      If this fail
1ef30 73 2c 20 45 78 63 65 6c 20 69 73 20 6e 6f 74 20  s, Excel is not 
1ef40 63 6f 6e 73 69 64 65 72 65 64 20 75 73 61 62 6c  considered usabl
1ef50 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
1ef60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ef70 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65             set e
1ef80 6e 75 6d 56 61 6c 75 65 20 5b 6f 62 6a 65 63 74  numValue [object
1ef90 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
1efa0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1efb0 20 20 20 20 20 20 20 20 20 45 6e 75 6d 20 50 61           Enum Pa
1efc0 72 73 65 20 58 6c 57 42 41 54 65 6d 70 6c 61 74  rse XlWBATemplat
1efd0 65 20 78 6c 57 42 41 54 57 6f 72 6b 73 68 65 65  e xlWBATWorkshee
1efe0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t]....          
1eff0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1f010 4f 54 45 3a 20 4e 65 78 74 2c 20 61 74 74 65 6d  OTE: Next, attem
1f020 70 74 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  pt to add a new 
1f030 77 6f 72 6b 62 6f 6f 6b 2e 20 20 49 66 20 74 68  workbook.  If th
1f040 69 73 20 66 61 69 6c 73 2c 0d 0a 20 20 20 20 20  is fails,..     
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1f060 20 20 20 20 20 45 78 63 65 6c 20 69 73 20 6e 6f       Excel is no
1f070 74 20 63 6f 6e 73 69 64 65 72 65 64 20 75 73 61  t considered usa
1f080 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
1f090 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1f0b0 20 77 6f 72 6b 62 6f 6f 6b 20 5b 6f 62 6a 65 63   workbook [objec
1f0c0 74 20 69 6e 76 6f 6b 65 20 2d 61 6c 69 61 73 20  t invoke -alias 
1f0d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f0e0 20 20 20 20 20 20 20 20 20 24 61 70 70 6c 69 63           $applic
1f0f0 61 74 69 6f 6e 2e 57 6f 72 6b 62 6f 6f 6b 73 20  ation.Workbooks 
1f100 41 64 64 20 24 65 6e 75 6d 56 61 6c 75 65 5d 0d  Add $enumValue].
1f110 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1f120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f130 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1f140 3a 20 53 65 74 75 70 20 61 20 74 65 6d 70 6f 72  : Setup a tempor
1f150 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 68  ary file name th
1f160 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
1f170 6f 20 73 61 76 65 0d 0a 20 20 20 20 20 20 20 20  o save..        
1f180 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1f190 20 20 74 68 65 20 45 78 63 65 6c 20 73 70 72 65    the Excel spre
1f1a0 61 64 73 68 65 65 74 2e 0d 0a 20 20 20 20 20 20  adsheet...      
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 70 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b   pset fileName [
1f1e0 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
1f1f0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 61  le nativename [a
1f200 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 24 74 65 6d 70 4e 61 6d 65 28 31 29 20     $tempName(1) 
1f230 2e 78 6c 73 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  .xls]]]....     
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
1f270 61 74 74 65 6d 70 74 20 74 6f 20 73 61 76 65 20  attempt to save 
1f280 61 20 6e 65 77 20 77 6f 72 6b 62 6f 6f 6b 2e 20  a new workbook. 
1f290 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 0d   If this fails,.
1f2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f2b0 20 20 20 23 20 20 20 20 20 20 20 45 78 63 65 6c     #       Excel
1f2c0 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
1f2d0 65 64 20 75 73 61 62 6c 65 2e 0d 0a 20 20 20 20  ed usable...    
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1f2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f300 20 20 20 24 77 6f 72 6b 62 6f 6f 6b 20 53 61 76     $workbook Sav
1f310 65 41 73 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d  eAs $fileName...
1f320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f330 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f340 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f350 4e 65 78 74 2c 20 61 74 74 65 6d 70 74 20 74 6f  Next, attempt to
1f360 20 63 6c 6f 73 65 20 45 78 63 65 6c 2e 20 20 49   close Excel.  I
1f370 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 45 78  f this fails, Ex
1f380 63 65 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  cel..           
1f390 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
1f3a0 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1f3b0 20 75 73 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20   usable...      
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 24 61 70 70 6c 69 63 61 74 69 6f 6e 20 51 75   $application Qu
1f3f0 69 74 3b 20 23 20 63 6c 6f 73 65 0d 0a 0d 0a 20  it; # close.... 
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1f420 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
1f430 6e 61 6c 6c 79 2c 20 63 6c 65 61 6e 75 70 20 6f  nally, cleanup o
1f440 75 72 20 6c 6f 63 61 6c 20 73 74 61 74 65 20 6a  ur local state j
1f450 75 73 74 20 74 6f 20 62 65 20 74 69 64 79 2e 0d  ust to be tidy..
1f460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f470 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f480 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 77 6f          unset wo
1f490 72 6b 62 6f 6f 6b 20 65 6e 75 6d 56 61 6c 75 65  rkbook enumValue
1f4a0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 73 73   application ass
1f4b0 65 6d 62 6c 79 3b 20 23 20 64 69 73 70 6f 73 65  embly; # dispose
1f4c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f4d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1f4e0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1f4f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f500 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f520 4e 4f 54 45 3a 20 49 74 20 61 70 70 65 61 72 73  NOTE: It appears
1f530 20 74 68 65 20 45 78 63 65 6c 20 69 6e 73 74 61   the Excel insta
1f540 6e 63 65 20 69 73 20 75 73 61 62 6c 65 2e 0d 0a  nce is usable...
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f560 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1f570 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1f580 20 65 78 63 65 6c 2e 75 73 61 62 6c 65 0d 0a 0d   excel.usable...
1f590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f5a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1f5b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
1f5c0 20 74 68 61 74 20 61 20 75 73 61 62 6c 65 20 45   that a usable E
1f5d0 78 63 65 6c 20 69 6e 73 74 61 6e 63 65 20 77 61  xcel instance wa
1f5e0 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  s found...      
1f5f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1f610 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
1f620 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
1f630 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f640 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f660 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 68  NOTE: This is th
1f670 65 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 20  e list of error 
1f680 6d 65 73 73 61 67 65 20 70 61 74 74 65 72 6e 73  message patterns
1f690 20 74 68 61 74 20 6d 61 79 0d 0a 20 20 20 20 20   that may..     
1f6a0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1f6b0 20 20 20 69 6e 64 69 63 61 74 65 20 61 20 74 72     indicate a tr
1f6c0 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 45  ial version of E
1f6d0 78 63 65 6c 20 69 73 20 62 65 69 6e 67 20 75 73  xcel is being us
1f6e0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
1f6f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f700 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
1f710 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  erns [list \..  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 22 2a 20 30 78 38 30 30 41 43 34 37 32 2a    "* 0x800AC472*
1f740 22 20 22 2a 20 30 78 38 30 30 41 30 33 45 43 2a  " "* 0x800A03EC*
1f750 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1f760 20 20 20 20 20 20 20 20 20 22 2a 20 61 70 70 6c           "* appl
1f770 69 63 61 74 69 6f 6e 20 68 61 73 20 65 78 70 69  ication has expi
1f780 72 65 64 2e 2a 22 5d 0d 0a 0d 0a 20 20 20 20 20  red.*"]....     
1f790 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f7b0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 65 61 63 68  NOTE: Check each
1f7c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 70   error message p
1f7d0 61 74 74 65 72 6e 2e 20 20 55 70 6f 6e 20 66 69  attern.  Upon fi
1f7e0 6e 64 69 6e 67 20 61 6e 79 0d 0a 20 20 20 20 20  nding any..     
1f7f0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1f800 20 20 20 6d 61 74 63 68 2c 20 6d 61 72 6b 20 45     match, mark E
1f810 78 63 65 6c 20 61 73 20 75 6e 75 73 61 62 6c 65  xcel as unusable
1f820 20 64 75 65 20 74 6f 20 62 65 69 6e 67 20 61 20   due to being a 
1f830 74 72 69 61 6c 0d 0a 20 20 20 20 20 20 20 20 20  trial..         
1f840 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
1f850 64 69 74 69 6f 6e 20 61 6e 64 20 74 68 65 6e 20  dition and then 
1f860 73 74 6f 70 2e 0d 0a 20 20 20 20 20 20 20 20 20  stop...         
1f870 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f880 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1f890 68 20 70 61 74 74 65 72 6e 20 24 70 61 74 74 65  h pattern $patte
1f8a0 72 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  rns {..         
1f8b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f8d0 54 4f 44 4f 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a  TODO: For now, j
1f8e0 75 73 74 20 75 73 65 20 5b 73 74 72 69 6e 67 20  ust use [string 
1f8f0 6d 61 74 63 68 5d 20 68 65 72 65 3b 20 65 76 65  match] here; eve
1f900 6e 74 75 61 6c 6c 79 2c 0d 0a 20 20 20 20 20 20  ntually,..      
1f910 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1f920 20 20 20 20 72 65 67 75 6c 61 72 20 65 78 70 72      regular expr
1f930 65 73 73 69 6f 6e 73 20 6d 61 79 20 62 65 20 6e  essions may be n
1f940 65 65 64 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  eeded...        
1f950 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1f970 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1f980 20 24 70 61 74 74 65 72 6e 20 24 72 65 73 75 6c   $pattern $resul
1f990 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1f9c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
1f9d0 74 20 61 70 70 65 61 72 73 20 74 68 61 74 20 45  t appears that E
1f9e0 78 63 65 6c 20 69 73 20 61 20 74 72 69 61 6c 20  xcel is a trial 
1f9f0 65 64 69 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  edition...      
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1fa10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1fa30 6e 74 20 65 78 63 65 6c 2e 74 72 69 61 6c 0d 0a  nt excel.trial..
1fa40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fa50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1fa70 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 74  OTE: Show that t
1fa80 68 65 20 45 78 63 65 6c 20 74 72 69 61 6c 20 65  he Excel trial e
1fa90 64 69 74 69 6f 6e 20 77 61 73 20 66 6f 75 6e 64  dition was found
1faa0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1fab0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1fad0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 6e 6f  uts $channel "no
1fae0 2c 20 74 72 69 61 6c 5c 6e 22 0d 0a 0d 0a 20 20  , trial\n"....  
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1fb10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fb20 20 57 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   We are done her
1fb30 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a  e, return now...
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1fb60 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1fb70 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
1fb80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1fb90 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 23 20 4e 4f 54 45 3a 20 49 74 20 61 70 70 65 61  # NOTE: It appea
1fbd0 72 73 20 74 68 65 20 45 78 63 65 6c 20 69 6e 73  rs the Excel ins
1fbe0 74 61 6e 63 65 20 69 73 20 6e 6f 74 20 75 73 61  tance is not usa
1fbf0 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
1fc00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1fc10 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
1fc20 74 72 61 69 6e 74 20 65 78 63 65 6c 2e 75 6e 75  traint excel.unu
1fc30 73 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20  sable....       
1fc40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1fc60 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 61 20  TE: Show that a 
1fc70 75 6e 75 73 61 62 6c 65 20 45 78 63 65 6c 20 69  unusable Excel i
1fc80 6e 73 74 61 6e 63 65 20 77 61 73 20 66 6f 75 6e  nstance was foun
1fc90 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
1fca0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1fcb0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1fcc0 61 6e 6e 65 6c 20 22 6e 6f 2c 20 62 72 6f 6b 65  annel "no, broke
1fcd0 6e 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  n\n"..          
1fce0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1fcf0 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1fd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1fd20 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
1fd30 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
1fd40 74 65 72 70 72 65 74 65 72 20 69 73 20 64 65 6c  terpreter is del
1fd50 65 74 65 64 20 69 66 20 69 74 20 77 61 73 0d 0a  eted if it was..
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1fd70 20 20 20 20 20 20 61 63 74 75 61 6c 6c 79 20 63        actually c
1fd80 72 65 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  reated...       
1fd90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1fda0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
1fdb0 6f 20 65 78 69 73 74 73 20 69 6e 74 65 72 70 5d  o exists interp]
1fdc0 20 26 26 20 5b 69 6e 74 65 72 70 20 65 78 69 73   && [interp exis
1fdd0 74 73 20 24 69 6e 74 65 72 70 5d 7d 20 74 68 65  ts $interp]} the
1fde0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fdf0 20 20 20 20 20 63 61 74 63 68 20 7b 69 6e 74 65       catch {inte
1fe00 72 70 20 64 65 6c 65 74 65 20 24 69 6e 74 65 72  rp delete $inter
1fe10 70 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  p}..            
1fe20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1fe30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fe40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1fe50 6b 65 20 73 75 72 65 20 74 68 65 20 45 78 63 65  ke sure the Exce
1fe60 6c 20 70 72 6f 63 65 73 73 20 69 73 20 28 66 6f  l process is (fo
1fe70 72 63 69 62 6c 79 29 20 63 6c 6f 73 65 64 20 69  rcibly) closed i
1fe80 66 20 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20  f it..          
1fe90 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 73      #       is s
1fea0 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 61 74 20  till running at 
1feb0 74 68 69 73 20 70 6f 69 6e 74 2e 0d 0a 20 20 20  this point...   
1fec0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1fee0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 69 64  [info exists pid
1fef0 5d 20 26 26 20 24 70 69 64 20 69 6e 20 5b 67 65  ] && $pid in [ge
1ff00 74 50 72 6f 63 65 73 73 65 73 20 65 78 63 65 6c  tProcesses excel
1ff10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ff20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
1ff30 20 7b 6b 69 6c 6c 20 2d 66 6f 72 63 65 20 24 70   {kill -force $p
1ff40 69 64 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  id}..           
1ff50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ff60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ff70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
1ff80 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d  ake sure the tem
1ff90 70 6f 72 61 72 79 20 73 70 72 65 61 64 73 68 65  porary spreadshe
1ffa0 65 74 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  et file is delet
1ffb0 65 64 20 69 66 0d 0a 20 20 20 20 20 20 20 20 20  ed if..         
1ffc0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20       #       it 
1ffd0 77 61 73 20 61 63 74 75 61 6c 6c 79 20 63 72 65  was actually cre
1ffe0 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ated...         
1fff0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20000 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
20010 65 78 69 73 74 73 20 66 69 6c 65 4e 61 6d 65 5d  exists fileName]
20020 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
20030 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
20040 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20050 20 20 20 20 20 63 61 74 63 68 20 7b 66 69 6c 65       catch {file
20060 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
20070 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
20080 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20090 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
200a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
200b0 6b 65 20 73 75 72 65 20 74 68 65 20 64 75 6d 6d  ke sure the dumm
200c0 79 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  y temporary file
200d0 73 20 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70  s are cleaned up
200e0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
200f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
20100 20 20 69 66 20 7b 5b 61 72 72 61 79 20 65 78 69    if {[array exi
20110 73 74 73 20 74 65 6d 70 4e 61 6d 65 5d 7d 20 74  sts tempName]} t
20120 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20130 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 74         foreach t
20140 65 6d 70 46 69 6c 65 4e 61 6d 65 20 5b 61 72 72  empFileName [arr
20150 61 79 20 76 61 6c 75 65 73 20 74 65 6d 70 4e 61  ay values tempNa
20160 6d 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  me] {..         
20170 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
20180 6c 65 20 65 78 69 73 74 73 20 24 74 65 6d 70 46  le exists $tempF
20190 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
201a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
201b0 20 20 20 20 20 20 63 61 74 63 68 20 7b 66 69 6c        catch {fil
201c0 65 20 64 65 6c 65 74 65 20 24 74 65 6d 70 46 69  e delete $tempFi
201d0 6c 65 4e 61 6d 65 7d 0d 0a 20 20 20 20 20 20 20  leName}..       
201e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20220 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
20230 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
20240 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
20250 22 75 6e 6b 6e 6f 77 6e 2c 20 6d 69 73 73 69 6e  "unknown, missin
20260 67 20 6f 70 74 69 6f 6e 61 6c 20 66 65 61 74 75  g optional featu
20270 72 65 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20  re\n"..         
20280 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
20290 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
202a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
202b0 75 6e 6b 6e 6f 77 6e 2c 20 6e 6f 20 45 78 63 65  unknown, no Exce
202c0 6c 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  l interop assemb
202d0 6c 79 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d  ly\n"..        }
202e0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
202f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
20300 24 63 68 61 6e 6e 65 6c 20 22 75 6e 6b 6e 6f 77  $channel "unknow
20310 6e 2c 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f  n, not running o
20320 6e 20 57 69 6e 64 6f 77 73 5c 6e 22 0d 0a 20 20  n Windows\n"..  
20330 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
20340 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
20350 6f 72 54 63 6c 49 6e 73 74 61 6c 6c 73 20 7b 20  orTclInstalls { 
20360 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
20370 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20380 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
20390 20 66 6f 72 20 54 63 6c 20 69 6e 73 74 61 6c 6c   for Tcl install
203a0 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  s... "....      
203b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
203c0 20 43 68 65 63 6b 20 66 6f 72 20 64 79 6e 61 6d   Check for dynam
203d0 69 63 61 6c 6c 79 20 6c 6f 61 64 61 62 6c 65 20  ically loadable 
203e0 54 63 6c 20 6c 69 62 72 61 72 69 65 73 20 28 66  Tcl libraries (f
203f0 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  or this..      #
20400 20 20 20 20 20 20 20 61 72 63 68 69 74 65 63 74         architect
20410 75 72 65 20 6f 6e 6c 79 29 2e 0d 0a 20 20 20 20  ure only)...    
20420 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
20430 63 61 74 63 68 20 7b 74 63 6c 20 73 65 6c 65 63  catch {tcl selec
20440 74 20 2d 61 72 63 68 69 74 65 63 74 75 72 65 7d  t -architecture}
20450 20 74 63 6c 5d 20 3d 3d 20 30 7d 20 74 68 65 6e   tcl] == 0} then
20460 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
20470 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
20480 6f 75 6e 64 20 6f 6e 65 3f 20 20 4f 6b 2c 20 61  ound one?  Ok, a
20490 74 74 65 6d 70 74 20 74 6f 20 67 72 61 62 20 74  ttempt to grab t
204a0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
204b0 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20  version..       
204c0 20 23 20 20 20 20 20 20 20 66 69 65 6c 64 20 66   #       field f
204d0 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 0d 0a 20  rom the list... 
204e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
204f0 20 20 73 65 74 20 69 6e 64 65 78 20 5b 6c 73 65    set index [lse
20500 61 72 63 68 20 2d 65 78 61 63 74 20 24 74 63 6c  arch -exact $tcl
20510 20 76 65 72 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20   version]....   
20520 20 20 20 20 20 69 66 20 7b 24 69 6e 64 65 78 20       if {$index 
20530 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
20540 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20550 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
20560 65 20 76 65 72 79 20 6e 65 78 74 20 6c 69 73 74  e very next list
20570 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20   index contains 
20580 74 68 65 20 76 61 6c 75 65 20 28 69 2e 65 2e 20  the value (i.e. 
20590 6c 69 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20  like..          
205a0 23 20 20 20 20 20 20 20 61 20 54 63 6c 20 38 2e  #       a Tcl 8.
205b0 35 2b 20 64 69 63 74 29 2e 0d 0a 20 20 20 20 20  5+ dict)...     
205c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
205d0 20 20 73 65 74 20 64 6f 74 56 65 72 73 69 6f 6e    set dotVersion
205e0 20 5b 6c 69 6e 64 65 78 20 24 74 63 6c 20 5b 69   [lindex $tcl [i
205f0 6e 63 72 20 69 6e 64 65 78 5d 5d 0d 0a 0d 0a 20  ncr index]].... 
20600 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20610 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
20620 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 76 65 72   we know the ver
20630 73 69 6f 6e 3f 0d 0a 20 20 20 20 20 20 20 20 20  sion?..         
20640 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
20650 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
20660 20 24 64 6f 74 56 65 72 73 69 6f 6e 5d 20 3e 20   $dotVersion] > 
20670 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
20680 20 20 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d        [regexp --
20690 20 7b 5e 5c 64 2b 5c 2e 5c 64 2b 24 7d 20 24 64   {^\d+\.\d+$} $d
206a0 6f 74 56 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e  otVersion]} then
206b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
206c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
206d0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 73 6f 6d 65   NOTE: Yes, some
206e0 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63 6c 20   version of Tcl 
206f0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
20700 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
20710 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
20720 73 74 72 61 69 6e 74 20 74 63 6c 4c 69 62 72 61  straint tclLibra
20730 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ry....          
20740 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
20750 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
20760 76 65 72 73 69 6f 6e 20 38 2e 78 20 6f 72 20 68  version 8.x or h
20770 69 67 68 65 72 3f 0d 0a 20 20 20 20 20 20 20 20  igher?..        
20780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
20790 20 20 20 66 6f 72 65 61 63 68 20 74 63 6c 56 65     foreach tclVe
207a0 72 73 69 6f 6e 20 5b 6c 72 65 76 65 72 73 65 20  rsion [lreverse 
207b0 5b 67 65 74 4b 6e 6f 77 6e 54 63 6c 56 65 72 73  [getKnownTclVers
207c0 69 6f 6e 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20  ions]] {..      
207d0 20 20 20 20 20 20 20 20 69 66 20 7b 24 64 6f 74          if {$dot
207e0 56 65 72 73 69 6f 6e 20 3e 3d 20 5b 67 65 74 44  Version >= [getD
207f0 6f 74 74 65 64 56 65 72 73 69 6f 6e 20 24 74 63  ottedVersion $tc
20800 6c 56 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20  lVersion]} then 
20810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20820 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
20830 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 74 63 6c 4c 69 62 72 61 72 79 20 5b      tclLibrary [
20860 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69 6f  getDotlessVersio
20870 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e 5d 5d 0d  n $tclVersion]].
20880 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
20890 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
208a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
208b0 72 20 6e 6f 77 2c 20 74 68 65 72 65 20 63 61 6e  r now, there can
208c0 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 54 63 6c   be only one Tcl
208d0 20 6c 69 62 72 61 72 79 20 6d 61 74 63 68 3b 0d   library match;.
208e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
208f0 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
20900 72 65 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e  re, we are done.
20910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20920 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
20930 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20       break..    
20940 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20950 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20960 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20970 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20980 41 72 67 73 20 24 64 6f 74 56 65 72 73 69 6f 6e  Args $dotVersion
20990 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
209a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
209b0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
209c0 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
209d0 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
209e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
209f0 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
20a00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20a10 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
20a20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
20a30 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d  nnel no\n..    }
20a40 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
20a50 65 63 6b 46 6f 72 54 63 6c 52 65 61 64 79 20 7b  eckForTclReady {
20a60 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
20a70 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
20a80 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
20a90 67 20 66 6f 72 20 54 63 6c 20 72 65 61 64 69 6e  g for Tcl readin
20aa0 65 73 73 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ess... "....    
20ab0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 74 63    if {[catch {tc
20ac0 6c 20 72 65 61 64 79 7d 20 72 65 61 64 79 5d 20  l ready} ready] 
20ad0 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20  == 0 && \..     
20ae0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 69 73 20       [string is 
20af0 74 72 75 65 20 2d 73 74 72 69 63 74 20 24 72 65  true -strict $re
20b00 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
20b10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20b20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 6e 61   # NOTE: Yes, na
20b30 74 69 76 65 20 54 63 6c 20 69 73 20 6c 6f 61 64  tive Tcl is load
20b40 65 64 20 61 6e 64 20 72 65 61 64 79 2e 0d 0a 20  ed and ready... 
20b50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20b60 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
20b70 74 63 6c 52 65 61 64 79 0d 0a 0d 0a 20 20 20 20  tclReady....    
20b80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
20b90 20 4e 4f 54 45 3a 20 59 65 73 2c 20 6e 61 74 69   NOTE: Yes, nati
20ba0 76 65 20 54 63 6c 20 69 73 20 72 65 61 64 79 20  ve Tcl is ready 
20bb0 2d 4f 52 2d 20 61 76 61 69 6c 61 62 6c 65 2e 0d  -OR- available..
20bc0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20bd0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
20be0 74 20 74 63 6c 52 65 61 64 79 4f 72 4c 69 62 72  t tclReadyOrLibr
20bf0 61 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ary....        #
20c00 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20c10 3a 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20 74 6f  : Ok, attempt to
20c20 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c   determine the l
20c30 6f 61 64 65 64 20 54 63 6c 20 76 65 72 73 69 6f  oaded Tcl versio
20c40 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
20c50 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
20c60 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
20c70 63 6c 20 65 76 61 6c 20 5b 74 63 6c 20 6d 61 73  cl eval [tcl mas
20c80 74 65 72 5d 20 7b 69 6e 66 6f 20 74 63 6c 76 65  ter] {info tclve
20c90 72 73 69 6f 6e 7d 0d 0a 20 20 20 20 20 20 20 20  rsion}..        
20ca0 7d 20 64 6f 74 56 65 72 73 69 6f 6e 5d 20 3d 3d  } dotVersion] ==
20cb0 20 30 20 26 26 20 5b 72 65 67 65 78 70 20 2d 2d   0 && [regexp --
20cc0 20 7b 5e 5c 64 2b 5c 2e 5c 64 2b 24 7d 20 24 64   {^\d+\.\d+$} $d
20cd0 6f 74 56 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e  otVersion]} then
20ce0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
20cf0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
20d00 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20d10 20 20 20 20 20 20 20 20 20 74 63 6c 52 65 61 64           tclRead
20d20 79 20 5b 67 65 74 44 6f 74 6c 65 73 73 56 65 72  y [getDotlessVer
20d30 73 69 6f 6e 20 24 64 6f 74 56 65 72 73 69 6f 6e  sion $dotVersion
20d40 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
20d50 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
20d60 4f 54 45 3a 20 54 68 65 20 54 63 6c 20 6c 69 62  OTE: The Tcl lib
20d70 72 61 72 79 20 69 73 20 72 65 61 64 79 3b 20 68  rary is ready; h
20d80 6f 77 65 76 65 72 2c 20 77 65 20 6e 65 65 64 20  owever, we need 
20d90 74 6f 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20  to add the..    
20da0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
20db0 70 72 6f 70 72 69 61 74 65 20 74 65 73 74 20 63  propriate test c
20dc0 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 69 6e 64  onstraint to ind
20dd0 69 63 61 74 65 20 74 68 61 74 20 61 20 73 70 65  icate that a spe
20de0 63 69 66 69 63 0d 0a 20 20 20 20 20 20 20 20 20  cific..         
20df0 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
20e00 20 6f 66 20 54 63 6c 20 69 73 20 22 65 69 74 68   of Tcl is "eith
20e10 65 72 20 72 65 61 64 79 20 6f 72 20 61 76 61 69  er ready or avai
20e20 6c 61 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20 20  lable"...       
20e30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
20e40 66 6f 72 65 61 63 68 20 74 63 6c 56 65 72 73 69  foreach tclVersi
20e50 6f 6e 20 5b 6c 72 65 76 65 72 73 65 20 5b 67 65  on [lreverse [ge
20e60 74 4b 6e 6f 77 6e 54 63 6c 56 65 72 73 69 6f 6e  tKnownTclVersion
20e70 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  s]] {..         
20e80 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b     set version [
20e90 67 65 74 44 6f 74 6c 65 73 73 56 65 72 73 69 6f  getDotlessVersio
20ea0 6e 20 24 74 63 6c 56 65 72 73 69 6f 6e 5d 0d 0a  n $tclVersion]..
20eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
20ec0 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
20ed0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 74 63  t [appendArgs tc
20ee0 6c 4c 69 62 72 61 72 79 20 24 76 65 72 73 69 6f  lLibrary $versio
20ef0 6e 5d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  n]] && \..      
20f00 20 20 20 20 20 20 20 20 20 20 24 64 6f 74 56 65            $dotVe
20f10 72 73 69 6f 6e 20 3e 3d 20 5b 67 65 74 44 6f 74  rsion >= [getDot
20f20 74 65 64 56 65 72 73 69 6f 6e 20 24 74 63 6c 56  tedVersion $tclV
20f30 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d  ersion]} then {.
20f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
20f50 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
20f60 70 65 6e 64 41 72 67 73 20 74 63 6c 52 65 61 64  pendArgs tclRead
20f70 79 4f 72 4c 69 62 72 61 72 79 20 24 76 65 72 73  yOrLibrary $vers
20f80 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ion]....        
20f90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20fa0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
20fb0 6f 72 20 6e 6f 77 2c 20 74 68 65 72 65 20 63 61  or now, there ca
20fc0 6e 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 54 63  n be only one Tc
20fd0 6c 20 6c 69 62 72 61 72 79 20 6d 61 74 63 68 3b  l library match;
20fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20ff0 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
21000 65 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d  e, we are done..
21010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
21020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21030 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 20  break..         
21040 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21050 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  }....          t
21060 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21070 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
21080 22 20 24 64 6f 74 56 65 72 73 69 6f 6e 20 22 29  " $dotVersion ")
21090 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  \n"]..        } 
210a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
210b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
210c0 20 4e 4f 54 45 3a 20 54 68 65 20 54 63 6c 20 6c   NOTE: The Tcl l
210d0 69 62 72 61 72 79 20 69 73 20 72 65 61 64 79 3b  ibrary is ready;
210e0 20 68 6f 77 65 76 65 72 2c 20 77 65 20 68 61 76   however, we hav
210f0 65 20 6e 6f 20 69 64 65 61 20 77 68 61 74 0d 0a  e no idea what..
21100 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
21110 20 20 76 65 72 73 69 6f 6e 20 69 74 20 61 63 74    version it act
21120 75 61 6c 6c 79 20 69 73 3b 20 74 68 65 72 65 66  ually is; theref
21130 6f 72 65 2c 20 73 6b 69 70 20 61 64 64 69 6e 67  ore, skip adding
21140 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
21150 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
21160 73 74 72 61 69 6e 74 20 74 6f 20 69 6e 64 69 63  straint to indic
21170 61 74 65 20 74 68 61 74 20 61 20 73 70 65 63 69  ate that a speci
21180 66 69 63 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  fic version of T
21190 63 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  cl..          # 
211a0 20 20 20 20 20 20 69 73 20 22 65 69 74 68 65 72        is "either
211b0 20 72 65 61 64 79 20 6f 72 20 61 76 61 69 6c 61   ready or availa
211c0 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 20  ble"...         
211d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   #..          tp
211e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
211f0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  \n..        }.. 
21200 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21210 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21220 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 54 63    # NOTE: The Tc
21230 6c 20 6c 69 62 72 61 72 79 20 69 73 20 6e 6f 74  l library is not
21240 20 72 65 61 64 79 3b 20 68 6f 77 65 76 65 72 2c   ready; however,
21250 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
21260 6f 20 61 64 64 0d 0a 20 20 20 20 20 20 20 20 23  o add..        #
21270 20 20 20 20 20 20 20 74 68 65 20 61 70 70 72 6f         the appro
21280 70 72 69 61 74 65 20 74 65 73 74 20 63 6f 6e 73  priate test cons
21290 74 72 61 69 6e 74 20 74 6f 20 69 6e 64 69 63 61  traint to indica
212a0 74 65 20 74 68 61 74 20 61 20 73 70 65 63 69 66  te that a specif
212b0 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ic..        #   
212c0 20 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 54      version of T
212d0 63 6c 20 69 73 20 22 65 69 74 68 65 72 20 72 65  cl is "either re
212e0 61 64 79 20 6f 72 20 61 76 61 69 6c 61 62 6c 65  ady or available
212f0 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
21300 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 74         foreach t
21310 63 6c 56 65 72 73 69 6f 6e 20 5b 6c 72 65 76 65  clVersion [lreve
21320 72 73 65 20 5b 67 65 74 4b 6e 6f 77 6e 54 63 6c  rse [getKnownTcl
21330 56 65 72 73 69 6f 6e 73 5d 5d 20 7b 0d 0a 20 20  Versions]] {..  
21340 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
21350 69 6f 6e 20 5b 67 65 74 44 6f 74 6c 65 73 73 56  ion [getDotlessV
21360 65 72 73 69 6f 6e 20 24 74 63 6c 56 65 72 73 69  ersion $tclVersi
21370 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
21380 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
21390 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
213a0 20 74 63 6c 4c 69 62 72 61 72 79 20 24 76 65 72   tclLibrary $ver
213b0 73 69 6f 6e 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  sion]]} then {..
213c0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
213d0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
213e0 64 41 72 67 73 20 74 63 6c 52 65 61 64 79 4f 72  dArgs tclReadyOr
213f0 4c 69 62 72 61 72 79 20 24 76 65 72 73 69 6f 6e  Library $version
21400 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
21410 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
21420 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
21430 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e   there can be on
21440 6c 79 20 6f 6e 65 20 54 63 6c 20 6c 69 62 72 61  ly one Tcl libra
21450 72 79 20 6d 61 74 63 68 3b 0d 0a 20 20 20 20 20  ry match;..     
21460 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
21470 68 65 72 65 66 6f 72 65 2c 20 77 65 20 61 72 65  herefore, we are
21480 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20   done...        
21490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
214a0 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20     break..      
214b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
214c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
214d0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
214e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
214f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
21500 63 6b 46 6f 72 54 63 6c 53 65 6c 65 63 74 20 7b  ckForTclSelect {
21510 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
21520 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21530 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
21540 67 20 66 6f 72 20 54 63 6c 20 6c 69 62 72 61 72  g for Tcl librar
21550 79 20 73 65 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22  y selection... "
21560 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
21570 61 74 63 68 20 7b 74 63 6c 20 73 65 6c 65 63 74  atch {tcl select
21580 20 2d 61 72 63 68 69 74 65 63 74 75 72 65 7d 20   -architecture} 
21590 73 65 6c 65 63 74 5d 20 3d 3d 20 30 7d 20 74 68  select] == 0} th
215a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
215b0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
215c0 20 59 65 73 2c 20 6e 61 74 69 76 65 20 54 63 6c   Yes, native Tcl
215d0 20 69 73 20 22 70 72 6f 62 61 62 6c 79 20 6c 6f   is "probably lo
215e0 61 64 61 62 6c 65 22 2e 0d 0a 20 20 20 20 20 20  adable"...      
215f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
21600 43 6f 6e 73 74 72 61 69 6e 74 20 74 63 6c 53 65  Constraint tclSe
21610 6c 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lect....        
21620 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
21630 45 3a 20 4f 6b 2c 20 61 74 74 65 6d 70 74 20 74  E: Ok, attempt t
21640 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
21650 73 65 6c 65 63 74 65 64 20 54 63 6c 20 76 65 72  selected Tcl ver
21660 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23  sion...        #
21670 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
21680 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21690 20 20 67 65 74 44 69 63 74 69 6f 6e 61 72 79 56    getDictionaryV
216a0 61 6c 75 65 20 24 73 65 6c 65 63 74 20 76 65 72  alue $select ver
216b0 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  sion..        } 
216c0 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26  version] == 0 &&
216d0 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e 5c 64   [regexp -- {^\d
216e0 2b 5c 2e 5c 64 2b 24 7d 20 24 76 65 72 73 69 6f  +\.\d+$} $versio
216f0 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
21700 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
21710 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
21720 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21730 20 74 63 6c 53 65 6c 65 63 74 20 5b 73 74 72 69   tclSelect [stri
21740 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2e 20 22  ng map [list . "
21750 22 5d 20 24 76 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  "] $version]]...
21760 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
21770 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21780 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 73  dArgs "yes (" $s
21790 65 6c 65 63 74 20 22 29 5c 6e 22 5d 0d 0a 20 20  elect ")\n"]..  
217a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
217b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
217c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
217d0 68 65 20 54 63 6c 20 6c 69 62 72 61 72 79 20 69  he Tcl library i
217e0 73 20 22 70 72 6f 62 61 62 6c 79 20 6c 6f 61 64  s "probably load
217f0 61 62 6c 65 22 3b 20 68 6f 77 65 76 65 72 2c 20  able"; however, 
21800 77 65 20 68 61 76 65 0d 0a 20 20 20 20 20 20 20  we have..       
21810 20 20 20 23 20 20 20 20 20 20 20 6e 6f 20 69 64     #       no id
21820 65 61 20 77 68 61 74 20 76 65 72 73 69 6f 6e 20  ea what version 
21830 69 74 20 61 63 74 75 61 6c 6c 79 20 69 73 2e 0d  it actually is..
21840 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
21850 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
21860 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
21870 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
21880 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
21890 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
218a0 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
218b0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
218c0 63 20 63 68 65 63 6b 46 6f 72 54 63 6c 53 68 65  c checkForTclShe
218d0 6c 6c 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ll { channel } {
218e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
218f0 20 23 20 48 41 43 4b 3a 20 49 66 20 74 68 69 73   # HACK: If this
21900 20 72 65 74 75 72 6e 73 20 22 65 72 72 6f 72 22   returns "error"
21910 20 74 68 61 74 20 6e 6f 72 6d 61 6c 6c 79 20 69   that normally i
21920 6e 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f  ndicates an erro
21930 72 20 77 61 73 0d 0a 20 20 20 20 20 20 23 20 20  r was..      #  
21940 20 20 20 20 20 63 61 75 67 68 74 20 64 75 72 69       caught duri
21950 6e 67 20 5b 65 78 65 63 5d 20 28 69 2e 65 2e 20  ng [exec] (i.e. 
21960 74 68 65 20 6e 61 74 69 76 65 20 54 63 6c 20 73  the native Tcl s
21970 68 65 6c 6c 20 63 6f 75 6c 64 20 6e 6f 74 20 62  hell could not b
21980 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
21990 20 65 78 65 63 75 74 65 64 29 2e 0d 0a 20 20 20   executed)...   
219a0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
219b0 70 72 65 66 69 78 20 22 2d 2d 2d 2d 20 63 68 65  prefix "---- che
219c0 63 6b 69 6e 67 20 66 6f 72 20 54 63 6c 20 73 68  cking for Tcl sh
219d0 65 6c 6c 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22  ell version... "
219e0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
219f0 61 6e 45 78 65 63 54 63 6c 53 68 65 6c 6c 5d 20  anExecTclShell] 
21a00 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
21a10 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21a20 6e 6f 28 67 65 74 54 63 6c 56 65 72 73 69 6f 6e  no(getTclVersion
21a30 46 6f 72 54 63 6c 53 68 65 6c 6c 29 5d 20 26 26  ForTclShell)] &&
21a40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63   \..          [c
21a50 61 74 63 68 20 7b 67 65 74 54 63 6c 56 65 72 73  atch {getTclVers
21a60 69 6f 6e 46 6f 72 54 63 6c 53 68 65 6c 6c 7d 20  ionForTclShell} 
21a70 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 20 26 26  version] == 0 &&
21a80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 76   \..          $v
21a90 65 72 73 69 6f 6e 20 6e 65 20 22 65 72 72 6f 72  ersion ne "error
21aa0 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
21ab0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
21ac0 4e 4f 54 45 3a 20 59 65 73 2c 20 61 20 6e 61 74  NOTE: Yes, a nat
21ad0 69 76 65 20 54 63 6c 20 73 68 65 6c 6c 20 61 70  ive Tcl shell ap
21ae0 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
21af0 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
21b00 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
21b10 6e 73 74 72 61 69 6e 74 20 74 63 6c 53 68 65 6c  nstraint tclShel
21b20 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
21b30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
21b40 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 76 65 72  Now, add the ver
21b50 73 69 6f 6e 20 73 70 65 63 69 66 69 63 20 74 65  sion specific te
21b60 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a  st constraint...
21b70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21b80 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
21b90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 53              tclS
21bb0 68 65 6c 6c 20 5b 73 74 72 69 6e 67 20 6d 61 70  hell [string map
21bc0 20 5b 6c 69 73 74 20 2e 20 22 22 5d 20 24 76 65   [list . ""] $ve
21bd0 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rsion]]....     
21be0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21bf0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  l [appendArgs $p
21c00 72 65 66 69 78 20 22 79 65 73 20 28 22 20 24 76  refix "yes (" $v
21c10 65 72 73 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 20  ersion ")\n"].. 
21c20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21c30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
21c40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21c50 73 20 24 70 72 65 66 69 78 20 6e 6f 5c 6e 5d 0d  s $prefix no\n].
21c60 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
21c70 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
21c80 63 6b 46 6f 72 54 6b 50 61 63 6b 61 67 65 20 7b  ckForTkPackage {
21c90 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
21ca0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48      #..      # H
21cb0 41 43 4b 3a 20 57 65 20 64 6f 20 6e 6f 74 20 63  ACK: We do not c
21cc0 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 54 6b  are about the Tk
21cd0 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 65   version returne
21ce0 64 20 66 72 6f 6d 20 74 68 69 73 0d 0a 20 20 20  d from this..   
21cf0 20 20 20 23 20 20 20 20 20 20 20 70 72 6f 63 65     #       proce
21d00 64 75 72 65 2c 20 77 65 20 6f 6e 6c 79 20 63 61  dure, we only ca
21d10 72 65 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  re if it returns
21d20 20 22 65 72 72 6f 72 22 20 62 65 63 61 75 73 65   "error" because
21d30 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20   that..      #  
21d40 20 20 20 20 20 77 6f 75 6c 64 20 69 6e 64 69 63       would indic
21d50 61 74 65 20 61 6e 20 65 72 72 6f 72 20 77 61 73  ate an error was
21d60 20 63 61 75 67 68 74 20 64 75 72 69 6e 67 20 5b   caught during [
21d70 65 78 65 63 5d 20 28 69 2e 65 2e 20 74 68 65 0d  exec] (i.e. the.
21d80 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
21d90 61 74 69 76 65 20 54 63 6c 20 73 68 65 6c 6c 20  ative Tcl shell 
21da0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 65 78 65  could not be exe
21db0 63 75 74 65 64 29 2e 0d 0a 20 20 20 20 20 20 23  cuted)...      #
21dc0 0d 0a 20 20 20 20 20 20 73 65 74 20 70 72 65 66  ..      set pref
21dd0 69 78 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  ix "---- checkin
21de0 67 20 66 6f 72 20 54 6b 20 70 61 63 6b 61 67 65  g for Tk package
21df0 20 76 65 72 73 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d   version... "...
21e00 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 6e 45  .      if {[canE
21e10 78 65 63 54 63 6c 53 68 65 6c 6c 5d 20 26 26 20  xecTclShell] && 
21e20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69  \..          ![i
21e30 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
21e40 67 65 74 54 6b 56 65 72 73 69 6f 6e 46 6f 72 54  getTkVersionForT
21e50 63 6c 53 68 65 6c 6c 29 5d 20 26 26 20 5c 0d 0a  clShell)] && \..
21e60 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68            [catch
21e70 20 7b 67 65 74 54 6b 56 65 72 73 69 6f 6e 46 6f   {getTkVersionFo
21e80 72 54 63 6c 53 68 65 6c 6c 7d 20 76 65 72 73 69  rTclShell} versi
21e90 6f 6e 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20  on] == 0 && \.. 
21ea0 20 20 20 20 20 20 20 20 20 24 76 65 72 73 69 6f           $versio
21eb0 6e 20 6e 65 20 22 65 72 72 6f 72 22 7d 20 74 68  n ne "error"} th
21ec0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
21ed0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
21ee0 20 59 65 73 2c 20 61 20 6e 61 74 69 76 65 20 54   Yes, a native T
21ef0 6b 20 70 61 63 6b 61 67 65 20 61 70 70 65 61 72  k package appear
21f00 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
21f10 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
21f20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
21f30 61 69 6e 74 20 74 6b 50 61 63 6b 61 67 65 0d 0a  aint tkPackage..
21f40 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
21f50 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
21f60 41 72 67 73 20 24 70 72 65 66 69 78 20 22 79 65  Args $prefix "ye
21f70 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 29  s (" $version ")
21f80 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
21f90 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
21fa0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
21fb0 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69 78  pendArgs $prefix
21fc0 20 6e 6f 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   no\n]..      }.
21fd0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
21fe0 72 6f 63 20 63 68 65 63 6b 46 6f 72 50 6f 77 65  roc checkForPowe
21ff0 72 53 68 65 6c 6c 20 7b 20 63 68 61 6e 6e 65 6c  rShell { channel
22000 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
22010 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
22020 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 50 6f   checking for Po
22030 77 65 72 53 68 65 6c 6c 2e 2e 2e 20 22 0d 0a 0d  werShell... "...
22040 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
22050 23 20 4e 4f 54 45 3a 20 43 61 6e 20 74 68 65 20  # NOTE: Can the 
22060 50 6f 77 65 72 53 68 65 6c 6c 20 61 73 73 65 6d  PowerShell assem
22070 62 6c 79 20 62 65 20 6c 6f 61 64 65 64 3f 0d 0a  bly be loaded?..
22080 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
22090 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
220a0 20 20 20 20 20 6f 62 6a 65 63 74 20 72 65 73 6f       object reso
220b0 6c 76 65 20 53 79 73 74 65 6d 2e 4d 61 6e 61 67  lve System.Manag
220c0 65 6d 65 6e 74 2e 41 75 74 6f 6d 61 74 69 6f 6e  ement.Automation
220d0 0d 0a 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62  ..      } assemb
220e0 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ly] == 0} then {
220f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22100 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
22110 2c 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61  , it appears tha
22120 74 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  t it is availabl
22130 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
22140 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
22150 61 69 6e 74 20 70 6f 77 65 72 53 68 65 6c 6c 0d  aint powerShell.
22160 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
22170 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
22180 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
22190 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
221a0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
221b0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
221c0 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
221d0 6f 72 57 69 78 20 7b 20 63 68 61 6e 6e 65 6c 20  orWix { channel 
221e0 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
221f0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
22200 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 57 69 58  checking for WiX
22210 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23  ... "....      #
22220 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
22230 50 6c 61 74 66 6f 72 6d 20 6d 75 73 74 20 62 65  Platform must be
22240 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 74 68 69   Windows for thi
22250 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 0d  s constraint to.
22260 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
22270 76 65 6e 20 62 65 20 63 68 65 63 6b 65 64 20 28  ven be checked (
22280 69 2e 65 2e 20 77 65 20 72 65 71 75 69 72 65 20  i.e. we require 
22290 74 68 65 20 72 65 67 69 73 74 72 79 29 2e 0d 0a  the registry)...
222a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
222b0 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  f {[isWindows]} 
222c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
222d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
222e0 45 3a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  E: Indicate that
222f0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f 75   we have not fou
22300 6e 64 20 69 74 20 79 65 74 2e 0d 0a 20 20 20 20  nd it yet...    
22310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
22320 65 74 20 64 69 72 65 63 74 6f 72 79 20 22 22 0d  et directory "".
22330 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22340 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 48 61        # NOTE: Ha
22350 76 65 20 77 65 20 6e 6f 74 20 66 6f 75 6e 64 20  ve we not found 
22360 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 79 65  the directory ye
22370 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t?..        #.. 
22380 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 59         #       Y
22390 65 73 2c 20 74 68 69 73 20 69 73 20 73 6f 6d 65  es, this is some
223a0 77 68 61 74 20 72 65 64 75 6e 64 61 6e 74 20 62  what redundant b
223b0 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 73  ecause we just s
223c0 65 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  et..        #   
223d0 20 20 20 20 74 68 65 20 64 69 72 65 63 74 6f 72      the director
223e0 79 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 74  y to an empty st
223f0 72 69 6e 67 20 28 61 62 6f 76 65 29 3b 20 68 6f  ring (above); ho
22400 77 65 76 65 72 2c 0d 0a 20 20 20 20 20 20 20 20  wever,..        
22410 23 20 20 20 20 20 20 20 6d 61 69 6e 74 61 69 6e  #       maintain
22420 69 6e 67 20 61 20 75 6e 69 66 6f 72 6d 20 70 61  ing a uniform pa
22430 74 74 65 72 6e 20 69 73 20 6d 6f 72 65 20 69 6d  ttern is more im
22440 70 6f 72 74 61 6e 74 2e 0d 0a 20 20 20 20 20 20  portant...      
22450 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
22460 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
22470 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30  $directory] == 0
22480 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
224a0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
224b0 6f 72 20 74 68 65 20 57 49 58 20 65 6e 76 69 72  or the WIX envir
224c0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e  onment variable.
224d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
224e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
224f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
22500 57 49 58 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  WIX)]} then {.. 
22510 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
22520 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
22530 6f 72 6d 61 6c 69 7a 65 20 5b 73 74 72 69 6e 67  ormalize [string
22540 20 74 72 69 6d 72 69 67 68 74 20 24 3a 3a 65 6e   trimright $::en
22550 76 28 57 49 58 29 5d 5d 0d 0a 0d 0a 20 20 20 20  v(WIX)]]....    
22560 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
22570 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
22580 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
22590 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
225a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
225b0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 6e 65     # NOTE: We ne
225c0 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
225d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
225e0 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20  binaries...     
225f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22600 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
22610 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6a 6f  rectory [file jo
22620 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 62 69  in $directory bi
22630 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
22640 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22650 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
22660 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
22670 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 3f 0d  actually exist?.
22680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
226a0 69 66 20 7b 5b 66 69 6c 65 20 69 73 64 69 72 65  if {[file isdire
226b0 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
226c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
226d0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
226f0 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 6e  NOTE: The file n
22700 61 6d 65 20 6f 66 20 74 68 65 20 70 72 69 6d 61  ame of the prima
22710 72 79 20 57 69 58 20 61 73 73 65 6d 62 6c 79 2e  ry WiX assembly.
22720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22730 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
22740 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
22750 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
22760 72 65 63 74 6f 72 79 20 77 69 78 2e 64 6c 6c 5d  rectory wix.dll]
22770 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22790 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
227a0 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  e do not know th
227b0 65 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 79  e file version y
227c0 65 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  et...           
227d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
227e0 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
227f0 69 6f 6e 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20  ion ""....      
22800 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
22820 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
22830 71 75 65 72 79 20 74 68 65 20 76 65 72 73 69 6f  query the versio
22840 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0d 0a  n of the file...
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
22870 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66     if {[catch {f
22880 69 6c 65 20 76 65 72 73 69 6f 6e 20 24 66 69 6c  ile version $fil
22890 65 4e 61 6d 65 7d 20 76 65 72 73 69 6f 6e 5d 20  eName} version] 
228a0 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20  == 0 && \..     
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
228c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
228d0 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65  ersion] > 0} the
228e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
228f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22900 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
22910 54 45 3a 20 49 6e 64 69 63 61 74 65 20 77 68 65  TE: Indicate whe
22920 72 65 20 77 65 20 66 6f 75 6e 64 20 74 68 65 20  re we found the 
22930 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
22940 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
22960 74 20 77 68 65 72 65 20 65 6e 76 69 72 6f 6e 6d  t where environm
22970 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ent..           
22980 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
229b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
229c0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
229d0 65 78 69 73 74 20 6f 72 20 69 73 20 6e 6f 74 20  exist or is not 
229e0 70 72 6f 70 65 72 6c 79 0d 0a 20 20 20 20 20 20  properly..      
229f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
22a00 20 20 20 20 76 65 72 73 69 6f 6e 65 64 2e 0d 0a      versioned...
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
22a30 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
22a40 74 6f 72 79 20 22 22 0d 0a 20 20 20 20 20 20 20  tory ""..       
22a50 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22a60 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
22a70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22a80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22a90 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
22aa0 68 65 20 64 69 72 65 63 74 6f 72 79 20 64 6f 65  he directory doe
22ab0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20  s not exist...  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
22ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ae0 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 22   set directory "
22af0 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "..             
22b00 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
22b10 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
22b20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22b30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22b40 23 20 4e 4f 54 45 3a 20 48 61 76 65 20 77 65 20  # NOTE: Have we 
22b50 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 20 64 69  not found the di
22b60 72 65 63 74 6f 72 79 20 79 65 74 3f 0d 0a 20 20  rectory yet?..  
22b70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22b80 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
22b90 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20  gth $directory] 
22ba0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
22bb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22bc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 67       # NOTE: Reg
22bd0 69 73 74 72 79 20 68 69 76 65 20 77 68 65 72 65  istry hive where
22be0 20 57 69 58 20 69 6e 73 74 61 6c 6c 20 69 6e 66   WiX install inf
22bf0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73 74 6f 72  ormation is stor
22c00 65 64 2e 20 20 4d 61 6b 65 0d 0a 20 20 20 20 20  ed.  Make..     
22c10 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 72       #       sur
22c20 65 20 74 6f 20 6c 6f 6f 6b 20 69 6e 20 74 68 65  e to look in the
22c30 20 57 6f 57 36 34 20 72 65 67 69 73 74 72 79 20   WoW64 registry 
22c40 62 65 63 61 75 73 65 20 57 69 58 20 69 73 20 63  because WiX is c
22c50 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20  urrently..      
22c60 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61      #       alwa
22c70 79 73 20 69 6e 73 74 61 6c 6c 65 64 20 61 73 20  ys installed as 
22c80 61 20 33 32 2d 62 69 74 20 61 70 70 6c 69 63 61  a 32-bit applica
22c90 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  tion...         
22ca0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
22cb0 74 20 6b 65 79 20 5b 61 70 70 65 6e 64 41 72 67  t key [appendArg
22cc0 73 20 48 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41 43  s HKEY_LOCAL_MAC
22cd0 48 49 4e 45 5c 5c 20 5c 0d 0a 20 20 20 20 20 20  HINE\\ \..      
22ce0 20 20 20 20 20 20 20 20 5b 67 65 74 53 6f 66 74          [getSoft
22cf0 77 61 72 65 52 65 67 69 73 74 72 79 4b 65 79 20  wareRegistryKey 
22d00 74 72 75 65 5d 20 7b 5c 4d 69 63 72 6f 73 6f 66  true] {\Microsof
22d10 74 5c 57 69 6e 64 6f 77 73 20 49 6e 73 74 61 6c  t\Windows Instal
22d20 6c 65 72 20 58 4d 4c 7d 5d 0d 0a 0d 0a 20 20 20  ler XML}]....   
22d30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22d40 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
22d50 76 65 72 73 69 6f 6e 73 20 6f 66 20 57 69 58 20  versions of WiX 
22d60 74 68 61 74 20 77 65 20 73 75 70 70 6f 72 74 2e  that we support.
22d70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
22d80 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
22d90 73 69 6f 6e 73 20 5b 6c 69 73 74 20 33 2e 31 31  sions [list 3.11
22da0 20 33 2e 31 30 20 33 2e 39 20 33 2e 38 20 33 2e   3.10 3.9 3.8 3.
22db0 37 20 33 2e 36 20 33 2e 35 20 33 2e 30 5d 0d 0a  7 3.6 3.5 3.0]..
22dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
22dd0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
22de0 20 43 68 65 63 6b 20 65 61 63 68 20 76 65 72 73   Check each vers
22df0 69 6f 6e 2c 20 73 74 6f 70 70 69 6e 67 20 77 68  ion, stopping wh
22e00 65 6e 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2e  en one is found.
22e10 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
22e20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
22e30 20 76 65 72 73 69 6f 6e 20 24 76 65 72 73 69 6f   version $versio
22e40 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ns {..          
22e50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
22e60 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
22e70 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 57 69   to fetch the Wi
22e80 58 20 69 6e 73 74 61 6c 6c 20 64 69 72 65 63 74  X install direct
22e90 6f 72 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  ory value from t
22ea0 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
22eb0 23 20 20 20 20 20 20 20 72 65 67 69 73 74 72 79  #       registry
22ec0 2c 20 72 65 6d 6f 76 69 6e 67 20 74 68 65 20 74  , removing the t
22ed0 72 61 69 6c 69 6e 67 20 62 61 63 6b 73 6c 61 73  railing backslas
22ee0 68 2c 20 69 66 20 61 6e 79 2e 20 20 44 6f 65 73  h, if any.  Does
22ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
22f00 20 20 20 20 20 20 74 68 65 20 64 69 72 65 63 74        the direct
22f10 6f 72 79 20 6e 61 6d 65 20 6c 6f 6f 6b 20 76 61  ory name look va
22f20 6c 69 64 20 61 6e 64 20 64 6f 65 73 20 69 74 20  lid and does it 
22f30 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 3f 0d  actually exist?.
22f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
22f50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
22f60 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 6e 6f 72  [catch {file nor
22f70 6d 61 6c 69 7a 65 20 5b 73 74 72 69 6e 67 20 74  malize [string t
22f80 72 69 6d 72 69 67 68 74 20 5b 6f 62 6a 65 63 74  rimright [object
22f90 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20   invoke \..     
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
22fb0 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33 32 2e 52  icrosoft.Win32.R
22fc0 65 67 69 73 74 72 79 20 47 65 74 56 61 6c 75 65  egistry GetValue
22fd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6b 65   [appendArgs $ke
22fe0 79 20 5c 5c 20 5c 0d 0a 20 20 20 20 20 20 20 20  y \\ \..        
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 24 76 65 72              $ver
23000 73 69 6f 6e 5d 20 49 6e 73 74 61 6c 6c 52 6f 6f  sion] InstallRoo
23010 74 20 6e 75 6c 6c 5d 20 5c 5c 5d 7d 20 64 69 72  t null] \\]} dir
23020 65 63 74 6f 72 79 5d 20 3d 3d 20 30 20 26 26 20  ectory] == 0 && 
23030 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23040 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
23050 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
23060 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
23070 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
23080 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
23090 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
230a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
230b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
230c0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
230d0 6c 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  le name of the p
230e0 72 69 6d 61 72 79 20 57 69 58 20 61 73 73 65 6d  rimary WiX assem
230f0 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  bly...          
23100 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
23110 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
23120 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
23130 72 65 63 74 6f 72 79 20 77 69 78 2e 64 6c 6c 5d  rectory wix.dll]
23140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
23150 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
23160 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f     # NOTE: We do
23170 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 20 66 69   not know the fi
23180 6c 65 20 76 65 72 73 69 6f 6e 20 79 65 74 2e 0d  le version yet..
23190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
231a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
231b0 73 65 74 20 76 65 72 73 69 6f 6e 20 22 22 0d 0a  set version ""..
231c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
231d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
231e0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
231f0 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 76 65   to query the ve
23200 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  rsion of the fil
23210 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
23220 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
23230 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66     if {[catch {f
23240 69 6c 65 20 76 65 72 73 69 6f 6e 20 24 66 69 6c  ile version $fil
23250 65 4e 61 6d 65 7d 20 76 65 72 73 69 6f 6e 5d 20  eName} version] 
23260 3d 3d 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20  == 0 && \..     
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
23280 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
23290 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
232a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
232b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
232c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e        # NOTE: In
232d0 64 69 63 61 74 65 20 77 68 65 72 65 20 77 65 20  dicate where we 
232e0 66 6f 75 6e 64 20 74 68 65 20 66 69 6c 65 2e 0d  found the file..
232f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23300 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
23310 20 20 20 20 73 65 74 20 77 68 65 72 65 20 72 65      set where re
23320 67 69 73 74 72 79 0d 0a 0d 0a 20 20 20 20 20 20  gistry....      
23330 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
23350 4f 54 45 3a 20 57 65 20 66 6f 75 6e 64 20 69 74  OTE: We found it
23360 2c 20 62 61 69 6c 20 6f 75 74 20 6e 6f 77 2e 0d  , bail out now..
23370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23380 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
23390 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20      break..     
233a0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
233b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
233c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
233d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
233e0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
233f0 65 78 69 73 74 20 6f 72 20 69 73 20 6e 6f 74 20  exist or is not 
23400 70 72 6f 70 65 72 6c 79 0d 0a 20 20 20 20 20 20  properly..      
23410 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
23420 20 20 76 65 72 73 69 6f 6e 65 64 2e 0d 0a 20 20    versioned...  
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
23440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23450 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 22   set directory "
23460 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "..             
23470 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
23480 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
23490 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
234a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
234b0 23 20 4e 4f 54 45 3a 20 44 69 64 20 77 65 20 66  # NOTE: Did we f
234c0 69 6e 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  ind the director
234d0 79 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y?..        #.. 
234e0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
234f0 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63  ng length $direc
23500 74 6f 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  tory] > 0 && \..
23510 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
23520 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
23530 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
23540 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
23550 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
23560 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
23570 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76 61  s that it is ava
23580 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
23590 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
235a0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 77 69  addConstraint wi
235b0 78 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  x....          #
235c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
235d0 54 45 3a 20 53 61 76 65 20 74 68 65 20 64 69 72  TE: Save the dir
235e0 65 63 74 6f 72 79 20 66 6f 72 20 6c 61 74 65 72  ectory for later
235f0 20 75 73 61 67 65 20 62 79 0d 0a 20 20 20 20 20   usage by..     
23600 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
23610 20 74 65 73 74 20 69 74 73 65 6c 66 2e 0d 0a 20   test itself... 
23620 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
23630 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
23640 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
23650 57 69 78 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Wix)]} then {.. 
23660 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
23670 3a 74 65 73 74 5f 77 69 78 20 24 64 69 72 65 63  :test_wix $direc
23680 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  tory..          
23690 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
236a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
236b0 54 45 3a 20 53 68 6f 77 20 77 68 65 72 65 20 77  TE: Show where w
236c0 65 20 66 6f 75 6e 64 20 69 74 2e 0d 0a 20 20 20  e found it...   
236d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
236e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
236f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
23700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23710 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
23720 20 22 2c 20 76 69 61 20 22 20 24 77 68 65 72 65   ", via " $where
23730 20 22 2c 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   ", \"" \..     
23740 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74           $direct
23750 6f 72 79 20 22 5c 22 29 5c 6e 22 5d 0d 0a 0d 0a  ory "\")\n"]....
23760 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
23770 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
23780 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 2c  e are done here,
23790 20 72 65 74 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20   return now...  
237a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
237b0 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
237c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
237d0 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
237e0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
237f0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
23800 20 63 68 65 63 6b 46 6f 72 54 61 72 67 65 74 46   checkForTargetF
23810 72 61 6d 65 77 6f 72 6b 20 7b 20 63 68 61 6e 6e  ramework { chann
23820 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
23830 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
23840 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
23850 74 61 72 67 65 74 20 66 72 61 6d 65 77 6f 72 6b  target framework
23860 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
23870 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
23880 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
23890 28 74 61 72 67 65 74 46 72 61 6d 65 77 6f 72 6b  (targetFramework
238a0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
238b0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
238c0 68 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  h $::eagle_platf
238d0 6f 72 6d 28 74 61 72 67 65 74 46 72 61 6d 65 77  orm(targetFramew
238e0 6f 72 6b 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ork)] > 0} then 
238f0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
23900 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
23910 77 20 63 72 65 61 74 65 20 61 20 73 74 72 69 6e  w create a strin
23920 67 20 66 6f 72 20 75 73 65 20 69 6e 20 74 68 65  g for use in the
23930 20 63 6f 6e 73 74 72 61 69 6e 74 20 6e 61 6d 65   constraint name
23940 20 28 72 65 6d 6f 76 65 0d 0a 20 20 20 20 20 20   (remove..      
23950 20 20 23 20 20 20 20 20 20 20 74 68 65 20 69 6e    #       the in
23960 76 61 6c 69 64 20 63 68 61 72 61 63 74 65 72 73  valid characters
23970 29 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  ).  For example:
23980 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23990 20 20 20 20 20 23 20 20 20 20 20 20 20 22 2e 4e       #       ".N
239a0 45 54 46 72 61 6d 65 77 6f 72 6b 2c 56 65 72 73  ETFramework,Vers
239b0 69 6f 6e 3d 76 32 2e 30 22 20 2d 2d 3e 20 22 4e  ion=v2.0" --> "N
239c0 45 54 46 72 61 6d 65 77 6f 72 6b 2e 56 65 72 73  ETFramework.Vers
239d0 69 6f 6e 2e 76 32 2e 30 22 0d 0a 20 20 20 20 20  ion.v2.0"..     
239e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
239f0 74 20 74 61 72 67 65 74 46 72 61 6d 65 77 6f 72  t targetFramewor
23a00 6b 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 6c 65  k [string trimle
23a10 66 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  ft [string map [
23a20 6c 69 73 74 20 2c 20 2e 20 3d 20 2e 5d 20 5c 0d  list , . = .] \.
23a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a  .            $::
23a40 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 74  eagle_platform(t
23a50 61 72 67 65 74 46 72 61 6d 65 77 6f 72 6b 29 5d  argetFramework)]
23a60 20 2e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23   .]....        #
23a70 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23a80 3a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  : Keep track of 
23a90 74 68 65 20 73 70 65 63 69 66 69 63 20 74 61 72  the specific tar
23aa0 67 65 74 20 66 72 61 6d 65 77 6f 72 6b 20 66 6f  get framework fo
23ab0 72 20 75 73 61 67 65 20 69 6e 20 74 65 73 74 0d  r usage in test.
23ac0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
23ad0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
23ae0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23af0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
23b00 5b 61 70 70 65 6e 64 41 72 67 73 20 74 61 72 67  [appendArgs targ
23b10 65 74 46 72 61 6d 65 77 6f 72 6b 2e 20 24 74 61  etFramework. $ta
23b20 72 67 65 74 46 72 61 6d 65 77 6f 72 6b 5d 0d 0a  rgetFramework]..
23b30 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
23b40 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23b50 41 72 67 73 20 22 79 65 73 20 28 22 20 24 74 61  Args "yes (" $ta
23b60 72 67 65 74 46 72 61 6d 65 77 6f 72 6b 20 22 29  rgetFramework ")
23b70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
23b80 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
23b90 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
23ba0 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
23bb0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
23bc0 68 65 63 6b 46 6f 72 4e 61 74 69 76 65 55 74 69  heckForNativeUti
23bd0 6c 69 74 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  lity { channel }
23be0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
23bf0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
23c00 68 65 63 6b 69 6e 67 20 66 6f 72 20 6e 61 74 69  hecking for nati
23c10 76 65 20 75 74 69 6c 69 74 79 2e 2e 2e 20 22 0d  ve utility... ".
23c20 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  ...      if {[in
23c30 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c  fo exists ::eagl
23c40 65 5f 70 6c 61 74 66 6f 72 6d 28 6e 61 74 69 76  e_platform(nativ
23c50 65 55 74 69 6c 69 74 79 29 5d 20 26 26 20 5c 0d  eUtility)] && \.
23c60 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
23c70 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 61 67  ng length $::eag
23c80 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 6e 61 74 69  le_platform(nati
23c90 76 65 55 74 69 6c 69 74 79 29 5d 20 3e 20 30 7d  veUtility)] > 0}
23ca0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23cb0 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64 65   set name [linde
23cc0 78 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  x $::eagle_platf
23cd0 6f 72 6d 28 6e 61 74 69 76 65 55 74 69 6c 69 74  orm(nativeUtilit
23ce0 79 29 20 30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  y) 0]....       
23cf0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
23d00 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
23d10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23d20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 6c    set version [l
23d30 69 6e 64 65 78 20 24 3a 3a 65 61 67 6c 65 5f 70  index $::eagle_p
23d40 6c 61 74 66 6f 72 6d 28 6e 61 74 69 76 65 55 74  latform(nativeUt
23d50 69 6c 69 74 79 29 20 31 5d 0d 0a 0d 0a 20 20 20  ility) 1]....   
23d60 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
23d70 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
23d80 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  on] > 0} then {.
23d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
23da0 20 6e 61 74 69 76 65 55 74 69 6c 69 74 79 20 5b   nativeUtility [
23db0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e                $n
23dd0 61 6d 65 20 2e 20 5b 67 65 74 4d 61 6a 6f 72 4d  ame . [getMajorM
23de0 69 6e 6f 72 56 65 72 73 69 6f 6e 20 24 76 65 72  inorVersion $ver
23df0 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20  sion]]..        
23e00 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23e10 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69          set nati
23e20 76 65 55 74 69 6c 69 74 79 20 24 6e 61 6d 65 0d  veUtility $name.
23e30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
23e40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 6e            if {$n
23e50 61 74 69 76 65 55 74 69 6c 69 74 79 20 6e 69 20  ativeUtility ni 
23e60 22 64 69 73 61 62 6c 65 64 20 75 6e 61 76 61 69  "disabled unavai
23e70 6c 61 62 6c 65 22 7d 20 74 68 65 6e 20 7b 0d 0a  lable"} then {..
23e80 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
23e90 6f 6e 73 74 72 61 69 6e 74 20 6e 61 74 69 76 65  onstraint native
23ea0 55 74 69 6c 69 74 79 0d 0a 20 20 20 20 20 20 20  Utility..       
23eb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23ec0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
23ed0 5b 61 70 70 65 6e 64 41 72 67 73 20 6e 61 74 69  [appendArgs nati
23ee0 76 65 55 74 69 6c 69 74 79 2e 20 24 6e 61 74 69  veUtility. $nati
23ef0 76 65 55 74 69 6c 69 74 79 5d 0d 0a 0d 0a 20 20  veUtility]....  
23f00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23f10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23f20 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
23f30 20 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61      $::eagle_pla
23f40 74 66 6f 72 6d 28 6e 61 74 69 76 65 55 74 69 6c  tform(nativeUtil
23f50 69 74 79 29 20 22 20 28 22 20 24 6e 61 74 69 76  ity) " (" $nativ
23f60 65 55 74 69 6c 69 74 79 20 22 29 5c 6e 22 5d 0d  eUtility ")\n"].
23f70 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
23f80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
23f90 74 73 20 24 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  ts $channel unkn
23fa0 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d  own\n..        }
23fb0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
23fc0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
23fd0 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
23fe0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
23ff0 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
24000 46 6f 72 4e 65 74 46 78 32 30 53 65 72 76 69 63  ForNetFx20Servic
24010 65 50 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  ePack { channel 
24020 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
24030 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
24040 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 2e 4e 45  checking for .NE
24050 54 20 46 72 61 6d 65 77 6f 72 6b 20 32 2e 30 20  T Framework 2.0 
24060 53 65 72 76 69 63 65 20 50 61 63 6b 2e 2e 2e 20  Service Pack... 
24070 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  "....      #..  
24080 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 6c 61 74      # NOTE: Plat
24090 66 6f 72 6d 20 6d 75 73 74 20 62 65 20 57 69 6e  form must be Win
240a0 64 6f 77 73 20 66 6f 72 20 74 68 69 73 20 63 6f  dows for this co
240b0 6e 73 74 72 61 69 6e 74 20 74 6f 20 65 76 65 6e  nstraint to even
240c0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
240d0 20 20 20 63 68 65 63 6b 65 64 20 28 69 2e 65 2e     checked (i.e.
240e0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 20   we require the 
240f0 72 65 67 69 73 74 72 79 29 2e 0d 0a 20 20 20 20  registry)...    
24100 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
24110 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
24120 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
24130 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
24140 65 67 69 73 74 72 79 20 68 69 76 65 20 77 68 65  egistry hive whe
24150 72 65 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d  re the .NET Fram
24160 65 77 6f 72 6b 20 32 2e 30 20 73 65 74 75 70 20  ework 2.0 setup 
24170 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
24180 20 20 20 20 20 73 65 72 76 69 63 69 6e 67 20 69       servicing i
24190 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73 74  nformation is st
241a0 6f 72 65 64 2e 20 20 4e 6f 20 6e 65 65 64 20 74  ored.  No need t
241b0 6f 20 6c 6f 6f 6b 20 69 6e 0d 0a 20 20 20 20 20  o look in..     
241c0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 57     #       the W
241d0 6f 57 36 34 20 72 65 67 69 73 74 72 79 20 62 65  oW64 registry be
241e0 63 61 75 73 65 20 74 68 65 20 2e 4e 45 54 20 46  cause the .NET F
241f0 72 61 6d 65 77 6f 72 6b 20 73 68 6f 75 6c 64 0d  ramework should.
24200 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24210 20 62 65 20 69 6e 73 74 61 6c 6c 65 64 20 6e 61   be installed na
24220 74 69 76 65 6c 79 20 61 73 20 77 65 6c 6c 2e 0d  tively as well..
24230 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24240 20 20 20 20 73 65 74 20 6b 65 79 20 5b 61 70 70      set key [app
24250 65 6e 64 41 72 67 73 20 48 4b 45 59 5f 4c 4f 43  endArgs HKEY_LOC
24260 41 4c 5f 4d 41 43 48 49 4e 45 5c 5c 20 5c 0d 0a  AL_MACHINE\\ \..
24270 20 20 20 20 20 20 20 20 20 20 20 20 7b 53 6f 66              {Sof
24280 74 77 61 72 65 5c 4d 69 63 72 6f 73 6f 66 74 5c  tware\Microsoft\
24290 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 53 65  NET Framework Se
242a0 74 75 70 5c 4e 44 50 5c 76 32 2e 30 2e 35 30 37  tup\NDP\v2.0.507
242b0 32 37 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  27}]....        
242c0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
242d0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 65  E: Attempt to fe
242e0 74 63 68 20 74 68 65 20 2e 4e 45 54 20 46 72 61  tch the .NET Fra
242f0 6d 65 77 6f 72 6b 20 32 2e 30 20 22 53 50 22 20  mework 2.0 "SP" 
24300 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0d 0a  value from the..
24310 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24320 73 65 72 76 69 63 69 6e 67 20 72 65 67 69 73 74  servicing regist
24330 72 79 20 68 69 76 65 2e 20 20 49 66 20 74 68 69  ry hive.  If thi
24340 73 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74  s value does not
24350 20 65 78 69 73 74 20 2d 4f 52 2d 0d 0a 20 20 20   exist -OR-..   
24360 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
24370 6c 65 73 73 20 74 68 61 6e 20 31 2c 20 74 68 65  less than 1, the
24380 6e 20 6e 6f 20 2e 4e 45 54 20 46 72 61 6d 65 77  n no .NET Framew
24390 6f 72 6b 20 32 2e 30 20 73 65 72 76 69 63 65 20  ork 2.0 service 
243a0 70 61 63 6b 20 69 73 0d 0a 20 20 20 20 20 20 20  pack is..       
243b0 20 23 20 20 20 20 20 20 20 69 6e 73 74 61 6c 6c   #       install
243c0 65 64 2e 20 20 49 66 20 74 68 69 73 20 72 61 69  ed.  If this rai
243d0 73 65 73 20 61 20 73 63 72 69 70 74 20 65 72 72  ses a script err
243e0 6f 72 2c 20 74 68 61 74 20 77 69 6c 6c 20 61 6c  or, that will al
243f0 6d 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  most..        # 
24400 20 20 20 20 20 20 63 65 72 74 61 69 6e 6c 79 20        certainly 
24410 63 61 75 73 65 20 74 68 65 20 72 65 73 75 6c 74  cause the result
24420 20 74 6f 20 62 65 20 61 20 6e 6f 6e 2d 69 6e 74   to be a non-int
24430 65 67 65 72 2c 20 74 68 75 73 20 66 61 69 6c 69  eger, thus faili
24440 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ng..        #   
24450 20 20 20 20 74 68 65 20 63 68 65 63 6b 20 62 65      the check be
24460 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  low...        #.
24470 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
24480 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
24490 63 74 20 69 6e 76 6f 6b 65 20 4d 69 63 72 6f 73  ct invoke Micros
244a0 6f 66 74 2e 57 69 6e 33 32 2e 52 65 67 69 73 74  oft.Win32.Regist
244b0 72 79 20 47 65 74 56 61 6c 75 65 20 24 6b 65 79  ry GetValue $key
244c0 20 53 50 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20   SP null..      
244d0 20 20 7d 20 73 65 72 76 69 63 65 50 61 63 6b 0d    } servicePack.
244e0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
244f0 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
24500 72 20 2d 73 74 72 69 63 74 20 24 73 65 72 76 69  r -strict $servi
24510 63 65 50 61 63 6b 5d 7d 20 74 68 65 6e 20 7b 0d  cePack]} then {.
24520 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
24530 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
24540 53 65 72 76 69 63 65 20 70 61 63 6b 73 20 61 72  Service packs ar
24550 65 20 61 6c 77 61 79 73 20 63 75 6d 75 6c 61 74  e always cumulat
24560 69 76 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ive; therefore, 
24570 61 64 64 20 74 65 73 74 0d 0a 20 20 20 20 20 20  add test..      
24580 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 73      #       cons
24590 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6c 6c 20  traints for all 
245a0 73 65 72 76 69 63 65 20 70 61 63 6b 20 6c 65 76  service pack lev
245b0 65 6c 73 20 75 70 20 74 6f 20 74 68 65 20 6f 6e  els up to the on
245c0 65 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  e that..        
245d0 20 20 23 20 20 20 20 20 20 20 69 73 20 61 63 74    #       is act
245e0 75 61 6c 6c 79 20 69 6e 73 74 61 6c 6c 65 64 2e  ually installed.
245f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24600 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65           for {se
24610 74 20 6c 65 76 65 6c 20 30 7d 20 7b 24 6c 65 76  t level 0} {$lev
24620 65 6c 20 3c 3d 20 24 73 65 72 76 69 63 65 50 61  el <= $servicePa
24630 63 6b 7d 20 7b 69 6e 63 72 20 6c 65 76 65 6c 7d  ck} {incr level}
24640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24650 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
24660 70 70 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74  ppendArgs dotNet
24670 32 30 53 70 20 24 6c 65 76 65 6c 20 4f 72 48 69  20Sp $level OrHi
24680 67 68 65 72 5d 0d 0a 20 20 20 20 20 20 20 20 20  gher]..         
24690 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
246a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
246b0 4f 54 45 3a 20 41 6c 73 6f 20 61 64 64 20 74 68  OTE: Also add th
246c0 65 20 22 65 78 61 63 74 22 20 73 65 72 76 69 63  e "exact" servic
246d0 65 20 70 61 63 6b 20 74 65 73 74 20 63 6f 6e 73  e pack test cons
246e0 74 72 61 69 6e 74 20 65 76 65 6e 0d 0a 20 20 20  traint even..   
246f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
24700 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
24710 61 6c 6d 6f 73 74 20 6e 65 76 65 72 20 62 65 20  almost never be 
24720 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  used...         
24730 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
24740 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
24750 65 6e 64 41 72 67 73 20 64 6f 74 4e 65 74 32 30  endArgs dotNet20
24760 53 70 20 24 73 65 72 76 69 63 65 50 61 63 6b 5d  Sp $servicePack]
24770 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
24780 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
24790 45 3a 20 53 68 6f 77 20 74 68 65 20 22 73 65 72  E: Show the "ser
247a0 76 69 63 65 50 61 63 6b 22 20 76 61 6c 75 65 20  vicePack" value 
247b0 77 65 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  we found in the 
247c0 72 65 67 69 73 74 72 79 2e 0d 0a 20 20 20 20 20  registry...     
247d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
247e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
247f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
24800 73 20 28 22 20 24 73 65 72 76 69 63 65 50 61 63  s (" $servicePac
24810 6b 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  k ")\n"]....    
24820 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24830 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
24840 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 72 65 74  e done here, ret
24850 75 72 6e 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  urn now...      
24860 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
24870 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
24880 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
24890 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
248a0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 7d 0d  nel no\n..    }.
248b0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
248c0 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 35  FrameworkSetup45
248d0 31 56 61 6c 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  1Value {} {..   
248e0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
248f0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 77 65 20  TE: Check if we 
24900 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  are running on W
24910 69 6e 64 6f 77 73 20 38 2e 31 2e 0d 0a 20 20 20  indows 8.1...   
24920 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 42 55     #..      # BU
24930 47 42 55 47 3a 20 49 73 20 65 78 61 63 74 20 6d  GBUG: Is exact m
24940 61 74 63 68 69 6e 67 20 63 6f 72 72 65 63 74 20  atching correct 
24950 68 65 72 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  here?..      #..
24960 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
24970 64 6f 77 73 5d 20 26 26 20 5b 69 6e 66 6f 20 65  dows] && [info e
24980 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
24990 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d  form(osVersion)]
249a0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
249b0 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
249c0 28 6f 73 56 65 72 73 69 6f 6e 29 20 3d 3d 20 36  (osVersion) == 6
249d0 2e 33 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  .3} then {..    
249e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
249f0 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75   NOTE: We are ru
24a00 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73  nning on Windows
24a10 20 38 2e 31 2c 20 72 65 74 75 72 6e 20 74 68 65   8.1, return the
24a20 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65 2e 0d   special value..
24a30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24a40 20 20 20 20 72 65 74 75 72 6e 20 33 37 38 36 37      return 37867
24a50 35 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  5..      }....  
24a60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
24a70 4f 54 45 3a 20 57 65 20 61 72 65 20 6e 6f 74 20  OTE: We are not 
24a80 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
24a90 77 73 20 38 2e 31 2c 20 72 65 74 75 72 6e 20 74  ws 8.1, return t
24aa0 68 65 20 6e 6f 72 6d 61 6c 20 76 61 6c 75 65 2e  he normal value.
24ab0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24ac0 20 72 65 74 75 72 6e 20 33 37 38 37 35 38 0d 0a   return 378758..
24ad0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
24ae0 6f 63 20 67 65 74 46 72 61 6d 65 77 6f 72 6b 53  oc getFrameworkS
24af0 65 74 75 70 34 36 56 61 6c 75 65 20 7b 7d 20 7b  etup46Value {} {
24b00 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24b10 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
24b20 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
24b30 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 20 6f   on Windows 10 o
24b40 72 20 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20 20  r later...      
24b50 23 0d 0a 20 20 20 20 20 20 23 20 42 55 47 42 55  #..      # BUGBU
24b60 47 3a 20 49 73 20 67 72 65 61 74 65 72 2d 74 68  G: Is greater-th
24b70 61 6e 2d 6f 72 2d 65 71 75 61 6c 2d 74 6f 20 6d  an-or-equal-to m
24b80 61 74 63 68 69 6e 67 20 63 6f 72 72 65 63 74 20  atching correct 
24b90 68 65 72 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  here?..      #..
24ba0 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
24bb0 64 6f 77 73 5d 20 26 26 20 5b 69 6e 66 6f 20 65  dows] && [info e
24bc0 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
24bd0 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d  form(osVersion)]
24be0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
24bf0 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
24c00 28 6f 73 56 65 72 73 69 6f 6e 29 20 3e 3d 20 31  (osVersion) >= 1
24c10 30 2e 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  0.0} then {..   
24c20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24c30 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72  # NOTE: We are r
24c40 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77  unning on Window
24c50 73 20 31 30 2c 20 72 65 74 75 72 6e 20 74 68 65  s 10, return the
24c60 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65 2e 0d   special value..
24c70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24c80 20 20 20 20 72 65 74 75 72 6e 20 33 39 33 32 39      return 39329
24c90 35 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  5..      }....  
24ca0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
24cb0 4f 54 45 3a 20 57 65 20 61 72 65 20 6e 6f 74 20  OTE: We are not 
24cc0 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
24cd0 77 73 20 31 30 2c 20 72 65 74 75 72 6e 20 74 68  ws 10, return th
24ce0 65 20 6e 6f 72 6d 61 6c 20 76 61 6c 75 65 2e 0d  e normal value..
24cf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
24d00 72 65 74 75 72 6e 20 33 39 33 32 39 37 0d 0a 20  return 393297.. 
24d10 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
24d20 63 20 67 65 74 46 72 61 6d 65 77 6f 72 6b 53 65  c getFrameworkSe
24d30 74 75 70 34 36 31 56 61 6c 75 65 20 7b 7d 20 7b  tup461Value {} {
24d40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24d50 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
24d60 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
24d70 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 20 6f   on Windows 10 o
24d80 72 20 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20 20  r later...      
24d90 23 0d 0a 20 20 20 20 20 20 23 20 42 55 47 42 55  #..      # BUGBU
24da0 47 3a 20 49 73 20 67 72 65 61 74 65 72 2d 74 68  G: Is greater-th
24db0 61 6e 2d 6f 72 2d 65 71 75 61 6c 2d 74 6f 20 6d  an-or-equal-to m
24dc0 61 74 63 68 69 6e 67 20 63 6f 72 72 65 63 74 20  atching correct 
24dd0 68 65 72 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  here?..      #..
24de0 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e        if {[isWin
24df0 64 6f 77 73 5d 20 26 26 20 5b 69 6e 66 6f 20 65  dows] && [info e
24e00 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
24e10 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 5d  form(osVersion)]
24e20 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
24e30 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
24e40 28 6f 73 56 65 72 73 69 6f 6e 29 20 3e 3d 20 31  (osVersion) >= 1
24e50 30 2e 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  0.0 && \..      
24e60 20 20 20 20 5b 68 61 76 65 54 63 6c 50 6c 61 74      [haveTclPlat
24e70 66 6f 72 6d 4f 73 45 78 74 72 61 55 70 64 61 74  formOsExtraUpdat
24e80 65 4e 61 6d 65 20 22 4e 6f 76 65 6d 62 65 72 20  eName "November 
24e90 55 70 64 61 74 65 22 5d 7d 20 74 68 65 6e 20 7b  Update"]} then {
24ea0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24eb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
24ec0 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  are running on W
24ed0 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72  indows 10, retur
24ee0 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76 61  n the special va
24ef0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
24f00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24f10 33 39 34 32 35 34 3b 20 23 20 42 55 47 42 55 47  394254; # BUGBUG
24f20 3a 20 4e 6f 76 65 6d 62 65 72 20 55 70 64 61 74  : November Updat
24f30 65 20 6f 6e 6c 79 3f 0d 0a 20 20 20 20 20 20 7d  e only?..      }
24f40 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
24f50 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72     # NOTE: We ar
24f60 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f 6e  e not running on
24f70 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74   Windows 10, ret
24f80 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 76  urn the normal v
24f90 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  alue...      #..
24fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 39 34        return 394
24fb0 32 37 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  271..    }..... 
24fc0 20 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d 65     proc getFrame
24fd0 77 6f 72 6b 53 65 74 75 70 34 36 32 56 61 6c 75  workSetup462Valu
24fe0 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
24ff0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
25000 68 65 63 6b 20 69 66 20 77 65 20 61 72 65 20 72  heck if we are r
25010 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77  unning on Window
25020 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d 0a  s 10 or later...
25030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
25040 20 42 55 47 42 55 47 3a 20 49 73 20 67 72 65 61   BUGBUG: Is grea
25050 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75 61  ter-than-or-equa
25060 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63 6f  l-to matching co
25070 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20 20  rrect here?..   
25080 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
25090 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b  [isWindows] && [
250a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
250b0 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72  l_platform(osVer
250c0 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20 20  sion)] && \..   
250d0 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70 6c         $::tcl_pl
250e0 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e  atform(osVersion
250f0 29 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c 0d 0a  ) >= 10.0 && \..
25100 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 54            [haveT
25110 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74 72  clPlatformOsExtr
25120 61 55 70 64 61 74 65 4e 61 6d 65 20 22 41 6e 6e  aUpdateName "Ann
25130 69 76 65 72 73 61 72 79 20 55 70 64 61 74 65 22  iversary Update"
25140 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25150 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25160 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e  NOTE: We are run
25170 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ning on Windows 
25180 31 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73  10, return the s
25190 70 65 63 69 61 6c 20 76 61 6c 75 65 2e 0d 0a 20  pecial value... 
251a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
251b0 20 20 72 65 74 75 72 6e 20 33 39 34 38 30 32 3b    return 394802;
251c0 20 23 20 42 55 47 42 55 47 3a 20 41 6e 6e 69 76   # BUGBUG: Anniv
251d0 65 72 73 61 72 79 20 55 70 64 61 74 65 20 6f 6e  ersary Update on
251e0 6c 79 3f 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ly?..      }....
251f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
25200 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 6e 6f   NOTE: We are no
25210 74 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e  t running on Win
25220 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72 6e 20  dows 10, return 
25230 74 68 65 20 6e 6f 72 6d 61 6c 20 76 61 6c 75 65  the normal value
25240 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
25250 20 20 72 65 74 75 72 6e 20 33 39 34 38 30 36 0d    return 394806.
25260 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
25270 72 6f 63 20 67 65 74 46 72 61 6d 65 77 6f 72 6b  roc getFramework
25280 53 65 74 75 70 34 37 56 61 6c 75 65 20 7b 7d 20  Setup47Value {} 
25290 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
252a0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
252b0 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
252c0 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20 31 30 20  g on Windows 10 
252d0 6f 72 20 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20  or later...     
252e0 20 23 0d 0a 20 20 20 20 20 20 23 20 42 55 47 42   #..      # BUGB
252f0 55 47 3a 20 49 73 20 67 72 65 61 74 65 72 2d 74  UG: Is greater-t
25300 68 61 6e 2d 6f 72 2d 65 71 75 61 6c 2d 74 6f 20  han-or-equal-to 
25310 6d 61 74 63 68 69 6e 67 20 63 6f 72 72 65 63 74  matching correct
25320 20 68 65 72 65 3f 0d 0a 20 20 20 20 20 20 23 0d   here?..      #.
25330 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69  .      if {[isWi
25340 6e 64 6f 77 73 5d 20 26 26 20 5b 69 6e 66 6f 20  ndows] && [info 
25350 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
25360 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29  tform(osVersion)
25370 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
25380 20 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72    $::tcl_platfor
25390 6d 28 6f 73 56 65 72 73 69 6f 6e 29 20 3e 3d 20  m(osVersion) >= 
253a0 31 30 2e 30 20 26 26 20 5c 0d 0a 20 20 20 20 20  10.0 && \..     
253b0 20 20 20 20 20 5b 68 61 76 65 54 63 6c 50 6c 61       [haveTclPla
253c0 74 66 6f 72 6d 4f 73 45 78 74 72 61 55 70 64 61  tformOsExtraUpda
253d0 74 65 4e 61 6d 65 20 22 43 72 65 61 74 6f 72 73  teName "Creators
253e0 20 55 70 64 61 74 65 22 5d 7d 20 74 68 65 6e 20   Update"]} then 
253f0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
25400 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
25410 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
25420 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75  Windows 10, retu
25430 72 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 76  rn the special v
25440 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
25450 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
25460 20 34 36 30 37 39 38 3b 20 23 20 42 55 47 42 55   460798; # BUGBU
25470 47 3a 20 43 72 65 61 74 6f 72 73 20 55 70 64 61  G: Creators Upda
25480 74 65 20 6f 6e 6c 79 3f 0d 0a 20 20 20 20 20 20  te only?..      
25490 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
254a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
254b0 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f  re not running o
254c0 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65  n Windows 10, re
254d0 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20  turn the normal 
254e0 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d  value...      #.
254f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 36  .      return 46
25500 30 38 30 35 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  0805..    }.....
25510 20 20 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d      proc getFram
25520 65 77 6f 72 6b 53 65 74 75 70 34 37 31 56 61 6c  eworkSetup471Val
25530 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
25540 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
25550 43 68 65 63 6b 20 69 66 20 77 65 20 61 72 65 20  Check if we are 
25560 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
25570 77 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d  ws 10 or later..
25580 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
25590 23 20 42 55 47 42 55 47 3a 20 49 73 20 67 72 65  # BUGBUG: Is gre
255a0 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75  ater-than-or-equ
255b0 61 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63  al-to matching c
255c0 6f 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20  orrect here?..  
255d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
255e0 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
255f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
25600 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
25610 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20  rsion)] && \..  
25620 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70          $::tcl_p
25630 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f  latform(osVersio
25640 6e 29 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c 0d  n) >= 10.0 && \.
25650 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
25660 54 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74  TclPlatformOsExt
25670 72 61 55 70 64 61 74 65 4e 61 6d 65 20 22 46 61  raUpdateName "Fa
25680 6c 6c 20 43 72 65 61 74 6f 72 73 20 55 70 64 61  ll Creators Upda
25690 74 65 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  te"]} then {..  
256a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
256b0 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
256c0 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
256d0 77 73 20 31 30 2c 20 72 65 74 75 72 6e 20 74 68  ws 10, return th
256e0 65 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65 2e  e special value.
256f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25700 20 20 20 20 20 72 65 74 75 72 6e 20 34 36 31 33       return 4613
25710 30 38 3b 20 23 20 42 55 47 42 55 47 3a 20 46 61  08; # BUGBUG: Fa
25720 6c 6c 20 43 72 65 61 74 6f 72 73 20 55 70 64 61  ll Creators Upda
25730 74 65 20 6f 6e 6c 79 3f 0d 0a 20 20 20 20 20 20  te only?..      
25740 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
25750 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 61      # NOTE: We a
25760 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f  re not running o
25770 6e 20 57 69 6e 64 6f 77 73 20 31 30 2c 20 72 65  n Windows 10, re
25780 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20  turn the normal 
25790 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d  value...      #.
257a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 36  .      return 46
257b0 31 33 31 30 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  1310..    }.....
257c0 20 20 20 20 70 72 6f 63 20 67 65 74 46 72 61 6d      proc getFram
257d0 65 77 6f 72 6b 53 65 74 75 70 34 37 32 56 61 6c  eworkSetup472Val
257e0 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
257f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
25800 43 68 65 63 6b 20 69 66 20 77 65 20 61 72 65 20  Check if we are 
25810 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f  running on Windo
25820 77 73 20 31 30 20 6f 72 20 6c 61 74 65 72 2e 0d  ws 10 or later..
25830 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
25840 23 20 42 55 47 42 55 47 3a 20 49 73 20 67 72 65  # BUGBUG: Is gre
25850 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 71 75  ater-than-or-equ
25860 61 6c 2d 74 6f 20 6d 61 74 63 68 69 6e 67 20 63  al-to matching c
25870 6f 72 72 65 63 74 20 68 65 72 65 3f 0d 0a 20 20  orrect here?..  
25880 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
25890 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
258a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
258b0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65  cl_platform(osVe
258c0 72 73 69 6f 6e 29 5d 20 26 26 20 5c 0d 0a 20 20  rsion)] && \..  
258d0 20 20 20 20 20 20 20 20 24 3a 3a 74 63 6c 5f 70          $::tcl_p
258e0 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72 73 69 6f  latform(osVersio
258f0 6e 29 20 3e 3d 20 31 30 2e 30 20 26 26 20 5c 0d  n) >= 10.0 && \.
25900 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
25910 54 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74  TclPlatformOsExt
25920 72 61 55 70 64 61 74 65 4e 61 6d 65 20 22 41 70  raUpdateName "Ap
25930 72 69 6c 20 32 30 31 38 20 55 70 64 61 74 65 22  ril 2018 Update"
25940 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25950 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25960 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 72 75 6e  NOTE: We are run
25970 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ning on Windows 
25980 31 30 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73  10, return the s
25990 70 65 63 69 61 6c 20 76 61 6c 75 65 2e 0d 0a 20  pecial value... 
259a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
259b0 20 20 72 65 74 75 72 6e 20 34 36 31 38 30 38 3b    return 461808;
259c0 20 23 20 42 55 47 42 55 47 3a 20 46 61 6c 6c 20   # BUGBUG: Fall 
259d0 43 72 65 61 74 6f 72 73 20 55 70 64 61 74 65 20  Creators Update 
259e0 6f 6e 6c 79 3f 0d 0a 20 20 20 20 20 20 7d 0d 0a  only?..      }..
259f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
25a00 20 23 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20   # NOTE: We are 
25a10 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  not running on W
25a20 69 6e 64 6f 77 73 20 31 30 2c 20 72 65 74 75 72  indows 10, retur
25a30 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 76 61 6c  n the normal val
25a40 75 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ue...      #..  
25a50 20 20 20 20 72 65 74 75 72 6e 20 34 36 31 38 31      return 46181
25a60 34 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  4..    }.....   
25a70 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 4e 65   proc checkForNe
25a80 74 46 78 34 78 20 7b 20 63 68 61 6e 6e 65 6c 20  tFx4x { channel 
25a90 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
25aa0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
25ab0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 2e 4e 45  checking for .NE
25ac0 54 20 46 72 61 6d 65 77 6f 72 6b 20 34 2e 78 2e  T Framework 4.x.
25ad0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .. "....      #.
25ae0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50  .      # NOTE: P
25af0 6c 61 74 66 6f 72 6d 20 6d 75 73 74 20 62 65 20  latform must be 
25b00 57 69 6e 64 6f 77 73 20 66 6f 72 20 74 68 69 73  Windows for this
25b10 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 65   constraint to e
25b20 76 65 6e 20 62 65 0d 0a 20 20 20 20 20 20 23 20  ven be..      # 
25b30 20 20 20 20 20 20 63 68 65 63 6b 65 64 20 28 69        checked (i
25b40 2e 65 2e 20 77 65 20 72 65 71 75 69 72 65 20 74  .e. we require t
25b50 68 65 20 72 65 67 69 73 74 72 79 29 2e 0d 0a 20  he registry)... 
25b60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
25b70 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74   {[isWindows]} t
25b80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
25b90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
25ba0 3a 20 52 65 67 69 73 74 72 79 20 68 69 76 65 20  : Registry hive 
25bb0 77 68 65 72 65 20 74 68 65 20 2e 4e 45 54 20 46  where the .NET F
25bc0 72 61 6d 65 77 6f 72 6b 20 34 2e 30 20 73 65 74  ramework 4.0 set
25bd0 75 70 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  up and..        
25be0 23 20 20 20 20 20 20 20 73 65 72 76 69 63 69 6e  #       servicin
25bf0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  g information is
25c00 20 73 74 6f 72 65 64 2e 20 20 4e 6f 20 6e 65 65   stored.  No nee
25c10 64 20 74 6f 20 6c 6f 6f 6b 20 69 6e 0d 0a 20 20  d to look in..  
25c20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
25c30 65 20 57 6f 57 36 34 20 72 65 67 69 73 74 72 79  e WoW64 registry
25c40 20 62 65 63 61 75 73 65 20 74 68 65 20 2e 4e 45   because the .NE
25c50 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 68 6f 75  T Framework shou
25c60 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ld..        #   
25c70 20 20 20 20 62 65 20 69 6e 73 74 61 6c 6c 65 64      be installed
25c80 20 6e 61 74 69 76 65 6c 79 20 61 73 20 77 65 6c   natively as wel
25c90 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  l...        #.. 
25ca0 20 20 20 20 20 20 20 73 65 74 20 6b 65 79 20 5b         set key [
25cb0 61 70 70 65 6e 64 41 72 67 73 20 48 4b 45 59 5f  appendArgs HKEY_
25cc0 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e 45 5c 5c 20  LOCAL_MACHINE\\ 
25cd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  \..            {
25ce0 53 6f 66 74 77 61 72 65 5c 4d 69 63 72 6f 73 6f  Software\Microso
25cf0 66 74 5c 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  ft\NET Framework
25d00 20 53 65 74 75 70 5c 4e 44 50 5c 76 34 5c 46 75   Setup\NDP\v4\Fu
25d10 6c 6c 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ll}]....        
25d20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
25d30 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 65  E: Attempt to fe
25d40 74 63 68 20 74 68 65 20 2e 4e 45 54 20 46 72 61  tch the .NET Fra
25d50 6d 65 77 6f 72 6b 20 34 2e 30 20 22 72 65 6c 65  mework 4.0 "rele
25d60 61 73 65 22 20 76 61 6c 75 65 20 66 72 6f 6d 0d  ase" value from.
25d70 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25d80 20 74 68 65 20 73 65 72 76 69 63 69 6e 67 20 72   the servicing r
25d90 65 67 69 73 74 72 79 20 68 69 76 65 2e 20 20 49  egistry hive.  I
25da0 66 20 74 68 69 73 20 76 61 6c 75 65 20 64 6f 65  f this value doe
25db0 73 20 6e 6f 74 20 65 78 69 73 74 0d 0a 20 20 20  s not exist..   
25dc0 20 20 20 20 20 23 20 20 20 20 20 20 20 2d 4f 52       #       -OR
25dd0 2d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  - is less than 3
25de0 37 38 33 38 39 2c 20 74 68 65 6e 20 74 68 65 20  78389, then the 
25df0 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 34  .NET Framework 4
25e00 2e 35 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20  .5 is not..     
25e10 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 61     #       insta
25e20 6c 6c 65 64 2e 20 20 49 66 20 74 68 69 73 20 72  lled.  If this r
25e30 61 69 73 65 73 20 61 20 73 63 72 69 70 74 20 65  aises a script e
25e40 72 72 6f 72 2c 20 74 68 61 74 20 77 69 6c 6c 20  rror, that will 
25e50 61 6c 6d 6f 73 74 0d 0a 20 20 20 20 20 20 20 20  almost..        
25e60 23 20 20 20 20 20 20 20 63 65 72 74 61 69 6e 6c  #       certainl
25e70 79 20 63 61 75 73 65 20 74 68 65 20 72 65 73 75  y cause the resu
25e80 6c 74 20 74 6f 20 62 65 20 61 20 6e 6f 6e 2d 69  lt to be a non-i
25e90 6e 74 65 67 65 72 2c 20 74 68 75 73 20 66 61 69  nteger, thus fai
25ea0 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  ling..        # 
25eb0 20 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 20        the check 
25ec0 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  below...        
25ed0 23 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  #..        catch
25ee0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
25ef0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 4d 69 63 72  ject invoke Micr
25f00 6f 73 6f 66 74 2e 57 69 6e 33 32 2e 52 65 67 69  osoft.Win32.Regi
25f10 73 74 72 79 20 47 65 74 56 61 6c 75 65 20 24 6b  stry GetValue $k
25f20 65 79 20 52 65 6c 65 61 73 65 20 6e 75 6c 6c 0d  ey Release null.
25f30 0a 20 20 20 20 20 20 20 20 7d 20 72 65 6c 65 61  .        } relea
25f40 73 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  se....        if
25f50 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74   {[string is int
25f60 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 72 65  eger -strict $re
25f70 6c 65 61 73 65 5d 20 26 26 20 24 72 65 6c 65 61  lease] && $relea
25f80 73 65 20 3e 3d 20 33 37 38 33 38 39 7d 20 74 68  se >= 378389} th
25f90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25fa0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
25fb0 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70  OTE: Yes, it app
25fc0 65 61 72 73 20 74 68 61 74 20 69 74 20 69 73 20  ears that it is 
25fd0 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
25fe0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25ff0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
26000 20 64 6f 74 4e 65 74 34 35 4f 72 48 69 67 68 65   dotNet45OrHighe
26010 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  r....          #
26020 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
26030 54 45 3a 20 49 66 20 74 68 65 20 22 72 65 6c 65  TE: If the "rele
26040 61 73 65 22 20 76 61 6c 75 65 20 69 73 20 67 72  ase" value is gr
26050 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
26060 75 61 6c 20 74 6f 20 33 37 38 37 35 38 0d 0a 20  ual to 378758.. 
26070 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
26080 20 28 6f 72 20 33 37 38 36 37 35 20 66 6f 72 20   (or 378675 for 
26090 57 69 6e 64 6f 77 73 20 38 2e 31 29 2c 20 74 68  Windows 8.1), th
260a0 65 6e 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d  en the .NET Fram
260b0 65 77 6f 72 6b 20 34 2e 35 2e 31 0d 0a 20 20 20  ework 4.5.1..   
260c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
260d0 73 20 69 6e 73 74 61 6c 6c 65 64 2e 20 20 48 6f  s installed.  Ho
260e0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 22 72  wever, if the "r
260f0 65 6c 65 61 73 65 22 20 76 61 6c 75 65 20 69 73  elease" value is
26100 20 61 6c 73 6f 0d 0a 20 20 20 20 20 20 20 20 20   also..         
26110 20 23 20 20 20 20 20 20 20 67 72 65 61 74 65 72   #       greater
26120 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
26130 6f 20 33 37 39 38 39 33 2c 20 74 68 65 6e 20 74  o 379893, then t
26140 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  he .NET Framewor
26150 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  k..          #  
26160 20 20 20 20 20 34 2e 35 2e 32 20 69 73 20 69 6e       4.5.2 is in
26170 73 74 61 6c 6c 65 64 2c 20 77 68 69 63 68 20 69  stalled, which i
26180 73 20 61 6e 20 69 6e 2d 70 6c 61 63 65 20 75 70  s an in-place up
26190 67 72 61 64 65 20 74 6f 20 34 2e 35 2e 31 0d 0a  grade to 4.5.1..
261a0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
261b0 20 20 28 61 6e 64 20 34 2e 35 29 2e 20 20 49 66    (and 4.5).  If
261c0 20 74 68 65 20 22 72 65 6c 65 61 73 65 22 20 76   the "release" v
261d0 61 6c 75 65 20 69 73 20 61 6c 73 6f 20 67 72 65  alue is also gre
261e0 61 74 65 72 20 74 68 61 6e 20 6f 72 0d 0a 20 20  ater than or..  
261f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26200 65 71 75 61 6c 20 74 6f 20 33 39 33 32 39 37 20  equal to 393297 
26210 28 33 39 33 32 39 35 20 6f 6e 20 57 69 6e 64 6f  (393295 on Windo
26220 77 73 20 31 30 29 2c 20 74 68 65 6e 20 74 68 65  ws 10), then the
26230 20 2e 4e 45 54 0d 0a 20 20 20 20 20 20 20 20 20   .NET..         
26240 20 23 20 20 20 20 20 20 20 46 72 61 6d 65 77 6f   #       Framewo
26250 72 6b 20 34 2e 36 20 69 73 20 69 6e 73 74 61 6c  rk 4.6 is instal
26260 6c 65 64 2c 20 77 68 69 63 68 20 69 73 20 61 6e  led, which is an
26270 20 69 6e 2d 70 6c 61 63 65 20 75 70 67 72 61 64   in-place upgrad
26280 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
26290 20 20 20 20 20 74 6f 20 34 2e 35 2e 78 2e 20 20       to 4.5.x.  
262a0 53 69 6d 69 6c 61 72 20 68 61 6e 64 6c 69 6e 67  Similar handling
262b0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
262c0 72 20 74 68 65 20 2e 4e 45 54 0d 0a 20 20 20 20  r the .NET..    
262d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 46 72        #       Fr
262e0 61 6d 65 77 6f 72 6b 20 34 2e 36 2e 31 2c 20 34  amework 4.6.1, 4
262f0 2e 36 2e 32 2c 20 34 2e 37 2c 20 34 2e 37 2e 31  .6.2, 4.7, 4.7.1
26300 2c 20 61 6e 64 20 34 2e 37 2e 32 2e 20 20 46 6f  , and 4.7.2.  Fo
26310 72 20 6d 6f 72 65 0d 0a 20 20 20 20 20 20 20 20  r more..        
26320 20 20 23 20 20 20 20 20 20 20 69 6e 66 6f 72 6d    #       inform
26330 61 74 69 6f 6e 2c 20 73 65 65 3a 0d 0a 20 20 20  ation, see:..   
26340 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26350 20 20 20 20 23 20 20 20 20 20 20 20 68 74 74 70      #       http
26360 73 3a 2f 2f 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f  s://msdn.microso
26370 66 74 2e 63 6f 6d 2f 65 6e 2d 75 73 2f 6c 69 62  ft.com/en-us/lib
26380 72 61 72 79 2f 68 68 39 32 35 35 36 38 2e 61 73  rary/hh925568.as
26390 70 78 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  px..          #.
263a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
263b0 72 65 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74 46  release >= [getF
263c0 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 37 32  rameworkSetup472
263d0 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
263e0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
263f0 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
26400 34 35 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  451OrHigher..   
26410 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
26420 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32  traint dotNet452
26430 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20  OrHigher..      
26440 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
26450 69 6e 74 20 64 6f 74 4e 65 74 34 36 4f 72 48 69  int dotNet46OrHi
26460 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  gher..          
26470 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
26480 64 6f 74 4e 65 74 34 36 31 4f 72 48 69 67 68 65  dotNet461OrHighe
26490 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  r..            a
264a0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
264b0 4e 65 74 34 36 32 4f 72 48 69 67 68 65 72 0d 0a  Net462OrHigher..
264c0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
264d0 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
264e0 34 37 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20  47OrHigher..    
264f0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
26500 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 37 31 4f  raint dotNet471O
26510 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20  rHigher..       
26520 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
26530 6e 74 20 64 6f 74 4e 65 74 34 37 32 0d 0a 20 20  nt dotNet472..  
26540 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
26550 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 37  straint dotNet47
26560 32 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20  2OrHigher....   
26570 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
26580 73 69 6f 6e 20 34 2e 37 2e 32 0d 0a 20 20 20 20  sion 4.7.2..    
26590 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
265a0 24 72 65 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74  $release >= [get
265b0 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 37  FrameworkSetup47
265c0 31 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  1Value]} then {.
265d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
265e0 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
265f0 74 34 35 31 4f 72 48 69 67 68 65 72 0d 0a 20 20  t451OrHigher..  
26600 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
26610 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35  straint dotNet45
26620 32 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20  2OrHigher..     
26630 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
26640 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 4f 72 48  aint dotNet46OrH
26650 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20  igher..         
26660 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
26670 20 64 6f 74 4e 65 74 34 36 31 4f 72 48 69 67 68   dotNet461OrHigh
26680 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
26690 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
266a0 74 4e 65 74 34 36 32 4f 72 48 69 67 68 65 72 0d  tNet462OrHigher.
266b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
266c0 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
266d0 74 34 37 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  t47OrHigher..   
266e0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
266f0 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 37 31  traint dotNet471
26700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
26710 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
26720 65 74 34 37 31 4f 72 48 69 67 68 65 72 0d 0a 0d  et471OrHigher...
26730 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
26740 20 76 65 72 73 69 6f 6e 20 34 2e 37 2e 31 0d 0a   version 4.7.1..
26750 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
26760 69 66 20 7b 24 72 65 6c 65 61 73 65 20 3e 3d 20  if {$release >= 
26770 5b 67 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74  [getFrameworkSet
26780 75 70 34 37 56 61 6c 75 65 5d 7d 20 74 68 65 6e  up47Value]} then
26790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
267a0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
267b0 74 4e 65 74 34 35 31 4f 72 48 69 67 68 65 72 0d  tNet451OrHigher.
267c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
267d0 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
267e0 74 34 35 32 4f 72 48 69 67 68 65 72 0d 0a 20 20  t452OrHigher..  
267f0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
26800 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36  straint dotNet46
26810 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20  OrHigher..      
26820 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
26830 69 6e 74 20 64 6f 74 4e 65 74 34 36 31 4f 72 48  int dotNet461OrH
26840 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20  igher..         
26850 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
26860 20 64 6f 74 4e 65 74 34 36 32 4f 72 48 69 67 68   dotNet462OrHigh
26870 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
26880 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f  addConstraint do
26890 74 4e 65 74 34 37 0d 0a 20 20 20 20 20 20 20 20  tNet47..        
268a0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
268b0 74 20 64 6f 74 4e 65 74 34 37 4f 72 48 69 67 68  t dotNet47OrHigh
268c0 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  er....          
268d0 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 34 2e    set version 4.
268e0 37 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  7..          } e
268f0 6c 73 65 69 66 20 7b 24 72 65 6c 65 61 73 65 20  lseif {$release 
26900 3e 3d 20 5b 67 65 74 46 72 61 6d 65 77 6f 72 6b  >= [getFramework
26910 53 65 74 75 70 34 36 32 56 61 6c 75 65 5d 7d 20  Setup462Value]} 
26920 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26930 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
26940 74 20 64 6f 74 4e 65 74 34 35 31 4f 72 48 69 67  t dotNet451OrHig
26950 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  her..           
26960 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
26970 6f 74 4e 65 74 34 35 32 4f 72 48 69 67 68 65 72  otNet452OrHigher
26980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
26990 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e  dConstraint dotN
269a0 65 74 34 36 4f 72 48 69 67 68 65 72 0d 0a 20 20  et46OrHigher..  
269b0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
269c0 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36  straint dotNet46
269d0 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20  1OrHigher..     
269e0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
269f0 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 32 0d 0a  aint dotNet462..
26a00 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
26a10 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
26a20 34 36 32 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20  462OrHigher.... 
26a30 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
26a40 65 72 73 69 6f 6e 20 34 2e 36 2e 32 0d 0a 20 20  ersion 4.6.2..  
26a50 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
26a60 20 7b 24 72 65 6c 65 61 73 65 20 3e 3d 20 5b 67   {$release >= [g
26a70 65 74 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70  etFrameworkSetup
26a80 34 36 31 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20  461Value]} then 
26a90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
26aa0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
26ab0 4e 65 74 34 35 31 4f 72 48 69 67 68 65 72 0d 0a  Net451OrHigher..
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
26ad0 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
26ae0 34 35 32 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  452OrHigher..   
26af0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
26b00 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36 4f  traint dotNet46O
26b10 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20 20  rHigher..       
26b20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
26b30 6e 74 20 64 6f 74 4e 65 74 34 36 31 0d 0a 20 20  nt dotNet461..  
26b40 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
26b50 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36  straint dotNet46
26b60 31 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20  1OrHigher....   
26b70 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
26b80 73 69 6f 6e 20 34 2e 36 2e 31 0d 0a 20 20 20 20  sion 4.6.1..    
26b90 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
26ba0 24 72 65 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74  $release >= [get
26bb0 46 72 61 6d 65 77 6f 72 6b 53 65 74 75 70 34 36  FrameworkSetup46
26bc0 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43              addC
26be0 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74  onstraint dotNet
26bf0 34 35 31 4f 72 48 69 67 68 65 72 0d 0a 20 20 20  451OrHigher..   
26c00 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
26c10 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32  traint dotNet452
26c20 4f 72 48 69 67 68 65 72 0d 0a 20 20 20 20 20 20  OrHigher..      
26c30 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
26c40 69 6e 74 20 64 6f 74 4e 65 74 34 36 0d 0a 20 20  int dotNet46..  
26c50 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
26c60 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 36  straint dotNet46
26c70 4f 72 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20 20  OrHigher....    
26c80 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
26c90 69 6f 6e 20 34 2e 36 0d 0a 20 20 20 20 20 20 20  ion 4.6..       
26ca0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 72 65     } elseif {$re
26cb0 6c 65 61 73 65 20 3e 3d 20 33 37 39 38 39 33 7d  lease >= 379893}
26cc0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26cd0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
26ce0 6e 74 20 64 6f 74 4e 65 74 34 35 31 4f 72 48 69  nt dotNet451OrHi
26cf0 67 68 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  gher..          
26d00 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
26d10 64 6f 74 4e 65 74 34 35 32 0d 0a 20 20 20 20 20  dotNet452..     
26d20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
26d30 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 32 4f 72  aint dotNet452Or
26d40 48 69 67 68 65 72 0d 0a 0d 0a 20 20 20 20 20 20  Higher....      
26d50 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
26d60 6e 20 34 2e 35 2e 32 0d 0a 20 20 20 20 20 20 20  n 4.5.2..       
26d70 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 72 65     } elseif {$re
26d80 6c 65 61 73 65 20 3e 3d 20 5b 67 65 74 46 72 61  lease >= [getFra
26d90 6d 65 77 6f 72 6b 53 65 74 75 70 34 35 31 56 61  meworkSetup451Va
26da0 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
26db0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
26dc0 73 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35  straint dotNet45
26dd0 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  1..            a
26de0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  ddConstraint dot
26df0 4e 65 74 34 35 31 4f 72 48 69 67 68 65 72 0d 0a  Net451OrHigher..
26e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
26e10 74 20 76 65 72 73 69 6f 6e 20 34 2e 35 2e 31 0d  t version 4.5.1.
26e20 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
26e30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
26e40 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 64   addConstraint d
26e50 6f 74 4e 65 74 34 35 0d 0a 0d 0a 20 20 20 20 20  otNet45....     
26e60 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
26e70 6f 6e 20 34 2e 35 0d 0a 20 20 20 20 20 20 20 20  on 4.5..        
26e80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
26e90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
26ea0 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 22  NOTE: Show the "
26eb0 72 65 6c 65 61 73 65 22 20 76 61 6c 75 65 20 77  release" value w
26ec0 65 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 72  e found in the r
26ed0 65 67 69 73 74 72 79 2e 0d 0a 20 20 20 20 20 20  egistry...      
26ee0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
26ef0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
26f00 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
26f10 20 28 22 20 24 72 65 6c 65 61 73 65 20 22 2c 20   (" $release ", 
26f20 22 20 24 76 65 72 73 69 6f 6e 20 22 29 5c 6e 22  " $version ")\n"
26f30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ]....          #
26f40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
26f50 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
26f60 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
26f70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
26f80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26f90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
26fa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
26fb0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
26fc0 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
26fd0 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 56 69   proc checkForVi
26fe0 73 75 61 6c 53 74 75 64 69 6f 56 69 61 52 65 67  sualStudioViaReg
26ff0 69 73 74 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20  istry { channel 
27000 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
27010 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
27020 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 56 69 73  checking for Vis
27030 75 61 6c 20 53 74 75 64 69 6f 20 75 73 69 6e 67  ual Studio using
27040 20 72 65 67 69 73 74 72 79 2e 2e 2e 20 22 0d 0a   registry... "..
27050 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
27060 20 23 20 4e 4f 54 45 3a 20 49 6e 69 74 69 61 6c   # NOTE: Initial
27070 6c 79 2c 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20  ly, no versions 
27080 6f 66 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  of Visual Studio
27090 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
270a0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
270b0 20 20 73 65 74 20 76 69 73 75 61 6c 53 74 75 64    set visualStud
270c0 69 6f 56 65 72 73 69 6f 6e 73 20 5b 6c 69 73 74  ioVersions [list
270d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
270e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 6c 61 74      # NOTE: Plat
270f0 66 6f 72 6d 20 6d 75 73 74 20 62 65 20 57 69 6e  form must be Win
27100 64 6f 77 73 20 66 6f 72 20 74 68 69 73 20 63 6f  dows for this co
27110 6e 73 74 72 61 69 6e 74 20 74 6f 20 65 76 65 6e  nstraint to even
27120 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
27130 20 20 20 63 68 65 63 6b 65 64 20 28 69 2e 65 2e     checked (i.e.
27140 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 20   we require the 
27150 72 65 67 69 73 74 72 79 29 2e 0d 0a 20 20 20 20  registry)...    
27160 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
27170 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
27180 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
27190 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
271a0 65 67 69 73 74 72 79 20 68 69 76 65 20 77 68 65  egistry hive whe
271b0 72 65 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  re Visual Studio
271c0 20 69 6e 73 74 61 6c 6c 20 69 6e 66 6f 72 6d 61   install informa
271d0 74 69 6f 6e 20 69 73 0d 0a 20 20 20 20 20 20 20  tion is..       
271e0 20 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 2e   #       stored.
271f0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6c    Make sure to l
27200 6f 6f 6b 20 69 6e 20 74 68 65 20 57 6f 57 36 34  ook in the WoW64
27210 20 72 65 67 69 73 74 72 79 20 62 65 63 61 75 73   registry becaus
27220 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
27230 20 20 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f     Visual Studio
27240 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6c   is currently al
27250 77 61 79 73 20 61 20 33 32 2d 62 69 74 20 61 70  ways a 32-bit ap
27260 70 6c 69 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20  plication...    
27270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
27280 65 74 20 6b 65 79 20 5b 61 70 70 65 6e 64 41 72  et key [appendAr
27290 67 73 20 48 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41  gs HKEY_LOCAL_MA
272a0 43 48 49 4e 45 5c 5c 20 5c 0d 0a 20 20 20 20 20  CHINE\\ \..     
272b0 20 20 20 20 20 20 20 5b 67 65 74 53 6f 66 74 77         [getSoftw
272c0 61 72 65 52 65 67 69 73 74 72 79 4b 65 79 20 74  areRegistryKey t
272d0 72 75 65 5d 20 7b 5c 4d 69 63 72 6f 73 6f 66 74  rue] {\Microsoft
272e0 5c 56 69 73 75 61 6c 53 74 75 64 69 6f 7d 5d 0d  \VisualStudio}].
272f0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27300 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
27310 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 56 69  e versions of Vi
27320 73 75 61 6c 20 53 74 75 64 69 6f 20 74 68 61 74  sual Studio that
27330 20 77 65 20 73 75 70 70 6f 72 74 20 64 65 74 65   we support dete
27340 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
27350 20 20 20 20 20 20 20 6f 66 20 75 73 69 6e 67 20         of using 
27360 74 68 65 20 72 65 67 69 73 74 72 79 2e 0d 0a 20  the registry... 
27370 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27380 20 20 73 65 74 20 76 65 72 73 69 6f 6e 73 20 5b    set versions [
27390 6c 69 73 74 20 5b 6c 69 73 74 20 38 2e 30 20 32  list [list 8.0 2
273a0 30 30 35 5d 20 5b 6c 69 73 74 20 39 2e 30 20 32  005] [list 9.0 2
273b0 30 30 38 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  008] \..        
273c0 20 20 20 20 5b 6c 69 73 74 20 31 30 2e 30 20 32      [list 10.0 2
273d0 30 31 30 5d 20 5b 6c 69 73 74 20 31 31 2e 30 20  010] [list 11.0 
273e0 32 30 31 32 5d 20 5b 6c 69 73 74 20 31 32 2e 30  2012] [list 12.0
273f0 20 32 30 31 33 5d 20 5c 0d 0a 20 20 20 20 20 20   2013] \..      
27400 20 20 20 20 20 20 5b 6c 69 73 74 20 31 34 2e 30        [list 14.0
27410 20 32 30 31 35 5d 5d 0d 0a 0d 0a 20 20 20 20 20   2015]]....     
27420 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
27430 4e 4f 54 45 3a 20 43 68 65 63 6b 20 65 61 63 68  NOTE: Check each
27440 20 76 65 72 73 69 6f 6e 20 61 6e 64 20 6b 65 65   version and kee
27450 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6f  p track of the o
27460 6e 65 73 20 77 65 20 66 69 6e 64 2e 0d 0a 20 20  nes we find...  
27470 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27480 20 66 6f 72 65 61 63 68 20 76 65 72 73 69 6f 6e   foreach version
27490 20 24 76 65 72 73 69 6f 6e 73 20 7b 0d 0a 20 20   $versions {..  
274a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
274b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
274c0 65 6d 70 74 20 74 6f 20 66 65 74 63 68 20 74 68  empt to fetch th
274d0 65 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  e Visual Studio 
274e0 69 6e 73 74 61 6c 6c 20 64 69 72 65 63 74 6f 72  install director
274f0 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
27500 20 20 20 20 20 76 61 6c 75 65 20 66 72 6f 6d 20       value from 
27510 74 68 65 20 72 65 67 69 73 74 72 79 2c 20 72 65  the registry, re
27520 6d 6f 76 69 6e 67 20 74 68 65 20 74 72 61 69 6c  moving the trail
27530 69 6e 67 20 62 61 63 6b 73 6c 61 73 68 2c 0d 0a  ing backslash,..
27540 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
27550 20 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20    if any...     
27560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27570 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
27580 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
27590 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69 6c 65   normalize [file
275a0 20 6a 6f 69 6e 20 5b 73 74 72 69 6e 67 20 74 72   join [string tr
275b0 69 6d 72 69 67 68 74 20 5b 6f 62 6a 65 63 74 20  imright [object 
275c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
275d0 20 20 20 69 6e 76 6f 6b 65 20 4d 69 63 72 6f 73     invoke Micros
275e0 6f 66 74 2e 57 69 6e 33 32 2e 52 65 67 69 73 74  oft.Win32.Regist
275f0 72 79 20 47 65 74 56 61 6c 75 65 20 5b 61 70 70  ry GetValue [app
27600 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
27610 20 20 20 20 20 20 20 20 20 20 20 24 6b 65 79 20             $key 
27620 5c 5c 20 5b 6c 69 6e 64 65 78 20 24 76 65 72 73  \\ [lindex $vers
27630 69 6f 6e 20 30 5d 5d 20 49 6e 73 74 61 6c 6c 44  ion 0]] InstallD
27640 69 72 20 6e 75 6c 6c 5d 20 5c 5c 5d 20 5c 0d 0a  ir null] \\] \..
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27660 6d 73 65 6e 76 2e 64 6c 6c 5d 0d 0a 20 20 20 20  msenv.dll]..    
27670 20 20 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65        } fileName
27680 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
27690 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
276a0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
276b0 45 3a 20 44 6f 65 73 20 74 68 65 20 64 69 72 65  E: Does the dire
276c0 63 74 6f 72 79 20 6e 61 6d 65 20 6c 6f 6f 6b 20  ctory name look 
276d0 76 61 6c 69 64 20 61 6e 64 20 64 6f 65 73 20 69  valid and does i
276e0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  t..            #
276f0 20 20 20 20 20 20 20 61 63 74 75 61 6c 6c 79 20         actually 
27700 65 78 69 73 74 3f 0d 0a 20 20 20 20 20 20 20 20  exist?..        
27710 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27720 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
27730 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
27740 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
27750 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27760 20 69 73 66 69 6c 65 20 24 66 69 6c 65 4e 61 6d   isfile $fileNam
27770 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
27780 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
27790 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
277a0 45 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61  E: Yes, it appea
277b0 72 73 20 74 68 61 74 20 69 74 20 69 73 20 61 76  rs that it is av
277c0 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
277d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
277e0 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
277f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
27800 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
27810 20 20 20 20 20 20 20 20 76 69 73 75 61 6c 53 74          visualSt
27820 75 64 69 6f 20 5b 6c 69 6e 64 65 78 20 24 76 65  udio [lindex $ve
27830 72 73 69 6f 6e 20 31 5d 5d 0d 0a 0d 0a 20 20 20  rsion 1]]....   
27840 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
27850 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
27860 54 45 3a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  TE: Keep track o
27870 66 20 61 6c 6c 20 74 68 65 20 76 65 72 73 69 6f  f all the versio
27880 6e 73 20 74 68 61 74 20 77 65 20 66 69 6e 64 2e  ns that we find.
27890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
278a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
278b0 20 6c 61 70 70 65 6e 64 20 76 69 73 75 61 6c 53   lappend visualS
278c0 74 75 64 69 6f 56 65 72 73 69 6f 6e 73 20 5b 6c  tudioVersions [l
278d0 69 6e 64 65 78 20 24 76 65 72 73 69 6f 6e 20 31  index $version 1
278e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
278f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
27900 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65      # NOTE: Save
27910 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
27920 6f 72 20 6c 61 74 65 72 20 75 73 61 67 65 20 62  or later usage b
27930 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20  y the test..    
27940 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
27950 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
27960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
27970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27980 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
27990 73 20 3a 3a 6e 6f 28 73 65 74 56 69 73 75 61 6c  s ::no(setVisual
279a0 53 74 75 64 69 6f 29 5d 7d 20 74 68 65 6e 20 7b  Studio)]} then {
279b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
279c0 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 76 69 73    set ::test_vis
279d0 75 61 6c 5f 73 74 75 64 69 6f 20 5b 66 69 6c 65  ual_studio [file
279e0 20 64 69 72 6e 61 6d 65 20 24 66 69 6c 65 4e 61   dirname $fileNa
279f0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me]..           
27a00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
27a10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
27a20 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
27a30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
27a40 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 76 69 73 75   {[llength $visu
27a50 61 6c 53 74 75 64 69 6f 56 65 72 73 69 6f 6e 73  alStudioVersions
27a60 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
27a70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27a80 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
27a90 68 65 72 65 20 77 65 20 66 6f 75 6e 64 20 74 68  here we found th
27aa0 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
27ab0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27ac0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
27ad0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27ae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27af0 22 79 65 73 20 28 22 20 24 76 69 73 75 61 6c 53  "yes (" $visualS
27b00 74 75 64 69 6f 56 65 72 73 69 6f 6e 73 20 22 2c  tudioVersions ",
27b10 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
27b20 20 20 20 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f      [expr {[info
27b30 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 76   exists ::test_v
27b40 69 73 75 61 6c 5f 73 74 75 64 69 6f 5d 20 3f 20  isual_studio] ? 
27b50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27b60 20 20 20 24 3a 3a 74 65 73 74 5f 76 69 73 75 61     $::test_visua
27b70 6c 5f 73 74 75 64 69 6f 20 3a 20 22 3c 6e 6f 6e  l_studio : "<non
27b80 65 3e 22 7d 5d 20 22 5c 22 29 5c 6e 22 5d 0d 0a  e>"}] "\")\n"]..
27b90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
27ba0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
27bb0 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
27bc0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
27bd0 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
27be0 72 4e 61 74 69 76 65 44 65 62 75 67 67 65 72 20  rNativeDebugger 
27bf0 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
27c00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
27c10 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
27c20 6e 67 20 66 6f 72 20 6e 61 74 69 76 65 20 64 65  ng for native de
27c30 62 75 67 67 65 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  bugger... ".... 
27c40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
27c50 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 6e 61 74  NOTE: Is the nat
27c60 69 76 65 20 64 65 62 75 67 67 65 72 20 70 72 65  ive debugger pre
27c70 73 65 6e 74 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  sent?..      #..
27c80 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
27c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
27ca0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
27cb0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
27cc0 20 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65             Eagle
27cd0 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69  ._Components.Pri
27ce0 76 61 74 65 2e 4e 61 74 69 76 65 4f 70 73 2b 53  vate.NativeOps+S
27cf0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
27d00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27d10 49 73 44 65 62 75 67 67 65 72 50 72 65 73 65 6e  IsDebuggerPresen
27d20 74 0d 0a 20 20 20 20 20 20 7d 20 70 72 65 73 65  t..      } prese
27d30 6e 74 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72  nt] == 0 && [str
27d40 69 6e 67 20 69 73 20 74 72 75 65 20 2d 73 74 72  ing is true -str
27d50 69 63 74 20 24 70 72 65 73 65 6e 74 5d 7d 20 74  ict $present]} t
27d60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
27d70 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
27d80 3a 20 59 65 73 2c 20 69 74 20 61 70 70 65 61 72  : Yes, it appear
27d90 73 20 74 68 61 74 20 69 74 20 69 73 20 70 72 65  s that it is pre
27da0 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  sent...        #
27db0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
27dc0 73 74 72 61 69 6e 74 20 6e 61 74 69 76 65 44 65  straint nativeDe
27dd0 62 75 67 67 65 72 0d 0a 0d 0a 20 20 20 20 20 20  bugger....      
27de0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
27df0 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
27e00 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
27e10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
27e20 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
27e30 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
27e40 20 63 68 65 63 6b 46 6f 72 4d 61 6e 61 67 65 64   checkForManaged
27e50 44 65 62 75 67 67 65 72 20 7b 20 63 68 61 6e 6e  Debugger { chann
27e60 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
27e70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
27e80 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
27e90 6d 61 6e 61 67 65 64 20 64 65 62 75 67 67 65 72  managed debugger
27ea0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23  ... "....      #
27eb0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
27ec0 49 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 64  Is the managed d
27ed0 65 62 75 67 67 65 72 20 61 74 74 61 63 68 65 64  ebugger attached
27ee0 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
27ef0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
27f00 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
27f10 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 69 61  nvoke System.Dia
27f20 67 6e 6f 73 74 69 63 73 2e 44 65 62 75 67 67 65  gnostics.Debugge
27f30 72 20 49 73 41 74 74 61 63 68 65 64 0d 0a 20 20  r IsAttached..  
27f40 20 20 20 20 7d 20 61 74 74 61 63 68 65 64 5d 20      } attached] 
27f50 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
27f60 69 73 20 74 72 75 65 20 2d 73 74 72 69 63 74 20  is true -strict 
27f70 24 61 74 74 61 63 68 65 64 5d 7d 20 74 68 65 6e  $attached]} then
27f80 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
27f90 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
27fa0 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20 74  es, it appears t
27fb0 68 61 74 20 69 74 20 69 73 20 61 74 74 61 63 68  hat it is attach
27fc0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
27fd0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
27fe0 72 61 69 6e 74 20 6d 61 6e 61 67 65 64 44 65 62  raint managedDeb
27ff0 75 67 67 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  ugger....       
28000 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
28010 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  yes\n..      } e
28020 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
28030 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
28040 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
28050 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
28060 63 68 65 63 6b 46 6f 72 53 63 72 69 70 74 44 65  checkForScriptDe
28070 62 75 67 67 65 72 20 7b 20 63 68 61 6e 6e 65 6c  bugger { channel
28080 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
28090 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
280a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 63   checking for sc
280b0 72 69 70 74 20 64 65 62 75 67 67 65 72 2e 2e 2e  ript debugger...
280c0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
280d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
280e0 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
280f0 67 65 72 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  ger available?..
28100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
28110 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
28120 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
28130 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
28140 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
28150 2e 47 65 74 41 63 74 69 76 65 20 44 65 62 75 67  .GetActive Debug
28160 67 65 72 0d 0a 20 20 20 20 20 20 7d 20 64 65 62  ger..      } deb
28170 75 67 67 65 72 5d 20 3d 3d 20 30 7d 20 74 68 65  ugger] == 0} the
28180 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
28190 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
281a0 57 65 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68  We do not own th
281b0 69 73 2c 20 64 6f 20 6e 6f 74 20 64 69 73 70 6f  is, do not dispo
281c0 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
281d0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
281e0 69 73 4e 6f 6e 4e 75 6c 6c 4f 62 6a 65 63 74 48  isNonNullObjectH
281f0 61 6e 64 6c 65 20 24 64 65 62 75 67 67 65 72 5d  andle $debugger]
28200 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28210 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63      catch {objec
28220 74 20 66 6c 61 67 73 20 24 64 65 62 75 67 67 65  t flags $debugge
28230 72 20 2b 4e 6f 44 69 73 70 6f 73 65 7d 0d 0a 20  r +NoDispose}.. 
28240 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
28250 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
28260 2d 2d 20 7b 5e 44 65 62 75 67 67 65 72 23 5c 64  -- {^Debugger#\d
28270 2b 24 7d 20 24 64 65 62 75 67 67 65 72 5d 7d 20  +$} $debugger]} 
28280 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
28290 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
282a0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 69 74 20 61   NOTE: Yes, it a
282b0 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 69  ppears that it i
282c0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
282d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
282e0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
282f0 6e 74 20 73 63 72 69 70 74 44 65 62 75 67 67 65  nt scriptDebugge
28300 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  r....          t
28310 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
28320 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  s\n....         
28330 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
28340 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e  NOTE: We are don
28350 65 20 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e  e here, return n
28360 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
28370 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
28380 72 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  rn..        }.. 
28390 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
283a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
283b0 6f 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  o\n..    }..... 
283c0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
283d0 53 63 72 69 70 74 44 65 62 75 67 67 65 72 49 6e  ScriptDebuggerIn
283e0 74 65 72 70 72 65 74 65 72 20 7b 20 63 68 61 6e  terpreter { chan
283f0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
28400 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
28410 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
28420 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
28430 20 69 6e 74 65 72 70 72 65 74 65 72 2e 2e 2e 20   interpreter... 
28440 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  "....      #..  
28450 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
28460 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
28470 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  er interpreter a
28480 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
28490 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   #..      if {[c
284a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
284b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
284c0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
284d0 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
284e0 63 74 69 76 65 20 44 65 62 75 67 67 65 72 0d 0a  ctive Debugger..
284f0 20 20 20 20 20 20 7d 20 64 65 62 75 67 67 65 72        } debugger
28500 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
28510 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28520 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 64 6f     # NOTE: We do
28530 20 6e 6f 74 20 6f 77 6e 20 74 68 69 73 2c 20 64   not own this, d
28540 6f 20 6e 6f 74 20 64 69 73 70 6f 73 65 20 69 74  o not dispose it
28550 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28560 20 20 20 20 20 20 69 66 20 7b 5b 69 73 4e 6f 6e        if {[isNon
28570 4e 75 6c 6c 4f 62 6a 65 63 74 48 61 6e 64 6c 65  NullObjectHandle
28580 20 24 64 65 62 75 67 67 65 72 5d 7d 20 74 68 65   $debugger]} the
28590 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
285a0 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 66 6c 61  atch {object fla
285b0 67 73 20 24 64 65 62 75 67 67 65 72 20 2b 4e 6f  gs $debugger +No
285c0 44 69 73 70 6f 73 65 7d 0d 0a 20 20 20 20 20 20  Dispose}..      
285d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
285e0 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e  f {[regexp -- {^
285f0 44 65 62 75 67 67 65 72 23 5c 64 2b 24 7d 20 24  Debugger#\d+$} $
28600 64 65 62 75 67 67 65 72 5d 20 26 26 20 5c 0d 0a  debugger] && \..
28610 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 61 74              [cat
28620 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
28630 65 20 24 64 65 62 75 67 67 65 72 20 49 6e 74 65  e $debugger Inte
28640 72 70 72 65 74 65 72 7d 20 69 6e 74 65 72 70 5d  rpreter} interp]
28650 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
28660 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
28670 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
28680 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68 69 73   do not own this
28690 2c 20 64 6f 20 6e 6f 74 20 64 69 73 70 6f 73 65  , do not dispose
286a0 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20   it...          
286b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
286c0 7b 5b 69 73 4e 6f 6e 4e 75 6c 6c 4f 62 6a 65 63  {[isNonNullObjec
286d0 74 48 61 6e 64 6c 65 20 24 69 6e 74 65 72 70 5d  tHandle $interp]
286e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
286f0 20 20 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a        catch {obj
28700 65 63 74 20 66 6c 61 67 73 20 24 69 6e 74 65 72  ect flags $inter
28710 70 20 2b 4e 6f 44 69 73 70 6f 73 65 7d 0d 0a 20  p +NoDispose}.. 
28720 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28730 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
28740 65 78 70 20 2d 2d 20 7b 5e 49 6e 74 65 72 70 72  exp -- {^Interpr
28750 65 74 65 72 23 5c 64 2b 24 7d 20 24 69 6e 74 65  eter#\d+$} $inte
28760 72 70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rp]} then {..   
28770 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
28780 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28790 59 65 73 2c 20 69 74 20 61 70 70 65 61 72 73 20  Yes, it appears 
287a0 74 68 61 74 20 69 74 20 69 73 20 61 76 61 69 6c  that it is avail
287b0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
287c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
287d0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
287e0 73 63 72 69 70 74 44 65 62 75 67 67 65 72 49 6e  scriptDebuggerIn
287f0 74 65 72 70 72 65 74 65 72 0d 0a 0d 0a 20 20 20  terpreter....   
28800 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
28810 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
28820 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
28830 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
28840 54 45 3a 20 57 65 20 61 72 65 20 64 6f 6e 65 20  TE: We are done 
28850 68 65 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  here, return now
28860 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
28870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
28880 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  turn..          
28890 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
288a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74      }....      t
288b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
288c0 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  \n..    }....   
288d0 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
288e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
288f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28900 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28910 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
28920 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
28930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20  ############### 
28940 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23  END Eagle ONLY #
28950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28960 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
28970 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
28980 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28990 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
289a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
289b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
289c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
289d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
289e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
289f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28a00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28a10 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
28a20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
28a30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20 42  ############## B
28a40 45 47 49 4e 20 54 63 6c 20 4f 4e 4c 59 20 23 23  EGIN Tcl ONLY ##
28a50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28a60 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
28a70 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
28a80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28a90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28aa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28ab0 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
28ac0 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
28ad0 54 45 3a 20 57 65 20 6e 65 65 64 20 73 65 76 65  TE: We need seve
28ae0 72 61 6c 20 6f 66 20 6f 75 72 20 74 65 73 74 20  ral of our test 
28af0 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 6c 61 74  constraint relat
28b00 65 64 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74  ed commands in t
28b10 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  he..    #       
28b20 67 6c 6f 62 61 6c 20 6e 61 6d 65 73 70 61 63 65  global namespace
28b30 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 65 78  ...    #..    ex
28b40 70 6f 72 74 41 6e 64 49 6d 70 6f 72 74 50 61 63  portAndImportPac
28b50 6b 61 67 65 43 6f 6d 6d 61 6e 64 73 20 5b 6e 61  kageCommands [na
28b60 6d 65 73 70 61 63 65 20 63 75 72 72 65 6e 74 5d  mespace current]
28b70 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
28b80 20 20 67 65 74 4b 6e 6f 77 6e 42 75 69 6c 64 54    getKnownBuildT
28b90 79 70 65 73 20 67 65 74 4b 6e 6f 77 6e 43 6f 6d  ypes getKnownCom
28ba0 70 69 6c 65 4f 70 74 69 6f 6e 73 20 67 65 74 4b  pileOptions getK
28bb0 6e 6f 77 6e 4d 6f 6e 6f 56 65 72 73 69 6f 6e 73  nownMonoVersions
28bc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 61 64 64 4b   \..        addK
28bd0 6e 6f 77 6e 4d 6f 6e 6f 43 6f 6e 73 74 72 61 69  nownMonoConstrai
28be0 6e 74 73 20 67 65 74 44 6f 74 4e 65 74 43 6f 72  nts getDotNetCor
28bf0 65 4c 69 62 50 61 74 68 44 69 72 65 63 74 6f 72  eLibPathDirector
28c00 79 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20  yNameOnly \..   
28c10 20 20 20 20 20 6c 70 65 72 6d 75 74 65 20 61 6c       lpermute al
28c20 77 61 79 73 46 75 6c 6c 49 6e 74 65 72 70 52 65  waysFullInterpRe
28c30 61 64 79 20 63 61 6e 45 78 65 63 43 6f 6d 53 70  ady canExecComSp
28c40 65 63 20 63 61 6e 45 78 65 63 57 68 6f 41 6d 49  ec canExecWhoAmI
28c50 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 61 6e 45   \..        canE
28c60 78 65 63 54 63 6c 53 68 65 6c 6c 20 63 61 6e 45  xecTclShell canE
28c70 78 65 63 46 6f 73 73 69 6c 20 63 61 6e 45 78 65  xecFossil canExe
28c80 63 56 73 57 68 65 72 65 20 69 73 54 65 73 74 4d  cVsWhere isTestM
28c90 6f 6e 6f 20 5c 0d 0a 20 20 20 20 20 20 20 20 69  ono \..        i
28ca0 73 54 65 73 74 44 6f 74 4e 65 74 43 6f 72 65 20  sTestDotNetCore 
28cb0 69 73 54 65 73 74 41 64 6d 69 6e 69 73 74 72 61  isTestAdministra
28cc0 74 6f 72 20 63 61 6e 50 69 6e 67 20 63 6c 65 61  tor canPing clea
28cd0 6e 43 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20  nConstraintName 
28ce0 5c 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 61 6e  \..        clean
28cf0 50 61 63 6b 61 67 65 4e 61 6d 65 20 68 61 76 65  PackageName have
28d00 54 63 6c 50 6c 61 74 66 6f 72 6d 4f 73 45 78 74  TclPlatformOsExt
28d10 72 61 55 70 64 61 74 65 4e 61 6d 65 20 5c 0d 0a  raUpdateName \..
28d20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
28d30 54 65 73 74 53 75 69 74 65 46 69 6c 65 73 20 63  TestSuiteFiles c
28d40 68 65 63 6b 46 6f 72 50 6c 61 74 66 6f 72 6d 20  heckForPlatform 
28d50 63 68 65 63 6b 46 6f 72 57 69 6e 64 6f 77 73 56  checkForWindowsV
28d60 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
28d70 20 20 63 68 65 63 6b 46 6f 72 4f 70 65 72 61 74    checkForOperat
28d80 69 6e 67 53 79 73 74 65 6d 55 70 64 61 74 65 20  ingSystemUpdate 
28d90 63 68 65 63 6b 46 6f 72 53 63 72 69 70 74 4c 69  checkForScriptLi
28da0 62 72 61 72 79 20 63 68 65 63 6b 46 6f 72 56 61  brary checkForVa
28db0 72 69 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20  riable \..      
28dc0 20 20 63 68 65 63 6b 46 6f 72 54 63 6c 4f 70 74    checkForTclOpt
28dd0 69 6f 6e 73 20 63 68 65 63 6b 46 6f 72 57 69 6e  ions checkForWin
28de0 64 6f 77 73 43 6f 6d 6d 61 6e 64 50 72 6f 63 65  dowsCommandProce
28df0 73 73 6f 72 20 63 68 65 63 6b 46 6f 72 50 61 63  ssor checkForPac
28e00 6b 61 67 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  kage \..        
28e10 63 68 65 63 6b 46 6f 72 46 6f 73 73 69 6c 20 63  checkForFossil c
28e20 68 65 63 6b 46 6f 72 56 69 73 75 61 6c 53 74 75  heckForVisualStu
28e30 64 69 6f 56 69 61 56 73 57 68 65 72 65 20 63 68  dioViaVsWhere ch
28e40 65 63 6b 46 6f 72 45 61 67 6c 65 20 5c 0d 0a 20  eckForEagle \.. 
28e50 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
28e60 79 6d 62 6f 6c 73 20 63 68 65 63 6b 46 6f 72 4c  ymbols checkForL
28e70 6f 67 46 69 6c 65 20 63 68 65 63 6b 46 6f 72 47  ogFile checkForG
28e80 61 72 75 64 61 20 63 68 65 63 6b 46 6f 72 53 68  aruda checkForSh
28e90 65 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 63  ell \..        c
28ea0 68 65 63 6b 46 6f 72 4f 66 66 69 63 69 61 6c 53  heckForOfficialS
28eb0 74 61 62 6c 65 52 65 6c 65 61 73 65 49 6e 50 72  tableReleaseInPr
28ec0 6f 67 72 65 73 73 20 63 68 65 63 6b 46 6f 72 44  ogress checkForD
28ed0 65 62 75 67 20 63 68 65 63 6b 46 6f 72 54 6b 20  ebug checkForTk 
28ee0 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  \..        check
28ef0 46 6f 72 56 65 72 73 69 6f 6e 20 63 68 65 63 6b  ForVersion check
28f00 46 6f 72 43 6f 6d 6d 61 6e 64 20 63 68 65 63 6b  ForCommand check
28f10 46 6f 72 53 75 62 43 6f 6d 6d 61 6e 64 20 63 68  ForSubCommand ch
28f20 65 63 6b 46 6f 72 45 46 6f 72 6d 61 74 20 5c 0d  eckForEFormat \.
28f30 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
28f40 72 4e 61 6d 65 73 70 61 63 65 73 20 63 68 65 63  rNamespaces chec
28f50 6b 46 6f 72 54 65 73 74 45 78 65 63 20 63 68 65  kForTestExec che
28f60 63 6b 46 6f 72 54 65 73 74 4d 61 63 68 69 6e 65  ckForTestMachine
28f70 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   \..        chec
28f80 6b 46 6f 72 54 65 73 74 50 6c 61 74 66 6f 72 6d  kForTestPlatform
28f90 20 63 68 65 63 6b 46 6f 72 54 65 73 74 43 6f 6e   checkForTestCon
28fa0 66 69 67 75 72 61 74 69 6f 6e 20 63 68 65 63 6b  figuration check
28fb0 46 6f 72 54 65 73 74 4e 61 6d 65 50 72 65 66 69  ForTestNamePrefi
28fc0 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65  x \..        che
28fd0 63 6b 46 6f 72 54 65 73 74 53 75 66 66 69 78 20  ckForTestSuffix 
28fe0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 63 68 65  checkForFile che
28ff0 63 6b 46 6f 72 50 61 74 68 46 69 6c 65 20 63 68  ckForPathFile ch
29000 65 63 6b 46 6f 72 4e 61 74 69 76 65 43 6f 64 65  eckForNativeCode
29010 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   \..        chec
29020 6b 46 6f 72 54 69 70 31 32 37 20 63 68 65 63 6b  kForTip127 check
29030 46 6f 72 54 69 70 31 39 34 20 63 68 65 63 6b 46  ForTip194 checkF
29040 6f 72 54 69 70 32 30 37 20 63 68 65 63 6b 46 6f  orTip207 checkFo
29050 72 54 69 70 32 34 31 20 5c 0d 0a 20 20 20 20 20  rTip241 \..     
29060 20 20 20 63 68 65 63 6b 46 6f 72 54 69 70 32 38     checkForTip28
29070 35 20 63 68 65 63 6b 46 6f 72 54 69 70 34 30 35  5 checkForTip405
29080 20 63 68 65 63 6b 46 6f 72 54 69 70 34 32 31 20   checkForTip421 
29090 63 68 65 63 6b 46 6f 72 54 69 70 34 32 36 20 5c  checkForTip426 \
290a0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
290b0 6f 72 54 69 70 34 32 39 20 63 68 65 63 6b 46 6f  orTip429 checkFo
290c0 72 54 69 70 34 34 30 20 63 68 65 63 6b 46 6f 72  rTip440 checkFor
290d0 54 69 70 34 36 31 20 63 68 65 63 6b 46 6f 72 54  Tip461 checkForT
290e0 69 70 34 36 33 20 5c 0d 0a 20 20 20 20 20 20 20  ip463 \..       
290f0 20 63 68 65 63 6b 46 6f 72 54 69 70 34 37 31 20   checkForTip471 
29100 63 68 65 63 6b 46 6f 72 54 69 6d 69 6e 67 20 63  checkForTiming c
29110 68 65 63 6b 46 6f 72 50 65 72 66 6f 72 6d 61 6e  heckForPerforman
29120 63 65 20 63 68 65 63 6b 46 6f 72 42 69 67 4c 69  ce checkForBigLi
29130 73 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 63  sts \..        c
29140 68 65 63 6b 46 6f 72 50 72 6f 63 65 73 73 6f 72  heckForProcessor
29150 49 6e 74 65 6e 73 69 76 65 20 63 68 65 63 6b 46  Intensive checkF
29160 6f 72 54 69 6d 65 49 6e 74 65 6e 73 69 76 65 20  orTimeIntensive 
29170 63 68 65 63 6b 46 6f 72 46 75 6c 6c 54 65 73 74  checkForFullTest
29180 20 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   \..        chec
29190 6b 46 6f 72 4d 65 6d 6f 72 79 49 6e 74 65 6e 73  kForMemoryIntens
291a0 69 76 65 20 63 68 65 63 6b 46 6f 72 53 74 61 63  ive checkForStac
291b0 6b 49 6e 74 65 6e 73 69 76 65 20 63 68 65 63 6b  kIntensive check
291c0 46 6f 72 53 74 61 63 6b 53 69 7a 65 20 5c 0d 0a  ForStackSize \..
291d0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
291e0 49 6e 74 65 72 61 63 74 69 76 65 20 63 68 65 63  Interactive chec
291f0 6b 46 6f 72 49 6e 74 65 72 61 63 74 69 76 65 43  kForInteractiveC
29200 6f 6d 6d 61 6e 64 20 5c 0d 0a 20 20 20 20 20 20  ommand \..      
29210 20 20 63 68 65 63 6b 46 6f 72 55 73 65 72 49 6e    checkForUserIn
29220 74 65 72 61 63 74 69 6f 6e 20 63 68 65 63 6b 46  teraction checkF
29230 6f 72 4e 65 74 77 6f 72 6b 20 63 68 65 63 6b 46  orNetwork checkF
29240 6f 72 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  orCompileOption 
29250 5c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  \..        check
29260 46 6f 72 4b 6e 6f 77 6e 43 6f 6d 70 69 6c 65 4f  ForKnownCompileO
29270 70 74 69 6f 6e 73 5d 20 66 61 6c 73 65 20 66 61  ptions] false fa
29280 6c 73 65 0d 0a 0d 0a 20 20 20 20 23 23 23 23 23  lse....    #####
29290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
292a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
292b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
292c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
292d0 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
292e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
292f0 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20 54  ########## END T
29300 63 6c 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23  cl ONLY ########
29310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
29320 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23  #######..    ###
29330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
29340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
29350 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
29360 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
29370 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0c  ########..  }...
29380 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
29390 20 50 72 6f 76 69 64 65 20 74 68 65 20 45 61 67   Provide the Eag
293a0 6c 65 20 22 74 65 73 74 20 63 6f 6e 73 74 72 61  le "test constra
293b0 69 6e 74 73 22 20 70 61 63 6b 61 67 65 20 74 6f  ints" package to
293c0 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
293d0 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
293e0 65 20 70 72 6f 76 69 64 65 20 45 61 67 6c 65 2e  e provide Eagle.
293f0 54 65 73 74 2e 43 6f 6e 73 74 72 61 69 6e 74 73  Test.Constraints
29400 20 5c 0d 0a 20 20 20 20 5b 65 78 70 72 20 7b 5b   \..    [expr {[
29410 69 73 45 61 67 6c 65 5d 20 3f 20 5b 69 6e 66 6f  isEagle] ? [info
29420 20 65 6e 67 69 6e 65 20 50 61 74 63 68 4c 65 76   engine PatchLev
29430 65 6c 5d 20 3a 20 22 31 2e 30 22 7d 5d 0d 0a 7d  el] : "1.0"}]..}
29440 0d 0a 0c                                         ...