gb2312_to_ucs2.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /**************************************************************************
  2. * Copyright (C), AirM2M Tech. Co., Ltd.
  3. *
  4. * Name: gb2312_to_ucs2.c
  5. * Author: liweiqiang
  6. * Version: V0.1
  7. * Date: 2013/11/26
  8. *
  9. * Description:
  10. * gb2312 ת»» ucs2
  11. **************************************************************************/
  12. #include "stdio.h"
  13. #include "errno.h"
  14. #include "luat_base.h"
  15. #include "gb2312_to_ucs2_table.h"
  16. #define u16 uint16_t
  17. #define u8 uint8_t
  18. size_t iconv_gb2312_to_ucs2_endian(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft, int endian)
  19. {
  20. u16 offset,gb2312;
  21. char *gbbuf = *_inbuf;
  22. u16 *ucs2buf = (u16*)*_outbuf;
  23. u16 ucs2;
  24. size_t ucs2len = 0;
  25. size_t inlen = *inbytesleft;
  26. size_t outlen = *outbytesleft;
  27. size_t ret = 0;
  28. while(inlen > 0)
  29. {
  30. if(ucs2len+2 > outlen)
  31. {
  32. errno = E2BIG;
  33. ret = -1;
  34. goto gb2312_to_ucs2_exit;
  35. }
  36. gb2312 = *gbbuf++;
  37. if(gb2312 < 0x80)
  38. {
  39. ucs2 = gb2312;
  40. inlen--;
  41. }
  42. else if(inlen >= 2)
  43. {
  44. gb2312 = (gb2312<<8) + ((*gbbuf++)&0x00ff);
  45. inlen -= 2;
  46. offset = ((gb2312>>8) - 0xA0)*94/*(0xFE-0xA1+1)*/ + ((gb2312&0x00ff) - 0xA1);
  47. ucs2 = gb2312_to_ucs2_table[offset];
  48. }
  49. else
  50. {
  51. break;
  52. }
  53. if(endian == 1)
  54. ucs2 = (ucs2<<8)|(ucs2>>8);
  55. *ucs2buf++ = ucs2;
  56. ucs2len += 2;
  57. }
  58. if(inlen > 0)
  59. {
  60. errno = EINVAL;
  61. ret = -1;
  62. }
  63. gb2312_to_ucs2_exit:
  64. *_inbuf = gbbuf;
  65. *inbytesleft = inlen;
  66. *outbytesleft -= ucs2len;
  67. return ret;
  68. }
  69. size_t iconv_gb2312_to_ucs2(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft)
  70. {
  71. return iconv_gb2312_to_ucs2_endian(_inbuf, inbytesleft, _outbuf, outbytesleft, 0);
  72. }
  73. size_t iconv_gb2312_to_ucs2be(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft)
  74. {
  75. return iconv_gb2312_to_ucs2_endian(_inbuf, inbytesleft, _outbuf, outbytesleft, 1);
  76. }