9275d4e3a84068894d123441e1e8be045895a80c
[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 gfloat => "float",
18 gboolean => "bool",
19 );
20 our %common_ref = ();
21
22 my @c_reserved_keywords = (
23 "alignas",
24 "alignof",
25 "auto",
26 "bool",
27 "break",
28 "case",
29 "char",
30 "const",
31 "constexpr",
32 "continue",
33 "default",
34 "do",
35 "double",
36 "else",
37 "enum",
38 "extern",
39 "false",
40 "float",
41 "for",
42 "goto",
43 "if",
44 "inline",
45 "int",
46 "long",
47 "nullptr",
48 "register",
49 "restrict",
50 "return",
51 "short",
52 "signed",
53 "sizeof",
54 "static",
55 "static_assert",
56 "struct",
57 "switch",
58 "thread_local",
59 "true",
60 "typedef",
61 "typeof",
62 "typeof_unqual",
63 "union",
64 "unsigned",
65 "void",
66 "volatile",
67 "while"
68 );
69
70 $prefix eq 'ctl_' and $ctl = 1;
71
72 sub get_json() {
73 local $/;
74 my $json = <>;
75 $json =~ s/^\s*\/\/.*$//mg;
76 return decode_json($json);
77 }
78
79 sub gen_cname($) {
80 my $name = shift;
81
82 $name =~ s/[^a-zA-Z0-9_]/_/g;
83 $name = "_${name}" if $name =~ /^\d/;
84 $name = lc($name);
85 $name = "_${name}" if (grep {$_ eq $name} @c_reserved_keywords);
86 return $name;
87 }
88
89 sub gen_has_types($) {
90 my $data = shift;
91
92 foreach my $field (@$data) {
93 $field = gen_common_ref($field);
94 my $type = $field->{"format"};
95 $type and return 1;
96 }
97 return undef
98 }
99
100 sub gen_tlv_set_func($$) {
101 my $name = shift;
102 my $data = shift;
103
104 $name = gen_cname($name);
105 if (gen_has_types($data)) {
106 return "int qmi_set_$name(struct qmi_msg *msg, struct qmi_$name *req)"
107 } else {
108 return "int qmi_set_$name(struct qmi_msg *msg)"
109 }
110 }
111
112 sub gen_tlv_parse_func($$) {
113 my $name = shift;
114 my $data = shift;
115
116 $name = gen_cname($name);
117 if (gen_has_types($data)) {
118 return "int qmi_parse_$name(struct qmi_msg *msg, struct qmi_$name *res)"
119 } else {
120 return "int qmi_parse_$name(struct qmi_msg *msg)"
121 }
122 }
123
124 sub gen_common_ref($$) {
125 my $field = shift;
126 $field = $common_ref{$field->{'common-ref'}} if $field->{'common-ref'} ne '';
127 return $field;
128 }
129
130 sub gen_foreach_message_type($$$)
131 {
132 my $data = shift;
133 my $req_sub = shift;
134 my $res_sub = shift;
135 my $ind_sub = shift;
136
137 foreach my $entry (@$data) {
138 my $args = [];
139 my $fields = [];
140
141 $common_ref{$entry->{'common-ref'}} = $entry if $entry->{'common-ref'} ne '';
142
143 next if $entry->{type} ne 'Message';
144 next if not defined $entry->{input} and not defined $entry->{output};
145
146 &$req_sub($prefix.$entry->{name}." Request", $entry->{input}, $entry);
147 &$res_sub($prefix.$entry->{name}." Response", $entry->{output}, $entry);
148 }
149
150 foreach my $entry (@$data) {
151 my $args = [];
152 my $fields = [];
153
154 $common_ref{$entry->{'common-ref'}} = $entry if $entry->{'common-ref'} ne '';
155
156 next if $entry->{type} ne 'Indication';
157 next if not defined $entry->{input} and not defined $entry->{output};
158
159 &$ind_sub($prefix.$entry->{name}." Indication", $entry->{output}, $entry);
160 }
161 }
162
163
164 1;