Tcl Source Code

Hex Artifact Content
Login

Artifact 3f726d01c664738cd8b9213d0d2376dbf050eb18:

Attachment "test2.tcl" to ticket [5bfe3de008] added by andy 2017-08-09 20:31:43.
0000: 23 21 2f 62 69 6e 2f 62 61 73 68 0a 23 20 54 68  #!/bin/bash.# Th
0010: 69 73 20 63 6f 6d 6d 65 6e 74 20 68 69 64 65 73  is comment hides
0020: 20 74 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 66   the next line f
0030: 72 6f 6d 20 74 68 65 20 54 63 6c 20 69 6e 74 65  rom the Tcl inte
0040: 72 70 72 65 74 65 72 2e 5c 0a 65 78 65 63 20 22  rpreter.\.exec "
0050: 24 28 64 69 72 6e 61 6d 65 20 22 24 30 22 29 2f  $(dirname "$0")/
0060: 75 74 69 6c 2f 74 63 6c 6b 69 74 22 20 22 24 30  util/tclkit" "$0
0070: 22 20 22 24 40 22 0a 0a 6c 61 70 70 65 6e 64 20  " "$@"..lappend 
0080: 61 75 74 6f 5f 70 61 74 68 20 6c 69 62 0a 70 61  auto_path lib.pa
0090: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54 63  ckage require Tc
00a0: 6c 20 38 2e 36 0a 70 61 63 6b 61 67 65 20 72 65  l 8.6.package re
00b0: 71 75 69 72 65 20 76 66 73 0a 0a 70 72 6f 63 20  quire vfs..proc 
00c0: 61 74 74 65 6d 70 74 20 7b 63 6f 6d 6d 61 6e 64  attempt {command
00d0: 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 5b 73 74  } {.    puts [st
00e0: 72 69 6e 67 20 72 65 70 65 61 74 20 2d 20 38 30  ring repeat - 80
00f0: 5d 5c 6e 24 63 6f 6d 6d 61 6e 64 0a 20 20 20 20  ]\n$command.    
0100: 74 61 69 6c 63 61 6c 6c 20 74 72 79 20 24 63 6f  tailcall try $co
0110: 6d 6d 61 6e 64 20 6f 6e 20 65 72 72 6f 72 20 7b  mmand on error {
0120: 6d 73 67 20 6f 70 74 69 6f 6e 73 7d 20 7b 0a 20  msg options} {. 
0130: 20 20 20 20 20 20 20 70 75 74 73 20 73 74 64 65         puts stde
0140: 72 72 20 5b 64 69 63 74 20 67 65 74 20 24 6f 70  rr [dict get $op
0150: 74 69 6f 6e 73 20 2d 65 72 72 6f 72 69 6e 66 6f  tions -errorinfo
0160: 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20  ].    }.}..proc 
0170: 62 61 74 74 65 72 79 20 7b 63 68 61 6e 7d 20 7b  battery {chan} {
0180: 0a 20 20 20 20 61 74 74 65 6d 70 74 20 7b 63 68  .    attempt {ch
0190: 61 6e 20 63 6f 6e 66 69 67 75 72 65 20 24 63 68  an configure $ch
01a0: 61 6e 20 2d 65 6f 66 63 68 61 72 20 5a 7d 0a 20  an -eofchar Z}. 
01b0: 20 20 20 61 74 74 65 6d 70 74 20 7b 63 68 61 6e     attempt {chan
01c0: 20 62 6c 6f 63 6b 65 64 20 24 63 68 61 6e 7d 0a   blocked $chan}.
01d0: 20 20 20 20 61 74 74 65 6d 70 74 20 7b 63 68 61      attempt {cha
01e0: 6e 20 63 6f 6e 66 69 67 75 72 65 20 24 63 68 61  n configure $cha
01f0: 6e 7d 0a 20 20 20 20 61 74 74 65 6d 70 74 20 7b  n}.    attempt {
0200: 63 68 61 6e 20 63 6f 70 79 20 24 63 68 61 6e 20  chan copy $chan 
0210: 24 63 68 61 6e 7d 0a 20 20 20 20 61 74 74 65 6d  $chan}.    attem
0220: 70 74 20 7b 63 68 61 6e 20 65 6f 66 20 24 63 68  pt {chan eof $ch
0230: 61 6e 7d 0a 20 20 20 20 61 74 74 65 6d 70 74 20  an}.    attempt 
0240: 7b 63 68 61 6e 20 65 76 65 6e 74 20 24 63 68 61  {chan event $cha
0250: 6e 20 72 65 61 64 61 62 6c 65 7d 0a 20 20 20 20  n readable}.    
0260: 61 74 74 65 6d 70 74 20 7b 63 68 61 6e 20 65 76  attempt {chan ev
0270: 65 6e 74 20 24 63 68 61 6e 20 77 72 69 74 61 62  ent $chan writab
0280: 6c 65 7d 0a 20 20 20 20 61 74 74 65 6d 70 74 20  le}.    attempt 
0290: 7b 63 68 61 6e 20 66 6c 75 73 68 20 24 63 68 61  {chan flush $cha
02a0: 6e 7d 0a 20 20 20 20 61 74 74 65 6d 70 74 20 7b  n}.    attempt {
02b0: 63 68 61 6e 20 67 65 74 73 20 24 63 68 61 6e 7d  chan gets $chan}
02c0: 0a 20 20 20 20 61 74 74 65 6d 70 74 20 7b 63 68  .    attempt {ch
02d0: 61 6e 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 74  an pending input
02e0: 20 24 63 68 61 6e 7d 0a 20 20 20 20 61 74 74 65   $chan}.    atte
02f0: 6d 70 74 20 7b 63 68 61 6e 20 70 65 6e 64 69 6e  mpt {chan pendin
0300: 67 20 6f 75 74 70 75 74 20 24 63 68 61 6e 7d 0a  g output $chan}.
0310: 20 20 20 20 61 74 74 65 6d 70 74 20 7b 63 68 61      attempt {cha
0320: 6e 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e  n puts -nonewlin
0330: 65 20 24 63 68 61 6e 20 68 65 6c 6c 6f 7d 0a 20  e $chan hello}. 
0340: 20 20 20 61 74 74 65 6d 70 74 20 7b 63 68 61 6e     attempt {chan
0350: 20 72 65 61 64 20 24 63 68 61 6e 7d 0a 20 20 20   read $chan}.   
0360: 20 61 74 74 65 6d 70 74 20 7b 63 68 61 6e 20 73   attempt {chan s
0370: 65 65 6b 20 24 63 68 61 6e 20 30 7d 0a 20 20 20  eek $chan 0}.   
0380: 20 61 74 74 65 6d 70 74 20 7b 63 68 61 6e 20 73   attempt {chan s
0390: 65 65 6b 20 24 63 68 61 6e 20 30 20 63 75 72 72  eek $chan 0 curr
03a0: 65 6e 74 7d 0a 20 20 20 20 61 74 74 65 6d 70 74  ent}.    attempt
03b0: 20 7b 63 68 61 6e 20 73 65 65 6b 20 24 63 68 61   {chan seek $cha
03c0: 6e 20 30 20 65 6e 64 7d 0a 20 20 20 20 61 74 74  n 0 end}.    att
03d0: 65 6d 70 74 20 7b 63 68 61 6e 20 74 65 6c 6c 20  empt {chan tell 
03e0: 24 63 68 61 6e 7d 0a 20 20 20 20 61 74 74 65 6d  $chan}.    attem
03f0: 70 74 20 7b 63 68 61 6e 20 74 72 75 6e 63 61 74  pt {chan truncat
0400: 65 20 24 63 68 61 6e 7d 0a 20 20 20 20 61 74 74  e $chan}.    att
0410: 65 6d 70 74 20 7b 63 68 61 6e 20 63 6c 6f 73 65  empt {chan close
0420: 20 24 63 68 61 6e 7d 0a 7d 0a 0a 70 72 6f 63 20   $chan}.}..proc 
0430: 6d 6f 75 6e 74 20 7b 64 69 72 20 7b 6d 6f 64 65  mount {dir {mode
0440: 4f 76 65 72 72 69 64 65 20 7b 7d 7d 7d 20 7b 0a  Override {}}} {.
0450: 20 20 20 20 76 66 73 3a 3a 66 69 6c 65 73 79 73      vfs::filesys
0460: 74 65 6d 20 6d 6f 75 6e 74 20 24 64 69 72 20 5b  tem mount $dir [
0470: 6c 69 73 74 5c 0a 20 20 20 20 61 70 70 6c 79 20  list\.    apply 
0480: 7b 7b 6d 6f 64 65 4f 76 65 72 72 69 64 65 20 6f  {{modeOverride o
0490: 70 65 72 61 74 69 6f 6e 20 72 6f 6f 74 20 72 65  peration root re
04a0: 6c 61 74 69 76 65 20 61 63 74 75 61 6c 20 61 72  lative actual ar
04b0: 67 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 70 75  gs} {.        pu
04c0: 74 73 20 5b 6c 69 73 74 20 76 66 73 20 24 6f 70  ts [list vfs $op
04d0: 65 72 61 74 69 6f 6e 20 24 72 6f 6f 74 20 24 72  eration $root $r
04e0: 65 6c 61 74 69 76 65 20 24 61 63 74 75 61 6c 20  elative $actual 
04f0: 7b 2a 7d 24 61 72 67 73 5d 0a 20 20 20 20 20 20  {*}$args].      
0500: 20 20 69 66 20 7b 24 6f 70 65 72 61 74 69 6f 6e    if {$operation
0510: 20 65 71 20 22 6f 70 65 6e 22 7d 20 7b 0a 20 20   eq "open"} {.  
0520: 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67            lassig
0530: 6e 20 24 61 72 67 73 20 6d 6f 64 65 20 70 65 72  n $args mode per
0540: 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  missions.       
0550: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
0560: 68 20 24 6d 6f 64 65 4f 76 65 72 72 69 64 65 5d  h $modeOverride]
0570: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
0580: 20 20 20 20 73 65 74 20 6d 6f 64 65 20 24 6d 6f      set mode $mo
0590: 64 65 4f 76 65 72 72 69 64 65 0a 20 20 20 20 20  deOverride.     
05a0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05c0: 73 65 74 20 6d 6f 64 65 20 5b 64 69 63 74 20 67  set mode [dict g
05d0: 65 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  et {.           
05e0: 20 20 20 20 20 20 20 20 20 7b 7d 20 72 65 61 64           {} read
05f0: 20 77 20 77 72 69 74 65 20 61 20 77 72 69 74 65   w write a write
0600: 20 77 2b 20 7b 72 65 61 64 20 77 72 69 74 65 7d   w+ {read write}
0610: 20 61 2b 20 7b 72 65 61 64 20 77 72 69 74 65 7d   a+ {read write}
0620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0630: 20 7d 20 24 6d 6f 64 65 5d 0a 20 20 20 20 20 20   } $mode].      
0640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0650: 20 20 20 20 63 68 61 6e 20 63 72 65 61 74 65 20      chan create 
0660: 24 6d 6f 64 65 20 7b 61 70 70 6c 79 20 7b 7b 6f  $mode {apply {{o
0670: 70 65 72 61 74 69 6f 6e 20 61 72 67 73 7d 20 7b  peration args} {
0680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0690: 20 70 75 74 73 20 5b 6c 69 73 74 20 72 65 66 63   puts [list refc
06a0: 68 61 6e 20 24 6f 70 65 72 61 74 69 6f 6e 20 7b  han $operation {
06b0: 2a 7d 24 61 72 67 73 5d 0a 20 20 20 20 20 20 20  *}$args].       
06c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 6f 70           if {$op
06d0: 65 72 61 74 69 6f 6e 20 65 71 20 22 69 6e 69 74  eration eq "init
06e0: 69 61 6c 69 7a 65 22 7d 20 7b 0a 20 20 20 20 20  ialize"} {.     
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
0700: 65 74 75 72 6e 20 7b 0a 20 20 20 20 20 20 20 20  eturn {.        
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0720: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 6e 61 6c  initialize final
0730: 69 7a 65 20 77 61 74 63 68 20 72 65 61 64 20 77  ize watch read w
0740: 72 69 74 65 20 73 65 65 6b 20 63 6f 6e 66 69 67  rite seek config
0750: 75 72 65 20 63 67 65 74 0a 20 20 20 20 20 20 20  ure cget.       
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 63 67 65 74 61 6c 6c 20 62 6c 6f 63 6b 69 6e   cgetall blockin
0780: 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g.              
0790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
07a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
07b0: 20 7b 24 6f 70 65 72 61 74 69 6f 6e 20 65 71 20   {$operation eq 
07c0: 22 77 72 69 74 65 22 7d 20 7b 0a 20 20 20 20 20  "write"} {.     
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
07e0: 61 73 73 69 67 6e 20 24 61 72 67 73 20 63 68 61  assign $args cha
07f0: 6e 6e 65 6c 49 64 20 64 61 74 61 0a 20 20 20 20  nnelId data.    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6c  return [string l
0820: 65 6e 67 74 68 20 24 64 61 74 61 5d 0a 20 20 20  ength $data].   
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
0840: 6c 73 65 69 66 20 7b 24 6f 70 65 72 61 74 69 6f  lseif {$operatio
0850: 6e 20 65 71 20 22 73 65 65 6b 22 7d 20 7b 0a 20  n eq "seek"} {. 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 20 20     return 0.    
0880: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
0890: 20 20 20 20 20 20 20 20 20 20 7d 7d 7d 0a 20 20            }}}.  
08a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 7d 20 24        }.    }} $
08b0: 6d 6f 64 65 4f 76 65 72 72 69 64 65 5d 0a 7d 0a  modeOverride].}.
08c0: 0a 66 6f 72 65 61 63 68 20 7b 64 69 72 20 6d 6f  .foreach {dir mo
08d0: 64 65 4f 76 65 72 72 69 64 65 7d 20 7b 0a 20 20  deOverride} {.  
08e0: 20 20 2f 74 65 73 74 2d 6e 6f 72 6d 61 6c 20 7b    /test-normal {
08f0: 7d 0a 20 20 20 20 2f 74 65 73 74 2d 72 20 72 65  }.    /test-r re
0900: 61 64 0a 20 20 20 20 2f 74 65 73 74 2d 77 20 77  ad.    /test-w w
0910: 72 69 74 65 0a 20 20 20 20 2f 74 65 73 74 2d 72  rite.    /test-r
0920: 77 20 7b 72 65 61 64 20 77 72 69 74 65 7d 0a 7d  w {read write}.}
0930: 20 7b 0a 20 20 20 20 6d 6f 75 6e 74 20 24 64 69   {.    mount $di
0940: 72 20 24 6d 6f 64 65 4f 76 65 72 72 69 64 65 0a  r $modeOverride.
0950: 20 20 20 20 62 61 74 74 65 72 79 20 5b 61 74 74      battery [att
0960: 65 6d 70 74 20 7b 6f 70 65 6e 20 5b 66 69 6c 65  empt {open [file
0970: 20 6a 6f 69 6e 20 24 64 69 72 20 72 65 61 64 5d   join $dir read]
0980: 20 72 7d 5d 0a 20 20 20 20 62 61 74 74 65 72 79   r}].    battery
0990: 20 5b 61 74 74 65 6d 70 74 20 7b 6f 70 65 6e 20   [attempt {open 
09a0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 20  [file join $dir 
09b0: 77 72 69 74 65 5d 20 77 7d 5d 0a 20 20 20 20 61  write] w}].    a
09c0: 74 74 65 6d 70 74 20 7b 73 6f 75 72 63 65 20 5b  ttempt {source [
09d0: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 20 73  file join $dir s
09e0: 6f 75 72 63 65 5d 7d 0a 20 20 20 20 76 66 73 3a  ource]}.    vfs:
09f0: 3a 66 69 6c 65 73 79 73 74 65 6d 20 75 6e 6d 6f  :filesystem unmo
0a00: 75 6e 74 20 24 64 69 72 0a 7d 0a 0a 23 20 76 69  unt $dir.}..# vi
0a10: 6d 3a 20 73 65 74 20 73 74 73 3d 34 20 73 77 3d  m: set sts=4 sw=
0a20: 34 20 74 77 3d 38 30 20 65 74 20 66 74 3d 74 63  4 tw=80 et ft=tc
0a30: 6c 3a 0a                                         l:.