System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 6b23b4a0c22821f48c83f3f1d5ab6a025f76cbd2:


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 6f 62 6a 65 63 74 2e 65 61 67  .#..# object.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 45 78 74 65  le --..#..# Exte
0070: 6e 73 69 62 6c 65 20 41 64 61 70 74 61 62 6c 65  nsible Adaptable
0080: 20 47 65 6e 65 72 61 6c 69 7a 65 64 20 4c 6f 67   Generalized Log
0090: 69 63 20 45 6e 67 69 6e 65 20 28 45 61 67 6c 65  ic Engine (Eagle
00a0: 29 0d 0a 23 20 45 61 67 6c 65 20 4f 62 6a 65 63  )..# Eagle Objec
00b0: 74 20 50 61 63 6b 61 67 65 20 46 69 6c 65 0d 0a  t Package File..
00c0: 23 0d 0a 23 20 43 6f 70 79 72 69 67 68 74 20 28  #..# Copyright (
00d0: 63 29 20 32 30 30 37 2d 32 30 31 32 20 62 79 20  c) 2007-2012 by 
00e0: 4a 6f 65 20 4d 69 73 74 61 63 68 6b 69 6e 2e 20  Joe Mistachkin. 
00f0: 20 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65   All rights rese
0100: 72 76 65 64 2e 0d 0a 23 0d 0a 23 20 53 65 65 20  rved...#..# See 
0110: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73  the file "licens
0120: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66  e.terms" for inf
0130: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67  ormation on usag
0140: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75  e and redistribu
0150: 74 69 6f 6e 20 6f 66 0d 0a 23 20 74 68 69 73 20  tion of..# this 
0160: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
0170: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
0180: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0d 0a 23  L WARRANTIES...#
0190: 0d 0a 23 20 52 43 53 3a 20 40 28 23 29 20 24 49  ..# RCS: @(#) $I
01a0: 64 3a 20 24 0d 0a 23 0d 0a 23 23 23 23 23 23 23  d: $..#..#######
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01f0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23  ########....#..#
0200: 20 4e 4f 54 45 3a 20 55 73 65 20 6f 75 72 20 6f   NOTE: Use our o
0210: 77 6e 20 6e 61 6d 65 73 70 61 63 65 20 68 65 72  wn namespace her
0220: 65 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74  e because even t
0230: 68 6f 75 67 68 20 77 65 20 64 6f 20 6e 6f 74 20  hough we do not 
0240: 64 69 72 65 63 74 6c 79 0d 0a 23 20 20 20 20 20  directly..#     
0250: 20 20 73 75 70 70 6f 72 74 20 6e 61 6d 65 73 70    support namesp
0260: 61 63 65 73 20 6f 75 72 73 65 6c 76 65 73 2c 20  aces ourselves, 
0270: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
0280: 6f 20 70 6f 6c 6c 75 74 65 20 74 68 65 20 67 6c  o pollute the gl
0290: 6f 62 61 6c 0d 0a 23 20 20 20 20 20 20 20 6e 61  obal..#       na
02a0: 6d 65 73 70 61 63 65 20 69 66 20 74 68 69 73 20  mespace if this 
02b0: 73 63 72 69 70 74 20 61 63 74 75 61 6c 6c 79 20  script actually 
02c0: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 65 76  ends up being ev
02d0: 61 6c 75 61 74 65 64 20 69 6e 20 54 63 6c 2e 0d  aluated in Tcl..
02e0: 0a 23 0d 0a 6e 61 6d 65 73 70 61 63 65 20 65 76  .#..namespace ev
02f0: 61 6c 20 3a 3a 45 61 67 6c 65 20 7b 0d 0a 20 20  al ::Eagle {..  
0300: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
0310: 73 20 70 72 6f 63 65 64 75 72 65 20 61 63 63 65  s procedure acce
0320: 70 74 73 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  pts two argument
0330: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  s containing the
0340: 20 66 6c 61 67 20 73 74 72 69 6e 67 0d 0a 20 20   flag string..  
0350: 23 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65  #       that are
0360: 20 62 61 73 65 64 20 6f 6e 20 61 6e 20 65 6e 75   based on an enu
0370: 6d 65 72 61 74 65 64 20 43 4c 52 20 74 79 70 65  merated CLR type
0380: 2e 20 20 46 6c 61 67 20 76 61 6c 75 65 73 20 74  .  Flag values t
0390: 68 61 74 20 61 72 65 0d 0a 20 20 23 20 20 20 20  hat are..  #    
03a0: 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20     contained in 
03b0: 74 68 65 73 65 20 74 77 6f 20 61 72 67 75 6d 65  these two argume
03c0: 6e 74 73 20 61 72 65 20 63 6f 6d 62 69 6e 65 64  nts are combined
03d0: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 61 73   and returned as
03e0: 0d 0a 20 20 23 20 20 20 20 20 20 20 74 68 65 20  ..  #       the 
03f0: 72 65 73 75 6c 74 2e 20 20 54 68 65 20 74 68 69  result.  The thi
0400: 72 64 20 66 6c 61 67 20 73 74 72 69 6e 67 20 61  rd flag string a
0410: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
0420: 20 74 68 65 20 66 6c 61 67 73 0d 0a 20 20 23 20   the flags..  # 
0430: 20 20 20 20 20 20 74 6f 20 65 78 63 6c 75 64 65        to exclude
0440: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
0450: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 63  ...  #..  proc c
0460: 6f 6d 62 69 6e 65 46 6c 61 67 73 20 7b 20 66 6c  ombineFlags { fl
0470: 61 67 73 31 20 66 6c 61 67 73 32 20 7b 66 6c 61  ags1 flags2 {fla
0480: 67 73 33 20 22 22 7d 20 7b 6e 6f 43 61 73 65 20  gs3 ""} {noCase 
0490: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
04a0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  #..    # NOTE: T
04b0: 68 69 73 20 73 68 6f 75 6c 64 20 77 6f 72 6b 20  his should work 
04c0: 70 72 6f 70 65 72 6c 79 20 69 6e 20 62 6f 74 68  properly in both
04d0: 20 54 63 6c 20 61 6e 64 20 45 61 67 6c 65 2e 0d   Tcl and Eagle..
04e0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20  .    #..    set 
04f0: 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 20  result [list].. 
0500: 20 20 20 73 65 74 20 6e 6f 74 46 6c 61 67 73 20     set notFlags 
0510: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 69 66  [list]....    if
0520: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
0530: 20 24 66 6c 61 67 73 33 5d 20 3e 20 30 7d 20 74   $flags3] > 0} t
0540: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72  hen {..      for
0550: 65 61 63 68 20 66 6c 61 67 20 5b 73 70 6c 69 74  each flag [split
0560: 20 24 66 6c 61 67 73 33 20 22 2c 20 22 5d 20 7b   $flags3 ", "] {
0570: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6c  ..        set fl
0580: 61 67 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  ag [string trim 
0590: 24 66 6c 61 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  $flag]....      
05a0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
05b0: 6e 67 74 68 20 24 66 6c 61 67 5d 20 3e 20 30 7d  ngth $flag] > 0}
05c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
05d0: 20 20 20 6c 61 70 70 65 6e 64 20 6e 6f 74 46 6c     lappend notFl
05e0: 61 67 73 20 24 66 6c 61 67 0d 0a 20 20 20 20 20  ags $flag..     
05f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
0600: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 66 6f 72 65     }....    fore
0610: 61 63 68 20 66 6c 61 67 73 20 5b 6c 69 73 74 20  ach flags [list 
0620: 24 66 6c 61 67 73 31 20 24 66 6c 61 67 73 32 5d  $flags1 $flags2]
0630: 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   {..      foreac
0640: 68 20 66 6c 61 67 20 5b 73 70 6c 69 74 20 24 66  h flag [split $f
0650: 6c 61 67 73 20 22 2c 20 22 5d 20 7b 0d 0a 20 20  lags ", "] {..  
0660: 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 20 5b        set flag [
0670: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 66 6c 61  string trim $fla
0680: 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  g]....        if
0690: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
06a0: 20 24 66 6c 61 67 5d 20 3e 20 30 7d 20 74 68 65   $flag] > 0} the
06b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
06c0: 65 74 20 61 64 64 46 6c 61 67 20 66 61 6c 73 65  et addFlag false
06d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
06e0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 6f 74 46   {[llength $notF
06f0: 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  lags] > 0} then 
0700: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
0710: 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74  et command [list
0720: 20 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 5d   lsearch -exact]
0730: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0740: 69 66 20 7b 24 6e 6f 43 61 73 65 7d 20 74 68 65  if {$noCase} the
0750: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0760: 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61     lappend comma
0770: 6e 64 20 2d 6e 6f 63 61 73 65 0d 0a 20 20 20 20  nd -nocase..    
0780: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
0790: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
07a0: 20 63 6f 6d 6d 61 6e 64 20 2d 2d 20 24 6e 6f 74   command -- $not
07b0: 46 6c 61 67 73 20 24 66 6c 61 67 0d 0a 0d 0a 20  Flags $flag.... 
07c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
07d0: 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 5d 20 3d  eval $command] =
07e0: 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
0800: 61 64 64 46 6c 61 67 20 74 72 75 65 0d 0a 20 20  addFlag true..  
0810: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
0820: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
0840: 20 61 64 64 46 6c 61 67 20 74 72 75 65 0d 0a 20   addFlag true.. 
0850: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
0860: 20 20 20 20 20 20 20 20 69 66 20 7b 24 61 64 64          if {$add
0870: 46 6c 61 67 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  Flag} then {..  
0880: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
0890: 64 20 72 65 73 75 6c 74 20 24 66 6c 61 67 0d 0a  d result $flag..
08a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
08b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
08c0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65  .    }....    re
08d0: 74 75 72 6e 20 5b 6a 6f 69 6e 20 24 72 65 73 75  turn [join $resu
08e0: 6c 74 20 2c 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20  lt ,]..  }..... 
08f0: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68   #..  # NOTE: Th
0900: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
0910: 75 72 6e 73 20 74 68 65 20 74 79 70 65 20 6e 61  urns the type na
0920: 6d 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  me of the return
0930: 20 74 79 70 65 20 66 6f 72 20 74 68 65 0d 0a 20   type for the.. 
0940: 20 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69   #       specifi
0950: 65 64 20 43 4c 52 20 6d 65 6d 62 65 72 2e 0d 0a  ed CLR member...
0960: 20 20 23 0d 0a 20 20 70 72 6f 63 20 67 65 74 52    #..  proc getR
0970: 65 74 75 72 6e 54 79 70 65 20 7b 20 6f 62 6a 65  eturnType { obje
0980: 63 74 20 6d 65 6d 62 65 72 20 7d 20 7b 0d 0a 20  ct member } {.. 
0990: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
09a0: 65 6e 67 74 68 20 24 6f 62 6a 65 63 74 5d 20 3d  ength $object] =
09b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
09c0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
09d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b    }....    if {[
09e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d  string length $m
09f0: 65 6d 62 65 72 5d 20 3d 3d 20 30 7d 20 74 68 65  ember] == 0} the
0a00: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
0a10: 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  n ""..    }.... 
0a20: 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74     set code [cat
0a30: 63 68 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a 65  ch {..      obje
0a40: 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
0a50: 73 20 6d 65 6d 62 65 72 49 6e 66 6f 20 5c 0d 0a  s memberInfo \..
0a60: 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
0a70: 74 20 69 6e 76 6f 6b 65 20 2d 6e 6f 69 6e 76 6f  t invoke -noinvo
0a80: 6b 65 20 24 6f 62 6a 65 63 74 20 24 6d 65 6d 62  ke $object $memb
0a90: 65 72 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  er] {..        #
0aa0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
0ab0: 3a 20 55 73 65 20 74 68 65 20 6d 65 6d 62 65 72  : Use the member
0ac0: 20 74 79 70 65 20 74 6f 20 64 65 74 65 72 6d 69   type to determi
0ad0: 6e 65 20 77 68 69 63 68 20 70 72 6f 70 65 72 74  ne which propert
0ae0: 79 20 63 6f 6e 74 61 69 6e 73 0d 0a 20 20 20 20  y contains..    
0af0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
0b00: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
0b10: 20 77 65 20 77 61 6e 74 20 74 6f 20 72 65 74 75   we want to retu
0b20: 72 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rn...        #..
0b30: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20 2d          switch -
0b40: 65 78 61 63 74 20 2d 2d 20 5b 24 6d 65 6d 62 65  exact -- [$membe
0b50: 72 49 6e 66 6f 20 4d 65 6d 62 65 72 54 79 70 65  rInfo MemberType
0b60: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 46  ] {..          F
0b70: 69 65 6c 64 20 7b 0d 0a 20 20 20 20 20 20 20 20  ield {..        
0b80: 20 20 20 20 72 65 74 75 72 6e 20 5b 24 6d 65 6d      return [$mem
0b90: 62 65 72 49 6e 66 6f 20 46 69 65 6c 64 54 79 70  berInfo FieldTyp
0ba0: 65 2e 41 73 73 65 6d 62 6c 79 51 75 61 6c 69 66  e.AssemblyQualif
0bb0: 69 65 64 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  iedName]..      
0bc0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
0bd0: 20 4d 65 74 68 6f 64 20 7b 0d 0a 20 20 20 20 20   Method {..     
0be0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 24         return [$
0bf0: 6d 65 6d 62 65 72 49 6e 66 6f 20 52 65 74 75 72  memberInfo Retur
0c00: 6e 54 79 70 65 2e 41 73 73 65 6d 62 6c 79 51 75  nType.AssemblyQu
0c10: 61 6c 69 66 69 65 64 4e 61 6d 65 5d 0d 0a 20 20  alifiedName]..  
0c20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0c30: 20 20 20 20 20 50 72 6f 70 65 72 74 79 20 7b 0d       Property {.
0c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0c50: 75 72 6e 20 5b 24 6d 65 6d 62 65 72 49 6e 66 6f  urn [$memberInfo
0c60: 20 50 72 6f 70 65 72 74 79 54 79 70 65 2e 41 73   PropertyType.As
0c70: 73 65 6d 62 6c 79 51 75 61 6c 69 66 69 65 64 4e  semblyQualifiedN
0c80: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
0c90: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  }..          def
0ca0: 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20  ault {..        
0cb0: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
0cc0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
0cd0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
0ce0: 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d      } result]...
0cf0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
0d00: 54 45 3a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  TE: If no error 
0d10: 77 61 73 20 72 61 69 73 65 64 20 61 62 6f 76 65  was raised above
0d20: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  , return the res
0d30: 75 6c 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 0d  ult; otherwise,.
0d40: 0a 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74  .    #       ret
0d50: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
0d60: 69 6e 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ing to indicate 
0d70: 61 20 67 65 6e 65 72 61 6c 20 66 61 69 6c 75 72  a general failur
0d80: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 72  e...    #..    r
0d90: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 63 6f  eturn [expr {$co
0da0: 64 65 20 3d 3d 20 32 20 3f 20 24 72 65 73 75 6c  de == 2 ? $resul
0db0: 74 20 3a 20 22 22 7d 5d 0d 0a 20 20 7d 0d 0a 0c  t : ""}]..  }...
0dc0: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
0dd0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
0de0: 72 65 74 75 72 6e 73 20 74 68 65 20 64 65 66 61  returns the defa
0df0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
0e00: 65 20 73 70 65 63 69 66 69 65 64 20 43 4c 52 20  e specified CLR 
0e10: 74 79 70 65 2e 0d 0a 20 20 23 0d 0a 20 20 70 72  type...  #..  pr
0e20: 6f 63 20 67 65 74 44 65 66 61 75 6c 74 56 61 6c  oc getDefaultVal
0e30: 75 65 20 7b 20 74 79 70 65 4e 61 6d 65 20 7d 20  ue { typeName } 
0e40: 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  {..    if {[llen
0e50: 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
0e60: 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3d 3d 20 30  ds object]] == 0
0e70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
0e80: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
0e90: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  ....    if {[str
0ea0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 79 70 65  ing length $type
0eb0: 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
0ec0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
0ed0: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20   ""..    }....  
0ee0: 20 20 73 65 74 20 74 79 70 65 20 5b 6f 62 6a 65    set type [obje
0ef0: 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74  ct invoke -creat
0f00: 65 20 2d 61 6c 69 61 73 20 54 79 70 65 20 47 65  e -alias Type Ge
0f10: 74 54 79 70 65 20 24 74 79 70 65 4e 61 6d 65 5d  tType $typeName]
0f20: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  ....    if {[str
0f30: 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 79 70 65  ing length $type
0f40: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
0f50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
0f60: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65  .    }....    re
0f70: 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 24 74 79  turn [expr {[$ty
0f80: 70 65 20 49 73 56 61 6c 75 65 54 79 70 65 5d 20  pe IsValueType] 
0f90: 3f 20 30 20 3a 20 22 6e 75 6c 6c 22 7d 5d 0d 0a  ? 0 : "null"}]..
0fa0: 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23    }.....  #..  #
0fb0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
0fc0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20  edure returns a 
0fd0: 73 74 72 69 6e 67 20 6f 62 74 61 69 6e 65 64 20  string obtained 
0fe0: 62 79 20 75 73 69 6e 67 20 74 68 65 20 73 70 65  by using the spe
0ff0: 63 69 66 69 65 64 0d 0a 20 20 23 20 20 20 20 20  cified..  #     
1000: 20 20 76 61 6c 75 65 20 61 73 20 61 6e 20 6f 70    value as an op
1010: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
1020: 6c 65 20 2d 4f 52 2d 20 61 20 64 65 66 61 75 6c  le -OR- a defaul
1030: 74 20 76 61 6c 75 65 20 28 65 2e 67 2e 20 61 6e  t value (e.g. an
1040: 0d 0a 20 20 23 20 20 20 20 20 20 20 65 6d 70 74  ..  #       empt
1050: 79 20 73 74 72 69 6e 67 29 20 69 66 20 74 68 65  y string) if the
1060: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 20   value is not a 
1070: 76 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a  valid opaque obj
1080: 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 23  ect handle...  #
1090: 0d 0a 20 20 70 72 6f 63 20 67 65 74 53 74 72 69  ..  proc getStri
10a0: 6e 67 46 72 6f 6d 4f 62 6a 65 63 74 48 61 6e 64  ngFromObjectHand
10b0: 6c 65 20 7b 20 76 61 6c 75 65 20 7b 64 65 66 61  le { value {defa
10c0: 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ult ""} } {..   
10d0: 20 69 66 20 7b 5b 69 73 4e 6f 6e 4e 75 6c 6c 4f   if {[isNonNullO
10e0: 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 6c  bjectHandle $val
10f0: 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
1100: 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63     return [objec
1110: 74 20 69 6e 76 6f 6b 65 20 24 76 61 6c 75 65 20  t invoke $value 
1120: 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 7d  ToString]..    }
1130: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  ....    if {[str
1140: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 65 66 61  ing length $defa
1150: 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ult] > 0} then {
1160: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
1170: 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  default..    }..
1180: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 76 61  ..    return $va
1190: 6c 75 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23  lue..  }.....  #
11a0: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73  ..  # NOTE: This
11b0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
11c0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
11d0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 6c  he specified val
11e0: 75 65 20 63 61 6e 20 62 65 20 75 73 65 64 0d 0a  ue can be used..
11f0: 20 20 23 20 20 20 20 20 20 20 61 73 20 61 6e 20    #       as an 
1200: 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
1210: 6e 64 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 70 72  ndle...  #..  pr
1220: 6f 63 20 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c  oc isObjectHandl
1230: 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20  e { value } {.. 
1240: 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 5b     set pattern [
1250: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
1260: 20 5c 5c 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b   \\ \\\\ \[ \\\[
1270: 20 5c 5d 20 5c 5c 5c 5d 5d 20 24 76 61 6c 75 65   \] \\\]] $value
1280: 5d 0d 0a 20 20 20 20 73 65 74 20 6f 62 6a 65 63  ]..    set objec
1290: 74 73 20 5b 69 6e 66 6f 20 6f 62 6a 65 63 74 73  ts [info objects
12a0: 20 24 70 61 74 74 65 72 6e 5d 0d 0a 0d 0a 20 20   $pattern]....  
12b0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
12c0: 6f 62 6a 65 63 74 73 5d 20 3d 3d 20 31 20 26 26  objects] == 1 &&
12d0: 20 5b 6c 69 6e 64 65 78 20 24 6f 62 6a 65 63 74   [lindex $object
12e0: 73 20 30 5d 20 65 71 20 24 76 61 6c 75 65 7d 20  s 0] eq $value} 
12f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65  then {..      re
1300: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
1310: 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 66  ....    return f
1320: 61 6c 73 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  alse..  }.....  
1330: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
1340: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
1350: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
1360: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
1370: 6c 75 65 20 63 61 6e 20 62 65 20 75 73 65 64 0d  lue can be used.
1380: 0a 20 20 23 20 20 20 20 20 20 20 61 73 20 61 6e  .  #       as an
1390: 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
13a0: 61 6e 64 6c 65 20 2d 41 4e 44 2d 20 74 68 65 20  andle -AND- the 
13b0: 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 72  value does not r
13c0: 65 70 72 65 73 65 6e 74 20 61 20 6e 75 6c 6c 0d  epresent a null.
13d0: 0a 20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65  .  #       value
13e0: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 69  ...  #..  proc i
13f0: 73 4e 6f 6e 4e 75 6c 6c 4f 62 6a 65 63 74 48 61  sNonNullObjectHa
1400: 6e 64 6c 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b  ndle { value } {
1410: 0d 0a 20 20 20 20 67 6c 6f 62 61 6c 20 6e 75 6c  ..    global nul
1420: 6c 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65  l..    return [e
1430: 78 70 72 20 7b 5b 69 73 4f 62 6a 65 63 74 48 61  xpr {[isObjectHa
1440: 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26 20  ndle $value] && 
1450: 24 76 61 6c 75 65 20 6e 65 20 24 6e 75 6c 6c 7d  $value ne $null}
1460: 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  ]..  }.....  #..
1470: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
1480: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
1490: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
14a0: 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20   specified name 
14b0: 72 65 70 72 65 73 65 6e 74 73 0d 0a 20 20 23 20  represents..  # 
14c0: 20 20 20 20 20 20 61 20 76 61 6c 69 64 20 43 4c        a valid CL
14d0: 52 20 74 79 70 65 20 6e 61 6d 65 2e 0d 0a 20 20  R type name...  
14e0: 23 0d 0a 20 20 70 72 6f 63 20 69 73 4d 61 6e 61  #..  proc isMana
14f0: 67 65 64 54 79 70 65 20 7b 20 6e 61 6d 65 20 7d  gedType { name }
1500: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65   {..    if {[lle
1510: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
1520: 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30  nds object]] > 0
1530: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1540: 69 66 20 7b 21 5b 69 73 4f 62 6a 65 63 74 48 61  if {![isObjectHa
1550: 6e 64 6c 65 20 24 6e 61 6d 65 5d 7d 20 74 68 65  ndle $name]} the
1560: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1570: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1580: 20 20 20 20 20 6f 62 6a 65 63 74 20 6d 65 6d 62       object memb
1590: 65 72 73 20 2d 6d 61 74 63 68 6e 61 6d 65 6f 6e  ers -matchnameon
15a0: 6c 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 2d 70 61  ly -nameonly -pa
15b0: 74 74 65 72 6e 20 45 71 75 61 6c 73 20 24 6e 61  ttern Equals $na
15c0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  me..        } re
15d0: 73 75 6c 74 5d 20 3d 3d 20 30 20 26 26 20 24 72  sult] == 0 && $r
15e0: 65 73 75 6c 74 20 65 71 20 22 45 71 75 61 6c 73  esult eq "Equals
15f0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
1600: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
1610: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1620: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
1630: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
1640: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20  .  }.....  #..  
1650: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
1660: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 6e  cedure returns n
1670: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
1680: 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20 69 73  pecified name is
1690: 20 75 73 61 62 6c 65 0d 0a 20 20 23 20 20 20 20   usable..  #    
16a0: 20 20 20 61 73 20 61 20 43 4c 52 20 74 79 70 65     as a CLR type
16b0: 20 6e 61 6d 65 2e 0d 0a 20 20 23 0d 0a 20 20 70   name...  #..  p
16c0: 72 6f 63 20 63 61 6e 47 65 74 4d 61 6e 61 67 65  roc canGetManage
16d0: 64 54 79 70 65 20 7b 20 6e 61 6d 65 20 7b 76 61  dType { name {va
16e0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
16f0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
1700: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f  [info commands o
1710: 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65  bject]] > 0} the
1720: 6e 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  n {..      if {!
1730: 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  [isObjectHandle 
1740: 24 6e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  $name]} then {..
1750: 20 20 20 20 20 20 20 20 73 65 74 20 63 75 6c 74          set cult
1760: 75 72 65 49 6e 66 6f 20 5b 6f 62 6a 65 63 74 20  ureInfo [object 
1770: 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
1780: 65 72 2e 47 65 74 41 63 74 69 76 65 20 43 75 6c  er.GetActive Cul
1790: 74 75 72 65 49 6e 66 6f 5d 0d 0a 20 20 20 20 20  tureInfo]..     
17a0: 20 20 20 73 65 74 20 74 79 70 65 20 6e 75 6c 6c     set type null
17b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
17c0: 63 6f 64 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76  code [object inv
17d0: 6f 6b 65 20 2d 63 72 65 61 74 65 20 2d 61 6c 69  oke -create -ali
17e0: 61 73 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  as -flags +NonPu
17f0: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1800: 20 20 20 20 56 61 6c 75 65 20 47 65 74 54 79 70      Value GetTyp
1810: 65 20 22 22 20 24 6e 61 6d 65 20 6e 75 6c 6c 20  e "" $name null 
1820: 6e 75 6c 6c 20 4e 6f 6e 65 20 24 63 75 6c 74 75  null None $cultu
1830: 72 65 49 6e 66 6f 20 74 79 70 65 5d 0d 0a 0d 0a  reInfo type]....
1840: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 24 63 6f          if {[$co
1850: 64 65 20 54 6f 53 74 72 69 6e 67 5d 20 65 71 20  de ToString] eq 
1860: 22 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  "Ok"} then {..  
1870: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1880: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
1890: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
18a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 70  ..            up
18b0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 74  var 1 $varName t
18c0: 79 70 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ypeName..       
18d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18e0: 20 20 73 65 74 20 74 79 70 65 4e 61 6d 65 20 5b    set typeName [
18f0: 24 74 79 70 65 20 41 73 73 65 6d 62 6c 79 51 75  $type AssemblyQu
1900: 61 6c 69 66 69 65 64 4e 61 6d 65 5d 0d 0a 0d 0a  alifiedName]....
1910: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
1920: 73 4d 61 6e 61 67 65 64 54 79 70 65 20 24 74 79  sManagedType $ty
1930: 70 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  peName]} then {.
1940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1950: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
1960: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1970: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1980: 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 66  ....    return f
1990: 61 6c 73 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  alse..  }.....  
19a0: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
19b0: 73 20 70 72 6f 63 65 64 75 72 65 20 65 76 61 6c  s procedure eval
19c0: 75 61 74 65 73 20 61 20 73 63 72 69 70 74 20 61  uates a script a
19d0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 61 6e  synchronously an
19e0: 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 0d 0a 20 20  d optionally..  
19f0: 23 20 20 20 20 20 20 20 6e 6f 74 69 66 69 65 73  #       notifies
1a00: 20 61 6e 6f 74 68 65 72 20 73 63 72 69 70 74 20   another script 
1a10: 75 70 6f 6e 20 69 74 73 20 63 6f 6d 70 6c 65 74  upon its complet
1a20: 69 6f 6e 2e 20 20 54 68 65 20 66 69 72 73 74 20  ion.  The first 
1a30: 61 72 67 75 6d 65 6e 74 0d 0a 20 20 23 20 20 20  argument..  #   
1a40: 20 20 20 20 69 73 20 74 68 65 20 6e 6f 74 69 66      is the notif
1a50: 69 63 61 74 69 6f 6e 20 73 63 72 69 70 74 3b 20  ication script; 
1a60: 69 66 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  if an empty stri
1a70: 6e 67 2c 20 74 68 65 72 65 20 77 69 6c 6c 20 62  ng, there will b
1a80: 65 20 6e 6f 0d 0a 20 20 23 20 20 20 20 20 20 20  e no..  #       
1a90: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 77 68 65  notification whe
1aa0: 6e 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  n asynchronous s
1ab0: 63 72 69 70 74 20 65 76 61 6c 75 61 74 69 6f 6e  cript evaluation
1ac0: 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 0d 0a   is completed...
1ad0: 20 20 23 20 20 20 20 20 20 20 49 66 20 74 68 65    #       If the
1ae0: 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
1af0: 65 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 2c  e more argument,
1b00: 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
1b10: 20 76 65 72 62 61 74 69 6d 3b 0d 0a 20 20 23 20   verbatim;..  # 
1b20: 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
1b30: 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 61   all remaining a
1b40: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
1b50: 63 61 74 65 6e 61 74 65 64 20 76 69 61 20 5b 63  catenated via [c
1b60: 6f 6e 63 61 74 5d 0d 0a 20 20 23 20 20 20 20 20  oncat]..  #     
1b70: 20 20 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20    and evaluated 
1b80: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 2e 20  asynchronously. 
1b90: 20 49 66 20 74 68 65 20 73 63 72 69 70 74 20 63   If the script c
1ba0: 61 6e 6e 6f 74 20 62 65 20 73 75 62 6d 69 74 74  annot be submitt
1bb0: 65 64 0d 0a 20 20 23 20 20 20 20 20 20 20 66 6f  ed..  #       fo
1bc0: 72 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 65  r asynchronous e
1bd0: 76 61 6c 75 61 74 69 6f 6e 2c 20 61 20 73 63 72  valuation, a scr
1be0: 69 70 74 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  ipt error will b
1bf0: 65 20 72 61 69 73 65 64 2e 0d 0a 20 20 23 0d 0a  e raised...  #..
1c00: 20 20 70 72 6f 63 20 65 76 61 6c 41 73 79 6e 63    proc evalAsync
1c10: 20 7b 20 64 6f 6e 65 53 63 72 69 70 74 20 61 72   { doneScript ar
1c20: 67 73 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  gs } {..    #.. 
1c30: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
1c40: 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
1c50: 65 73 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20  es the [object] 
1c60: 63 6f 6d 6d 61 6e 64 20 69 6e 20 6f 72 64 65 72  command in order
1c70: 20 74 6f 20 77 6f 72 6b 2e 0d 0a 20 20 20 20 23   to work...    #
1c80: 20 20 20 20 20 20 20 49 66 20 69 74 20 69 73 20         If it is 
1c90: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 62  not available, b
1ca0: 61 69 6c 20 6f 75 74 20 6e 6f 77 2e 0d 0a 20 20  ail out now...  
1cb0: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c    #..    if {[ll
1cc0: 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d  ength [info comm
1cd0: 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3d 3d  ands object]] ==
1ce0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1cf0: 20 20 65 72 72 6f 72 20 22 63 61 6e 6e 6f 74 20    error "cannot 
1d00: 65 76 61 6c 20 61 73 79 6e 63 3a 20 6d 69 73 73  eval async: miss
1d10: 69 6e 67 20 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63  ing \[object\] c
1d20: 6f 6d 6d 61 6e 64 22 0d 0a 20 20 20 20 7d 0d 0a  ommand"..    }..
1d30: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
1d40: 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f 72 65  OTE: If the core
1d50: 20 6c 69 62 72 61 72 79 20 77 61 73 20 6e 6f 74   library was not
1d60: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
1d70: 68 72 65 61 64 2d 73 61 66 65 74 79 20 65 6e 61  hread-safety ena
1d80: 62 6c 65 64 2c 0d 0a 20 20 20 20 23 20 20 20 20  bled,..    #    
1d90: 20 20 20 74 68 69 73 20 70 72 6f 63 65 64 75 72     this procedur
1da0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
1db0: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c   because it coul
1dc0: 64 20 63 6f 72 72 75 70 74 20 74 68 65 20 73 74  d corrupt the st
1dd0: 61 74 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  ate..    #      
1de0: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 70 72 65   of the interpre
1df0: 74 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ter...    #..   
1e00: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65   if {[lsearch -e
1e10: 78 61 63 74 20 2d 2d 20 5c 0d 0a 20 20 20 20 20  xact -- \..     
1e20: 20 20 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74     $::eagle_plat
1e30: 66 6f 72 6d 28 63 6f 6d 70 69 6c 65 4f 70 74 69  form(compileOpti
1e40: 6f 6e 73 29 20 54 48 52 45 41 44 49 4e 47 5d 20  ons) THREADING] 
1e50: 3d 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  == -1} then {.. 
1e60: 20 20 20 20 20 65 72 72 6f 72 20 22 63 61 6e 6e       error "cann
1e70: 6f 74 20 65 76 61 6c 20 61 73 79 6e 63 3a 20 6c  ot eval async: l
1e80: 69 62 72 61 72 79 20 6d 69 73 73 69 6e 67 20 54  ibrary missing T
1e90: 48 52 45 41 44 49 4e 47 20 63 6f 6d 70 69 6c 65  HREADING compile
1ea0: 2d 6f 70 74 69 6f 6e 22 0d 0a 20 20 20 20 7d 0d  -option"..    }.
1eb0: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1ec0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 69  NOTE: If there i
1ed0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1ee0: 73 63 72 69 70 74 20 6f 70 74 69 6f 6e 61 6c 20  script optional 
1ef0: 61 72 67 75 6d 65 6e 74 2c 20 75 73 65 20 5b 63  argument, use [c
1f00: 6f 6e 63 61 74 5d 0d 0a 20 20 20 20 23 20 20 20  oncat]..    #   
1f10: 20 20 20 20 74 6f 20 62 75 69 6c 64 20 75 70 20      to build up 
1f20: 74 68 65 20 66 69 6e 61 6c 20 73 63 72 69 70 74  the final script
1f30: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65  ; otherwise, use
1f40: 20 74 68 65 20 73 69 6e 67 6c 65 20 61 72 67 75   the single argu
1f50: 6d 65 6e 74 0d 0a 20 20 20 20 23 20 20 20 20 20  ment..    #     
1f60: 20 20 76 65 72 62 61 74 69 6d 2e 20 20 54 68 69    verbatim.  Thi
1f70: 73 20 6d 69 72 72 6f 72 73 20 74 68 65 20 62 65  s mirrors the be
1f80: 68 61 76 69 6f 72 20 6f 66 20 5b 65 76 61 6c 5d  havior of [eval]
1f90: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66  ...    #..    if
1fa0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73   {[llength $args
1fb0: 5d 20 3e 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 1} then {.. 
1fc0: 20 20 20 20 20 73 65 74 20 61 73 79 6e 63 53 63       set asyncSc
1fd0: 72 69 70 74 20 5b 63 6f 6e 63 61 74 20 24 61 72  ript [concat $ar
1fe0: 67 73 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  gs]..    } else 
1ff0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 61 73 79  {..      set asy
2000: 6e 63 53 63 72 69 70 74 20 5b 6c 69 6e 64 65 78  ncScript [lindex
2010: 20 24 61 72 67 73 20 30 5d 0d 0a 20 20 20 20 7d   $args 0]..    }
2020: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
2030: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 72 65 20   NOTE: Is there 
2040: 61 20 73 63 72 69 70 74 20 74 6f 20 62 65 20 65  a script to be e
2050: 76 61 6c 75 61 74 65 64 20 77 68 65 6e 20 74 68  valuated when th
2060: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  e asynchronous s
2070: 63 72 69 70 74 0d 0a 20 20 20 20 23 20 20 20 20  cript..    #    
2080: 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 69 73     evaluation is
2090: 20 63 6f 6d 70 6c 65 74 65 3f 20 20 49 66 20 73   complete?  If s
20a0: 6f 2c 20 62 75 69 6c 64 20 61 6e 20 61 6e 6f 6e  o, build an anon
20b0: 79 6d 6f 75 73 20 70 72 6f 63 65 64 75 72 65 0d  ymous procedure.
20c0: 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61  .    #       tha
20d0: 74 20 77 72 61 70 73 20 69 74 3b 20 6f 74 68 65  t wraps it; othe
20e0: 72 77 69 73 65 2c 20 73 65 74 20 74 68 65 20 63  rwise, set the c
20f0: 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
2100: 20 74 6f 20 6e 75 6c 6c 2c 20 73 6f 0d 0a 20 20   to null, so..  
2110: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63 6f    #       the co
2120: 72 65 20 6d 61 72 73 68 61 6c 6c 65 72 20 77 69  re marshaller wi
2130: 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 6c 61  ll handle the la
2140: 63 6b 20 6f 66 20 61 20 63 61 6c 6c 62 61 63 6b  ck of a callback
2150: 20 63 6f 72 72 65 63 74 6c 79 2e 0d 0a 20 20 20   correctly...   
2160: 20 23 20 20 20 20 20 20 20 54 68 65 20 63 6f 6e   #       The con
2170: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 77 69  text argument wi
2180: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
2190: 68 69 73 20 73 63 72 69 70 74 20 70 72 69 6f 72  his script prior
21a0: 20 74 6f 20 69 74 0d 0a 20 20 20 20 23 20 20 20   to it..    #   
21b0: 20 20 20 20 62 65 69 6e 67 20 65 76 61 6c 75 61      being evalua
21c0: 74 65 64 3b 20 68 6f 77 65 76 65 72 2c 20 69 74  ted; however, it
21d0: 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
21e0: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 73 63   used by this sc
21f0: 72 69 70 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ript...    #..  
2200: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2210: 6e 67 74 68 20 24 64 6f 6e 65 53 63 72 69 70 74  ngth $doneScript
2220: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2230: 20 20 20 20 20 73 65 74 20 63 61 6c 6c 62 61 63       set callbac
2240: 6b 20 5b 6c 69 73 74 20 2d 63 61 6c 6c 62 61 63  k [list -callbac
2250: 6b 66 6c 61 67 73 20 7b 2b 52 65 73 65 74 43 61  kflags {+ResetCa
2260: 6e 63 65 6c 20 46 69 72 65 41 6e 64 46 6f 72 67  ncel FireAndForg
2270: 65 74 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  et} \..         
2280: 20 2d 2d 20 61 70 70 6c 79 20 5b 6c 69 73 74 20   -- apply [list 
2290: 5b 6c 69 73 74 20 73 63 72 69 70 74 20 63 6f 6e  [list script con
22a0: 74 65 78 74 5d 20 7b 75 70 6c 65 76 65 6c 20 31  text] {uplevel 1
22b0: 20 24 73 63 72 69 70 74 7d 5d 20 5c 0d 0a 20 20   $script}] \..  
22c0: 20 20 20 20 20 20 20 20 24 64 6f 6e 65 53 63 72          $doneScr
22d0: 69 70 74 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65  ipt]..    } else
22e0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 63 61   {..      set ca
22f0: 6c 6c 62 61 63 6b 20 6e 75 6c 6c 0d 0a 20 20 20  llback null..   
2300: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
2310: 20 23 20 4e 4f 54 45 3a 20 49 6e 69 74 69 61 6c   # NOTE: Initial
2320: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  ize the local va
2330: 72 69 61 62 6c 65 20 74 68 61 74 20 77 69 6c 6c  riable that will
2340: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 65   be used to rece
2350: 69 76 65 20 74 68 65 0d 0a 20 20 20 20 23 20 20  ive the..    #  
2360: 20 20 20 20 20 73 63 72 69 70 74 20 65 72 72 6f       script erro
2370: 72 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  r, if any...    
2380: 23 0d 0a 20 20 20 20 73 65 74 20 65 72 72 6f 72  #..    set error
2390: 20 6e 75 6c 6c 0d 0a 0d 0a 20 20 20 20 23 0d 0a   null....    #..
23a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
23b0: 6d 70 74 20 74 6f 20 73 75 62 6d 69 74 20 74 68  mpt to submit th
23c0: 65 20 73 63 72 69 70 74 20 66 6f 72 20 61 73 79  e script for asy
23d0: 6e 63 68 6f 6e 6f 75 73 20 65 76 61 6c 75 61 74  nchonous evaluat
23e0: 69 6f 6e 2e 20 20 55 73 65 0d 0a 20 20 20 20 23  ion.  Use..    #
23f0: 20 20 20 20 20 20 20 74 68 65 20 64 79 6e 61 6d         the dynam
2400: 69 63 20 63 61 6c 6c 62 61 63 6b 20 6d 65 63 68  ic callback mech
2410: 61 6e 69 73 6d 20 77 69 74 68 20 74 68 65 20 61  anism with the a
2420: 6e 6f 6e 79 6d 6f 75 73 20 70 72 6f 63 65 64 75  nonymous procedu
2430: 72 65 20 77 65 0d 0a 20 20 20 20 23 20 20 20 20  re we..    #    
2440: 20 20 20 63 6f 6e 73 74 72 75 63 74 65 64 20 61     constructed a
2450: 62 6f 76 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  bove...    #..  
2460: 20 20 73 65 74 20 63 6f 64 65 20 5b 6f 62 6a 65    set code [obje
2470: 63 74 20 69 6e 76 6f 6b 65 20 2d 76 65 72 62 6f  ct invoke -verbo
2480: 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 2d 6d  se \..        -m
2490: 61 72 73 68 61 6c 66 6c 61 67 73 20 2b 44 79 6e  arshalflags +Dyn
24a0: 61 6d 69 63 43 61 6c 6c 62 61 63 6b 20 2d 2d 20  amicCallback -- 
24b0: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
24c0: 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ctive \..       
24d0: 20 45 76 61 6c 75 61 74 65 53 63 72 69 70 74 20   EvaluateScript 
24e0: 24 61 73 79 6e 63 53 63 72 69 70 74 20 24 63 61  $asyncScript $ca
24f0: 6c 6c 62 61 63 6b 20 6e 75 6c 6c 20 65 72 72 6f  llback null erro
2500: 72 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  r]....    #..   
2510: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
2520: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20  he return code, 
2530: 77 68 69 63 68 20 6f 6e 6c 79 20 69 6e 64 69 63  which only indic
2540: 61 74 65 73 20 69 66 20 74 68 65 20 73 63 72 69  ates if the scri
2550: 70 74 20 77 61 73 0d 0a 20 20 20 20 23 20 20 20  pt was..    #   
2560: 20 20 20 20 61 63 74 75 61 6c 6c 79 20 73 75 62      actually sub
2570: 6d 69 74 74 65 64 20 66 6f 72 20 61 73 79 6e 63  mitted for async
2580: 68 72 6f 6e 6f 75 73 20 65 76 61 6c 75 61 74 69  hronous evaluati
2590: 6f 6e 2c 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  on, to make sure
25a0: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69 74  ..    #       it
25b0: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e   was successful.
25c0: 20 20 49 66 20 6e 6f 74 2c 20 72 61 69 73 65 20    If not, raise 
25d0: 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 2e 0d  a script error..
25e0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20 7b  .    #..    if {
25f0: 24 63 6f 64 65 20 6e 65 20 22 4f 6b 22 7d 20 74  $code ne "Ok"} t
2600: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 65 72 72  hen {..      err
2610: 6f 72 20 5b 67 65 74 53 74 72 69 6e 67 46 72 6f  or [getStringFro
2620: 6d 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 65  mObjectHandle $e
2630: 72 72 6f 72 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  rror]..    }....
2640: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
2650: 45 3a 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  E: Upon success,
2660: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2670: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 61 63   string.  The ac
2680: 74 75 61 6c 20 73 63 72 69 70 74 20 72 65 73 75  tual script resu
2690: 6c 74 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  lt..    #       
26a0: 77 69 6c 6c 20 62 65 20 73 65 6e 74 20 74 6f 20  will be sent to 
26b0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
26c0: 69 70 74 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20  ipt, if any...  
26d0: 20 20 23 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    #..    return 
26e0: 22 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d  ""..  }.....  #.
26f0: 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69  .  # NOTE: Provi
2700: 64 65 20 74 68 65 20 45 61 67 6c 65 20 22 6f 62  de the Eagle "ob
2710: 6a 65 63 74 22 20 70 61 63 6b 61 67 65 20 74 6f  ject" package to
2720: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
2730: 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
2740: 65 20 70 72 6f 76 69 64 65 20 45 61 67 6c 65 2e  e provide Eagle.
2750: 4f 62 6a 65 63 74 20 5c 0d 0a 20 20 20 20 5b 65  Object \..    [e
2760: 78 70 72 20 7b 5b 69 73 45 61 67 6c 65 5d 20 3f  xpr {[isEagle] ?
2770: 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 50 61   [info engine Pa
2780: 74 63 68 4c 65 76 65 6c 5d 20 3a 20 22 31 2e 30  tchLevel] : "1.0
2790: 22 7d 5d 0d 0a 7d 0d 0a 0c                       "}]..}...