[PATCH, libstdc++-v3] Add newlib specific ctype_members.cc
Yufeng Zhang
Yufeng.Zhang@arm.com
Mon Jun 6 17:33:00 GMT 2011
This time with the patch attached.
Yufeng
> -----Original Message-----
> From: Yufeng Zhang [mailto:Yufeng.Zhang@arm.com]
> Sent: 06 June 2011 18:31
> To: gcc-patches@gcc.gnu.org
> Subject: [PATCH, libstdc++-v3] Add newlib specific ctype_members.cc
>
> Hi,
>
> This patch fixes an issue in the ctype<wchar_t> implementation when the
> newlib C library is used.
>
> The generic version of ctype<wchar_t>::_M_convert_to_wmask() in
> config/locale/generic/ctype_members.cc assumes that a character type
> mask is either a bitmask with only 1 bit set or a bitwise-OR result of
> other character type masks; for instance, as illustrated in the C++
> Standard 2003 TC1 [lib.category.ctype]:
>
> enum mask { // numeric values are for exposition only.
> space=1<<0, print=1<<1, cntrl=1<<2, upper=1<<3, lower=1<<4,
> alpha=1<<5, digit=1<<6, punct=1<<7, xdigit=1<<8,
> alnum=alpha|digit, graph=alnum|punct
> };
>
> The newlibc has a more compact character type mask definition; it uses
> one byte only to represent the masks:
>
> (newlib/libc/include/ctype.h)
> #define _U 01
> #define _L 02
> #define _N 04
> #define _S 010
> #define _P 020
> #define _C 040
> #define _X 0100
> #define _B 0200
>
> (libstdc++-v3/config/os/newlib/ctype_base.h)
> typedef char mask;
> static const mask upper = _U;
> static const mask lower = _L;
> static const mask alpha = _U | _L;
> static const mask digit = _N;
> static const mask xdigit = _X | _N;
> static const mask space = _S;
> static const mask print = _P | _U | _L | _N | _B;
> static const mask graph = _P | _U | _L | _N;
> static const mask cntrl = _C;
> static const mask punct = _P;
> static const mask alnum = _U | _L | _N;
>
> For _X and _B, the generic version of
> ctype<wchar_t>::_M_convert_to_wmask() fails to obtain their
> corresponding wmasks, while other ctype_members.cc variants at
> config/locale/{gnu,darwin}/ are not capable in handling this case
> either.
>
> Therefore, in this patch, a newlib specific ctype_members.cc is added
> at config/locale/newlib/, and acinclude.m4 is modified to use the new
> ctype_members.cc when with_newlib is enabled. The main difference in
> this
> ctype_members.cc from the generic version is the addition of the
> special
> handling of xdigit and print at the end of
> ctype<wchar_t>::_M_convert_to_wmask().
>
> With this patch the following test failure (when the C library is the
> newlib C) will be fixed:
> libstdc++-v3/testsuite/22_locale/ctype/scan/wchar_t/1.cc.
>
> The patch has passed the regression test with armv7-a arm-eabi on qemu.
>
> Is it OK for trunk?
>
> Thanks,
> Yufeng
>
>
> libstdc++-v3/ChangeLog
> 2011-06-06 Yufeng Zhang <yufeng.zhang@arm.com>
>
> * config/locale/newlib/ctype_members.cc: New file.
> * acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Add a new C locale
> kind: newlib. Configure to use the newlib specific
> ctype_members.cc when with_newlib is enabled.
> * configure: Regenerate.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch-add-newlib-specific-ctype-members.cc.txt
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20110606/8000c28f/attachment.txt>
More information about the Gcc-patches
mailing list