From: Pierre Habouzit Date: Mon, 13 Nov 2006 01:42:31 +0000 (+0100) Subject: make taht shorter X-Git-Url: http://git.madism.org/?a=commitdiff_plain;h=90c36546d834608e1ce96f4142ef9a1f6b405a7c;p=apps%2Fmadmutt.git make taht shorter Signed-off-by: Pierre Habouzit --- diff --git a/utf8.c b/utf8.c index c25a84b..35faa6c 100644 --- a/utf8.c +++ b/utf8.c @@ -19,60 +19,30 @@ #define EILSEQ EINVAL #endif -int mutt_wctoutf8 (char *s, unsigned int c) +int mutt_wctoutf8(char *p, unsigned int c) { - if (c < (1 << 7)) { - if (s) - *s++ = c; - return 1; - } - else if (c < (1 << 11)) { - if (s) { - *s++ = 0xc0 | (c >> 6); - *s++ = 0x80 | (c & 0x3f); - } - return 2; - } - else if (c < (1 << 16)) { - if (s) { - *s++ = 0xe0 | (c >> 12); - *s++ = 0x80 | ((c >> 6) & 0x3f); - *s++ = 0x80 | (c & 0x3f); - } - return 3; - } - else if (c < (1 << 21)) { - if (s) { - *s++ = 0xf0 | (c >> 18); - *s++ = 0x80 | ((c >> 12) & 0x3f); - *s++ = 0x80 | ((c >> 6) & 0x3f); - *s++ = 0x80 | (c & 0x3f); - } - return 4; - } - else if (c < (1 << 26)) { - if (s) { - *s++ = 0xf8 | (c >> 24); - *s++ = 0x80 | ((c >> 18) & 0x3f); - *s++ = 0x80 | ((c >> 12) & 0x3f); - *s++ = 0x80 | ((c >> 6) & 0x3f); - *s++ = 0x80 | (c & 0x3f); + static unsigned char const mark[7] = { + 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC + }; + + int bytes; + + if (c >= 0x200000) { + errno = EILSEQ; + return -1; } - return 5; - } - else if (c < (1 << 31)) { - if (s) { - *s++ = 0xfc | (c >> 30); - *s++ = 0x80 | ((c >> 24) & 0x3f); - *s++ = 0x80 | ((c >> 18) & 0x3f); - *s++ = 0x80 | ((c >> 12) & 0x3f); - *s++ = 0x80 | ((c >> 6) & 0x3f); - *s++ = 0x80 | (c & 0x3f); + + bytes = 1 + (c >= 0x80) + (c >= 0x800) + (c >= 0x10000); + p += bytes; + + switch (bytes) { + case 4: *--p = (c | 0x80) & 0xbf; c >>= 6; + case 3: *--p = (c | 0x80) & 0xbf; c >>= 6; + case 2: *--p = (c | 0x80) & 0xbf; c >>= 6; + case 1: *--p = c | mark[bytes]; } - return 6; - } - errno = EILSEQ; - return -1; + + return bytes; } #endif /* !HAVE_WC_FUNCS */