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);