/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
* 
* Distributable under the terms of either the Apache License (Version 2.0) or 
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#include "CLucene/StdHeader.h"
#include "CLucene/util/StringBuffer.h"

#ifdef __CL_INCLUDE_TPRINTF

CL_NS_USE(util)

//print a variable argument to a stream
//currently special number formatting is not supported. it is very minimalistic
void lucene_vfnwprintf(StringBuffer* buffer, size_t count, const wchar_t * format, va_list& valist){
	const wchar_t *iter = format;
	StringBuffer* tmp = NULL;
	if ( buffer == NULL )
		tmp = _CLNEW StringBuffer;
	else
		tmp = buffer;

	while (*iter)
	{
		while (*iter && *iter != '%')
		{
			tmp->appendChar(*iter++);
		}
		if (*iter == '%')
		{
			if (iter[1] == '%')
			{
				//just print a %
				tmp->appendChar('%');
				iter += 2;
				continue;
			}

			iter++;
			switch (*iter)
			{
				case 's':
				{
					//todo: this is faulty. it doesn't heed count

					//print a string or null
					TCHAR *wstr = va_arg(valist, TCHAR *);
					if ( !wstr )
						wstr = _T("(null)");

					tmp->append(wstr);
					iter++;
					break;
				}

				case 'c':
					tmp->appendChar((TCHAR)va_arg(valist, int));
					iter++;
					break;

				default:
				{
					//todo: this is faulty. it doesn't heed count

					if (*iter == 'p')
						tmp->appendInt((int32_t)va_arg(valist, long));
					else
					{
						if (*iter == 'a' || *iter == 'A' ||
							*iter == 'e' || *iter == 'E' ||
							*iter == 'f' || *iter == 'F' || 
							*iter == 'g' || *iter == 'G')
							tmp->appendFloat((qreal)va_arg(valist, double),8);
						else if (*iter == 'd' || *iter == 'i' ){
							tmp->appendInt((int32_t)va_arg(valist, int));
						}else if (*iter == 'l' ){
							TCHAR b[100];
							_i64tot((int64_t)va_arg(valist, int64_t),b,10);
							tmp->append(b);
						}/*else{
							TCHAR b[100];
							_i64tot((int64_t)va_arg(valist, void*),b,10);
							tmp->append(b);
						}*/
					}
					iter++;
					break;
				}
			}
		}
	}

	
	if ( buffer == NULL ){
		//we are supposed to be writing to the console
#ifdef _UCS2
		TCHAR* pointer = tmp->getBuffer();
		char ob[MB_LEN_MAX];
		size_t v;
		size_t len = tmp->length();
		for (size_t i=0;i<len;i++){
			v = wctomb(ob,*pointer);
			if ( v > 0 ){
				ob[v]='\0';
				fputs(ob,stdout);
			}
			pointer++;
		}
		

#else
		fputs(tmp->getBuffer(),stdout);
#endif
		_CLDELETE(tmp);
	}
}

//print a list of arguments to a string
int lucene_snwprintf(wchar_t* strbuf, size_t count, const wchar_t * format, ...){
	va_list ap;
    va_start(ap, format);
	StringBuffer buffer;
    lucene_vfnwprintf(&buffer,count,format,ap);
    va_end(ap);

	size_t ret = min(count,(size_t)(buffer.length()+1));
	_tcsncpy(strbuf,buffer.getBuffer(),ret);
    return ret;
}

//print a list of arguments to the stdout
void lucene_wprintf(const wchar_t * format, ...){
	va_list ap;
    va_start(ap, format);
	lucene_vfnwprintf(NULL,LUCENE_INT32_MAX_SHOULDBE,format,ap);
    va_end(ap);
}

//print a variable argument to a string
int lucene_vsnwprintf(wchar_t * strbuf, size_t count, const wchar_t * format, va_list& ap){
	StringBuffer buffer;
    lucene_vfnwprintf(&buffer,count,format,ap);
	int ret = min((int32_t)count,buffer.length()+1);
	_tcsncpy(strbuf,buffer.getBuffer(),ret);
    return ret;
}

#endif //__CL_INCLUDE_TPRINTF
