changeset 18977:801bc19b01dc

(compute_motion): Handle display table correctly for multibyte characters.
author Kenichi Handa <handa@m17n.org>
date Fri, 25 Jul 1997 08:01:02 +0000
parents ebb3e71c6dfd
children 0f01c27a9756
files src/indent.c
diffstat 1 files changed, 22 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/indent.c	Fri Jul 25 07:53:16 1997 +0000
+++ b/src/indent.c	Fri Jul 25 08:01:02 1997 +0000
@@ -1327,42 +1327,36 @@
 	    {
 	      /* Start of multi-byte form.  */
 	      unsigned char *ptr;
+	      int len, actual_len;
 
 	      pos--;		/* rewind POS */
-	      ptr = POS_ADDR (pos);
 
-	      if (c == LEADING_CODE_COMPOSITION)
-		{
-		  int cmpchar_id = str_cmpchar_id (ptr, next_boundary - pos);
+	      ptr = (((pos) >= GPT ? GAP_SIZE : 0) + (pos) + BEG_ADDR - 1);
+	      len = ((pos) >= GPT ? ZV : GPT) - (pos);
+
+	      c = STRING_CHAR_AND_LENGTH (ptr, len, actual_len);
 
-		  if (cmpchar_id >= 0)
-		    {
-		      if (cmpchar_table[cmpchar_id]->width >= 2)
-			wide_column = 1;
-		      hpos += cmpchar_table[cmpchar_id]->width;
-		      pos += cmpchar_table[cmpchar_id]->len;
-		    }
-		  else
-		    {		/* invalid composite character */
-		      hpos += 4;
-		      pos ++;
-		    }
+	      if (dp != 0 && VECTORP (DISP_CHAR_VECTOR (dp, c)))
+		hpos += XVECTOR (DISP_CHAR_VECTOR (dp, c))->size;
+	      else if (actual_len == 1)
+		hpos += 4;
+	      else if (COMPOSITE_CHAR_P (c))
+		{
+		  int id = COMPOSITE_CHAR_ID (c);
+		  int width = (id < n_cmpchars) ? cmpchar_table[id]->width : 0;
+		  hpos += width;
+		  if (width > 1)
+		    wide_column = 1;
 		}
 	      else
 		{
-		  /* Here, we check that the following bytes are valid
-		     constituents of multi-byte form.  */
-		  int len = BYTES_BY_CHAR_HEAD (c), i;
+		  int width = WIDTH_BY_CHAR_HEAD (*ptr);
+		  hpos += width;
+		  if (width > 1)
+		    wide_column = 1;
+		}
 
-		  for (i = 1, ptr++; i < len; i++, ptr++)
-		    /* We don't need range checking for PTR because
-		       there are anchors ('\0') both at GPT and Z.  */
-		    if (CHAR_HEAD_P (ptr)) break;
-		  if (i < len)
-		    hpos += 4, pos++;
-		  else
-		    hpos += WIDTH_BY_CHAR_HEAD (c), pos += i, wide_column = 1;
-		}
+	      pos += actual_len;
 	    }
 	  else
 	    hpos += (ctl_arrow && c < 0200) ? 2 : 4;