#include <string.h>
#include <stdio.h>

#include "Desk.Debug.h"
#include "Defs.h"


void	Desk_DeskMem_BufferFree( Desk_deskmem_buffer* buffer)
{
Desk_Debug_Assert( buffer);
Desk_Debug_Assert( buffer->data);

Desk_DeskMem_Free( buffer->data);
buffer->data	= NULL;
buffer->size	= 0;
}




void	Desk_DeskMem_BufferEnsure( Desk_deskmem_buffer* buffer, int min)
{
int	l;

Desk_Debug2_Printf( "Desk_DeskMem_BufferEnsure buffer=%p, min=%i\n", buffer, min);

Desk_Debug_Assert( buffer);
Desk_Debug_Assert( buffer->increment > 0);
Desk_Debug_Assert( min>=0);

l = ( 1 + min/buffer->increment) * buffer->increment;

if ( l!=buffer->size)	{
	buffer->data	= Desk_DeskMem_Realloc( buffer->data, l);	
	buffer->size	= l;
	Desk_Debug2_Printf( "Desk_DeskMem_BufferEnsure - reallocating buffer %p, new datasize %i (size=%i)\n",
		buffer, min, l
		);
	}

buffer->datasize	= min;

return;
}




void	Desk_DeskMem_BufferInit( Desk_deskmem_buffer* buffer, int increment)
{
Desk_Debug_Assert( buffer);
Desk_Debug_Assert( increment>0);

Desk_Debug2_Printf( "Desk_DeskMem_BufferInit, buffer=%p, increment=%i\n", buffer, increment);

buffer->size		= 0;
buffer->datasize	= 0;
buffer->data		= Desk_DeskMem_Malloc( 0);
buffer->increment	= increment;

Desk_DeskMem_BufferEnsure( buffer, 0);
}




void	Desk_DeskMem_BufferEnsureExtra( Desk_deskmem_buffer *buffer, int extra)
{
Desk_DeskMem_BufferEnsure( buffer, buffer->datasize+extra);
}




void	Desk_DeskMem_BufferStrNCat( Desk_deskmem_buffer* buffer, const char* extra, int extralen)
{
int	oldlen;

Desk_Debug_Printf( "Desk_DeskMem_BufferStrNCat buffer=%p, extra=%p, extralen=%i\n",
	buffer, extra, extralen
	);

Desk_Debug_Assert( buffer);
Desk_Debug_Assert( extra);

oldlen	= (buffer->data) ? strlen( (char*) buffer->data) : 0;

Desk_Debug_Assert( oldlen < buffer->size);
Desk_Debug_Assert( oldlen < buffer->datasize);

Desk_DeskMem_BufferEnsure( buffer, oldlen + extralen + 1);

strncat( ((char*) buffer->data) + oldlen, extra, extralen);
}





void	Desk_DeskMem_BufferStrCat( Desk_deskmem_buffer* buffer, const char* extra)
{
Desk_Debug_Printf( "Desk_DeskMem_BufferStrCat buffer=%p, s=%p\n", buffer, extra);
Desk_Debug_Assert( extra);

Desk_DeskMem_BufferStrNCat( buffer, extra, strlen( extra));
}




void	Desk_DeskMem_BufferStrCpy( Desk_deskmem_buffer* buffer, const char* s)
{
Desk_Debug_Printf( "Desk_DeskMem_BufferStrCpy buffer=%p, s=%p\n", buffer, s);

Desk_Debug_Assert( s);
Desk_Debug_Assert( buffer);

Desk_DeskMem_BufferEnsure( buffer, 1 + strlen( s));

strcpy( (char*) buffer->data, s);

}
