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
|
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
#----------------------------------------------------------------------
# $Revision$
#----------------------------------------------------------------------
proc createPluginInterp {plugin info} {
# Locate plugin source
set src ""
set dirs [list . ./plugins]
lappend dirs [file join $::thisDir .. ..]
lappend dirs [file join $::thisDir .. .. plugins]
lappend dirs [file join $::thisDir .. plugins]
foreach dir $dirs {
set files [list [file join $dir $plugin]]
lappend files [file join $dir $plugin.tcl]
foreach file $files {
if {![file exists $file]} continue
if {![file isfile $file]} continue
if {![file readable $file]} continue
set ch [open $file r]
set data [read $ch 20]
close $ch
if {[string match "##Eskil Plugin*" $data]} {
set src $file
break
}
}
if {$src ne ""} break
}
if {$src eq ""} {
return ""
}
# Create interpreter
set pi [interp create -safe]
# Load source
$pi invokehidden -global source $src
$pi eval [list set ::WhoAmI [file rootname [file tail $src]]]
$pi eval [list set ::Info $info]
interp share {} stdout $pi
# Expose needed commands
interp expose $pi fconfigure ;# ??
interp hide $pi close
return $pi
}
proc preparePlugin {top} {
#FIXA: plugin miffo
disallowEdit $top
$::diff($top,plugin) eval [list array set ::Pref [array get ::Pref]]
set out1 [tmpFile]
set out2 [tmpFile]
|
<
|
<
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
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
|
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
#----------------------------------------------------------------------
# $Revision$
#----------------------------------------------------------------------
proc PluginSearchPath {} {
set dirs [list . ./plugins]
lappend dirs [file join $::thisDir .. ..]
lappend dirs [file join $::thisDir .. .. plugins]
lappend dirs [file join $::thisDir .. plugins]
return $dirs
}
# Locate plugin source
proc LocatePlugin {plugin} {
set src ""
set dirs [PluginSearchPath]
foreach dir $dirs {
set files [list [file join $dir $plugin]]
lappend files [file join $dir $plugin.tcl]
foreach file $files {
if {![file exists $file]} continue
if {![file isfile $file]} continue
if {![file readable $file]} continue
set ch [open $file r]
set data [read $ch 20]
close $ch
if {[string match "##Eskil Plugin*" $data]} {
set src $file
break
}
}
if {$src ne ""} break
}
return $src
}
proc createPluginInterp {plugin info} {
set src [LocatePlugin $plugin]
if {$src eq ""} {
return ""
}
# Create interpreter
set pi [interp create -safe]
# Load source
$pi invokehidden -global source $src
$pi eval [list set ::WhoAmI [file rootname [file tail $src]]]
$pi eval [list set ::Info $info]
interp share {} stdout $pi
# Expose needed commands
interp expose $pi fconfigure ;# ??
interp hide $pi close
return $pi
}
proc printPlugin {plugin} {
set src [LocatePlugin $plugin]
if {$src eq ""} {
printPlugins
return
}
set ch [open $src]
puts -nonewline [read $ch]
close $ch
}
proc printPlugins {} {
set dirs [PluginSearchPath]
foreach dir $dirs {
set files [glob -nocomplain [file join $dir *.tcl]]
foreach file $files {
if {![file exists $file]} continue
if {![file isfile $file]} continue
if {![file readable $file]} continue
set ch [open $file r]
set data [read $ch 100]
close $ch
if {[regexp {^\#\#Eskil Plugin :(.*?)(\n|$)} $data -> descr]} {
puts "Plugin \"[file rootname [file tail $file]]\" : $descr"
}
}
}
}
proc preparePlugin {top} {
#FIXA: plugin miffo
disallowEdit $top
$::diff($top,plugin) eval [list array set ::Pref [array get ::Pref]]
set out1 [tmpFile]
set out2 [tmpFile]
|