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