72 строки
1.6 KiB
Tcl
72 строки
1.6 KiB
Tcl
|
# Try to open the executable as a database and read the "scripts.data"
|
||
|
# field where "scripts.name" is 'main.tcl'
|
||
|
#
|
||
|
catch {
|
||
|
if {![file exists $argv0] && [file exists $argv0.exe]} {
|
||
|
append argv0 .exe
|
||
|
}
|
||
|
sqlite3 db $argv0 -vfs apndvfs -create 0
|
||
|
set mainscript [db one {
|
||
|
SELECT sqlar_uncompress(data,sz) FROM sqlar WHERE name='main.tcl'
|
||
|
}]
|
||
|
}
|
||
|
if {[info exists mainscript]} {
|
||
|
eval $mainscript
|
||
|
return
|
||
|
} else {
|
||
|
catch {db close}
|
||
|
}
|
||
|
|
||
|
# Try to open file named in the first argument as a database and
|
||
|
# read the "scripts.data" field where "scripts.name" is 'main.tcl'
|
||
|
#
|
||
|
if {[llength $argv]>0 && [file readable [lindex $argv 0]]} {
|
||
|
catch {
|
||
|
sqlite3 db [lindex $argv 0] -vfs apndvfs -create 0
|
||
|
set mainscript [db one {SELECT data FROM scripts WHERE name='main.tcl'}]
|
||
|
set argv0 [lindex $argv 0]
|
||
|
set argv [lrange $argv 1 end]
|
||
|
}
|
||
|
if {[info exists mainscript]} {
|
||
|
eval $mainscript
|
||
|
return
|
||
|
} else {
|
||
|
catch {db close}
|
||
|
}
|
||
|
if {[string match *.tcl [lindex $argv 0]]} {
|
||
|
set fd [open [lindex $argv 0] rb]
|
||
|
set mainscript [read $fd]
|
||
|
close $fd
|
||
|
unset fd
|
||
|
set argv0 [lindex $argv 0]
|
||
|
set argv [lrange $argv 1 end]
|
||
|
}
|
||
|
if {[info exists mainscript]} {
|
||
|
eval $mainscript
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# If all else fails, do an interactive loop
|
||
|
#
|
||
|
set line {}
|
||
|
while {![eof stdin]} {
|
||
|
if {$line!=""} {
|
||
|
puts -nonewline "> "
|
||
|
} else {
|
||
|
puts -nonewline "% "
|
||
|
}
|
||
|
flush stdout
|
||
|
append line [gets stdin]
|
||
|
if {[info complete $line]} {
|
||
|
if {[catch {uplevel #0 $line} result]} {
|
||
|
puts stderr "Error: $result"
|
||
|
} elseif {$result!=""} {
|
||
|
puts $result
|
||
|
}
|
||
|
set line {}
|
||
|
} else {
|
||
|
append line \\n"
|
||
|
}
|
||
|
}
|