5 require "$Bin/gen-common.pm";
11 sub gen_tlv_type
($$$) {
16 my $type = $elem->{"format"};
17 my $ptype = $elem->{"public-format"};
20 $type or return undef;
21 $ptype or $ptype = $type;
23 if ($type eq "guint-sized") {
24 my $size = $elem->{"guint-size"};
26 if ($size > 4 and $size < 8) {
31 die "Invalid size for guint-sized";
35 if ($tlv_types{$ptype}) {
36 return $indent.$tlv_types{$ptype}." $cname;";
37 } elsif ($tlv_types{$type}) {
38 return $indent."$ptype $cname;";
39 } elsif ($type eq "string") {
40 return $indent."char *$cname;", 1;
41 } elsif ($type eq "array") {
42 if ($elem->{"fixed-size"}) {
43 my $len_f = '['.$elem->{"fixed-size"}.']';
44 return gen_tlv_type
("$cname$len_f", $elem->{"array-element"}, $indent);
46 my ($type, $no_set_field) = gen_tlv_type
("*$cname", $elem->{"array-element"}, $indent);
47 return undef if not defined $type;
48 return $indent."unsigned int $cname\_n;$type", 1;
49 } elsif ($type eq "sequence" or $type eq "struct") {
50 my $contents = $elem->{"contents"};
51 my $data = "struct {";
53 foreach my $field (@
$contents) {
54 my $_cname = gen_cname
($field->{name
});
55 my ($_data, $no_set_field) = gen_tlv_type
($_cname, $field, "$indent\t");
58 return $indent.$data.$indent."} $cname;";
60 die "Unknown type: $ptype\n";
64 sub gen_tlv_struct
($$) {
70 foreach my $field (@
$data) {
71 my $cname = gen_cname
($field->{name
});
72 my ($data, $no_set_field) = gen_tlv_type
($cname, $field, "\n\t\t");
74 next if not defined $data;
77 next if $no_set_field;
78 $_set .= "\n\t\tunsigned int $cname : 1;";
81 $name = gen_cname
($name);
97 sub gen_set_func_header
($$)
102 my $func = gen_tlv_set_func
($name, $data);
103 $func and print "$func;\n";
106 sub gen_parse_func_header
($$)
111 my $func = gen_tlv_parse_func
($name, $data);
112 $func and print "$func;\n\n";
115 gen_foreach_message_type
($data, \
&gen_tlv_struct
, \
&gen_tlv_struct
);
116 gen_foreach_message_type
($data, \
&gen_set_func_header
, \
&gen_parse_func_header
);