utf_16_to_utf_8/
utf_16_to_utf_8.rs1pub fn utf_16_to_utf_8(input: &[u16], output_count: &mut usize, output: &mut [u8]) -> bool {
2 let mut code_unit_1: u16;
3 let mut code_unit_2: u16;
4 let mut code_point: u32;
5 let mut i: usize;
6 let mut j: usize = 0;
7 let mut is_reverse_byte_order: bool;
8 let mut is_valid = true;
9
10 if input.len() != 0 {
11 i = 0;
12 is_reverse_byte_order = false;
13
14 if
15 input[0] == 0xFEFF ||
16 input[0] == 0xFFFE
17 {
18 i = 1;
19
20 if input[0] == 0xFFFE {
21 is_reverse_byte_order = true;
22 }
23 }
24
25 while
26 is_valid == true &&
27 i != input.len()
28 {
29 if is_reverse_byte_order == true {
30 code_unit_1 = (input[i] << 8) + (input[i] >> 8);
31 } else {
32 code_unit_1 = input[i];
33 }
34
35 if
36 code_unit_1 > 55295 &&
37 code_unit_1 < 57344
38 {
39 if code_unit_1 < 56320 {
40 i += 1;
41
42 if i != input.len() {
43 if is_reverse_byte_order == true {
44 code_unit_2 = (input[i] << 8) + (input[i] >> 8);
45 } else {
46 code_unit_2 = input[i];
47 }
48
49 if
50 code_unit_2 > 56319 &&
51 code_unit_2 < 57344
52 {
53 code_point = (((code_unit_1 & 1023) as u32) << 10) + ((code_unit_2 & 1023) as u32) + 65536;
54 output[j] = ((code_point >> 18) + 240) as u8;
55 j += 1;
56 output[j] = (((code_point >> 12) & 63) + 128) as u8;
57 j += 1;
58 output[j] = (((code_point >> 6) & 63) + 128) as u8;
59 j += 1;
60 output[j] = ((code_point & 63) + 128) as u8;
61 } else {
62 is_valid = false;
63 }
64 } else {
65 is_valid = false;
66 }
67 } else {
68 is_valid = false;
69 }
70 } else {
71 if code_unit_1 < 128 {
72 output[j] = code_unit_1 as u8;
73 } else {
74 if code_unit_1 < 2048 {
75 output[j] = ((code_unit_1 >> 6) + 192) as u8;
76 j += 1;
77 output[j] = ((code_unit_1 & 63) + 128) as u8;
78 } else {
79 output[j] = ((code_unit_1 >> 12) + 224) as u8;
80 j += 1;
81 output[j] = (((code_unit_1 >> 6) & 63) + 128) as u8;
82 j += 1;
83 output[j] = ((code_unit_1 & 63) + 128) as u8;
84 }
85 }
86 }
87
88 i += 1;
89 j += 1;
90 }
91 }
92
93 *output_count = j;
94 return is_valid;
95}
96
97pub fn utf_16_be_to_utf_8(input: &[u16], output_count: &mut usize, output: &mut [u8]) -> bool {
98 let mut code_point: u32;
99 let mut i: usize;
100 let mut j: usize = 0;
101 let mut is_valid = true;
102
103 if input.len() != 0 {
104 i = 0;
105
106 while
107 is_valid == true &&
108 i != input.len()
109 {
110 if
111 input[i] > 55295 &&
112 input[i] < 57344
113 {
114 if input[i] < 56320 {
115 i += 1;
116
117 if i != input.len() {
118 if
119 input[i] > 56319 &&
120 input[i] < 57344
121 {
122 code_point = (((input[i - 1] & 1023) as u32) << 10) + ((input[i] & 1023) as u32) + 65536;
123 output[j] = ((code_point >> 18) + 240) as u8;
124 j += 1;
125 output[j] = (((code_point >> 12) & 63) + 128) as u8;
126 j += 1;
127 output[j] = (((code_point >> 6) & 63) + 128) as u8;
128 j += 1;
129 output[j] = ((code_point & 63) + 128) as u8;
130 } else {
131 is_valid = false;
132 }
133 } else {
134 is_valid = false;
135 }
136 } else {
137 is_valid = false;
138 }
139 } else {
140 if input[i] < 128 {
141 output[j] = input[i] as u8;
142 } else {
143 if input[i] < 2048 {
144 output[j] = ((input[i] >> 6) + 192) as u8;
145 j += 1;
146 output[j] = ((input[i] & 63) + 128) as u8;
147 } else {
148 output[j] = ((input[i] >> 12) + 224) as u8;
149 j += 1;
150 output[j] = (((input[i] >> 6) & 63) + 128) as u8;
151 j += 1;
152 output[j] = ((input[i] & 63) + 128) as u8;
153 }
154 }
155 }
156
157 i += 1;
158 j += 1;
159 }
160 }
161
162 *output_count = j;
163 return is_valid;
164}
165
166pub fn utf_16_le_to_utf_8(input: &[u16], output_count: &mut usize, output: &mut [u8]) -> bool {
167 let mut code_unit_1: u16;
168 let mut code_unit_2: u16;
169 let mut code_point: u32;
170 let mut i: usize;
171 let mut j: usize = 0;
172 let mut is_valid = true;
173
174 if input.len() != 0 {
175 i = 0;
176
177 while
178 is_valid == true &&
179 i != input.len()
180 {
181 code_unit_1 = (input[i] << 8) + (input[i] >> 8);
182
183 if
184 code_unit_1 > 55295 &&
185 code_unit_1 < 57344
186 {
187 if code_unit_1 < 56320 {
188 i += 1;
189
190 if i != input.len() {
191 code_unit_2 = (input[i] << 8) + (input[i] >> 8);
192
193 if
194 code_unit_2 > 56319 &&
195 code_unit_2 < 57344
196 {
197 code_point = (((code_unit_1 & 1023) as u32) << 10) + ((code_unit_2 & 1023) as u32) + 65536;
198 output[j] = ((code_point >> 18) + 240) as u8;
199 j += 1;
200 output[j] = (((code_point >> 12) & 63) + 128) as u8;
201 j += 1;
202 output[j] = (((code_point >> 6) & 63) + 128) as u8;
203 j += 1;
204 output[j] = ((code_point & 63) + 128) as u8;
205 } else {
206 is_valid = false;
207 }
208 } else {
209 is_valid = false;
210 }
211 } else {
212 is_valid = false;
213 }
214 } else {
215 if code_unit_1 < 128 {
216 output[j] = code_unit_1 as u8;
217 } else {
218 if code_unit_1 < 2048 {
219 output[j] = ((code_unit_1 >> 6) + 192) as u8;
220 j += 1;
221 output[j] = ((code_unit_1 & 63) + 128) as u8;
222 } else {
223 output[j] = ((code_unit_1 >> 12) + 224) as u8;
224 j += 1;
225 output[j] = (((code_unit_1 >> 6) & 63) + 128) as u8;
226 j += 1;
227 output[j] = ((code_unit_1 & 63) + 128) as u8;
228 }
229 }
230 }
231
232 i += 1;
233 j += 1;
234 }
235 }
236
237 *output_count = j;
238 return is_valid;
239}