Move the declarations of _pb_ostream_t and _pb_istream_t before first use.
[apps/agl-service-can-low-level.git] / docs / reference.rst
index 6cd3c64..51556d3 100644 (file)
@@ -11,9 +11,13 @@ Nanopb: API reference
 
 Compilation options
 ===================
-The following options can be specified using -D switch given to the C compiler
-when compiling the nanopb library and applications using it. You must have the
-same settings for the nanopb library and all code that includes pb.h.
+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.
 
 ============================  ================================================
 __BIG_ENDIAN__                 Set this if your platform stores integers and
@@ -45,6 +49,11 @@ PB_BUFFER_ONLY                 Disables the support for custom streams. Only
 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"*.
 ============================  ================================================
 
 The PB_MAX_REQUIRED_FIELDS, PB_FIELD_16BIT and PB_FIELD_32BIT settings allow
@@ -52,7 +61,7 @@ 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
@@ -61,16 +70,16 @@ 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_size                       Allocated size for *bytes* and *string* fields.
 max_count                      Allocated number of entries in arrays
-                               ('repeated' fields).
+                               (*repeated* fields).
 type                           Type of the generated field. Default value
-                               is FT_DEFAULT, which selects automatically.
-                               You can use FT_CALLBACK, FT_STATIC or FT_IGNORE
-                               to force a callback field, a static field or
-                               to completely ignore the field.
+                               is *FT_DEFAULT*, which selects automatically.
+                               You can use *FT_CALLBACK*, *FT_STATIC* or
+                               *FT_IGNORE* to force a callback 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
+                               definitions, i.e. *EnumName_EnumValue*. Enabled
                                by default.
 packed_struct                  Make the generated structures packed.
                                NOTE: This cannot be used on CPUs that break
@@ -97,44 +106,62 @@ 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'. The
-generator will automatically search for this file and read the options from
-it. The file format is as follows:
+'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 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
+
+  - *\** 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.
   
 If preferred, the name of the options file can be set using the command line
-switch '-f' to nanopb_generator.py.
+switch *-f* to nanopb_generator.py.
 
 Defining the options on command line
 ------------------------------------
-The nanopb_generator.py has a simple command line option '-s OPTION:VALUE'.
+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:
+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";
-    required string name = 1 [(nanopb).max_size = 40];
-    repeated PhoneNumber phone = 4 [(nanopb).max_count = 5];
+    
+    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
@@ -277,6 +304,41 @@ Protocol Buffers wire types. These are used with `pb_encode_tag`_. ::
         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;
+    } 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*.
+
 PB_GET_ERROR
 ------------
 Get the current error message from a stream, or a placeholder string if