2000-04-26  Ulrich Drepper  <drepper@redhat.com>

	* iconv/gconv_simple.c (utf8_internal_loop): Correctly reconstruct
	stored character in state in UNPACK_BYTES macro.
	* iconv/loop.c (SINGLE(LOOPFCT)): Make it actually work.  Correct
	test for available characters, handle result of BODY code correctly.
	* localedata/Makefile (test-srcs): Add tst-mbswcs1.
	(distribute): Add tst-mbswcs.sh.
	Add rule to run tst-mbswcs.sh.
	* localedata/tst-mbswcs.sh: New file.
	* localedata/tst-mbswcs1.c: New file.

2000-04-26  Jakub Jelinek  <jakub@redhat.com>

	* nis/nis_callback.c (__nis_create_callback): Do failed memory
	allocation fixups centrally, fix __builtin_expect call, return NULL
	on failure, not NIS_NOMEMORY.

2000-04-27  Bruno Haible  <haible@clisp.cons.org>
This commit is contained in:
Ulrich Drepper 2000-04-27 05:42:19 +00:00
parent cd201e387c
commit 316518d610
6 changed files with 197 additions and 37 deletions

View File

@ -1,4 +1,22 @@
2000-04-27 Bruno Haible <clisp.cons.org> 2000-04-26 Ulrich Drepper <drepper@redhat.com>
* iconv/gconv_simple.c (utf8_internal_loop): Correctly reconstruct
stored character in state in UNPACK_BYTES macro.
* iconv/loop.c (SINGLE(LOOPFCT)): Make it actually work. Correct
test for available characters, handle result of BODY code correctly.
* localedata/Makefile (test-srcs): Add tst-mbswcs1.
(distribute): Add tst-mbswcs.sh.
Add rule to run tst-mbswcs.sh.
* localedata/tst-mbswcs.sh: New file.
* localedata/tst-mbswcs1.c: New file.
2000-04-26 Jakub Jelinek <jakub@redhat.com>
* nis/nis_callback.c (__nis_create_callback): Do failed memory
allocation fixups centrally, fix __builtin_expect call, return NULL
on failure, not NIS_NOMEMORY.
2000-04-27 Bruno Haible <haible@clisp.cons.org>
* intl/ngettext.c [!_LIBC]: Fix definition of NGETTEXT. * intl/ngettext.c [!_LIBC]: Fix definition of NGETTEXT.

View File

@ -307,10 +307,10 @@ SINGLE(LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
#endif #endif
/* Are there enough bytes in the input buffer? */ /* Are there enough bytes in the input buffer? */
if (__builtin_expect (inptr + (MAX_NEEDED_INPUT - inlen) > inend, 0)) if (__builtin_expect (inptr + (MIN_NEEDED_INPUT - inlen) > inend, 0))
{ {
#ifdef STORE_REST
*inptrp = inend; *inptrp = inend;
#ifdef STORE_REST
inptr = bytebuf; inptr = bytebuf;
inptrp = &inptr; inptrp = &inptr;
inend = &bytebuf[inlen]; inend = &bytebuf[inlen];
@ -335,28 +335,53 @@ SINGLE(LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
/* Now add characters from the normal input buffer. */ /* Now add characters from the normal input buffer. */
do do
bytebuf[inlen++] = *inptr++; bytebuf[inlen++] = *inptr++;
while (inlen < MAX_NEEDED_INPUT); while (inlen < MAX_NEEDED_INPUT && inptr < inend);
inptr = bytebuf; inptr = bytebuf;
inend = &inptr[MAX_NEEDED_INPUT]; inend = &bytebuf[inlen];
#undef NEED_LENGTH_TEST
#define NEED_LENGTH_TEST 1
do do
{ {
BODY BODY
} }
while (0); while (0);
if (result == __GCONV_OK) /* Now we either have produced an output character and consumed all the
bytes from the state and at least one more, or the character is still
incomplete, or we have some other error (like illegal input character,
no space in output buffer). */
if (inptr != bytebuf)
{ {
/* We successfully converted the character (maybe even more). /* We found a new character. */
Update the pointers passed in. */
assert (inptr - bytebuf > (state->__count & 7)); assert (inptr - bytebuf > (state->__count & 7));
*inptrp += inptr - bytebuf - (state->__count & 7); *inptrp += inptr - bytebuf - (state->__count & 7);
*outptrp = outptr; *outptrp = outptr;
result = __GCONV_OK;
/* Clear the state buffer. */ /* Clear the state buffer. */
state->__count &= ~7; state->__count &= ~7;
} }
else if (result == __GCONV_INCOMPLETE_INPUT)
{
/* This can only happen if we have less than MAX_NEEDED_INPUT bytes
available. */
assert (inend != &bytebuf[MAX_NEEDED_INPUT]);
*inptrp += inend - bytebuf - (state->__count & 7);
#ifdef STORE_REST
inptrp = &inptr;
STORE_REST
#else
/* We don't have enough input for another complete input
character. */
while (inptr < inend)
state->__value.__wchb[inlen++] = *inptr++;
#endif
}
return result; return result;
} }

View File

@ -35,7 +35,8 @@ locales := $(filter-out $(addprefix locales/, CVS RCS SCCS %~), \
repertoiremaps := $(filter-out $(addprefix repertoiremaps/, CVS RCS SCCS %~), \ repertoiremaps := $(filter-out $(addprefix repertoiremaps/, CVS RCS SCCS %~), \
$(wildcard repertoiremaps/*)) $(wildcard repertoiremaps/*))
test-srcs := collate-test xfrm-test tst-fmon tst-rpmatch tst-trans test-srcs := collate-test xfrm-test tst-fmon tst-rpmatch tst-trans \
tst-mbswcs1
test-input := de_DE.ISO-8859-1 da_DK.ISO-8859-1 fr_CA,2.13.ISO-8859-1 \ test-input := de_DE.ISO-8859-1 da_DK.ISO-8859-1 fr_CA,2.13.ISO-8859-1 \
hr_HR.ISO-8859-2 # once it is fixed: cs_CZ.ISO-8859-2 hr_HR.ISO-8859-2 # once it is fixed: cs_CZ.ISO-8859-2
test-input-data = $(addsuffix .in, $(basename $(test-input))) test-input-data = $(addsuffix .in, $(basename $(test-input)))
@ -56,7 +57,7 @@ distribute := CHECKSUMS README SUPPORTED ChangeLog \
$(charmaps) $(locales) $(repertoiremaps) \ $(charmaps) $(locales) $(repertoiremaps) \
tst-rpmatch.sh tst-locale.sh tst-fmon.sh sort-test.sh \ tst-rpmatch.sh tst-locale.sh tst-fmon.sh sort-test.sh \
tst-fmon.data $(test-input-data) $(ld-test-srcs) \ tst-fmon.data $(test-input-data) $(ld-test-srcs) \
th_TH.in cs_CZ.in th_TH.in cs_CZ.in tst-mbswcs.sh
# Get $(inst_i18ndir) defined. # Get $(inst_i18ndir) defined.
include ../Makeconfig include ../Makeconfig
@ -75,8 +76,10 @@ $(inst_i18ndir)/repertoiremaps/%: repertoiremaps/% $(+force); $(do-install)
ifeq (no,$(cross-compiling)) ifeq (no,$(cross-compiling))
ifeq (yes,$(build-shared)) ifeq (yes,$(build-shared))
.PHONY: do-collate-test do-tst-fmon do-tst-locale do-tst-rpmatch do-tst-trans .PHONY: do-collate-test do-tst-fmon do-tst-locale do-tst-rpmatch do-tst-trans \
tests: do-collate-test do-tst-fmon do-tst-locale do-tst-rpmatch do-tst-trans do-tst-mbswcs
tests: do-collate-test do-tst-fmon do-tst-locale do-tst-rpmatch do-tst-trans \
do-tst-mbswcs
do-collate-test: sort-test.sh $(objpfx)collate-test $(objpfx)xfrm-test \ do-collate-test: sort-test.sh $(objpfx)collate-test $(objpfx)xfrm-test \
$(test-input-data) $(test-input-data)
$(SHELL) -e $< $(common-objpfx) $(test-input) $(SHELL) -e $< $(common-objpfx) $(test-input)
@ -88,6 +91,8 @@ do-tst-rpmatch: tst-rpmatch.sh $(objpfx)tst-rpmatch do-tst-fmon
$(SHELL) -e $< $(common-objpfx) $(SHELL) -e $< $(common-objpfx)
do-tst-trans: tst-trans.sh $(objpfx)tst-trans do-tst-trans: tst-trans.sh $(objpfx)tst-trans
$(SHELL) -e $< $(common-objpfx) $(SHELL) -e $< $(common-objpfx)
do-tst-mbswcs: tst-mbswcs.sh $(objpfx)tst-mbswcs1
$(SHELL) -e $< $(common-objpfx)
endif endif
endif endif

51
localedata/tst-mbswcs.sh Executable file
View File

@ -0,0 +1,51 @@
#! /bin/sh
# Testing the implementation of the mb*towc*() and wc*tomb*() functions.
# Copyright (C) 2000 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
#
# 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.
common_objpfx=$1; shift
generate_locale ()
{
charmap=$1
input=$2
out=$3
rep=$4
I18NPATH=. \
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}locale/localedef --quiet -c -f $charmap -i $input \
--repertoire-map $rep ${common_objpfx}localedata/$out
if [ $? -ne 0 ]; then
echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
"Outputdir: \"${out}\" failed"
exit 1
fi
}
generate_locale UTF8 de_DE de_DE.UTF-8 mnemonic.ds
status=0
# Run the test programs.
LOCPATH=${common_objpfx}localedata GCONV_PATH=${common_objpfx}iconvdata \
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}localedata/tst-mbswcs1 \
> ${common_objpfx}localedata/tst-mbswcs.out || status=1
exit $status

63
localedata/tst-mbswcs1.c Normal file
View File

@ -0,0 +1,63 @@
/* Test restarting behaviour of mbrtowc.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Bruno Haible <haible@ilog.fr>.
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 <stdio.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>
#define show(expr, nexp, wcexp) \
n = expr; \
printf (#expr " -> %Zd", n); \
printf (", wc = %lu", (unsigned long int) wc); \
if (n != (size_t) nexp || wc != wcexp) \
{ \
printf (", expected %Zd and %lu", nexp, (unsigned long int) wcexp); \
result = 1; \
} \
putc ('\n', stdout)
int
main (void)
{
unsigned char buf[6] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb };
mbstate_t state;
wchar_t wc = 42;
size_t n;
int result = 0;
const char *used_locale;
setlocale (LC_CTYPE, "de_DE.UTF-8");
/* Double check. */
used_locale = setlocale (LC_CTYPE, NULL);
printf ("used locale: \"%s\"\n", used_locale);
result = strcmp (used_locale, "de_DE.UTF-8");
memset (&state, '\0', sizeof (state));
show (mbrtowc (&wc, buf + 0, 1, &state), 1, 37);
show (mbrtowc (&wc, buf + 1, 1, &state), -2, 37);
show (mbrtowc (&wc, buf + 2, 3, &state), 2, 8364);
show (mbrtowc (&wc, buf + 4, 1, &state), -2, 8364);
show (mbrtowc (&wc, buf + 5, 1, &state), 1, 955);
show (mbrtowc (&wc, buf + 5, 1, &state), -1, 955);
return result;
}

View File

@ -279,29 +279,21 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
unsigned short port; unsigned short port;
cb = (struct nis_cb *) calloc (1, sizeof (struct nis_cb)); cb = (struct nis_cb *) calloc (1, sizeof (struct nis_cb));
if (__builtin_expect (cb == NULL, )) if (__builtin_expect (cb == NULL, 0))
{ goto failed;
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
return NULL;
}
cb->serv = (nis_server *) calloc (1, sizeof (nis_server)); cb->serv = (nis_server *) calloc (1, sizeof (nis_server));
if (__builtin_expect (cb->serv == NULL, 0)) if (__builtin_expect (cb->serv == NULL, 0))
{ goto failed;
free (cb);
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
return NULL;
}
cb->serv->name = strdup (nis_local_principal ()); cb->serv->name = strdup (nis_local_principal ());
if (__builtin_expect (cb->serv->name == NULL, 0)) if (__builtin_expect (cb->serv->name == NULL, 0))
return NIS_NOMEMORY; goto failed;
cb->serv->ep.ep_val = (endpoint *) calloc (2, sizeof (endpoint)); cb->serv->ep.ep_val = (endpoint *) calloc (2, sizeof (endpoint));
if (__builtin_expect (cb->serv->ep.ep_val == NULL, 0)) if (__builtin_expect (cb->serv->ep.ep_val == NULL, 0))
return NIS_NOMEMORY; goto failed;
cb->serv->ep.ep_len = 1; cb->serv->ep.ep_len = 1;
cb->serv->ep.ep_val[0].family = strdup ("inet"); cb->serv->ep.ep_val[0].family = strdup ("inet");
if (__builtin_expect (cb->serv->ep.ep_val[0].family == NULL, 0)) if (__builtin_expect (cb->serv->ep.ep_val[0].family == NULL, 0))
return NIS_NOMEMORY; goto failed;
cb->callback = callback; cb->callback = callback;
cb->userdata = userdata; cb->userdata = userdata;
@ -331,18 +323,11 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
#endif #endif
} }
if (flags & USE_DGRAM) cb->serv->ep.ep_val[0].proto = strdup ((flags & USE_DGRAM) ? "udp" : "tcp");
{
cb->serv->ep.ep_val[0].proto = strdup ("udp");
cb->xprt = svcudp_bufcreate (sock, 100, 8192);
}
else
{
cb->serv->ep.ep_val[0].proto = strdup ("tcp");
cb->xprt = svctcp_create (sock, 100, 8192);
}
if (__builtin_expect (cb->serv->ep.ep_val[0].proto == NULL, 0)) if (__builtin_expect (cb->serv->ep.ep_val[0].proto == NULL, 0))
return NIS_NOMEMORY; goto failed;
cb->xprt = (flags & USE_DGRAM) ? svcudp_bufcreate (sock, 100, 8192) :
svctcp_create (sock, 100, 8192);
cb->sock = cb->xprt->xp_sock; cb->sock = cb->xprt->xp_sock;
if (!svc_register (cb->xprt, CB_PROG, CB_VERS, cb_prog_1, 0)) if (!svc_register (cb->xprt, CB_PROG, CB_VERS, cb_prog_1, 0))
{ {
@ -372,6 +357,19 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
cb->serv->ep.ep_val[0].uaddr = strdup (addr); cb->serv->ep.ep_val[0].uaddr = strdup (addr);
return cb; return cb;
failed:
if (cb)
{
if (cb->serv)
{
xdr_free ((xdrproc_t) _xdr_nis_server, (char *) cb->serv);
free (cb->serv);
}
free (cb);
}
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
return NULL;
} }
nis_error nis_error