#!/usr/bin/tclsh8.3 # usage: # eventrun [] proc do_key {key} { upvar #0 evmap($key) em if {[info exists em]} { puts "+ $key $em" uplevel #0 $em } else { puts "- $key" } } proc onevgen {} { global evgen evmap state scancode if {[gets $evgen l] < 0} { if {![eof $evgen]} return exit 0 } if {[regexp {^\S+ (?:opened|0) } $l]} return if {![regexp {^\S+ 1 (.*)$} $l dummy key]} { puts stderr "unknown >$l<" return } do_key $key } proc setup {cmdl} { global evgen state lappend cmdl 2>@ stderr --stdin-monitor set evgen [open |$cmdl r+] fconfigure $evgen -blocking no fileevent $evgen readable onevgen } proc bgerror {m} { if {[catch { global errorInfo errorCode puts stderr "$m\n$errorCode\n$errorInfo" fail "bgerror $m" } emsg]} { exit 127 } } proc parsespecinput {fn} { global evmap set f [open $fn r] while {[gets $f l] >= 0} { set l [string trim $l] if {[regexp {^\#} $l]} { continue } elseif {![regexp {\S} $l]} { continue } elseif {![regexp {^(\S+)\s*(.*)$} $l dummy k action]} { error "bad spec line $l" } if {[regexp {^([A-Z][A-Z0-9_]+)$} $k dummy key]} { set key "EV KEY KEY $key" } elseif {[regexp {^([A-Z]+)\-([A-Z][A-Z0-9_]+)} $k dummy type key]} { set key "EV KEY $type $key" } elseif {[regexp {^([0-9a-f]+)-(\w+)-(\w*)-(\w+)} $k dummy \ ap au fp fu]} { if {![string length $fp]} { set fp $ap } set key "0x$ap $au 0x$fp $fu" } elseif {[regexp {^0x|^[A-Z]} $k] && [llength [split $k -]] > 2} { set key [join [split $k -] " "] } elseif {[regexp {^\@init$} $k]} { uplevel #0 $action continue } else { error "unknown key syntax $l" } set evmap($key) $action } } set specfile [lindex $argv 0] if {[string match -* $specfile]} { error "no options understood" } set evgenerator [lrange $argv 1 end] if {![llength $evgenerator]} { error "no event generator specified" } parsespecinput $specfile setup $evgenerator vwait end