| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #include <string.h>
- #include "iconv.h"
- #include "prv_iconv.h"
- typedef struct builtin_iconv_map_tag
- {
- const char *from;
- const char *to;
- const iconv_fct fct;
- }builtin_iconv_map;
- static const builtin_iconv_map iconv_map[] =
- {
- {"ucs2", "gb2312", iconv_ucs2_to_gb2312},
- {"ucs2be", "gb2312", iconv_ucs2be_to_gb2312},
- {"gb2312", "ucs2", iconv_gb2312_to_ucs2},
- {"gb2312", "ucs2be", iconv_gb2312_to_ucs2be},
- {"utf8", "ucs2", iconv_utf8_to_ucs2},
- {"utf8", "ucs2be", iconv_utf8_to_ucs2be},
- {"ucs2", "utf8", iconv_ucs2_to_utf8},
- {"ucs2be", "utf8", iconv_ucs2be_to_utf8},
- };
- iconv_t iconv_open (const char * to_code, const char * from_code)
- {
- size_t i;
- for(i = 0; i < sizeof(iconv_map)/sizeof(iconv_map[0]); i++)
- {
- if(strcmp(iconv_map[i].from, from_code) == 0 &&
- strcmp(iconv_map[i].to, to_code) == 0)
- {
- return (iconv_t)&iconv_map[i];
- }
- }
- return (iconv_t)-1;
- }
- size_t iconv_convert (iconv_t __cd, char ** __inbuf, size_t * __inbytesleft, char ** __outbuf, size_t * __outbytesleft)
- {
- builtin_iconv_map *_map_cd = (builtin_iconv_map *)__cd;
- if(__inbuf == NULL || *__inbuf == NULL)
- return (size_t)-1;
- if(_map_cd < &iconv_map[0] &&
- _map_cd > &iconv_map[sizeof(iconv_map)/sizeof(iconv_map[0])])
- return (size_t)-1;
- return _map_cd->fct(__inbuf, __inbytesleft, __outbuf, __outbytesleft);
- }
- int iconv_close (iconv_t cd)
- {
- return 0;
- }
|