summaryrefslogtreecommitdiff
path: root/src/modules/filters/utf8utf16.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/filters/utf8utf16.cpp')
-rw-r--r--src/modules/filters/utf8utf16.cpp115
1 files changed, 57 insertions, 58 deletions
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 <utf8utf16.h>
+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