diff options
author | Petteri Aimonen <jpa@github.mail.kapsi.fi> | 2015-12-16 16:39:30 +0200 |
---|---|---|
committer | Petteri Aimonen <jpa@github.mail.kapsi.fi> | 2015-12-16 16:39:30 +0200 |
commit | cad502a1d690ad129af9d4942185cfdbf1fa1504 (patch) | |
tree | 3485ecb2db65af4a0b9d56c20537acd1aa3ee84f | |
parent | 56f7c488df99ae655b47b5838055e48b886665a1 (diff) | |
parent | 3d36157949dd1e5220bcb58b89381f59c767f558 (diff) |
Merge pull request #190 from aeruder/master
pb_istream_from_buffer: add const to prototype
-rw-r--r-- | pb_decode.c | 18 | ||||
-rw-r--r-- | pb_decode.h | 2 |
2 files changed, 14 insertions, 6 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; diff --git a/pb_decode.h b/pb_decode.h index 3d433155..16de3e04 100644 --- a/pb_decode.h +++ b/pb_decode.h @@ -103,7 +103,7 @@ void pb_release(const pb_field_t fields[], void *dest_struct); * Alternatively, you can use a custom stream that reads directly from e.g. * a file or a network socket. */ -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); /* Function to read from a pb_istream_t. You can use this if you need to * read some custom header data, or to read data in field callbacks. |