mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
Update.
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:
parent
cd201e387c
commit
316518d610
20
ChangeLog
20
ChangeLog
@ -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.
|
||||
|
||||
|
39
iconv/loop.c
39
iconv/loop.c
@ -307,10 +307,10 @@ SINGLE(LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
|
||||
#endif
|
||||
|
||||
/* 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;
|
||||
#ifdef STORE_REST
|
||||
inptr = bytebuf;
|
||||
inptrp = &inptr;
|
||||
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. */
|
||||
do
|
||||
bytebuf[inlen++] = *inptr++;
|
||||
while (inlen < MAX_NEEDED_INPUT);
|
||||
while (inlen < MAX_NEEDED_INPUT && inptr < inend);
|
||||
|
||||
inptr = bytebuf;
|
||||
inend = &inptr[MAX_NEEDED_INPUT];
|
||||
inend = &bytebuf[inlen];
|
||||
#undef NEED_LENGTH_TEST
|
||||
#define NEED_LENGTH_TEST 1
|
||||
do
|
||||
{
|
||||
BODY
|
||||
}
|
||||
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).
|
||||
Update the pointers passed in. */
|
||||
/* We found a new character. */
|
||||
assert (inptr - bytebuf > (state->__count & 7));
|
||||
|
||||
*inptrp += inptr - bytebuf - (state->__count & 7);
|
||||
*outptrp = outptr;
|
||||
|
||||
result = __GCONV_OK;
|
||||
|
||||
/* Clear the state buffer. */
|
||||
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;
|
||||
}
|
||||
|
@ -35,7 +35,8 @@ locales := $(filter-out $(addprefix locales/, CVS RCS SCCS %~), \
|
||||
repertoiremaps := $(filter-out $(addprefix repertoiremaps/, CVS RCS SCCS %~), \
|
||||
$(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 \
|
||||
hr_HR.ISO-8859-2 # once it is fixed: cs_CZ.ISO-8859-2
|
||||
test-input-data = $(addsuffix .in, $(basename $(test-input)))
|
||||
@ -56,7 +57,7 @@ distribute := CHECKSUMS README SUPPORTED ChangeLog \
|
||||
$(charmaps) $(locales) $(repertoiremaps) \
|
||||
tst-rpmatch.sh tst-locale.sh tst-fmon.sh sort-test.sh \
|
||||
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.
|
||||
include ../Makeconfig
|
||||
@ -75,8 +76,10 @@ $(inst_i18ndir)/repertoiremaps/%: repertoiremaps/% $(+force); $(do-install)
|
||||
|
||||
ifeq (no,$(cross-compiling))
|
||||
ifeq (yes,$(build-shared))
|
||||
.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
|
||||
.PHONY: 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 \
|
||||
$(test-input-data)
|
||||
$(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)
|
||||
do-tst-trans: tst-trans.sh $(objpfx)tst-trans
|
||||
$(SHELL) -e $< $(common-objpfx)
|
||||
do-tst-mbswcs: tst-mbswcs.sh $(objpfx)tst-mbswcs1
|
||||
$(SHELL) -e $< $(common-objpfx)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
51
localedata/tst-mbswcs.sh
Executable file
51
localedata/tst-mbswcs.sh
Executable 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
63
localedata/tst-mbswcs1.c
Normal 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;
|
||||
}
|
@ -279,29 +279,21 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
|
||||
unsigned short port;
|
||||
|
||||
cb = (struct nis_cb *) calloc (1, sizeof (struct nis_cb));
|
||||
if (__builtin_expect (cb == NULL, ))
|
||||
{
|
||||
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (__builtin_expect (cb == NULL, 0))
|
||||
goto failed;
|
||||
cb->serv = (nis_server *) calloc (1, sizeof (nis_server));
|
||||
if (__builtin_expect (cb->serv == NULL, 0))
|
||||
{
|
||||
free (cb);
|
||||
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
|
||||
return NULL;
|
||||
}
|
||||
goto failed;
|
||||
cb->serv->name = strdup (nis_local_principal ());
|
||||
if (__builtin_expect (cb->serv->name == NULL, 0))
|
||||
return NIS_NOMEMORY;
|
||||
goto failed;
|
||||
cb->serv->ep.ep_val = (endpoint *) calloc (2, sizeof (endpoint));
|
||||
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_val[0].family = strdup ("inet");
|
||||
if (__builtin_expect (cb->serv->ep.ep_val[0].family == NULL, 0))
|
||||
return NIS_NOMEMORY;
|
||||
goto failed;
|
||||
cb->callback = callback;
|
||||
cb->userdata = userdata;
|
||||
|
||||
@ -331,18 +323,11 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
|
||||
#endif
|
||||
}
|
||||
|
||||
if (flags & USE_DGRAM)
|
||||
{
|
||||
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);
|
||||
}
|
||||
cb->serv->ep.ep_val[0].proto = strdup ((flags & USE_DGRAM) ? "udp" : "tcp");
|
||||
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;
|
||||
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);
|
||||
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user