Added a macro to test buffer_struct integrity

Nothing yet in cmake and config.h.in for this
This commit is contained in:
Aris Adamantiadis
2009-06-21 20:29:29 +02:00
parent e671ebcd99
commit 4dafc25927

View File

@@ -38,6 +38,35 @@
* @{ * @{
*/ */
/** \brief checks that preconditions and postconditions are valid
* \internal
*/
#ifdef DEBUG_BUFFER
static void buffer_verify(struct buffer_struct *buf){
int doabort=0;
if(buf->data == NULL)
return;
if(buf->used > buf->allocated){
fprintf(stderr,"Buffer error : allocated %u, used %u\n",buf->allocated, buf->used);
doabort=1;
}
if(buf->pos > buf->used){
fprintf(stderr,"Buffer error : position %u, used %u\n",buf->pos, buf->used);
doabort=1;
}
if(buf->pos > buf->allocated){
fprintf(stderr,"Buffer error : position %u, allocated %u\n",buf->pos, buf->allocated);
doabort=1;
}
if(doabort)
abort();
}
#else
#define buffer_verify(x)
#endif
/** \brief creates a new buffer /** \brief creates a new buffer
* \return a new initialized buffer, NULL on error. * \return a new initialized buffer, NULL on error.
*/ */
@@ -48,7 +77,7 @@ struct buffer_struct *buffer_new(void) {
return NULL; return NULL;
} }
memset(buf, 0, sizeof(struct buffer_struct)); memset(buf, 0, sizeof(struct buffer_struct));
buffer_verify(buf);
return buf; return buf;
} }
@@ -59,6 +88,7 @@ void buffer_free(struct buffer_struct *buffer) {
if (buffer == NULL) { if (buffer == NULL) {
return; return;
} }
buffer_verify(buffer);
if (buffer->data) { if (buffer->data) {
/* burn the data */ /* burn the data */
@@ -72,8 +102,9 @@ void buffer_free(struct buffer_struct *buffer) {
static int realloc_buffer(struct buffer_struct *buffer, int needed) { static int realloc_buffer(struct buffer_struct *buffer, int needed) {
int smallest = 1; int smallest = 1;
char *new = NULL; char *new = NULL;
buffer_verify(buffer);
/* Find the smallest power of two which is greater or equal to needed */ /* Find the smallest power of two which is greater or equal to needed */
while(smallest <= needed) { while(smallest < needed) {
smallest <<= 1; smallest <<= 1;
} }
needed = smallest; needed = smallest;
@@ -83,7 +114,7 @@ static int realloc_buffer(struct buffer_struct *buffer, int needed) {
} }
buffer->data = new; buffer->data = new;
buffer->allocated = needed; buffer->allocated = needed;
buffer_verify(buffer);
return 0; return 0;
} }
@@ -93,6 +124,7 @@ static int realloc_buffer(struct buffer_struct *buffer, int needed) {
* \return 0 on sucess, < 0 on error * \return 0 on sucess, < 0 on error
*/ */
int buffer_reinit(struct buffer_struct *buffer) { int buffer_reinit(struct buffer_struct *buffer) {
buffer_verify(buffer);
memset(buffer->data, 0, buffer->used); memset(buffer->data, 0, buffer->used);
buffer->used = 0; buffer->used = 0;
buffer->pos = 0; buffer->pos = 0;
@@ -101,6 +133,7 @@ int buffer_reinit(struct buffer_struct *buffer) {
return -1; return -1;
} }
} }
buffer_verify(buffer);
return 0; return 0;
} }
@@ -111,6 +144,7 @@ int buffer_reinit(struct buffer_struct *buffer) {
* \param len length of data * \param len length of data
*/ */
int buffer_add_data(struct buffer_struct *buffer, const void *data, u32 len) { int buffer_add_data(struct buffer_struct *buffer, const void *data, u32 len) {
buffer_verify(buffer);
if (buffer->allocated < (buffer->used + len)) { if (buffer->allocated < (buffer->used + len)) {
if (realloc_buffer(buffer, buffer->used + len) < 0) { if (realloc_buffer(buffer, buffer->used + len) < 0) {
return -1; return -1;
@@ -119,6 +153,7 @@ int buffer_add_data(struct buffer_struct *buffer, const void *data, u32 len) {
memcpy(buffer->data+buffer->used, data, len); memcpy(buffer->data+buffer->used, data, len);
buffer->used+=len; buffer->used+=len;
buffer_verify(buffer);
return 0; return 0;
} }
@@ -189,6 +224,7 @@ int buffer_add_u8(struct buffer_struct *buffer,u8 data){
*/ */
int buffer_prepend_data(struct buffer_struct *buffer, const void *data, int buffer_prepend_data(struct buffer_struct *buffer, const void *data,
u32 len) { u32 len) {
buffer_verify(buffer);
if (buffer->allocated < (buffer->used + len)) { if (buffer->allocated < (buffer->used + len)) {
if (realloc_buffer(buffer, buffer->used + len) < 0) { if (realloc_buffer(buffer, buffer->used + len) < 0) {
return -1; return -1;
@@ -197,7 +233,7 @@ int buffer_prepend_data(struct buffer_struct *buffer, const void *data,
memmove(buffer->data + len, buffer->data, buffer->used); memmove(buffer->data + len, buffer->data, buffer->used);
memcpy(buffer->data, data, len); memcpy(buffer->data, data, len);
buffer->used += len; buffer->used += len;
buffer_verify(buffer);
return 0; return 0;
} }
@@ -254,7 +290,8 @@ u32 buffer_get_len(struct buffer_struct *buffer){
* \see buffer_get_rest() * \see buffer_get_rest()
*/ */
u32 buffer_get_rest_len(struct buffer_struct *buffer){ u32 buffer_get_rest_len(struct buffer_struct *buffer){
return buffer->used - buffer->pos; buffer_verify(buffer);
return buffer->used - buffer->pos;
} }
/** \internal /** \internal
@@ -265,6 +302,7 @@ u32 buffer_get_rest_len(struct buffer_struct *buffer){
* \return new size of the buffer * \return new size of the buffer
*/ */
u32 buffer_pass_bytes(struct buffer_struct *buffer, u32 len){ u32 buffer_pass_bytes(struct buffer_struct *buffer, u32 len){
buffer_verify(buffer);
if(buffer->used < buffer->pos+len) if(buffer->used < buffer->pos+len)
return 0; return 0;
buffer->pos+=len; buffer->pos+=len;
@@ -273,6 +311,7 @@ u32 buffer_pass_bytes(struct buffer_struct *buffer, u32 len){
buffer->pos=0; buffer->pos=0;
buffer->used=0; buffer->used=0;
} }
buffer_verify(buffer);
return len; return len;
} }
@@ -283,10 +322,12 @@ u32 buffer_pass_bytes(struct buffer_struct *buffer, u32 len){
* \return new size of the buffer * \return new size of the buffer
*/ */
u32 buffer_pass_bytes_end(struct buffer_struct *buffer, u32 len){ u32 buffer_pass_bytes_end(struct buffer_struct *buffer, u32 len){
if(buffer->used < buffer->pos + len) buffer_verify(buffer);
return 0; if(buffer->used < buffer->pos + len)
buffer->used-=len; return 0;
return len; buffer->used-=len;
buffer_verify(buffer);
return len;
} }
/** \internal /** \internal