X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=data%2Fgen-code.pl;h=f45d28a0538209055a20baa5eb142bdf76e296de;hb=e9aa47200ea8c0907537483a7a7c5292b6238d6f;hp=71b738dffec615ab1aeacf8fe02d0408ec7e6bd5;hpb=b93aa72c4aa4fafe0d2a1e9773773122fba21618;p=project%2Fuqmi.git diff --git a/data/gen-code.pl b/data/gen-code.pl index 71b738d..f45d28a 100755 --- a/data/gen-code.pl +++ b/data/gen-code.pl @@ -19,6 +19,7 @@ my %tlv_get = ( guint32 => "le32_to_cpu(*(uint32_t *) get_next(4))", gint64 => "le64_to_cpu(*(uint64_t *) get_next(8))", guint64 => "le64_to_cpu(*(uint64_t *) get_next(8))", + gfloat => "({ uint32_t data = le32_to_cpu(*(uint32_t *) get_next(4)); float _val; memcpy(&_val, &data, sizeof(_val)); _val; })" ); my %tlv_get_be = ( @@ -83,7 +84,7 @@ sub gen_tlv_parse_field($$$$) { $data .= $indent."while($iterator\-- > 0) {\n"; } - $var_iterator and $data .= $indent."\tint i$iterator;\n"; + $var_iterator and $data .= $indent."\tunsigned int i$iterator;\n"; $data .= $var_data; $data .= $indent."}\n"; @@ -132,9 +133,12 @@ sub gen_tlv_parse_field($$$$) { } } -sub gen_tlv_type($$) { +sub gen_tlv_type($$$) { my $cname = shift; my $elem = shift; + my $idx = shift; + my $idx_word = "found[".int($idx / 32)."]"; + my $idx_bit = "(1 << ".($idx % 32).")"; my $type = $elem->{"format"}; my $id = $elem->{"id"}; @@ -146,6 +150,10 @@ sub gen_tlv_type($$) { print <$type.tlv; - int tlv_len = le16_to_cpu(msg->$type.tlv_len); + unsigned int tlv_len = le16_to_cpu(msg->$type.tlv_len); EOF if (gen_has_types($data)) { + my $n_bits = scalar @$data; + my $n_words = int(($n_bits + 31) / 32); + my $i = 0; + print <{name}); - gen_tlv_type($cname, $field); + gen_tlv_type($cname, $field, $i++); } print <{"array-element"}, "$indent\t", "i$iterator", undef); - $var_iterator and $data .= $indent."\tint i$iterator;\n"; + $var_iterator and $data .= $indent."\tunsigned int i$iterator;\n"; $data .= $var_data; $data .= $indent."}\n"; @@ -364,12 +377,12 @@ sub gen_tlv_attr_set($$) my $cond = "req->set.$cname"; my ($var_data, $use_iterator) = gen_tlv_val_set("req->data.$cname", $elem, "\t\t", "i", \$cond); - $use_iterator and $iterator = "\t\tint i;\n"; + $use_iterator and $iterator = "\t\tunsigned int i;\n"; $data = <data[ofs]; ofs += _size; if (ofs > cur_tlv_len) goto error_len; _buf; }) #define copy_tlv(_val, _size) \\ do { \\ - int __size = _size; \\ + unsigned int __size = _size; \\ if (__size > 0) \\ memcpy(__qmi_alloc_static(__size), _val, __size); \\ } while (0);