1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
-
+
+
|
proc tclInit {} {
rename tclInit {}
rename tclInit {}
global auto_path tcl_library tcl_libPath
global tcl_version tcl_rcFileName
global auto_path tcl_library tcl_libPath
global tcl_version tcl_rcFileName
set noe [info nameofexecutable]
set noe [info nameofexecutable]
# Resolve symlinks
set noe [file dirname [file normalize [file join $noe __dummy__]]]
# Resolve symlinks
set noe [file dirname [file normalize [file join $noe __dummy__]]]
set tcl_library [file join $noe lib tcl$tcl_version]
set tcl_libPath [list $tcl_library [file join $noe lib]]
set tcl_library [file join $noe lib tcl$tcl_version]
set tcl_libPath [list $tcl_library [file join $noe lib]]
# get rid of a build residue
unset -nocomplain ::tclDefaultLibrary
# get rid of a build residue
unset -nocomplain ::tclDefaultLibrary
# the following code only gets executed once on startup
if {[info exists tcl_rcFileName]} {
load {} vfs
# the following code only gets executed once on startup
if {[info exists tcl_rcFileName]} {
# lookup and emulate "source" of lib/vfs/{vfs*.tcl,mk4vfs.tcl}
switch -- $::tclKitStorage {
"mk4" {
load {} vfs
# lookup and emulate "source" of lib/vfs/{vfs*.tcl,mk4vfs.tcl}
# must use raw MetaKit calls because VFS is not yet in place
set d [${::tclkitMkNamespace}::select exe.dirs parent 0 name lib]
set d [${::tclkitMkNamespace}::select exe.dirs parent $d name vfs]
# must use raw MetaKit calls because VFS is not yet in place
set d [mk::select exe.dirs parent 0 name lib]
set d [mk::select exe.dirs parent $d name vfs]
foreach x {vfsUtils vfslib mk4vfs} {
set n [${::tclkitMkNamespace}::select exe.dirs!$d.files name $x.tcl]
set s [${::tclkitMkNamespace}::get exe.dirs!$d.files!$n contents]
catch {set s [zlib decompress $s]}
uplevel #0 $s
}
foreach x {vfsUtils vfslib mk4vfs} {
set n [mk::select exe.dirs!$d.files name $x.tcl]
set s [mk::get exe.dirs!$d.files!$n contents]
catch {set s [zlib decompress $s]}
uplevel #0 $s
}
# use on-the-fly decompression, if mk4vfs understands that
switch -- $::tclkitMkNamespace {
"mk" {
set mk4vfs::zstreamed 1
set vfsimpl "mk4"
}
"readkit" {
set mkcl_vfs::zstreamed 1
set vfsimpl "mkcl"
}
}
# use on-the-fly decompression, if mk4vfs understands that
set mk4vfs::zstreamed 1
# Set VFS handler name
set vfsHandler [list ::vfs::mk4::handler exe]
}
"zip" {
set prefix "lib/vfs"
foreach file [list vfsUtils vfslib] {
set fullfile "${prefix}/${file}.tcl"
::zip::stat $::tclKitStorage_fd $fullfile finfo
seek $::tclKitStorage_fd $finfo(ino)
zip::Data $::tclKitStorage_fd sb s
switch -- $file {
"vfsUtils" {
# Preserve our working "::vfs::zip" implementation
# so we can replace it after the stub is replaced
# from vfsUtils
# The correct implementation will be provided by vfslib,
# but only if we can read it
rename ::vfs::zip ::vfs::zip_impl
}
}
uplevel #0 $s
switch -- $file {
"vfsUtils" {
# Restore preserved "::vfs:zip" implementation
rename ::vfs::zip {}
rename ::vfs::zip_impl ::vfs::zip
}
}
}
seek $::tclKitStorage_fd 0
set vfsHandler [list ::vfs::zip::handler $::tclKitStorage_fd]
unset ::tclKitStorage_fd
}
}
# mount the executable, i.e. make all runtime files available
vfs::filesystem mount $noe [list ::vfs::${vfsimpl}::handler exe]
# mount the executable, i.e. make all runtime files available
vfs::filesystem mount $noe $vfsHandler
# alter path to find encodings
if {[info tclversion] eq "8.4"} {
load {} pwb
librarypath [info library]
} else {
encoding dirs [list [file join [info library] encoding]] ;# TIP 258
}
# alter path to find encodings
if {[info tclversion] eq "8.4"} {
load {} pwb
librarypath [info library]
} else {
encoding dirs [list [file join [info library] encoding]] ;# TIP 258
}
# fix system encoding, if it wasn't properly set up (200207.004 bug)
if {[encoding system] eq "identity"} {
switch $::tcl_platform(platform) {
windows { encoding system cp1252 }
macintosh { encoding system macRoman }
default { encoding system iso8859-1 }
}
}
# fix system encoding, if it wasn't properly set up (200207.004 bug)
if {[encoding system] eq "identity"} {
switch $::tcl_platform(platform) {
windows { encoding system cp1252 }
macintosh { encoding system macRoman }
default { encoding system iso8859-1 }
}
}
# now remount the executable with the correct encoding
# now remount the executable with the correct encoding
#vfs::filesystem unmount $noe
vfs::filesystem unmount [lindex [::vfs::filesystem info] 0]
vfs::filesystem unmount [lindex [::vfs::filesystem info] 0]
set noe [info nameofexecutable]
set noe [info nameofexecutable]
# Resolve symlinks
set noe [file dirname [file normalize [file join $noe __dummy__]]]
# Resolve symlinks
set noe [file dirname [file normalize [file join $noe __dummy__]]]
set tcl_library [file join $noe lib tcl$tcl_version]
set tcl_libPath [list $tcl_library [file join $noe lib]]
vfs::filesystem mount $noe [list ::vfs::${vfsimpl}::handler exe]
}
set tcl_library [file join $noe lib tcl$tcl_version]
set tcl_libPath [list $tcl_library [file join $noe lib]]
vfs::filesystem mount $noe $vfsHandler
}
# load config settings file if present
namespace eval ::vfs { variable tclkit_version 1 }
catch { uplevel #0 [list source [file join $noe config.tcl]] }
# load config settings file if present
namespace eval ::vfs { variable tclkit_version 1 }
catch { uplevel #0 [list source [file join $noe config.tcl]] }
uplevel #0 [list source [file join $tcl_library init.tcl]]
uplevel #0 [list source [file join $tcl_library init.tcl]]
# reset auto_path, so that init.tcl's search outside of tclkit is cancelled
set auto_path $tcl_libPath
# reset auto_path, so that init.tcl's search outside of tclkit is cancelled
set auto_path $tcl_libPath
# This loads everything needed for "clock scan" to work
# "clock scan" is used within "vfs::zip", which may be
# loaded before this is run causing the root VFS to break
catch { clock scan }
# Cleanup
unset ::tclkitMkNamespace
unset ::tclKitStorage
unset -nocomplain ::tclKitStorage_fd
}
|