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