diff --git a/ChangeLog b/ChangeLog index 9e80af8406..176f895292 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2000-11-18 Ulrich Drepper + + * wcsmbs/mbrtowc.c (__mbrtowc): Do not only flush if input is '\0'. + + * wcsmbs/Makefile (tests): Add tst-mbrtowc and tst-wcrtomb. + (tst-mbrtowc-ENV): New variable. + (tst-wcrtomb-ENV): New variable. + * wcsmbs/tst-mbrtowc.c: New file. + * wcsmbs/tst-wcrtomb.c: New file. + 2000-11-16 Andreas Jaeger * manual/install.texi (Tools for Compilation): Update diff --git a/FAQ b/FAQ index de4cb739e6..889fe637e2 100644 --- a/FAQ +++ b/FAQ @@ -236,22 +236,9 @@ a local mirror first. You should always try to use the latest official release. Older versions may not have all the features GNU libc requires. The current releases of -egcs (1.0.3 and 1.1.1) should work with the GNU C library (for powerpc see +gcc (2.95 or newer) should work with the GNU C library (for powerpc see question 1.5; for ARM see question 1.6; for MIPS see question 1.20). -While the GNU CC should be able to compile glibc it is nevertheless adviced -to use EGCS. Comparing the sizes of glibc on Intel compiled with a recent -EGCS and gcc 2.8.1 shows this: - - text data bss dec hex filename - egcs-2.93.10 862897 15944 12824 891665 d9b11 libc.so - gcc-2.8.1 959965 16468 12152 988585 f15a9 libc.so - -Make up your own decision. - -GNU CC versions 2.95 and above are derived from egcs, and they may do even -better. - Please note that gcc 2.95 and 2.95.x cannot compile glibc on Alpha due to problems in the complex float support. @@ -328,19 +315,19 @@ Binutils 2.9.1.0.16 or later is also required. * lots of disk space (~400MB for i?86-linux; more for RISC platforms). * plenty of time. Compiling just the shared and static libraries for - i?86-linux takes approximately 1h on an AMD-K6@225MHz w/ 96MB of RAM, - 45mins on a Celeron@400MHz w/ 128MB, and 55mins on a Alpha@533MHz w/ 256MB. - Multiply this by 1.5 or 2.0 if you build profiling and/or the highly - optimized version as well. For Hurd systems times are much higher. + 35mins on a 2xPIII@550Mhz w/ 512MB RAM. On a 2xUltraSPARC-II@360Mhz + w/ 1GB RAM it takes about 14 minutes. Multiply this by 1.5 or 2.0 + if you build profiling and/or the highly optimized version as well. + For Hurd systems times are much higher. You should avoid compiling in a NFS mounted filesystem. This is very slow. - James Troup reports a compile time of - 45h34m for a full build (shared, static, and profiled) on Atari - Falcon (Motorola 68030 @ 16 Mhz, 14 Mb memory) and Jan Barte - reports 22h48m on Atari TT030 - (Motorola 68030 @ 32 Mhz, 34 Mb memory) + James Troup reports a compile time for + an earlier (and smaller!) version of glibc of 45h34m for a full build + (shared, static, and profiled) on Atari Falcon (Motorola 68030 @ 16 Mhz, + 14 Mb memory) and Jan Barte reports + 22h48m on Atari TT030 (Motorola 68030 @ 32 Mhz, 34 Mb memory) A full build of the PowerPC library took 1h on a PowerPC 750@400Mhz w/ 64MB of RAM, and about 9h on a 601@60Mhz w/ 72Mb. @@ -373,11 +360,7 @@ to the root of the 2.2 tree and do `make include/linux/version.h'. 1.9. The compiler hangs while building iconvdata modules. What's wrong? -{ZW} This is a problem with old versions of GCC. Initialization of large -static arrays is very slow. The compiler will eventually finish; give it -time. - -The problem is fixed in egcs 1.1. +{} Removed. Does not apply anymore. 1.10. When I run `nm -u libc.so' on the produced library I still @@ -843,8 +826,7 @@ you got with your distribution. glibc 2.x? {AJ} There's only correct support for glibc 2.0.x in gcc 2.7.2.3 or later. -But you should get at least gcc 2.8.1 or egcs 1.1 (or later versions) -instead. +But you should get at least gcc 2.95.2 (or later versions) instead. 2.10. The `gencat' utility cannot process the catalog sources which diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile index 42a1fa133c..325b3975b0 100644 --- a/wcsmbs/Makefile +++ b/wcsmbs/Makefile @@ -39,7 +39,8 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ wcscasecmp wcsncase wcscasecmp_l wcsncase_l \ wcsmbsload -tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc +tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ + tst-wcrtomb include ../Rules @@ -62,3 +63,5 @@ CFLAGS-wcstold_l.c = -I../stdlib CFLAGS-wcstof_l.c = -I../stdlib tst-btowc-ENV = LOCPATH=$(common-objpfx)localedata +tst-mbrtowc-ENV = LOCPATH=$(common-objpfx)localedata +tst-wcrtomb-ENV = LOCPATH=$(common-objpfx)localedata diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c index 034ccfec41..7c05680d91 100644 --- a/wcsmbs/mbrtowc.c +++ b/wcsmbs/mbrtowc.c @@ -42,7 +42,7 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) size_t dummy; const unsigned char *inbuf; char *outbuf = (char *) (pwc ?: buf); - int flush; + int flush = 0; /* Set information for this step. */ data.__invocation_counter = 0; @@ -60,8 +60,6 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) n = 1; flush = 1; } - else - flush = *s == '\0' ? 1 : 0; /* Tell where we want the result. */ data.__outbuf = outbuf; diff --git a/wcsmbs/tst-mbrtowc.c b/wcsmbs/tst-mbrtowc.c new file mode 100644 index 0000000000..cbd8796d36 --- /dev/null +++ b/wcsmbs/tst-mbrtowc.c @@ -0,0 +1,108 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2000. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + + +static int check_ascii (const char *locname); + + +int +main (void) +{ + int result = 0; + + /* Check mapping of ASCII range for some character sets which have + ASCII as a subset. For those the wide char generated must have + the same value. */ + setlocale (LC_ALL, "C"); + result |= check_ascii (setlocale (LC_ALL, NULL)); + + setlocale (LC_ALL, "de_DE.UTF-8"); + result |= check_ascii (setlocale (LC_ALL, NULL)); + + setlocale (LC_ALL, "ja_JP.EUC-JP"); + result |= check_ascii (setlocale (LC_ALL, NULL)); + + return result; +} + + +static int +check_ascii (const char *locname) +{ + int c; + int res = 0; + + printf ("Testing locale \"%s\":\n", locname); + + for (c = 0; c <= 127; ++c) + { + char buf[MB_CUR_MAX]; + wchar_t wc = 0xffffffff; + mbstate_t s; + size_t n; + int i; + + for (i = 0; i < MB_CUR_MAX; ++i) + buf[i] = c + i; + + memset (&s, '\0', sizeof (s)); + + n = mbrtowc (&wc, buf, MB_CUR_MAX, &s); + if (n == (size_t) -1) + { + printf ("%s: '\\x%x': encoding error\n", locname, c); + ++res; + } + else if (n == (size_t) -2) + { + printf ("%s: '\\x%x': incomplete character\n", locname, c); + ++res; + } + else if (n == 0 && c != 0) + { + printf ("%s: '\\x%x': 0 returned\n", locname, c); + ++res; + } + else if (n != 0 && c == 0) + { + printf ("%s: '\\x%x': not 0 returned\n", locname, c); + ++res; + } + else if (c != 0 && n != 1) + { + printf ("%s: '\\x%x': not 1 returned\n", locname, c); + ++res; + } + else if (wc != (wchar_t) c) + { + printf ("%s: '\\x%x': wc != L'\\x%x'\n", locname, c, c); + ++res; + } + } + + printf (res == 1 ? "%d error\n" : "%d errors\n", res); + + return res != 0; +} diff --git a/wcsmbs/tst-wcrtomb.c b/wcsmbs/tst-wcrtomb.c new file mode 100644 index 0000000000..5b96cf58b7 --- /dev/null +++ b/wcsmbs/tst-wcrtomb.c @@ -0,0 +1,95 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2000. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + + +static int check_ascii (const char *locname); + + +int +main (void) +{ + int result = 0; + + /* Check mapping of ASCII range for some character sets which have + ASCII as a subset. For those the wide char generated must have + the same value. */ + setlocale (LC_ALL, "C"); + result |= check_ascii (setlocale (LC_ALL, NULL)); + + setlocale (LC_ALL, "de_DE.UTF-8"); + result |= check_ascii (setlocale (LC_ALL, NULL)); + + setlocale (LC_ALL, "ja_JP.EUC-JP"); + result |= check_ascii (setlocale (LC_ALL, NULL)); + + return result; +} + + +static int +check_ascii (const char *locname) +{ + wchar_t wc; + int res = 0; + + printf ("Testing locale \"%s\":\n", locname); + + for (wc = 0; wc <= 127; ++wc) + { + char buf[2 * MB_CUR_MAX]; + mbstate_t s; + size_t n; + + memset (buf, '\xff', sizeof (buf)); + memset (&s, '\0', sizeof (s)); + + n = wcrtomb (buf, wc, &s); + if (n == (size_t) -1) + { + printf ("%s: '\\x%x': encoding error\n", locname, (int) wc); + ++res; + } + else if (n == 0) + { + printf ("%s: '\\x%x': 0 returned\n", locname, (int) wc); + ++res; + } + else if (n != 1) + { + printf ("%s: '\\x%x': not 1 returned\n", locname, (int) wc); + ++res; + } + else if (wc != (wchar_t) buf[0]) + { + printf ("%s: L'\\x%x': buf[0] != '\\x%x'\n", locname, (int) wc, + (int) wc); + ++res; + } + } + + printf (res == 1 ? "%d error\n" : "%d errors\n", res); + + return res != 0; +}