diff options
author | Chih-Hsuan Yen <yan12125@gmail.com> | 2020-09-13 16:41:40 +0800 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2020-09-23 17:12:01 +1000 |
commit | 4533c6a8e0f39c7707e671b7f9687607b46f1417 (patch) | |
tree | a703a8c6a108b8b25727d5ad2bb7c64ae4455462 | |
parent | ff7ff3c58dcdb858c253e8e7fea1d758cdff0312 (diff) | |
download | pacman-4533c6a8e0f39c7707e671b7f9687607b46f1417.tar.gz pacman-4533c6a8e0f39c7707e671b7f9687607b46f1417.zip |
util.c: table_print_line: properly align texts involving CJK
For printf in C, width is counted as bytes rather than Unicode width. [1]
> If the precision is specified, no more than that many bytes are written.
[1] Section 7.21.6, N2176, final draft for ISO/IEC 9899:2017 (C18)
Thanks Andrew Gregory for suggesting a simpler approach.
Fixes FS#59229
Signed-off-by: Chih-Hsuan Yen <yan12125@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r-- | src/pacman/util.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/pacman/util.c b/src/pacman/util.c index e9187529..0c6a0c09 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -522,7 +522,9 @@ static void table_print_line(const alpm_list_t *line, short col_padding, continue; } - cell_width = (cell->mode & CELL_RIGHT_ALIGN ? (int)widths[i] : -(int)widths[i]); + /* calculate cell width, adjusting for multi-byte character strings */ + cell_width = (int)widths[i] - string_length(str) + strlen(str); + cell_width = cell->mode & CELL_RIGHT_ALIGN ? cell_width : -cell_width; if(need_padding) { printf("%*s", col_padding, ""); |