1use std::borrow::Cow;
4use crate::{
5 decoder::{self, complete::decode_helper, UTF8Entry, UTF8Len},
6 encoder::Encoder, CodePage, DecodeError, EncodeError,
7};
8#[derive(Copy, Clone)]
9pub struct CP866;
10impl CP866 {
11 #[inline(always)]
21 pub fn decode(self, bytes: &[u8]) -> Cow<str> {
22 decode_helper(&DECODE_TABLE, bytes)
23 }
24 #[inline(always)]
38 pub fn encode(self, s: &str) -> Result<Cow<[u8]>, EncodeError> {
39 self.encode_helper(s, None)
40 }
41 #[inline(always)]
53 pub fn encode_lossy(self, s: &str, fallback: u8) -> Cow<[u8]> {
54 self.encode_helper(s, Some(fallback)).unwrap()
55 }
56}
57impl CodePage for CP866 {
58 #[inline(always)]
59 fn decode<'a>(&self, bytes: &'a [u8]) -> Result<Cow<'a, str>, DecodeError> {
60 Ok((*self).decode(bytes))
61 }
62}
63const DECODE_TABLE: decoder::complete::Table = [
64 UTF8Entry {
65 buf: [0x0, 0x0, 0x0],
66 len: UTF8Len::One,
67 },
68 UTF8Entry {
69 buf: [0x1, 0x0, 0x0],
70 len: UTF8Len::One,
71 },
72 UTF8Entry {
73 buf: [0x2, 0x0, 0x0],
74 len: UTF8Len::One,
75 },
76 UTF8Entry {
77 buf: [0x3, 0x0, 0x0],
78 len: UTF8Len::One,
79 },
80 UTF8Entry {
81 buf: [0x4, 0x0, 0x0],
82 len: UTF8Len::One,
83 },
84 UTF8Entry {
85 buf: [0x5, 0x0, 0x0],
86 len: UTF8Len::One,
87 },
88 UTF8Entry {
89 buf: [0x6, 0x0, 0x0],
90 len: UTF8Len::One,
91 },
92 UTF8Entry {
93 buf: [0x7, 0x0, 0x0],
94 len: UTF8Len::One,
95 },
96 UTF8Entry {
97 buf: [0x8, 0x0, 0x0],
98 len: UTF8Len::One,
99 },
100 UTF8Entry {
101 buf: [0x9, 0x0, 0x0],
102 len: UTF8Len::One,
103 },
104 UTF8Entry {
105 buf: [0xA, 0x0, 0x0],
106 len: UTF8Len::One,
107 },
108 UTF8Entry {
109 buf: [0xB, 0x0, 0x0],
110 len: UTF8Len::One,
111 },
112 UTF8Entry {
113 buf: [0xC, 0x0, 0x0],
114 len: UTF8Len::One,
115 },
116 UTF8Entry {
117 buf: [0xD, 0x0, 0x0],
118 len: UTF8Len::One,
119 },
120 UTF8Entry {
121 buf: [0xE, 0x0, 0x0],
122 len: UTF8Len::One,
123 },
124 UTF8Entry {
125 buf: [0xF, 0x0, 0x0],
126 len: UTF8Len::One,
127 },
128 UTF8Entry {
129 buf: [0x10, 0x0, 0x0],
130 len: UTF8Len::One,
131 },
132 UTF8Entry {
133 buf: [0x11, 0x0, 0x0],
134 len: UTF8Len::One,
135 },
136 UTF8Entry {
137 buf: [0x12, 0x0, 0x0],
138 len: UTF8Len::One,
139 },
140 UTF8Entry {
141 buf: [0x13, 0x0, 0x0],
142 len: UTF8Len::One,
143 },
144 UTF8Entry {
145 buf: [0x14, 0x0, 0x0],
146 len: UTF8Len::One,
147 },
148 UTF8Entry {
149 buf: [0x15, 0x0, 0x0],
150 len: UTF8Len::One,
151 },
152 UTF8Entry {
153 buf: [0x16, 0x0, 0x0],
154 len: UTF8Len::One,
155 },
156 UTF8Entry {
157 buf: [0x17, 0x0, 0x0],
158 len: UTF8Len::One,
159 },
160 UTF8Entry {
161 buf: [0x18, 0x0, 0x0],
162 len: UTF8Len::One,
163 },
164 UTF8Entry {
165 buf: [0x19, 0x0, 0x0],
166 len: UTF8Len::One,
167 },
168 UTF8Entry {
169 buf: [0x1A, 0x0, 0x0],
170 len: UTF8Len::One,
171 },
172 UTF8Entry {
173 buf: [0x1B, 0x0, 0x0],
174 len: UTF8Len::One,
175 },
176 UTF8Entry {
177 buf: [0x1C, 0x0, 0x0],
178 len: UTF8Len::One,
179 },
180 UTF8Entry {
181 buf: [0x1D, 0x0, 0x0],
182 len: UTF8Len::One,
183 },
184 UTF8Entry {
185 buf: [0x1E, 0x0, 0x0],
186 len: UTF8Len::One,
187 },
188 UTF8Entry {
189 buf: [0x1F, 0x0, 0x0],
190 len: UTF8Len::One,
191 },
192 UTF8Entry {
193 buf: [0x20, 0x0, 0x0],
194 len: UTF8Len::One,
195 },
196 UTF8Entry {
197 buf: [0x21, 0x0, 0x0],
198 len: UTF8Len::One,
199 },
200 UTF8Entry {
201 buf: [0x22, 0x0, 0x0],
202 len: UTF8Len::One,
203 },
204 UTF8Entry {
205 buf: [0x23, 0x0, 0x0],
206 len: UTF8Len::One,
207 },
208 UTF8Entry {
209 buf: [0x24, 0x0, 0x0],
210 len: UTF8Len::One,
211 },
212 UTF8Entry {
213 buf: [0x25, 0x0, 0x0],
214 len: UTF8Len::One,
215 },
216 UTF8Entry {
217 buf: [0x26, 0x0, 0x0],
218 len: UTF8Len::One,
219 },
220 UTF8Entry {
221 buf: [0x27, 0x0, 0x0],
222 len: UTF8Len::One,
223 },
224 UTF8Entry {
225 buf: [0x28, 0x0, 0x0],
226 len: UTF8Len::One,
227 },
228 UTF8Entry {
229 buf: [0x29, 0x0, 0x0],
230 len: UTF8Len::One,
231 },
232 UTF8Entry {
233 buf: [0x2A, 0x0, 0x0],
234 len: UTF8Len::One,
235 },
236 UTF8Entry {
237 buf: [0x2B, 0x0, 0x0],
238 len: UTF8Len::One,
239 },
240 UTF8Entry {
241 buf: [0x2C, 0x0, 0x0],
242 len: UTF8Len::One,
243 },
244 UTF8Entry {
245 buf: [0x2D, 0x0, 0x0],
246 len: UTF8Len::One,
247 },
248 UTF8Entry {
249 buf: [0x2E, 0x0, 0x0],
250 len: UTF8Len::One,
251 },
252 UTF8Entry {
253 buf: [0x2F, 0x0, 0x0],
254 len: UTF8Len::One,
255 },
256 UTF8Entry {
257 buf: [0x30, 0x0, 0x0],
258 len: UTF8Len::One,
259 },
260 UTF8Entry {
261 buf: [0x31, 0x0, 0x0],
262 len: UTF8Len::One,
263 },
264 UTF8Entry {
265 buf: [0x32, 0x0, 0x0],
266 len: UTF8Len::One,
267 },
268 UTF8Entry {
269 buf: [0x33, 0x0, 0x0],
270 len: UTF8Len::One,
271 },
272 UTF8Entry {
273 buf: [0x34, 0x0, 0x0],
274 len: UTF8Len::One,
275 },
276 UTF8Entry {
277 buf: [0x35, 0x0, 0x0],
278 len: UTF8Len::One,
279 },
280 UTF8Entry {
281 buf: [0x36, 0x0, 0x0],
282 len: UTF8Len::One,
283 },
284 UTF8Entry {
285 buf: [0x37, 0x0, 0x0],
286 len: UTF8Len::One,
287 },
288 UTF8Entry {
289 buf: [0x38, 0x0, 0x0],
290 len: UTF8Len::One,
291 },
292 UTF8Entry {
293 buf: [0x39, 0x0, 0x0],
294 len: UTF8Len::One,
295 },
296 UTF8Entry {
297 buf: [0x3A, 0x0, 0x0],
298 len: UTF8Len::One,
299 },
300 UTF8Entry {
301 buf: [0x3B, 0x0, 0x0],
302 len: UTF8Len::One,
303 },
304 UTF8Entry {
305 buf: [0x3C, 0x0, 0x0],
306 len: UTF8Len::One,
307 },
308 UTF8Entry {
309 buf: [0x3D, 0x0, 0x0],
310 len: UTF8Len::One,
311 },
312 UTF8Entry {
313 buf: [0x3E, 0x0, 0x0],
314 len: UTF8Len::One,
315 },
316 UTF8Entry {
317 buf: [0x3F, 0x0, 0x0],
318 len: UTF8Len::One,
319 },
320 UTF8Entry {
321 buf: [0x40, 0x0, 0x0],
322 len: UTF8Len::One,
323 },
324 UTF8Entry {
325 buf: [0x41, 0x0, 0x0],
326 len: UTF8Len::One,
327 },
328 UTF8Entry {
329 buf: [0x42, 0x0, 0x0],
330 len: UTF8Len::One,
331 },
332 UTF8Entry {
333 buf: [0x43, 0x0, 0x0],
334 len: UTF8Len::One,
335 },
336 UTF8Entry {
337 buf: [0x44, 0x0, 0x0],
338 len: UTF8Len::One,
339 },
340 UTF8Entry {
341 buf: [0x45, 0x0, 0x0],
342 len: UTF8Len::One,
343 },
344 UTF8Entry {
345 buf: [0x46, 0x0, 0x0],
346 len: UTF8Len::One,
347 },
348 UTF8Entry {
349 buf: [0x47, 0x0, 0x0],
350 len: UTF8Len::One,
351 },
352 UTF8Entry {
353 buf: [0x48, 0x0, 0x0],
354 len: UTF8Len::One,
355 },
356 UTF8Entry {
357 buf: [0x49, 0x0, 0x0],
358 len: UTF8Len::One,
359 },
360 UTF8Entry {
361 buf: [0x4A, 0x0, 0x0],
362 len: UTF8Len::One,
363 },
364 UTF8Entry {
365 buf: [0x4B, 0x0, 0x0],
366 len: UTF8Len::One,
367 },
368 UTF8Entry {
369 buf: [0x4C, 0x0, 0x0],
370 len: UTF8Len::One,
371 },
372 UTF8Entry {
373 buf: [0x4D, 0x0, 0x0],
374 len: UTF8Len::One,
375 },
376 UTF8Entry {
377 buf: [0x4E, 0x0, 0x0],
378 len: UTF8Len::One,
379 },
380 UTF8Entry {
381 buf: [0x4F, 0x0, 0x0],
382 len: UTF8Len::One,
383 },
384 UTF8Entry {
385 buf: [0x50, 0x0, 0x0],
386 len: UTF8Len::One,
387 },
388 UTF8Entry {
389 buf: [0x51, 0x0, 0x0],
390 len: UTF8Len::One,
391 },
392 UTF8Entry {
393 buf: [0x52, 0x0, 0x0],
394 len: UTF8Len::One,
395 },
396 UTF8Entry {
397 buf: [0x53, 0x0, 0x0],
398 len: UTF8Len::One,
399 },
400 UTF8Entry {
401 buf: [0x54, 0x0, 0x0],
402 len: UTF8Len::One,
403 },
404 UTF8Entry {
405 buf: [0x55, 0x0, 0x0],
406 len: UTF8Len::One,
407 },
408 UTF8Entry {
409 buf: [0x56, 0x0, 0x0],
410 len: UTF8Len::One,
411 },
412 UTF8Entry {
413 buf: [0x57, 0x0, 0x0],
414 len: UTF8Len::One,
415 },
416 UTF8Entry {
417 buf: [0x58, 0x0, 0x0],
418 len: UTF8Len::One,
419 },
420 UTF8Entry {
421 buf: [0x59, 0x0, 0x0],
422 len: UTF8Len::One,
423 },
424 UTF8Entry {
425 buf: [0x5A, 0x0, 0x0],
426 len: UTF8Len::One,
427 },
428 UTF8Entry {
429 buf: [0x5B, 0x0, 0x0],
430 len: UTF8Len::One,
431 },
432 UTF8Entry {
433 buf: [0x5C, 0x0, 0x0],
434 len: UTF8Len::One,
435 },
436 UTF8Entry {
437 buf: [0x5D, 0x0, 0x0],
438 len: UTF8Len::One,
439 },
440 UTF8Entry {
441 buf: [0x5E, 0x0, 0x0],
442 len: UTF8Len::One,
443 },
444 UTF8Entry {
445 buf: [0x5F, 0x0, 0x0],
446 len: UTF8Len::One,
447 },
448 UTF8Entry {
449 buf: [0x60, 0x0, 0x0],
450 len: UTF8Len::One,
451 },
452 UTF8Entry {
453 buf: [0x61, 0x0, 0x0],
454 len: UTF8Len::One,
455 },
456 UTF8Entry {
457 buf: [0x62, 0x0, 0x0],
458 len: UTF8Len::One,
459 },
460 UTF8Entry {
461 buf: [0x63, 0x0, 0x0],
462 len: UTF8Len::One,
463 },
464 UTF8Entry {
465 buf: [0x64, 0x0, 0x0],
466 len: UTF8Len::One,
467 },
468 UTF8Entry {
469 buf: [0x65, 0x0, 0x0],
470 len: UTF8Len::One,
471 },
472 UTF8Entry {
473 buf: [0x66, 0x0, 0x0],
474 len: UTF8Len::One,
475 },
476 UTF8Entry {
477 buf: [0x67, 0x0, 0x0],
478 len: UTF8Len::One,
479 },
480 UTF8Entry {
481 buf: [0x68, 0x0, 0x0],
482 len: UTF8Len::One,
483 },
484 UTF8Entry {
485 buf: [0x69, 0x0, 0x0],
486 len: UTF8Len::One,
487 },
488 UTF8Entry {
489 buf: [0x6A, 0x0, 0x0],
490 len: UTF8Len::One,
491 },
492 UTF8Entry {
493 buf: [0x6B, 0x0, 0x0],
494 len: UTF8Len::One,
495 },
496 UTF8Entry {
497 buf: [0x6C, 0x0, 0x0],
498 len: UTF8Len::One,
499 },
500 UTF8Entry {
501 buf: [0x6D, 0x0, 0x0],
502 len: UTF8Len::One,
503 },
504 UTF8Entry {
505 buf: [0x6E, 0x0, 0x0],
506 len: UTF8Len::One,
507 },
508 UTF8Entry {
509 buf: [0x6F, 0x0, 0x0],
510 len: UTF8Len::One,
511 },
512 UTF8Entry {
513 buf: [0x70, 0x0, 0x0],
514 len: UTF8Len::One,
515 },
516 UTF8Entry {
517 buf: [0x71, 0x0, 0x0],
518 len: UTF8Len::One,
519 },
520 UTF8Entry {
521 buf: [0x72, 0x0, 0x0],
522 len: UTF8Len::One,
523 },
524 UTF8Entry {
525 buf: [0x73, 0x0, 0x0],
526 len: UTF8Len::One,
527 },
528 UTF8Entry {
529 buf: [0x74, 0x0, 0x0],
530 len: UTF8Len::One,
531 },
532 UTF8Entry {
533 buf: [0x75, 0x0, 0x0],
534 len: UTF8Len::One,
535 },
536 UTF8Entry {
537 buf: [0x76, 0x0, 0x0],
538 len: UTF8Len::One,
539 },
540 UTF8Entry {
541 buf: [0x77, 0x0, 0x0],
542 len: UTF8Len::One,
543 },
544 UTF8Entry {
545 buf: [0x78, 0x0, 0x0],
546 len: UTF8Len::One,
547 },
548 UTF8Entry {
549 buf: [0x79, 0x0, 0x0],
550 len: UTF8Len::One,
551 },
552 UTF8Entry {
553 buf: [0x7A, 0x0, 0x0],
554 len: UTF8Len::One,
555 },
556 UTF8Entry {
557 buf: [0x7B, 0x0, 0x0],
558 len: UTF8Len::One,
559 },
560 UTF8Entry {
561 buf: [0x7C, 0x0, 0x0],
562 len: UTF8Len::One,
563 },
564 UTF8Entry {
565 buf: [0x7D, 0x0, 0x0],
566 len: UTF8Len::One,
567 },
568 UTF8Entry {
569 buf: [0x7E, 0x0, 0x0],
570 len: UTF8Len::One,
571 },
572 UTF8Entry {
573 buf: [0x7F, 0x0, 0x0],
574 len: UTF8Len::One,
575 },
576 UTF8Entry {
577 buf: [0xD0, 0x90, 0x0],
578 len: UTF8Len::Two,
579 },
580 UTF8Entry {
581 buf: [0xD0, 0x91, 0x0],
582 len: UTF8Len::Two,
583 },
584 UTF8Entry {
585 buf: [0xD0, 0x92, 0x0],
586 len: UTF8Len::Two,
587 },
588 UTF8Entry {
589 buf: [0xD0, 0x93, 0x0],
590 len: UTF8Len::Two,
591 },
592 UTF8Entry {
593 buf: [0xD0, 0x94, 0x0],
594 len: UTF8Len::Two,
595 },
596 UTF8Entry {
597 buf: [0xD0, 0x95, 0x0],
598 len: UTF8Len::Two,
599 },
600 UTF8Entry {
601 buf: [0xD0, 0x96, 0x0],
602 len: UTF8Len::Two,
603 },
604 UTF8Entry {
605 buf: [0xD0, 0x97, 0x0],
606 len: UTF8Len::Two,
607 },
608 UTF8Entry {
609 buf: [0xD0, 0x98, 0x0],
610 len: UTF8Len::Two,
611 },
612 UTF8Entry {
613 buf: [0xD0, 0x99, 0x0],
614 len: UTF8Len::Two,
615 },
616 UTF8Entry {
617 buf: [0xD0, 0x9A, 0x0],
618 len: UTF8Len::Two,
619 },
620 UTF8Entry {
621 buf: [0xD0, 0x9B, 0x0],
622 len: UTF8Len::Two,
623 },
624 UTF8Entry {
625 buf: [0xD0, 0x9C, 0x0],
626 len: UTF8Len::Two,
627 },
628 UTF8Entry {
629 buf: [0xD0, 0x9D, 0x0],
630 len: UTF8Len::Two,
631 },
632 UTF8Entry {
633 buf: [0xD0, 0x9E, 0x0],
634 len: UTF8Len::Two,
635 },
636 UTF8Entry {
637 buf: [0xD0, 0x9F, 0x0],
638 len: UTF8Len::Two,
639 },
640 UTF8Entry {
641 buf: [0xD0, 0xA0, 0x0],
642 len: UTF8Len::Two,
643 },
644 UTF8Entry {
645 buf: [0xD0, 0xA1, 0x0],
646 len: UTF8Len::Two,
647 },
648 UTF8Entry {
649 buf: [0xD0, 0xA2, 0x0],
650 len: UTF8Len::Two,
651 },
652 UTF8Entry {
653 buf: [0xD0, 0xA3, 0x0],
654 len: UTF8Len::Two,
655 },
656 UTF8Entry {
657 buf: [0xD0, 0xA4, 0x0],
658 len: UTF8Len::Two,
659 },
660 UTF8Entry {
661 buf: [0xD0, 0xA5, 0x0],
662 len: UTF8Len::Two,
663 },
664 UTF8Entry {
665 buf: [0xD0, 0xA6, 0x0],
666 len: UTF8Len::Two,
667 },
668 UTF8Entry {
669 buf: [0xD0, 0xA7, 0x0],
670 len: UTF8Len::Two,
671 },
672 UTF8Entry {
673 buf: [0xD0, 0xA8, 0x0],
674 len: UTF8Len::Two,
675 },
676 UTF8Entry {
677 buf: [0xD0, 0xA9, 0x0],
678 len: UTF8Len::Two,
679 },
680 UTF8Entry {
681 buf: [0xD0, 0xAA, 0x0],
682 len: UTF8Len::Two,
683 },
684 UTF8Entry {
685 buf: [0xD0, 0xAB, 0x0],
686 len: UTF8Len::Two,
687 },
688 UTF8Entry {
689 buf: [0xD0, 0xAC, 0x0],
690 len: UTF8Len::Two,
691 },
692 UTF8Entry {
693 buf: [0xD0, 0xAD, 0x0],
694 len: UTF8Len::Two,
695 },
696 UTF8Entry {
697 buf: [0xD0, 0xAE, 0x0],
698 len: UTF8Len::Two,
699 },
700 UTF8Entry {
701 buf: [0xD0, 0xAF, 0x0],
702 len: UTF8Len::Two,
703 },
704 UTF8Entry {
705 buf: [0xD0, 0xB0, 0x0],
706 len: UTF8Len::Two,
707 },
708 UTF8Entry {
709 buf: [0xD0, 0xB1, 0x0],
710 len: UTF8Len::Two,
711 },
712 UTF8Entry {
713 buf: [0xD0, 0xB2, 0x0],
714 len: UTF8Len::Two,
715 },
716 UTF8Entry {
717 buf: [0xD0, 0xB3, 0x0],
718 len: UTF8Len::Two,
719 },
720 UTF8Entry {
721 buf: [0xD0, 0xB4, 0x0],
722 len: UTF8Len::Two,
723 },
724 UTF8Entry {
725 buf: [0xD0, 0xB5, 0x0],
726 len: UTF8Len::Two,
727 },
728 UTF8Entry {
729 buf: [0xD0, 0xB6, 0x0],
730 len: UTF8Len::Two,
731 },
732 UTF8Entry {
733 buf: [0xD0, 0xB7, 0x0],
734 len: UTF8Len::Two,
735 },
736 UTF8Entry {
737 buf: [0xD0, 0xB8, 0x0],
738 len: UTF8Len::Two,
739 },
740 UTF8Entry {
741 buf: [0xD0, 0xB9, 0x0],
742 len: UTF8Len::Two,
743 },
744 UTF8Entry {
745 buf: [0xD0, 0xBA, 0x0],
746 len: UTF8Len::Two,
747 },
748 UTF8Entry {
749 buf: [0xD0, 0xBB, 0x0],
750 len: UTF8Len::Two,
751 },
752 UTF8Entry {
753 buf: [0xD0, 0xBC, 0x0],
754 len: UTF8Len::Two,
755 },
756 UTF8Entry {
757 buf: [0xD0, 0xBD, 0x0],
758 len: UTF8Len::Two,
759 },
760 UTF8Entry {
761 buf: [0xD0, 0xBE, 0x0],
762 len: UTF8Len::Two,
763 },
764 UTF8Entry {
765 buf: [0xD0, 0xBF, 0x0],
766 len: UTF8Len::Two,
767 },
768 UTF8Entry {
769 buf: [0xE2, 0x96, 0x91],
770 len: UTF8Len::Three,
771 },
772 UTF8Entry {
773 buf: [0xE2, 0x96, 0x92],
774 len: UTF8Len::Three,
775 },
776 UTF8Entry {
777 buf: [0xE2, 0x96, 0x93],
778 len: UTF8Len::Three,
779 },
780 UTF8Entry {
781 buf: [0xE2, 0x94, 0x82],
782 len: UTF8Len::Three,
783 },
784 UTF8Entry {
785 buf: [0xE2, 0x94, 0xA4],
786 len: UTF8Len::Three,
787 },
788 UTF8Entry {
789 buf: [0xE2, 0x95, 0xA1],
790 len: UTF8Len::Three,
791 },
792 UTF8Entry {
793 buf: [0xE2, 0x95, 0xA2],
794 len: UTF8Len::Three,
795 },
796 UTF8Entry {
797 buf: [0xE2, 0x95, 0x96],
798 len: UTF8Len::Three,
799 },
800 UTF8Entry {
801 buf: [0xE2, 0x95, 0x95],
802 len: UTF8Len::Three,
803 },
804 UTF8Entry {
805 buf: [0xE2, 0x95, 0xA3],
806 len: UTF8Len::Three,
807 },
808 UTF8Entry {
809 buf: [0xE2, 0x95, 0x91],
810 len: UTF8Len::Three,
811 },
812 UTF8Entry {
813 buf: [0xE2, 0x95, 0x97],
814 len: UTF8Len::Three,
815 },
816 UTF8Entry {
817 buf: [0xE2, 0x95, 0x9D],
818 len: UTF8Len::Three,
819 },
820 UTF8Entry {
821 buf: [0xE2, 0x95, 0x9C],
822 len: UTF8Len::Three,
823 },
824 UTF8Entry {
825 buf: [0xE2, 0x95, 0x9B],
826 len: UTF8Len::Three,
827 },
828 UTF8Entry {
829 buf: [0xE2, 0x94, 0x90],
830 len: UTF8Len::Three,
831 },
832 UTF8Entry {
833 buf: [0xE2, 0x94, 0x94],
834 len: UTF8Len::Three,
835 },
836 UTF8Entry {
837 buf: [0xE2, 0x94, 0xB4],
838 len: UTF8Len::Three,
839 },
840 UTF8Entry {
841 buf: [0xE2, 0x94, 0xAC],
842 len: UTF8Len::Three,
843 },
844 UTF8Entry {
845 buf: [0xE2, 0x94, 0x9C],
846 len: UTF8Len::Three,
847 },
848 UTF8Entry {
849 buf: [0xE2, 0x94, 0x80],
850 len: UTF8Len::Three,
851 },
852 UTF8Entry {
853 buf: [0xE2, 0x94, 0xBC],
854 len: UTF8Len::Three,
855 },
856 UTF8Entry {
857 buf: [0xE2, 0x95, 0x9E],
858 len: UTF8Len::Three,
859 },
860 UTF8Entry {
861 buf: [0xE2, 0x95, 0x9F],
862 len: UTF8Len::Three,
863 },
864 UTF8Entry {
865 buf: [0xE2, 0x95, 0x9A],
866 len: UTF8Len::Three,
867 },
868 UTF8Entry {
869 buf: [0xE2, 0x95, 0x94],
870 len: UTF8Len::Three,
871 },
872 UTF8Entry {
873 buf: [0xE2, 0x95, 0xA9],
874 len: UTF8Len::Three,
875 },
876 UTF8Entry {
877 buf: [0xE2, 0x95, 0xA6],
878 len: UTF8Len::Three,
879 },
880 UTF8Entry {
881 buf: [0xE2, 0x95, 0xA0],
882 len: UTF8Len::Three,
883 },
884 UTF8Entry {
885 buf: [0xE2, 0x95, 0x90],
886 len: UTF8Len::Three,
887 },
888 UTF8Entry {
889 buf: [0xE2, 0x95, 0xAC],
890 len: UTF8Len::Three,
891 },
892 UTF8Entry {
893 buf: [0xE2, 0x95, 0xA7],
894 len: UTF8Len::Three,
895 },
896 UTF8Entry {
897 buf: [0xE2, 0x95, 0xA8],
898 len: UTF8Len::Three,
899 },
900 UTF8Entry {
901 buf: [0xE2, 0x95, 0xA4],
902 len: UTF8Len::Three,
903 },
904 UTF8Entry {
905 buf: [0xE2, 0x95, 0xA5],
906 len: UTF8Len::Three,
907 },
908 UTF8Entry {
909 buf: [0xE2, 0x95, 0x99],
910 len: UTF8Len::Three,
911 },
912 UTF8Entry {
913 buf: [0xE2, 0x95, 0x98],
914 len: UTF8Len::Three,
915 },
916 UTF8Entry {
917 buf: [0xE2, 0x95, 0x92],
918 len: UTF8Len::Three,
919 },
920 UTF8Entry {
921 buf: [0xE2, 0x95, 0x93],
922 len: UTF8Len::Three,
923 },
924 UTF8Entry {
925 buf: [0xE2, 0x95, 0xAB],
926 len: UTF8Len::Three,
927 },
928 UTF8Entry {
929 buf: [0xE2, 0x95, 0xAA],
930 len: UTF8Len::Three,
931 },
932 UTF8Entry {
933 buf: [0xE2, 0x94, 0x98],
934 len: UTF8Len::Three,
935 },
936 UTF8Entry {
937 buf: [0xE2, 0x94, 0x8C],
938 len: UTF8Len::Three,
939 },
940 UTF8Entry {
941 buf: [0xE2, 0x96, 0x88],
942 len: UTF8Len::Three,
943 },
944 UTF8Entry {
945 buf: [0xE2, 0x96, 0x84],
946 len: UTF8Len::Three,
947 },
948 UTF8Entry {
949 buf: [0xE2, 0x96, 0x8C],
950 len: UTF8Len::Three,
951 },
952 UTF8Entry {
953 buf: [0xE2, 0x96, 0x90],
954 len: UTF8Len::Three,
955 },
956 UTF8Entry {
957 buf: [0xE2, 0x96, 0x80],
958 len: UTF8Len::Three,
959 },
960 UTF8Entry {
961 buf: [0xD1, 0x80, 0x0],
962 len: UTF8Len::Two,
963 },
964 UTF8Entry {
965 buf: [0xD1, 0x81, 0x0],
966 len: UTF8Len::Two,
967 },
968 UTF8Entry {
969 buf: [0xD1, 0x82, 0x0],
970 len: UTF8Len::Two,
971 },
972 UTF8Entry {
973 buf: [0xD1, 0x83, 0x0],
974 len: UTF8Len::Two,
975 },
976 UTF8Entry {
977 buf: [0xD1, 0x84, 0x0],
978 len: UTF8Len::Two,
979 },
980 UTF8Entry {
981 buf: [0xD1, 0x85, 0x0],
982 len: UTF8Len::Two,
983 },
984 UTF8Entry {
985 buf: [0xD1, 0x86, 0x0],
986 len: UTF8Len::Two,
987 },
988 UTF8Entry {
989 buf: [0xD1, 0x87, 0x0],
990 len: UTF8Len::Two,
991 },
992 UTF8Entry {
993 buf: [0xD1, 0x88, 0x0],
994 len: UTF8Len::Two,
995 },
996 UTF8Entry {
997 buf: [0xD1, 0x89, 0x0],
998 len: UTF8Len::Two,
999 },
1000 UTF8Entry {
1001 buf: [0xD1, 0x8A, 0x0],
1002 len: UTF8Len::Two,
1003 },
1004 UTF8Entry {
1005 buf: [0xD1, 0x8B, 0x0],
1006 len: UTF8Len::Two,
1007 },
1008 UTF8Entry {
1009 buf: [0xD1, 0x8C, 0x0],
1010 len: UTF8Len::Two,
1011 },
1012 UTF8Entry {
1013 buf: [0xD1, 0x8D, 0x0],
1014 len: UTF8Len::Two,
1015 },
1016 UTF8Entry {
1017 buf: [0xD1, 0x8E, 0x0],
1018 len: UTF8Len::Two,
1019 },
1020 UTF8Entry {
1021 buf: [0xD1, 0x8F, 0x0],
1022 len: UTF8Len::Two,
1023 },
1024 UTF8Entry {
1025 buf: [0xD0, 0x81, 0x0],
1026 len: UTF8Len::Two,
1027 },
1028 UTF8Entry {
1029 buf: [0xD1, 0x91, 0x0],
1030 len: UTF8Len::Two,
1031 },
1032 UTF8Entry {
1033 buf: [0xD0, 0x84, 0x0],
1034 len: UTF8Len::Two,
1035 },
1036 UTF8Entry {
1037 buf: [0xD1, 0x94, 0x0],
1038 len: UTF8Len::Two,
1039 },
1040 UTF8Entry {
1041 buf: [0xD0, 0x87, 0x0],
1042 len: UTF8Len::Two,
1043 },
1044 UTF8Entry {
1045 buf: [0xD1, 0x97, 0x0],
1046 len: UTF8Len::Two,
1047 },
1048 UTF8Entry {
1049 buf: [0xD0, 0x8E, 0x0],
1050 len: UTF8Len::Two,
1051 },
1052 UTF8Entry {
1053 buf: [0xD1, 0x9E, 0x0],
1054 len: UTF8Len::Two,
1055 },
1056 UTF8Entry {
1057 buf: [0xC2, 0xB0, 0x0],
1058 len: UTF8Len::Two,
1059 },
1060 UTF8Entry {
1061 buf: [0xE2, 0x88, 0x99],
1062 len: UTF8Len::Three,
1063 },
1064 UTF8Entry {
1065 buf: [0xC2, 0xB7, 0x0],
1066 len: UTF8Len::Two,
1067 },
1068 UTF8Entry {
1069 buf: [0xE2, 0x88, 0x9A],
1070 len: UTF8Len::Three,
1071 },
1072 UTF8Entry {
1073 buf: [0xE2, 0x84, 0x96],
1074 len: UTF8Len::Three,
1075 },
1076 UTF8Entry {
1077 buf: [0xC2, 0xA4, 0x0],
1078 len: UTF8Len::Two,
1079 },
1080 UTF8Entry {
1081 buf: [0xE2, 0x96, 0xA0],
1082 len: UTF8Len::Three,
1083 },
1084 UTF8Entry {
1085 buf: [0xC2, 0xA0, 0x0],
1086 len: UTF8Len::Two,
1087 },
1088];
1089impl Encoder for CP866 {
1090 #[doc(hidden)]
1091 #[inline]
1092 fn encode_grapheme(&self, bytes: &mut &[u8]) -> Option<u8> {
1093 let (&a, rest) = bytes.split_first().unwrap();
1094 Some(
1095 match (a, &bytes) {
1096 (0x00..=0x7F, _) => {
1097 *bytes = rest;
1098 a
1099 }
1100 (0xC2, [_, b, ..]) => {
1101 *bytes = &bytes[2..];
1102 match b {
1103 0xB0 => 0xF8,
1104 0xB7 => 0xFA,
1105 0xA4 => 0xFD,
1106 0xA0 => 0xFF,
1107 _ => return None,
1108 }
1109 }
1110 (0xD0, [_, b, ..]) => {
1111 *bytes = &bytes[2..];
1112 match b {
1113 0x90 => 0x80,
1114 0x91 => 0x81,
1115 0x92 => 0x82,
1116 0x93 => 0x83,
1117 0x94 => 0x84,
1118 0x95 => 0x85,
1119 0x96 => 0x86,
1120 0x97 => 0x87,
1121 0x98 => 0x88,
1122 0x99 => 0x89,
1123 0x9A => 0x8A,
1124 0x9B => 0x8B,
1125 0x9C => 0x8C,
1126 0x9D => 0x8D,
1127 0x9E => 0x8E,
1128 0x9F => 0x8F,
1129 0xA0 => 0x90,
1130 0xA1 => 0x91,
1131 0xA2 => 0x92,
1132 0xA3 => 0x93,
1133 0xA4 => 0x94,
1134 0xA5 => 0x95,
1135 0xA6 => 0x96,
1136 0xA7 => 0x97,
1137 0xA8 => 0x98,
1138 0xA9 => 0x99,
1139 0xAA => 0x9A,
1140 0xAB => 0x9B,
1141 0xAC => 0x9C,
1142 0xAD => 0x9D,
1143 0xAE => 0x9E,
1144 0xAF => 0x9F,
1145 0xB0 => 0xA0,
1146 0xB1 => 0xA1,
1147 0xB2 => 0xA2,
1148 0xB3 => 0xA3,
1149 0xB4 => 0xA4,
1150 0xB5 => 0xA5,
1151 0xB6 => 0xA6,
1152 0xB7 => 0xA7,
1153 0xB8 => 0xA8,
1154 0xB9 => 0xA9,
1155 0xBA => 0xAA,
1156 0xBB => 0xAB,
1157 0xBC => 0xAC,
1158 0xBD => 0xAD,
1159 0xBE => 0xAE,
1160 0xBF => 0xAF,
1161 0x81 => 0xF0,
1162 0x84 => 0xF2,
1163 0x87 => 0xF4,
1164 0x8E => 0xF6,
1165 _ => return None,
1166 }
1167 }
1168 (0xD1, [_, b, ..]) => {
1169 *bytes = &bytes[2..];
1170 match b {
1171 0x80 => 0xE0,
1172 0x81 => 0xE1,
1173 0x82 => 0xE2,
1174 0x83 => 0xE3,
1175 0x84 => 0xE4,
1176 0x85 => 0xE5,
1177 0x86 => 0xE6,
1178 0x87 => 0xE7,
1179 0x88 => 0xE8,
1180 0x89 => 0xE9,
1181 0x8A => 0xEA,
1182 0x8B => 0xEB,
1183 0x8C => 0xEC,
1184 0x8D => 0xED,
1185 0x8E => 0xEE,
1186 0x8F => 0xEF,
1187 0x91 => 0xF1,
1188 0x94 => 0xF3,
1189 0x97 => 0xF5,
1190 0x9E => 0xF7,
1191 _ => return None,
1192 }
1193 }
1194 (0xE2, [_, b, c, ..]) => {
1195 *bytes = &bytes[3..];
1196 match b {
1197 0x84 => {
1198 match c {
1199 0x96 => 0xFC,
1200 _ => return None,
1201 }
1202 }
1203 0x88 => {
1204 match c {
1205 0x99 => 0xF9,
1206 0x9A => 0xFB,
1207 _ => return None,
1208 }
1209 }
1210 0x94 => {
1211 match c {
1212 0x82 => 0xB3,
1213 0xA4 => 0xB4,
1214 0x90 => 0xBF,
1215 0x94 => 0xC0,
1216 0xB4 => 0xC1,
1217 0xAC => 0xC2,
1218 0x9C => 0xC3,
1219 0x80 => 0xC4,
1220 0xBC => 0xC5,
1221 0x98 => 0xD9,
1222 0x8C => 0xDA,
1223 _ => return None,
1224 }
1225 }
1226 0x95 => {
1227 match c {
1228 0xA1 => 0xB5,
1229 0xA2 => 0xB6,
1230 0x96 => 0xB7,
1231 0x95 => 0xB8,
1232 0xA3 => 0xB9,
1233 0x91 => 0xBA,
1234 0x97 => 0xBB,
1235 0x9D => 0xBC,
1236 0x9C => 0xBD,
1237 0x9B => 0xBE,
1238 0x9E => 0xC6,
1239 0x9F => 0xC7,
1240 0x9A => 0xC8,
1241 0x94 => 0xC9,
1242 0xA9 => 0xCA,
1243 0xA6 => 0xCB,
1244 0xA0 => 0xCC,
1245 0x90 => 0xCD,
1246 0xAC => 0xCE,
1247 0xA7 => 0xCF,
1248 0xA8 => 0xD0,
1249 0xA4 => 0xD1,
1250 0xA5 => 0xD2,
1251 0x99 => 0xD3,
1252 0x98 => 0xD4,
1253 0x92 => 0xD5,
1254 0x93 => 0xD6,
1255 0xAB => 0xD7,
1256 0xAA => 0xD8,
1257 _ => return None,
1258 }
1259 }
1260 0x96 => {
1261 match c {
1262 0x91 => 0xB0,
1263 0x92 => 0xB1,
1264 0x93 => 0xB2,
1265 0x88 => 0xDB,
1266 0x84 => 0xDC,
1267 0x8C => 0xDD,
1268 0x90 => 0xDE,
1269 0x80 => 0xDF,
1270 0xA0 => 0xFE,
1271 _ => return None,
1272 }
1273 }
1274 _ => return None,
1275 }
1276 }
1277 (0xC2..=0xDF, _) => {
1278 *bytes = &bytes[2..];
1279 return None;
1280 }
1281 (0xE0..=0xEF, _) => {
1282 *bytes = &bytes[3..];
1283 return None;
1284 }
1285 (0xF0..=0xF4, _) => {
1286 *bytes = &bytes[4..];
1287 return None;
1288 }
1289 _ => panic!(),
1290 },
1291 )
1292 }
1293}