From 17690bab814855118c6a910fa8c43fddc6cd79f0 Mon Sep 17 00:00:00 2001 From: Jeremy Lakeman Date: Wed, 28 Nov 2012 13:31:33 +1030 Subject: [PATCH] Add packed integer parsing to buffer functions --- overlay_buffer.c | 31 +++++++++++++++++++++++++++++-- overlay_buffer.h | 3 +++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/overlay_buffer.c b/overlay_buffer.c index 614d26b4..d54031a1 100644 --- a/overlay_buffer.c +++ b/overlay_buffer.c @@ -255,6 +255,18 @@ int ob_append_ui32(struct overlay_buffer *b, uint32_t v) return 0; } +int ob_append_packed_ui32(struct overlay_buffer *b, uint32_t v) +{ + do{ + + if (ob_append_byte(b, (v&0x7f) | (v>0x7f?0x80:0))) + return -1; + v = v>>7; + + }while(v!=0); + return 0; +} + int ob_append_rfs(struct overlay_buffer *b,int l) { if (l<0||l>0xffff) return -1; @@ -329,6 +341,21 @@ uint16_t ob_get_ui16(struct overlay_buffer *b) return ret; } +uint32_t ob_get_packed_ui32(struct overlay_buffer *b) +{ + uint32_t ret=0; + int shift=0; + int byte; + do{ + byte = ob_get(b); + if (byte<0) + return WHY("Failed to unpack integer"); + ret |= (byte&0x7f)<position, 1)) return -1; @@ -373,8 +400,8 @@ int asprintable(int c) int ob_dump(struct overlay_buffer *b,char *desc) { - DEBUGF("overlay_buffer '%s' at %p : length=%d", desc, b, b->position); - dump(NULL, b->bytes, b->position); + DEBUGF("overlay_buffer '%s' at %p : position=%d, size=%d", desc, b, b->position, b->sizeLimit); + dump(NULL, b->bytes, b->sizeLimit>b->position?b->sizeLimit:b->position); return 0; } diff --git a/overlay_buffer.h b/overlay_buffer.h index 69f32402..f45df4b2 100644 --- a/overlay_buffer.h +++ b/overlay_buffer.h @@ -57,6 +57,7 @@ int ob_append_bytes(struct overlay_buffer *b,unsigned char *bytes,int count); unsigned char *ob_append_space(struct overlay_buffer *b,int count); int ob_append_ui16(struct overlay_buffer *b, uint16_t v); int ob_append_ui32(struct overlay_buffer *b, uint32_t v); +int ob_append_packed_ui32(struct overlay_buffer *b, uint32_t v); int ob_patch_rfs(struct overlay_buffer *b); int ob_append_rfs(struct overlay_buffer *b,int l); // get one byte, -ve number indicates failure @@ -70,6 +71,8 @@ uint16_t ob_get_ui16(struct overlay_buffer *b); int ob_dump(struct overlay_buffer *b,char *desc); int ob_set_ui16(struct overlay_buffer *b, int offset, uint16_t v); +uint32_t ob_get_packed_ui32(struct overlay_buffer *b); + // information routines int ob_position(struct overlay_buffer *b); int ob_limit(struct overlay_buffer *b);