filter out comments in json files before pushing them through the JSON module
[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;