-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

I have investigated a more portable way of getting rid
of the warning on AMD64 regarding the log4cxx_intptr_t type.
This type is only used in StringHelper::formatHex(),
which iteself is again only used to convert the thread
id returned by apr_os_thread_current().
The APR itself already provides a portable way of converting
an apr_os_thread_id to a string by passing a special format
specifier to apr_snprintf(). Thus, my solution (patch attached)
is to use this portable method and to completely remove the
not-so-portable log4cxx_intptr_t type.
Drawback(?): this specific format specifier for apr_os_thread_id
was introduced as new feature with APR 1.2, which would mean
that APR 1.2 will be mandatory (not a big issue in my opinion)
starting with this patch.
Any comments?

Thanks and best Regards,

  Andreas

- --
Andreas Fester
mailto:[EMAIL PROTECTED]
WWW: http://www.littletux.net
ICQ: 326674288
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFDY1cjZ3bQVzeW+rsRAqFGAKCqeFiO2MaxSDjRxoJVGf1mSRfdtgCfRv8O
1dbI/zo7pIhzS2lJRMe6pzY=
=RLX4
-----END PGP SIGNATURE-----
diff -urN log4cxx-0.9.8.old/include/log4cxx/helpers/stringhelper.h log4cxx-0.9.8/include/log4cxx/helpers/stringhelper.h
--- log4cxx-0.9.8.old/include/log4cxx/helpers/stringhelper.h	2005-10-23 03:06:24.000000000 +0200
+++ log4cxx-0.9.8/include/log4cxx/helpers/stringhelper.h	2005-10-29 12:47:37.000000000 +0200
@@ -53,8 +53,6 @@
 
             static LogString toString(bool val);
 
-            static LogString formatHex(const void* handle);
-
             static std::string toLowerCase(const std::string& s);
 
             static bool getline(std::string& buf, std::string& line);
diff -urN log4cxx-0.9.8.old/include/log4cxx/private/log4cxx_private.h log4cxx-0.9.8/include/log4cxx/private/log4cxx_private.h
--- log4cxx-0.9.8.old/include/log4cxx/private/log4cxx_private.h	2005-10-23 03:07:57.000000000 +0200
+++ log4cxx-0.9.8/include/log4cxx/private/log4cxx_private.h	2005-10-29 12:47:55.000000000 +0200
@@ -43,11 +43,6 @@
 typedef log4cxx_int64_t log4cxx_time_t;
 typedef int log4cxx_status_t;
 
-//
-//   unsigned int same size as void*
-//
-typedef unsigned int log4cxx_intptr_t;
-
 #define LOG4CXX_LOCALE_ENCODING_UTF8 0
 #define LOG4CXX_LOCALE_ENCODING_ISO_8859_1 0
 #define LOG4CXX_LOCALE_ENCODING_US_ASCII 0
diff -urN log4cxx-0.9.8.old/src/loggingevent.cpp log4cxx-0.9.8/src/loggingevent.cpp
--- log4cxx-0.9.8.old/src/loggingevent.cpp	2005-10-15 09:34:35.000000000 +0200
+++ log4cxx-0.9.8/src/loggingevent.cpp	2005-10-29 12:45:39.000000000 +0200
@@ -26,9 +26,11 @@
 #include <log4cxx/helpers/socket.h>
 #include <log4cxx/helpers/aprinitializer.h>
 #include <log4cxx/helpers/threadspecificdata.h>
+#include <log4cxx/helpers/transcoder.h>
 
 #include <apr_time.h>
 #include <apr_portable.h>
+#include <apr_strings.h>
 #include <log4cxx/helpers/stringhelper.h>
 
 using namespace log4cxx;
@@ -192,7 +194,15 @@
 
 const LogString LoggingEvent::getCurrentThreadName() {
 #if APR_HAS_THREADS
-   return StringHelper::formatHex((const void*) apr_os_thread_current());
+   apr_os_thread_t threadId = apr_os_thread_current();
+
+   // apr_os_thread_t encoded in HEX takes needs as many characters
+   // as two times the size of the type, plus an additional null byte
+   char result[sizeof(apr_os_thread_t) * 2 + 1];
+   apr_snprintf(result, sizeof result, "%pt", threadId);
+
+   LOG4CXX_DECODE_CHAR(str, (const char*) result);
+   return LOG4CXX_STR("0x") + str;
 #else
    return LOG4CXX_STR("0x00000000");
 #endif
diff -urN log4cxx-0.9.8.old/src/stringhelper.cpp log4cxx-0.9.8/src/stringhelper.cpp
--- log4cxx-0.9.8.old/src/stringhelper.cpp	2005-10-23 03:06:24.000000000 +0200
+++ log4cxx-0.9.8/src/stringhelper.cpp	2005-10-29 12:47:15.000000000 +0200
@@ -281,21 +281,6 @@
 #endif
 
 
-
-LogString StringHelper::formatHex(const void* ptr) {
-    const logchar* hexdigits = LOG4CXX_STR("0123456789ABCDEF");
-    log4cxx_intptr_t iptr = (log4cxx_intptr_t) ptr;
-    int width = sizeof(ptr)*2 + 2;
-    LogString s(width, LOG4CXX_STR('x'));
-    s[0] = LOG4CXX_STR('0');
-    for(int i = width - 1; i >= 2; i--) {
-      s[i] = hexdigits[iptr & 0x0F];
-      iptr = iptr >> 4;
-    }
-    return s;
-}
-
-
 LogString StringHelper::format(const LogString& pattern, const std::vector<LogString>& params) {
 
   LogString result;
diff -urN log4cxx-0.9.8.old/tests/src/patternlayouttest.cpp log4cxx-0.9.8/tests/src/patternlayouttest.cpp
--- log4cxx-0.9.8.old/tests/src/patternlayouttest.cpp	2005-10-15 09:34:41.000000000 +0200
+++ log4cxx-0.9.8/tests/src/patternlayouttest.cpp	2005-10-29 12:27:53.000000000 +0200
@@ -283,7 +283,7 @@
                 //
                 //   combo of relative time and thread identifier
                 //     (the \\\\1 preserve a leading space)
-                Filter filter2(".*0x[0-9A-F]*]", "[main]");
+                Filter filter2(".*0x[0-9a-f]*]", "[main]");
 
                 std::vector<Filter *> filters;
 
diff -urN log4cxx-0.9.8.old/tests/src/util/threadfilter.cpp log4cxx-0.9.8/tests/src/util/threadfilter.cpp
--- log4cxx-0.9.8.old/tests/src/util/threadfilter.cpp	2005-10-15 09:34:41.000000000 +0200
+++ log4cxx-0.9.8/tests/src/util/threadfilter.cpp	2005-10-29 12:10:22.000000000 +0200
@@ -19,4 +19,4 @@
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 
-ThreadFilter::ThreadFilter() : Filter("\\[0x[0-9A-F]*]", "\\[main]") {}
+ThreadFilter::ThreadFilter() : Filter("\\[0x[0-9a-f]*]", "\\[main]") {}
diff -urN log4cxx-0.9.8.old/tests/src/util/xmlthreadfilter.cpp log4cxx-0.9.8/tests/src/util/xmlthreadfilter.cpp
--- log4cxx-0.9.8.old/tests/src/util/xmlthreadfilter.cpp	2005-10-15 09:34:41.000000000 +0200
+++ log4cxx-0.9.8/tests/src/util/xmlthreadfilter.cpp	2005-10-29 12:30:59.000000000 +0200
@@ -20,5 +20,5 @@
 using namespace log4cxx::helpers;
 
 XMLThreadFilter::XMLThreadFilter()
-     : Filter("0x[0-9A-F]*", "main") {
+     : Filter("0x[0-9a-f]*", "main") {
 }

Reply via email to