@@ -408,30 +408,10 @@ { return (id)[[OFString_UTF8 alloc] initWithFormat: format arguments: arguments]; } -- initWithPath: (OFString*)firstComponent, ... -{ - id ret; - va_list arguments; - - va_start(arguments, firstComponent); - ret = [[OFString_UTF8 alloc] initWithPath: firstComponent - arguments: arguments]; - va_end(arguments); - - return ret; -} - -- initWithPath: (OFString*)firstComponent - arguments: (va_list)arguments -{ - return (id)[[OFString_UTF8 alloc] initWithPath: firstComponent - arguments: arguments]; -} - - initWithContentsOfFile: (OFString*)path { return (id)[[OFString_UTF8 alloc] initWithContentsOfFile: path]; } @@ -619,23 +599,10 @@ va_end(arguments); return ret; } -+ (instancetype)stringWithPath: (OFString*)firstComponent, ... -{ - id ret; - va_list arguments; - - va_start(arguments, firstComponent); - ret = [[[self alloc] initWithPath: firstComponent - arguments: arguments] autorelease]; - va_end(arguments); - - return ret; -} - + (instancetype)stringWithContentsOfFile: (OFString*)path { return [[[self alloc] initWithContentsOfFile: path] autorelease]; } @@ -655,10 +622,29 @@ encoding: (of_string_encoding_t)encoding { return [[[self alloc] initWithContentsOfURL: URL encoding: encoding] autorelease]; } + ++ (instancetype)pathWithComponents: (OFArray*)components +{ + OFMutableString *ret = [OFMutableString string]; + void *pool = objc_autoreleasePoolPush(); + OFEnumerator *enumerator = [components objectEnumerator]; + OFString *component; + + if ((component = [enumerator nextObject]) != nil) + [ret appendString: component]; + while ((component = [enumerator nextObject]) != nil) { + [ret appendString: OF_PATH_DELIMITER_STRING]; + [ret appendString: component]; + } + + objc_autoreleasePoolPop(pool); + + return ret; +} - init { if (object_getClass(self) == [OFString class]) { @try { @@ -830,36 +816,10 @@ } - initWithFormat: (OFConstantString*)format arguments: (va_list)arguments { - @try { - [self doesNotRecognizeSelector: _cmd]; - } @catch (id e) { - [self release]; - @throw e; - } - - abort(); -} - -- initWithPath: (OFString*)firstComponent, ... -{ - id ret; - va_list arguments; - - va_start(arguments, firstComponent); - ret = [self initWithPath: firstComponent - arguments: arguments]; - va_end(arguments); - - return ret; -} - -- initWithPath: (OFString*)firstComponent - arguments: (va_list)arguments -{ @try { [self doesNotRecognizeSelector: _cmd]; } @catch (id e) { [self release]; @throw e; @@ -1807,11 +1767,19 @@ return new; } - (OFString*)stringByAppendingPathComponent: (OFString*)component { - return [OFString stringWithPath: self, component, nil]; + void *pool = objc_autoreleasePoolPush(); + OFString *ret; + + ret = [OFString pathWithComponents: + [OFArray arrayWithObjects: self, component, nil]]; + + [ret retain]; + objc_autoreleasePoolPop(pool); + return [ret autorelease]; } - (OFString*)stringByPrependingString: (OFString*)string { OFMutableString *new = [[string mutableCopy] autorelease];