From e115ec832c8ba6f184a78b0565736298338da61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lemburg?= Date: Wed, 19 Oct 2005 22:33:31 +0000 Subject: Bug fix for [ 1331062 ] utf 7 codec broken. Backport candidate. --- Objects/unicodeobject.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 7ab4d0c..9a28c56 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -843,15 +843,23 @@ char utf7_special[128] = { }; +/* Note: The comparison (c) <= 0 is a trick to work-around gcc + warnings about the comparison always being false; since + utf7_special[0] is 1, we can safely make that one comparison + true */ + #define SPECIAL(c, encodeO, encodeWS) \ - (((c)>127 || utf7_special[(c)] == 1) || \ + ((c) > 127 || (c) <= 0 || utf7_special[(c)] == 1 || \ (encodeWS && (utf7_special[(c)] == 2)) || \ (encodeO && (utf7_special[(c)] == 3))) -#define B64(n) ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(n) & 0x3f]) -#define B64CHAR(c) (isalnum(c) || (c) == '+' || (c) == '/') -#define UB64(c) ((c) == '+' ? 62 : (c) == '/' ? 63 : (c) >= 'a' ? \ - (c) - 71 : (c) >= 'A' ? (c) - 65 : (c) + 4) +#define B64(n) \ + ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(n) & 0x3f]) +#define B64CHAR(c) \ + (isalnum(c) || (c) == '+' || (c) == '/') +#define UB64(c) \ + ((c) == '+' ? 62 : (c) == '/' ? 63 : (c) >= 'a' ? \ + (c) - 71 : (c) >= 'A' ? (c) - 65 : (c) + 4 ) #define ENCODE(out, ch, bits) \ while (bits >= 6) { \ @@ -864,8 +872,8 @@ char utf7_special[128] = { Py_UNICODE outCh = (Py_UNICODE) ((ch >> (bits-16)) & 0xffff); \ bits -= 16; \ if (surrogate) { \ - /* We have already generated an error for the high surrogate - so let's not bother seeing if the low surrogate is correct or not */\ + /* We have already generated an error for the high surrogate \ + so let's not bother seeing if the low surrogate is correct or not */ \ surrogate = 0; \ } else if (0xDC00 <= outCh && outCh <= 0xDFFF) { \ /* This is a surrogate pair. Unfortunately we can't represent \ @@ -876,7 +884,7 @@ char utf7_special[128] = { } else { \ *out++ = outCh; \ } \ - } \ + } PyObject *PyUnicode_DecodeUTF7(const char *s, int size, -- cgit v0.12