80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
+
|
void *pool = objc_autoreleasePoolPush();
const char *string = self.UTF8String;
size_t length = self.UTF8StringLength;
char *retCString;
char byte = 0;
int state = 0;
size_t i = 0;
OFString *ret;
retCString = OFAllocMemory(length + 1, 1);
while (length--) {
char c = *string++;
switch (state) {
|
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
-
-
-
+
+
+
-
+
+
+
|
@try {
retCString = OFResizeMemory(retCString, 1, i + 1);
} @catch (OFOutOfMemoryException *e) {
/* We don't care if it fails, as we only made it smaller. */
}
@try {
return [OFString stringWithUTF8StringNoCopy: retCString
length: i
freeWhenDone: true];
ret = [OFString stringWithUTF8StringNoCopy: retCString
length: i
freeWhenDone: true];
} @catch (id e) {
OFFreeMemory(retCString);
@throw e;
}
}
return ret;
}
@end
|