chiark / gitweb /
hostside: more length for bavarian
[trains.git] / hostside / eventrun
1 #!/usr/bin/tclsh8.3
2 # usage:
3 #   eventrun [<options>] <config filename> <command to run evdev-manip>
4
5 proc do_key {key} {
6     upvar #0 evmap($key) em
7     if {[info exists em]} {
8         puts "+ $key $em"
9         uplevel #0 $em
10     } else {
11         puts "- $key"
12     }
13 }
14
15 proc onevgen {} {
16     global evgen evmap state scancode
17     if {[gets $evgen l] < 0} {
18         if {![eof $evgen]} return
19         exit 0
20     }
21     if {[regexp {^\S+ (?:opened|0) } $l]} return
22     if {![regexp {^\S+ 1 (.*)$} $l dummy key]} {
23         puts stderr "unknown >$l<"
24         return
25     }
26     do_key $key
27 }   
28
29 proc setup {cmdl} {
30     global evgen state
31     lappend cmdl 2>@ stderr --stdin-monitor
32     set evgen [open |$cmdl r+]
33     fconfigure $evgen -blocking no
34     fileevent $evgen readable onevgen
35 }
36
37 proc bgerror {m} {
38     if {[catch {
39         global errorInfo errorCode
40         puts stderr "$m\n$errorCode\n$errorInfo"
41         fail "bgerror $m"
42     } emsg]} {
43         exit 127
44     }
45 }
46
47 proc parsespecinput {fn} {
48     global evmap
49     set f [open $fn r]
50     while {[gets $f l] >= 0} {
51         set l [string trim $l]
52         if {[regexp {^\#} $l]} {
53             continue
54         } elseif {![regexp {\S} $l]} {
55             continue
56         } elseif {![regexp {^(\S+)\s*(.*)$} $l dummy k action]} {
57             error "bad spec line $l"
58         }
59         if {[regexp {^([A-Z][A-Z0-9_]+)$} $k dummy key]} {
60             set key "EV KEY KEY $key"
61         } elseif {[regexp {^([A-Z]+)\-([A-Z][A-Z0-9_]+)} $k dummy type key]} {
62             set key "EV KEY $type $key"
63         } elseif {[regexp {^([0-9a-f]+)-(\w+)-(\w*)-(\w+)} $k dummy \
64                 ap au fp fu]} {
65             if {![string length $fp]} { set fp $ap }
66             set key "0x$ap $au 0x$fp $fu"
67         } elseif {[regexp {^0x|^[A-Z]} $k] && [llength [split $k -]] > 2} {
68             set key [join [split $k -] " "]
69         } elseif {[regexp {^\@init$} $k]} {
70             uplevel #0 $action
71             continue
72         } else {
73             error "unknown key syntax $l"
74         }
75         set evmap($key) $action
76     }
77 }
78
79 set specfile [lindex $argv 0]
80 if {[string match -* $specfile]} { error "no options understood" }
81 set evgenerator [lrange $argv 1 end]
82 if {![llength $evgenerator]} { error "no event generator specified" }
83
84 parsespecinput $specfile
85 setup $evgenerator
86
87 vwait end