-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhook.tcl
65 lines (51 loc) · 1.38 KB
/
hook.tcl
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
namespace eval hook {}
proc hook::add {hook func {seq 50}} {
variable $hook
lappend $hook [list $func $seq]
set $hook [lsort -real -index 1 [lsort -unique [set $hook]]]
}
proc hook::remove {hook func {seq 50}} {
variable $hook
set idx [lsearch -exact [set $hook] [list $func $seq]]
set $hook [lreplace [set $hook] $idx $idx]
}
proc hook::is_empty {hook} {
variable $hook
if {![info exists $hook] || [llength [set $hook]] == 0} {
return 1
} else {
return 0
}
}
proc hook::set_flag {hook flag} {
variable F
set idx [lsearch -exact $F(flags,$hook) $flag]
set F(flags,$hook) [lreplace $F(flags,$hook) $idx $idx]
}
proc hook::unset_flag {hook flag} {
variable F
if {[lsearch -exact $F(flags,$hook) $flag] < 0} {
lappend F(flags,$hook) $flag
}
}
proc hook::is_flag {hook flag} {
variable F
return [expr {[lsearch -exact $F(flags,$hook) $flag] < 0}]
}
proc hook::run {hook args} {
variable F
variable $hook
if {![info exists $hook]} {
return
}
set F(flags,$hook) {}
foreach func_prio [set $hook] {
set func [lindex $func_prio 0]
set code [catch { eval $func $args } state]
if {$code == 3 || ($code == 0 && [string equal $state stop])} {
break
} elseif {$code == 1} {
puts "ERROR: $state\n$func ($args)\n$hook"
}
}
}