| # 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" |
| } |
| } |