diff options
author | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2012-08-24 20:23:25 +0300 |
---|---|---|
committer | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2012-08-24 20:23:25 +0300 |
commit | 2941e90e041b0d7872a4ea458e77dcc787ca6ff2 (patch) | |
tree | ca2f8b83d059e4ac5569413498aa27230ba2083c /pb_decode.h | |
parent | dc2da0edc568b29361479fb7405c96b1a13442cf (diff) |
Reorganize the field decoder interface.
This makes the field decoding functions more intuitive to use.
The old interface is still present if you specify NANOPB_INTERNALS.
Update issue 2
Status: FixedInGit
Diffstat (limited to 'pb_decode.h')
-rw-r--r-- | pb_decode.h | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/pb_decode.h b/pb_decode.h index 9cc67e8e..27535c10 100644 --- a/pb_decode.h +++ b/pb_decode.h @@ -44,20 +44,38 @@ bool pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struc * You may want to use these from your caller or callbacks. */ +/* Decode the tag for the next field in the stream. Gives the wire type and + * field tag. At end of the message, returns false and sets eof to true. */ bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); + +/* Skip the field payload data, given the wire type. */ bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type); +/* Decode an integer in the varint format. This works for bool, enum, int32, + * int64, uint32 and uint64 field types. */ bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest); -bool pb_skip_varint(pb_istream_t *stream); -bool pb_skip_string(pb_istream_t *stream); +/* Decode an integer in the zig-zagged svarint format. This works for sint32 + * and sint64. */ +bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest); + +/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to + * a 4-byte wide C variable. */ +bool pb_decode_fixed32(pb_istream_t *stream, void *dest); + +/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to + * a 8-byte wide C variable. */ +bool pb_decode_fixed64(pb_istream_t *stream, void *dest); -/* --- Field decoders --- - * Each decoder takes stream and field description, and a pointer to the field - * in the destination struct (dest = struct_addr + field->data_offset). - * For arrays, these functions are called repeatedly. +/* Make a limited-length substream for reading a PB_WT_STRING field. */ +bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream); + +/* --- Internal functions --- + * These functions are not terribly useful for the average library user, but + * are exported to make the unit testing and extending nanopb easier. */ +#ifdef NANOPB_INTERNALS bool pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest); bool pb_dec_svarint(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); @@ -67,4 +85,8 @@ bool pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); bool pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest); bool pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest); +bool pb_skip_varint(pb_istream_t *stream); +bool pb_skip_string(pb_istream_t *stream); +#endif + #endif |