From: Kenichi Handa Date: Fri, 13 Jan 2012 05:47:28 +0000 (+0900) Subject: Take display-table into account on calculating character/string width (#Bug#9496). X-Git-Url: http://git.hcoop.net/bpt/emacs.git/commitdiff_plain/25ed9e61dbea0a7a4f4a84288000bc30ebd7ac87 Take display-table into account on calculating character/string width (#Bug#9496). --- diff --git a/src/ChangeLog b/src/ChangeLog index 6255419050..4c657ae64e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2011-12-26 Kenichi Handa + + * character.c (char_width): New function. + (Fchar_width, c_string_width, lisp_string_width): Use char_width + (Bug#9496). + 2012-01-12 Sven Joachim * s/gnu-linux.h: Use CRT_DIR. diff --git a/src/character.c b/src/character.c index 75ec720aec..0409f30dc0 100644 --- a/src/character.c +++ b/src/character.c @@ -361,6 +361,31 @@ usage: (char-bytes CHAR) */) return make_number (1); } + +/* Return width (columns) of C considering the buffer display table DP. */ + +static int +char_width (int c, struct Lisp_Char_Table *dp) +{ + int width = CHAR_WIDTH (c); + + if (dp) + { + Lisp_Object disp = DISP_CHAR_VECTOR (dp, c), ch; + int i; + + if (VECTORP (disp)) + for (i = 0, width = 0; i < ASIZE (disp); i++) + { + ch = AREF (disp, i); + if (CHARACTERP (ch)) + width += CHAR_WIDTH (XFASTINT (ch)); + } + } + return width; +} + + DEFUN ("char-width", Fchar_width, Schar_width, 1, 1, 0, doc: /* Return width of CHAR when displayed in the current buffer. The width is measured by how many columns it occupies on the screen. @@ -369,21 +394,12 @@ usage: (char-width CHAR) */) (ch) Lisp_Object ch; { - Lisp_Object disp; int c, width; - struct Lisp_Char_Table *dp = buffer_display_table (); CHECK_CHARACTER (ch); c = XINT (ch); - /* Get the way the display table would display it. */ - disp = dp ? DISP_CHAR_VECTOR (dp, c) : Qnil; - - if (VECTORP (disp)) - width = ASIZE (disp); - else - width = CHAR_WIDTH (c); - + width = char_width (c, buffer_display_table ()); return make_number (width); } @@ -403,22 +419,9 @@ c_string_width (const unsigned char *str, int len, int precision, int *nchars, i while (i_byte < len) { - int bytes, thiswidth; - Lisp_Object val; + int bytes; int c = STRING_CHAR_AND_LENGTH (str + i_byte, bytes); - - if (dp) - { - val = DISP_CHAR_VECTOR (dp, c); - if (VECTORP (val)) - thiswidth = XVECTOR_SIZE (val); - else - thiswidth = CHAR_WIDTH (c); - } - else - { - thiswidth = CHAR_WIDTH (c); - } + int thiswidth = char_width (c, dp); if (precision > 0 && (width + thiswidth > precision)) @@ -499,18 +502,7 @@ lisp_string_width (string, precision, nchars, nbytes) else c = str[i_byte], bytes = 1; chars = 1; - if (dp) - { - val = DISP_CHAR_VECTOR (dp, c); - if (VECTORP (val)) - thiswidth = XVECTOR_SIZE (val); - else - thiswidth = CHAR_WIDTH (c); - } - else - { - thiswidth = CHAR_WIDTH (c); - } + thiswidth = char_width (c, dp); } if (precision > 0