uqmi: update code generator
authorOskari Lemmela <oskari@lemmela.net>
Mon, 11 Oct 2021 19:14:32 +0000 (22:14 +0300)
committerDaniel Golle <daniel@makrotopia.org>
Sat, 6 Nov 2021 01:18:39 +0000 (01:18 +0000)
Add support for common-refs and double arrays.
Fix error message line and type parsing.

Signed-off-by: Oskari Lemmela <oskari@lemmela.net>
data/gen-code.pl
data/gen-common.pm
data/gen-error-list.pl
data/gen-header.pl

index f45d28a0538209055a20baa5eb142bdf76e296de..4d53471447ec8275d01d32d795af032a320c773a 100755 (executable)
@@ -75,10 +75,15 @@ sub gen_tlv_parse_field($$$$) {
                        $size = $tlv_get{$prefix};
                        die "Unknown size element type '$prefix'" if not defined $size;
 
+                       my $curvar = "$var\_n";
+                       if (rindex($var,"]") == length($var)-1) {
+                               $curvar = substr($var, 0, index($var, "["))."\_i";
+                               $data .= $indent."$curvar = 0;\n";
+                       }
                        ($var_data, $var_iterator) =
-                               gen_tlv_parse_field($var."[$var\_n]", $elem->{"array-element"}, $n_indent + 1, "i$iterator");
+                               gen_tlv_parse_field($var."[$curvar]", $elem->{"array-element"}, $n_indent + 1, "i$iterator");
 
-                       $var_data .= $indent."\t$var\_n++;\n";
+                       $var_data .= $indent."\t$curvar++;\n";
                        $data .= $indent."$iterator = $size;\n";
                        $data .= $indent."$var = __qmi_alloc_static($iterator * sizeof($var\[0]));\n";
                        $data .= $indent."while($iterator\-- > 0) {\n";
@@ -215,6 +220,7 @@ EOF
                switch(tlv->type) {
 EOF
                foreach my $field (@$data) {
+                       $field = gen_common_ref($field);
                        my $cname = gen_cname($field->{name});
                        gen_tlv_type($cname, $field, $i++);
                }
@@ -414,6 +420,7 @@ sub gen_set_func($$)
 
 EOF
        foreach my $field (@$fields) {
+               $field = gen_common_ref($field);
                my $cname = gen_cname($field->{name});
                gen_tlv_attr_set($cname, $field);
        }
index 6c3492f25a8c6a937fdcc5272e44cb2d3e3614d9..e951776e1ebb73f876a8fc30c85ad0e02baf47e2 100644 (file)
@@ -17,6 +17,7 @@ our %tlv_types = (
        gfloat => "float",
        gboolean => "bool",
 );
+our %common_ref = ();
 
 $prefix eq 'ctl_' and $ctl = 1;
 
@@ -38,6 +39,7 @@ sub gen_has_types($) {
        my $data = shift;
 
        foreach my $field (@$data) {
+               $field = gen_common_ref($field);
                my $type = $field->{"format"};
                $type and return 1;
        }
@@ -68,6 +70,12 @@ sub gen_tlv_parse_func($$) {
        }
 }
 
+sub gen_common_ref($$) {
+       my $field = shift;
+       $field = $common_ref{$field->{'common-ref'}} if $field->{'common-ref'} ne '';
+       return $field;
+}
+
 sub gen_foreach_message_type($$$)
 {
        my $data = shift;
@@ -78,6 +86,8 @@ sub gen_foreach_message_type($$$)
                my $args = [];
                my $fields = [];
 
+               $common_ref{$entry->{'common-ref'}} = $entry if $entry->{'common-ref'} ne '';
+
                next if $entry->{type} ne 'Message';
                next if not defined $entry->{input} and not defined $entry->{output};
 
index 770c162522b61aaaa67b0c883bd078b7aedb6aa1..40204da8481797e21c3a06423f4322628dfe5156 100755 (executable)
@@ -22,7 +22,7 @@ while ($line = <>) {
        };
        undef $doc_start;
 
-       $line =~ /^\s*\*\s*@(.+): (.+)\./ and push @errors, [ $1, $2 ];
+       $line =~ /^.*@([A-Z0-9_]+): ([A-z0-9 ]+)[.].*$/ and push @errors, [ $1, $2 ];
 }
 
 @errors > 0 or die "No data found\n";
index 818adf1d958a344491c11524d1c11e23f948a389..45edb85d52c41eb0354fe95b44df26e18472137c 100755 (executable)
@@ -35,7 +35,7 @@ sub gen_tlv_type($$$) {
        if ($tlv_types{$ptype}) {
                return $indent.$tlv_types{$ptype}." $cname;";
        } elsif ($tlv_types{$type}) {
-               return $indent."$ptype $cname;";
+               return $indent.$tlv_types{$type}." $cname;";
        } elsif ($type eq "string") {
                return $indent."char *$cname;", 1;
        } elsif ($type eq "array") {
@@ -45,12 +45,14 @@ sub gen_tlv_type($$$) {
                }
                my ($type, $no_set_field) = gen_tlv_type("*$cname", $elem->{"array-element"}, $indent);
                return undef if not defined $type;
+               return $indent."unsigned int ".substr($cname,1)."\_i;$type", 1 if (!rindex($cname,"*",0));
                return $indent."unsigned int $cname\_n;$type", 1;
        } elsif ($type eq "sequence" or $type eq "struct") {
                my $contents = $elem->{"contents"};
                my $data = "struct {";
 
                foreach my $field (@$contents) {
+                       $field = gen_common_ref($field);
                        my $_cname = gen_cname($field->{name});
                        my ($_data, $no_set_field) = gen_tlv_type($_cname, $field, "$indent\t");
                        $data .= $_data;
@@ -68,6 +70,7 @@ sub gen_tlv_struct($$) {
        my $_data = "";
 
        foreach my $field (@$data) {
+               $field = gen_common_ref($field);
                my $cname = gen_cname($field->{name});
                my ($data, $no_set_field) = gen_tlv_type($cname, $field, "\n\t\t");