From: Eli Zaretskii Date: Sun, 30 May 2021 08:16:59 +0000 (+0300) Subject: Don't account for character compositions in 'format' and friends X-Git-Tag: archive/raspbian/1%29.2+1-2+rpi1^2~5^2~18^2~2511 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=23ad0f0c5adbeda9a0bd346138e2950cb5e5a136;p=emacs.git Don't account for character compositions in 'format' and friends '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. --- diff --git a/src/character.c b/src/character.c index e874cf5e53c..70e68961a5d 100644 --- a/src/character.c +++ b/src/character.c @@ -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; } diff --git a/src/character.h b/src/character.h index 75351cd1edf..1a745484daa 100644 --- a/src/character.h +++ b/src/character.h @@ -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); diff --git a/src/editfns.c b/src/editfns.c index 182d3ba6f2b..aa0f46fea04 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -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