diff options
author | Petteri Aimonen <jpa@npb.mail.kapsi.fi> | 2011-07-25 20:42:48 +0000 |
---|---|---|
committer | Petteri Aimonen <jpa@npb.mail.kapsi.fi> | 2011-07-25 20:42:48 +0000 |
commit | 14bbe229974b516a82594ec6476488154e8957fa (patch) | |
tree | 178f51c1977a1ef8f83c6911741ddbfb8266a727 /pb_decode.h |
First version of decoding
git-svn-id: https://svn.kapsi.fi/jpa/nanopb@942 e3a754e5-d11d-0410-8d38-ebb782a927b9
Diffstat (limited to 'pb_decode.h')
-rw-r--r-- | pb_decode.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/pb_decode.h b/pb_decode.h new file mode 100644 index 00000000..b71e20b1 --- /dev/null +++ b/pb_decode.h @@ -0,0 +1,55 @@ +#ifndef _PB_DECODE_H_ +#define _PB_DECODE_H_ + +#include <stdbool.h> +#include "pb.h" + +// Decode from stream to destination struct. +// The actual struct pointed to by dest must match the description in fields. +bool pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest); + +/* --- Helper functions --- + * You may want to use these from your callbacks. + */ + +bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest); +bool pb_decode_varint64(pb_istream_t *stream, uint64_t *dest); + +bool pb_skip_varint(pb_istream_t *stream); +bool pb_skip_string(pb_istream_t *stream); + +/* --- Field decoders --- + * Each decoder takes stream and field description, and a pointer to the field + * in the destination struct (dest = struct_addr + field->offset). + */ + +// Integer types. +bool pb_dec_uint32(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_sint32(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_uint64(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_sint64(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_bool(pb_istream_t *stream, const pb_field_t *field, void *dest); + +// Floating point types. Info is ignored. +bool pb_dec_float(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_dec_double(pb_istream_t *stream, const pb_field_t *field, void *dest); + +// Byte array. Dest is pointer to +bool pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); + +// Null-terminated string. +bool pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest); + +// Use callback. Dest is pointer to pb_callback_t struct. +bool pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest); + +typedef bool (*pb_decoder_t)(pb_istream_t *stream, const pb_field_t *field, void *dest); + +/* --- Function pointers to field decoders --- + * Order in the array must match pb_action_t numbering. + */ +const pb_decoder_t PB_DECODERS[PB_LAST_ACT]; + +#endif |