|
|
| version 1.23.8.1, 2002/06/27 11:56:19 | version 1.25, 2002/07/30 14:09:23 |
|---|---|
| Line 191 void Charset::sort_ToTable() { | Line 191 void Charset::sort_ToTable() { |
| } | } |
| static XMLByte xlatOneTo(const XMLCh toXlat, | static XMLByte xlatOneTo(const XMLCh toXlat, |
| const Charset::Tables& tables) { | const Charset::Tables& tables, |
| XMLByte not_found) { | |
| unsigned int lowOfs = 0; | unsigned int lowOfs = 0; |
| unsigned int hiOfs = tables.toTableSize - 1; | unsigned int hiOfs = tables.toTableSize - 1; |
| XMLByte curByte = 0; | XMLByte curByte = 0; |
| Line 210 static XMLByte xlatOneTo(const XMLCh toX | Line 211 static XMLByte xlatOneTo(const XMLCh toX |
| return tables.toTable[midOfs].extCh; | return tables.toTable[midOfs].extCh; |
| } while(lowOfs+1<hiOfs); | } while(lowOfs+1<hiOfs); |
| return '?'; | return not_found; |
| } | } |
| void Charset::transcode(Pool& pool, | void Charset::transcode(Pool& pool, |
| Line 413 static size_t transcodeFromUTF8( | Line 414 static size_t transcodeFromUTF8( |
| // If it will fit into a single char, then put it in. Otherwise | // If it will fit into a single char, then put it in. Otherwise |
| // fail [*encode it as a surrogate pair. If its not valid, use the | // fail [*encode it as a surrogate pair. If its not valid, use the |
| // replacement char.*] | // replacement char.*] |
| if(!(tmpVal & 0xFFFF0000)) | if(!(tmpVal & 0xFFFF0000)) { |
| *outPtr++= xlatOneTo(tmpVal, tables); | if(XMLByte xlat=xlatOneTo(tmpVal, tables, 0)) |
| else | *outPtr++=xlat; |
| else | |
| outPtr+=sprintf((char *)outPtr, "&#%d;", tmpVal); // &#decimal; | |
| } else | |
| throw Exception(0, | throw Exception(0, |
| 0, | 0, |
| "transcodeFromUTF8 error: too big tmpVal(0x%08X)", tmpVal); | "transcodeFromUTF8 error: too big tmpVal(0x%08X)", tmpVal); |
| Line 434 static size_t transcodeFromUTF8( | Line 438 static size_t transcodeFromUTF8( |
| void Charset::transcodeToUTF8(Pool& pool, | void Charset::transcodeToUTF8(Pool& pool, |
| const void *source_body, size_t source_content_length, | const void *source_body, size_t source_content_length, |
| const void *& adest_body, size_t& dest_content_length) const { | const void *& adest_body, size_t& dest_content_length) const { |
| dest_content_length=source_content_length*6/*so that surly enough*/; | dest_content_length=source_content_length*6/*so that surly enough, max utf8 seq len=6*/; |
| XMLByte *dest_body=(XMLByte*)pool.malloc(dest_content_length); | XMLByte *dest_body=(XMLByte*)pool.malloc(dest_content_length); |
| if(::transcodeToUTF8( | if(::transcodeToUTF8( |
| Line 451 void Charset::transcodeToUTF8(Pool& pool | Line 455 void Charset::transcodeToUTF8(Pool& pool |
| void Charset::transcodeFromUTF8(Pool& pool, | void Charset::transcodeFromUTF8(Pool& pool, |
| const void *source_body, size_t source_content_length, | const void *source_body, size_t source_content_length, |
| const void *& adest_body, size_t& dest_content_length) const { | const void *& adest_body, size_t& dest_content_length) const { |
| dest_content_length=source_content_length/*surly enough*/; | dest_content_length=source_content_length*6/*so that surly enough, "ÿ" has max ratio */; |
| XMLByte *dest_body=(XMLByte*)pool.malloc(dest_content_length); | XMLByte *dest_body=(XMLByte*)pool.malloc(dest_content_length); |
| if(::transcodeFromUTF8( | if(::transcodeFromUTF8( |
| Line 484 void Charset::transcodeToCharset(Pool& p | Line 488 void Charset::transcodeToCharset(Pool& p |
| for(XMLByte* outPtr=dest_body; srcPtr<srcEnd; srcPtr++) { | for(XMLByte* outPtr=dest_body; srcPtr<srcEnd; srcPtr++) { |
| XMLCh curVal = tables.fromTable[*srcPtr]; | XMLCh curVal = tables.fromTable[*srcPtr]; |
| if(curVal) | if(curVal) |
| *outPtr++=xlatOneTo(curVal, dest_charset.tables); | *outPtr++=xlatOneTo(curVal, dest_charset.tables, '?'); |
| else { | else { |
| // use the replacement character | // use the replacement character |
| *outPtr++= '?'; | *outPtr++= '?'; |