diff --git a/src/core/network-openssl.c b/src/core/network-openssl.c index 547f86c1..68fb8ea8 100644 --- a/src/core/network-openssl.c +++ b/src/core/network-openssl.c @@ -277,7 +277,7 @@ static GIOStatus irssi_ssl_cert_step(GIOSSLChannel *chan) return G_IO_STATUS_ERROR; } -static GIOStatus irssi_ssl_read(GIOChannel *handle, gchar *buf, guint len, guint *ret, GError **gerr) +static GIOStatus irssi_ssl_read(GIOChannel *handle, gchar *buf, gsize len, gsize *ret, GError **gerr) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; gint err; diff --git a/src/fe-text/utf8.c b/src/fe-common/core/utf8.c similarity index 96% rename from src/fe-text/utf8.c rename to src/fe-common/core/utf8.c index 4049991d..ae235d34 100644 --- a/src/fe-text/utf8.c +++ b/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++; } diff --git a/src/fe-text/utf8.h b/src/fe-common/core/utf8.h similarity index 93% rename from src/fe-text/utf8.h rename to src/fe-common/core/utf8.h index 456c6bf8..996f51f3 100644 --- a/src/fe-text/utf8.h +++ b/src/fe-common/core/utf8.h @@ -2,7 +2,7 @@ #define __UTF8_H /* Returns -2 = invalid, -1 = need more data, otherwise unichar. */ -unichar get_utf8_char(const unsigned char **ptr, int len); +int get_utf8_char(const unsigned char **ptr, int len, unichar *chr_r); /* Returns length of UTF8 string */ int strlen_utf8(const char *str); diff --git a/src/fe-text/term-terminfo.c b/src/fe-text/term-terminfo.c index 21591889..5552d9cb 100644 --- a/src/fe-text/term-terminfo.c +++ b/src/fe-text/term-terminfo.c @@ -556,13 +556,12 @@ static int input_utf8(const unsigned char *buffer, int size, unichar *result) { const unsigned char *end = buffer; - *result = get_utf8_char(&end, size); - switch (*result) { - case (unichar) -2: + switch (get_utf8_char(&end, size, result)) { + case -2: /* not UTF8 - fallback to 8bit ascii */ *result = *buffer; return 1; - case (unichar) -1: + case -1: /* need more data */ return -1; default: diff --git a/src/fe-text/textbuffer-view.c b/src/fe-text/textbuffer-view.c index b8c12c07..906e5668 100644 --- a/src/fe-text/textbuffer-view.c +++ b/src/fe-text/textbuffer-view.c @@ -212,8 +212,7 @@ view_update_line_cache(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line) char_len++; next_ptr = ptr; - chr = get_utf8_char(&next_ptr, char_len); - if (chr < 0) + if (get_utf8_char(&next_ptr, char_len, &chr) < 0) char_len = 1; else char_len = utf8_width(chr); @@ -432,8 +431,11 @@ static int view_line_draw(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line, end = text; if (view->utf8) { - unichar chr = get_utf8_char(&end, 6); - char_width = utf8_width(chr); + unichar chr; + if (get_utf8_char(&end, 6, &chr)<0) + char_width = 1; + else + char_width = utf8_width(chr); } else { if (term_type == TERM_TYPE_BIG5 && is_big5(end[0], end[1]))