=====================
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_16BIT                 Add support for tag numbers > 255 and fields
                               larger than 255 bytes or 255 array entries.
                               Increases code size 3 bytes per each field.
                               Compiler error 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_OLD_CALLBACK_STYLE          Use the old function signature (void\* instead
                               of void\*\*) for callback fields. This was the
                               default until nanopb-0.2.1.
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, PB_FIELD_16BIT 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.h 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 these options, defined in the
'nanopb.proto' file in the generator folder:

============================  ================================================
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 is the preferred way as of nanopb-0.2.1, because it has the best
   compatibility with other protobuf libraries.
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 is the way used in nanopb-0.1, and will remain supported in the
   future. It however sometimes causes trouble when using the .proto file
   with other protobuf libraries.

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

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. This file, in turn, requires the file
*google/protobuf/descriptor.proto*. This is usually installed under
*/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

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

The bits 4-5 define whether the field is required, optional or repeated:

==================== ===== ================================================
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.
                           (Unless it is a callback)
PB_HTYPE_REPEATED    0x20  A repeated field with preallocated array.
                           Separate *<field>_count* for number of items.
                           (Unless it is a callback)
==================== ===== ================================================

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_CALLBACK    0x40  A field with dynamic storage size. Struct field
                           actually contains a pointer to a callback
                           function.
==================== ===== ================================================


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;
        pb_type_t type;
        pb_size_t data_offset;
        pb_ssize_t size_offset;
        pb_size_t data_size;
        pb_size_t array_size;
        const void *ptr;
    } pb_packed;

:tag:           Tag number of the field or 0 to terminate a list of fields.
:type:          LTYPE, HTYPE and ATYPE of the field.
:data_offset:   Offset of field data, relative to the end of the previous field.
:size_offset:   Offset of *bool* flag for optional fields or *size_t* count for arrays, relative to field data.
:data_size:     Size of a single data entry, in bytes. For PB_LTYPE_BYTES, the size of the byte array inside the containing structure. For PB_HTYPE_CALLBACK, size of the C data type if known.
:array_size:    Maximum number of entries in an array, if it is an array type.
:ptr:           Pointer to default value for optional fields, or to submessage description for PB_LTYPE_SUBMESSAGE.

The *uint8_t* datatypes limit the maximum size of a single item to 255 bytes and arrays to 255 items. Compiler will give error if the values are too large. The types can be changed to larger ones by defining *PB_FIELD_16BIT*.

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.

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_t *field, void **arg);
            bool (*encode)(pb_ostream_t *stream, const pb_field_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.

Previously the function received just the value of *arg* instead of a pointer to it. This old behaviour can be enabled by defining *PB_OLD_CALLBACK_STYLE*.

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_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_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_field_t fields[], const void *src_struct);

:stream:        Output stream to write to.
:fields:        A field description array, 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_delimited
-------------------
Calculates the length of the message, encodes it as varint and then encodes the message. ::

    bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);

(parameters are the same as for `pb_encode`_.)

A common way to indicate the message length in Protocol Buffers is to prefix it with a varint.
This function does this, and it is compatible with *parseDelimitedFrom* in Google's protobuf library.

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

: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_t* structure. ::

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

:stream:        Output stream to write to. 1-5 bytes will be written.
:field:         Field description structure. Usually autogenerated.
: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_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_field_t fields[], const void *src_struct);

:stream:        Output stream to write to.
:fields:        Pointer to the autogenerated field description array 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_field_t fields[], void *dest_struct);

:stream:        Input stream to read from.
:fields:        A field description array. 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.

In addition to EOF, the pb_decode implementation supports terminating a message with a 0 byte. This is compatible with the official Protocol Buffers because 0 is never a valid field tag.

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_noinit
----------------
Same as `pb_decode`_, except does not apply the default values to fields. ::

    bool pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);

(parameters are the same as for `pb_decode`_.)

The destination structure should be filled with zeros before calling this function. Doing a *memset* manually can be slightly faster than using `pb_decode`_ if you don't need any default values.

In addition to decoding a single message, this function can be used to merge two messages, so that
values from previous message will remain if the new message does not contain a field.

This function *will not* release the message even on error return. If you use *PB_ENABLE_MALLOC*,
you will need to call `pb_release`_ yourself.

pb_decode_delimited
-------------------
Same as `pb_decode`_, except that it first reads a varint with the length of the message. ::

    bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);

(parameters are the same as for `pb_decode`_.)

A common method to indicate message size in Protocol Buffers is to prefix it with a varint.
This function is compatible with *writeDelimitedTo* in the Google's Protocol Buffers library.

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

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