=====================
Nanopb: API reference
=====================

.. include :: menu.rst

.. contents ::


Compilation options
===================
The following options can be specified in one of two ways:

1. Using the -D switch on the C compiler command line.
2. By #defining them at the top of pb.h.

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.
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
                               presence. Default value is 64. Increases stack
                               usage 1 byte per every 8 fields. Compiler
                               warning will tell if you need this.
PB_FIELD_32BIT                 Add support for tag numbers > 65535 and fields
                               larger than 65535 bytes or 65535 array entries.
                               Increases code size 9 bytes per each field.
                               Compiler error will tell if you need this.
PB_NO_ERRMSG                   Disables the support for error messages; only
                               error information is the true/false return
                               value. Decreases the code size by a few hundred
                               bytes.
PB_BUFFER_ONLY                 Disables the support for custom streams. Only
                               supports encoding and decoding with memory
                               buffers. Speeds up execution and decreases code
                               size slightly.
PB_SYSTEM_HEADER               Replace the standard header files with a single
                               header file. It should define all the required
                               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.
PB_ENCODE_ARRAYS_UNPACKED      Don't encode scalar arrays as packed.
                               This is only to be used when the decoder on the
                               receiving side cannot process packed scalar
                               arrays. Such example is older protobuf.js.
PB_CONVERT_DOUBLE_FLOAT        Convert doubles to floats for platforms that do
                               not support 64-bit doubles. Mainly AVR.
PB_VALIDATE_UTF8               Check whether incoming strings are valid UTF-8
                               sequences. Slows down the string processing
                               slightly and slightly increases code size.
============================  ================================================

The PB_MAX_REQUIRED_FIELDS and PB_FIELD_32BIT settings allow
raising some datatype limits to suit larger messages. Their need is recognized
automatically by C-preprocessor #if-directives in the generated `.pb.c` files.
The default setting is to use the smallest datatypes (least resources used).

.. _`overview page`: index.html#compiler-requirements


Proto file options
==================
The generator behaviour can be adjusted using several options, defined in the
`nanopb.proto`_ file in the generator folder. Here is a list of the most common
options, but see the file for a full list:

.. _`nanopb.proto`: https://github.com/nanopb/nanopb/blob/master/generator/proto/nanopb.proto

============================  ================================================
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.
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
using the nanopb-generatory.py. There are three ways to define the options:

1. Using a separate .options file. This allows using wildcards for applying
   same options to multiple fields.
2. Defining the options on the command line of nanopb_generator.py.
   This only makes sense for settings that apply to a whole file.
3. Defining the options in the .proto file using the nanopb extensions.
   This keeps the options close to the fields they apply to, but can be
   problematic if the same .proto file is shared with many projects.

The effect of the options is the same no matter how they are given. The most
common purpose is to define maximum size for string fields in order to
statically allocate them.

Defining the options in a .options file
---------------------------------------
The preferred way to define options is to have a separate file
'myproto.options' in the same directory as the 'myproto.proto'. ::

    # myproto.proto
    message MyMessage {
        required string name = 1;
        repeated int32 ids = 4;
    }

::

    # myproto.options
    MyMessage.name         max_size:40
    MyMessage.ids          max_count:5

The generator will automatically search for this file and read the
options from it. The file format is as follows:

* Lines starting with '#' or '//' are regarded as comments.
* Blank lines are ignored.
* All other lines should start with a field name pattern, followed by one or
  more options. For example: *"MyMessage.myfield max_size:5 max_count:10"*.
* The field name pattern is matched against a string of form *'Message.field'*.
  For nested messages, the string is *'Message.SubMessage.field'*.
* The field name pattern may use the notation recognized by Python fnmatch():

  - *\** matches any part of string, like 'Message.\*' for all fields
  - *\?* matches any single character
  - *[seq]* matches any of characters 's', 'e' and 'q'
  - *[!seq]* matches any other character

* The options are written as *'option_name:option_value'* and several options
  can be defined on same line, separated by whitespace.
* Options defined later in the file override the ones specified earlier, so
  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
nanopb generator. With protoc, plugin options are specified in front of the output path:

    nanopb_generator -v message.proto           # When invoked directly
    protoc ... --nanopb_out=-v:. message.proto  # When invoked through protoc

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*.

Defining the options on command line
------------------------------------
The nanopb_generator.py has a simple command line option *-s OPTION:VALUE*.
The setting applies to the whole file that is being processed.

Defining the options in the .proto file
---------------------------------------
The .proto file format allows defining custom options for the fields.
The nanopb library comes with *nanopb.proto* which does exactly that, allowing
you do define the options directly in the .proto file::

    import "nanopb.proto";
    
    message MyMessage {
        required string name = 1 [(nanopb).max_size = 40];
        repeated int32 ids = 4   [(nanopb).max_count = 5];
    }

A small complication is that you have to set the include path of protoc so that
nanopb.proto can be found. Therefore, to compile a .proto file which uses options, use a
protoc command similar to::

    protoc -Inanopb/generator/proto -I. --nanopb_out=. message.proto

The options can be defined in file, message and field scopes::

    option (nanopb_fileopt).max_size = 20; // File scope
    message Message
    {
        option (nanopb_msgopt).max_size = 30; // Message scope
        required string fieldsize = 1 [(nanopb).max_size = 40]; // Field scope
    }


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_size_t
---------
Type used for storing tag numbers and sizes of message fields. By default the type is 16-bit::

    typedef uint_least16_t pb_size_t;

If tag numbers or fields larger than 65535 are needed, `PB_FIELD_32BIT` option
can be used to change the type to 32-bit value.

pb_type_t
---------
Type used to store the type of each field, to control the encoder/decoder behaviour. ::

    typedef uint_least8_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_BOOL               0x00  Boolean.
PB_LTYPE_VARINT             0x01  Integer.
PB_LTYPE_UVARINT            0x02  Unsigned integer.
PB_LTYPE_SVARINT            0x03  Integer, zigzag encoded.
PB_LTYPE_FIXED32            0x04  32-bit integer or floating point.
PB_LTYPE_FIXED64            0x05  64-bit integer or floating point.
PB_LTYPE_BYTES              0x06  Structure with *size_t* field and byte array.
PB_LTYPE_STRING             0x07  Null-terminated string.
PB_LTYPE_SUBMESSAGE         0x08  Submessage structure.
PB_LTYPE_SUBMSG_W_CB        0x09  Submessage with pre-decoding callback.
PB_LTYPE_EXTENSION          0x0A  Point to *pb_extension_t*.
PB_LTYPE_FIXED_LENGTH_BYTES 0x0B  Inline *pb_byte_t* array of fixed size.
=========================== ===== ================================================

The bits 4-5 define whether the field is required, optional or repeated.
There are separate definitions for semantically different modes, even though
some of them share values and are distinguished based on values of other fields:

==================== ===== ================================================
HTYPE identifier     Value Field handling
==================== ===== ================================================
PB_HTYPE_REQUIRED    0x00  Verify that field exists in decoded message.
PB_HTYPE_OPTIONAL    0x10  Use separate *has_<field>* boolean to specify
                           whether the field is present.
PB_HTYPE_SINGULAR    0x10  Proto3 field, which is present when its value is
                           non-zero.
PB_HTYPE_REPEATED    0x20  A repeated field with preallocated array.
                           Separate *<field>_count* for number of items.
PB_HTYPE_FIXARRAY    0x20  A repeated field that has constant length.
PB_HTYPE_ONEOF       0x30  Oneof-field, only one of each group can be present.
==================== ===== ================================================

The bits 6-7 define the how the storage for the field is allocated:

==================== ===== ================================================
ATYPE identifier     Value Allocation method
==================== ===== ================================================
PB_ATYPE_STATIC      0x00  Statically allocated storage in the structure.
PB_ATYPE_POINTER     0x80  Dynamically allocated storage. Struct field contains
                           a pointer to the storage.
PB_ATYPE_CALLBACK    0x40  A field with dynamic storage size. Struct field
                           contains a pointer to a callback function.
==================== ===== ================================================


pb_msgdesc_t
------------
Autogenerated structure that contains information about a message and pointers
to the field descriptors. Use functions defined in `pb_common.h` to process
the field information::

    typedef struct pb_msgdesc_s pb_msgdesc_t;
    struct pb_msgdesc_s {
        pb_size_t field_count;
        const uint32_t *field_info;
        const pb_msgdesc_t * const * submsg_info;
        const pb_byte_t *default_value;

        bool (*field_callback)(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_iter_t *field);
    };

:field_count:    Total number of fields in the message.
:field_info:     Pointer to compact representation of the field information.
:submsg_info:    Pointer to array of pointers to descriptors for submessages.
:default_value:  Default values for this message as an encoded protobuf message.
:field_callback: Function used to handle all callback fields in this message.
                 By default `pb_default_field_callback()` loads per-field
                 callbacks from a `pb_callback_t` structure.


pb_field_iter_t
---------------
Describes a single structure field with memory position in relation to others.
The field information is stored in a compact format and loaded into `pb_field_iter_t`
by the functions defined in `pb_common.h`. ::

    typedef struct pb_field_iter_s pb_field_iter_t;
    struct pb_field_iter_s {
        const pb_msgdesc_t *descriptor;
        void *message;

        pb_size_t index;
        pb_size_t field_info_index;
        pb_size_t required_field_index;
        pb_size_t submessage_index;

        pb_size_t tag;
        pb_size_t data_size;
        pb_size_t array_size;
        pb_type_t type;

        void *pField;
        void *pData;
        void *pSize;

        const pb_msgdesc_t *submsg_desc;
    };

:descriptor:              Pointer to `pb_msgdesc_t` for the message that contains this field.
:message:                 Pointer to the start of the message structure.
:index:                   Index of the field inside the message
:field_info_index:        Index to the internal `field_info` array
:required_field_index:    Index that counts only the required fields
:submessage_index:        Index that counts only submessages
:tag:                     Tag number defined in `.proto` file for this field.
:data_size:               `sizeof()` of the field in the structure. For repeated fields this is for a single array entry.
:array_size:              Maximum number of items in a statically allocated array.
:type:                    Type (`pb_type_t`_) of the field.
:pField:                  Pointer to the field storage in the structure.
:pData:                   Pointer to data contents. For arrays and pointers this can be different than `pField`.
:pSize:                   Pointer to count or has field, or NULL if this field doesn't have such.
:submsg_desc:             For submessage fields, points to the descriptor for the submessage.

By default `pb_size_t`_ is 16-bit, limiting the sizes and tags to 65535. The limit
can be raised by defining `PB_FIELD_32BIT`.

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];
    } pb_bytes_array_t;

In an actual array, the length of *bytes* may be different. The macros
`PB_BYTES_ARRAY_T()` and `PB_BYTES_ARRAY_T_ALLOCSIZE()` are used to allocate
variable length storage for bytes fields.

pb_callback_t
-------------
Part of a message structure, for fields with type PB_HTYPE_CALLBACK::

    typedef struct _pb_callback_t pb_callback_t;
    struct _pb_callback_t {
        union {
            bool (*decode)(pb_istream_t *stream, const pb_field_iter_t *field, void **arg);
            bool (*encode)(pb_ostream_t *stream, const pb_field_iter_t *field, void * const *arg);
        } funcs;
        
        void *arg;
    };

A pointer to the *arg* is passed to the callback when calling.
It can be used to store any information that the callback might need.
Note that this is a double pointer. If you set `field.arg` to point to `&data` in your
main code, in the callback you can access it like this::

    myfunction(*arg);           /* Gives pointer to data as argument */
    myfunction(*(data_t*)*arg); /* Gives value of data as argument */
    *arg = newdata;             /* Alters value of field.arg in structure */

When calling `pb_encode`_, *funcs.encode* is used, and similarly when calling
`pb_decode`_, *funcs.decode* is used. The function pointers are stored in the
same memory location but are of incompatible types.
You can set the function pointer to NULL to skip the field.

pb_wire_type_t
--------------
Protocol Buffers wire types. These are used with `pb_encode_tag`_. ::

    typedef enum {
        PB_WT_VARINT = 0,
        PB_WT_64BIT  = 1,
        PB_WT_STRING = 2,
        PB_WT_32BIT  = 5
    } pb_wire_type_t;

pb_extension_type_t
-------------------
Defines the handler functions and auxiliary data for a field that extends
another message. Usually autogenerated by *nanopb_generator.py*::

    typedef struct {
        bool (*decode)(pb_istream_t *stream, pb_extension_t *extension,
                   uint32_t tag, pb_wire_type_t wire_type);
        bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension);
        const void *arg;
    } pb_extension_type_t;

In the normal case, the function pointers are *NULL* and the decoder and
encoder use their internal implementations. The internal implementations
assume that *arg* points to a `pb_field_iter_t`_ that describes the field in question.

To implement custom processing of unknown fields, you can provide pointers
to your own functions. Their functionality is mostly the same as for normal
callback fields, except that they get called for any unknown field when decoding.

pb_extension_t
--------------
Ties together the extension field type and the storage for the field value::

    typedef struct {
        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
------------
Get the current error message from a stream, or a placeholder string if
there is no error message::

    #define PB_GET_ERROR(stream) (string expression)

This should be used for printing errors, for example::

    if (!pb_decode(...))
    {
        printf("Decode failed: %s\n", PB_GET_ERROR(stream));
    }

The macro only returns pointers to constant strings (in code memory),
so that there is no need to release the returned pointer.

PB_RETURN_ERROR
---------------
Set the error message and return false::

    #define PB_RETURN_ERROR(stream,msg) (sets error and returns false)

This should be used to handle error conditions inside nanopb functions
and user callback functions::

    if (error_condition)
    {
        PB_RETURN_ERROR(stream, "something went wrong");
    }

The *msg* parameter must be a constant string.

PB_BIND
-------
This macro generates the `pb_msgdesc_t`_ and associated arrays, based on a list
of fields in `X-macro`_ format. ::

    #define PB_BIND(msgname, structname, width) ...

:msgname:    Name of the message type. Expects `msgname_FIELDLIST` macro to exist.
:structname: Name of the C structure to bind to.
:width:      Number of words per field descriptor, or `AUTO` to use minimum size possible.

This macro is automatically invoked inside the autogenerated `.pb.c` files.
User code can also call it to bind message types with custom structures or class types.

.. _`X-macro`: https://en.wikipedia.org/wiki/X_Macro


pb_encode.h
===========

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);

:buf:           Memory buffer to write into.
:bufsize:       Maximum number of bytes to write.
:returns:       An output stream.

After writing, you can check *stream.bytes_written* to find out how much valid data there is in the buffer.

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);

:stream:        Output stream to write to.
:buf:           Pointer to buffer with the data to be written.
:count:         Number of bytes to write.
:returns:       True on success, false if maximum length is exceeded or an IO error happens.

If an error happens, *bytes_written* is not incremented. Depending on the callback used, calling pb_write again after it has failed once may be dangerous. Nanopb itself never does this, instead it returns the error to user application. The builtin pb_ostream_from_buffer is safe to call again after failed write.

pb_encode
---------
Encodes the contents of a structure as a protocol buffers message and writes it to output stream. ::

    bool pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct);

:stream:        Output stream to write to.
:fields:        Message descriptor, usually autogenerated.
:src_struct:    Pointer to the data that will be serialized.
:returns:       True on success, false on IO error, on detectable errors in field description, or if a field encoder returns false.

Normally pb_encode simply walks through the fields description array and serializes each field in turn. However, submessages must be serialized twice: first to calculate their size and then to actually write them to output. This causes some constraints for callback fields, which must return the same data on every call.

pb_encode_ex
-------------------
Encodes the message, with several extended options::

    bool pb_encode_ex(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct, unsigned int flags);

:stream:        Output stream to write to.
:fields:        Message descriptor, usually autogenerated.
:src_struct:    Pointer to the data that will be serialized.
:flags:         Extended options, see below.
:returns:       True on success, false on IO error, on detectable errors in field description, or if a field encoder returns false.

The options that can be defined are:

:PB_ENCODE_DELIMITED:      Indicate the length of the message by prefixing with a varint-encoded length. Compatible with *parseDelimitedFrom* in Google's protobuf library.
:PB_ENCODE_NULLTERMINATED: Indicate the length of the message by appending a zero tag value after it. Supported by nanopb decoder, but not by most other protobuf libraries.

pb_get_encoded_size
-------------------
Calculates the length of the encoded message. ::

    bool pb_get_encoded_size(size_t *size, const pb_msgdesc_t *fields, const void *src_struct);

:size:          Calculated size of the encoded message.
:fields:        Message descriptor, 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.

.. sidebar:: Encoding fields manually

    The functions with names *pb_encode_\** are used when dealing with callback fields. The typical reason for using callbacks is to have an array of unlimited size. In that case, `pb_encode`_ will call your callback function, which in turn will call *pb_encode_\** functions repeatedly to write out values.

    The tag of a field must be encoded separately with `pb_encode_tag_for_field`_. After that, you can call exactly one of the content-writing functions to encode the payload of the field. For repeated fields, you can repeat this process multiple times.

    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_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);

: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
:field_number:  Identifier for the field, defined in the .proto file. You can get it from field->tag.
:returns:       True on success, false on IO error.

pb_encode_tag_for_field
-----------------------
Same as `pb_encode_tag`_, except takes the parameters from a *pb_field_iter_t* structure. ::

    bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_iter_t *field);

:stream:        Output stream to write to. 1-5 bytes will be written.
:field:         Field iterator for this field.
:returns:       True on success, false on IO error or unknown field type.

This function only considers the LTYPE of the field. You can use it from your field callbacks, because the source generator writes correct LTYPE also for callback type fields.

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
============================================= ============

pb_encode_varint
----------------
Encodes a signed or unsigned integer in the varint_ format. Works for fields of type `bool`, `enum`, `int32`, `int64`, `uint32` and `uint64`::

    bool pb_encode_varint(pb_ostream_t *stream, uint64_t value);

:stream:        Output stream to write to. 1-10 bytes will be written.
:value:         Value to encode. Just cast e.g. int32_t directly to uint64_t.
:returns:       True on success, false on IO error.

.. _varint: http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints

pb_encode_svarint
-----------------
Encodes a signed integer in the 'zig-zagged' format. Works for fields of type `sint32` and `sint64`::

    bool pb_encode_svarint(pb_ostream_t *stream, int64_t value);

(parameters are the same as for `pb_encode_varint`_

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);

:stream:        Output stream to write to.
:buffer:        Pointer to string data.
:size:          Number of bytes in the string. Pass `strlen(s)` for strings.
:returns:       True on success, false on IO error.

pb_encode_fixed32
-----------------
Writes 4 bytes to stream and swaps bytes on big-endian architectures. Works for fields of type `fixed32`, `sfixed32` and `float`::

    bool pb_encode_fixed32(pb_ostream_t *stream, const void *value);

:stream:    Output stream to write to.
:value:     Pointer to a 4-bytes large C variable, for example `uint32_t foo;`.
:returns:   True on success, false on IO error.

pb_encode_fixed64
-----------------
Writes 8 bytes to stream and swaps bytes on big-endian architecture. Works for fields of type `fixed64`, `sfixed64` and `double`::

    bool pb_encode_fixed64(pb_ostream_t *stream, const void *value);

:stream:    Output stream to write to.
:value:     Pointer to a 8-bytes large C variable, for example `uint64_t foo;`.
:returns:   True on success, false on IO error.

pb_encode_float_as_double
-------------------------
Encodes a 32-bit `float` value so that it appears like a 64-bit `double` in the
encoded message. This is sometimes needed when platforms like AVR that do not
support need to communicate using a message type that contains `double` fields. ::

    bool pb_encode_float_as_double(pb_ostream_t *stream, float value);

:stream:    Output stream to write to.
:value:     Float value to encode.
:returns:   True on success, false on IO error.

pb_encode_submessage
--------------------
Encodes a submessage field, including the size header for it. Works for fields of any message type::

    bool pb_encode_submessage(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct);

:stream:        Output stream to write to.
:fields:        Pointer to the autogenerated message descriptor for the submessage type, e.g. `MyMessage_fields`.
:src:           Pointer to the structure where submessage data is.
:returns:       True on success, false on IO errors, pb_encode errors or if submessage size changes between calls.

In Protocol Buffers format, the submessage size must be written before the submessage contents. Therefore, this function has to encode the submessage twice in order to know the size beforehand.

If the submessage contains callback fields, the callback function might misbehave and write out a different amount of data on the second call. This situation is recognized and *false* is returned, but garbage will be written to the output before the problem is detected.





pb_decode.h
===========

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);

:buf:           Pointer to byte array to read from.
:bufsize:       Size of the byte array.
:returns:       An input stream ready to use.

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);

:stream:        Input stream to read from.
:buf:           Buffer to store the data to, or NULL to just read data without storing it anywhere.
:count:         Number of bytes to read.
:returns:       True on success, false if *stream->bytes_left* is less than *count* or if an IO error occurs.

End of file is signalled by *stream->bytes_left* being zero after pb_read returns false.

pb_decode
---------
Read and decode all fields of a structure. Reads until EOF on input stream. ::

    bool pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct);

:stream:        Input stream to read from.
:fields:        Message descriptor, usually autogenerated.
:dest_struct:   Pointer to structure where data will be stored.
:returns:       True on success, false on IO error, on detectable errors in field description, if a field encoder returns false or if a required field is missing.

In Protocol Buffers binary format, EOF is only allowed between fields. If it happens anywhere else, pb_decode will return *false*. If pb_decode returns false, you cannot trust any of the data in the structure.

For optional fields, this function applies the default value and sets *has_<field>* to false if the field is not present.

If *PB_ENABLE_MALLOC* is defined, this function may allocate storage for any pointer type fields.
In this case, you have to call `pb_release`_ to release the memory after you are done with the message.
On error return `pb_decode` will release the memory itself.

pb_decode_ex
------------
Same as `pb_decode`_, but allows extended options. ::

    bool pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags);

:stream:        Input stream to read from.
:fields:        Message descriptor, usually autogenerated.
:dest_struct:   Pointer to structure where data will be stored.
:flags:         Extended options, see below
:returns:       True on success, false on IO error, on detectable errors in field description, if a field encoder returns false or if a required field is missing.

The following options can be defined and combined with bitwise `|` operator:

:PB_DECODE_NOINIT:         Do not initialize structure before decoding. This can be used to combine multiple messages, or if you have already initialized the message yourself.
:PB_DECODE_DELIMITED:      Expect a length prefix in varint format before message. The counterpart of `PB_ENCODE_DELIMITED`.
:PB_DECODE_NULLTERMINATED: Expect the message to be terminated with zero tag. The counterpart of `PB_ENCODE_NULLTERMINATED`.

If *PB_ENABLE_MALLOC* is defined, this function may allocate storage for any pointer type fields.
In this case, you have to call `pb_release`_ to release the memory after you are done with the message.
On error return `pb_decode_ex` will release the memory itself.

pb_release
----------
Releases any dynamically allocated fields::

    void pb_release(const pb_msgdesc_t *fields, void *dest_struct);

:fields:        Message descriptor, usually autogenerated.
:dest_struct:   Pointer to structure where data is stored. If NULL, function does nothing.

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_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);

:stream:        Input stream to read from.
:wire_type:     Pointer to variable where to store the wire type of the field.
:tag:           Pointer to variable where to store the tag of the field.
:eof:           Pointer to variable where to store end-of-file status.
:returns:       True on success, false on error or EOF.

When the message (stream) ends, this function will return false and set *eof* to true. On other
errors, *eof* will be set to false.

pb_skip_field
-------------
Remove the data for a field from the stream, without actually decoding it::

    bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type);

:stream:        Input stream to read from.
:wire_type:     Type of field to skip.
:returns:       True on success, false on IO error.

.. sidebar:: Decoding fields manually
    
    The functions with names beginning with *pb_decode_* are used when dealing with callback fields. The typical reason for using callbacks is to have an array of unlimited size. In that case, `pb_decode`_ will call your callback function repeatedly, which can then store the values into e.g. filesystem in the order received in.

    For decoding numeric (including enumerated and boolean) values, use `pb_decode_varint`_, `pb_decode_svarint`_, `pb_decode_fixed32`_ and `pb_decode_fixed64`_. They take a pointer to a 32- or 64-bit C variable, which you may then cast to smaller datatype for storage.

    For decoding strings and bytes fields, the length has already been decoded. You can therefore check the total length in *stream->bytes_left* and read the data using `pb_read`_.

    Finally, for decoding submessages in a callback, simply use `pb_decode`_ and pass it the *SubMessage_fields* descriptor array.

pb_decode_varint
----------------
Read and decode a varint_ encoded integer. ::

    bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest);

:stream:        Input stream to read from. 1-10 bytes will be read.
:dest:          Storage for the decoded integer. Value is undefined on error.
:returns:       True on success, false if value exceeds uint64_t range or an IO error happens.

pb_decode_varint32
------------------
Same as `pb_decode_varint`, but limits the value to 32 bits::

    bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest);

Parameters are the same as `pb_decode_varint`. This function can be used for
decoding lengths and other commonly occurring elements that you know shouldn't
be larger than 32 bit. It will return an error if the value exceeds the `uint32_t`
datatype.

pb_decode_svarint
-----------------
Similar to `pb_decode_varint`_, except that it performs zigzag-decoding on the value. This corresponds to the Protocol Buffers *sint32* and *sint64* datatypes. ::

    bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest);

(parameters are the same as `pb_decode_varint`_)

pb_decode_fixed32
-----------------
Decode a *fixed32*, *sfixed32* or *float* value. ::

    bool pb_decode_fixed32(pb_istream_t *stream, void *dest);

:stream:        Input stream to read from. 4 bytes will be read.
:dest:          Pointer to destination *int32_t*, *uint32_t* or *float*.
:returns:       True on success, false on IO errors.

This function reads 4 bytes from the input stream.
On big endian architectures, it then reverses the order of the bytes.
Finally, it writes the bytes to *dest*.

pb_decode_fixed64
-----------------
Decode a *fixed64*, *sfixed64* or *double* value. ::

    bool pb_decode_fixed64(pb_istream_t *stream, void *dest);

:stream:        Input stream to read from. 8 bytes will be read.
:dest:          Pointer to destination *int64_t*, *uint64_t* or *double*.
:returns:       True on success, false on IO errors.

Same as `pb_decode_fixed32`_, except this reads 8 bytes.

pb_decode_double_as_float
-------------------------
Decodes a 64-bit `double` value into a 32-bit `float` variable.
Counterpart of `pb_encode_float_as_double`_. ::

    bool pb_decode_double_as_float(pb_istream_t *stream, float *dest);

:stream:        Input stream to read from. 8 bytes will be read.
:dest:          Pointer to destination *float*.
:returns:       True on success, false on IO errors.

pb_make_string_substream
------------------------
Decode the length for a field with wire type *PB_WT_STRING* and create a substream for reading the data. ::

    bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream);

:stream:        Original input stream to read the length and data from.
:substream:     New substream that has limited length. Filled in by the function.
:returns:       True on success, false if reading the length fails.

This function uses `pb_decode_varint`_ to read an integer from the stream. This is interpreted as a number of bytes, and the substream is set up so that its `bytes_left` is initially the same as the length, and its callback function and state the same as the parent stream.

pb_close_string_substream
-------------------------
Close the substream created with `pb_make_string_substream`_. ::

    void pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream);

:stream:        Original input stream to read the length and data from.
:substream:     Substream to close

This function copies back the state from the substream to the parent stream.
It must be called after done with the substream.



pb_common.h
===========

pb_field_iter_begin
-------------------
Begins iterating over the fields in a message type::

    bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message);

:iter:     Pointer to destination `pb_field_iter_t`_ variable.
:desc:     Autogenerated message descriptor.
:message:  Pointer to message structure.
:returns:  True on success, false if the message type has no fields.

pb_field_iter_next
------------------
Advance to the next field in the message::

    bool pb_field_iter_next(pb_field_iter_t *iter);

:iter:      Pointer to `pb_field_iter_t`_ previously initialized by `pb_field_iter_begin`_.
:returns:   True on success, false after last field in the message.

When the last field in the message has been processed, this function will return
false and initialize `iter` back to the first field in the message.

pb_field_iter_find
------------------
Find a field specified by tag number in the message::

    bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag);

:iter:      Pointer to `pb_field_iter_t`_ previously initialized by `pb_field_iter_begin`_.
:tag:       Tag number to search for.
:returns:   True if field was found, false otherwise.

This function is functionally identical to calling `pb_field_iter_next()` until
`iter.tag` equals the searched value. Internally this function avoids fully
processing the descriptor for intermediate fields.

pb_validate_utf8
----------------
Validates an UTF8 encoded string::

    bool pb_validate_utf8(const char *s);

:s:         Pointer to beginning of a string.
:returns:   True, if string is valid UTF-8, false otherwise.

The protobuf standard requires that `string` fields only contain valid UTF-8
encoded text, while `bytes` fields can contain arbitrary data. When the
compilation option `PB_VALIDATE_UTF8` is defined, nanopb will automatically
validate strings on both encoding and decoding.

User code can call this function to validate strings in e.g. custom callbacks.
