diff options
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1d72c0d..e52d628 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4737,6 +4737,7 @@ formatint(Py_UNICODE *buf, + 1 + 1 = 24*/ char fmt[64]; /* plenty big enough! */ long x; + int use_native_c_format = 1; x = PyInt_AsLong(v); if (x == -1 && PyErr_Occurred()) @@ -4753,11 +4754,21 @@ formatint(Py_UNICODE *buf, /* When converting 0 under %#x or %#X, C leaves off the base marker, * but we want it (for consistency with other %#x conversions, and * for consistency with Python's hex() function). + * BUG 28-Apr-2001 tim: At least two platform Cs (Metrowerks & + * Compaq Tru64) violate the std by converting 0 w/ leading 0x anyway. + * So add it only if the platform doesn't already. */ - if (x == 0 && (flags & F_ALT) && (type == 'x' || type == 'X')) - sprintf(fmt, "0%c%%%s.%dl%c", type, "#", prec, type); - else - sprintf(fmt, "%%%s.%dl%c", (flags & F_ALT) ? "#" : "", prec, type); + if (x == 0 && (flags & F_ALT) && (type == 'x' || type == 'X')) { + /* Only way to know what the platform does is to try it. */ + sprintf(fmt, type == 'x' ? "%#x" : "%#X", 0); + if (fmt[1] != (char)type) { + /* Supply our own leading 0x/0X -- needed under std C */ + use_native_c_format = 0; + sprintf(fmt, "0%c%%#.%dl%c", type, prec, type); + } + } + if (use_native_c_format) + sprintf(fmt, "%%%s.%dl%c", (flags & F_ALT) ? "#" : "", prec, type); return usprintf(buf, fmt, x); } |