175 lines
5.3 KiB
Tcl
175 lines
5.3 KiB
Tcl
#-------------------------------------------------------------
|
|
# This is a set of Tcl procedures which try to convert an old
|
|
# batch file into a batch file suitable for Mountaingum.
|
|
#
|
|
# copyright: GPL
|
|
#
|
|
# Mark Koennecke, February 2008
|
|
#-------------------------------------------------------------
|
|
if {[string first tmp $home] < 0} {
|
|
set tmppath $home/tmp
|
|
} else {
|
|
set tmppath $home
|
|
}
|
|
#-------------------------------------------------------------
|
|
proc searchPathForDrivable {name} {
|
|
set path [string trim [hmatchprop / sicsdev $name]]
|
|
if {[string compare $path NONE] != 0} {
|
|
return $path
|
|
}
|
|
set txt [findalias $name]
|
|
if {[string compare $txt NONE] == 0} {
|
|
return NONE
|
|
}
|
|
set l1 [split $txt =]
|
|
set l [split [lindex $l1 1] ,]
|
|
foreach alias $l {
|
|
set alias [string trim $alias]
|
|
set path [string trim [hmatchprop / sicsdev $alias]]
|
|
if {[string compare $path NONE] != 0} {
|
|
return $path
|
|
}
|
|
}
|
|
return NONE
|
|
}
|
|
#----------------------------------------------------------------
|
|
proc searchForCommand {name} {
|
|
return [string trim [hmatchprop / sicscommand $name]]
|
|
}
|
|
#----------------------------------------------------------------
|
|
proc treatsscan {scanpath command out} {
|
|
set l [split $command]
|
|
set len [llength $l]
|
|
set noVar [expr ($len-2)/3]
|
|
set np [lindex $l [expr $len -2]]
|
|
set preset [lindex $l [expr $len -1]]
|
|
for {set i 0} {$i < $noVar} {incr i} {
|
|
set start [expr $i * 3]
|
|
set scanVar [lindex $l [expr 1 + $start]]
|
|
set scanStart [lindex $l [expr 2 + $start]]
|
|
set scanEnd [lindex $l [expr 3 + $start]]
|
|
set scanStep [expr ($scanEnd*1. - $scanStart*1.)/$np*1.]
|
|
append hdbVar $scanVar ,
|
|
append hdbStart $scanStart ,
|
|
append hdbStep $scanStep ,
|
|
}
|
|
set hdbVar [string trim $hdbVar ,]
|
|
set hdbStart [string trim $hdbStart ,]
|
|
set hdbStep [string trim $hdbStep ,]
|
|
puts $out "\#NODE: $scanpath"
|
|
puts $out "clientput BatchPos = 1"
|
|
puts $out "hdbscan $hdbVar $hdbStart $hdbStep $np monitor $preset"
|
|
}
|
|
#----------------------------------------------------------------
|
|
proc treatcscan {scanpath command out} {
|
|
set l [split $command]
|
|
set scanVar [lindex $l 1]
|
|
set scanCenter [lindex $l 2]
|
|
set scanStep [lindex $l 3]
|
|
set np [lindex $l 4]
|
|
set preset [lindex $l 5]
|
|
set hdbStart [expr $scanCenter - ($np*1.0)/2. * $scanStep*1.0]
|
|
puts $out "\#NODE: $scanpath"
|
|
puts $out "clientput BatchPos = 1"
|
|
puts $out "hdbscan $scanVar $hdbStart $scanStep $np monitor $preset"
|
|
}
|
|
#----------------------------------------------------------------
|
|
proc translateCommand {command out} {
|
|
set drivelist [list drive dr run]
|
|
set textList [list for while source if]
|
|
# clientput "Translating: $command"
|
|
set command [string trim $command]
|
|
if {[string length $command] < 2} {
|
|
return
|
|
}
|
|
set l [split $command]
|
|
set obj [string trim [lindex $l 0]]
|
|
#------- check for drive commands
|
|
set idx [lsearch $drivelist $obj]
|
|
if {$idx >= 0} {
|
|
set dev [lindex $l 1]
|
|
set path [searchPathForDrivable $dev]
|
|
if {[string compare $path NONE] != 0} {
|
|
set realTxt [hgetprop $path sicsdev]
|
|
set realL [split $realTxt =]
|
|
set realDev [lindex $realL 1]
|
|
set mapList [list $dev $realDev]
|
|
set newCom [string map $mapList $command]
|
|
puts $out "\#NODE: $path"
|
|
puts $out "clientput BatchPos = 1"
|
|
puts $out $newCom
|
|
return
|
|
}
|
|
}
|
|
#------ check for well known broken commands
|
|
set idx [lsearch $textList $obj]
|
|
if {$idx >= 0} {
|
|
puts $out "\#NODE: /batch/commandtext"
|
|
puts $out "clientput BatchPos = 1"
|
|
set buffer [string map {\n @nl@} $command]
|
|
puts $out "hset /batch/commandtext $buffer"
|
|
return
|
|
}
|
|
#--------- check for simple commands
|
|
set path [searchForCommand $command]
|
|
if {[string compare $path NONE] != 0} {
|
|
puts $out "\#NODE: $path"
|
|
puts $out "clientput BatchPos = 1"
|
|
puts $out $command
|
|
return
|
|
}
|
|
set scancom [searchForCommand hdbscan]
|
|
#---------- deal with scans
|
|
if {[string first sscan $obj] >= 0} {
|
|
if {[catch {treatsscan $scancom $command $out}] == 0} {
|
|
return
|
|
}
|
|
}
|
|
if {[string first cscan $obj] >= 0} {
|
|
if {[catch {treatsscan $scancom $command $out}] == 0} {
|
|
return
|
|
}
|
|
}
|
|
#--------- give up: output as a text node
|
|
puts $out "\#NODE: /batch/commandtext"
|
|
puts $out "clientput BatchPos = 1"
|
|
set buffer [string map {\n @nl@} $command]
|
|
puts $out "hset /batch/commandtext $buffer"
|
|
}
|
|
#----------------------------------------------------------------
|
|
proc mgbatch {filename} {
|
|
global tmppath
|
|
set f [open $filename r]
|
|
gets $f line
|
|
close $f
|
|
if {[string first MOUNTAINBATCH $line] > 0} {
|
|
#--------- This is a mountaingum batch file which does not need
|
|
# to be massaged
|
|
return $filename
|
|
}
|
|
set f [open $filename r]
|
|
set realfilename [file tail $filename]
|
|
set out [open $tmppath/$realfilename w]
|
|
puts $out \#MOUNTAINBATCH
|
|
while {[gets $f line] >= 0} {
|
|
append buffer $line
|
|
if {[info complete $buffer] == 1} {
|
|
translateCommand $buffer $out
|
|
unset buffer
|
|
} else {
|
|
append buffer \n
|
|
}
|
|
}
|
|
close $out
|
|
return $tmppath/$realfilename
|
|
}
|
|
#----------------------------------------------------------------
|
|
proc loadmgbatch {filename} {
|
|
set txt [exe fullpath $filename]
|
|
set l [split $txt =]
|
|
set realf [lindex $l 1]
|
|
set realf [mgbatch $realf]
|
|
return [exe print $realf]
|
|
}
|
|
|