uqmi: print radio interfaces in serving system command
[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 $name = "_${name}" if $name =~ /^\d/;
36 return lc($name);
37 }
38
39 sub gen_has_types($) {
40 my $data = shift;
41
42 foreach my $field (@$data) {
43 $field = gen_common_ref($field);
44 my $type = $field->{"format"};
45 $type and return 1;
46 }
47 return undef
48 }
49
50 sub gen_tlv_set_func($$) {
51 my $name = shift;
52 my $data = shift;
53
54 $name = gen_cname($name);
55 if (gen_has_types($data)) {
56 return "int qmi_set_$name(struct qmi_msg *msg, struct qmi_$name *req)"
57 } else {
58 return "int qmi_set_$name(struct qmi_msg *msg)"
59 }
60 }
61
62 sub gen_tlv_parse_func($$) {
63 my $name = shift;
64 my $data = shift;
65
66 $name = gen_cname($name);
67 if (gen_has_types($data)) {
68 return "int qmi_parse_$name(struct qmi_msg *msg, struct qmi_$name *res)"
69 } else {
70 return "int qmi_parse_$name(struct qmi_msg *msg)"
71 }
72 }
73
74 sub gen_common_ref($$) {
75 my $field = shift;
76 $field = $common_ref{$field->{'common-ref'}} if $field->{'common-ref'} ne '';
77 return $field;
78 }
79
80 sub gen_foreach_message_type($$$)
81 {
82 my $data = shift;
83 my $req_sub = shift;
84 my $res_sub = shift;
85
86 foreach my $entry (@$data) {
87 my $args = [];
88 my $fields = [];
89
90 $common_ref{$entry->{'common-ref'}} = $entry if $entry->{'common-ref'} ne '';
91
92 next if $entry->{type} ne 'Message';
93 next if not defined $entry->{input} and not defined $entry->{output};
94
95 &$req_sub($prefix.$entry->{name}." Request", $entry->{input}, $entry);
96 &$res_sub($prefix.$entry->{name}." Response", $entry->{output}, $entry);
97 }
98 }
99
100 1;