carnold 2004/12/14 11:03:14
Modified: include/log4cxx/helpers transcoder.h
src transcoder.cpp
Log:
LOGCXX-10: tcharh/Unicode Windows iter
Revision Changes Path
1.4 +0 -8 logging-log4cxx/include/log4cxx/helpers/transcoder.h
Index: transcoder.h
===================================================================
RCS file: /home/cvs/logging-log4cxx/include/log4cxx/helpers/transcoder.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- transcoder.h 13 Dec 2004 05:05:13 -0000 1.3
+++ transcoder.h 14 Dec 2004 19:03:14 -0000 1.4
@@ -84,14 +84,6 @@
};
static const char SUBSTITUTION_CHAR = '?';
static const wchar_t SUBSTITUTION_WCHAR = L'?';
-
-#if !defined(_GCC_VER_)
- struct mbstate_t {};
- size_t mbsnrtowcs(wchar_t *dest, const char **src,
- size_t nms, size_t len, mbstate_t *ps);
- size_t wcsnrtombs(char *dest, const wchar_t **src, size_t nwc,
- size_t len, mbstate_t *ps);
-#endif
}
};
1.3 +52 -2 logging-log4cxx/src/transcoder.cpp
Index: transcoder.cpp
===================================================================
RCS file: /home/cvs/logging-log4cxx/src/transcoder.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- transcoder.cpp 13 Dec 2004 05:05:13 -0000 1.2
+++ transcoder.cpp 14 Dec 2004 19:03:14 -0000 1.3
@@ -15,7 +15,8 @@
*/
#include <log4cxx/helpers/transcoder.h>
-#include <log4cxx/helpers/pool.h>
+#include <log4cxx/helpers/pool.h>
+#include <stdlib.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
@@ -26,7 +27,56 @@
* Appends an external string to an
* internal string.
*/
-#if defined(LOG4CXX_LOGCHAR_IS_WCHAR)
+#if defined(LOG4CXX_LOGCHAR_IS_WCHAR)
+
+
+#if !defined(_GCC_VER_)
+namespace log4cxx {
+ struct mbstate_t {};
+ size_t mbsnrtowcs(wchar_t *dest, const char **src,
+ size_t srclenin, size_t destlenin, mbstate_t *ps) {
+ size_t destlen = destlenin;
+ size_t srclen = srclenin;
+ size_t mblen = -1;
+ while(srclen > 0 && destlen > 0) {
+ mblen = mbtowc(dest, *src, srclen);
+ if (mblen <= 0) break;
+ *src += mblen;
+ *dest++;
+ destlen--;
+ srclen -= mblen;
+ }
+ if (mblen < 0) {
+ return mblen;
+ }
+ return destlenin - destlen;
+ }
+
+ size_t wcsnrtombs(char *dest, const wchar_t **src, size_t srclenin,
+ size_t destlenin, mbstate_t *ps) {
+ size_t destlen = destlenin;
+ size_t srclen = srclenin;
+ size_t mblen = -1;
+ char buf[12];
+ while(srclen > 0 && destlen > 0) {
+ mblen = wctomb(buf, **src);
+ if (mblen <= 0) break;
+ *src++;
+ memcpy(dest, buf, mblen);
+ *dest += mblen;
+ destlen -= mblen;
+ srclen--;
+ }
+ if (mblen < 0) {
+ return mblen;
+ }
+ return destlenin - destlen;
+ }
+}
+#endif
+
+
+
void Transcoder::decode(const char* src, size_t len, LogString& dst) {
wchar_t buf[BUFSIZE];
mbstate_t ps;