Support dynamic allocation for string, bytes and message fields.
This is turned on by passing -p to nanopb_generator.py or setting the (nanopb).pointer option for a .proto field. git-svn-id: https://svn.kapsi.fi/jpa/nanopb-dev@1081 e3a754e5-d11d-0410-8d38-ebb782a927b9
This commit is contained in:
committed by
Petteri Aimonen
parent
8e5337e9ef
commit
c66c6b43c4
@@ -142,6 +142,7 @@ Most Protocol Buffers datatypes have directly corresponding C datatypes, such as
|
||||
1) Strings, bytes and repeated fields of any type map to callback functions by default.
|
||||
2) If there is a special option *(nanopb).max_size* specified in the .proto file, string maps to null-terminated char array and bytes map to a structure containing a char array and a size field.
|
||||
3) If there is a special option *(nanopb).max_count* specified on a repeated field, it maps to an array of whatever type is being repeated. Another field will be created for the actual number of entries stored.
|
||||
4) The option *(nanopb).pointer* can override the default (false, unless the *-p* option is passed to *nanopb_generator.py*) behavior. If a string, byte, or submessage is generated as a pointer field, and it is repeated (with a maximum count), required, or optional, the members will be pointers rather than in-line data.
|
||||
|
||||
=============================================================================== =======================
|
||||
field in .proto autogenerated in .h
|
||||
@@ -156,10 +157,19 @@ required bytes data = 1 [(nanopb).max_size = 40];
|
||||
| uint8_t bytes[40];
|
||||
| } Person_data_t;
|
||||
| Person_data_t data;
|
||||
required string name = 1 [(nanopb).pointer = true]; char \*name;
|
||||
required bytes data = 1 [(nanopb).pointer = true]; pb_bytes_t data;
|
||||
required bytes data = 1 [(nanopb).pointer = true, (nanopb).max_count = 5]; | size_t data_count;
|
||||
| pb_bytes_t data[5];
|
||||
required Message msg = 1 [(nanopb).pointer = true]; Message \*msg;
|
||||
=============================================================================== =======================
|
||||
|
||||
The maximum lengths are checked in runtime. If string/bytes/array exceeds the allocated length, *pb_decode* will return false.
|
||||
|
||||
If a pointer-type field is not received, the field will be marked as absent, but the pointer will not be modified. This helps reduce memory fragmentation and churn, but increases worst-case memory usage and means you must use the *Message_has(object, Field)* macro rather than testing for a null pointer. You can use the `pb_clean`_ function to release unused memory in these cases.
|
||||
|
||||
.. _`pb_clean`: reference.html#pb-clean
|
||||
|
||||
Field callbacks
|
||||
===============
|
||||
When a field has dynamic length, nanopb cannot statically allocate storage for it. Instead, it allows you to handle the field in whatever way you want, using a callback function.
|
||||
@@ -279,6 +289,8 @@ For convenience, *pb_encode* only checks these bits for optional
|
||||
fields. *pb_decode* sets the corresponding bit for every field it
|
||||
decodes, whether the field is optional or not.
|
||||
|
||||
.. Should there be a section here on pointer fields?
|
||||
|
||||
Return values and error handling
|
||||
================================
|
||||
|
||||
|
||||
Reference in New Issue
Block a user