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.$tlv_types{$type}." $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 ".substr($cname,1)."\_i;$type", 1 if (!rindex($cname,"*",0));
49 return $indent."unsigned int $cname\_n;$type", 1;
50 } elsif ($type eq "sequence" or $type eq "struct") {
51 my $contents = $elem->{"contents"};
52 my $data = "struct {";
54 foreach my $field (@
$contents) {
55 $field = gen_common_ref
($field);
56 my $_cname = gen_cname
($field->{name
});
57 my ($_data, $no_set_field) = gen_tlv_type
($_cname, $field, "$indent\t");
60 return $indent.$data.$indent."} $cname;";
62 die "Unknown type: $ptype\n";
66 sub gen_tlv_struct
($$) {
72 foreach my $field (@
$data) {
73 $field = gen_common_ref
($field);
74 my $cname = gen_cname
($field->{name
});
75 my ($data, $no_set_field) = gen_tlv_type
($cname, $field, "\n\t\t");
77 next if not defined $data;
80 next if $no_set_field;
81 $_set .= "\n\t\tunsigned int $cname : 1;";
84 $name = gen_cname
($name);
100 sub gen_set_func_header
($$)
105 my $func = gen_tlv_set_func
($name, $data);
106 $func and print "$func;\n";
109 sub gen_parse_func_header
($$)
114 my $func = gen_tlv_parse_func
($name, $data);
115 $func and print "$func;\n\n";
118 gen_foreach_message_type
($data, \
&gen_tlv_struct
, \
&gen_tlv_struct
, \
&gen_tlv_struct
);
119 gen_foreach_message_type
($data, \
&gen_set_func_header
, \
&gen_parse_func_header
, \
&gen_parse_func_header
);