f5ffc346ee0509a190d19a5cefb2856295d98980
[packages.git] / libs / libiconv / src / iconv.c
1 /*
2  * Simple iconv library stub so that programs have something to link against
3  */
4
5 #include <stddef.h>
6 #include <string.h>
7 #include <errno.h>
8 #include <iconv.h>
9
10 int _libiconv_version = _LIBICONV_VERSION;
11
12 iconv_t iconv_open (const char *tocode, const char *fromcode)
13 {
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         }
30 }
31
32 size_t iconv (iconv_t cd, char **inbuf, size_t *inbytesleft,
33                           char **outbuf, size_t *outbytesleft)
34 {
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         }
72 }
73
74 int iconv_close (iconv_t cd)
75 {
76         return 0;
77 }