27
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
|
#import "OFString.h"
#import "OFExceptions.h"
#import "macros.h"
#import "asprintf.h"
#import "unicode.h"
static void
apply_table(id self, Class isa, char **string, unsigned int *length,
BOOL is_utf8, const of_unichar_t* const table[], const size_t table_size)
{
of_unichar_t c;
of_unichar_t *ustr;
size_t ulen, nlen, clen;
size_t i, j, d;
char *nstr;
if (!is_utf8) {
assert(table_size >= 1);
uint8_t *p = (uint8_t*)*string + *length;
uint8_t t;
while (--p >= (uint8_t*)*string)
if ((t = table[0][*p]) != 0)
*p = t;
return;
}
ulen = [self length];
ustr = [self allocMemoryForNItems: [self length]
withSize: ulen];
i = 0;
j = 0;
nlen = 0;
while (i < *length) {
clen = of_string_utf8_to_unicode(*string + i, *length - i, &c);
if (clen == 0 || c > 0x10FFFF) {
[self freeMemory: ustr];
@throw [OFInvalidEncodingException newWithClass: isa];
}
if (c >> 8 < table_size) {
|
|
<
|
>
|
|
|
|
|
27
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
|
#import "OFString.h"
#import "OFExceptions.h"
#import "macros.h"
#import "asprintf.h"
#import "unicode.h"
@implementation OFMutableString
- (void)_applyTable: (const of_unichar_t* const[])table
withSize: (size_t)table_size
{
of_unichar_t c;
of_unichar_t *ustr;
size_t ulen, nlen, clen;
size_t i, j, d;
char *nstr;
if (!is_utf8) {
assert(table_size >= 1);
uint8_t *p = (uint8_t*)string + length;
uint8_t t;
while (--p >= (uint8_t*)string)
if ((t = table[0][*p]) != 0)
*p = t;
return;
}
ulen = [self length];
ustr = [self allocMemoryForNItems: [self length]
withSize: ulen];
i = 0;
j = 0;
nlen = 0;
while (i < length) {
clen = of_string_utf8_to_unicode(string + i, length - i, &c);
if (clen == 0 || c > 0x10FFFF) {
[self freeMemory: ustr];
@throw [OFInvalidEncodingException newWithClass: isa];
}
if (c >> 8 < table_size) {
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
j += d;
}
assert(j == nlen);
nstr[j] = 0;
[self freeMemory: ustr];
[self freeMemory: *string];
*string = nstr;
*length = nlen;
}
@implementation OFMutableString
- (void)setToCString: (const char*)str
{
size_t len;
[self freeMemory: string];
len = strlen(str);
|
|
|
|
<
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
j += d;
}
assert(j == nlen);
nstr[j] = 0;
[self freeMemory: ustr];
[self freeMemory: string];
string = nstr;
length = nlen;
}
- (void)setToCString: (const char*)str
{
size_t len;
[self freeMemory: string];
len = strlen(str);
|
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
}
madvise(string, len, MADV_NORMAL);
}
- (void)upper
{
apply_table(self, isa, &string, &length, is_utf8,
of_unicode_upper_table, OF_UNICODE_UPPER_TABLE_SIZE);
}
- (void)lower
{
apply_table(self, isa, &string, &length, is_utf8,
of_unicode_lower_table, OF_UNICODE_LOWER_TABLE_SIZE);
}
- (void)removeCharactersFromIndex: (size_t)start
toIndex: (size_t)end
{
if (is_utf8) {
start = of_string_index_to_position(string, start, length);
|
|
|
|
|
|
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
|
}
madvise(string, len, MADV_NORMAL);
}
- (void)upper
{
[self _applyTable: of_unicode_upper_table
withSize: OF_UNICODE_UPPER_TABLE_SIZE];
}
- (void)lower
{
[self _applyTable: of_unicode_lower_table
withSize: OF_UNICODE_LOWER_TABLE_SIZE];
}
- (void)removeCharactersFromIndex: (size_t)start
toIndex: (size_t)end
{
if (is_utf8) {
start = of_string_index_to_position(string, start, length);
|