From 8c8aa6b07e595cfac56838b5964ab3e96051f1b2 Mon Sep 17 00:00:00 2001 From: "Roberto C. Sanchez" Date: Sat, 29 Mar 2014 10:53:49 -0400 Subject: Imported Upstream version 1.5.7 --- src/modules/filters/utf8utf16.cpp | 115 +++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 58 deletions(-) (limited to 'src/modules/filters/utf8utf16.cpp') diff --git a/src/modules/filters/utf8utf16.cpp b/src/modules/filters/utf8utf16.cpp index 9aea6fe..2fddf4c 100644 --- a/src/modules/filters/utf8utf16.cpp +++ b/src/modules/filters/utf8utf16.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * UTF8UTF16 - SWFilter decendant to convert UTF-8 to UTF-16 + * UTF8UTF16 - SWFilter descendant to convert UTF-8 to UTF-16 * */ @@ -9,71 +9,70 @@ #include +SWORD_NAMESPACE_START + UTF8UTF16::UTF8UTF16() { } -char UTF8UTF16::ProcessText(char *text, int maxlen, const SWKey *key, const SWModule *module) -{ - unsigned char *from; - unsigned short *to; +char UTF8UTF16::processText(SWBuf &text, const SWKey *key, const SWModule *module) { + const unsigned char *from; - int len; - unsigned long uchar; - unsigned char significantFirstBits, subsequent; - unsigned short schar; - - len = strlen(text) + 1; // shift string to right of buffer - if (len < maxlen) { - memmove(&text[maxlen - len], text, len); - from = (unsigned char*)&text[maxlen - len]; - } - else - from = (unsigned char*)text; + int len; + unsigned long uchar, uchars[10]; + unsigned char significantFirstBits, subsequent; + unsigned short schar; + if ((unsigned long)key < 2) // hack, we're en(1)/de(0)ciphering + return -1; + - // ------------------------------- - - for (to = (unsigned short*)text; *from; from++) { - uchar = 0; - if ((*from & 128) != 128) { - // if (*from != ' ') - uchar = *from; - } - else if ((*from & 128) && ((*from & 64) != 64)) { - // error, do nothing - continue; - } - else { - *from <<= 1; - for (subsequent = 1; (*from & 128); subsequent++) { - *from <<= 1; - from[subsequent] &= 63; - uchar <<= 6; - uchar |= from[subsequent]; - } - subsequent--; - *from <<=1; - significantFirstBits = 8 - (2+subsequent); - - uchar |= (((short)*from) << (((6*subsequent)+significantFirstBits)-8)); - from += subsequent; - } + SWBuf orig = text; + from = (const unsigned char *)orig.c_str(); - if (uchar < 0x1ffff) { - *to++ = (unsigned short)uchar; - } - else { - uchar -= 0x10000; - schar = 0xD800 | (uchar & 0x03ff); - uchar >>= 10; - uchar |= 0xDC00; - *to++ = (unsigned short)schar; - *to++ = (unsigned short)uchar; - } - } - *to = (unsigned short)0; + for (text = ""; *from; from++) { + uchar = 0; + if ((*from & 128) != 128) { + //if (*from != ' ') + uchar = *from; + } + else if ((*from & 128) && ((*from & 64) != 64)) { + // error, do nothing + continue; + } + else { + uchars[0] = *from; + uchars[0] <<= 1; + for (subsequent = 1; (uchars[0] & 128) && (subsequent < 10); subsequent++) { + uchars[0] <<= 1; + uchars[subsequent] = from[subsequent]; + uchars[subsequent] &= 63; + uchar <<= 6; + uchar |= uchars[subsequent]; + } + subsequent--; + uchars[0] <<=1; + significantFirstBits = 8 - (2+subsequent); + + uchar |= (((short)uchars[0]) << (((6*subsequent)+significantFirstBits)-8)); + from += subsequent; + } - return 0; + if (uchar < 0x1ffff) { + text.setSize(text.size()+2); + *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)uchar; + } + else { + uchar -= 0x10000; + schar = 0xD800 | (uchar & 0x03ff); + uchar >>= 10; + uchar |= 0xDC00; + text.setSize(text.size()+4); + *((unsigned short *)(text.getRawData()+(text.size()-4))) = (unsigned short)schar; + *((unsigned short *)(text.getRawData()+(text.size()-2))) = (unsigned short)uchar; + } + } + return 0; } +SWORD_NAMESPACE_END -- cgit v1.2.3