initial import
[project/umbim.git] / data / gen-header.pl
1 #!/usr/bin/perl
2
3 use lib "./lib";
4 use JSON;
5
6 use strict;
7 use warnings;
8
9 binmode STDOUT, ":utf8";
10 use utf8;
11
12 if (!@ARGV) {
13 die("gen-headers.pl <mbim_foo.json>\n");
14 }
15
16 my $json;
17 {
18 local $/; #Enable 'slurp' mode
19 open my $fh, "<", $ARGV[0];
20 $json = <$fh>;
21 close $fh;
22 $json =~ s/^\s*\/\/.*$//mg;
23 }
24
25 my $data = decode_json($json);
26
27
28 my $id = 1;
29
30 sub gen_foreach_field($)
31 {
32 my $field = shift;
33 my $format;
34
35 if ($field->{format} eq "guint32") {
36 $format = "uint32_t";
37 } elsif ($field->{format} eq "guint64") {
38 $format = "uint64_t";
39 } elsif ($field->{format} eq "struct") {
40 $format = "struct ". lc $field->{"struct-type"};
41 } elsif ($field->{format} eq "uuid") {
42 print "\tuint8_t " . lc $field->{name} . "[16];\n";
43 return;
44 } elsif ($field->{format} eq "ipv4") {
45 print "\tuint8_t " . lc $field->{name} . "[4];\n";
46 return;
47 } elsif ($field->{format} eq "ipv6") {
48 print "\tuint8_t " . lc $field->{name} . "[16];\n";
49 return;
50 } elsif ($field->{format} eq "struct-array") {
51 print "\t/* struct " . lc $field->{"struct-type"} . " */\n";
52 $format = "uint32_t";
53 } elsif ($field->{format} eq "string") {
54 $format = "struct mbim_string";
55 } else {
56 print "\t/* array type: " . $field->{format} . " */\n";
57 $format = "uint32_t";
58 }
59 if ($field->{"public-format"}) {
60 print "\t/* enum " . $field->{"public-format"} . " */\n";
61 }
62 print "\t" . $format . " " . lc $field->{name} . ";\n";
63 }
64
65 sub gen_struct($$)
66 {
67 my $struct = shift;
68 my $entry = shift;
69
70 $struct =~ s/ /_/g;
71 print "struct " . lc $struct . " {\n";
72 foreach my $field (@{$entry}) {
73 gen_foreach_field($field);
74 }
75 print "} __attribute__((packed));\n\n";
76 }
77
78 sub gen_foreach_struct($)
79 {
80 my $entry = shift;
81
82 if ($entry->{contents} && @{$entry->{contents}} > 0) {
83 my $struct = $entry->{name};
84 gen_struct($struct, $entry->{contents});
85 return;
86 }
87
88 print "/*\n * ID: " . $id . "\n * Command: " . $entry->{name} . "\n */\n\n";
89 my $define = "mbim_cmd_" . $entry->{service} . "_" . $entry->{name};
90 $define =~ s/ /_/g;
91 print "#define " . uc $define . "\t" . $id . "\n\n";
92
93 $id = $id + 1;
94 # basic connect has no sequential numbering. ugly hack alert
95 if ($id == 17) {
96 $id = 19;
97 }
98
99 if ($entry->{query} && @{$entry->{query}} > 0) {
100 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_q";
101 gen_struct($struct, $entry->{query});
102 }
103
104 if ($entry->{response} && @{$entry->{response}} > 0) {
105 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_r";
106 gen_struct($struct, $entry->{response});
107 }
108
109 if ($entry->{set} && @{$entry->{set}} > 0) {
110 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_s";
111 gen_struct($struct, $entry->{set});
112 }
113
114 if ($entry->{notification} && @{$entry->{notification}} > 0) {
115 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_n";
116 gen_struct($struct, $entry->{notification});
117 }
118 }
119
120 sub gen_foreach_command($)
121 {
122 my $data = shift;
123
124 foreach my $entry (@$data) {
125 my $args = [];
126 my $fields = [];
127
128 if ($entry->{type} eq 'Command') {
129 gen_foreach_struct($entry);
130 }
131 if ($entry->{type} eq 'Struct') {
132 gen_foreach_struct($entry);
133 }
134 }
135 }
136
137 gen_foreach_command($data);