Changeset 24777


Ignore:
Timestamp:
2010-12-22T07:37:48+01:00 (7 years ago)
Author:
jow
Message:

[packages] 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

Location:
packages/libs/libiconv
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • packages/libs/libiconv/Makefile

    r24775 r24777  
    99 
    1010PKG_NAME:=libiconv 
    11 PKG_RELEASE:=1 
     11PKG_RELEASE:=2 
    1212 
    1313include $(INCLUDE_DIR)/package.mk 
     
    2828 
    2929define Build/Compile 
    30         $(TARGET_CC) -c $(PKG_BUILD_DIR)/iconv.c -o $(PKG_BUILD_DIR)/iconv.o -I$(PKG_BUILD_DIR)/include 
     30        $(TARGET_CC) -c $(PKG_BUILD_DIR)/iconv.c -o $(PKG_BUILD_DIR)/iconv.o -I$(PKG_BUILD_DIR)/include $(FPIC) 
    3131        $(TARGET_CROSS)ar rcs $(PKG_BUILD_DIR)/libiconv.a $(PKG_BUILD_DIR)/iconv.o 
    3232endef 
  • packages/libs/libiconv/src/iconv.c

    r24775 r24777  
    44 
    55#include <stddef.h> 
     6#include <string.h> 
     7#include <errno.h> 
    68#include <iconv.h> 
    79 
     
    1012iconv_t iconv_open (const char *tocode, const char *fromcode) 
    1113{ 
    12         return (iconv_t)(-1); 
     14        /* ASCII -> UTF8 and ASCII -> ISO-8859-x mappings can be 
     15         * faked without doing any actual conversion, mapping 
     16         * between identical charsets is a no-op, so claim to 
     17         * support those. */ 
     18        if (!strncasecmp(fromcode, tocode, strlen(fromcode)) || 
     19            (!strncasecmp(tocode,   "UTF-8",     strlen("UTF-8")) && 
     20             !strncasecmp(fromcode, "ASCII",     strlen("ASCII"))) || 
     21            (!strncasecmp(tocode,   "ISO-8859-", strlen("ISO-8859-")) && 
     22             !strncasecmp(fromcode, "ASCII",     strlen("ASCII")))) 
     23        { 
     24                return (iconv_t)(1); 
     25        } 
     26        else 
     27        { 
     28                return (iconv_t)(-1); 
     29        } 
    1330} 
    1431 
     
    1633                          char **outbuf, size_t *outbytesleft) 
    1734{ 
    18         return 0; 
     35        size_t len = 0; 
     36 
     37        if (cd == (iconv_t)(1)) 
     38        { 
     39                if ((*inbytesleft < 0) || (*outbytesleft < 0) || 
     40                    (outbuf == NULL) || (*outbuf == NULL)) 
     41                { 
     42                        errno = EINVAL; 
     43                        return (size_t)(-1); 
     44                } 
     45 
     46                if ((inbuf != NULL) && (*inbuf != NULL)) 
     47                { 
     48                        len = (*inbytesleft > *outbytesleft) 
     49                                ? *outbytesleft : *inbytesleft; 
     50 
     51                        memcpy(*outbuf, *inbuf, len); 
     52 
     53                        *inbuf        += len; 
     54                        *inbytesleft  -= len; 
     55                        *outbuf       += len; 
     56                        *outbytesleft -= len; 
     57 
     58                        if (*inbytesleft > 0) 
     59                        { 
     60                                errno = E2BIG; 
     61                                return (size_t)(-1); 
     62                        } 
     63                } 
     64 
     65                return (size_t)(0); 
     66        } 
     67        else 
     68        { 
     69                errno = EBADF; 
     70                return (size_t)(-1); 
     71        } 
    1972} 
    2073 
Note: See TracChangeset for help on using the changeset viewer.