[packages] libiconv: extend the stub implementation a bit; if mappings between equal...
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 22 Dec 2010 06:37:48 +0000 (06:37 +0000)
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 22 Dec 2010 06:37:48 +0000 (06:37 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/packages@24777 3c298f89-4303-0410-b956-a3cf2f4a3e73

libs/libiconv/Makefile
libs/libiconv/src/iconv.c

index d51b47f..80179f0 100644 (file)
@@ -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
 
index e85b99a..f5ffc34 100644 (file)
@@ -3,19 +3,72 @@
  */
 
 #include <stddef.h>
+#include <string.h>
+#include <errno.h>
 #include <iconv.h>
 
 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)