tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Support for multibyte/wide characters in vis(3)
In article <20130210131249.2d5596d3@shibato>, J.R. Oldroyd
<jr%opal.com@localhost> wrote:
>Hi all,
>
>Back in mid-2012 I did some work on the FreeBSD version of vis(3) to
>add multibyte/wide character support. This allows printable characters
>in non-ASCII locales to be displayed as such, rather than displaying
>them as \M-x sequences when LC_CTYPE is set to other than ASCII locales.
>
>By the time I got round to submitting this patch, I found that Brooks
>Davis had recently removed the FreeBSD vis(3) and imported the NetBSD
>version instead in order to add the additional interfaces to the FreeBSD
>library. I have therefore had to merge my multibyte/wide char support
>into the NetBSD version.
>
>In the process of doing so, I found a bug in the NetBSD version in
>which istrnvis() and istrnvisx() both handle expansion of the "extra"
>argument and then call istrsnvis() and istrsnvisx() which also handle
>expansion of the "extra" argument. This results in double processing
>of the extra argument, which is an error. I have fixed this error.
>
>Furthermore, it became clear that the five internal ixxx() functions
>which all did something similar to one another were unnecessary. It
>is possible to simplify this code to just one internal function,
>istrsnvisx() which is used by all the stub functions. My update also
>makes this code simplification.
>
>In summary, this vis(3) update offers these improvements:
>
> - bug fix of double processing of the "extra" arg in
> some cases
>
> - code simplification by removing four ixxx() functions
>
> - multibyte/wide character support
>
>I have tested this on FreeBSD and verified that vis(1), ps(1) and
>mtree(1) still work as expected. I've also done some additional
>testing with a small program that exercises the new interfaces.
>
>The FreeBSD vis(1) does require a small patch of its own in order to
>properly read in multibyte characters. I have not checked whether or
>not the NetBSD vis(1) also needs this patch, but I'm including a
>link to the FreeBSD vis(1) diff in case something similar is also
>needed on NetBSD.
>
>The FreeBSD ps(1) and mtree(1) did not require any changes to work
>with the multibyte vis(3).
>
>Do let me know of any errors or problems with this version and I'll
>be happy to take a look at things.
>
>Here are links to the updates:
> http://opal.com/jr/freebsd/vis/vis3/netbsd-vis.c
> http://opal.com/jr/freebsd/vis/vis1/vis.c.diff
>
>The changes to vis(3) are rather extensive, so some explanation may be
>helpful. The changes come down into the following:
>
> - using wchar_t and wide char string library functions
> for the internal processing
>
> - changing "src", "dst", "extra" and associated vars to
> use wchar_t and renaming function arguments to be "mbsrc"
> etc to distinguish the multibyte strings
>
> - adding "L" to all wide char strings and character constants
>
> - using calloc() to allocate space for the internal wide
> char arrays and free() to clean them up
>
> - removal of check of isascii()
>
> - simplification of five ixxx() functions into one which
> also allowed removal of the HAVE() macro
>
> - fix double-processing of "extra" arg in two cases
>
> - minor style(9) adjustments
>
>Thanks for considering this.
Thanks for doing this; unfortunately it does not work. The problem is that
you are using mbstowcs() which works for NUL terminated strings. This does
not work for str*visx() which encode a fixed length array of characters that
may include NUL's. You can try the unit tests in:
/usr/src/tests/lib/libc/gen/t_vis.c
and see them all fail.
Best,
christos
Home |
Main Index |
Thread Index |
Old Index