1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
#!/usr/bin/perl -w
use strict;
die "no section perl file given" unless @ARGV;
my $h = require($ARGV[0]);
our $basename;
our $debug = $ARGV[1];
($basename) = $ARGV[0] =~ /([a-zA-Z0-9_\-_]+).pl/;
local *H;
local *C;
h_header();
c_header();
foreach (sort keys %{$h}) {
foreach my $item (@{$h->{$_}}) {
if ($_ eq "descriptors") {
printf H ("#define %s_ID 0x%02X\n",uc($item->{name}),$item->{id});
}
do_it ($item->{name},$item->{elements});
}
}
h_footer();
c_footer();
sub type
{
if ($_[0] > 16) {
return "u32";
} elsif ($_[0] > 8) {
return "u16";
} else {
return "u8 ";
}
}
sub do_it
{
my ($name,$val) = @_;
print H "struct $name {\n";
print C <<EOL;
struct $name read_$name(const u8 *b)
{
struct $name v;
EOL
my $offs = 0;
for (my $i = 0; $i < scalar @{$val}; $i+=2) {
printf H ("\t\t%s %-25s :%2d;\n",type($val->[$i+1]),$val->[$i],$val->[$i+1]);
printf C ("\tv.%-25s = getBits(b,%3d,%2d);\n",$val->[$i],$offs,$val->[$i+1]);
printf C ("\tfprintf(stderr,\" %s = %%x %%d\\n\",v.%s,v.%s);\n",$val->[$i],$val->[$i],$val->[$i]) if $debug;
$offs += $val->[$i+1];
}
print H "} PACKED;\n";
print H "struct $name read_$name(const u8 *);\n\n";
print C "\treturn v;\n}\n\n"
}
sub h_header
{
open(H,">$basename.h");
print H "#ifndef __".uc($basename)."_H_\n";
print H "#define __".uc($basename)."_H_\n\n";
print H "#include \"section.h\"\n\n";
}
sub c_header
{
open(C,">$basename.c");
print C "#include \"$basename.h\"\n\n";
}
sub c_footer
{
close(C);
}
sub h_footer
{
print H "#endif\n";
close(H);
}
|