28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFOutOfMemoryException.h"
#import "autorelease.h"
#import "macros.h"
static OF_INLINE OFString*
resolve_relative_path(OFString *path)
{
void *pool = objc_autoreleasePoolPush();
OFMutableArray *array;
OFString *ret;
BOOL done = NO;
array = [[[path componentsSeparatedByString: @"/"] mutableCopy]
autorelease];
while (!done) {
id *objects = [array objects];
size_t i, length = [array count];
done = YES;
for (i = 0; i < length; i++) {
if ([objects[i] isEqual: @"."]) {
[array removeObjectAtIndex: i];
done = NO;
break;
}
if ([objects[i] isEqual: @".."]) {
[array removeObjectAtIndex: i];
if (i > 0)
[array removeObjectAtIndex: i - 1];
done = NO;
break;
}
}
}
ret = [[array componentsJoinedByString: @"/"] retain];
objc_autoreleasePoolPop(pool);
return [ret autorelease];
}
@implementation OFURL
+ (instancetype)URL
{
return [[[self alloc] init] autorelease];
}
+ (instancetype)URLWithString: (OFString*)string
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFOutOfMemoryException.h"
#import "autorelease.h"
#import "macros.h"
@implementation OFURL
+ (instancetype)URL
{
return [[[self alloc] init] autorelease];
}
+ (instancetype)URLWithString: (OFString*)string
|
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
URL->path,
UTF8String];
else
s = [OFString stringWithFormat: @"%@/../%s",
URL->path,
UTF8String];
path = [resolve_relative_path(s) copy];
objc_autoreleasePoolPop(pool);
}
} @catch (id e) {
[self release];
@throw e;
} @finally {
|
|
|
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
URL->path,
UTF8String];
else
s = [OFString stringWithFormat: @"%@/../%s",
URL->path,
UTF8String];
path = [[s stringByStandardizingURLPath] copy];
objc_autoreleasePoolPop(pool);
}
} @catch (id e) {
[self release];
@throw e;
} @finally {
|