aboutsummaryrefslogtreecommitdiffstats
path: root/pb_decode.c
diff options
context:
space:
mode:
authorAndrew Ruder <andrew.ruder@elecsyscorp.com>2015-12-16 08:13:55 -0600
committerAndrew Ruder <andrew.ruder@elecsyscorp.com>2015-12-16 08:24:58 -0600
commit3d36157949dd1e5220bcb58b89381f59c767f558 (patch)
tree3485ecb2db65af4a0b9d56c20537acd1aa3ee84f /pb_decode.c
parent56f7c488df99ae655b47b5838055e48b886665a1 (diff)
pb_istream_from_buffer: add const to prototype
This commit changes the prototype for pb_istream_from_buffer from: pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize); to pb_istream_t pb_istream_from_buffer(const uint8_t *buf, size_t bufsize); This allows pb_istream_from_buffer users to point to const buffers without having to inspect code (to ensure practical const-ness) and then be forced to manually cast away const. In order to not break compatibility with existing programs (by introducing a const/non-const union in the pb_istream_t state) we simply cast away the const in pb_istream_from_buffer and re-apply it when possible in the callbacks. Unfortunately we lose any compiler help in the callbacks to ensure we are treating the buffer as const but manual inspection is easy enough.
Diffstat (limited to 'pb_decode.c')
-rw-r--r--pb_decode.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/pb_decode.c b/pb_decode.c
index 50ada86a..0bf8befd 100644
--- a/pb_decode.c
+++ b/pb_decode.c
@@ -74,8 +74,8 @@ static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT] = {
static bool checkreturn buf_read(pb_istream_t *stream, uint8_t *buf, size_t count)
{
- uint8_t *source = (uint8_t*)stream->state;
- stream->state = source + count;
+ const uint8_t *source = (const uint8_t*)stream->state;
+ stream->state = (uint8_t*)stream->state + count;
if (buf != NULL)
{
@@ -131,7 +131,7 @@ static bool checkreturn pb_readbyte(pb_istream_t *stream, uint8_t *buf)
if (!stream->callback(stream, buf, 1))
PB_RETURN_ERROR(stream, "io error");
#else
- *buf = *(uint8_t*)stream->state;
+ *buf = *(const uint8_t*)stream->state;
stream->state = (uint8_t*)stream->state + 1;
#endif
@@ -140,15 +140,23 @@ static bool checkreturn pb_readbyte(pb_istream_t *stream, uint8_t *buf)
return true;
}
-pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize)
+pb_istream_t pb_istream_from_buffer(const uint8_t *buf, size_t bufsize)
{
pb_istream_t stream;
+ /* Cast away the const from buf without a compiler error. We are
+ * careful to use it only in a const manner in the callbacks.
+ */
+ union {
+ void *state;
+ const void *c_state;
+ } state;
#ifdef PB_BUFFER_ONLY
stream.callback = NULL;
#else
stream.callback = &buf_read;
#endif
- stream.state = buf;
+ state.c_state = buf;
+ stream.state = state.state;
stream.bytes_left = bufsize;
#ifndef PB_NO_ERRMSG
stream.errmsg = NULL;