version 1.1, 2009/06/01 22:58:49 |
version 1.2, 2009/06/25 06:05:47 |
|
|
xfree(b); |
xfree(b); |
} |
} |
|
|
/* Empty a buffer. */ |
|
void |
|
buffer_clear(struct buffer *b) |
|
{ |
|
b->size = 0; |
|
b->off = 0; |
|
} |
|
|
|
/* Ensure free space for size in buffer. */ |
/* Ensure free space for size in buffer. */ |
void |
void |
buffer_ensure(struct buffer *b, size_t size) |
buffer_ensure(struct buffer *b, size_t size) |
|
|
b->size += size; |
b->size += size; |
} |
} |
|
|
/* Reverse buffer add. */ |
|
void |
|
buffer_reverse_add(struct buffer *b, size_t size) |
|
{ |
|
if (size == 0) |
|
fatalx("zero size"); |
|
if (size > b->size) |
|
fatalx("underflow"); |
|
|
|
b->size -= size; |
|
} |
|
|
|
/* Adjust buffer after data removed. */ |
/* Adjust buffer after data removed. */ |
void |
void |
buffer_remove(struct buffer *b, size_t size) |
buffer_remove(struct buffer *b, size_t size) |
|
|
b->off += size; |
b->off += size; |
} |
} |
|
|
/* Reverse buffer remove. */ |
|
void |
|
buffer_reverse_remove(struct buffer *b, size_t size) |
|
{ |
|
if (size == 0) |
|
fatalx("zero size"); |
|
if (size > b->off) |
|
fatalx("overflow"); |
|
|
|
b->size += size; |
|
b->off -= size; |
|
} |
|
|
|
/* Insert a section into the buffer. */ |
|
void |
|
buffer_insert_range(struct buffer *b, size_t base, size_t size) |
|
{ |
|
if (size == 0) |
|
fatalx("zero size"); |
|
if (base > b->size) |
|
fatalx("range outside buffer"); |
|
|
|
buffer_ensure(b, size); |
|
memmove(b->base + b->off + base + size, |
|
b->base + b->off + base, b->size - base); |
|
b->size += size; |
|
} |
|
|
|
/* Delete a section from the buffer. */ |
|
void |
|
buffer_delete_range(struct buffer *b, size_t base, size_t size) |
|
{ |
|
if (size == 0) |
|
fatalx("zero size"); |
|
if (size > b->size) |
|
fatalx("size too big"); |
|
if (base + size > b->size) |
|
fatalx("range outside buffer"); |
|
|
|
memmove(b->base + b->off + base, |
|
b->base + b->off + base + size, b->size - base - size); |
|
b->size -= size; |
|
} |
|
|
|
/* Copy data into a buffer. */ |
/* Copy data into a buffer. */ |
void |
void |
buffer_write(struct buffer *b, const void *data, size_t size) |
buffer_write(struct buffer *b, const void *data, size_t size) |
|
|
buffer_add(b, 1); |
buffer_add(b, 1); |
} |
} |
|
|
/* Store a 16-bit value. */ |
|
void |
|
buffer_write16(struct buffer *b, uint16_t n) |
|
{ |
|
buffer_ensure(b, 2); |
|
BUFFER_IN(b)[0] = n & 0xff; |
|
BUFFER_IN(b)[1] = n >> 8; |
|
buffer_add(b, 2); |
|
} |
|
|
|
/* Extract an 8-bit value. */ |
/* Extract an 8-bit value. */ |
uint8_t |
uint8_t |
buffer_read8(struct buffer *b) |
buffer_read8(struct buffer *b) |
|
|
|
|
n = BUFFER_OUT(b)[0]; |
n = BUFFER_OUT(b)[0]; |
buffer_remove(b, 1); |
buffer_remove(b, 1); |
return (n); |
|
} |
|
|
|
/* Extract a 16-bit value. */ |
|
uint16_t |
|
buffer_read16(struct buffer *b) |
|
{ |
|
uint16_t n; |
|
|
|
n = BUFFER_OUT(b)[0] | (BUFFER_OUT(b)[1] << 8); |
|
buffer_remove(b, 2); |
|
return (n); |
return (n); |
} |
} |