@@ -149,28 +149,28 @@ } size_t of_string_utf8_get_index(const char *string, size_t position) { - size_t index = position; + size_t idx = position; for (size_t i = 0; i < position; i++) if OF_UNLIKELY ((string[i] & 0xC0) == 0x80) - index--; + idx--; - return index; + return idx; } size_t -of_string_utf8_get_position(const char *string, size_t index, size_t length) +of_string_utf8_get_position(const char *string, size_t idx, size_t length) { - for (size_t i = 0; i <= index; i++) + for (size_t i = 0; i <= idx; i++) if OF_UNLIKELY ((string[i] & 0xC0) == 0x80) - if (++index > length) + if (++idx > length) return OF_NOT_FOUND; - return index; + return idx; } @implementation OFString_UTF8 - init { @@ -391,29 +391,35 @@ } - initWithUTF8StringNoCopy: (char *)UTF8String freeWhenDone: (bool)freeWhenDone { - self = [super init]; + @try { + self = [super init]; + } @catch (id e) { + if (freeWhenDone) + free(UTF8String); + @throw e; + } @try { size_t UTF8StringLength = strlen(UTF8String); + _s = &_storage; + + if (freeWhenDone) + _s->freeWhenDone = UTF8String; + if (UTF8StringLength >= 3 && memcmp(UTF8String, "\xEF\xBB\xBF", 3) == 0) { UTF8String += 3; UTF8StringLength -= 3; } - _s = &_storage; - _s->cString = (char *)UTF8String; _s->cStringLength = UTF8StringLength; - if (freeWhenDone) - _s->freeWhenDone = UTF8String; - switch (of_string_utf8_check(UTF8String, UTF8StringLength, &_s->length)) { case 1: _s->isUTF8 = true; break; @@ -944,25 +950,24 @@ _s->hashed = true; return hash; } -- (of_unichar_t)characterAtIndex: (size_t)index +- (of_unichar_t)characterAtIndex: (size_t)idx { of_unichar_t character; - if (index >= _s->length) + if (idx >= _s->length) @throw [OFOutOfRangeException exception]; if (!_s->isUTF8) - return _s->cString[index]; + return _s->cString[idx]; - index = of_string_utf8_get_position(_s->cString, index, - _s->cStringLength); + idx = of_string_utf8_get_position(_s->cString, idx, _s->cStringLength); - if (of_string_utf8_decode(_s->cString + index, - _s->cStringLength - index, &character) <= 0) + if (of_string_utf8_decode(_s->cString + idx, + _s->cStringLength - idx, &character) <= 0) @throw [OFInvalidEncodingException exception]; return character; }