summaryrefslogtreecommitdiffstats
path: root/3rdparty/clucene/src/CLucene/config/repl_tprintf.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/clucene/src/CLucene/config/repl_tprintf.cpp')
-rw-r--r--3rdparty/clucene/src/CLucene/config/repl_tprintf.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/3rdparty/clucene/src/CLucene/config/repl_tprintf.cpp b/3rdparty/clucene/src/CLucene/config/repl_tprintf.cpp
new file mode 100644
index 000000000..62cecb78b
--- /dev/null
+++ b/3rdparty/clucene/src/CLucene/config/repl_tprintf.cpp
@@ -0,0 +1,149 @@
+/*------------------------------------------------------------------------------
+* 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