Index: src/OFMutableString_UTF8.m ================================================================== --- src/OFMutableString_UTF8.m +++ src/OFMutableString_UTF8.m @@ -42,14 +42,21 @@ { if (self == [OFMutableString_UTF8 class]) [self inheritMethodsFromClass: [OFString_UTF8 class]]; } -- initWithUTF8StringNoCopy: (const char*)UTF8String +- initWithUTF8StringNoCopy: (char*)UTF8String freeWhenDone: (BOOL)freeWhenDone { - return [self initWithUTF8String: UTF8String]; + @try { + self = [self initWithUTF8String: UTF8String]; + } @finally { + if (freeWhenDone) + free(UTF8String); + } + + return self; } - (void)OF_convertWithWordStartTable: (const of_unichar_t *const[])startTable wordMiddleTable: (const of_unichar_t *const[])middleTable wordStartTableSize: (size_t)startTableSize Index: src/OFString.h ================================================================== --- src/OFString.h +++ src/OFString.h @@ -101,11 +101,11 @@ * @param UTF8String A UTF-8 encoded C string to initialize the OFString with * @param freeWhenDone Whether to free the C string when the OFString gets * deallocated * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF8StringNoCopy: (const char*)UTF8String ++ (instancetype)stringWithUTF8StringNoCopy: (char*)UTF8String freeWhenDone: (BOOL)freeWhenDone; /*! * @brief Creates a new OFString from a C string with the specified encoding. * @@ -279,11 +279,11 @@ * @param UTF8String A UTF-8 encoded C string to initialize the OFString with * @param freeWhenDone Whether to free the C string when it is not needed * anymore * @return An initialized OFString */ -- initWithUTF8StringNoCopy: (const char*)UTF8String +- initWithUTF8StringNoCopy: (char*)UTF8String freeWhenDone: (BOOL)freeWhenDone; /*! * @brief Initializes an already allocated OFString from a C string with the * specified encoding. Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -228,11 +228,11 @@ return (id)[string OF_initWithUTF8String: UTF8String length: UTF8StringLength storage: storage]; } -- initWithUTF8StringNoCopy: (const char*)UTF8String +- initWithUTF8StringNoCopy: (char*)UTF8String freeWhenDone: (BOOL)freeWhenDone { return (id)[[OFString_UTF8 alloc] initWithUTF8StringNoCopy: UTF8String freeWhenDone: freeWhenDone]; @@ -441,11 +441,11 @@ return [[[self alloc] initWithUTF8String: UTF8String length: UTF8StringLength] autorelease]; } -+ (instancetype)stringWithUTF8StringNoCopy: (const char*)UTF8String ++ (instancetype)stringWithUTF8StringNoCopy: (char*)UTF8String freeWhenDone: (BOOL)freeWhenDone { return [[[self alloc] initWithUTF8StringNoCopy: UTF8String freeWhenDone: freeWhenDone] autorelease]; @@ -582,11 +582,11 @@ return [self initWithCString: UTF8String encoding: OF_STRING_ENCODING_UTF_8 length: UTF8StringLength]; } -- initWithUTF8StringNoCopy: (const char*)UTF8String +- initWithUTF8StringNoCopy: (char*)UTF8String freeWhenDone: (BOOL)freeWhenDone { return [self initWithUTF8String: UTF8String]; } Index: src/OFString_UTF8.m ================================================================== --- src/OFString_UTF8.m +++ src/OFString_UTF8.m @@ -334,18 +334,17 @@ } return self; } -- initWithUTF8StringNoCopy: (const char*)UTF8String - freeWhenDone: (BOOL)freeWhenDone_ +- initWithUTF8StringNoCopy: (char*)UTF8String + freeWhenDone: (BOOL)freeWhenDone { self = [super init]; @try { size_t UTF8StringLength = strlen(UTF8String); - char *freeWhenDone = (char*)UTF8String; if (UTF8StringLength >= 3 && !memcmp(UTF8String, "\xEF\xBB\xBF", 3)) { UTF8String += 3; UTF8StringLength -= 3; @@ -354,12 +353,12 @@ s = &s_store; s->cString = (char*)UTF8String; s->cStringLength = UTF8StringLength; - if (freeWhenDone_) - s->freeWhenDone = freeWhenDone; + if (freeWhenDone) + s->freeWhenDone = UTF8String; switch (of_string_utf8_check(UTF8String, UTF8StringLength, &s->length)) { case 1: s->isUTF8 = YES;