chiark / gitweb /
generate proto-spec.h and .cvsignore it
[trains.git] / hostside / parse-proto-spec
1 #!/usr/bin/perl
2
3 print("/* autogenerated - do not edit */\n");
4
5 sub begin ($) {
6     $dname= $_[0];
7 }
8
9 while (<>) {
10     chomp;
11     if (m/^From host to PIC/) {
12         $dirn= '>'; begin("HOST2PIC");
13     } elsif (m/^From PIC to host/) {
14         $dirn= '<'; begin("PIC2HOST");
15     } elsif (m/^\S/) {
16         $dirn= undef;
17     }
18     next unless defined $dirn;
19     next unless m/^ ([<>]) / && $1 eq $dirn;
20     die if m/\t/;
21     die unless m/^ [<>] ([01A-Za-z. ]+?)   +(\S.*)$/;
22     $msg= $1; $rhs= $2;
23     $rhs =~ s/^\([A-Z][0-9A-Z]+\) +//;
24     next if $rhs =~ m/^\}/;
25     next if $msg =~ m/\.\.\./;
26     $rhs =~ m/^([A-Z]+)\s/ or die "$rhs?";
27     $cname= lc $1;
28     $msg =~ s/ //g;
29     if ($msg =~ m/^0[01]{7}$/) {
30         $opcode= $&;
31         $arglen= 0;
32         $ybit= 0;
33     } else {
34         $ybit= substr($msg,0,8);
35         $ybit =~ y/Y01A-Z/10/;
36         $ybit =~ m/1.*1/ and die "$msg/$ybit?";
37         $msg =~ s/Y/0/g;
38         $msg =~ m/[A-Z]/ or die "$msg?";
39         $oplet= $&;
40         $msg =~ s/$oplet/_/g;
41         die "$msg?" if $msg =~ m/[A-Z]/;
42         die "$msg?" unless $msg =~ m/^(1[01][01_]{6})0_{7}$/ or
43             $msg =~ m/^(0[01][01_]{6})$/;
44         $opcode= $1;
45         die if $opcode =~ m/_[01]/;
46         $opcode =~ s/_/0/g;
47         $arglen= $msg;
48         $arglen =~ s/[01]//g;
49         $arglen= length $arglen;
50         $ybit= oct("0b$ybit");
51     }
52     for $yval ($ybit ? (0,1) : '') {
53         printf("%s_%d( %-12s 0x%02x, %2d )\n",
54                $dname, !!$arglen,
55                sprintf("%s%s,",$cname, $yval),
56                oct("0b$opcode") | $ybit *$yval,
57                $arglen)
58             or die $!;
59     }
60 }