X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=utf8.c;h=35faa6cc4bd52ba2fca0354bb6436900093d44b1;hp=b65b2a9c706cf5840b8f352eb9e7d4a94a79d42f;hb=90c36546d834608e1ce96f4142ef9a1f6b405a7c;hpb=6833ce8bdca2d64e14485118f2a4417b7e1cb1b1 diff --git a/utf8.c b/utf8.c index b65b2a9..35faa6c 100644 --- a/utf8.c +++ b/utf8.c @@ -1,3 +1,16 @@ +/* + * Copyright notice from original mutt: + * [none] + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + #ifndef HAVE_WC_FUNCS #include @@ -6,71 +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 */