Hi all, The attached patch adds UTF-8 support to format_get_length() and format_real_length().
It's needed to, amongst others, properly compute the prompt length when the channel name is encoded in UTF-8. Greetings, Jean-Yves Lefort -- Jean-Yves Lefort [EMAIL PROTECTED] http://lefort.be.eu.org/
--- src/fe-common/core/formats.c.orig Thu Dec 4 16:02:48 2003
+++ src/fe-common/core/formats.c Thu Dec 4 16:36:52 2003
@@ -297,14 +297,44 @@
window_find_closest(server, target, level);
}
+static gboolean term_is_utf8 (void)
+{
+ const char *charset;
+
+ charset = settings_get_str("term_type");
+ if (*charset)
+ return ! g_strcasecmp(charset, "utf-8");
+
+ return g_get_charset(&charset);
+}
+
+static int advance (char const **str, gboolean utf8)
+{
+ if (utf8) {
+ gunichar c;
+
+ c = g_utf8_get_char(*str);
+ *str = g_utf8_next_char(*str);
+
+ return g_unichar_iswide(c) ? 2 : 1;
+ } else {
+ *str += 1;
+
+ return 1;
+ }
+}
+
/* Return length of text part in string (ie. without % codes) */
int format_get_length(const char *str)
{
GString *tmp;
int len;
+ gboolean utf8;
g_return_val_if_fail(str != NULL, 0);
+ utf8 = term_is_utf8() && g_utf8_validate(str, -1, NULL);
+
tmp = g_string_new(NULL);
len = 0;
while (*str != '\0') {
@@ -321,8 +351,7 @@
len++;
}
- len++;
- str++;
+ len += advance(&str, utf8);
}
g_string_free(tmp, TRUE);
@@ -336,10 +365,13 @@
{
GString *tmp;
const char *start;
+ gboolean utf8;
g_return_val_if_fail(str != NULL, 0);
g_return_val_if_fail(len >= 0, 0);
+ utf8 = term_is_utf8() && g_utf8_validate(str, -1, NULL);
+
start = str;
tmp = g_string_new(NULL);
while (*str != '\0' && len > 0) {
@@ -358,8 +390,7 @@
}
}
- len--;
- str++;
+ len -= advance(&str, utf8);
}
g_string_free(tmp, TRUE);
signature.asc
Description: This is a digitally signed message part
