Make fixed_count option work when combined with FT_POINTER.
Also added to AllTypes testcase.
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 9b37cd5..a4c48c2 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -475,7 +475,7 @@
if self.pbtype in ['MESSAGE', 'MSG_W_CB']:
# Use struct definition, so recursive submessages are possible
result += ' struct _%s *%s;' % (self.ctype, self.name)
- elif self.pbtype == 'FIXED_LENGTH_BYTES':
+ elif self.pbtype == 'FIXED_LENGTH_BYTES' or self.rules == 'FIXARRAY':
# Pointer to fixed size array
result += ' %s (*%s)%s;' % (self.ctype, self.name, self.array_decl)
elif self.rules in ['REPEATED', 'FIXARRAY'] and self.pbtype in ['STRING', 'BYTES']:
diff --git a/pb.h b/pb.h
index b0f895d..de0dd50 100644
--- a/pb.h
+++ b/pb.h
@@ -570,7 +570,7 @@
#define PB_SIZE_OFFSET_CB_FIXARRAY(structname, fieldname) 0
#define PB_ARRAY_SIZE_STATIC(htype, structname, fieldname) PB_ARRAY_SIZE_ ## htype(structname, fieldname)
-#define PB_ARRAY_SIZE_POINTER(htype, structname, fieldname) 1
+#define PB_ARRAY_SIZE_POINTER(htype, structname, fieldname) PB_ARRAY_SIZE_PTR_ ## htype(structname, fieldname)
#define PB_ARRAY_SIZE_CALLBACK(htype, structname, fieldname) 1
#define PB_ARRAY_SIZE_REQUIRED(structname, fieldname) 1
#define PB_ARRAY_SIZE_SINGULAR(structname, fieldname) 1
@@ -578,6 +578,12 @@
#define PB_ARRAY_SIZE_ONEOF(structname, fieldname) 1
#define PB_ARRAY_SIZE_REPEATED(structname, fieldname) pb_arraysize(structname, fieldname)
#define PB_ARRAY_SIZE_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname)
+#define PB_ARRAY_SIZE_PTR_REQUIRED(structname, fieldname) 1
+#define PB_ARRAY_SIZE_PTR_SINGULAR(structname, fieldname) 1
+#define PB_ARRAY_SIZE_PTR_OPTIONAL(structname, fieldname) 1
+#define PB_ARRAY_SIZE_PTR_ONEOF(structname, fieldname) 1
+#define PB_ARRAY_SIZE_PTR_REPEATED(structname, fieldname) 1
+#define PB_ARRAY_SIZE_PTR_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname[0])
#define PB_DATA_SIZE_STATIC(htype, structname, fieldname) PB_DATA_SIZE_ ## htype(structname, fieldname)
#define PB_DATA_SIZE_POINTER(htype, structname, fieldname) PB_DATA_SIZE_PTR_ ## htype(structname, fieldname)
@@ -593,7 +599,7 @@
#define PB_DATA_SIZE_PTR_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_PTR_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)[0])
#define PB_DATA_SIZE_PTR_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0])
-#define PB_DATA_SIZE_PTR_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0])
+#define PB_DATA_SIZE_PTR_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0][0])
#define PB_DATA_SIZE_CB_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_CB_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_CB_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname)
diff --git a/tests/alltypes/alltypes.options b/tests/alltypes/alltypes.options
index 0d5ab12..f8c805a 100644
--- a/tests/alltypes/alltypes.options
+++ b/tests/alltypes/alltypes.options
@@ -1,3 +1,4 @@
* max_size:16
* max_count:5
*.*fbytes fixed_length:true max_size:4
+*.*farray fixed_count:true max_count:5
diff --git a/tests/alltypes/alltypes.proto b/tests/alltypes/alltypes.proto
index 303ec63..c08af89 100644
--- a/tests/alltypes/alltypes.proto
+++ b/tests/alltypes/alltypes.proto
@@ -82,6 +82,7 @@
repeated MyEnum rep_enum = 37 [packed = true];
repeated EmptyMessage rep_emptymsg = 38;
repeated bytes rep_fbytes = 39;
+ repeated int32 rep_farray = 40 [packed = true];
optional int32 opt_int32 = 41 [default = 4041];
optional int64 opt_int64 = 42 [default = 4042];
diff --git a/tests/alltypes/decode_alltypes.c b/tests/alltypes/decode_alltypes.c
index 532694e..2d61c50 100644
--- a/tests/alltypes/decode_alltypes.c
+++ b/tests/alltypes/decode_alltypes.c
@@ -85,6 +85,8 @@
TEST(alltypes.rep_fbytes[0][0] == 0 && alltypes.rep_fbytes[0][3] == 0);
TEST(memcmp(alltypes.rep_fbytes[4], "2019", 4) == 0);
+ TEST(alltypes.rep_farray[0] == 0 && alltypes.rep_farray[4] == 2040);
+
TEST(alltypes.req_limits.int32_min == INT32_MIN);
TEST(alltypes.req_limits.int32_max == INT32_MAX);
TEST(alltypes.req_limits.uint32_min == 0);
@@ -246,6 +248,7 @@
TEST(alltypes.rep_enum_count == 0);
TEST(alltypes.rep_emptymsg_count == 0);
TEST(alltypes.rep_fbytes_count == 0);
+ TEST(alltypes.rep_farray[0] == 0 && alltypes.rep_farray[4] == 0);
TEST(alltypes.has_opt_int32 == false);
TEST(alltypes.has_opt_int64 == false);
diff --git a/tests/alltypes/encode_alltypes.c b/tests/alltypes/encode_alltypes.c
index c1c2aa3..fdf7edd 100644
--- a/tests/alltypes/encode_alltypes.c
+++ b/tests/alltypes/encode_alltypes.c
@@ -76,6 +76,8 @@
alltypes.rep_fbytes_count = 5;
memcpy(alltypes.rep_fbytes[4], "2019", 4);
+ alltypes.rep_farray[4] = 2040;
+
alltypes.req_limits.int32_min = INT32_MIN;
alltypes.req_limits.int32_max = INT32_MAX;
alltypes.req_limits.uint32_min = 0;
diff --git a/tests/alltypes_callback/alltypes.options b/tests/alltypes_callback/alltypes.options
index 74d7a9c..30accfe 100644
--- a/tests/alltypes_callback/alltypes.options
+++ b/tests/alltypes_callback/alltypes.options
@@ -5,4 +5,5 @@
# With FT_CALLBACK, these options should get ignored
*.*fbytes fixed_length:true max_size:4
+*.*farray fixed_count:true max_count:5
diff --git a/tests/alltypes_callback/encode_alltypes_callback.c b/tests/alltypes_callback/encode_alltypes_callback.c
index 5f75256..34e3cc6 100644
--- a/tests/alltypes_callback/encode_alltypes_callback.c
+++ b/tests/alltypes_callback/encode_alltypes_callback.c
@@ -360,6 +360,9 @@
alltypes.rep_fbytes.funcs.encode = &write_repeated_string;
alltypes.rep_fbytes.arg = "2019";
+ alltypes.rep_farray.funcs.encode = &write_repeated_varint;
+ alltypes.rep_farray.arg = (void*)2040;
+
alltypes.req_limits.funcs.encode = &write_limits;
/* Bind callbacks for optional fields */
diff --git a/tests/alltypes_pointer/alltypes.options b/tests/alltypes_pointer/alltypes.options
index 8699fe2..0c4f0d6 100644
--- a/tests/alltypes_pointer/alltypes.options
+++ b/tests/alltypes_pointer/alltypes.options
@@ -1,4 +1,5 @@
# Generate all fields as pointers.
* type:FT_POINTER
*.*fbytes fixed_length:true max_size:4
+*.*farray fixed_count:true max_count:5
diff --git a/tests/alltypes_pointer/decode_alltypes_pointer.c b/tests/alltypes_pointer/decode_alltypes_pointer.c
index 4ee6f8b..ad5b658 100644
--- a/tests/alltypes_pointer/decode_alltypes_pointer.c
+++ b/tests/alltypes_pointer/decode_alltypes_pointer.c
@@ -80,6 +80,7 @@
TEST(alltypes.rep_fbytes_count == 5);
TEST(alltypes.rep_fbytes[0][0] == 0 && alltypes.rep_fbytes[0][3] == 0);
TEST(memcmp(alltypes.rep_fbytes[4], "2019", 4) == 0);
+ TEST(alltypes.rep_farray && (*alltypes.rep_farray)[0] == 0 && (*alltypes.rep_farray)[4] == 2040);
if (mode == 0)
{
diff --git a/tests/alltypes_pointer/encode_alltypes_pointer.c b/tests/alltypes_pointer/encode_alltypes_pointer.c
index a39af6f..ca036d1 100644
--- a/tests/alltypes_pointer/encode_alltypes_pointer.c
+++ b/tests/alltypes_pointer/encode_alltypes_pointer.c
@@ -64,6 +64,7 @@
MyEnum rep_enum[5] = {0, 0, 0, 0, MyEnum_Truth};
EmptyMessage rep_emptymsg[5] = {{0}, {0}, {0}, {0}, {0}};
pb_byte_t rep_fbytes[5][4] = {{0}, {0}, {0}, {0}, {'2', '0', '1', '9'}};
+ int32_t rep_farray[5] = {0, 0, 0, 0, 2040};
/* Values for optional fields */
int32_t opt_int32 = 3041;
@@ -150,6 +151,7 @@
alltypes.rep_enum_count = 5; alltypes.rep_enum = rep_enum;
alltypes.rep_emptymsg_count = 5; alltypes.rep_emptymsg = rep_emptymsg;
alltypes.rep_fbytes_count = 5; alltypes.rep_fbytes = rep_fbytes;
+ alltypes.rep_farray = &rep_farray;
if (mode != 0)
{
diff --git a/tests/common_unittests/common_unittests.c b/tests/common_unittests/common_unittests.c
index 861cf9a..60c8a6b 100644
--- a/tests/common_unittests/common_unittests.c
+++ b/tests/common_unittests/common_unittests.c
@@ -60,6 +60,7 @@
TEST(pb_field_iter_next(&iter) && iter.tag == 37 && iter.pData == &msg.rep_enum && iter.pSize == &msg.rep_enum_count)
TEST(pb_field_iter_next(&iter) && iter.tag == 38 && iter.pData == &msg.rep_emptymsg && iter.pSize == &msg.rep_emptymsg_count)
TEST(pb_field_iter_next(&iter) && iter.tag == 39 && iter.pData == &msg.rep_fbytes && iter.pSize == &msg.rep_fbytes_count)
+ TEST(pb_field_iter_next(&iter) && iter.tag == 40 && iter.pData == &msg.rep_farray && iter.pSize == &iter.array_size && iter.array_size == 5)
TEST(iter.required_field_index == 19)
TEST(iter.submessage_index == 4)
diff --git a/tests/field_size_16/alltypes.options b/tests/field_size_16/alltypes.options
index 78dd08d..925475e 100644
--- a/tests/field_size_16/alltypes.options
+++ b/tests/field_size_16/alltypes.options
@@ -1,4 +1,5 @@
* max_size:16
* max_count:5
*.*fbytes fixed_length:true max_size:4
+*.*farray fixed_count:true max_count:5
diff --git a/tests/field_size_16/alltypes.proto b/tests/field_size_16/alltypes.proto
index 4e27059..0089b7c 100644
--- a/tests/field_size_16/alltypes.proto
+++ b/tests/field_size_16/alltypes.proto
@@ -81,6 +81,7 @@
repeated MyEnum rep_enum = 10037;
repeated EmptyMessage rep_emptymsg = 10038;
repeated bytes rep_fbytes = 10039;
+ repeated int32 rep_farray = 10040;
optional int32 opt_int32 = 10041 [default = 4041];
optional int64 opt_int64 = 10042 [default = 4042];
diff --git a/tests/field_size_32/alltypes.options b/tests/field_size_32/alltypes.options
index 0d5ab12..f8c805a 100644
--- a/tests/field_size_32/alltypes.options
+++ b/tests/field_size_32/alltypes.options
@@ -1,3 +1,4 @@
* max_size:16
* max_count:5
*.*fbytes fixed_length:true max_size:4
+*.*farray fixed_count:true max_count:5
diff --git a/tests/field_size_32/alltypes.proto b/tests/field_size_32/alltypes.proto
index a05e3b9..e2fd56a 100644
--- a/tests/field_size_32/alltypes.proto
+++ b/tests/field_size_32/alltypes.proto
@@ -81,6 +81,7 @@
repeated MyEnum rep_enum = 10037;
repeated EmptyMessage rep_emptymsg = 10038;
repeated bytes rep_fbytes = 10039;
+ repeated int32 rep_farray = 10040;
optional int32 opt_int32 = 10041 [default = 4041];
optional int64 opt_int64 = 10042 [default = 4042];