X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=pb_encode.h;h=773b7178c7a91d29e25ffc8b39754b1be871e9c9;hb=ef741ea530e4086344ed0ad0fc90f21c224b9503;hp=59ec554b27cc81d718f98ab6e51d84f4ff0eb114;hpb=9fbe9a5de30c3326bd7015e91c5ba634df49ee25;p=apps%2Fagl-service-can-low-level.git diff --git a/pb_encode.h b/pb_encode.h index 59ec554b..773b7178 100644 --- a/pb_encode.h +++ b/pb_encode.h @@ -6,9 +6,12 @@ * and their field descriptions (just like with pb_decode). */ -#include #include "pb.h" +#ifdef __cplusplus +extern "C" { +#endif + /* Lightweight output stream. * You can provide callback for writing or use pb_ostream_from_buffer. * @@ -28,15 +31,36 @@ */ struct _pb_ostream_t { +#ifdef PB_BUFFER_ONLY + /* Callback pointer is not used in buffer-only configuration. + * Having an int pointer here allows binary compatibility but + * gives an error if someone tries to assign callback function. + * Also, NULL pointer marks a 'sizing stream' that does not + * write anything. + */ + int *callback; +#else bool (*callback)(pb_ostream_t *stream, const uint8_t *buf, size_t count); +#endif void *state; /* Free field for use by callback implementation */ size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ size_t bytes_written; + +#ifndef PB_NO_ERRMSG + const char *errmsg; +#endif }; pb_ostream_t pb_ostream_from_buffer(uint8_t *buf, size_t bufsize); bool pb_write(pb_ostream_t *stream, const uint8_t *buf, size_t count); +/* Stream type for use in computing message sizes */ +#ifndef PB_NO_ERRMSG +#define PB_OSTREAM_SIZING {0,0,0,0,0} +#else +#define PB_OSTREAM_SIZING {0,0,0,0} +#endif + /* Encode struct to given output stream. * Returns true on success, false on any failure. * The actual struct pointed to by src_struct must match the description in fields. @@ -54,7 +78,7 @@ bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field); /* Encode field header by manually specifing wire type. You need to use this if * you want to write out packed arrays from a callback field. */ -bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, int field_number); +bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number); /* Encode an integer in the varint format. * This works for bool, enum, int32, int64, uint32 and uint64 field types. */ @@ -99,5 +123,8 @@ bool pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *sr * instead, it has the same functionality with a less confusing interface. */ bool pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif