2000-11-18  Ulrich Drepper  <drepper@redhat.com>

	* 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.
This commit is contained in:
Ulrich Drepper 2000-11-18 21:08:05 +00:00
parent 7b32d065d6
commit bb2fc8504d
6 changed files with 230 additions and 34 deletions

View File

@ -1,3 +1,13 @@
2000-11-18 Ulrich Drepper <drepper@redhat.com>
* 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 <aj@suse.de>
* manual/install.texi (Tools for Compilation): Update

42
FAQ
View File

@ -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 <J.J.Troup@comp.brad.ac.uk> 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
<yann@plato.uni-paderborn.de> reports 22h48m on Atari TT030
(Motorola 68030 @ 32 Mhz, 34 Mb memory)
James Troup <J.J.Troup@comp.brad.ac.uk> 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 <yann@plato.uni-paderborn.de> 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

View File

@ -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

View File

@ -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;

108
wcsmbs/tst-mbrtowc.c Normal file
View File

@ -0,0 +1,108 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 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 <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
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;
}

95
wcsmbs/tst-wcrtomb.c Normal file
View File

@ -0,0 +1,95 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 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 <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
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;
}