9 binmode STDOUT, ":utf8";
13 die("gen-headers.pl <mbim_foo.json>\n");
18 local $/; #Enable 'slurp' mode
19 open my $fh, "<", $ARGV[0];
22 $json =~ s/^\s*\/\/.*$//mg;
25 my $data = decode_json($json);
30 sub gen_foreach_field($)
35 if ($field->{format} eq "guint32") {
37 } elsif ($field->{format} eq "guint64") {
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";
44 } elsif ($field->{format} eq "ipv4") {
45 print "\tuint8_t " . lc $field->{name} . "[4];\n";
47 } elsif ($field->{format} eq "ipv6") {
48 print "\tuint8_t " . lc $field->{name} . "[16];\n";
50 } elsif ($field->{format} eq "struct-array") {
51 print "\t/* struct " . lc $field->{"struct-type"} . " */\n";
53 } elsif ($field->{format} eq "string") {
54 $format = "struct mbim_string";
56 print "\t/* array type: " . $field->{format} . " */\n";
59 if ($field->{"public-format"}) {
60 print "\t/* enum " . $field->{"public-format"} . " */\n";
62 print "\t" . $format . " " . lc $field->{name} . ";\n";
71 print "struct " . lc $struct . " {\n";
72 foreach my $field (@{$entry}) {
73 gen_foreach_field($field);
75 print "} __attribute__((packed));\n\n";
78 sub gen_foreach_struct($)
82 if ($entry->{contents} && @{$entry->{contents}} > 0) {
83 my $struct = $entry->{name};
84 gen_struct($struct, $entry->{contents});
88 print "/*\n * ID: " . $id . "\n * Command: " . $entry->{name} . "\n */\n\n";
89 my $define = "mbim_cmd_" . $entry->{service} . "_" . $entry->{name};
91 print "#define " . uc $define . "\t" . $id . "\n\n";
94 # basic connect has no sequential numbering. ugly hack alert
99 if ($entry->{query} && @{$entry->{query}} > 0) {
100 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_q";
101 gen_struct($struct, $entry->{query});
104 if ($entry->{response} && @{$entry->{response}} > 0) {
105 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_r";
106 gen_struct($struct, $entry->{response});
109 if ($entry->{set} && @{$entry->{set}} > 0) {
110 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_s";
111 gen_struct($struct, $entry->{set});
114 if ($entry->{notification} && @{$entry->{notification}} > 0) {
115 my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_n";
116 gen_struct($struct, $entry->{notification});
120 sub gen_foreach_command($)
124 foreach my $entry (@$data) {
128 if ($entry->{type} eq 'Command') {
129 gen_foreach_struct($entry);
131 if ($entry->{type} eq 'Struct') {
132 gen_foreach_struct($entry);
137 gen_foreach_command($data);