X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Ffe-common%2Fcore%2Futf8.c;fp=apps%2Firssi%2Fsrc%2Ffe-text%2Futf8.c;h=eaa77674e5527c53a9ad0cf3b99fcd2a0ba01296;hb=63ca577177f9f5db8e553372a9793b0c85f10715;hp=4049991db524c3f5d4d464382d97b3369c6cb1d2;hpb=60c165f23f8d5553bd8b4fd43366fbf5f24c2832;p=silc.git diff --git a/apps/irssi/src/fe-text/utf8.c b/apps/irssi/src/fe-common/core/utf8.c similarity index 92% rename from apps/irssi/src/fe-text/utf8.c rename to apps/irssi/src/fe-common/core/utf8.c index 4049991d..eaa77674 100644 --- a/apps/irssi/src/fe-text/utf8.c +++ b/apps/irssi/src/fe-common/core/utf8.c @@ -76,22 +76,23 @@ (Result) |= ((Chars)[(Count)] & 0x3f); \ } -unichar get_utf8_char(const unsigned char **ptr, int len) +int get_utf8_char(const unsigned char **ptr, int len, unichar *chr_r) { int i, result, mask, chrlen; mask = 0; UTF8_COMPUTE(**ptr, mask, chrlen); if (chrlen == -1) - return (unichar) -2; + return -2; if (chrlen > len) - return (unichar) -1; + return -1; UTF8_GET(result, *ptr, i, mask, chrlen); if (result == -1) - return (unichar) -2; - + return -2; + + *chr_r = (unichar) result; *ptr += chrlen-1; return result; } @@ -100,9 +101,10 @@ int strlen_utf8(const char *str) { const unsigned char *p = (const unsigned char *) str; int len; + unichar chr_r; len = 0; - while (*p != '\0' && get_utf8_char(&p, 6) > 0) { + while (*p != '\0' && get_utf8_char(&p, 6, &chr_r) > 0) { len++; p++; } @@ -180,6 +182,24 @@ void utf16_to_utf8(const unichar *str, char *out) *out = '\0'; } +void utf16_to_utf8_with_pos(const unichar *str, int spos, char *out, int *opos) +{ + int len; + const unichar *sstart = str; + char *ostart = out; + + *opos = 0; + while (*str != '\0') { + len = utf16_char_to_utf8(*str, out); + out += len; + + str++; + if(str - sstart == spos) + *opos = out - ostart; + } + *out = '\0'; +} + static const unichar wcc[] = { 0x0, 0x300, 0x34F, 0x360, 0x363, 0x483, 0x487, 0x488, 0x48A, 0x591, 0x5A2, 0x5A3, 0x5BA, 0x5BB, 0x5BE, 0x5BF, 0x5C0, 0x5C1, 0x5C3, 0x5C4,