e951776e1ebb73f876a8fc30c85ad0e02baf47e2
[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 $prefix eq 'ctl_' and $ctl = 1;
23
24 sub get_json() {
25 local $/;
26 my $json = <>;
27 $json =~ s/^\s*\/\/.*$//mg;
28 return decode_json($json);
29 }
30
31 sub gen_cname($) {
32 my $name = shift;
33
34 $name =~ s/[^a-zA-Z0-9_]/_/g;
35 return lc($name);
36 }
37
38 sub gen_has_types($) {
39 my $data = shift;
40
41 foreach my $field (@$data) {
42 $field = gen_common_ref($field);
43 my $type = $field->{"format"};
44 $type and return 1;
45 }
46 return undef
47 }
48
49 sub gen_tlv_set_func($$) {
50 my $name = shift;
51 my $data = shift;
52
53 $name = gen_cname($name);
54 if (gen_has_types($data)) {
55 return "int qmi_set_$name(struct qmi_msg *msg, struct qmi_$name *req)"
56 } else {
57 return "int qmi_set_$name(struct qmi_msg *msg)"
58 }
59 }
60
61 sub gen_tlv_parse_func($$) {
62 my $name = shift;
63 my $data = shift;
64
65 $name = gen_cname($name);
66 if (gen_has_types($data)) {
67 return "int qmi_parse_$name(struct qmi_msg *msg, struct qmi_$name *res)"
68 } else {
69 return "int qmi_parse_$name(struct qmi_msg *msg)"
70 }
71 }
72
73 sub gen_common_ref($$) {
74 my $field = shift;
75 $field = $common_ref{$field->{'common-ref'}} if $field->{'common-ref'} ne '';
76 return $field;
77 }
78
79 sub gen_foreach_message_type($$$)
80 {
81 my $data = shift;
82 my $req_sub = shift;
83 my $res_sub = shift;
84
85 foreach my $entry (@$data) {
86 my $args = [];
87 my $fields = [];
88
89 $common_ref{$entry->{'common-ref'}} = $entry if $entry->{'common-ref'} ne '';
90
91 next if $entry->{type} ne 'Message';
92 next if not defined $entry->{input} and not defined $entry->{output};
93
94 &$req_sub($prefix.$entry->{name}." Request", $entry->{input}, $entry);
95 &$res_sub($prefix.$entry->{name}." Response", $entry->{output}, $entry);
96 }
97 }
98
99 1;