From e34b0f2902588bbbfaf55829692e32c3c7134b74 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 24 Nov 1997 02:08:40 +0000 Subject: Update. 1997-11-24 03:01 Ulrich Drepper * elf/dl-support.c: Call __libc_init_secure to make sure __libc_enable_secure is defined early. * sysdeps/generic/enbl-secure.c: Change function name to __libc_init_secure and make it global instead of a constructor. * iconv/gconv.c: Fix lots of bugs. * iconv/gconv.h: Likewise. * iconv/gconv_builtin.h: Likewise. * iconv/gconv_close.c: Likewise. * iconv/gconv_conf.c: Likewise. * iconv/gconv_db.c: Likewise. * iconv/gconv_dl.c: Likewise. * iconv/gconv_open.c: Likewise. * iconv/gconv_simple.c: Likewise. * iconv/iconv.c: Likewise. * iconv/iconv_close.c: Likewise. * iconv/iconv_open.c: Likewise. * wcsmbs/Makefile (routines): Add wmemrtowcs and wmemrtombs. * wcsmbs/wchar.h: Add prototypes for wmemrtowcs and wmemrtombs. * wcsmbs/wmemrtombs.c: New file. * wcsmbs/wmemrtowcs.c: New file. --- iconv/iconv.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'iconv/iconv.c') diff --git a/iconv/iconv.c b/iconv/iconv.c index e5b0eb7c0d..8804e851b6 100644 --- a/iconv/iconv.c +++ b/iconv/iconv.c @@ -19,9 +19,12 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include +#include + size_t iconv (iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, @@ -29,10 +32,39 @@ iconv (iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, { gconv_t gcd = (gconv_t) cd; size_t converted; + int result; + + result = __gconv (gcd, inbuf, inbytesleft, outbuf, outbytesleft, &converted); + switch (result) + { + case GCONV_ILLEGAL_DESCRIPTOR: + __set_errno (EBADF); + converted = (size_t) -1L; + break; + + case GCONV_ILLEGAL_INPUT: + __set_errno (EILSEQ); + converted = (size_t) -1L; + break; + + case GCONV_FULL_OUTPUT: + __set_errno (E2BIG); + converted = (size_t) -1L; + break; + + case GCONV_INCOMPLETE_INPUT: + __set_errno (EINVAL); + converted = (size_t) -1L; + break; + + case GCONV_EMPTY_INPUT: + case GCONV_OK: + /* Nothing. */ + break; - if (__gconv (gcd, inbuf, inbytesleft, outbuf, outbytesleft, &converted) - != GCONV_OK) - return (size_t) -1; + default: + assert (!"Nothing like this should happen"); + } return converted; } -- cgit v1.2.3