Date: Fri, 11 May 2012 10:58:05 +0900 (JST) From: Kohji Okuno <okuno.kohji@jp.panasonic.com> To: theraven@FreeBSD.org Cc: freebsd-current@FreeBSD.org, okuno.kohji@jp.panasonic.com, erik@cederstrand.dk Subject: Re: The current libc/locale/toupper.c is mistaken Message-ID: <20120511.105805.752311254854609466.okuno.kohji@jp.panasonic.com> In-Reply-To: <20120511.105629.433001249354722453.okuno.kohji@jp.panasonic.com> References: <20120511.104242.19192035427185902.okuno.kohji@jp.panasonic.com> <ACBAF2E6-1C82-4CBA-98FA-9E43A95916BA@FreeBSD.org> <20120511.105629.433001249354722453.okuno.kohji@jp.panasonic.com>
next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Fri_May_11_10_58_05_2012_127)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi, I'm sorry. I forgot to attach a file. Regards, Kohji Okuno > Hi David, > > From: David Chisnall <theraven@FreeBSD.org> > >> If you have a test case, I can commit it to the libc++ test suite. >> >> David > > I attached my test source. > This test program shoud output as below. > > towupper_l > 0049, 0049 > 0131, 0049 > 0130, 0130 > 0069, 0049 > > towlower_l > 0049, 0069 > 0131, 0131 > 0130, 0069 > 0069, 0069 > > But, when I use original toupper.c, this proguram output as below. > > towupper_l > 0049, 0049 > 0131, 0131 > 0130, 0069 > 0069, 0049 > > towlower_l > 0049, 0069 > 0131, 0131 > 0130, 0069 > 0069, 0069 > > Regards, > Kohji Okuno > >> >> On 10 May 2012, at 21:42, Kohji Okuno wrote: >> >>> Hi Eric, >>> >>>> I'm left wondering how this was not caught by the libc++ test >>>> suite. The current toupper.c shouldn't pass >>>> http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.character/toupper.pass.cpp >>> >>> This test suite checks only popular characters. >>> __mapupper_ext is used in case of special characters. >>> >>> For example, Turkish 'i' (0x0131) should convert 'I' (0x49). >>> >>> Regards, >>> Kohji Okuno >>> >>> >>>> Den 10/05/2012 kl. 12.03 skrev Dimitry Andric: >>>> >>>>> On 2012-05-10 11:02, Kohji Okuno wrote: >>>>>> I think that libc/locale/toupper.c is mistaken. >>>>>> Could you check it? >>>>>> >>>>>> @@ -51,7 +51,7 @@ ___toupper_l(c, l) >>>>>> { >>>>>> size_t lim; >>>>>> FIX_LOCALE(l); >>>>>> - _RuneRange *rr = &XLOCALE_CTYPE(l)->runes->__maplower_ext; >>>>>> + _RuneRange *rr = &XLOCALE_CTYPE(l)->runes->__mapupper_ext; >>>>>> _RuneEntry *base, *re; >>>>>> >>>>>> if (c < 0 || c == EOF) >>>>> >>>>> Yes, this definitely looks like a copy/paste error, introduced here: >>>>> >>>>> http://svnweb.freebsd.org/base/head/lib/libc/locale/toupper.c?r1=165903&r2=227753 >>>>> >>>>> I'll commit the fix tonight (CEST), if David isn't faster than me. :) >>>> >>>> I'm left wondering how this was not caught by the libc++ test suite. The current toupper.c shouldn't pass http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.character/toupper.pass.cpp >>>> >>>> Thanks, >>>> Erik_______________________________________________ >>>> freebsd-current@freebsd.org mailing list >>>> http://lists.freebsd.org/mailman/listinfo/freebsd-current >>>> To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org" >> >> _______________________________________________ >> freebsd-current@freebsd.org mailing list >> http://lists.freebsd.org/mailman/listinfo/freebsd-current >> To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org" ----Next_Part(Fri_May_11_10_58_05_2012_127)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="test.c" #include <stdlib.h> #include <stdio.h> #include <locale.h> #include <wctype.h> #include <xlocale.h> int main() { int i; wint_t test[] = {0x0049, 0x0131, 0x0130, 0x0069}; wint_t ret; locale_t x; x = newlocale(0x1f, "tr_TR", NULL); printf("towupper_l\n"); for (i = 0; i < sizeof(test)/sizeof(wint_t); i++) { ret = towupper_l(test[i], x); printf("%04x, %04x\n", test[i], ret); } printf("\n"); printf("towlower_l\n"); for (i = 0; i < sizeof(test)/sizeof(wint_t); i++) { ret = towlower_l(test[i], x); printf("%04x, %04x\n", test[i], ret); } exit(0); } ----Next_Part(Fri_May_11_10_58_05_2012_127)----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120511.105805.752311254854609466.okuno.kohji>