Overview
| Comment: | OFString+URLEncoding: Small optimization |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
d1258ca0b6ce06582a22c57085af3cf5 |
| User & Date: | js on 2017-11-04 22:02:53 |
| Other Links: | manifest | tags |
Context
|
2017-11-05
| ||
| 02:58 | Add OF_WARN_UNUSED_RESULT (check-in: 7c79db860d user: js tags: trunk) | |
|
2017-11-04
| ||
| 22:02 | OFString+URLEncoding: Small optimization (check-in: d1258ca0b6 user: js tags: trunk) | |
| 21:09 | OFString: Improve freeWhenDone in case of error (check-in: 9f3a4dfbc0 user: js tags: trunk) | |
Changes
Modified src/OFString+URLEncoding.m from [92e75db2c6] to [cf9f67ae6e].
| ︙ | ︙ | |||
34 35 36 37 38 39 40 |
"-._~!$&'()*+,;="];
}
- (OFString *)stringByURLEncodingWithAllowedCharacters: (const char *)allowed
{
void *pool = objc_autoreleasePoolPush();
const char *string = [self UTF8String];
| > | | < | | | | > | | < < | | | > | < > | | | | > > | | | | | | | | | | 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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
"-._~!$&'()*+,;="];
}
- (OFString *)stringByURLEncodingWithAllowedCharacters: (const char *)allowed
{
void *pool = objc_autoreleasePoolPush();
const char *string = [self UTF8String];
size_t length = [self UTF8StringLength];
char *retCString, *retCString2;
size_t i = 0;
/*
* Worst case: 3 times longer than before.
* Oh, and we can't use [self allocWithSize:] here as self might be a
* @"" literal.
*/
if ((retCString = malloc(length * 3 + 1)) == NULL)
@throw [OFOutOfMemoryException exceptionWithRequestedSize:
length * 3 + 1];
while (length--) {
unsigned char c = *string++;
if (of_ascii_isalnum(c) || strchr(allowed, c) != NULL)
retCString[i++] = c;
else {
unsigned char high, low;
high = c >> 4;
low = c & 0x0F;
retCString[i++] = '%';
retCString[i++] =
(high > 9 ? high - 10 + 'A' : high + '0');
retCString[i++] =
(low > 9 ? low - 10 + 'A' : low + '0');
}
}
retCString[i] = '\0';
objc_autoreleasePoolPop(pool);
/* We don't care if it fails, as we only made it smaller. */
if ((retCString2 = realloc(retCString, i + 1)) == NULL)
retCString2 = retCString;
return [OFString stringWithUTF8StringNoCopy: retCString2
length: i
freeWhenDone: true];
}
- (OFString *)stringByURLDecoding
{
void *pool = objc_autoreleasePoolPush();
const char *string = [self UTF8String];
size_t length = [self UTF8StringLength];
char *retCString, *retCString2;
char byte = 0;
int state = 0;
size_t i = 0;
if ((retCString = malloc(length + 1)) == NULL)
@throw [OFOutOfMemoryException
exceptionWithRequestedSize: length + 1];
while (length--) {
char c = *string++;
switch (state) {
case 0:
if (c == '%')
state = 1;
else
retCString[i++] = c;
break;
case 1:
case 2:;
uint8_t shift = (state == 1 ? 4 : 0);
if (c >= '0' && c <= '9')
byte += (c - '0') << shift;
else if (c >= 'A' && c <= 'F')
byte += (c - 'A' + 10) << shift;
else if (c >= 'a' && c <= 'f')
byte += (c - 'a' + 10) << shift;
else {
free(retCString);
@throw [OFInvalidFormatException exception];
}
if (++state == 3) {
retCString[i++] = byte;
|
| ︙ | ︙ | |||
133 134 135 136 137 138 139 |
objc_autoreleasePoolPop(pool);
if (state != 0) {
free(retCString);
@throw [OFInvalidFormatException exception];
}
| | | < < | | | > > | 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
objc_autoreleasePoolPop(pool);
if (state != 0) {
free(retCString);
@throw [OFInvalidFormatException exception];
}
/* We don't care if it fails, as we only made it smaller. */
if ((retCString2 = realloc(retCString, i + 1)) == NULL)
retCString2 = retCString;
return [OFString stringWithUTF8StringNoCopy: retCString2
length: i
freeWhenDone: true];
}
@end
|