@@ -150,10 +150,21 @@ while (*string++ != 0) length++; return length; } + +size_t +of_string_utf32_length(const uint32_t *string) +{ + size_t length = 0; + + while (*string++ != 0) + length++; + + return length; +} static OFString* standardize_path(OFArray *components, OFString *currentDirectory, OFString *parentDirectory, OFString *joinString) { @@ -337,10 +348,22 @@ { return (id)[[OFString_UTF8 alloc] initWithUTF16String: string length: length byteOrder: byteOrder]; } + +- initWithUTF32String: (const uint32_t*)string +{ + return (id)[[OFString_UTF8 alloc] initWithUTF32String: string]; +} + +- initWithUTF32String: (const uint32_t*)string + byteOrder: (of_byte_order_t)byteOrder +{ + return (id)[[OFString_UTF8 alloc] initWithUTF32String: string + byteOrder: byteOrder]; +} - initWithFormat: (OFConstantString*)format, ... { id ret; va_list arguments; @@ -536,10 +559,22 @@ { return [[[self alloc] initWithUTF16String: string length: length byteOrder: byteOrder] autorelease]; } + ++ (instancetype)stringWithUTF32String: (const uint32_t*)string +{ + return [[[self alloc] initWithUTF32String: string] autorelease]; +} + ++ (instancetype)stringWithUTF32String: (const uint32_t*)string + byteOrder: (of_byte_order_t)byteOrder +{ + return [[[self alloc] initWithUTF32String: string + byteOrder: byteOrder] autorelease]; +} + (instancetype)stringWithFormat: (OFConstantString*)format, ... { id ret; va_list arguments; @@ -711,10 +746,25 @@ } @catch (id e) { [self release]; @throw e; } } + +- initWithUTF32String: (const uint32_t*)string +{ + return [self initWithCharacters: string + length: of_string_utf32_length(string) + byteOrder: OF_BYTE_ORDER_NATIVE]; +} + +- initWithUTF32String: (const uint32_t*)string + byteOrder: (of_byte_order_t)byteOrder +{ + return [self initWithCharacters: string + length: of_string_utf32_length(string) + byteOrder: byteOrder]; +} - initWithFormat: (OFConstantString*)format, ... { id ret; va_list arguments; @@ -2116,10 +2166,37 @@ if (characters[i] > 0xFFFF) UTF16StringLength++; return UTF16StringLength; } + +- (const of_unichar_t*)UTF32String +{ + return [self UTF32StringWithByteOrder: OF_BYTE_ORDER_NATIVE]; +} + +- (const of_unichar_t*)UTF32StringWithByteOrder: (of_byte_order_t)byteOrder +{ + OFObject *object = [[[OFObject alloc] init] autorelease]; + size_t length = [self length]; + of_unichar_t *ret; + + ret = [object allocMemoryWithSize: sizeof(of_unichar_t) + count: length + 1]; + [self getCharacters: ret + inRange: of_range(0, length)]; + ret[length] = 0; + + if (byteOrder != OF_BYTE_ORDER_NATIVE) { + size_t i; + + for (i = 0; i < length; i++) + ret[i] = OF_BSWAP32(ret[i]); + } + + return ret; +} - (void)writeToFile: (OFString*)path { void *pool = objc_autoreleasePoolPush(); OFFile *file;