chiark / gitweb /
not even nearly working
[trains.git] / hostside / parse-proto-spec
1 #!/usr/bin/perl
2 while (<>) {
3     $dirn= '<' if m/^From host to PIC/ ... m/^\S/;
4     $dirn= '>' if m/^From host to PIC/ ... m/^\S/;
5     
6     $dirn=  ? '>' :
7         m/^From PIC to host/ ... m/^\S/ ? '<' : undef;
8     next unless defined $dirn;
9     next unless m/^ [(<>)] / && $1 eq $dirn;
10     die if m/\t/;
11     die unless m/^ [<>] ([01A-Z. ]+?)   +(?:\([A-Z]\))? (\S.*)$/;
12     $msg= $1; $rhs= $2;
13     next if $rhs =~ m/^\}/;
14     next if $msg =~ m/^\.\.\./;
15     $rhs =~ m/^([A-Z]+)\s/;
16     $cname= lc $1;
17     $msg =~ s/ //g;
18     if ($msg =~ m/^0[01]{7}$/) {
19         $opcode= $&;
20         $arglen= 0;
21     } else {
22         $msg =~ m/A-Z/;
23         $oplet= $&;
24         $msg =~ s/$oplet/_/g;
25         die if $msg =~ m/A-Z/;
26         die if $msg =~ m/_[01]/;
27         die unless $msg =~ m/^(1[01][01_]{6})0_{7}$/ or
28             $msg =~ m/^(0[01][01_]{6})$/;
29         $opcode= $1;
30         $arglen= $msg;
31         $arglen =~ s/[01]//g;
32         $arglen= length $arglen;
33     }
34     printf(" { %-16s, 0x%02x, %2d },",
35            "\"$cname\",", bin($opcode), $arglen)
36         or die $!;
37 }