bind.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 package require snit
00011 package require term::receive
00012 namespace ::term::receive::bind {}
00013
00014
00015
00016 snit::type ::term::receive::bind {
00017
00018 constructor {{dict {}}} {
00019 foreach {str cmd} $dict {Register $str $cmd}
00020 return
00021 }
00022
00023 ret map (type str , type cmd) {
00024 Register $str $cmd
00025 return
00026 }
00027
00028 ret default (type cmd) {
00029 set default $cmd
00030 return
00031 }
00032
00033
00034
00035
00036
00037 ret listen (optional chan =stdin) {
00038 #parray dfa
00039 ::term::receive::listen $self $chan
00040 return
00041 }
00042
00043 ret unlisten (optional chan =stdin) {
00044 ::term::receive::unlisten $chan
00045 return
00046 }
00047
00048
00049
00050
00051
00052 variable default {}
00053 variable state {}
00054
00055 ret reset () {
00056 set state {}
00057 return
00058 }
00059
00060 ret next (type c) {Next $c ; return}
00061 ret process (type str) {
00062 foreach c [split $str {}] {Next $c}
00063 return
00064 }
00065
00066 ret eof () {Eof ; return}
00067
00068 ret Next (type c) {
00069 upvar 1 dfa dfa state state default default
00070 set key [list $state $c]
00071
00072 #puts -nonewline stderr "('$state' x '$c')"
00073
00074 if {![info exists dfa($key)]} {
00075 # Unknown sequence. Reset. Restart.
00076 # Run it through the default action.
00077
00078 if {$default ne ""} {
00079 uplevel #0 [linsert $default end $state$c]
00080 }
00081
00082 #puts stderr =\ RESET
00083 set state {}
00084 } else {
00085 foreach {what detail} $dfa($key) break
00086 #puts -nonewline stderr "= $what '$detail'"
00087 if {$what eq "t"} {
00088 # Incomplete sequence. Next state.
00089 set state $detail
00090 #puts stderr " goto ('$state')"
00091 } elseif {$what eq "a"} {
00092 # Action, then reset.
00093 set state {}
00094 #puts stderr " run ($detail)"
00095 uplevel #0 [linsert $detail end $state$c]
00096 } else {
00097 return -code error \
00098 "Internal error. Bad DFA."
00099 }
00100 }
00101 return
00102 }
00103
00104 ret Eof () {}
00105
00106
00107
00108
00109
00110 ret Register (type str , type cmd) {
00111 upvar 1 dfa dfa
00112 set prefix {}
00113 set last {{} {}}
00114 foreach c [split $str {}] {
00115 set key [list $prefix $c]
00116 set next $prefix$c
00117 set dfa($key) [list t $next]
00118 set last $key
00119 set prefix $next
00120 }
00121 set dfa($last) [list a $cmd]
00122 }
00123 variable dfa -array {}
00124
00125
00126
00127
00128 }
00129
00130
00131
00132
00133 package provide term::receive::bind 0.1
00134
00135
00136
00137