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);

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to