iconv.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <string.h>
  2. #include "iconv.h"
  3. #include "prv_iconv.h"
  4. typedef struct builtin_iconv_map_tag
  5. {
  6. const char *from;
  7. const char *to;
  8. const iconv_fct fct;
  9. }builtin_iconv_map;
  10. static const builtin_iconv_map iconv_map[] =
  11. {
  12. {"ucs2", "gb2312", iconv_ucs2_to_gb2312},
  13. {"ucs2be", "gb2312", iconv_ucs2be_to_gb2312},
  14. {"gb2312", "ucs2", iconv_gb2312_to_ucs2},
  15. {"gb2312", "ucs2be", iconv_gb2312_to_ucs2be},
  16. {"utf8", "ucs2", iconv_utf8_to_ucs2},
  17. {"utf8", "ucs2be", iconv_utf8_to_ucs2be},
  18. {"ucs2", "utf8", iconv_ucs2_to_utf8},
  19. {"ucs2be", "utf8", iconv_ucs2be_to_utf8},
  20. };
  21. iconv_t iconv_open (const char * to_code, const char * from_code)
  22. {
  23. size_t i;
  24. for(i = 0; i < sizeof(iconv_map)/sizeof(iconv_map[0]); i++)
  25. {
  26. if(strcmp(iconv_map[i].from, from_code) == 0 &&
  27. strcmp(iconv_map[i].to, to_code) == 0)
  28. {
  29. return (iconv_t)&iconv_map[i];
  30. }
  31. }
  32. return (iconv_t)-1;
  33. }
  34. size_t iconv_convert (iconv_t __cd, char ** __inbuf, size_t * __inbytesleft, char ** __outbuf, size_t * __outbytesleft)
  35. {
  36. builtin_iconv_map *_map_cd = (builtin_iconv_map *)__cd;
  37. if(__inbuf == NULL || *__inbuf == NULL)
  38. return (size_t)-1;
  39. if(_map_cd < &iconv_map[0] &&
  40. _map_cd > &iconv_map[sizeof(iconv_map)/sizeof(iconv_map[0])])
  41. return (size_t)-1;
  42. return _map_cd->fct(__inbuf, __inbytesleft, __outbuf, __outbytesleft);
  43. }
  44. int iconv_close (iconv_t cd)
  45. {
  46. return 0;
  47. }