1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Copyright (C) 2000-2011, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* file name: ucnvhz.c 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* encoding: US-ASCII 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* tab size: 8 (not used) 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* indentation:4 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created on: 2000oct16 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created by: Ram Viswanadha 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 10/31/2000 Ram Implemented offsets logic function 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h" 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h" 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv_cb.h" 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uset.h" 2583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "unicode/utf16.h" 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucnv_bld.h" 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucnv_cnv.h" 2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "ucnv_imp.h" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UCNV_TILDE 0x7E /* ~ */ 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UCNV_OPEN_BRACE 0x7B /* { */ 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UCNV_CLOSE_BRACE 0x7D /* } */ 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SB_ESCAPE "\x7E\x7D" 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DB_ESCAPE "\x7E\x7B" 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TILDE_ESCAPE "\x7E\x7E" 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ESC_LEN 2 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CONCAT_ESCAPE_MACRO( args, targetIndex,targetLength,strToAppend, err, len,sourceIndex){ \ 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while(len-->0){ \ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(targetIndex < targetLength){ \ 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->target[targetIndex] = (unsigned char) *strToAppend; \ 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(args->offsets!=NULL){ \ 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(offsets++) = sourceIndex-1; \ 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } \ 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru targetIndex++; \ 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } \ 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ \ 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->charErrorBuffer[(int)args->converter->charErrorBufferLength++] = (unsigned char) *strToAppend; \ 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err =U_BUFFER_OVERFLOW_ERROR; \ 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } \ 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru strToAppend++; \ 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } \ 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct{ 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter* gbConverter; 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t targetIndex; 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t sourceIndex; 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isEscapeAppended; 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isStateDBCS; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isTargetUCharDBCS; 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool isEmptySegment; 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}UConverterDataHZ; 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho_HZOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UConverter *gbConverter; 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(pArgs->onlyTestIsLoadable) { 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnv_canCreateConverter("GBK", errorCode); /* errorCode carries result */ 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gbConverter = ucnv_open("GBK", errorCode); 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(*errorCode)) { 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->toUnicodeStatus = 0; 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->fromUnicodeStatus= 0; 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->mode=0; 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->fromUChar32=0x0000; 8483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius cnv->extraInfo = uprv_calloc(1, sizeof(UConverterDataHZ)); 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(cnv->extraInfo != NULL){ 8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ((UConverterDataHZ*)cnv->extraInfo)->gbConverter = gbConverter; 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else { 8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnv_close(gbConverter); 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *errorCode = U_MEMORY_ALLOCATION_ERROR; 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_HZClose(UConverter *cnv){ 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(cnv->extraInfo != NULL) { 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucnv_close (((UConverterDataHZ *) (cnv->extraInfo))->gbConverter); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(!cnv->isExtraLocal) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_free(cnv->extraInfo); 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->extraInfo = NULL; 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_HZReset(UConverter *cnv, UConverterResetChoice choice){ 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(choice<=UCNV_RESET_TO_UNICODE) { 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->toUnicodeStatus = 0; 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->mode=0; 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(cnv->extraInfo != NULL){ 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((UConverterDataHZ*)cnv->extraInfo)->isStateDBCS = FALSE; 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ((UConverterDataHZ*)cnv->extraInfo)->isEmptySegment = FALSE; 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(choice!=UCNV_RESET_TO_UNICODE) { 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->fromUnicodeStatus= 0; 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cnv->fromUChar32=0x0000; 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(cnv->extraInfo != NULL){ 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((UConverterDataHZ*)cnv->extraInfo)->isEscapeAppended = FALSE; 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((UConverterDataHZ*)cnv->extraInfo)->targetIndex = 0; 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((UConverterDataHZ*)cnv->extraInfo)->sourceIndex = 0; 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((UConverterDataHZ*)cnv->extraInfo)->isTargetUCharDBCS = FALSE; 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**************************************HZ Encoding************************************************* 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Rules for HZ encoding 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* In ASCII mode, a byte is interpreted as an ASCII character, unless a 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* '~' is encountered. The character '~' is an escape character. By 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* convention, it must be immediately followed ONLY by '~', '{' or '\n' 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* (<LF>), with the following special meaning. 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 1. The escape sequence '~~' is interpreted as a '~'. 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 2. The escape-to-GB sequence '~{' switches the mode from ASCII to GB. 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 3. The escape sequence '~\n' is a line-continuation marker to be 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* consumed with no output produced. 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* In GB mode, characters are interpreted two bytes at a time as (pure) 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* GB codes until the escape-from-GB code '~}' is read. This code 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* switches the mode from GB back to ASCII. (Note that the escape- 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* from-GB code '~}' ($7E7D) is outside the defined GB range.) 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Source: RFC 1842 14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* 14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* Note that the formal syntax in RFC 1842 is invalid. I assume that the 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* intended definition of single-byte-segment is as follows (pedberg): 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* single-byte-segment = single-byte-seq 1*single-byte-char 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode* err){ 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char tempBuf[2]; 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *mySource = ( char *) args->source; 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *myTarget = args->target; 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *mySourceLimit = args->sourceLimit; 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar32 targetUniChar = 0x0000; 161c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru int32_t mySourceChar = 0x0000; 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverterDataHZ* myData=(UConverterDataHZ*)(args->converter->extraInfo); 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru tempBuf[0]=0; 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru tempBuf[1]=0; 16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Calling code already handles this situation. */ 16785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*if ((args->converter == NULL) || (args->targetLimit < args->target) || (mySourceLimit < args->source)){ 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_ILLEGAL_ARGUMENT_ERROR; 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }*/ 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while(mySource< mySourceLimit){ 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(myTarget < args->targetLimit){ 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru mySourceChar= (unsigned char) *mySource++; 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 178c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru if(args->converter->mode == UCNV_TILDE) { 179c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* second byte after ~ */ 180c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->mode=0; 181c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru switch(mySourceChar) { 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 0x0A: 183c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* no output for ~\n (line-continuation marker) */ 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru continue; 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case UCNV_TILDE: 186c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru if(args->offsets) { 187c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->offsets[myTarget - args->target]=(int32_t)(mySource - args->source - 2); 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 189c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru *(myTarget++)=(UChar)mySourceChar; 19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = FALSE; 191c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru continue; 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case UCNV_OPEN_BRACE: 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case UCNV_CLOSE_BRACE: 19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isStateDBCS = (mySourceChar == UCNV_OPEN_BRACE); 19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (myData->isEmptySegment) { 19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = FALSE; /* we are handling it, reset to avoid future spurious errors */ 19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *err = U_ILLEGAL_ESCAPE_SEQUENCE; 19885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toUCallbackReason = UCNV_IRREGULAR; 19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toUBytes[0] = UCNV_TILDE; 20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toUBytes[1] = mySourceChar; 20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toULength = 2; 20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->target = myTarget; 20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->source = mySource; 20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = TRUE; 207c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru continue; 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* if the first byte is equal to TILDE and the trail byte 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * is not a valid byte then it is an error condition 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Ticket 5691: consistent illegal sequences: 21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - We include at least the first byte in the illegal sequence. 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - If any of the non-initial bytes could be the start of a character, 21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * we stop the illegal sequence before the first one of those. 21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = FALSE; /* different error here, reset this to avoid spurious future error */ 21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *err = U_ILLEGAL_ESCAPE_SEQUENCE; 22085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toUBytes[0] = UCNV_TILDE; 22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( myData->isStateDBCS ? 22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (0x21 <= mySourceChar && mySourceChar <= 0x7e) : 22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho mySourceChar <= 0x7f 22485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ) { 22585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* The current byte could be the start of a character: Back it out. */ 22685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toULength = 1; 22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho --mySource; 22885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 22985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Include the current byte in the illegal sequence. */ 23085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toUBytes[1] = mySourceChar; 23185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->converter->toULength = 2; 23285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 23385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->target = myTarget; 23485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho args->source = mySource; 23585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 236c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } 237c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else if(myData->isStateDBCS) { 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(args->converter->toUnicodeStatus == 0x00){ 239c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* lead byte */ 240c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru if(mySourceChar == UCNV_TILDE) { 241c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->mode = UCNV_TILDE; 242c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else { 243c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* add another bit to distinguish a 0 byte from not having seen a lead byte */ 244c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->toUnicodeStatus = (uint32_t) (mySourceChar | 0x100); 24585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = FALSE; /* the segment has something, either valid or will produce a different error, so reset this */ 246c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru continue; 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 250c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* trail byte */ 25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int leadIsOk, trailIsOk; 252c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru uint32_t leadByte = args->converter->toUnicodeStatus & 0xff; 25385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetUniChar = 0xffff; 25485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 25585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Ticket 5691: consistent illegal sequences: 25685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - We include at least the first byte in the illegal sequence. 25785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - If any of the non-initial bytes could be the start of a character, 25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * we stop the illegal sequence before the first one of those. 25985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 26085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * In HZ DBCS, if the second byte is in the 21..7e range, 26185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * we report only the first byte as the illegal sequence. 26285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Otherwise we convert or report the pair of bytes. 26385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 26485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho leadIsOk = (uint8_t)(leadByte - 0x21) <= (0x7d - 0x21); 26585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho trailIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21); 26685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (leadIsOk && trailIsOk) { 267c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru tempBuf[0] = (char) (leadByte+0x80) ; 268c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru tempBuf[1] = (char) (mySourceChar+0x80); 269c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, 270c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru tempBuf, 2, args->converter->useFallback); 27185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho mySourceChar= (leadByte << 8) | mySourceChar; 27285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if (trailIsOk) { 27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* report a single illegal byte and continue with the following DBCS starter byte */ 27485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho --mySource; 27585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho mySourceChar = (int32_t)leadByte; 276c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else { 27785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* report a pair of illegal bytes if the second byte is not a DBCS starter */ 27885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* add another bit so that the code below writes 2 bytes in case of error */ 27985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho mySourceChar= 0x10000 | (leadByte << 8) | mySourceChar; 280c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->toUnicodeStatus =0x00; 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 285c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru if(mySourceChar == UCNV_TILDE) { 286c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->mode = UCNV_TILDE; 287c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru continue; 288c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else if(mySourceChar <= 0x7f) { 289c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru targetUniChar = (UChar)mySourceChar; /* ASCII */ 29085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = FALSE; /* the segment has something valid */ 291c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else { 292c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru targetUniChar = 0xffff; 29385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho myData->isEmptySegment = FALSE; /* different error here, reset this to avoid spurious future error */ 294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(targetUniChar < 0xfffe){ 297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(args->offsets) { 298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->offsets[myTarget - args->target]=(int32_t)(mySource - args->source - 1-(myData->isStateDBCS)); 299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(myTarget++)=(UChar)targetUniChar; 302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 303c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru else /* targetUniChar>=0xfffe */ { 304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(targetUniChar == 0xfffe){ 305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_INVALID_CHAR_FOUND; 306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_ILLEGAL_CHAR_FOUND; 309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 310c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru if(mySourceChar > 0xff){ 311c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->toUBytes[0] = (uint8_t)(mySourceChar >> 8); 312c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->toUBytes[1] = (uint8_t)mySourceChar; 313c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->toULength=2; 314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->toUBytes[0] = (uint8_t)mySourceChar; 317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->toULength=1; 318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err =U_BUFFER_OVERFLOW_ERROR; 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->target = myTarget; 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->source = mySource; 330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode * err){ 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *mySource = args->source; 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *myTarget = args->target; 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t* offsets = args->offsets; 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t mySourceIndex = 0; 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t myTargetIndex = 0; 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t targetLength = (int32_t)(args->targetLimit - myTarget); 342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t mySourceLength = (int32_t)(args->sourceLimit - args->source); 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t length=0; 344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t targetUniChar = 0x0000; 345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar32 mySourceChar = 0x0000; 346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo; 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS; 348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool oldIsTargetUCharDBCS = isTargetUCharDBCS; 349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int len =0; 350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* escSeq=NULL; 351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 35285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Calling code already handles this situation. */ 35385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*if ((args->converter == NULL) || (args->targetLimit < myTarget) || (args->sourceLimit < args->source)){ 354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_ILLEGAL_ARGUMENT_ERROR; 355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 35685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }*/ 357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(args->converter->fromUChar32!=0 && myTargetIndex < targetLength) { 358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru goto getTrail; 359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*writing the char to the output stream */ 361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (mySourceIndex < mySourceLength){ 362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru targetUniChar = missingCharMarker; 363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (myTargetIndex < targetLength){ 364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru mySourceChar = (UChar) mySource[mySourceIndex++]; 366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru oldIsTargetUCharDBCS = isTargetUCharDBCS; 369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(mySourceChar ==UCNV_TILDE){ 370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*concatEscape(args, &myTargetIndex, &targetLength,"\x7E\x7E",err,2,&mySourceIndex);*/ 371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len = ESC_LEN; 372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru escSeq = TILDE_ESCAPE; 373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); 374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru continue; 375c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else if(mySourceChar <= 0x7f) { 376c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru length = 1; 377c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru targetUniChar = mySourceChar; 378c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else { 379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru length= ucnv_MBCSFromUChar32(myConverterData->gbConverter->sharedData, 380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru mySourceChar,&targetUniChar,args->converter->useFallback); 381c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* we can only use lead bytes 21..7D and trail bytes 21..7E */ 382c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru if( length == 2 && 383c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru (uint16_t)(targetUniChar - 0xa1a1) <= (0xfdfe - 0xa1a1) && 384c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru (uint8_t)(targetUniChar - 0xa1) <= (0xfe - 0xa1) 385c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru ) { 386c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru targetUniChar -= 0x8080; 387c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } else { 388c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru targetUniChar = missingCharMarker; 389c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru } 390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (targetUniChar != missingCharMarker){ 392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myConverterData->isTargetUCharDBCS = isTargetUCharDBCS = (UBool)(targetUniChar>0x00FF); 393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(oldIsTargetUCharDBCS != isTargetUCharDBCS || !myConverterData->isEscapeAppended ){ 394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*Shifting from a double byte to single byte mode*/ 395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(!isTargetUCharDBCS){ 396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len =ESC_LEN; 397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru escSeq = SB_ESCAPE; 398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); 399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myConverterData->isEscapeAppended = TRUE; 400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ /* Shifting from a single byte to double byte mode*/ 402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len =ESC_LEN; 403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru escSeq = DB_ESCAPE; 404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); 405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myConverterData->isEscapeAppended = TRUE; 406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(isTargetUCharDBCS){ 411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if( myTargetIndex <targetLength){ 412c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru myTarget[myTargetIndex++] =(char) (targetUniChar >> 8); 413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(offsets){ 414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(offsets++) = mySourceIndex-1; 415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(myTargetIndex < targetLength){ 417c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru myTarget[myTargetIndex++] =(char) targetUniChar; 418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(offsets){ 419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(offsets++) = mySourceIndex-1; 420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 422c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; 423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_BUFFER_OVERFLOW_ERROR; 424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 426c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] =(char) (targetUniChar >> 8); 427c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; 428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_BUFFER_OVERFLOW_ERROR; 429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if( myTargetIndex <targetLength){ 433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myTarget[myTargetIndex++] = (char) (targetUniChar ); 434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(offsets){ 435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(offsets++) = mySourceIndex-1; 436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; 440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_BUFFER_OVERFLOW_ERROR; 441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* oops.. the code point is unassigned */ 447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*Handle surrogates */ 448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*check if the char is a First surrogate*/ 44983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(U16_IS_SURROGATE(mySourceChar)) { 45083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(U16_IS_SURROGATE_LEAD(mySourceChar)) { 451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->fromUChar32=mySourceChar; 452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetTrail: 453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*look ahead to find the trail surrogate*/ 454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(mySourceIndex < mySourceLength) { 455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* test the following code unit */ 456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar trail=(UChar) args->source[mySourceIndex]; 45783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(U16_IS_TRAIL(trail)) { 458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ++mySourceIndex; 45983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius mySourceChar=U16_GET_SUPPLEMENTARY(args->converter->fromUChar32, trail); 460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->fromUChar32=0x00; 461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* there are no surrogates in GB2312*/ 462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_INVALID_CHAR_FOUND; 463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* exit this condition tree */ 464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* this is an unmatched lead code unit (1st surrogate) */ 466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* callback(illegal) */ 467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err=U_ILLEGAL_CHAR_FOUND; 468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* no more input */ 471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_ZERO_ERROR; 472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* this is an unmatched trail code unit (2nd surrogate) */ 475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* callback(illegal) */ 476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err=U_ILLEGAL_CHAR_FOUND; 477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* callback(unassigned) for a BMP code point */ 480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_INVALID_CHAR_FOUND; 481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->converter->fromUChar32=mySourceChar; 484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else{ 488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *err = U_BUFFER_OVERFLOW_ERROR; 489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru targetUniChar=missingCharMarker; 492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->target += myTargetIndex; 495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args->source += mySourceIndex; 496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myConverterData->isTargetUCharDBCS = isTargetUCharDBCS; 497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { 501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter *cnv = args->converter; 502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverterDataHZ *convData=(UConverterDataHZ *) cnv->extraInfo; 503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *p; 504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char buffer[4]; 505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru p = buffer; 506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if( convData->isTargetUCharDBCS){ 508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *p++= UCNV_TILDE; 509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *p++= UCNV_CLOSE_BRACE; 510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru convData->isTargetUCharDBCS=FALSE; 511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *p++= (char)cnv->subChars[0]; 513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucnv_cbFromUWriteBytes(args, 515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buffer, (int32_t)(p - buffer), 516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru offsetIndex, err); 517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Structure for cloning an HZ converter into a single memory block. 521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ucnv_safeClone() of the HZ converter will align the entire cloneHZStruct, 522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and then ucnv_safeClone() of the sub-converter may additionally align 523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * subCnv inside the cloneHZStruct, for which we need the deadSpace after 524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * subCnv. This is because UAlignedMemory may be larger than the actually 525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * necessary alignment size for the platform. 526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The other cloneHZStruct fields will not be moved around, 527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and are aligned properly with cloneHZStruct's alignment. 528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct cloneHZStruct 530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter cnv; 532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter subCnv; 533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UAlignedMemory deadSpace; 534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverterDataHZ mydata; 535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UConverter * 539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_HZ_SafeClone(const UConverter *cnv, 540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void *stackBuffer, 541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t *pBufferSize, 542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status) 543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru struct cloneHZStruct * localClone; 545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t size, bufferSizeNeeded = sizeof(struct cloneHZStruct); 546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(*status)){ 548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ 552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *pBufferSize = bufferSizeNeeded; 553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru localClone = (struct cloneHZStruct *)stackBuffer; 557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ 558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataHZ)); 560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru localClone->cnv.extraInfo = &localClone->mydata; 561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru localClone->cnv.isExtraLocal = TRUE; 562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* deep-clone the sub-converter */ 564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */ 565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((UConverterDataHZ*)localClone->cnv.extraInfo)->gbConverter = 566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucnv_safeClone(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, &localClone->subCnv, &size, status); 567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return &localClone->cnv; 569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_HZ_GetUnicodeSet(const UConverter *cnv, 573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const USetAdder *sa, 574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverterUnicodeSet which, 575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *pErrorCode) { 576c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru /* HZ converts all of ASCII */ 577c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru sa->addRange(sa->set, 0, 0x7f); 578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* add all of the code points that the sub-converter handles */ 580c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru ucnv_MBCSGetFilteredUnicodeSetForUnicode( 581c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru ((UConverterDataHZ*)cnv->extraInfo)->gbConverter->sharedData, 582c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru sa, which, UCNV_SET_FILTER_HZ, 583c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru pErrorCode); 584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UConverterImpl _HZImpl={ 587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCNV_HZ, 589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _HZOpen, 594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _HZClose, 595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _HZReset, 596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter_toUnicode_HZ_OFFSETS_LOGIC, 598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter_toUnicode_HZ_OFFSETS_LOGIC, 599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter_fromUnicode_HZ_OFFSETS_LOGIC, 600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UConverter_fromUnicode_HZ_OFFSETS_LOGIC, 601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _HZ_WriteSub, 606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _HZ_SafeClone, 607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _HZ_GetUnicodeSet 608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UConverterStaticData _HZStaticData={ 611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sizeof(UConverterStaticData), 612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "HZ", 613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 0, 614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCNV_IBM, 615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCNV_HZ, 616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1, 617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 4, 618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 0x1a, 0, 0, 0 }, 619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1, 620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FALSE, 621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FALSE, 622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 0, 623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 0, 624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* reserved */ 625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UConverterSharedData _HZData={ 630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sizeof(UConverterSharedData), 631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ~((uint32_t) 0), 632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL, 634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &_HZStaticData, 635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FALSE, 636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &_HZImpl, 637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 0 638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ 641