@@ -139,10 +139,21 @@ return 4; } return 0; } + +size_t +of_string_utf16_length(const uint16_t *string) +{ + size_t length = 0; + + while (*string++ != 0) + length++; + + return length; +} static OFString* standardize_path(OFArray *components, OFString *currentDirectory, OFString *parentDirectory, OFString *joinString) { @@ -298,17 +309,29 @@ { return (id)[[OFString_UTF8 alloc] initWithCharacters: string length: length byteOrder: byteOrder]; } + +- initWithUTF16String: (const uint16_t*)string +{ + return (id)[[OFString_UTF8 alloc] initWithUTF16String: string]; +} - initWithUTF16String: (const uint16_t*)string length: (size_t)length { return (id)[[OFString_UTF8 alloc] initWithUTF16String: string length: length]; } + +- initWithUTF16String: (const uint16_t*)string + byteOrder: (of_byte_order_t)byteOrder +{ + return (id)[[OFString_UTF8 alloc] initWithUTF16String: string + byteOrder: byteOrder]; +} - initWithUTF16String: (const uint16_t*)string length: (size_t)length byteOrder: (of_byte_order_t)byteOrder { @@ -485,17 +508,29 @@ { return [[[self alloc] initWithCharacters: string length: length byteOrder: byteOrder] autorelease]; } + ++ (instancetype)stringWithUTF16String: (const uint16_t*)string +{ + return [[[self alloc] initWithUTF16String: string] autorelease]; +} + (instancetype)stringWithUTF16String: (const uint16_t*)string length: (size_t)length { return [[[self alloc] initWithUTF16String: string length: length] autorelease]; } + ++ (instancetype)stringWithUTF16String: (const uint16_t*)string + byteOrder: (of_byte_order_t)byteOrder +{ + return [[[self alloc] initWithUTF16String: string + byteOrder: byteOrder] autorelease]; +} + (instancetype)stringWithUTF16String: (const uint16_t*)string length: (size_t)length byteOrder: (of_byte_order_t)byteOrder { @@ -640,18 +675,33 @@ } @catch (id e) { [self release]; @throw e; } } + +- initWithUTF16String: (const uint16_t*)string +{ + return [self initWithUTF16String: string + length: of_string_utf16_length(string) + byteOrder: OF_BYTE_ORDER_NATIVE]; +} - initWithUTF16String: (const uint16_t*)string length: (size_t)length { return [self initWithUTF16String: string length: length byteOrder: OF_BYTE_ORDER_NATIVE]; } + +- initWithUTF16String: (const uint16_t*)string + byteOrder: (of_byte_order_t)byteOrder +{ + return [self initWithUTF16String: string + length: of_string_utf16_length(string) + byteOrder: byteOrder]; +} - initWithUTF16String: (const uint16_t*)string length: (size_t)length byteOrder: (of_byte_order_t)byteOrder { @@ -2011,11 +2061,11 @@ 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]; + count: (length + 1) * 2]; j = 0; for (i = 0; i < length; i++) { of_unichar_t c = characters[i]; @@ -2038,15 +2088,16 @@ ret[j++] = 0xDC00 | (c & 0x3FF); } else ret[j++] = c; } } + ret[j] = 0; @try { ret = [object resizeMemory: ret size: sizeof(uint16_t) - count: j]; + count: j + 1]; } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only tried to make it smaller */ } objc_autoreleasePoolPop(pool);