michael@0: /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: #include "unicpriv.h" michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: typedef int (*uSubGeneratorFunc) (uint16_t in, unsigned char* out); michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: michael@0: typedef int (*uGeneratorFunc) ( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uGenerate( michael@0: uScanClassID scanClass, michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: #define uSubGenerator(sub,in,out) (* m_subgenerator[sub])((in),(out)) michael@0: michael@0: int uCheckAndGenAlways1Byte( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: int uCheckAndGenAlways2Byte( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: int uCheckAndGenAlways2ByteShiftGR( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: int uGenerateShift( michael@0: uShiftOutTable *shift, michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: int uCheckAndGen2ByteGRPrefix8F( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: int uCheckAndGen2ByteGRPrefix8EA2( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGen2ByteGRPrefix8EA3( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGen2ByteGRPrefix8EA4( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGen2ByteGRPrefix8EA5( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGen2ByteGRPrefix8EA6( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGen2ByteGRPrefix8EA7( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: int uCnGAlways8BytesDecomposedHangul( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGenJohabHangul( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uCheckAndGenJohabSymbol( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: michael@0: int uCheckAndGen4BytesGB18030( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ); michael@0: michael@0: int uGenAlways2Byte( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ); michael@0: int uGenAlways2ByteShiftGR( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ); michael@0: int uGenAlways1Byte( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ); michael@0: int uGenAlways1BytePrefix8E( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ); michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: const uGeneratorFunc m_generator[uNumOfCharsetType] = michael@0: { michael@0: uCheckAndGenAlways1Byte, michael@0: uCheckAndGenAlways2Byte, michael@0: uCheckAndGenAlways2ByteShiftGR, michael@0: uCheckAndGen2ByteGRPrefix8F, michael@0: uCheckAndGen2ByteGRPrefix8EA2, michael@0: uCheckAndGen2ByteGRPrefix8EA3, michael@0: uCheckAndGen2ByteGRPrefix8EA4, michael@0: uCheckAndGen2ByteGRPrefix8EA5, michael@0: uCheckAndGen2ByteGRPrefix8EA6, michael@0: uCheckAndGen2ByteGRPrefix8EA7, michael@0: uCnGAlways8BytesDecomposedHangul, michael@0: uCheckAndGenJohabHangul, michael@0: uCheckAndGenJohabSymbol, michael@0: uCheckAndGen4BytesGB18030, michael@0: uCheckAndGenAlways2Byte /* place-holder for GR128 */ michael@0: }; michael@0: michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: michael@0: const uSubGeneratorFunc m_subgenerator[uNumOfCharType] = michael@0: { michael@0: uGenAlways1Byte, michael@0: uGenAlways2Byte, michael@0: uGenAlways2ByteShiftGR, michael@0: uGenAlways1BytePrefix8E michael@0: }; michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uGenerate( michael@0: uScanClassID scanClass, michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: return (* m_generator[scanClass]) (state,in,out,outbuflen,outlen); michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uGenAlways1Byte( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ) michael@0: { michael@0: out[0] = (unsigned char)in; michael@0: return 1; michael@0: } michael@0: michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uGenAlways2Byte( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ) michael@0: { michael@0: out[0] = (unsigned char)((in >> 8) & 0xff); michael@0: out[1] = (unsigned char)(in & 0xff); michael@0: return 1; michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uGenAlways2ByteShiftGR( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ) michael@0: { michael@0: out[0] = (unsigned char)(((in >> 8) & 0xff) | 0x80); michael@0: out[1] = (unsigned char)((in & 0xff) | 0x80); michael@0: return 1; michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uGenAlways1BytePrefix8E( michael@0: uint16_t in, michael@0: unsigned char* out michael@0: ) michael@0: { michael@0: out[0] = 0x8E; michael@0: out[1] = (unsigned char)(in & 0xff); michael@0: return 1; michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGenAlways1Byte( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: /* Don't check inlen. The caller should ensure it is larger than 0 */ michael@0: /* Oops, I don't agree. Code changed to check every time. [CATA] */ michael@0: if(outbuflen < 1) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 1; michael@0: out[0] = in & 0xff; michael@0: return 1; michael@0: } michael@0: } michael@0: michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGenAlways2Byte( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 2) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 2; michael@0: out[0] = ((in >> 8 ) & 0xff); michael@0: out[1] = in & 0xff; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGenAlways2ByteShiftGR( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 2) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 2; michael@0: out[0] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[1] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uGenerateShift( michael@0: uShiftOutTable *shift, michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: int16_t i; michael@0: const uShiftOutCell* cell = &(shift->shiftcell[0]); michael@0: int16_t itemnum = shift->numOfItem; michael@0: unsigned char inH, inL; michael@0: inH = (in >> 8) & 0xff; michael@0: inL = (in & 0xff ); michael@0: for(i=0;i= cell[i].shiftout_MinLB) && michael@0: ( inL <= cell[i].shiftout_MaxLB) && michael@0: ( inH >= cell[i].shiftout_MinHB) && michael@0: ( inH <= cell[i].shiftout_MaxHB) ) michael@0: { michael@0: if(outbuflen < cell[i].reserveLen) michael@0: { michael@0: return 0; michael@0: } michael@0: else michael@0: { michael@0: *outlen = cell[i].reserveLen; michael@0: return (uSubGenerator(cell[i].classID,in,out)); michael@0: } michael@0: } michael@0: } michael@0: return 0; michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8F(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 3) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 3; michael@0: out[0] = 0x8F; michael@0: out[1] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[2] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8EA2(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 4; michael@0: out[0] = 0x8E; michael@0: out[1] = 0xA2; michael@0: out[2] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[3] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: michael@0: michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8EA3(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 4; michael@0: out[0] = 0x8E; michael@0: out[1] = 0xA3; michael@0: out[2] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[3] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8EA4(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 4; michael@0: out[0] = 0x8E; michael@0: out[1] = 0xA4; michael@0: out[2] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[3] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8EA5(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 4; michael@0: out[0] = 0x8E; michael@0: out[1] = 0xA5; michael@0: out[2] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[3] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8EA6(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 4; michael@0: out[0] = 0x8E; michael@0: out[1] = 0xA6; michael@0: out[2] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[3] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCheckAndGen2ByteGRPrefix8EA7(int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: else michael@0: { michael@0: *outlen = 4; michael@0: out[0] = 0x8E; michael@0: out[1] = 0xA7; michael@0: out[2] = ((in >> 8 ) & 0xff) | 0x80; michael@0: out[3] = (in & 0xff) | 0x80; michael@0: return 1; michael@0: } michael@0: } michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: #define SBase 0xAC00 michael@0: #define LCount 19 michael@0: #define VCount 21 michael@0: #define TCount 28 michael@0: #define NCount (VCount * TCount) michael@0: /*================================================================================= michael@0: michael@0: =================================================================================*/ michael@0: int uCnGAlways8BytesDecomposedHangul( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: static const uint8_t lMap[LCount] = { michael@0: 0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xa9, 0xb1, 0xb2, 0xb3, 0xb5, michael@0: 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe michael@0: }; michael@0: michael@0: static const uint8_t tMap[TCount] = { michael@0: 0xd4, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa9, 0xaa, michael@0: 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb4, 0xb5, michael@0: 0xb6, 0xb7, 0xb8, 0xba, 0xbb, 0xbc, 0xbd, 0xbe michael@0: }; michael@0: michael@0: uint16_t SIndex, LIndex, VIndex, TIndex; michael@0: michael@0: if(outbuflen < 8) michael@0: return 0; michael@0: michael@0: /* the following line are copy from Unicode 2.0 page 3-13 */ michael@0: /* item 1 of Hangul Syllabel Decomposition */ michael@0: SIndex = in - SBase; michael@0: michael@0: /* the following lines are copy from Unicode 2.0 page 3-14 */ michael@0: /* item 2 of Hangul Syllabel Decomposition w/ modification */ michael@0: LIndex = SIndex / NCount; michael@0: VIndex = (SIndex % NCount) / TCount; michael@0: TIndex = SIndex % TCount; michael@0: michael@0: /* michael@0: * A Hangul syllable not enumerated in KS X 1001 is represented michael@0: * by a sequence of 8 bytes beginning with Hangul-filler michael@0: * (0xA4D4 in EUC-KR and 0x2454 in ISO-2022-KR) followed by three michael@0: * Jamos (2 bytes each the first of which is 0xA4 in EUC-KR) making michael@0: * up the syllable. ref. KS X 1001:1998 Annex 3 michael@0: */ michael@0: *outlen = 8; michael@0: out[0] = out[2] = out[4] = out[6] = 0xa4; michael@0: out[1] = 0xd4; michael@0: out[3] = lMap[LIndex] ; michael@0: out[5] = (VIndex + 0xbf); michael@0: out[7] = tMap[TIndex]; michael@0: michael@0: return 1; michael@0: } michael@0: michael@0: int uCheckAndGenJohabHangul( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 2) michael@0: return 0; michael@0: else michael@0: { michael@0: /* michael@0: See Table 4-45 (page 183) of CJKV Information Processing michael@0: for detail explanation of the following table. michael@0: */ michael@0: /* michael@0: static const uint8_t lMap[LCount] = { michael@0: 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 michael@0: }; michael@0: Therefore lMap[i] == i+2; michael@0: */ michael@0: michael@0: static const uint8_t vMap[VCount] = { michael@0: /* no 0,1,2 */ michael@0: 3,4,5,6,7, /* no 8,9 */ michael@0: 10,11,12,13,14,15, /* no 16,17 */ michael@0: 18,19,20,21,22,23, /* no 24,25 */ michael@0: 26,27,28,29 michael@0: }; michael@0: static const uint8_t tMap[TCount] = { michael@0: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, /* no 18 */ michael@0: 19,20,21,22,23,24,25,26,27,28,29 michael@0: }; michael@0: uint16_t SIndex, LIndex, VIndex, TIndex, ch; michael@0: /* the following line are copy from Unicode 2.0 page 3-13 */ michael@0: /* item 1 of Hangul Syllabel Decomposition */ michael@0: SIndex = in - SBase; michael@0: michael@0: /* the following lines are copy from Unicode 2.0 page 3-14 */ michael@0: /* item 2 of Hangul Syllabel Decomposition w/ modification */ michael@0: LIndex = SIndex / NCount; michael@0: VIndex = (SIndex % NCount) / TCount; michael@0: TIndex = SIndex % TCount; michael@0: michael@0: *outlen = 2; michael@0: ch = 0x8000 | michael@0: ((LIndex+2)<<10) | michael@0: (vMap[VIndex]<<5)| michael@0: tMap[TIndex]; michael@0: out[0] = (ch >> 8); michael@0: out[1] = ch & 0x00FF; michael@0: #if 0 michael@0: printf("Johab Hangul %x %x in=%x L=%d V=%d T=%d\n", out[0], out[1], in, LIndex, VIndex, TIndex); michael@0: #endif michael@0: return 1; michael@0: } michael@0: } michael@0: int uCheckAndGenJohabSymbol( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 2) michael@0: return 0; michael@0: else michael@0: { michael@0: /* The following code are based on the Perl code listed under michael@0: * "ISO-2022-KR or EUC-KR to Johab Conversion" (page 1013) michael@0: * in the book "CJKV Information Processing" by michael@0: * Ken Lunde michael@0: * michael@0: * sub convert2johab($) { # Convert ISO-2022-KR or EUC-KR to Johab michael@0: * my @euc = unpack("C*", $_[0]); michael@0: * my ($fe_off, $hi_off, $lo_off) = (0,0,1); michael@0: * my @out = (); michael@0: * while(($hi, $lo) = splice(@euc, 0, 2)) { michael@0: * $hi &= 127; $lo &= 127; michael@0: * $fe_off = 21 if $hi == 73; michael@0: * $fe_off = 34 if $hi == 126; michael@0: * ($hi_off, $lo_off) = ($lo_off, $hi_off) if ($hi <74 or $hi >125); michael@0: * push(@out, ((($hi+$hi_off) >> 1)+ ($hi <74 ? 200:187)- $fe_off), michael@0: * $lo + ((($hi+$lo_off) & 1) ? ($lo > 110 ? 34:16):128)); michael@0: * } michael@0: * return pack("C*", @out); michael@0: */ michael@0: michael@0: unsigned char fe_off = 0; michael@0: unsigned char hi_off = 0; michael@0: unsigned char lo_off = 1; michael@0: unsigned char hi = (in >> 8) & 0x7F; michael@0: unsigned char lo = in & 0x7F; michael@0: if(73 == hi) michael@0: fe_off = 21; michael@0: if(126 == hi) michael@0: fe_off = 34; michael@0: if( (hi < 74) || ( hi > 125) ) michael@0: { michael@0: hi_off = 1; michael@0: lo_off = 0; michael@0: } michael@0: *outlen = 2; michael@0: out[0] = ((hi+hi_off) >> 1) + ((hi<74) ? 200 : 187 ) - fe_off; michael@0: out[1] = lo + (((hi+lo_off) & 1) ? ((lo > 110) ? 34 : 16) : michael@0: 128); michael@0: #if 0 michael@0: printf("Johab Symbol %x %x in=%x\n", out[0], out[1], in); michael@0: #endif michael@0: return 1; michael@0: } michael@0: } michael@0: int uCheckAndGen4BytesGB18030( michael@0: int32_t* state, michael@0: uint16_t in, michael@0: unsigned char* out, michael@0: uint32_t outbuflen, michael@0: uint32_t* outlen michael@0: ) michael@0: { michael@0: if(outbuflen < 4) michael@0: return 0; michael@0: out[0] = (in / (10*126*10)) + 0x81; michael@0: in %= (10*126*10); michael@0: out[1] = (in / (10*126)) + 0x30; michael@0: in %= (10*126); michael@0: out[2] = (in / (10)) + 0x81; michael@0: out[3] = (in % 10) + 0x30; michael@0: *outlen = 4; michael@0: return 1; michael@0: }