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
|
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
|
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
|
}
}
if {$src ne ""} break
}
return $src
}
proc createPluginInterp {plugin info pinfoName} {
proc createPluginInterp {plugin info allow pinfoName} {
upvar 1 $pinfoName pinfo
set src [LocatePlugin $plugin]
if {$src eq ""} {
return ""
}
# Create interpreter
set pi [interp create -safe]
# Load source
$pi invokehidden -global source $src
# Create interpreter and load source
if {$allow} {
set pi [interp create]
$pi eval source $src
} else {
set pi [interp create -safe]
$pi invokehidden -global source $src
}
# Setup info
$pi eval [list set ::WhoAmI [file rootname [file tail $src]]]
$pi eval [list set ::Info $info]
interp share {} stdout $pi
# Expose needed commands
if {!$allow} {
interp expose $pi fconfigure ;# ??
interp hide $pi close
interp expose $pi fconfigure ;# ??
interp hide $pi close
}
set pinfo {file 0 dir 0}
dict set pinfo allow $allow
if {[$pi eval info proc PreProcess] ne ""} {
dict set pinfo file 1
}
if {[$pi eval info proc FileCompare] ne ""} {
dict set pinfo dir 1
}
|
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
+
|
set descr [dict get $info descr]
puts "Plugin \"$plugin\" : $descr"
}
}
proc preparePlugin {top} {
disallowEdit $top
set allow [dict get $::eskil($top,pluginpinfo) allow]
# Pass ::argv to plugin
$::eskil($top,plugin) eval [list set ::argv $::eskil(argv)]
# Pass ::Pref to plugin
$::eskil($top,plugin) eval [list array set ::Pref [array get ::Pref]]
set out1 [tmpFile]
set out2 [tmpFile]
|
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
|
interp share {} $cho2 $::eskil($top,plugin)
# TODO: When allowing 8.6, do this in coroutines allowing each call
# to yield and to alternate between them until done
set usenew1 [$::eskil($top,plugin) eval [list PreProcess left $chi $cho]]
set usenew2 [$::eskil($top,plugin) eval [list PreProcess right $chi2 $cho2]]
if {$allow} {
$::eskil($top,plugin) eval close $chi
$::eskil($top,plugin) eval close $cho
$::eskil($top,plugin) eval close $chi2
$::eskil($top,plugin) eval close $cho2
} else {
$::eskil($top,plugin) invokehidden close $chi
$::eskil($top,plugin) invokehidden close $cho
$::eskil($top,plugin) invokehidden close $chi2
$::eskil($top,plugin) invokehidden close $cho2
$::eskil($top,plugin) invokehidden close $chi
$::eskil($top,plugin) invokehidden close $cho
$::eskil($top,plugin) invokehidden close $chi2
$::eskil($top,plugin) invokehidden close $cho2
}
close $chi
close $cho
close $chi2
close $cho2
if {$usenew1} {
# The file after processing should be used both
|
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
|
-
+
|
proc EditPrefPluginsOk {top w} {
destroy $w
set ::eskil($top,pluginname) $::eskil($top,edit,pluginname)
set ::eskil($top,plugininfo) $::eskil($top,edit,plugininfo)
if {$::eskil($top,pluginname) ne ""} {
set pinterp [createPluginInterp $::eskil($top,pluginname) \
$::eskil($top,plugininfo) pinfo]
$::eskil($top,plugininfo) 0 pinfo]
} else {
set pinterp ""
set pinfo ""
}
set ::eskil($top,plugin) $pinterp
set ::eskil($top,pluginpinfo) $pinfo
}
|