From 0f706daceed7a4bcb7c8fd3fc88be799b42d7caa Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Fri, 25 Jul 1997 08:01:02 +0000 Subject: (compute_motion): Handle display table correctly for multibyte characters. --- src/indent.c | 50 ++++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/indent.c b/src/indent.c index ab82f8212b..6f2738b416 100644 --- a/src/indent.c +++ b/src/indent.c @@ -1327,42 +1327,36 @@ compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos, width, { /* 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); - 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 ++; - } + c = STRING_CHAR_AND_LENGTH (ptr, len, actual_len); + + 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; - - 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; + int width = WIDTH_BY_CHAR_HEAD (*ptr); + hpos += width; + if (width > 1) + wide_column = 1; } + + pos += actual_len; } else hpos += (ctl_arrow && c < 0200) ? 2 : 4; -- cgit v1.2.3