diff options
Diffstat (limited to 'iconv/iconv.c')
-rw-r--r-- | iconv/iconv.c | 38 |
1 files changed, 35 insertions, 3 deletions
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 <errno.h> #include <iconv.h> #include <gconv.h> +#include <assert.h> + 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; } |