Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ulrich Drepper committed Apr 27, 2000
1 parent cd201e3 commit 316518d
Showing 6 changed files with 197 additions and 37 deletions.
20 changes: 19 additions & 1 deletion ChangeLog
Original file line number Diff line number Diff line change
@@ -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 changes: 32 additions & 7 deletions iconv/loop.c
Original file line number Diff line number Diff line change
@@ -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;
}
13 changes: 9 additions & 4 deletions localedata/Makefile
Original file line number Diff line number Diff line change
@@ -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 changes: 51 additions & 0 deletions localedata/tst-mbswcs.sh
Original file line number Diff line number Diff line change
@@ -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 changes: 63 additions & 0 deletions localedata/tst-mbswcs1.c
Original file line number Diff line number Diff line change
@@ -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;
}
48 changes: 23 additions & 25 deletions nis/nis_callback.c
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 316518d

Please sign in to comment.