diff src/mbyte.c @ 2338:da6ec32d8d8f vim73

Added strwidth() and strchars() functions.
author Bram Moolenaar <bram@vim.org>
date Sun, 18 Jul 2010 15:31:08 +0200
parents ccda151dde4e
children 073ff46fe397
line wrap: on
line diff
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -1579,6 +1579,23 @@ dbcs_char2cells(c)
 }
 
 /*
+ * Return the number of cells occupied by string "p".
+ * Stop at a NUL character.  When "len" >= 0 stop at character "p[len]".
+ */
+    int
+mb_string2cells(p, len)
+    char_u  *p;
+    int	    len;
+{
+    int i;
+    int clen = 0;
+
+    for (i = 0; (len < 0 || i < len) && p[i] != NUL; i += (*mb_ptr2len)(p + i))
+	clen += (*mb_ptr2cells)(p + i);
+    return clen;
+}
+
+/*
  * mb_off2cells() function pointer.
  * Return number of display cells for char at ScreenLines[off].
  * We make sure that the offset used is less than "max_off".
@@ -4364,12 +4381,12 @@ im_commit_cb(GtkIMContext *context UNUSE
 	     const gchar *str,
 	     gpointer data UNUSED)
 {
-    int	slen = (int)STRLEN(str);
-    int	add_to_input = TRUE;
-    int	clen;
-    int	len = slen;
-    int	commit_with_preedit = TRUE;
-    char_u	*im_str, *p;
+    int		slen = (int)STRLEN(str);
+    int		add_to_input = TRUE;
+    int		clen;
+    int		len = slen;
+    int		commit_with_preedit = TRUE;
+    char_u	*im_str;
 
 #ifdef XIM_DEBUG
     xim_log("im_commit_cb(): %s\n", str);
@@ -4402,9 +4419,9 @@ im_commit_cb(GtkIMContext *context UNUSE
     }
     else
 	im_str = (char_u *)str;
-    clen = 0;
-    for (p = im_str; p < im_str + len; p += (*mb_ptr2len)(p))
-	clen += (*mb_ptr2cells)(p);
+
+    clen = mb_string2cells(im_str, len);
+
     if (input_conv.vc_type != CONV_NONE)
 	vim_free(im_str);
     preedit_start_col += clen;