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);
}
|