Add generator option for packed structs.
Usage is:
message Foo
{
option (nanopb_msgopt).packed_struct = true;
...
}
Valid also in file scope.
Update issue 49
Status: FixedInGit
This commit is contained in:
@@ -25,6 +25,9 @@ message NanoPBOptions {
|
|||||||
|
|
||||||
// Use long names for enums, i.e. EnumName_EnumValue.
|
// Use long names for enums, i.e. EnumName_EnumValue.
|
||||||
optional bool long_names = 4 [default = true];
|
optional bool long_names = 4 [default = true];
|
||||||
|
|
||||||
|
// Add 'packed' attribute to generated structs.
|
||||||
|
optional bool packed_struct = 5 [default = false];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Protocol Buffers extension number registry
|
// Protocol Buffers extension number registry
|
||||||
|
|||||||
@@ -307,6 +307,7 @@ class Message:
|
|||||||
def __init__(self, names, desc, message_options):
|
def __init__(self, names, desc, message_options):
|
||||||
self.name = names
|
self.name = names
|
||||||
self.fields = [Field(self.name, f, get_nanopb_suboptions(f, message_options)) for f in desc.field]
|
self.fields = [Field(self.name, f, get_nanopb_suboptions(f, message_options)) for f in desc.field]
|
||||||
|
self.packed = message_options.packed_struct
|
||||||
self.ordered_fields = self.fields[:]
|
self.ordered_fields = self.fields[:]
|
||||||
self.ordered_fields.sort()
|
self.ordered_fields.sort()
|
||||||
|
|
||||||
@@ -317,7 +318,12 @@ class Message:
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
result = 'typedef struct _%s {\n' % self.name
|
result = 'typedef struct _%s {\n' % self.name
|
||||||
result += '\n'.join([str(f) for f in self.ordered_fields])
|
result += '\n'.join([str(f) for f in self.ordered_fields])
|
||||||
result += '\n} %s;' % self.name
|
result += '\n}'
|
||||||
|
|
||||||
|
if self.packed:
|
||||||
|
result += ' pb_packed'
|
||||||
|
|
||||||
|
result += ' %s;' % self.name
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def types(self):
|
def types(self):
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import google.protobuf.descriptor_pb2
|
|||||||
DESCRIPTOR = descriptor.FileDescriptor(
|
DESCRIPTOR = descriptor.FileDescriptor(
|
||||||
name='nanopb.proto',
|
name='nanopb.proto',
|
||||||
package='',
|
package='',
|
||||||
serialized_pb='\n\x0cnanopb.proto\x1a google/protobuf/descriptor.proto\"t\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true*;\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\r\n\tFT_STATIC\x10\x02:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions')
|
serialized_pb='\n\x0cnanopb.proto\x1a google/protobuf/descriptor.proto\"\x92\x01\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse*;\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\r\n\tFT_STATIC\x10\x02:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions')
|
||||||
|
|
||||||
_FIELDTYPE = descriptor.EnumDescriptor(
|
_FIELDTYPE = descriptor.EnumDescriptor(
|
||||||
name='FieldType',
|
name='FieldType',
|
||||||
@@ -35,8 +35,8 @@ _FIELDTYPE = descriptor.EnumDescriptor(
|
|||||||
],
|
],
|
||||||
containing_type=None,
|
containing_type=None,
|
||||||
options=None,
|
options=None,
|
||||||
serialized_start=168,
|
serialized_start=199,
|
||||||
serialized_end=227,
|
serialized_end=258,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -113,6 +113,13 @@ _NANOPBOPTIONS = descriptor.Descriptor(
|
|||||||
message_type=None, enum_type=None, containing_type=None,
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
is_extension=False, extension_scope=None,
|
is_extension=False, extension_scope=None,
|
||||||
options=None),
|
options=None),
|
||||||
|
descriptor.FieldDescriptor(
|
||||||
|
name='packed_struct', full_name='NanoPBOptions.packed_struct', index=4,
|
||||||
|
number=5, type=8, cpp_type=7, label=1,
|
||||||
|
has_default_value=True, default_value=False,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
],
|
],
|
||||||
extensions=[
|
extensions=[
|
||||||
],
|
],
|
||||||
@@ -122,8 +129,8 @@ _NANOPBOPTIONS = descriptor.Descriptor(
|
|||||||
options=None,
|
options=None,
|
||||||
is_extendable=False,
|
is_extendable=False,
|
||||||
extension_ranges=[],
|
extension_ranges=[],
|
||||||
serialized_start=50,
|
serialized_start=51,
|
||||||
serialized_end=166,
|
serialized_end=197,
|
||||||
)
|
)
|
||||||
|
|
||||||
_NANOPBOPTIONS.fields_by_name['type'].enum_type = _FIELDTYPE
|
_NANOPBOPTIONS.fields_by_name['type'].enum_type = _FIELDTYPE
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ char fieldsize\[40\];
|
|||||||
pb_callback_t int32_callback;
|
pb_callback_t int32_callback;
|
||||||
\sEnumValue1 = 1
|
\sEnumValue1 = 1
|
||||||
Message5_EnumValue1
|
Message5_EnumValue1
|
||||||
|
} pb_packed my_packed_struct;
|
||||||
|
|||||||
@@ -54,3 +54,11 @@ message Message5
|
|||||||
}
|
}
|
||||||
required Enum2 field = 1 [default = EnumValue1];
|
required Enum2 field = 1 [default = EnumValue1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Packed structure
|
||||||
|
message my_packed_struct
|
||||||
|
{
|
||||||
|
option (nanopb_msgopt).packed_struct = true;
|
||||||
|
optional int32 myfield = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user