@@ -18,17 +18,17 @@ #include #include #include #import "OFString.h" +#import "OFASPrintF.h" #import "OFMutableUTF8String.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" -#import "of_asprintf.h" #import "unicode.h" static struct { Class isa; } placeholder; @@ -54,18 +54,18 @@ initWithUTF8String: UTF8String length: UTF8StringLength]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFMutableUTF8String alloc] initWithCString: cString encoding: encoding]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { return (id)[[OFMutableUTF8String alloc] initWithCString: cString encoding: encoding length: cStringLength]; @@ -74,67 +74,67 @@ - (instancetype)initWithString: (OFString *)string { return (id)[[OFMutableUTF8String alloc] initWithString: string]; } -- (instancetype)initWithCharacters: (const of_unichar_t *)characters +- (instancetype)initWithCharacters: (const OFUnichar *)characters length: (size_t)length { return (id)[[OFMutableUTF8String alloc] initWithCharacters: characters length: length]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string length: length]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string byteOrder: byteOrder]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string length: length byteOrder: byteOrder]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string length: length]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string byteOrder: byteOrder]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string length: length byteOrder: byteOrder]; } @@ -164,32 +164,30 @@ { return (id)[[OFMutableUTF8String alloc] initWithContentsOfFile: path]; } - (instancetype)initWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFMutableUTF8String alloc] initWithContentsOfFile: path encoding: encoding]; } #endif -#if defined(OF_HAVE_FILES) || defined(OF_HAVE_SOCKETS) - (instancetype)initWithContentsOfURL: (OFURL *)URL { return (id)[[OFMutableUTF8String alloc] initWithContentsOfURL: URL]; } - (instancetype)initWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFMutableUTF8String alloc] initWithContentsOfURL: URL encoding: encoding]; } -#endif - (instancetype)initWithSerialization: (OFXMLElement *)element { return (id)[[OFMutableUTF8String alloc] initWithSerialization: element]; } @@ -228,24 +226,24 @@ return [super alloc]; } #ifdef OF_HAVE_UNICODE_TABLES -- (void)of_convertWithWordStartTable: (const of_unichar_t *const [])startTable - wordMiddleTable: (const of_unichar_t *const [])middleTable +- (void)of_convertWithWordStartTable: (const OFUnichar *const [])startTable + wordMiddleTable: (const OFUnichar *const [])middleTable wordStartTableSize: (size_t)startTableSize - wordMiddleTableSize: (size_t)middleTableSize OF_DIRECT + wordMiddleTableSize: (size_t)middleTableSize { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; bool isStart = true; for (size_t i = 0; i < length; i++) { - const of_unichar_t *const *table; + const OFUnichar *const *table; size_t tableSize; - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (isStart) { table = startTable; tableSize = middleTableSize; } else { @@ -252,117 +250,98 @@ table = middleTable; tableSize = middleTableSize; } if (c >> 8 < tableSize && table[c >> 8][c & 0xFF]) - [self setCharacter: table[c >> 8][c & 0xFF] - atIndex: i]; + [self setCharacter: table[c >> 8][c & 0xFF] atIndex: i]; - isStart = of_ascii_isspace(c); + isStart = OFASCIIIsSpace(c); } objc_autoreleasePoolPop(pool); } #else -- (void)of_convertWithWordStartFunction: (char (*)(char))startFunction - wordMiddleFunction: (char (*)(char))middleFunction - OF_DIRECT +static void +convert(OFMutableString *self, char (*startFunction)(char), + char (*middleFunction)(char)) { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; bool isStart = true; for (size_t i = 0; i < length; i++) { char (*function)(char) = (isStart ? startFunction : middleFunction); - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (c <= 0x7F) - [self setCharacter: (int)function(c) - atIndex: i]; + [self setCharacter: (int)function(c) atIndex: i]; - isStart = of_ascii_isspace(c); + isStart = OFASCIIIsSpace(c); } objc_autoreleasePoolPop(pool); } #endif -- (void)setCharacter: (of_unichar_t)character - atIndex: (size_t)idx +- (void)setCharacter: (OFUnichar)character atIndex: (size_t)idx { void *pool = objc_autoreleasePoolPush(); - OFString *string; - - string = [OFString stringWithCharacters: &character - length: 1]; - - [self replaceCharactersInRange: of_range(idx, 1) - withString: string]; - + OFString *string = + [OFString stringWithCharacters: &character length: 1]; + [self replaceCharactersInRange: OFRangeMake(idx, 1) withString: string]; objc_autoreleasePoolPop(pool); } - (void)appendString: (OFString *)string { - [self insertString: string - atIndex: self.length]; + [self insertString: string atIndex: self.length]; } -- (void)appendCharacters: (const of_unichar_t *)characters +- (void)appendCharacters: (const OFUnichar *)characters length: (size_t)length { void *pool = objc_autoreleasePoolPush(); - [self appendString: [OFString stringWithCharacters: characters length: length]]; - objc_autoreleasePoolPop(pool); } - (void)appendUTF8String: (const char *)UTF8String { void *pool = objc_autoreleasePoolPush(); - [self appendString: [OFString stringWithUTF8String: UTF8String]]; - objc_autoreleasePoolPop(pool); } - (void)appendUTF8String: (const char *)UTF8String length: (size_t)UTF8StringLength { void *pool = objc_autoreleasePoolPush(); - [self appendString: [OFString stringWithUTF8String: UTF8String length: UTF8StringLength]]; - objc_autoreleasePoolPop(pool); } - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); - [self appendString: [OFString stringWithCString: cString encoding: encoding]]; - objc_autoreleasePoolPop(pool); } - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { void *pool = objc_autoreleasePoolPush(); - [self appendString: [OFString stringWithCString: cString encoding: encoding length: cStringLength]]; - objc_autoreleasePoolPop(pool); } - (void)appendFormat: (OFConstantString *)format, ... { @@ -372,108 +351,97 @@ [self appendFormat: format arguments: arguments]; va_end(arguments); } -- (void)appendFormat: (OFConstantString *)format - arguments: (va_list)arguments +- (void)appendFormat: (OFConstantString *)format arguments: (va_list)arguments { char *UTF8String; int UTF8StringLength; if (format == nil) @throw [OFInvalidArgumentException exception]; - if ((UTF8StringLength = of_vasprintf(&UTF8String, format.UTF8String, + if ((UTF8StringLength = OFVASPrintF(&UTF8String, format.UTF8String, arguments)) == -1) @throw [OFInvalidFormatException exception]; @try { - [self appendUTF8String: UTF8String - length: UTF8StringLength]; + [self appendUTF8String: UTF8String length: UTF8StringLength]; } @finally { free(UTF8String); } } - (void)prependString: (OFString *)string { - [self insertString: string - atIndex: 0]; + [self insertString: string atIndex: 0]; } - (void)reverse { size_t i, j, length = self.length; for (i = 0, j = length - 1; i < length / 2; i++, j--) { - of_unichar_t tmp = [self characterAtIndex: j]; - [self setCharacter: [self characterAtIndex: i] - atIndex: j]; - [self setCharacter: tmp - atIndex: i]; + OFUnichar tmp = [self characterAtIndex: j]; + [self setCharacter: [self characterAtIndex: i] atIndex: j]; + [self setCharacter: tmp atIndex: i]; } } #ifdef OF_HAVE_UNICODE_TABLES - (void)uppercase { - [self of_convertWithWordStartTable: of_unicode_uppercase_table - wordMiddleTable: of_unicode_uppercase_table - wordStartTableSize: OF_UNICODE_UPPERCASE_TABLE_SIZE - wordMiddleTableSize: OF_UNICODE_UPPERCASE_TABLE_SIZE]; -} - -- (void)lowercase -{ - [self of_convertWithWordStartTable: of_unicode_lowercase_table - wordMiddleTable: of_unicode_lowercase_table - wordStartTableSize: OF_UNICODE_LOWERCASE_TABLE_SIZE - wordMiddleTableSize: OF_UNICODE_LOWERCASE_TABLE_SIZE]; -} - -- (void)capitalize -{ - [self of_convertWithWordStartTable: of_unicode_titlecase_table - wordMiddleTable: of_unicode_lowercase_table - wordStartTableSize: OF_UNICODE_TITLECASE_TABLE_SIZE - wordMiddleTableSize: OF_UNICODE_LOWERCASE_TABLE_SIZE]; -} -#else -- (void)uppercase -{ - [self of_convertWithWordStartFunction: of_ascii_toupper - wordMiddleFunction: of_ascii_toupper]; -} - -- (void)lowercase -{ - [self of_convertWithWordStartFunction: of_ascii_tolower - wordMiddleFunction: of_ascii_tolower]; -} - -- (void)capitalize -{ - [self of_convertWithWordStartFunction: of_ascii_toupper - wordMiddleFunction: of_ascii_tolower]; -} -#endif - -- (void)insertString: (OFString *)string - atIndex: (size_t)idx -{ - [self replaceCharactersInRange: of_range(idx, 0) - withString: string]; -} - -- (void)deleteCharactersInRange: (of_range_t)range -{ - [self replaceCharactersInRange: range - withString: @""]; -} - -- (void)replaceCharactersInRange: (of_range_t)range + [self of_convertWithWordStartTable: OFUnicodeUppercaseTable + wordMiddleTable: OFUnicodeUppercaseTable + wordStartTableSize: OFUnicodeUppercaseTableSize + wordMiddleTableSize: OFUnicodeUppercaseTableSize]; +} + +- (void)lowercase +{ + [self of_convertWithWordStartTable: OFUnicodeLowercaseTable + wordMiddleTable: OFUnicodeLowercaseTable + wordStartTableSize: OFUnicodeLowercaseTableSize + wordMiddleTableSize: OFUnicodeLowercaseTableSize]; +} + +- (void)capitalize +{ + [self of_convertWithWordStartTable: OFUnicodeTitlecaseTable + wordMiddleTable: OFUnicodeLowercaseTable + wordStartTableSize: OFUnicodeTitlecaseTableSize + wordMiddleTableSize: OFUnicodeLowercaseTableSize]; +} +#else +- (void)uppercase +{ + convert(self, OFASCIIToUpper, OFASCIIToUpper); +} + +- (void)lowercase +{ + convert(self, OFASCIIToLower, OFASCIIToLower); +} + +- (void)capitalize +{ + convert(self, OFASCIIToUpper, OFASCIIToLower); +} +#endif + +- (void)insertString: (OFString *)string atIndex: (size_t)idx +{ + [self replaceCharactersInRange: OFRangeMake(idx, 0) withString: string]; +} + +- (void)deleteCharactersInRange: (OFRange)range +{ + [self replaceCharactersInRange: range withString: @""]; +} + +- (void)replaceCharactersInRange: (OFRange)range withString: (OFString *)replacement { OF_UNRECOGNIZED_SELECTOR } @@ -481,21 +449,21 @@ withString: (OFString *)replacement { [self replaceOccurrencesOfString: string withString: replacement options: 0 - range: of_range(0, self.length)]; + range: OFRangeMake(0, self.length)]; } - (void)replaceOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range + range: (OFRange)range { void *pool = objc_autoreleasePoolPush(), *pool2; - const of_unichar_t *characters; - const of_unichar_t *searchCharacters = string.characters; + const OFUnichar *characters; + const OFUnichar *searchCharacters = string.characters; size_t searchLength = string.length; size_t replacementLength = replacement.length; if (string == nil || replacement == nil) @throw [OFInvalidArgumentException exception]; @@ -512,14 +480,14 @@ pool2 = objc_autoreleasePoolPush(); characters = self.characters; for (size_t i = range.location; i <= range.length - searchLength; i++) { if (memcmp(characters + i, searchCharacters, - searchLength * sizeof(of_unichar_t)) != 0) + searchLength * sizeof(OFUnichar)) != 0) continue; - [self replaceCharactersInRange: of_range(i, searchLength) + [self replaceCharactersInRange: OFRangeMake(i, searchLength) withString: replacement]; range.length -= searchLength; range.length += replacementLength; @@ -535,29 +503,29 @@ } - (void)deleteLeadingWhitespaces { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t i, length = self.length; for (i = 0; i < length; i++) { - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; - if (!of_ascii_isspace(c)) + if (!OFASCIIIsSpace(c)) break; } objc_autoreleasePoolPop(pool); - [self deleteCharactersInRange: of_range(0, i)]; + [self deleteCharactersInRange: OFRangeMake(0, i)]; } - (void)deleteTrailingWhitespaces { void *pool; - const of_unichar_t *characters, *p; + const OFUnichar *characters, *p; size_t length, d; length = self.length; if (length == 0) @@ -566,19 +534,19 @@ pool = objc_autoreleasePoolPush(); characters = self.characters; d = 0; for (p = characters + length - 1; p >= characters; p--) { - if (!of_ascii_isspace(*p)) + if (!OFASCIIIsSpace(*p)) break; d++; } objc_autoreleasePoolPop(pool); - [self deleteCharactersInRange: of_range(length - d, d)]; + [self deleteCharactersInRange: OFRangeMake(length - d, d)]; } - (void)deleteEnclosingWhitespaces { [self deleteLeadingWhitespaces];