#include "swr_support.h" #include <stdlib.h> #include <string.h> #include <stdarg.h> #ifdef __cplusplus extern "C" { #endif void bug( const char *str, ... ); #ifdef __cplusplus } #endif /* * Create a new buffer. */ BUFFER *buffer_new( size_t size ) { BUFFER *buffer = (BUFFER*) malloc( sizeof( BUFFER ) ); buffer->size = size; buffer->data = (char*) malloc( size ); buffer->len = 0; return buffer; } /* * Add a string to a buffer. Expand if necessary */ void buffer_strcat( BUFFER *buffer, const char *text ) { size_t new_size = 0; size_t text_len = 0; char *new_data = NULL; /* Adding NULL string ? */ if( !text ) return; text_len = strlen( text ); /* Adding empty string ? */ if( text_len == 0 ) return; /* Will the combined len of the added text and the current text exceed our buffer? */ if( ( text_len + buffer->len + 1 ) > buffer->size ) { new_size = buffer->size + text_len + 1; /* Allocate the new buffer */ new_data = (char*) malloc( new_size ); /* Copy the current buffer to the new buffer */ memcpy( new_data, buffer->data, buffer->len ); free( buffer->data ); buffer->data = new_data; buffer->size = new_size; } memcpy( buffer->data + buffer->len, text, text_len ); buffer->len += text_len; buffer->data[ buffer->len ] = '\0'; } /* free a buffer */ void buffer_free( BUFFER *buffer ) { /* Free data */ free( buffer->data ); /* Free buffer */ free( buffer ); } /* Clear a buffer's contents, but do not deallocate anything */ void buffer_clear(BUFFER *buffer) { buffer->len = 0; buffer->data[0] = '\0'; } /* print stuff, append to buffer. safe. */ int bprintf( BUFFER *buffer, char *fmt, ... ) { char buf[MAX_STRING_LENGTH]; va_list va; int res = 0; va_start( va, fmt ); res = vsnprintf( buf, MAX_STRING_LENGTH, fmt, va ); va_end( va ); if( res >= MAX_STRING_LENGTH - 1 ) { buf[0] = '\0'; bug( "Overflow when printing string %s", fmt ); } else { buffer_strcat( buffer, buf ); } return res; }