@@ -286,13 +286,21 @@ + string { return [[[self alloc] init] autorelease]; } -+ stringWithCString: (const char*)cString ++ stringWithUTF8String: (const char*)UTF8String { - return [[[self alloc] initWithCString: cString] autorelease]; + return [[[self alloc] initWithUTF8String: UTF8String] autorelease]; +} + ++ stringWithUTF8String: (const char*)UTF8String + length: (size_t)UTF8StringLength +{ + return [[[self alloc] + initWithUTF8String: UTF8String + length: UTF8StringLength] autorelease]; } + stringWithCString: (const char*)cString encoding: (of_string_encoding_t)encoding { @@ -304,17 +312,10 @@ encoding: (of_string_encoding_t)encoding length: (size_t)cStringLength { return [[[self alloc] initWithCString: cString encoding: encoding - length: cStringLength] autorelease]; -} - -+ stringWithCString: (const char*)cString - length: (size_t)cStringLength -{ - return [[[self alloc] initWithCString: cString length: cStringLength] autorelease]; } + stringWithString: (OFString*)string { @@ -443,15 +444,23 @@ } return self; } -- initWithCString: (const char*)cString +- initWithUTF8String: (const char*)UTF8String +{ + return [self initWithCString: UTF8String + encoding: OF_STRING_ENCODING_UTF_8 + length: strlen(UTF8String)]; +} + +- initWithUTF8String: (const char*)UTF8String + length: (size_t)UTF8StringLength { - return [self initWithCString: cString + return [self initWithCString: UTF8String encoding: OF_STRING_ENCODING_UTF_8 - length: strlen(cString)]; + length: UTF8StringLength]; } - initWithCString: (const char*)cString encoding: (of_string_encoding_t)encoding { @@ -589,18 +598,10 @@ } return self; } -- initWithCString: (const char*)cString - length: (size_t)cStringLength -{ - return [self initWithCString: cString - encoding: OF_STRING_ENCODING_UTF_8 - length: cStringLength]; -} - - initWithString: (OFString*)string { self = [super init]; @try { @@ -609,11 +610,11 @@ /* * We need one call to make sure it's initialized (in case it's * a constant string). */ - s->cStringLength = [string cStringLength]; + s->cStringLength = [string UTF8StringLength]; s->isUTF8 = string->s->isUTF8; s->length = string->s->length; s->cString = [self allocMemoryWithSize: s->cStringLength + 1]; memcpy(s->cString, string->s->cString, s->cStringLength + 1); @@ -891,12 +892,12 @@ selector: _cmd]; s = [self allocMemoryWithSize: sizeof(*s)]; memset(s, 0, sizeof(*s)); - if ((cStringLength = of_vasprintf(&s->cString, [format cString], - arguments)) == -1) + if ((cStringLength = of_vasprintf(&s->cString, + [format UTF8String], arguments)) == -1) @throw [OFInvalidFormatException newWithClass: isa]; s->cStringLength = cStringLength; @try { @@ -950,29 +951,29 @@ /* * First needs to be a call to be sure it is initialized, in * case it's a constant string. */ - s->cStringLength = [firstComponent cStringLength]; + s->cStringLength = [firstComponent UTF8StringLength]; s->isUTF8 = firstComponent->s->isUTF8; s->length = firstComponent->s->length; /* Calculate length and see if we need UTF-8 */ va_copy(argumentsCopy, arguments); while ((component = va_arg(argumentsCopy, OFString*)) != nil) { /* First needs to be a call, see above */ - s->cStringLength += 1 + [component cStringLength]; + s->cStringLength += 1 + [component UTF8StringLength]; s->length += 1 + component->s->length; if (component->s->isUTF8) s->isUTF8 = YES; } s->cString = [self allocMemoryWithSize: s->cStringLength + 1]; - cStringLength = [firstComponent cStringLength]; - memcpy(s->cString, [firstComponent cString], cStringLength); + cStringLength = [firstComponent UTF8StringLength]; + memcpy(s->cString, [firstComponent UTF8String], cStringLength); i = cStringLength; while ((component = va_arg(arguments, OFString*)) != nil) { /* * We already sent each component a message, so we can @@ -1010,11 +1011,12 @@ struct stat st; @try { OFFile *file; - if (stat([path cString], &st) == -1) + if (stat([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE], + &st) == -1) @throw [OFOpenFileFailedException newWithClass: isa path: path mode: @"rb"]; if (st.st_size > SIZE_MAX) @@ -1128,11 +1130,11 @@ } return self; } -- (const char*)cString +- (const char*)UTF8String { return s->cString; } - (const char*)cStringWithEncoding: (of_string_encoding_t)encoding @@ -1154,11 +1156,11 @@ - (size_t)length { return s->length; } -- (size_t)cStringLength +- (size_t)UTF8StringLength { return s->cStringLength; } - (size_t)cStringLengthWithEncoding: (of_string_encoding_t)encoding @@ -1184,11 +1186,11 @@ if (![object isKindOfClass: [OFString class]]) return NO; otherString = object; - if ([otherString cStringLength] != s->cStringLength || + if ([otherString UTF8StringLength] != s->cStringLength || otherString->s->length != s->length) return NO; if (strcmp(s->cString, otherString->s->cString)) return NO; @@ -1215,15 +1217,15 @@ if (![object isKindOfClass: [OFString class]]) @throw [OFInvalidArgumentException newWithClass: isa selector: _cmd]; otherString = object; - otherCStringLength = [otherString cStringLength]; + otherCStringLength = [otherString UTF8StringLength]; minimumCStringLength = (s->cStringLength > otherCStringLength ? otherCStringLength : s->cStringLength); - if ((compare = memcmp(s->cString, [otherString cString], + if ((compare = memcmp(s->cString, [otherString UTF8String], minimumCStringLength)) == 0) { if (s->cStringLength > otherCStringLength) return OF_ORDERED_DESCENDING; if (s->cStringLength < otherCStringLength) return OF_ORDERED_ASCENDING; @@ -1244,12 +1246,12 @@ if (![otherString isKindOfClass: [OFString class]]) @throw [OFInvalidArgumentException newWithClass: isa selector: _cmd]; - otherCString = [otherString cString]; - otherCStringLength = [otherString cStringLength]; + otherCString = [otherString UTF8String]; + otherCStringLength = [otherString UTF8StringLength]; if (!s->isUTF8) { minimumCStringLength = (s->cStringLength > otherCStringLength ? otherCStringLength : s->cStringLength); @@ -1375,12 +1377,12 @@ return character; } - (size_t)indexOfFirstOccurrenceOfString: (OFString*)string { - const char *cString = [string cString]; - size_t i, cStringLength = [string cStringLength]; + const char *cString = [string UTF8String]; + size_t i, cStringLength = [string UTF8StringLength]; if (cStringLength == 0) return 0; if (cStringLength > s->cStringLength) @@ -1393,12 +1395,12 @@ return OF_INVALID_INDEX; } - (size_t)indexOfLastOccurrenceOfString: (OFString*)string { - const char *cString = [string cString]; - size_t i, cStringLength = [string cStringLength]; + const char *cString = [string UTF8String]; + size_t i, cStringLength = [string UTF8StringLength]; if (cStringLength == 0) return of_string_position_to_index(s->cString, s->cStringLength); @@ -1415,11 +1417,11 @@ } } - (BOOL)containsString: (OFString*)string { - const char *cString = [string cString]; + const char *cString = [string UTF8String]; size_t i, cStringLength = string->s->cStringLength; if (cStringLength == 0) return YES; @@ -1446,12 +1448,12 @@ s->cStringLength); end = of_string_index_to_position(s->cString, end, s->cStringLength); } - return [OFString stringWithCString: s->cString + start - length: end - start]; + return [OFString stringWithUTF8String: s->cString + start + length: end - start]; } - (OFString*)stringByAppendingString: (OFString*)string { OFMutableString *new; @@ -1543,35 +1545,35 @@ return new; } - (BOOL)hasPrefix: (OFString*)prefix { - size_t cStringLength = [prefix cStringLength]; + size_t cStringLength = [prefix UTF8StringLength]; if (cStringLength > s->cStringLength) return NO; - return !memcmp(s->cString, [prefix cString], cStringLength); + return !memcmp(s->cString, [prefix UTF8String], cStringLength); } - (BOOL)hasSuffix: (OFString*)suffix { - size_t cStringLength = [suffix cStringLength]; + size_t cStringLength = [suffix UTF8StringLength]; if (cStringLength > s->cStringLength) return NO; return !memcmp(s->cString + (s->cStringLength - cStringLength), - [suffix cString], cStringLength); + [suffix UTF8String], cStringLength); } - (OFArray*)componentsSeparatedByString: (OFString*)delimiter { OFAutoreleasePool *pool; OFMutableArray *array; - const char *cString = [delimiter cString]; - size_t cStringLength = [delimiter cStringLength]; + const char *cString = [delimiter UTF8String]; + size_t cStringLength = [delimiter UTF8StringLength]; size_t i, last; array = [OFMutableArray array]; pool = [[OFAutoreleasePool alloc] init]; @@ -1584,16 +1586,17 @@ for (i = 0, last = 0; i <= s->cStringLength - cStringLength; i++) { if (memcmp(s->cString + i, cString, cStringLength)) continue; - [array addObject: [OFString stringWithCString: s->cString + last - length: i - last]]; + [array addObject: + [OFString stringWithUTF8String: s->cString + last + length: i - last]]; i += cStringLength - 1; last = i + 1; } - [array addObject: [OFString stringWithCString: s->cString + last]]; + [array addObject: [OFString stringWithUTF8String: s->cString + last]]; [array makeImmutable]; [pool release]; @@ -1626,18 +1629,18 @@ if (s->cString[i] == OF_PATH_DELIMITER) { #else if (s->cString[i] == '/' || s->cString[i] == '\\') { #endif [ret addObject: - [OFString stringWithCString: s->cString + last - length: i - last]]; + [OFString stringWithUTF8String: s->cString + last + length: i - last]]; last = i + 1; } } - [ret addObject: [OFString stringWithCString: s->cString + last - length: i - last]]; + [ret addObject: [OFString stringWithUTF8String: s->cString + last + length: i - last]]; [ret makeImmutable]; [pool release]; @@ -1676,12 +1679,12 @@ * removed, so return a new string anyway. */ if (i < 0) i = 0; - return [OFString stringWithCString: s->cString + i - length: pathCStringLength - i]; + return [OFString stringWithUTF8String: s->cString + i + length: pathCStringLength - i]; } - (OFString*)stringByDeletingLastPathComponent { size_t i, pathCStringLength = s->cStringLength; @@ -1696,29 +1699,29 @@ s->cString[pathCStringLength - 1] == '\\') #endif pathCStringLength--; if (pathCStringLength == 0) - return [OFString stringWithCString: s->cString - length: 1]; + return [OFString stringWithUTF8String: s->cString + length: 1]; for (i = pathCStringLength - 1; i >= 1; i--) #ifndef _WIN32 if (s->cString[i] == OF_PATH_DELIMITER) #else if (s->cString[i] == '/' || s->cString[i] == '\\') #endif - return [OFString stringWithCString: s->cString - length: i]; + return [OFString stringWithUTF8String: s->cString + length: i]; #ifndef _WIN32 if (s->cString[0] == OF_PATH_DELIMITER) #else if (s->cString[0] == '/' || s->cString[0] == '\\') #endif - return [OFString stringWithCString: s->cString - length: 1]; + return [OFString stringWithUTF8String: s->cString + length: 1]; return @"."; } - (intmax_t)decimalValue