ObjFW  Diff

Differences From Artifact [8b3fe48252]:

To Artifact [006e62d4d8]:


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
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 of_unichar_t* const table[], const size_t table_size)
    BOOL is_utf8, const int16_t* const table[], const size_t table_size)
{
	of_unichar_t c, tc;
	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 += table[0][*p];
				*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)
		if (c >> 8 < table_size)
			c += table[c >> 8][c & 0xFF];
				tc = c;
		} else
			tc = c;
		ustr[j++] = tc;
		ustr[j++] = c;

		if (tc < 0x80)
		if (c < 0x80)
			nlen++;
		else if (tc < 0x800)
		else if (c < 0x800)
			nlen += 2;
		else if (tc < 0x10000)
		else if (c < 0x10000)
			nlen += 3;
		else if (tc < 0x110000)
		else if (c < 0x110000)
			nlen += 4;
		else {
			[self freeMemory: ustr];
			@throw [OFInvalidEncodingException newWithClass: isa];
		}

		i += clen;