[pacman-dev] [PATCH] util.c: table_print_line: properly align texts involving CJK

Chih-Hsuan Yen yan12125 at gmail.com
Sun Sep 13 08:43:37 UTC 2020


Andrew Gregory <andrew.gregory.8 at gmail.com> 於 2020年9月13日 週日 上午6:49寫道:
>
> On 09/12/20 at 04:25pm, Chih-Hsuan Yen wrote:
> > Fixes FS#59229
> >
> > Signed-off-by: Chih-Hsuan Yen <yan12125 at gmail.com>
> > ---
> >  src/pacman/util.c | 20 +++++++++++++++-----
> >  1 file changed, 15 insertions(+), 5 deletions(-)
> >
> > diff --git a/src/pacman/util.c b/src/pacman/util.c
> > index e9187529..b45ca22d 100644
> > --- a/src/pacman/util.c
> > +++ b/src/pacman/util.c
> > @@ -516,22 +516,32 @@ static void table_print_line(const alpm_list_t *line, short col_padding,
> >                       i++, curcell = alpm_list_next(curcell)) {
> >               const struct table_cell_t *cell = curcell->data;
> >               const char *str = (cell->label ? cell->label : "");
> > -             int cell_width;
> > +             int padding_width;
> >
> >               if(!has_data[i]) {
> >                       continue;
> >               }
> >
> > -             cell_width = (cell->mode & CELL_RIGHT_ALIGN ? (int)widths[i] : -(int)widths[i]);
> > -
> >               if(need_padding) {
> >                       printf("%*s", col_padding, "");
> >               }
> >
> >               if(cell->mode & CELL_TITLE) {
> > -                     printf("%s%*s%s", config->colstr.title, cell_width, str, config->colstr.nocolor);
> > +                     printf("%s", config->colstr.title);
> > +             }
> > +             /* Handle alignment manually here - for printf in C, "If the
> > +              * precision is specified, no more than that many bytes are
> > +              * written." [1]
> > +              * [1] Section 7.21.6, N2176, final draft for ISO/IEC 9899:2017 (C18)
> > +              * Fixes FS#59229. */
>
> I appreciate a reference to a spec, but this is a bit verbose for
> a source comment.  This information is better suited to the commit
> message with a shorter comment in the source about printf width being
> in bytes instead of characters.
>
> I think this solution is more complex than necessary though.  It
> should be sufficient to just adjust the above cell_width to be in
> bytes rather than characters.  Something like:
>
>         /* calculate cell width adjusting for multi-byte character strings */
>                 cell_width = (int)widths[i] + strlen(str) - string_length(str);
>                 cell_width = cell->mode & CELL_RIGHT_ALIGN ? cell_width : -cell_width;
>
> > +             padding_width = (int)(widths[i] - string_length(str));
> > +             if (cell->mode & CELL_RIGHT_ALIGN) {
> > +                     printf("%*s%s", padding_width, "", str);
> >               } else {
> > -                     printf("%*s", cell_width, str);
> > +                     printf("%s%*s", str, padding_width, "");
> > +             }
> > +             if(cell->mode & CELL_TITLE) {
> > +                     printf("%s", config->colstr.nocolor);
> >               }
> >               need_padding = 1;
> >       }
> > --
> > 2.28.0

Thanks a lot! That looks much better. I sent v2 based on your suggestion.

Best,

Chih-Hsuan Yen


More information about the pacman-dev mailing list