f5ffc346ee0509a190d19a5cefb2856295d98980
[openwrt/svn-archive/archive.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 }