From: Petteri Aimonen Date: Tue, 5 Feb 2013 20:39:32 +0000 (+0200) Subject: Make pb_decode_varint32 a separate implementation. X-Git-Tag: 5.0.2~186^2~419 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=39b8a5e2bbd5da85f23b48280e81a5ce6672b09d;p=apps%2Fagl-service-can-low-level.git Make pb_decode_varint32 a separate implementation. This avoids doing 64-bit arithmetic for 32-bit varint decodings. It does increase the code size somewhat. Results for ARM Cortex-M3: -10% execution time, +1% code size, -2% ram usage. --- diff --git a/pb_decode.c b/pb_decode.c index 6ddde773..9faceca2 100644 --- a/pb_decode.c +++ b/pb_decode.c @@ -95,10 +95,20 @@ pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize) static bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest) { - uint64_t temp; - bool status = pb_decode_varint(stream, &temp); - *dest = (uint32_t)temp; - return status; + uint8_t byte; + int bitpos = 0; + *dest = 0; + + while (bitpos < 32 && pb_read(stream, &byte, 1)) + { + *dest |= (uint32_t)(byte & 0x7F) << bitpos; + bitpos += 7; + + if (!(byte & 0x80)) + return true; + } + + PB_RETURN_ERROR(stream, "varint overflow"); } bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)