#include <string.h>

#include "swis.h"

#include "Desk.Debug.h"
#include "Desk.DeskMem.h"
#include "Desk.MsgTrans.h"
#include "Desk.Error2.h"


int	Desk_MessageTrans_LookupGetSize( 
		Desk_msgtrans_filedesc*	filedesc, 
		const char*		token, 
		const char*		p0, 
		const char*		p1, 
		const char*		p2, 
		const char*		p3
		)
	{
	char*	buffer = NULL;
	int	buffsize;
	int	size;
	
	Desk_Error2_Try	{
		for( buffer=NULL, buffsize=32; ; buffsize*=2)	{
			Desk_DeskMem_Free( buffer);
			buffer = (char*) Desk_DeskMem_Malloc( buffsize);
			Desk_Error2_CheckOS(
				_swix( MessageTrans_Lookup, _INR(0,7) | _OUT(3),
					filedesc, token, buffer, buffsize, p0, p1, p2, p3,
					&size
					)
				);
			
			Desk_Debug3_Printf( Desk_error_PLACE "Desk_MessageTrans_LookupGetSize, buffsize=%i, returned size=%i\n",
				buffsize, size
				);
			
			if ( size < buffsize-1)	break;	/* Generated string+terminator is smaller than buffer, so no truncation occurred	*/
			}
		}
	Desk_Error2_Catch	{
		Desk_DeskMem_Free( buffer);
		Desk_Error2_ReThrow();
		}
	Desk_Error2_EndCatch
	
	Desk_DeskMem_Free( buffer);
	Desk_Debug2_Printf( Desk_error_PLACE "Desk_MessageTrans_LookupGetSize returning %i\n", size);
	return size;
	}



void	Desk_MessageTrans_LookupIntoBufferPos( 
		Desk_deskmem_buffer*	buffer,
		int			pos,
		Desk_msgtrans_filedesc*	filedesc,
		const char*		token,
		const char*		p0,
		const char*		p1,
		const char*		p2,
		const char*		p3
		)
	{
	int	size = 1 + Desk_MessageTrans_LookupGetSize( filedesc, token, p0, p1, p2, p3);
	Desk_DeskMem_BufferEnsure( buffer, pos + size);
	/*Desk_MessageTrans_Lookup( filedesc, (char*) token, &bufferptr, &size, (char*) p0, (char*) p1, (char*) p2, (char*) p3);*/
	Desk_Error2_CheckOS(
		_swix( MessageTrans_Lookup, _INR(0,7),
			filedesc, token, Desk_DeskMem_BufferGetString( buffer) + pos, size, p0, p1, p2, p3
			)
		);
	
	Desk_Debug4_Printf( Desk_error_PLACE "strlen=%i\n", strlen( Desk_DeskMem_BufferGetString( buffer)));
	Desk_Debug4_Printf( Desk_error_PLACE "'%s'\n", Desk_DeskMem_BufferGetString( buffer)+pos);
	Desk_Debug_Assert( pos + strlen( Desk_DeskMem_BufferGetString( buffer) + pos) < Desk_DeskMem_BufferGetDataSize( buffer));
	}


void	Desk_MessageTrans_LookupIntoBufferCat( 
		Desk_deskmem_buffer*	buffer,
		Desk_msgtrans_filedesc*	filedesc,
		const char*		token,
		const char*		p0,
		const char*		p1,
		const char*		p2,
		const char*		p3
		)
	{
	Desk_MessageTrans_LookupIntoBufferPos( buffer, strlen( Desk_DeskMem_BufferGetString( buffer)), filedesc, token, p0, p1, p2, p3);
	}


void	Desk_MessageTrans_LookupIntoBuffer( 
		Desk_deskmem_buffer*	buffer,
		Desk_msgtrans_filedesc*	filedesc,
		const char*		token,
		const char*		p0,
		const char*		p1,
		const char*		p2,
		const char*		p3
		)
	{
	Desk_MessageTrans_LookupIntoBufferPos( buffer, 0, filedesc, token, p0, p1, p2, p3);
	}


