bind.tcl

Go to the documentation of this file.
00001 /*  -*- tcl -*-*/
00002 /*  ### ### ### ######### ######### #########*/
00003 /*  Terminal packages - string -> action mappings*/
00004 /*  (bind objects). For use with 'receive listen'.*/
00005 /*  In essence a DFA with tree structure.*/
00006 
00007 /*  ### ### ### ######### ######### #########*/
00008 /*  Requirements*/
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 /*  Ready*/
00132 
00133 package provide term::receive::bind 0.1
00134 
00135 /** 
00136  * ### ### ### ######### ######### #########
00137 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1