34{
36 int key_len[4];
37 char *key_ptr[4];
40
41 key_len[0] = key_len[1] = key_len[2] = key_len[3] = 0;
43 {
44 unsigned int i, decomposed_len = 1;
46 if (decomposed_len)
47 {
48 for (
i = 0;
i < decomposed_len;
i++)
49 {
51 unsigned int ce;
52
53
54
55
56
58 continue;
59
61
63 if (ce != (unsigned int)-1)
64 {
65 if (ce >> 16) key_len[0] += 2;
66 if ((ce >> 8) & 0xff) key_len[1]++;
67 if ((ce >> 4) & 0x0f) key_len[2]++;
68 if (ce & 1)
69 {
70 if (wch >> 8) key_len[3]++;
71 key_len[3]++;
72 }
73 }
74 else
75 {
76 key_len[0] += 2;
77 if (wch >> 8) key_len[0]++;
78 if (wch & 0xff) key_len[0]++;
79 }
80 }
81 }
82 }
83
85
86 return key_len[0] + key_len[1] + key_len[2] + key_len[3] + 4 + 1;
87
88 if (
dstlen < key_len[0] + key_len[1] + key_len[2] + key_len[3] + 4 + 1)
89 return 0;
90
93
95 key_ptr[1] = key_ptr[0] + key_len[0] + 1;
96 key_ptr[2] = key_ptr[1] + key_len[1] + 1;
97 key_ptr[3] = key_ptr[2] + key_len[2] + 1;
98
100 {
101 unsigned int i, decomposed_len = 1;
103 if (decomposed_len)
104 {
105 for (
i = 0;
i < decomposed_len;
i++)
106 {
108 unsigned int ce;
109
110
111
112
113
115 continue;
116
118
120 if (ce != (unsigned int)-1)
121 {
123 if ((
key = ce >> 16))
124 {
125 *key_ptr[0]++ =
key >> 8;
126 *key_ptr[0]++ =
key & 0xff;
127 }
128
129 if ((
key = (ce >> 8) & 0xff)) *key_ptr[1]++ =
key + 1;
130
131 if ((
key = (ce >> 4) & 0x0f)) *key_ptr[2]++ =
key + 1;
132
133 if (ce & 1)
134 {
135 if (wch >> 8) *key_ptr[3]++ = wch >> 8;
136 if (wch & 0xff) *key_ptr[3]++ = wch & 0xff;
137 }
138 }
139 else
140 {
141 *key_ptr[0]++ = 0xff;
142 *key_ptr[0]++ = 0xfe;
143 if (wch >> 8) *key_ptr[0]++ = wch >> 8;
144 if (wch & 0xff) *key_ptr[0]++ = wch & 0xff;
145 }
146 }
147 }
148 }
149
150 *key_ptr[0] = '\1';
151 *key_ptr[1] = '\1';
152 *key_ptr[2] = '\1';
153 *key_ptr[3]++ = '\1';
154 *key_ptr[3] = 0;
155
156 return key_ptr[3] -
dst;
157}
const unsigned int collation_table[]
#define NORM_IGNORESYMBOLS