aboutsummaryrefslogtreecommitdiff
path: root/docs/reference.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference.rst')
-rw-r--r--docs/reference.rst175
1 files changed, 75 insertions, 100 deletions
diff --git a/docs/reference.rst b/docs/reference.rst
index 40a69ad..ccbf0a4 100644
--- a/docs/reference.rst
+++ b/docs/reference.rst
@@ -20,9 +20,10 @@ You must have the same settings for the nanopb library and all code that
includes pb.h.
============================ ================================================
-PB_NO_PACKED_STRUCTS Disable packed structs. Increases RAM usage but
- is necessary on some platforms that do not
- support unaligned memory access.
+__BIG_ENDIAN__ Set this if your platform stores integers and
+ floats in big-endian format. Mixed-endian
+ systems (different layout for ints and floats)
+ are currently not supported.
PB_ENABLE_MALLOC Set this to enable dynamic allocation support
in the decoder.
PB_MAX_REQUIRED_FIELDS Maximum number of required fields to check for
@@ -53,8 +54,6 @@ PB_SYSTEM_HEADER Replace the standard header files with a single
functions and typedefs listed on the
`overview page`_. Value must include quotes,
for example *#define PB_SYSTEM_HEADER "foo.h"*.
-PB_WITHOUT_64BIT Disable 64-bit support, for old compilers or
- for a slight speedup on 8-bit platforms.
============================ ================================================
The PB_MAX_REQUIRED_FIELDS, PB_FIELD_16BIT and PB_FIELD_32BIT settings allow
@@ -74,31 +73,18 @@ The generator behaviour can be adjusted using these options, defined in the
max_size Allocated size for *bytes* and *string* fields.
max_count Allocated number of entries in arrays
(*repeated* fields).
-int_size Override the integer type of a field.
- (To use e.g. uint8_t to save RAM.)
type Type of the generated field. Default value
is *FT_DEFAULT*, which selects automatically.
You can use *FT_CALLBACK*, *FT_POINTER*,
- *FT_STATIC* or *FT_IGNORE* to
- force a callback field, a dynamically
- allocated field, a static field or to
- completely ignore the field.
+ *FT_STATIC* or *FT_IGNORE* to force a callback
+ field, a dynamically allocated field, a static
+ field or to completely ignore the field.
long_names Prefix the enum name to the enum value in
definitions, i.e. *EnumName_EnumValue*. Enabled
by default.
packed_struct Make the generated structures packed.
NOTE: This cannot be used on CPUs that break
on unaligned accesses to variables.
-skip_message Skip the whole message from generation.
-no_unions Generate 'oneof' fields as optional fields
- instead of C unions.
-msgid Specifies a unique id for this message type.
- Can be used by user code as an identifier.
-anonymous_oneof Generate 'oneof' fields as anonymous unions.
-fixed_length Generate 'bytes' fields with constant length
- (max_size must also be defined).
-fixed_count Generate arrays with constant length
- (max_count must also be defined).
============================ ================================================
These options can be defined for the .proto files before they are converted
@@ -157,20 +143,8 @@ options from it. The file format is as follows:
it makes sense to define wildcard options first in the file and more specific
ones later.
-To debug problems in applying the options, you can use the *-v* option for the
-plugin. Plugin options are specified in front of the output path:
-
- protoc ... --nanopb_out=-v:. message.proto
-
-Protoc doesn't currently pass include path into plugins. Therefore if your
-*.proto* is in a subdirectory, nanopb may have trouble finding the associated
-*.options* file. A workaround is to specify include path separately to the
-nanopb plugin, like:
-
- protoc -Isubdir --nanopb_out=-Isubdir:. message.proto
-
-If preferred, the name of the options file can be set using plugin argument
-*-f*.
+If preferred, the name of the options file can be set using the command line
+switch *-f* to nanopb_generator.py.
Defining the options on command line
------------------------------------
@@ -196,7 +170,7 @@ nanopb.proto can be found. This file, in turn, requires the file
*/usr/include*. Therefore, to compile a .proto file which uses options, use a
protoc command similar to::
- protoc -I/usr/include -Inanopb/generator -I. --nanopb_out=. message.proto
+ protoc -I/usr/include -Inanopb/generator -I. -omessage.pb message.proto
The options can be defined in file, message and field scopes::
@@ -208,40 +182,35 @@ The options can be defined in file, message and field scopes::
}
-pb.h
-====
-pb_byte_t
----------
-Type used for storing byte-sized data, such as raw binary input and bytes-type fields. ::
- typedef uint_least8_t pb_byte_t;
-For most platforms this is equivalent to `uint8_t`. Some platforms however do not support
-8-bit variables, and on those platforms 16 or 32 bits need to be used for each byte.
+
+
+
+
+pb.h
+====
pb_type_t
---------
-Type used to store the type of each field, to control the encoder/decoder behaviour. ::
+Defines the encoder/decoder behaviour that should be used for a field. ::
- typedef uint_least8_t pb_type_t;
+ typedef uint8_t pb_type_t;
The low-order nibble of the enumeration values defines the function that can be used for encoding and decoding the field data:
-=========================== ===== ================================================
-LTYPE identifier Value Storage format
-=========================== ===== ================================================
-PB_LTYPE_VARINT 0x00 Integer.
-PB_LTYPE_UVARINT 0x01 Unsigned integer.
-PB_LTYPE_SVARINT 0x02 Integer, zigzag encoded.
-PB_LTYPE_FIXED32 0x03 32-bit integer or floating point.
-PB_LTYPE_FIXED64 0x04 64-bit integer or floating point.
-PB_LTYPE_BYTES 0x05 Structure with *size_t* field and byte array.
-PB_LTYPE_STRING 0x06 Null-terminated string.
-PB_LTYPE_SUBMESSAGE 0x07 Submessage structure.
-PB_LTYPE_EXTENSION 0x08 Point to *pb_extension_t*.
-PB_LTYPE_FIXED_LENGTH_BYTES 0x09 Inline *pb_byte_t* array of fixed size.
-=========================== ===== ================================================
+==================== ===== ================================================
+LTYPE identifier Value Storage format
+==================== ===== ================================================
+PB_LTYPE_VARINT 0x00 Integer.
+PB_LTYPE_SVARINT 0x01 Integer, zigzag encoded.
+PB_LTYPE_FIXED32 0x02 32-bit integer or floating point.
+PB_LTYPE_FIXED64 0x03 64-bit integer or floating point.
+PB_LTYPE_BYTES 0x04 Structure with *size_t* field and byte array.
+PB_LTYPE_STRING 0x05 Null-terminated string.
+PB_LTYPE_SUBMESSAGE 0x06 Submessage structure.
+==================== ===== ================================================
The bits 4-5 define whether the field is required, optional or repeated:
@@ -273,14 +242,14 @@ pb_field_t
----------
Describes a single structure field with memory position in relation to others. The descriptions are usually autogenerated. ::
- typedef struct pb_field_s pb_field_t;
- struct pb_field_s {
- pb_size_t tag;
+ typedef struct _pb_field_t pb_field_t;
+ struct _pb_field_t {
+ uint8_t tag;
pb_type_t type;
- pb_size_t data_offset;
- pb_ssize_t size_offset;
- pb_size_t data_size;
- pb_size_t array_size;
+ uint8_t data_offset;
+ int8_t size_offset;
+ uint8_t data_size;
+ uint8_t array_size;
const void *ptr;
} pb_packed;
@@ -299,8 +268,8 @@ pb_bytes_array_t
An byte array with a field for storing the length::
typedef struct {
- pb_size_t size;
- pb_byte_t bytes[1];
+ size_t size;
+ uint8_t bytes[1];
} pb_bytes_array_t;
In an actual array, the length of *bytes* may be different.
@@ -364,14 +333,12 @@ Ties together the extension field type and the storage for the field value::
const pb_extension_type_t *type;
void *dest;
pb_extension_t *next;
- bool found;
} pb_extension_t;
:type: Pointer to the structure that defines the callback functions.
:dest: Pointer to the variable that stores the field value
(as used by the default extension callback functions.)
:next: Pointer to the next extension handler, or *NULL*.
-:found: Decoder sets this to true if the extension was found.
PB_GET_ERROR
------------
@@ -415,7 +382,7 @@ pb_ostream_from_buffer
----------------------
Constructs an output stream for writing into a memory buffer. This is just a helper function, it doesn't do anything you couldn't do yourself in a callback function. It uses an internal callback that stores the pointer in stream *state* field. ::
- pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize);
+ pb_ostream_t pb_ostream_from_buffer(uint8_t *buf, size_t bufsize);
:buf: Memory buffer to write into.
:bufsize: Maximum number of bytes to write.
@@ -427,7 +394,7 @@ pb_write
--------
Writes data to an output stream. Always use this function, instead of trying to call stream callback manually. ::
- bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
+ bool pb_write(pb_ostream_t *stream, const uint8_t *buf, size_t count);
:stream: Output stream to write to.
:buf: Pointer to buffer with the data to be written.
@@ -468,22 +435,11 @@ This function does this, and it is compatible with *parseDelimitedFrom* in Googl
Writing packed arrays is a little bit more involved: you need to use `pb_encode_tag` and specify `PB_WT_STRING` as the wire type. Then you need to know exactly how much data you are going to write, and use `pb_encode_varint`_ to write out the number of bytes before writing the actual data. Substreams can be used to determine the number of bytes beforehand; see `pb_encode_submessage`_ source code for an example.
-pb_get_encoded_size
--------------------
-Calculates the length of the encoded message. ::
-
- bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct);
-
-:size: Calculated size of the encoded message.
-:fields: A field description array, usually autogenerated.
-:src_struct: Pointer to the data that will be serialized.
-:returns: True on success, false on detectable errors in field description or if a field encoder returns false.
-
pb_encode_tag
-------------
Starts a field in the Protocol Buffers binary format: encodes the field number and the wire type of the data. ::
- bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number);
+ bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, int field_number);
:stream: Output stream to write to. 1-5 bytes will be written.
:wiretype: PB_WT_VARINT, PB_WT_64BIT, PB_WT_STRING or PB_WT_32BIT
@@ -504,14 +460,14 @@ This function only considers the LTYPE of the field. You can use it from your fi
Wire type mapping is as follows:
-============================================= ============
-LTYPEs Wire type
-============================================= ============
-VARINT, UVARINT, SVARINT PB_WT_VARINT
-FIXED64 PB_WT_64BIT
-STRING, BYTES, SUBMESSAGE, FIXED_LENGTH_BYTES PB_WT_STRING
-FIXED32 PB_WT_32BIT
-============================================= ============
+========================= ============
+LTYPEs Wire type
+========================= ============
+VARINT, SVARINT PB_WT_VARINT
+FIXED64 PB_WT_64BIT
+STRING, BYTES, SUBMESSAGE PB_WT_STRING
+FIXED32 PB_WT_32BIT
+========================= ============
pb_encode_varint
----------------
@@ -537,7 +493,7 @@ pb_encode_string
----------------
Writes the length of a string as varint and then contents of the string. Works for fields of type `bytes` and `string`::
- bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size);
+ bool pb_encode_string(pb_ostream_t *stream, const uint8_t *buffer, size_t size);
:stream: Output stream to write to.
:buffer: Pointer to string data.
@@ -597,7 +553,7 @@ pb_istream_from_buffer
----------------------
Helper function for creating an input stream that reads data from a memory buffer. ::
- pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize);
+ pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize);
:buf: Pointer to byte array to read from.
:bufsize: Size of the byte array.
@@ -607,7 +563,7 @@ pb_read
-------
Read data from input stream. Always use this function, don't try to call the stream callback directly. ::
- bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);
+ bool pb_read(pb_istream_t *stream, uint8_t *buf, size_t count);
:stream: Input stream to read from.
:buf: Buffer to store the data to, or NULL to just read data without storing it anywhere.
@@ -666,21 +622,39 @@ This function is compatible with *writeDelimitedTo* in the Google's Protocol Buf
pb_release
----------
-Releases any dynamically allocated fields::
+Releases any dynamically allocated fields.
void pb_release(const pb_field_t fields[], void *dest_struct);
:fields: A field description array. Usually autogenerated.
-:dest_struct: Pointer to structure where data is stored. If NULL, function does nothing.
+:dest_struct: Pointer to structure where data will be stored.
This function is only available if *PB_ENABLE_MALLOC* is defined. It will release any
pointer type fields in the structure and set the pointers to NULL.
+pb_skip_varint
+--------------
+Skip a varint_ encoded integer without decoding it. ::
+
+ bool pb_skip_varint(pb_istream_t *stream);
+
+:stream: Input stream to read from. Will read 1 byte at a time until the MSB is clear.
+:returns: True on success, false on IO error.
+
+pb_skip_string
+--------------
+Skip a varint-length-prefixed string. This means skipping a value with wire type PB_WT_STRING. ::
+
+ bool pb_skip_string(pb_istream_t *stream);
+
+:stream: Input stream to read from.
+:returns: True on success, false on IO error or length exceeding uint32_t.
+
pb_decode_tag
-------------
Decode the tag that comes before field in the protobuf encoding::
- bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof);
+ bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, int *tag, bool *eof);
:stream: Input stream to read from.
:wire_type: Pointer to variable where to store the wire type of the field.
@@ -747,9 +721,10 @@ pb_decode_fixed64
-----------------
Decode a *fixed64*, *sfixed64* or *double* value. ::
- bool pb_decode_fixed64(pb_istream_t *stream, void *dest);
+ bool pb_dec_fixed(pb_istream_t *stream, const pb_field_t *field, void *dest);
:stream: Input stream to read from. 8 bytes will be read.
+:field: Not used.
:dest: Pointer to destination *int64_t*, *uint64_t* or *double*.
:returns: True on success, false on IO errors.