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
87
88
89
90
91
92
93
|
#import "OFMacros.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, tc;
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) {
if ((tc = table[c >> 8][c & 0xFF]) == 0)
tc = c;
} else
tc = c;
ustr[j++] = tc;
if (tc < 0x80)
nlen++;
else if (tc < 0x800)
nlen += 2;
else if (tc < 0x10000)
nlen += 3;
else if (tc < 0x110000)
nlen += 4;
else {
[self freeMemory: ustr];
@throw [OFInvalidEncodingException newWithClass: isa];
}
i += clen;
|
|
|
<
|
<
|
|
<
<
<
|
|
|
|
|
|
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
87
88
|
#import "OFMacros.h"
#import "asprintf.h"
#import "unicode.h"
static void
apply_table(id self, Class isa, char **string, unsigned int *length,
BOOL is_utf8, const int16_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;
while (--p >= (uint8_t*)*string)
*p += table[0][*p];
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)
c += table[c >> 8][c & 0xFF];
ustr[j++] = c;
if (c < 0x80)
nlen++;
else if (c < 0x800)
nlen += 2;
else if (c < 0x10000)
nlen += 3;
else if (c < 0x110000)
nlen += 4;
else {
[self freeMemory: ustr];
@throw [OFInvalidEncodingException newWithClass: isa];
}
i += clen;
|