]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't account for character compositions in 'format' and friends
authorEli Zaretskii <eliz@gnu.org>
Sun, 30 May 2021 08:16:59 +0000 (11:16 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sun, 30 May 2021 08:16:59 +0000 (11:16 +0300)
'lisp_string_width' is called from 'format' and 'format-message',
which can be called both very early into Emacs initialization and in
other contexts where using the font backend is impossible or
undesirable.  So this commit changes 'lisp_string_width' to try
accounting for automatic compositions only when explicitly requested,
and only 'string-width' does that; 'format' and 'format-message'
don't.
* src/character.c (lisp_string_width): Accept an additional
argument AUTO_COMP; attempt accounting for auto-compositions only
if that argument is non-zero.  (Bug#48732)
* src/editfns.c (styled_format):
* src/character.c (Fstring_width): Callers of 'lisp_string_width'
adjusted.

src/character.c
src/character.h
src/editfns.c

index e874cf5e53ca3d621e64f115e28ab961dca95df4..70e68961a5d51351629676b95b8ed9b0b51a3654 100644 (file)
@@ -328,12 +328,14 @@ strwidth (const char *str, ptrdiff_t len)
    compositions.  If PRECISION > 0, return the width of longest
    substring that doesn't exceed PRECISION, and set number of
    characters and bytes of the substring in *NCHARS and *NBYTES
-   respectively.  FROM and TO are zero-based character indices
-   that define the substring of STRING to consider.  */
+   respectively.  FROM and TO are zero-based character indices that
+   define the substring of STRING to consider.  If AUTO_COMP is
+   non-zero, account for automatic compositions in STRING.  */
 
 ptrdiff_t
 lisp_string_width (Lisp_Object string, ptrdiff_t from, ptrdiff_t to,
-                  ptrdiff_t precision, ptrdiff_t *nchars, ptrdiff_t *nbytes)
+                  ptrdiff_t precision, ptrdiff_t *nchars, ptrdiff_t *nbytes,
+                  bool auto_comp)
 {
   /* This set multibyte to 0 even if STRING is multibyte when it
      contains only ascii and eight-bit-graphic, but that's
@@ -370,7 +372,8 @@ lisp_string_width (Lisp_Object string, ptrdiff_t from, ptrdiff_t to,
          bytes = string_char_to_byte (string, end) - i_byte;
        }
 #ifdef HAVE_WINDOW_SYSTEM
-      else if (f && FRAME_WINDOW_P (f)
+      else if (auto_comp
+              && f && FRAME_WINDOW_P (f)
               && multibyte
               && find_automatic_composition (i, -1, &ignore, &end, &val, string)
               && end > i)
@@ -471,7 +474,7 @@ usage: (string-width STRING &optional FROM TO)  */)
 
   CHECK_STRING (str);
   validate_subarray (str, from, to, SCHARS (str), &ifrom, &ito);
-  XSETFASTINT (val, lisp_string_width (str, ifrom, ito, -1, NULL, NULL));
+  XSETFASTINT (val, lisp_string_width (str, ifrom, ito, -1, NULL, NULL, true));
   return val;
 }
 
index 75351cd1edf7525f6785527897d2c89f953c1c76..1a745484daaee9e4934b7dc8b95f4f9e201216dd 100644 (file)
@@ -573,7 +573,7 @@ extern ptrdiff_t strwidth (const char *, ptrdiff_t);
 extern ptrdiff_t c_string_width (const unsigned char *, ptrdiff_t, int,
                                 ptrdiff_t *, ptrdiff_t *);
 extern ptrdiff_t lisp_string_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
-                                   ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
+                                   ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
 
 extern Lisp_Object Vchar_unify_table;
 extern Lisp_Object string_escape_byte8 (Lisp_Object);
index 182d3ba6f2b99a086690c856f6dfb992c97e9260..aa0f46fea04551aed228c6da14e0807954e71344 100644 (file)
@@ -3390,7 +3390,7 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message)
                  ptrdiff_t nch, nby;
                  nchars_string = SCHARS (arg);
                  width = lisp_string_width (arg, 0, nchars_string, prec,
-                                            &nch, &nby);
+                                            &nch, &nby, false);
                  if (prec < 0)
                    nbytes = SBYTES (arg);
                  else