| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /**************************************************************************
- * Copyright (C), AirM2M Tech. Co., Ltd.
- *
- * Name: gb2312_to_ucs2.c
- * Author: liweiqiang
- * Version: V0.1
- * Date: 2013/11/26
- *
- * Description:
- * gb2312 ת»» ucs2
- **************************************************************************/
- #include "stdio.h"
- #include "errno.h"
- #include "luat_base.h"
- #include "gb2312_to_ucs2_table.h"
- #define u16 uint16_t
- #define u8 uint8_t
- size_t iconv_gb2312_to_ucs2_endian(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft, int endian)
- {
- u16 offset,gb2312;
- char *gbbuf = *_inbuf;
- u16 *ucs2buf = (u16*)*_outbuf;
- u16 ucs2;
- size_t ucs2len = 0;
- size_t inlen = *inbytesleft;
- size_t outlen = *outbytesleft;
- size_t ret = 0;
-
- while(inlen > 0)
- {
- if(ucs2len+2 > outlen)
- {
- errno = E2BIG;
- ret = -1;
- goto gb2312_to_ucs2_exit;
- }
- gb2312 = *gbbuf++;
- if(gb2312 < 0x80)
- {
- ucs2 = gb2312;
- inlen--;
- }
- else if(inlen >= 2)
- {
- gb2312 = (gb2312<<8) + ((*gbbuf++)&0x00ff);
- inlen -= 2;
-
- offset = ((gb2312>>8) - 0xA0)*94/*(0xFE-0xA1+1)*/ + ((gb2312&0x00ff) - 0xA1);
- ucs2 = gb2312_to_ucs2_table[offset];
- }
- else
- {
- break;
- }
- if(endian == 1)
- ucs2 = (ucs2<<8)|(ucs2>>8);
- *ucs2buf++ = ucs2;
- ucs2len += 2;
- }
- if(inlen > 0)
- {
- errno = EINVAL;
- ret = -1;
- }
- gb2312_to_ucs2_exit:
- *_inbuf = gbbuf;
- *inbytesleft = inlen;
- *outbytesleft -= ucs2len;
- return ret;
- }
- size_t iconv_gb2312_to_ucs2(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft)
- {
- return iconv_gb2312_to_ucs2_endian(_inbuf, inbytesleft, _outbuf, outbytesleft, 0);
- }
- size_t iconv_gb2312_to_ucs2be(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft)
- {
- return iconv_gb2312_to_ucs2_endian(_inbuf, inbytesleft, _outbuf, outbytesleft, 1);
- }
|