@@ -43,34 +43,39 @@ [ret appendString: component]; first = false; } + + if ([ret hasSuffix: @":"]) + [ret appendString: @"/"]; + + [ret makeImmutable]; objc_autoreleasePoolPop(pool); return ret; } - (bool)isAbsolutePath { - return [self containsString: @":"]; + return [self containsString: @":/"]; } - (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]; + size_t i, last = 0, cStringLength = [self UTF8StringLength]; - if (pathCStringLength == 0) { + if (cStringLength == 0) { objc_autoreleasePoolPop(pool); return ret; } - for (i = 0; i < pathCStringLength; i++) { + for (i = 0; i < cStringLength; i++) { if (cString[i] == '/') { if (i - last != 0) [ret addObject: [OFString stringWithUTF8String: cString + last length: i - last]]; @@ -90,32 +95,38 @@ } - (OFString *)lastPathComponent { void *pool = objc_autoreleasePoolPush(); - const char *cString = [self UTF8String]; - size_t pathCStringLength = [self UTF8StringLength]; + const char *cString; + size_t cStringLength; ssize_t i; OFString *ret; - if (pathCStringLength == 0) { + if ([self hasSuffix: @":/"]) + return self; + + cString = [self UTF8String]; + cStringLength = [self UTF8StringLength]; + + if (cStringLength == 0) { objc_autoreleasePoolPop(pool); return @""; } - if (cString[pathCStringLength - 1] == '/') - pathCStringLength--; + if (cString[cStringLength - 1] == '/') + cStringLength--; - if (pathCStringLength == 0) { + if (cStringLength == 0) { objc_autoreleasePoolPop(pool); return @""; } - if (pathCStringLength - 1 > SSIZE_MAX) + if (cStringLength - 1 > SSIZE_MAX) @throw [OFOutOfRangeException exception]; - for (i = pathCStringLength - 1; i >= 0; i--) { + for (i = cStringLength - 1; i >= 0; i--) { if (cString[i] == '/') { i++; break; } } @@ -126,11 +137,11 @@ */ if (i < 0) i = 0; ret = [[OFString alloc] initWithUTF8String: cString + i - length: pathCStringLength - i]; + length: cStringLength - i]; objc_autoreleasePoolPop(pool); return [ret autorelease]; } @@ -158,28 +169,34 @@ } - (OFString *)stringByDeletingLastPathComponent { void *pool = objc_autoreleasePoolPush(); - const char *cString = [self UTF8String]; - size_t pathCStringLength = [self UTF8StringLength]; + const char *cString; + size_t cStringLength; OFString *ret; - if (pathCStringLength == 0) { + if ([self hasSuffix: @":/"]) + return self; + + cString = [self UTF8String]; + cStringLength = [self UTF8StringLength]; + + if (cStringLength == 0) { objc_autoreleasePoolPop(pool); return @""; } - if (cString[pathCStringLength - 1] == '/') - pathCStringLength--; + if (cString[cStringLength - 1] == '/') + cStringLength--; - if (pathCStringLength == 0) { + if (cStringLength == 0) { objc_autoreleasePoolPop(pool); return @""; } - for (size_t i = pathCStringLength; i >= 1; i--) { + for (size_t i = cStringLength; i >= 1; i--) { if (cString[i - 1] == '/') { ret = [[OFString alloc] initWithUTF8String: cString length: i - 1]; objc_autoreleasePoolPop(pool);