[PATCH 1/3] uqmi: update code generator

Oskari Lemmela oskari at lemmela.net
Sun Oct 24 08:05:30 PDT 2021


Add support for common-refs and double arrays.
Fix error message line and type parsing.

Signed-off-by: Oskari Lemmela <oskari at lemmela.net>
---
 data/gen-code.pl       | 11 +++++++++--
 data/gen-common.pm     | 10 ++++++++++
 data/gen-error-list.pl |  2 +-
 data/gen-header.pl     |  5 ++++-
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/data/gen-code.pl b/data/gen-code.pl
index f45d28a..4d53471 100755
--- a/data/gen-code.pl
+++ b/data/gen-code.pl
@@ -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);
 	}
diff --git a/data/gen-common.pm b/data/gen-common.pm
index 6c3492f..e951776 100644
--- a/data/gen-common.pm
+++ b/data/gen-common.pm
@@ -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};
 
diff --git a/data/gen-error-list.pl b/data/gen-error-list.pl
index 770c162..40204da 100755
--- a/data/gen-error-list.pl
+++ b/data/gen-error-list.pl
@@ -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";
diff --git a/data/gen-header.pl b/data/gen-header.pl
index 818adf1..45edb85 100755
--- a/data/gen-header.pl
+++ b/data/gen-header.pl
@@ -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");
 
-- 
2.25.1




More information about the openwrt-devel mailing list