emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/emacs-23 r100643: Take display-table into a


From: Kenichi Handa
Subject: [Emacs-diffs] /srv/bzr/emacs/emacs-23 r100643: Take display-table into account on calculating character/string width (#Bug#9496).
Date: Fri, 13 Jan 2012 14:47:59 +0900
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 100643 [merge]
committer: Kenichi Handa <address@hidden>
branch nick: emacs-23
timestamp: Fri 2012-01-13 14:47:59 +0900
message:
  Take display-table into account on calculating character/string width 
(#Bug#9496).
modified:
  src/ChangeLog
  src/character.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2012-01-12 10:41:16 +0000
+++ b/src/ChangeLog     2012-01-13 05:47:28 +0000
@@ -1,3 +1,9 @@
+2011-12-26  Kenichi Handa  <address@hidden>
+
+       * character.c (char_width): New function.
+       (Fchar_width, c_string_width, lisp_string_width): Use char_width
+       (Bug#9496).
+
 2012-01-12  Sven Joachim  <address@hidden>
 
        * s/gnu-linux.h: Use CRT_DIR.

=== modified file 'src/character.c'
--- a/src/character.c   2012-01-11 07:52:35 +0000
+++ b/src/character.c   2012-01-13 05:47:28 +0000
@@ -361,6 +361,31 @@
   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 @@
      (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 @@
 
   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 @@
          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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]