diff options
Diffstat (limited to 'data/gen-header.pl')
-rwxr-xr-x | data/gen-header.pl | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/data/gen-header.pl b/data/gen-header.pl new file mode 100755 index 0000000..f1d1128 --- /dev/null +++ b/data/gen-header.pl @@ -0,0 +1,137 @@ +#!/usr/bin/perl + +use lib "./lib"; +use JSON; + +use strict; +use warnings; + +binmode STDOUT, ":utf8"; +use utf8; + +if (!@ARGV) { + die("gen-headers.pl <mbim_foo.json>\n"); +} + +my $json; +{ + local $/; #Enable 'slurp' mode + open my $fh, "<", $ARGV[0]; + $json = <$fh>; + close $fh; + $json =~ s/^\s*\/\/.*$//mg; +} + +my $data = decode_json($json); + + +my $id = 1; + +sub gen_foreach_field($) +{ + my $field = shift; + my $format; + + if ($field->{format} eq "guint32") { + $format = "uint32_t"; + } elsif ($field->{format} eq "guint64") { + $format = "uint64_t"; + } elsif ($field->{format} eq "struct") { + $format = "struct ". lc $field->{"struct-type"}; + } elsif ($field->{format} eq "uuid") { + print "\tuint8_t " . lc $field->{name} . "[16];\n"; + return; + } elsif ($field->{format} eq "ipv4") { + print "\tuint8_t " . lc $field->{name} . "[4];\n"; + return; + } elsif ($field->{format} eq "ipv6") { + print "\tuint8_t " . lc $field->{name} . "[16];\n"; + return; + } elsif ($field->{format} eq "struct-array") { + print "\t/* struct " . lc $field->{"struct-type"} . " */\n"; + $format = "uint32_t"; + } elsif ($field->{format} eq "string") { + $format = "struct mbim_string"; + } else { + print "\t/* array type: " . $field->{format} . " */\n"; + $format = "uint32_t"; + } + if ($field->{"public-format"}) { + print "\t/* enum " . $field->{"public-format"} . " */\n"; + } + print "\t" . $format . " " . lc $field->{name} . ";\n"; +} + +sub gen_struct($$) +{ + my $struct = shift; + my $entry = shift; + + $struct =~ s/ /_/g; + print "struct " . lc $struct . " {\n"; + foreach my $field (@{$entry}) { + gen_foreach_field($field); + } + print "} __attribute__((packed));\n\n"; +} + +sub gen_foreach_struct($) +{ + my $entry = shift; + + if ($entry->{contents} && @{$entry->{contents}} > 0) { + my $struct = $entry->{name}; + gen_struct($struct, $entry->{contents}); + return; + } + + print "/*\n * ID: " . $id . "\n * Command: " . $entry->{name} . "\n */\n\n"; + my $define = "mbim_cmd_" . $entry->{service} . "_" . $entry->{name}; + $define =~ s/ /_/g; + print "#define " . uc $define . "\t" . $id . "\n\n"; + + $id = $id + 1; + # basic connect has no sequential numbering. ugly hack alert + if ($id == 17) { + $id = 19; + } + + if ($entry->{query} && @{$entry->{query}} > 0) { + my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_q"; + gen_struct($struct, $entry->{query}); + } + + if ($entry->{response} && @{$entry->{response}} > 0) { + my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_r"; + gen_struct($struct, $entry->{response}); + } + + if ($entry->{set} && @{$entry->{set}} > 0) { + my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_s"; + gen_struct($struct, $entry->{set}); + } + + if ($entry->{notification} && @{$entry->{notification}} > 0) { + my $struct = "mbim_" . $entry->{service} . "_" . $entry->{name} . "_n"; + gen_struct($struct, $entry->{notification}); + } +} + +sub gen_foreach_command($) +{ + my $data = shift; + + foreach my $entry (@$data) { + my $args = []; + my $fields = []; + + if ($entry->{type} eq 'Command') { + gen_foreach_struct($entry); + } + if ($entry->{type} eq 'Struct') { + gen_foreach_struct($entry); + } + } +} + +gen_foreach_command($data); |