./ MultiCS.r82 / dyn_buffer.c
struct dyn_buffer {
	char *data;
	int allocsize;
	int datasize;
	int windex; // write position
	int rindex; // read position
};
/*
void dynbuf_print( struct dyn_buffer *dbf )
{
	printf("DYNAMIC BUFFER\n Allocated size = %d\n Data size = %d\n Write Index = %d\n Read Index = %d\n", dbf->allocsize, dbf->datasize, dbf->windex, dbf->rindex);
}
*/
void *dynbuf_init( struct dyn_buffer *dbf, int size )
{
	char *data = malloc( size );
	dbf->data = data;
	dbf->windex = 0;
	dbf->rindex = 0;
	dbf->datasize = 0;
	dbf->allocsize = size;
	return data;
}


void *dynbuf_realloc( struct dyn_buffer *dbf, int newsize )
{
	newsize = (newsize+1023)/1024;
	newsize *= 1024; // en kilos
	char *newdata = malloc( newsize );
	if (!newdata) return NULL;
	if (newsize>dbf->allocsize) memcpy( newdata, dbf->data, dbf->allocsize ); else memcpy( newdata, dbf->data, newsize );
	free( dbf->data );
	dbf->data = newdata;
	dbf->allocsize = newsize;
	return newdata;
}


void dynbuf_write( struct dyn_buffer *dbf, unsigned char *data, int size )
{
	if ( (dbf->windex+size)>dbf->allocsize ) dynbuf_realloc( dbf, dbf->windex+size );
	memcpy( dbf->data+dbf->windex, data, size);
	dbf->windex += size;
	if (dbf->windex>dbf->datasize) dbf->datasize = dbf->windex;
	//dynbuf_print( dbf );
}

void dynbuf_free( struct dyn_buffer *dbf )
{
	if (!dbf->data) return;
	free( dbf->data );
	dbf->data = NULL;
	dbf->windex = 0;
	dbf->rindex = 0;
	dbf->datasize = 0;
	dbf->allocsize = 0;
}