Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.4.0, 1.4.1, 1.5.0, 1.6.0
-
None
-
None
-
Microsoft Windows
Visual C++ 6.0
Description
The following are defined in axutil_utils_defines.h:
#if defined(WIN32)
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%I64d"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%I64u"
#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%I32d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%I32u"
#else
#if __WORDSIZE == 64
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%ld"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%lu"
#else
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%lld"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%llu"
#endif
#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u"
#endif
Microsoft Visual C++ 6.0 does not support I32 in the format string (though it does support I64).
sprintf(szBuf, AXIS2_PRINTF_INT32_FORMAT_SPECIFIER, 123456) yields the string "I32d".
This of course leads to invalid SOAP messages and various errors.
The fix is to use _MSC_VER to conditionally compile different format strings for VC+6 versus later versions of VC+ (which do support I32) like this:
#if defined(WIN32)
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%I64d"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%I64u"
#if _MSC_VER > 1200
#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%I32d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%I32u"
#else
#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u"
#endif
#else
#if __WORDSIZE == 64
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%ld"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%lu"
#else
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%lld"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%llu"
#endif
#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u"
#endif
AXIS2C-1295 seems to be referring to this problem as well.