chiark / gitweb /
hostside: more length for bavarian
[trains.git] / hostside / extract-input-codes
1 #!/usr/bin/perl -w
2
3 use strict 'vars';
4
5 # "/usr/include/linux/input.h
6
7 our (%strs, %checkunique, %tabaliases, %evtypes);
8
9 sub strs ($) {
10     my ($t) = @_;
11     $strs{$t}= [ ];
12 }
13 sub evtype ($) {
14     my ($t) = @_;
15     $evtypes{$t}= 1;
16     strs($t);
17 }
18
19 our ($t);
20 foreach $t (qw(EV BUS)) {
21     strs($t);
22 }
23 foreach $t (qw(KEY REL ABS MSC LED)) {
24     evtype($t);
25 }
26 $tabaliases{'BTN'}= 'KEY';
27
28 our ($tab,$str,$val,$s);
29
30 while (<>) {
31     if (m/^\#define (\w+)_(\w+)\s+(0|[1-9]\d+|0x[0-9a-f]+)\s*$/) {
32         ($tab,$str,$val)=($1,$2, eval $3);
33         next if "${tab}_${str}" =~
34             m/^BTN_(?:MISC|MOUSE|JOYSTICK|GAMEPAD|DIGI)$|^EV_VERSION$/;
35         next if $str eq 'MAX';
36         $t= $tabaliases{$tab} || $tab;
37         $s= $strs{$t};
38         if (defined $s) {
39             die "$tab $str $val" if defined $s->[$val];
40             $s->[$val]= [ $tab, $str ];
41         }
42         die "$tab $str $val" if $checkunique{$t}{"$tab $str"}++;
43     }
44 }
45
46 our ($i,$iesis,$ien,$n,$si);
47
48 print <<END
49 typedef struct {
50   const char *prefix, *main;
51 } InputEventStringInfo;
52
53 typedef struct {
54   int nstrings;
55   const InputEventStringInfo *strings;
56   InputEventState **states;
57 } InputEventTypeInfo;
58
59 END
60     or die $!;
61
62 sub print_i () {
63     printf "    /* %4d %#6x */ ", $i,$i or die $!;
64 }
65
66 for $t (sort keys %strs) {
67     $s= $strs{$t};
68     $n= @$s;
69     $ien= "IEN_$t";
70     $iesis= "iesis_\L$t";
71     print <<END
72 #define $ien $n
73 static const int \L$ien\E= $n;
74 static const InputEventStringInfo ${iesis}[$ien] = {
75 END
76         or die $!;
77     for ($i=0; $i<@$s; $i++) {
78         $si= $s->[$i];
79         print_i();
80         if (defined $si) {
81             printf "  { %10s %-25s },\n", "\"$si->[0]\",", "\"$si->[1]\""
82                 or die $!;
83         } else {
84             print "  { 0 },\n"
85                 or die $!;
86         }
87     }
88     printf <<END
89 };
90 END
91         or die $!;
92     printf <<END
93 static InputEventState *iess_\L$t\E[$ien];
94 END
95         or die $!
96             if exists $evtypes{$t};
97 }
98
99 for $tab (sort keys %tabaliases) {
100     $t= $tabaliases{$tab};
101     print <<END
102 #define IEN_${tab} IEN_${t}
103 #define iesis_\L${tab} iesis_${t}
104 #define iess_\L${tab} iess_${t}
105 END
106         or die $!;
107 }
108
109 $s= $strs{'EV'};
110 print <<END
111 #define IETIN IEN_EV
112 static const InputEventTypeInfo ietis[IETIN]= {
113 END
114     or die $!;
115
116 our (@sip);
117
118 for ($i=0; $i<@$s; $i++) {
119     $si= $s->[$i];
120     $tab= defined $si ? $si->[1] : undef;
121     $tab= $tab && exists $evtypes{$tab} ? $tab : undef;
122     @sip= $tab ? ("IEN_$tab", "iesis_\L$tab", "iess_\L$tab") : (-1, 0, 0);
123     print_i();
124     printf "  { %-16s %-15s %-15s },\n", "$sip[0],", "$sip[1],", $sip[2],
125         or die $!;
126 }
127 print <<END
128 };
129 END
130     or die $!;