Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Nov 2015 17:06:17 +0300
From:      Andrey Chernov <ache@freebsd.org>
To:        Baptiste Daroussin <bapt@freebsd.org>
Cc:        Ed Schouten <ed@nuxi.nl>, Jilles Tjoelker <jilles@stack.nl>, "Sergey V. Dyatko" <sergey.dyatko@gmail.com>, FreeBSD Current <freebsd-current@freebsd.org>
Subject:   Re: /bin/ls formatting broken for non-C(?) locales
Message-ID:  <5655C059.8010701@freebsd.org>
In-Reply-To: <20151125135059.GC77370@ivaldir.etoilebsd.net>
References:  <20151120104253.GA21071@ivaldir.etoilebsd.net> <20151120110212.GB21071@ivaldir.etoilebsd.net> <20151120122352.GA5751@stack.nl> <20151121003541.GF21071@ivaldir.etoilebsd.net> <CABh_MK=cz-zB7krcnKjhqfW9VnwjSmuaZ9%2BAETQiLy3AsHq_vw@mail.gmail.com> <5650DACA.2090501@freebsd.org> <20151125001513.GC70014@ivaldir.etoilebsd.net> <56550F69.8050609@freebsd.org> <20151125125325.GB77370@ivaldir.etoilebsd.net> <5655B8D9.8060805@freebsd.org> <20151125135059.GC77370@ivaldir.etoilebsd.net>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
On 25.11.2015 16:51, Baptiste Daroussin wrote:
> wcslcat works like strlcat:
> to quote the manpage:
> "It will append at most dstsize - strlen(dst) - 1 characters."
> So here with your version it will be n - wcslen(wab_months[i]) -1
> which won't fit what we want to do.
> 
> btw that makes me figure out that what I want is wcsncat because we do care to
> make sure we have appended the right number of spaces at the end of the
> abbreviated month based on character width, not the on the len of the wide
> string
> 
> so I changed it
> 
> if ((n = max_month_width - wab_months_width[i]) > 0)
>     wcsncat(wab_months[i], L"     "/* MAX_ABMON_WIDTH */, n);

Sorry, I initially mean wcsncat() functionality here, wcslcat() is
sneaked in due to wrong memorizing.

About width counting and fallback...
Without attempt to nicely truncate data damaged by unknown way the code
will be simpler. Instead all that loop adding width one by one wchar, just:

width = wcswidth(wab_months[i], MAX_ABMON_WIDTH);
if (width == -1) {
    max_month_width = -1;
    return;
}
wab_months_width[i] = width;

About
/* NULL terminate to simplify padding later */
wab_months[i][j] = L'\0';
You don't need it, mbstowcs() null-terminates result, if there is a room.
BTW, array size looks suspicious:
static wchar_t wab_months[12][MAX_ABMON_WIDTH * 2 * MB_LEN_MAX];
what MB_LEN_MAX doing here? This constant is for multiple-bytes encoded,
not for wide chars.

-- 
http://ache.vniz.net/


[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----

iQEcBAEBCAAGBQJWVcBaAAoJEKUckv0MjfbKjU8IAJLLiGS1ox6gxL80Dj0EWHw4
jXd1mywrMK2uy9mM37X42Wfdp026djIbnsAHdcG9uYlvEDJ6XciHbZqKSrttbWKA
vFfaguvtJ5QAbphllRSF5CqX8o/V6XcgLnldcBOWArQvjQ4hnIBz3Uh1EdGIJSDu
/4u2YLBW2GC3lG0+KqvL/C4QSzFfUUIB+ScyiruK/5eRO4PCOB8/ZAbAiyp7Jq8S
l1J8QED//28UUIKb7EEE8aeOWsf+Kv6EjaZu5tfTfCn73gi9EmqDgLyJiPeRlOce
HNmNo13UXhMrXB8e1L4cieq23NgS4g9zD2AmIjrRmyEnSxgaX1xEu7qXbHbin6w=
=wvIN
-----END PGP SIGNATURE-----

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5655C059.8010701>