@@ -15,286 +15,12 @@ * file. */ #include "config.h" -#import "OFString+PathAdditions.h" -#import "OFArray.h" - -#import "OFOutOfRangeException.h" - -int _OFString_PathAdditions_reference; - -@implementation OFString (PathAdditions) -+ (OFString *)pathWithComponents: (OFArray *)components -{ - OFMutableString *ret = [OFMutableString string]; - bool first = true; - - for (OFString *component in components) { - if (!first) - [ret appendString: OF_PATH_DELIMITER_STRING]; - - [ret appendString: component]; - - first = false; - } - - return ret; -} - -- (OFArray *)pathComponents -{ - OFMutableArray OF_GENERIC(OFString *) *ret = [OFMutableArray array]; - void *pool = objc_autoreleasePoolPush(); - const char *cString = [self UTF8String]; - size_t i, last = 0, pathCStringLength = [self UTF8StringLength]; - - if (pathCStringLength == 0) { - objc_autoreleasePoolPop(pool); - return ret; - } - - if (OF_IS_PATH_DELIMITER(cString[pathCStringLength - 1])) - pathCStringLength--; - - for (i = 0; i < pathCStringLength; i++) { - if (OF_IS_PATH_DELIMITER(cString[i])) { - [ret addObject: - [OFString stringWithUTF8String: cString + last - length: i - last]]; - last = i + 1; - } - } - [ret addObject: [OFString stringWithUTF8String: cString + last - length: i - last]]; - - [ret makeImmutable]; - - objc_autoreleasePoolPop(pool); - - return ret; -} - -- (OFString *)lastPathComponent -{ - void *pool = objc_autoreleasePoolPush(); - const char *cString = [self UTF8String]; - size_t pathCStringLength = [self UTF8StringLength]; - ssize_t i; - OFString *ret; - - if (pathCStringLength == 0) { - objc_autoreleasePoolPop(pool); - return @""; - } - - if (OF_IS_PATH_DELIMITER(cString[pathCStringLength - 1])) - pathCStringLength--; - - if (pathCStringLength == 0) { - objc_autoreleasePoolPop(pool); - return @""; - } - - if (pathCStringLength - 1 > SSIZE_MAX) - @throw [OFOutOfRangeException exception]; - - for (i = pathCStringLength - 1; i >= 0; i--) { - if (OF_IS_PATH_DELIMITER(cString[i])) { - i++; - break; - } - } - - /* - * Only one component, but the trailing delimiter might have been - * removed, so return a new string anyway. - */ - if (i < 0) - i = 0; - - ret = [[OFString alloc] initWithUTF8String: cString + i - length: pathCStringLength - i]; - - objc_autoreleasePoolPop(pool); - - return [ret autorelease]; -} - -- (OFString *)pathExtension -{ - void *pool = objc_autoreleasePoolPush(); - OFString *ret, *fileName; - size_t pos; - - fileName = [self lastPathComponent]; - pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { - objc_autoreleasePoolPop(pool); - return @""; - } - - ret = [fileName substringWithRange: - of_range(pos + 1, [fileName length] - pos - 1)]; - - [ret retain]; - objc_autoreleasePoolPop(pool); - return [ret autorelease]; -} - -- (OFString *)stringByDeletingLastPathComponent -{ - void *pool = objc_autoreleasePoolPush(); - const char *cString = [self UTF8String]; - size_t pathCStringLength = [self UTF8StringLength]; - OFString *ret; - - if (pathCStringLength == 0) { - objc_autoreleasePoolPop(pool); - return @""; - } - - if (OF_IS_PATH_DELIMITER(cString[pathCStringLength - 1])) - pathCStringLength--; - - if (pathCStringLength == 0) { - ret = [[OFString alloc] initWithUTF8String: cString - length: 1]; - - objc_autoreleasePoolPop(pool); - - return [ret autorelease]; - } - - for (size_t i = pathCStringLength - 1; i >= 1; i--) { - if (OF_IS_PATH_DELIMITER(cString[i])) { - ret = [[OFString alloc] initWithUTF8String: cString - length: i]; - - objc_autoreleasePoolPop(pool); - - return [ret autorelease]; - } - } - - if (OF_IS_PATH_DELIMITER(cString[0])) { - ret = [[OFString alloc] initWithUTF8String: cString - length: 1]; - - objc_autoreleasePoolPop(pool); - - return [ret autorelease]; - } - - objc_autoreleasePoolPop(pool); - - return OF_PATH_CURRENT_DIRECTORY; -} - -- (OFString *)stringByDeletingPathExtension -{ - void *pool; - OFMutableArray OF_GENERIC(OFString *) *components; - OFString *ret, *fileName; - size_t pos; - - if ([self length] == 0) - return [[self copy] autorelease]; - - pool = objc_autoreleasePoolPush(); - components = [[[self pathComponents] mutableCopy] autorelease]; - fileName = [components lastObject]; - - pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { - objc_autoreleasePoolPop(pool); - return [[self copy] autorelease]; - } - - fileName = [fileName substringWithRange: of_range(0, pos)]; - [components replaceObjectAtIndex: [components count] - 1 - withObject: fileName]; - - ret = [OFString pathWithComponents: components]; - - [ret retain]; - objc_autoreleasePoolPop(pool); - return [ret autorelease]; -} - -- (OFString *)stringByStandardizingPath -{ - void *pool = objc_autoreleasePoolPush(); - OFArray OF_GENERIC(OFString *) *components = [self pathComponents]; - OFMutableArray OF_GENERIC(OFString *) *array; - OFString *ret; - bool done = false, startsWithEmpty, endsWithEmpty; - - array = [[components mutableCopy] autorelease]; - - if ((startsWithEmpty = [[array firstObject] isEqual: @""])) - [array removeObjectAtIndex: 0]; - endsWithEmpty = [[array lastObject] isEqual: @""]; - - while (!done) { - size_t length = [array count]; - - done = true; - - for (size_t i = 0; i < length; i++) { - OFString *component = [array objectAtIndex: i]; - OFString *parent = - (i > 0 ? [array objectAtIndex: i - 1] : 0); - - if ([component isEqual: OF_PATH_CURRENT_DIRECTORY] || - [component length] == 0) { - [array removeObjectAtIndex: i]; - - done = false; - break; - } - - if ([component isEqual: OF_PATH_PARENT_DIRECTORY] && - parent != nil && - ![parent isEqual: OF_PATH_PARENT_DIRECTORY]) { - [array removeObjectsInRange: - of_range(i - 1, 2)]; - - done = false; - break; - } - } - } - - if (startsWithEmpty) - [array insertObject: @"" - atIndex: 0]; - if (endsWithEmpty) - [array addObject: @""]; - - ret = [[array componentsJoinedByString: OF_PATH_DELIMITER_STRING] - retain]; - - objc_autoreleasePoolPop(pool); - - return [ret autorelease]; -} - -- (OFString *)stringByAppendingPathComponent: (OFString *)component -{ - if ([self hasSuffix: OF_PATH_DELIMITER_STRING]) - return [self stringByAppendingString: component]; - else { - OFMutableString *ret = [[self mutableCopy] autorelease]; - - [ret appendString: OF_PATH_DELIMITER_STRING]; - [ret appendString: component]; - - [ret makeImmutable]; - - return ret; - } -} -@end +#import "platform.h" + +#if defined(OF_WINDOWS) || defined(OF_MSDOS) +# import "OFString+PathAdditions_DOS.m" +#else +# import "OFString+PathAdditions_UNIX.m" +#endif