From 8f93de3bb6d8f8177beaf8c82028623121c1f3ed Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 22 Dec 2010 06:37:48 +0000 Subject: [PATCH] libiconv: extend the stub implementation a bit; if mappings between equal charsets or from ASCII to UTF-8 or ASCII to ISO-8859-* are requested, simply copy the input to the output buffer, this fixes programs like mpd SVN-Revision: 24777 --- libs/libiconv/Makefile | 4 +-- libs/libiconv/src/iconv.c | 57 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/libs/libiconv/Makefile b/libs/libiconv/Makefile index d51b47fba..80179f0f7 100644 --- a/libs/libiconv/Makefile +++ b/libs/libiconv/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libiconv -PKG_RELEASE:=1 +PKG_RELEASE:=2 include $(INCLUDE_DIR)/package.mk @@ -27,7 +27,7 @@ define Build/Configure endef define Build/Compile - $(TARGET_CC) -c $(PKG_BUILD_DIR)/iconv.c -o $(PKG_BUILD_DIR)/iconv.o -I$(PKG_BUILD_DIR)/include + $(TARGET_CC) -c $(PKG_BUILD_DIR)/iconv.c -o $(PKG_BUILD_DIR)/iconv.o -I$(PKG_BUILD_DIR)/include $(FPIC) $(TARGET_CROSS)ar rcs $(PKG_BUILD_DIR)/libiconv.a $(PKG_BUILD_DIR)/iconv.o endef diff --git a/libs/libiconv/src/iconv.c b/libs/libiconv/src/iconv.c index e85b99a22..f5ffc346e 100644 --- a/libs/libiconv/src/iconv.c +++ b/libs/libiconv/src/iconv.c @@ -3,19 +3,72 @@ */ #include +#include +#include #include int _libiconv_version = _LIBICONV_VERSION; iconv_t iconv_open (const char *tocode, const char *fromcode) { - return (iconv_t)(-1); + /* ASCII -> UTF8 and ASCII -> ISO-8859-x mappings can be + * faked without doing any actual conversion, mapping + * between identical charsets is a no-op, so claim to + * support those. */ + if (!strncasecmp(fromcode, tocode, strlen(fromcode)) || + (!strncasecmp(tocode, "UTF-8", strlen("UTF-8")) && + !strncasecmp(fromcode, "ASCII", strlen("ASCII"))) || + (!strncasecmp(tocode, "ISO-8859-", strlen("ISO-8859-")) && + !strncasecmp(fromcode, "ASCII", strlen("ASCII")))) + { + return (iconv_t)(1); + } + else + { + return (iconv_t)(-1); + } } size_t iconv (iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { - return 0; + size_t len = 0; + + if (cd == (iconv_t)(1)) + { + if ((*inbytesleft < 0) || (*outbytesleft < 0) || + (outbuf == NULL) || (*outbuf == NULL)) + { + errno = EINVAL; + return (size_t)(-1); + } + + if ((inbuf != NULL) && (*inbuf != NULL)) + { + len = (*inbytesleft > *outbytesleft) + ? *outbytesleft : *inbytesleft; + + memcpy(*outbuf, *inbuf, len); + + *inbuf += len; + *inbytesleft -= len; + *outbuf += len; + *outbytesleft -= len; + + if (*inbytesleft > 0) + { + errno = E2BIG; + return (size_t)(-1); + } + } + + return (size_t)(0); + } + else + { + errno = EBADF; + return (size_t)(-1); + } } int iconv_close (iconv_t cd) -- 2.30.2