Eskil

Diff
Login

Differences From Artifact [8ce0132ee9]:

To Artifact [963d0db06f]:


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
}