@@ -646,11 +646,11 @@ - initWithUTF16String: (const uint16_t*)string length: (size_t)length { return [self initWithUTF16String: string length: length - byteOrder: OF_BYTE_ORDER_BIG_ENDIAN]; + byteOrder: OF_BYTE_ORDER_NATIVE]; } - initWithUTF16String: (const uint16_t*)string length: (size_t)length byteOrder: (of_byte_order_t)byteOrder @@ -1996,16 +1996,22 @@ return ret; } - (const uint16_t*)UTF16String { + return [self UTF16StringWithByteOrder: OF_BYTE_ORDER_NATIVE]; +} + +- (const uint16_t*)UTF16StringWithByteOrder: (of_byte_order_t)byteOrder +{ OFObject *object = [[[OFObject alloc] init] autorelease]; void *pool = objc_autoreleasePoolPush(); const of_unichar_t *characters = [self characters]; size_t length = [self length]; uint16_t *ret; size_t i, j; + BOOL swap = (byteOrder != OF_BYTE_ORDER_NATIVE); /* Allocate memory for the worst case */ ret = [object allocMemoryWithSize: sizeof(uint16_t) count: length * 2]; @@ -2016,16 +2022,25 @@ if (c > 0x10FFFF) @throw [OFInvalidEncodingException exceptionWithClass: [self class]]; - if (c > 0xFFFF) { - c -= 0x10000; - ret[j++] = OF_BSWAP16_IF_LE(0xD800 | (c >> 10)); - ret[j++] = OF_BSWAP16_IF_LE(0xDC00 | (c & 0x3FF)); - } else - ret[j++] = OF_BSWAP16_IF_LE(c); + if (swap) { + if (c > 0xFFFF) { + c -= 0x10000; + ret[j++] = OF_BSWAP16(0xD800 | (c >> 10)); + ret[j++] = OF_BSWAP16(0xDC00 | (c & 0x3FF)); + } else + ret[j++] = OF_BSWAP16(c); + } else { + if (c > 0xFFFF) { + c -= 0x10000; + ret[j++] = 0xD800 | (c >> 10); + ret[j++] = 0xDC00 | (c & 0x3FF); + } else + ret[j++] = c; + } } @try { ret = [object resizeMemory: ret size: sizeof(uint16_t) @@ -2036,10 +2051,24 @@ objc_autoreleasePoolPop(pool); return ret; } + +- (size_t)UTF16StringLength +{ + const of_unichar_t *characters = [self characters]; + size_t i, length, UTF16StringLength; + + length = UTF16StringLength = [self length]; + + for (i = 0; i < length; i++) + if (characters[i] > 0xFFFF) + UTF16StringLength++; + + return UTF16StringLength; +} - (void)writeToFile: (OFString*)path { void *pool = objc_autoreleasePoolPush(); OFFile *file;