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