fix generated code for allocating arrays
[project/uqmi.git] / data / gen-common.pm
1 use lib "$Bin/lib";
2 use JSON;
3
4 @ARGV < 2 and die "Usage: $0 <prefix> <file>\n";
5 my $prefix = shift @ARGV;
6
7 our $ctl;
8 our %tlv_types = (
9 gint8 => "int8_t",
10 guint8 => "uint8_t",
11 gint16 => "int16_t",
12 guint16 => "uint16_t",
13 gint32 => "int32_t",
14 guint32 => "uint32_t",
15 gint64 => "int64_t",
16 guint64 => "uint64_t",
17 gboolean => "bool",
18 );
19
20 $prefix eq 'ctl_' and $ctl = 1;
21
22 sub get_json() {
23 local $/;
24 my $json = <>;
25 $json =~ s/^\s*\/\/.*$//mg;
26 return decode_json($json);
27 }
28
29 sub gen_cname($) {
30 my $name = shift;
31
32 $name =~ s/[^a-zA-Z0-9_]/_/g;
33 return lc($name);
34 }
35
36 sub gen_has_types($) {
37 my $data = shift;
38
39 foreach my $field (@$data) {
40 my $type = $field->{"format"};
41 $type and return 1;
42 }
43 return undef
44 }
45
46 sub gen_tlv_set_func($$) {
47 my $name = shift;
48 my $data = shift;
49
50 $name = gen_cname($name);
51 if (gen_has_types($data)) {
52 return "int qmi_set_$name(struct qmi_msg *msg, struct qmi_$name *req)"
53 } else {
54 return "int qmi_set_$name(struct qmi_msg *msg)"
55 }
56 }
57
58 sub gen_tlv_parse_func($$) {
59 my $name = shift;
60 my $data = shift;
61
62 $name = gen_cname($name);
63 if (gen_has_types($data)) {
64 return "int qmi_parse_$name(struct qmi_msg *msg, struct qmi_$name *res)"
65 } else {
66 return "int qmi_parse_$name(struct qmi_msg *msg)"
67 }
68 }
69
70 sub gen_foreach_message_type($$$)
71 {
72 my $data = shift;
73 my $req_sub = shift;
74 my $res_sub = shift;
75
76 foreach my $entry (@$data) {
77 my $args = [];
78 my $fields = [];
79
80 next if $entry->{type} ne 'Message';
81 next if not defined $entry->{input} and not defined $entry->{output};
82
83 &$req_sub($prefix.$entry->{name}." Request", $entry->{input}, $entry);
84 &$res_sub($prefix.$entry->{name}." Response", $entry->{output}, $entry);
85 }
86 }
87
88 1;