codeset problems in wprintf and wcsftime

Corinna Vinschen
Fri Apr 30 14:40:00 GMT 2010

On Mar  2 21:47, Corinna Vinschen wrote:
> On Feb 25 10:25, Corinna Vinschen wrote:
> > - Add another flag __HAVE_WCHAR_LOCALE_INFO__ or something.  Used in
> >   vfwprintf and wcsftime it would use different code for targets
> >   which only have the multibyte locale info and targets which have
> >   also the wide char representation.
> Attached is a patch which does that and more.  I do not intend to apply
> this patch before the next Cygwin release 1.7.2 is out (which will be
> RSN), but I wanted to show what I have, so you guys can make a sanity
> check on the new code if you're interested in this stuff.

I've applied the patch now with a few minor changes.  This is the
(so far missing) ChangeLog entry:

        Extend locale support to maintain wide char values of native strings
        if __HAVE_LOCALE_INFO_EXTENDED__ is defined.
        * libc/include/langinfo.h (enum __nl_item): New type.  Define all
        native values accessible through nl_langinfo.  Define previously
        existing POSIX-compatible values as macros as well.
        * libc/include/stdlib.h (__mb_cur_max): Drop declaration.
        (__locale_mb_cur_max): Declare.
        (MB_CUR_MAX): Re-define calling __locale_mb_cur_max.
        * libc/locale/ (ELIX_SOURCES): Add lctype.c.
        * libc/locale/ Regenerate.
        * libc/locale/lctype.c: New file to define and load LC_CTYPE category.
        * libc/locale/lctype.h: New file, matching header.
        * libc/locale/lmessages.c (_C_messages_locale): Add default values for
        wide char members.
        (__messages_load_locale): Add _C_messages_locale in call to
        * libc/locale/lmessages.h (struct lc_messages_T): Add wide char members.
        * libc/locale/lmonetary.c (_C_monetary_locale):  Add default values for
        wide char members.
        (__monetary_load_locale): Add _C_monetary_locale in call to
        * libc/locale/lmonetary.h (struct lc_monetary_T): Add wide char members.
        Add numerical values for international currency formatting per
        POSIX-1.2008, if __HAVE_LOCALE_INFO_EXTENDED__ is defined.
        * libc/locale/lnumeric.c (_C_numeric_locale): Add default values for
        wide char members.
        (__numeric_load_locale): Add _C_numeric_locale in call to
        * libc/locale/lnumeric.h (struct lc_numeric_T): Add wide char members.
        * libc/locale/locale.c (loadlocale): Return doing nothing if category
        locale didn't change.  Convert category if chain to switch statement.
        Call __ctype_load_locale in LC_CTYPE case.
        (__locale_charset): Add (but disable for now) returning codeset from
        (__locale_mb_cur_max): Add (but disable for now) returning mb_cur_max
        from __get_current_ctype_locale.
        (__locale_msgcharset): Add returning codeset from
        (_localeconv_r): Accommodate int_XXX values.
        * libc/locale/nl_langinfo.c (nl_ext): New array to define what is to
        be returned for non-POSIX values.
        (nl_Langinfo): Return correct codeset for each locale category.  Return
        extended values if __HAVE_LOCALE_INFO_EXTENDED__ is defined.
        * libc/locale/timelocal.c (_C_time_locale): Add default values for
        wide char members.
        (__time_load_locale): Add _C_time_locale in call to
        * libc/locale/timelocal.h (struct lc_time_T): Add wide char members.
        * libc/stdio/vfwprintf.c (_VFWPRINTF_R): Use wide char decimal point
        and thousands_sep if __HAVE_LOCALE_INFO_EXTENDED__ is defined.
        * libc/time/strftime.c: Rework to accommodate availability of wide char
        strings in LC_TIME category if __HAVE_LOCALE_INFO_EXTENDED__ is defined.


Corinna Vinschen
Cygwin Project Co-Leader
Red Hat

More information about the Newlib mailing list