2 /* Copyright (C) 2003 Marcus Lundblad */
3 /* This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "CombineChars.h"
25 /* ---------------------------- local types -------------------------------- */
27 typedef struct char_combclass
34 typedef struct char_comb
38 unsigned short second
;
41 /* ---------------------------- static variables --------------------------- */
43 /* would like to use the Unicode replacement character here, but that would
44 result in expanding incoming UTF-8 strings when garbage characters occurs */
45 /* so for the time being use '?' */
46 static unsigned short REPLACEMENT_CHARACTER
= 0x3f;
48 /* maps characters to combination classes (not in list => 0) */
49 /* parsed from UnicodeData-3.2.0.txt */
50 static const char_combclass_t combclass_table
[] =
707 /* maps characters to decompositions */
708 /* parsed from UnicodeData-3.2.0.txt */
709 static const char_comb_t comb_table
[] =
711 { 0x00C0, 0x0041, 0x0300 },
712 { 0x00C1, 0x0041, 0x0301 },
713 { 0x00C2, 0x0041, 0x0302 },
714 { 0x00C3, 0x0041, 0x0303 },
715 { 0x00C4, 0x0041, 0x0308 },
716 { 0x00C5, 0x0041, 0x030A },
717 { 0x00C7, 0x0043, 0x0327 },
718 { 0x00C8, 0x0045, 0x0300 },
719 { 0x00C9, 0x0045, 0x0301 },
720 { 0x00CA, 0x0045, 0x0302 },
721 { 0x00CB, 0x0045, 0x0308 },
722 { 0x00CC, 0x0049, 0x0300 },
723 { 0x00CD, 0x0049, 0x0301 },
724 { 0x00CE, 0x0049, 0x0302 },
725 { 0x00CF, 0x0049, 0x0308 },
726 { 0x00D1, 0x004E, 0x0303 },
727 { 0x00D2, 0x004F, 0x0300 },
728 { 0x00D3, 0x004F, 0x0301 },
729 { 0x00D4, 0x004F, 0x0302 },
730 { 0x00D5, 0x004F, 0x0303 },
731 { 0x00D6, 0x004F, 0x0308 },
732 { 0x00D9, 0x0055, 0x0300 },
733 { 0x00DA, 0x0055, 0x0301 },
734 { 0x00DB, 0x0055, 0x0302 },
735 { 0x00DC, 0x0055, 0x0308 },
736 { 0x00DD, 0x0059, 0x0301 },
737 { 0x00E0, 0x0061, 0x0300 },
738 { 0x00E1, 0x0061, 0x0301 },
739 { 0x00E2, 0x0061, 0x0302 },
740 { 0x00E3, 0x0061, 0x0303 },
741 { 0x00E4, 0x0061, 0x0308 },
742 { 0x00E5, 0x0061, 0x030A },
743 { 0x00E7, 0x0063, 0x0327 },
744 { 0x00E8, 0x0065, 0x0300 },
745 { 0x00E9, 0x0065, 0x0301 },
746 { 0x00EA, 0x0065, 0x0302 },
747 { 0x00EB, 0x0065, 0x0308 },
748 { 0x00EC, 0x0069, 0x0300 },
749 { 0x00ED, 0x0069, 0x0301 },
750 { 0x00EE, 0x0069, 0x0302 },
751 { 0x00EF, 0x0069, 0x0308 },
752 { 0x00F1, 0x006E, 0x0303 },
753 { 0x00F2, 0x006F, 0x0300 },
754 { 0x00F3, 0x006F, 0x0301 },
755 { 0x00F4, 0x006F, 0x0302 },
756 { 0x00F5, 0x006F, 0x0303 },
757 { 0x00F6, 0x006F, 0x0308 },
758 { 0x00F9, 0x0075, 0x0300 },
759 { 0x00FA, 0x0075, 0x0301 },
760 { 0x00FB, 0x0075, 0x0302 },
761 { 0x00FC, 0x0075, 0x0308 },
762 { 0x00FD, 0x0079, 0x0301 },
763 { 0x00FF, 0x0079, 0x0308 },
764 { 0x0100, 0x0041, 0x0304 },
765 { 0x0101, 0x0061, 0x0304 },
766 { 0x0102, 0x0041, 0x0306 },
767 { 0x0103, 0x0061, 0x0306 },
768 { 0x0104, 0x0041, 0x0328 },
769 { 0x0105, 0x0061, 0x0328 },
770 { 0x0106, 0x0043, 0x0301 },
771 { 0x0107, 0x0063, 0x0301 },
772 { 0x0108, 0x0043, 0x0302 },
773 { 0x0109, 0x0063, 0x0302 },
774 { 0x010A, 0x0043, 0x0307 },
775 { 0x010B, 0x0063, 0x0307 },
776 { 0x010C, 0x0043, 0x030C },
777 { 0x010D, 0x0063, 0x030C },
778 { 0x010E, 0x0044, 0x030C },
779 { 0x010F, 0x0064, 0x030C },
780 { 0x0112, 0x0045, 0x0304 },
781 { 0x0113, 0x0065, 0x0304 },
782 { 0x0114, 0x0045, 0x0306 },
783 { 0x0115, 0x0065, 0x0306 },
784 { 0x0116, 0x0045, 0x0307 },
785 { 0x0117, 0x0065, 0x0307 },
786 { 0x0118, 0x0045, 0x0328 },
787 { 0x0119, 0x0065, 0x0328 },
788 { 0x011A, 0x0045, 0x030C },
789 { 0x011B, 0x0065, 0x030C },
790 { 0x011C, 0x0047, 0x0302 },
791 { 0x011D, 0x0067, 0x0302 },
792 { 0x011E, 0x0047, 0x0306 },
793 { 0x011F, 0x0067, 0x0306 },
794 { 0x0120, 0x0047, 0x0307 },
795 { 0x0121, 0x0067, 0x0307 },
796 { 0x0122, 0x0047, 0x0327 },
797 { 0x0123, 0x0067, 0x0327 },
798 { 0x0124, 0x0048, 0x0302 },
799 { 0x0125, 0x0068, 0x0302 },
800 { 0x0128, 0x0049, 0x0303 },
801 { 0x0129, 0x0069, 0x0303 },
802 { 0x012A, 0x0049, 0x0304 },
803 { 0x012B, 0x0069, 0x0304 },
804 { 0x012C, 0x0049, 0x0306 },
805 { 0x012D, 0x0069, 0x0306 },
806 { 0x012E, 0x0049, 0x0328 },
807 { 0x012F, 0x0069, 0x0328 },
808 { 0x0130, 0x0049, 0x0307 },
809 { 0x0134, 0x004A, 0x0302 },
810 { 0x0135, 0x006A, 0x0302 },
811 { 0x0136, 0x004B, 0x0327 },
812 { 0x0137, 0x006B, 0x0327 },
813 { 0x0139, 0x004C, 0x0301 },
814 { 0x013A, 0x006C, 0x0301 },
815 { 0x013B, 0x004C, 0x0327 },
816 { 0x013C, 0x006C, 0x0327 },
817 { 0x013D, 0x004C, 0x030C },
818 { 0x013E, 0x006C, 0x030C },
819 { 0x0143, 0x004E, 0x0301 },
820 { 0x0144, 0x006E, 0x0301 },
821 { 0x0145, 0x004E, 0x0327 },
822 { 0x0146, 0x006E, 0x0327 },
823 { 0x0147, 0x004E, 0x030C },
824 { 0x0148, 0x006E, 0x030C },
825 { 0x014C, 0x004F, 0x0304 },
826 { 0x014D, 0x006F, 0x0304 },
827 { 0x014E, 0x004F, 0x0306 },
828 { 0x014F, 0x006F, 0x0306 },
829 { 0x0150, 0x004F, 0x030B },
830 { 0x0151, 0x006F, 0x030B },
831 { 0x0154, 0x0052, 0x0301 },
832 { 0x0155, 0x0072, 0x0301 },
833 { 0x0156, 0x0052, 0x0327 },
834 { 0x0157, 0x0072, 0x0327 },
835 { 0x0158, 0x0052, 0x030C },
836 { 0x0159, 0x0072, 0x030C },
837 { 0x015A, 0x0053, 0x0301 },
838 { 0x015B, 0x0073, 0x0301 },
839 { 0x015C, 0x0053, 0x0302 },
840 { 0x015D, 0x0073, 0x0302 },
841 { 0x015E, 0x0053, 0x0327 },
842 { 0x015F, 0x0073, 0x0327 },
843 { 0x0160, 0x0053, 0x030C },
844 { 0x0161, 0x0073, 0x030C },
845 { 0x0162, 0x0054, 0x0327 },
846 { 0x0163, 0x0074, 0x0327 },
847 { 0x0164, 0x0054, 0x030C },
848 { 0x0165, 0x0074, 0x030C },
849 { 0x0168, 0x0055, 0x0303 },
850 { 0x0169, 0x0075, 0x0303 },
851 { 0x016A, 0x0055, 0x0304 },
852 { 0x016B, 0x0075, 0x0304 },
853 { 0x016C, 0x0055, 0x0306 },
854 { 0x016D, 0x0075, 0x0306 },
855 { 0x016E, 0x0055, 0x030A },
856 { 0x016F, 0x0075, 0x030A },
857 { 0x0170, 0x0055, 0x030B },
858 { 0x0171, 0x0075, 0x030B },
859 { 0x0172, 0x0055, 0x0328 },
860 { 0x0173, 0x0075, 0x0328 },
861 { 0x0174, 0x0057, 0x0302 },
862 { 0x0175, 0x0077, 0x0302 },
863 { 0x0176, 0x0059, 0x0302 },
864 { 0x0177, 0x0079, 0x0302 },
865 { 0x0178, 0x0059, 0x0308 },
866 { 0x0179, 0x005A, 0x0301 },
867 { 0x017A, 0x007A, 0x0301 },
868 { 0x017B, 0x005A, 0x0307 },
869 { 0x017C, 0x007A, 0x0307 },
870 { 0x017D, 0x005A, 0x030C },
871 { 0x017E, 0x007A, 0x030C },
872 { 0x01A0, 0x004F, 0x031B },
873 { 0x01A1, 0x006F, 0x031B },
874 { 0x01AF, 0x0055, 0x031B },
875 { 0x01B0, 0x0075, 0x031B },
876 { 0x01CD, 0x0041, 0x030C },
877 { 0x01CE, 0x0061, 0x030C },
878 { 0x01CF, 0x0049, 0x030C },
879 { 0x01D0, 0x0069, 0x030C },
880 { 0x01D1, 0x004F, 0x030C },
881 { 0x01D2, 0x006F, 0x030C },
882 { 0x01D3, 0x0055, 0x030C },
883 { 0x01D4, 0x0075, 0x030C },
884 { 0x01D5, 0x00DC, 0x0304 },
885 { 0x01D6, 0x00FC, 0x0304 },
886 { 0x01D7, 0x00DC, 0x0301 },
887 { 0x01D8, 0x00FC, 0x0301 },
888 { 0x01D9, 0x00DC, 0x030C },
889 { 0x01DA, 0x00FC, 0x030C },
890 { 0x01DB, 0x00DC, 0x0300 },
891 { 0x01DC, 0x00FC, 0x0300 },
892 { 0x01DE, 0x00C4, 0x0304 },
893 { 0x01DF, 0x00E4, 0x0304 },
894 { 0x01E0, 0x0226, 0x0304 },
895 { 0x01E1, 0x0227, 0x0304 },
896 { 0x01E2, 0x00C6, 0x0304 },
897 { 0x01E3, 0x00E6, 0x0304 },
898 { 0x01E6, 0x0047, 0x030C },
899 { 0x01E7, 0x0067, 0x030C },
900 { 0x01E8, 0x004B, 0x030C },
901 { 0x01E9, 0x006B, 0x030C },
902 { 0x01EA, 0x004F, 0x0328 },
903 { 0x01EB, 0x006F, 0x0328 },
904 { 0x01EC, 0x01EA, 0x0304 },
905 { 0x01ED, 0x01EB, 0x0304 },
906 { 0x01EE, 0x01B7, 0x030C },
907 { 0x01EF, 0x0292, 0x030C },
908 { 0x01F0, 0x006A, 0x030C },
909 { 0x01F4, 0x0047, 0x0301 },
910 { 0x01F5, 0x0067, 0x0301 },
911 { 0x01F8, 0x004E, 0x0300 },
912 { 0x01F9, 0x006E, 0x0300 },
913 { 0x01FA, 0x00C5, 0x0301 },
914 { 0x01FB, 0x00E5, 0x0301 },
915 { 0x01FC, 0x00C6, 0x0301 },
916 { 0x01FD, 0x00E6, 0x0301 },
917 { 0x01FE, 0x00D8, 0x0301 },
918 { 0x01FF, 0x00F8, 0x0301 },
919 { 0x0200, 0x0041, 0x030F },
920 { 0x0201, 0x0061, 0x030F },
921 { 0x0202, 0x0041, 0x0311 },
922 { 0x0203, 0x0061, 0x0311 },
923 { 0x0204, 0x0045, 0x030F },
924 { 0x0205, 0x0065, 0x030F },
925 { 0x0206, 0x0045, 0x0311 },
926 { 0x0207, 0x0065, 0x0311 },
927 { 0x0208, 0x0049, 0x030F },
928 { 0x0209, 0x0069, 0x030F },
929 { 0x020A, 0x0049, 0x0311 },
930 { 0x020B, 0x0069, 0x0311 },
931 { 0x020C, 0x004F, 0x030F },
932 { 0x020D, 0x006F, 0x030F },
933 { 0x020E, 0x004F, 0x0311 },
934 { 0x020F, 0x006F, 0x0311 },
935 { 0x0210, 0x0052, 0x030F },
936 { 0x0211, 0x0072, 0x030F },
937 { 0x0212, 0x0052, 0x0311 },
938 { 0x0213, 0x0072, 0x0311 },
939 { 0x0214, 0x0055, 0x030F },
940 { 0x0215, 0x0075, 0x030F },
941 { 0x0216, 0x0055, 0x0311 },
942 { 0x0217, 0x0075, 0x0311 },
943 { 0x0218, 0x0053, 0x0326 },
944 { 0x0219, 0x0073, 0x0326 },
945 { 0x021A, 0x0054, 0x0326 },
946 { 0x021B, 0x0074, 0x0326 },
947 { 0x021E, 0x0048, 0x030C },
948 { 0x021F, 0x0068, 0x030C },
949 { 0x0226, 0x0041, 0x0307 },
950 { 0x0227, 0x0061, 0x0307 },
951 { 0x0228, 0x0045, 0x0327 },
952 { 0x0229, 0x0065, 0x0327 },
953 { 0x022A, 0x00D6, 0x0304 },
954 { 0x022B, 0x00F6, 0x0304 },
955 { 0x022C, 0x00D5, 0x0304 },
956 { 0x022D, 0x00F5, 0x0304 },
957 { 0x022E, 0x004F, 0x0307 },
958 { 0x022F, 0x006F, 0x0307 },
959 { 0x0230, 0x022E, 0x0304 },
960 { 0x0231, 0x022F, 0x0304 },
961 { 0x0232, 0x0059, 0x0304 },
962 { 0x0233, 0x0079, 0x0304 },
963 { 0x0344, 0x0308, 0x0301 },
964 { 0x0385, 0x00A8, 0x0301 },
965 { 0x0386, 0x0391, 0x0301 },
966 { 0x0388, 0x0395, 0x0301 },
967 { 0x0389, 0x0397, 0x0301 },
968 { 0x038A, 0x0399, 0x0301 },
969 { 0x038C, 0x039F, 0x0301 },
970 { 0x038E, 0x03A5, 0x0301 },
971 { 0x038F, 0x03A9, 0x0301 },
972 { 0x0390, 0x03CA, 0x0301 },
973 { 0x03AA, 0x0399, 0x0308 },
974 { 0x03AB, 0x03A5, 0x0308 },
975 { 0x03AC, 0x03B1, 0x0301 },
976 { 0x03AD, 0x03B5, 0x0301 },
977 { 0x03AE, 0x03B7, 0x0301 },
978 { 0x03AF, 0x03B9, 0x0301 },
979 { 0x03B0, 0x03CB, 0x0301 },
980 { 0x03CA, 0x03B9, 0x0308 },
981 { 0x03CB, 0x03C5, 0x0308 },
982 { 0x03CC, 0x03BF, 0x0301 },
983 { 0x03CD, 0x03C5, 0x0301 },
984 { 0x03CE, 0x03C9, 0x0301 },
985 { 0x03D3, 0x03D2, 0x0301 },
986 { 0x03D4, 0x03D2, 0x0308 },
987 { 0x0400, 0x0415, 0x0300 },
988 { 0x0401, 0x0415, 0x0308 },
989 { 0x0403, 0x0413, 0x0301 },
990 { 0x0407, 0x0406, 0x0308 },
991 { 0x040C, 0x041A, 0x0301 },
992 { 0x040D, 0x0418, 0x0300 },
993 { 0x040E, 0x0423, 0x0306 },
994 { 0x0419, 0x0418, 0x0306 },
995 { 0x0439, 0x0438, 0x0306 },
996 { 0x0450, 0x0435, 0x0300 },
997 { 0x0451, 0x0435, 0x0308 },
998 { 0x0453, 0x0433, 0x0301 },
999 { 0x0457, 0x0456, 0x0308 },
1000 { 0x045C, 0x043A, 0x0301 },
1001 { 0x045D, 0x0438, 0x0300 },
1002 { 0x045E, 0x0443, 0x0306 },
1003 { 0x0476, 0x0474, 0x030F },
1004 { 0x0477, 0x0475, 0x030F },
1005 { 0x04C1, 0x0416, 0x0306 },
1006 { 0x04C2, 0x0436, 0x0306 },
1007 { 0x04D0, 0x0410, 0x0306 },
1008 { 0x04D1, 0x0430, 0x0306 },
1009 { 0x04D2, 0x0410, 0x0308 },
1010 { 0x04D3, 0x0430, 0x0308 },
1011 { 0x04D6, 0x0415, 0x0306 },
1012 { 0x04D7, 0x0435, 0x0306 },
1013 { 0x04DA, 0x04D8, 0x0308 },
1014 { 0x04DB, 0x04D9, 0x0308 },
1015 { 0x04DC, 0x0416, 0x0308 },
1016 { 0x04DD, 0x0436, 0x0308 },
1017 { 0x04DE, 0x0417, 0x0308 },
1018 { 0x04DF, 0x0437, 0x0308 },
1019 { 0x04E2, 0x0418, 0x0304 },
1020 { 0x04E3, 0x0438, 0x0304 },
1021 { 0x04E4, 0x0418, 0x0308 },
1022 { 0x04E5, 0x0438, 0x0308 },
1023 { 0x04E6, 0x041E, 0x0308 },
1024 { 0x04E7, 0x043E, 0x0308 },
1025 { 0x04EA, 0x04E8, 0x0308 },
1026 { 0x04EB, 0x04E9, 0x0308 },
1027 { 0x04EC, 0x042D, 0x0308 },
1028 { 0x04ED, 0x044D, 0x0308 },
1029 { 0x04EE, 0x0423, 0x0304 },
1030 { 0x04EF, 0x0443, 0x0304 },
1031 { 0x04F0, 0x0423, 0x0308 },
1032 { 0x04F1, 0x0443, 0x0308 },
1033 { 0x04F2, 0x0423, 0x030B },
1034 { 0x04F3, 0x0443, 0x030B },
1035 { 0x04F4, 0x0427, 0x0308 },
1036 { 0x04F5, 0x0447, 0x0308 },
1037 { 0x04F8, 0x042B, 0x0308 },
1038 { 0x04F9, 0x044B, 0x0308 },
1039 { 0x0622, 0x0627, 0x0653 },
1040 { 0x0623, 0x0627, 0x0654 },
1041 { 0x0624, 0x0648, 0x0654 },
1042 { 0x0625, 0x0627, 0x0655 },
1043 { 0x0626, 0x064A, 0x0654 },
1044 { 0x06C0, 0x06D5, 0x0654 },
1045 { 0x06C2, 0x06C1, 0x0654 },
1046 { 0x06D3, 0x06D2, 0x0654 },
1047 { 0x0929, 0x0928, 0x093C },
1048 { 0x0931, 0x0930, 0x093C },
1049 { 0x0934, 0x0933, 0x093C },
1050 { 0x0958, 0x0915, 0x093C },
1051 { 0x0959, 0x0916, 0x093C },
1052 { 0x095A, 0x0917, 0x093C },
1053 { 0x095B, 0x091C, 0x093C },
1054 { 0x095C, 0x0921, 0x093C },
1055 { 0x095D, 0x0922, 0x093C },
1056 { 0x095E, 0x092B, 0x093C },
1057 { 0x095F, 0x092F, 0x093C },
1058 { 0x09CB, 0x09C7, 0x09BE },
1059 { 0x09CC, 0x09C7, 0x09D7 },
1060 { 0x09DC, 0x09A1, 0x09BC },
1061 { 0x09DD, 0x09A2, 0x09BC },
1062 { 0x09DF, 0x09AF, 0x09BC },
1063 { 0x0A33, 0x0A32, 0x0A3C },
1064 { 0x0A36, 0x0A38, 0x0A3C },
1065 { 0x0A59, 0x0A16, 0x0A3C },
1066 { 0x0A5A, 0x0A17, 0x0A3C },
1067 { 0x0A5B, 0x0A1C, 0x0A3C },
1068 { 0x0A5E, 0x0A2B, 0x0A3C },
1069 { 0x0B48, 0x0B47, 0x0B56 },
1070 { 0x0B4B, 0x0B47, 0x0B3E },
1071 { 0x0B4C, 0x0B47, 0x0B57 },
1072 { 0x0B5C, 0x0B21, 0x0B3C },
1073 { 0x0B5D, 0x0B22, 0x0B3C },
1074 { 0x0B94, 0x0B92, 0x0BD7 },
1075 { 0x0BCA, 0x0BC6, 0x0BBE },
1076 { 0x0BCB, 0x0BC7, 0x0BBE },
1077 { 0x0BCC, 0x0BC6, 0x0BD7 },
1078 { 0x0C48, 0x0C46, 0x0C56 },
1079 { 0x0CC0, 0x0CBF, 0x0CD5 },
1080 { 0x0CC7, 0x0CC6, 0x0CD5 },
1081 { 0x0CC8, 0x0CC6, 0x0CD6 },
1082 { 0x0CCA, 0x0CC6, 0x0CC2 },
1083 { 0x0CCB, 0x0CCA, 0x0CD5 },
1084 { 0x0D4A, 0x0D46, 0x0D3E },
1085 { 0x0D4B, 0x0D47, 0x0D3E },
1086 { 0x0D4C, 0x0D46, 0x0D57 },
1087 { 0x0DDA, 0x0DD9, 0x0DCA },
1088 { 0x0DDC, 0x0DD9, 0x0DCF },
1089 { 0x0DDD, 0x0DDC, 0x0DCA },
1090 { 0x0DDE, 0x0DD9, 0x0DDF },
1091 { 0x0F43, 0x0F42, 0x0FB7 },
1092 { 0x0F4D, 0x0F4C, 0x0FB7 },
1093 { 0x0F52, 0x0F51, 0x0FB7 },
1094 { 0x0F57, 0x0F56, 0x0FB7 },
1095 { 0x0F5C, 0x0F5B, 0x0FB7 },
1096 { 0x0F69, 0x0F40, 0x0FB5 },
1097 { 0x0F73, 0x0F71, 0x0F72 },
1098 { 0x0F75, 0x0F71, 0x0F74 },
1099 { 0x0F76, 0x0FB2, 0x0F80 },
1100 { 0x0F78, 0x0FB3, 0x0F80 },
1101 { 0x0F81, 0x0F71, 0x0F80 },
1102 { 0x0F93, 0x0F92, 0x0FB7 },
1103 { 0x0F9D, 0x0F9C, 0x0FB7 },
1104 { 0x0FA2, 0x0FA1, 0x0FB7 },
1105 { 0x0FA7, 0x0FA6, 0x0FB7 },
1106 { 0x0FAC, 0x0FAB, 0x0FB7 },
1107 { 0x0FB9, 0x0F90, 0x0FB5 },
1108 { 0x1026, 0x1025, 0x102E },
1109 { 0x1E00, 0x0041, 0x0325 },
1110 { 0x1E01, 0x0061, 0x0325 },
1111 { 0x1E02, 0x0042, 0x0307 },
1112 { 0x1E03, 0x0062, 0x0307 },
1113 { 0x1E04, 0x0042, 0x0323 },
1114 { 0x1E05, 0x0062, 0x0323 },
1115 { 0x1E06, 0x0042, 0x0331 },
1116 { 0x1E07, 0x0062, 0x0331 },
1117 { 0x1E08, 0x00C7, 0x0301 },
1118 { 0x1E09, 0x00E7, 0x0301 },
1119 { 0x1E0A, 0x0044, 0x0307 },
1120 { 0x1E0B, 0x0064, 0x0307 },
1121 { 0x1E0C, 0x0044, 0x0323 },
1122 { 0x1E0D, 0x0064, 0x0323 },
1123 { 0x1E0E, 0x0044, 0x0331 },
1124 { 0x1E0F, 0x0064, 0x0331 },
1125 { 0x1E10, 0x0044, 0x0327 },
1126 { 0x1E11, 0x0064, 0x0327 },
1127 { 0x1E12, 0x0044, 0x032D },
1128 { 0x1E13, 0x0064, 0x032D },
1129 { 0x1E14, 0x0112, 0x0300 },
1130 { 0x1E15, 0x0113, 0x0300 },
1131 { 0x1E16, 0x0112, 0x0301 },
1132 { 0x1E17, 0x0113, 0x0301 },
1133 { 0x1E18, 0x0045, 0x032D },
1134 { 0x1E19, 0x0065, 0x032D },
1135 { 0x1E1A, 0x0045, 0x0330 },
1136 { 0x1E1B, 0x0065, 0x0330 },
1137 { 0x1E1C, 0x0228, 0x0306 },
1138 { 0x1E1D, 0x0229, 0x0306 },
1139 { 0x1E1E, 0x0046, 0x0307 },
1140 { 0x1E1F, 0x0066, 0x0307 },
1141 { 0x1E20, 0x0047, 0x0304 },
1142 { 0x1E21, 0x0067, 0x0304 },
1143 { 0x1E22, 0x0048, 0x0307 },
1144 { 0x1E23, 0x0068, 0x0307 },
1145 { 0x1E24, 0x0048, 0x0323 },
1146 { 0x1E25, 0x0068, 0x0323 },
1147 { 0x1E26, 0x0048, 0x0308 },
1148 { 0x1E27, 0x0068, 0x0308 },
1149 { 0x1E28, 0x0048, 0x0327 },
1150 { 0x1E29, 0x0068, 0x0327 },
1151 { 0x1E2A, 0x0048, 0x032E },
1152 { 0x1E2B, 0x0068, 0x032E },
1153 { 0x1E2C, 0x0049, 0x0330 },
1154 { 0x1E2D, 0x0069, 0x0330 },
1155 { 0x1E2E, 0x00CF, 0x0301 },
1156 { 0x1E2F, 0x00EF, 0x0301 },
1157 { 0x1E30, 0x004B, 0x0301 },
1158 { 0x1E31, 0x006B, 0x0301 },
1159 { 0x1E32, 0x004B, 0x0323 },
1160 { 0x1E33, 0x006B, 0x0323 },
1161 { 0x1E34, 0x004B, 0x0331 },
1162 { 0x1E35, 0x006B, 0x0331 },
1163 { 0x1E36, 0x004C, 0x0323 },
1164 { 0x1E37, 0x006C, 0x0323 },
1165 { 0x1E38, 0x1E36, 0x0304 },
1166 { 0x1E39, 0x1E37, 0x0304 },
1167 { 0x1E3A, 0x004C, 0x0331 },
1168 { 0x1E3B, 0x006C, 0x0331 },
1169 { 0x1E3C, 0x004C, 0x032D },
1170 { 0x1E3D, 0x006C, 0x032D },
1171 { 0x1E3E, 0x004D, 0x0301 },
1172 { 0x1E3F, 0x006D, 0x0301 },
1173 { 0x1E40, 0x004D, 0x0307 },
1174 { 0x1E41, 0x006D, 0x0307 },
1175 { 0x1E42, 0x004D, 0x0323 },
1176 { 0x1E43, 0x006D, 0x0323 },
1177 { 0x1E44, 0x004E, 0x0307 },
1178 { 0x1E45, 0x006E, 0x0307 },
1179 { 0x1E46, 0x004E, 0x0323 },
1180 { 0x1E47, 0x006E, 0x0323 },
1181 { 0x1E48, 0x004E, 0x0331 },
1182 { 0x1E49, 0x006E, 0x0331 },
1183 { 0x1E4A, 0x004E, 0x032D },
1184 { 0x1E4B, 0x006E, 0x032D },
1185 { 0x1E4C, 0x00D5, 0x0301 },
1186 { 0x1E4D, 0x00F5, 0x0301 },
1187 { 0x1E4E, 0x00D5, 0x0308 },
1188 { 0x1E4F, 0x00F5, 0x0308 },
1189 { 0x1E50, 0x014C, 0x0300 },
1190 { 0x1E51, 0x014D, 0x0300 },
1191 { 0x1E52, 0x014C, 0x0301 },
1192 { 0x1E53, 0x014D, 0x0301 },
1193 { 0x1E54, 0x0050, 0x0301 },
1194 { 0x1E55, 0x0070, 0x0301 },
1195 { 0x1E56, 0x0050, 0x0307 },
1196 { 0x1E57, 0x0070, 0x0307 },
1197 { 0x1E58, 0x0052, 0x0307 },
1198 { 0x1E59, 0x0072, 0x0307 },
1199 { 0x1E5A, 0x0052, 0x0323 },
1200 { 0x1E5B, 0x0072, 0x0323 },
1201 { 0x1E5C, 0x1E5A, 0x0304 },
1202 { 0x1E5D, 0x1E5B, 0x0304 },
1203 { 0x1E5E, 0x0052, 0x0331 },
1204 { 0x1E5F, 0x0072, 0x0331 },
1205 { 0x1E60, 0x0053, 0x0307 },
1206 { 0x1E61, 0x0073, 0x0307 },
1207 { 0x1E62, 0x0053, 0x0323 },
1208 { 0x1E63, 0x0073, 0x0323 },
1209 { 0x1E64, 0x015A, 0x0307 },
1210 { 0x1E65, 0x015B, 0x0307 },
1211 { 0x1E66, 0x0160, 0x0307 },
1212 { 0x1E67, 0x0161, 0x0307 },
1213 { 0x1E68, 0x1E62, 0x0307 },
1214 { 0x1E69, 0x1E63, 0x0307 },
1215 { 0x1E6A, 0x0054, 0x0307 },
1216 { 0x1E6B, 0x0074, 0x0307 },
1217 { 0x1E6C, 0x0054, 0x0323 },
1218 { 0x1E6D, 0x0074, 0x0323 },
1219 { 0x1E6E, 0x0054, 0x0331 },
1220 { 0x1E6F, 0x0074, 0x0331 },
1221 { 0x1E70, 0x0054, 0x032D },
1222 { 0x1E71, 0x0074, 0x032D },
1223 { 0x1E72, 0x0055, 0x0324 },
1224 { 0x1E73, 0x0075, 0x0324 },
1225 { 0x1E74, 0x0055, 0x0330 },
1226 { 0x1E75, 0x0075, 0x0330 },
1227 { 0x1E76, 0x0055, 0x032D },
1228 { 0x1E77, 0x0075, 0x032D },
1229 { 0x1E78, 0x0168, 0x0301 },
1230 { 0x1E79, 0x0169, 0x0301 },
1231 { 0x1E7A, 0x016A, 0x0308 },
1232 { 0x1E7B, 0x016B, 0x0308 },
1233 { 0x1E7C, 0x0056, 0x0303 },
1234 { 0x1E7D, 0x0076, 0x0303 },
1235 { 0x1E7E, 0x0056, 0x0323 },
1236 { 0x1E7F, 0x0076, 0x0323 },
1237 { 0x1E80, 0x0057, 0x0300 },
1238 { 0x1E81, 0x0077, 0x0300 },
1239 { 0x1E82, 0x0057, 0x0301 },
1240 { 0x1E83, 0x0077, 0x0301 },
1241 { 0x1E84, 0x0057, 0x0308 },
1242 { 0x1E85, 0x0077, 0x0308 },
1243 { 0x1E86, 0x0057, 0x0307 },
1244 { 0x1E87, 0x0077, 0x0307 },
1245 { 0x1E88, 0x0057, 0x0323 },
1246 { 0x1E89, 0x0077, 0x0323 },
1247 { 0x1E8A, 0x0058, 0x0307 },
1248 { 0x1E8B, 0x0078, 0x0307 },
1249 { 0x1E8C, 0x0058, 0x0308 },
1250 { 0x1E8D, 0x0078, 0x0308 },
1251 { 0x1E8E, 0x0059, 0x0307 },
1252 { 0x1E8F, 0x0079, 0x0307 },
1253 { 0x1E90, 0x005A, 0x0302 },
1254 { 0x1E91, 0x007A, 0x0302 },
1255 { 0x1E92, 0x005A, 0x0323 },
1256 { 0x1E93, 0x007A, 0x0323 },
1257 { 0x1E94, 0x005A, 0x0331 },
1258 { 0x1E95, 0x007A, 0x0331 },
1259 { 0x1E96, 0x0068, 0x0331 },
1260 { 0x1E97, 0x0074, 0x0308 },
1261 { 0x1E98, 0x0077, 0x030A },
1262 { 0x1E99, 0x0079, 0x030A },
1263 { 0x1E9B, 0x017F, 0x0307 },
1264 { 0x1EA0, 0x0041, 0x0323 },
1265 { 0x1EA1, 0x0061, 0x0323 },
1266 { 0x1EA2, 0x0041, 0x0309 },
1267 { 0x1EA3, 0x0061, 0x0309 },
1268 { 0x1EA4, 0x00C2, 0x0301 },
1269 { 0x1EA5, 0x00E2, 0x0301 },
1270 { 0x1EA6, 0x00C2, 0x0300 },
1271 { 0x1EA7, 0x00E2, 0x0300 },
1272 { 0x1EA8, 0x00C2, 0x0309 },
1273 { 0x1EA9, 0x00E2, 0x0309 },
1274 { 0x1EAA, 0x00C2, 0x0303 },
1275 { 0x1EAB, 0x00E2, 0x0303 },
1276 { 0x1EAC, 0x1EA0, 0x0302 },
1277 { 0x1EAD, 0x1EA1, 0x0302 },
1278 { 0x1EAE, 0x0102, 0x0301 },
1279 { 0x1EAF, 0x0103, 0x0301 },
1280 { 0x1EB0, 0x0102, 0x0300 },
1281 { 0x1EB1, 0x0103, 0x0300 },
1282 { 0x1EB2, 0x0102, 0x0309 },
1283 { 0x1EB3, 0x0103, 0x0309 },
1284 { 0x1EB4, 0x0102, 0x0303 },
1285 { 0x1EB5, 0x0103, 0x0303 },
1286 { 0x1EB6, 0x1EA0, 0x0306 },
1287 { 0x1EB7, 0x1EA1, 0x0306 },
1288 { 0x1EB8, 0x0045, 0x0323 },
1289 { 0x1EB9, 0x0065, 0x0323 },
1290 { 0x1EBA, 0x0045, 0x0309 },
1291 { 0x1EBB, 0x0065, 0x0309 },
1292 { 0x1EBC, 0x0045, 0x0303 },
1293 { 0x1EBD, 0x0065, 0x0303 },
1294 { 0x1EBE, 0x00CA, 0x0301 },
1295 { 0x1EBF, 0x00EA, 0x0301 },
1296 { 0x1EC0, 0x00CA, 0x0300 },
1297 { 0x1EC1, 0x00EA, 0x0300 },
1298 { 0x1EC2, 0x00CA, 0x0309 },
1299 { 0x1EC3, 0x00EA, 0x0309 },
1300 { 0x1EC4, 0x00CA, 0x0303 },
1301 { 0x1EC5, 0x00EA, 0x0303 },
1302 { 0x1EC6, 0x1EB8, 0x0302 },
1303 { 0x1EC7, 0x1EB9, 0x0302 },
1304 { 0x1EC8, 0x0049, 0x0309 },
1305 { 0x1EC9, 0x0069, 0x0309 },
1306 { 0x1ECA, 0x0049, 0x0323 },
1307 { 0x1ECB, 0x0069, 0x0323 },
1308 { 0x1ECC, 0x004F, 0x0323 },
1309 { 0x1ECD, 0x006F, 0x0323 },
1310 { 0x1ECE, 0x004F, 0x0309 },
1311 { 0x1ECF, 0x006F, 0x0309 },
1312 { 0x1ED0, 0x00D4, 0x0301 },
1313 { 0x1ED1, 0x00F4, 0x0301 },
1314 { 0x1ED2, 0x00D4, 0x0300 },
1315 { 0x1ED3, 0x00F4, 0x0300 },
1316 { 0x1ED4, 0x00D4, 0x0309 },
1317 { 0x1ED5, 0x00F4, 0x0309 },
1318 { 0x1ED6, 0x00D4, 0x0303 },
1319 { 0x1ED7, 0x00F4, 0x0303 },
1320 { 0x1ED8, 0x1ECC, 0x0302 },
1321 { 0x1ED9, 0x1ECD, 0x0302 },
1322 { 0x1EDA, 0x01A0, 0x0301 },
1323 { 0x1EDB, 0x01A1, 0x0301 },
1324 { 0x1EDC, 0x01A0, 0x0300 },
1325 { 0x1EDD, 0x01A1, 0x0300 },
1326 { 0x1EDE, 0x01A0, 0x0309 },
1327 { 0x1EDF, 0x01A1, 0x0309 },
1328 { 0x1EE0, 0x01A0, 0x0303 },
1329 { 0x1EE1, 0x01A1, 0x0303 },
1330 { 0x1EE2, 0x01A0, 0x0323 },
1331 { 0x1EE3, 0x01A1, 0x0323 },
1332 { 0x1EE4, 0x0055, 0x0323 },
1333 { 0x1EE5, 0x0075, 0x0323 },
1334 { 0x1EE6, 0x0055, 0x0309 },
1335 { 0x1EE7, 0x0075, 0x0309 },
1336 { 0x1EE8, 0x01AF, 0x0301 },
1337 { 0x1EE9, 0x01B0, 0x0301 },
1338 { 0x1EEA, 0x01AF, 0x0300 },
1339 { 0x1EEB, 0x01B0, 0x0300 },
1340 { 0x1EEC, 0x01AF, 0x0309 },
1341 { 0x1EED, 0x01B0, 0x0309 },
1342 { 0x1EEE, 0x01AF, 0x0303 },
1343 { 0x1EEF, 0x01B0, 0x0303 },
1344 { 0x1EF0, 0x01AF, 0x0323 },
1345 { 0x1EF1, 0x01B0, 0x0323 },
1346 { 0x1EF2, 0x0059, 0x0300 },
1347 { 0x1EF3, 0x0079, 0x0300 },
1348 { 0x1EF4, 0x0059, 0x0323 },
1349 { 0x1EF5, 0x0079, 0x0323 },
1350 { 0x1EF6, 0x0059, 0x0309 },
1351 { 0x1EF7, 0x0079, 0x0309 },
1352 { 0x1EF8, 0x0059, 0x0303 },
1353 { 0x1EF9, 0x0079, 0x0303 },
1354 { 0x1F00, 0x03B1, 0x0313 },
1355 { 0x1F01, 0x03B1, 0x0314 },
1356 { 0x1F02, 0x1F00, 0x0300 },
1357 { 0x1F03, 0x1F01, 0x0300 },
1358 { 0x1F04, 0x1F00, 0x0301 },
1359 { 0x1F05, 0x1F01, 0x0301 },
1360 { 0x1F06, 0x1F00, 0x0342 },
1361 { 0x1F07, 0x1F01, 0x0342 },
1362 { 0x1F08, 0x0391, 0x0313 },
1363 { 0x1F09, 0x0391, 0x0314 },
1364 { 0x1F0A, 0x1F08, 0x0300 },
1365 { 0x1F0B, 0x1F09, 0x0300 },
1366 { 0x1F0C, 0x1F08, 0x0301 },
1367 { 0x1F0D, 0x1F09, 0x0301 },
1368 { 0x1F0E, 0x1F08, 0x0342 },
1369 { 0x1F0F, 0x1F09, 0x0342 },
1370 { 0x1F10, 0x03B5, 0x0313 },
1371 { 0x1F11, 0x03B5, 0x0314 },
1372 { 0x1F12, 0x1F10, 0x0300 },
1373 { 0x1F13, 0x1F11, 0x0300 },
1374 { 0x1F14, 0x1F10, 0x0301 },
1375 { 0x1F15, 0x1F11, 0x0301 },
1376 { 0x1F18, 0x0395, 0x0313 },
1377 { 0x1F19, 0x0395, 0x0314 },
1378 { 0x1F1A, 0x1F18, 0x0300 },
1379 { 0x1F1B, 0x1F19, 0x0300 },
1380 { 0x1F1C, 0x1F18, 0x0301 },
1381 { 0x1F1D, 0x1F19, 0x0301 },
1382 { 0x1F20, 0x03B7, 0x0313 },
1383 { 0x1F21, 0x03B7, 0x0314 },
1384 { 0x1F22, 0x1F20, 0x0300 },
1385 { 0x1F23, 0x1F21, 0x0300 },
1386 { 0x1F24, 0x1F20, 0x0301 },
1387 { 0x1F25, 0x1F21, 0x0301 },
1388 { 0x1F26, 0x1F20, 0x0342 },
1389 { 0x1F27, 0x1F21, 0x0342 },
1390 { 0x1F28, 0x0397, 0x0313 },
1391 { 0x1F29, 0x0397, 0x0314 },
1392 { 0x1F2A, 0x1F28, 0x0300 },
1393 { 0x1F2B, 0x1F29, 0x0300 },
1394 { 0x1F2C, 0x1F28, 0x0301 },
1395 { 0x1F2D, 0x1F29, 0x0301 },
1396 { 0x1F2E, 0x1F28, 0x0342 },
1397 { 0x1F2F, 0x1F29, 0x0342 },
1398 { 0x1F30, 0x03B9, 0x0313 },
1399 { 0x1F31, 0x03B9, 0x0314 },
1400 { 0x1F32, 0x1F30, 0x0300 },
1401 { 0x1F33, 0x1F31, 0x0300 },
1402 { 0x1F34, 0x1F30, 0x0301 },
1403 { 0x1F35, 0x1F31, 0x0301 },
1404 { 0x1F36, 0x1F30, 0x0342 },
1405 { 0x1F37, 0x1F31, 0x0342 },
1406 { 0x1F38, 0x0399, 0x0313 },
1407 { 0x1F39, 0x0399, 0x0314 },
1408 { 0x1F3A, 0x1F38, 0x0300 },
1409 { 0x1F3B, 0x1F39, 0x0300 },
1410 { 0x1F3C, 0x1F38, 0x0301 },
1411 { 0x1F3D, 0x1F39, 0x0301 },
1412 { 0x1F3E, 0x1F38, 0x0342 },
1413 { 0x1F3F, 0x1F39, 0x0342 },
1414 { 0x1F40, 0x03BF, 0x0313 },
1415 { 0x1F41, 0x03BF, 0x0314 },
1416 { 0x1F42, 0x1F40, 0x0300 },
1417 { 0x1F43, 0x1F41, 0x0300 },
1418 { 0x1F44, 0x1F40, 0x0301 },
1419 { 0x1F45, 0x1F41, 0x0301 },
1420 { 0x1F48, 0x039F, 0x0313 },
1421 { 0x1F49, 0x039F, 0x0314 },
1422 { 0x1F4A, 0x1F48, 0x0300 },
1423 { 0x1F4B, 0x1F49, 0x0300 },
1424 { 0x1F4C, 0x1F48, 0x0301 },
1425 { 0x1F4D, 0x1F49, 0x0301 },
1426 { 0x1F50, 0x03C5, 0x0313 },
1427 { 0x1F51, 0x03C5, 0x0314 },
1428 { 0x1F52, 0x1F50, 0x0300 },
1429 { 0x1F53, 0x1F51, 0x0300 },
1430 { 0x1F54, 0x1F50, 0x0301 },
1431 { 0x1F55, 0x1F51, 0x0301 },
1432 { 0x1F56, 0x1F50, 0x0342 },
1433 { 0x1F57, 0x1F51, 0x0342 },
1434 { 0x1F59, 0x03A5, 0x0314 },
1435 { 0x1F5B, 0x1F59, 0x0300 },
1436 { 0x1F5D, 0x1F59, 0x0301 },
1437 { 0x1F5F, 0x1F59, 0x0342 },
1438 { 0x1F60, 0x03C9, 0x0313 },
1439 { 0x1F61, 0x03C9, 0x0314 },
1440 { 0x1F62, 0x1F60, 0x0300 },
1441 { 0x1F63, 0x1F61, 0x0300 },
1442 { 0x1F64, 0x1F60, 0x0301 },
1443 { 0x1F65, 0x1F61, 0x0301 },
1444 { 0x1F66, 0x1F60, 0x0342 },
1445 { 0x1F67, 0x1F61, 0x0342 },
1446 { 0x1F68, 0x03A9, 0x0313 },
1447 { 0x1F69, 0x03A9, 0x0314 },
1448 { 0x1F6A, 0x1F68, 0x0300 },
1449 { 0x1F6B, 0x1F69, 0x0300 },
1450 { 0x1F6C, 0x1F68, 0x0301 },
1451 { 0x1F6D, 0x1F69, 0x0301 },
1452 { 0x1F6E, 0x1F68, 0x0342 },
1453 { 0x1F6F, 0x1F69, 0x0342 },
1454 { 0x1F70, 0x03B1, 0x0300 },
1455 { 0x1F72, 0x03B5, 0x0300 },
1456 { 0x1F74, 0x03B7, 0x0300 },
1457 { 0x1F76, 0x03B9, 0x0300 },
1458 { 0x1F78, 0x03BF, 0x0300 },
1459 { 0x1F7A, 0x03C5, 0x0300 },
1460 { 0x1F7C, 0x03C9, 0x0300 },
1461 { 0x1F80, 0x1F00, 0x0345 },
1462 { 0x1F81, 0x1F01, 0x0345 },
1463 { 0x1F82, 0x1F02, 0x0345 },
1464 { 0x1F83, 0x1F03, 0x0345 },
1465 { 0x1F84, 0x1F04, 0x0345 },
1466 { 0x1F85, 0x1F05, 0x0345 },
1467 { 0x1F86, 0x1F06, 0x0345 },
1468 { 0x1F87, 0x1F07, 0x0345 },
1469 { 0x1F88, 0x1F08, 0x0345 },
1470 { 0x1F89, 0x1F09, 0x0345 },
1471 { 0x1F8A, 0x1F0A, 0x0345 },
1472 { 0x1F8B, 0x1F0B, 0x0345 },
1473 { 0x1F8C, 0x1F0C, 0x0345 },
1474 { 0x1F8D, 0x1F0D, 0x0345 },
1475 { 0x1F8E, 0x1F0E, 0x0345 },
1476 { 0x1F8F, 0x1F0F, 0x0345 },
1477 { 0x1F90, 0x1F20, 0x0345 },
1478 { 0x1F91, 0x1F21, 0x0345 },
1479 { 0x1F92, 0x1F22, 0x0345 },
1480 { 0x1F93, 0x1F23, 0x0345 },
1481 { 0x1F94, 0x1F24, 0x0345 },
1482 { 0x1F95, 0x1F25, 0x0345 },
1483 { 0x1F96, 0x1F26, 0x0345 },
1484 { 0x1F97, 0x1F27, 0x0345 },
1485 { 0x1F98, 0x1F28, 0x0345 },
1486 { 0x1F99, 0x1F29, 0x0345 },
1487 { 0x1F9A, 0x1F2A, 0x0345 },
1488 { 0x1F9B, 0x1F2B, 0x0345 },
1489 { 0x1F9C, 0x1F2C, 0x0345 },
1490 { 0x1F9D, 0x1F2D, 0x0345 },
1491 { 0x1F9E, 0x1F2E, 0x0345 },
1492 { 0x1F9F, 0x1F2F, 0x0345 },
1493 { 0x1FA0, 0x1F60, 0x0345 },
1494 { 0x1FA1, 0x1F61, 0x0345 },
1495 { 0x1FA2, 0x1F62, 0x0345 },
1496 { 0x1FA3, 0x1F63, 0x0345 },
1497 { 0x1FA4, 0x1F64, 0x0345 },
1498 { 0x1FA5, 0x1F65, 0x0345 },
1499 { 0x1FA6, 0x1F66, 0x0345 },
1500 { 0x1FA7, 0x1F67, 0x0345 },
1501 { 0x1FA8, 0x1F68, 0x0345 },
1502 { 0x1FA9, 0x1F69, 0x0345 },
1503 { 0x1FAA, 0x1F6A, 0x0345 },
1504 { 0x1FAB, 0x1F6B, 0x0345 },
1505 { 0x1FAC, 0x1F6C, 0x0345 },
1506 { 0x1FAD, 0x1F6D, 0x0345 },
1507 { 0x1FAE, 0x1F6E, 0x0345 },
1508 { 0x1FAF, 0x1F6F, 0x0345 },
1509 { 0x1FB0, 0x03B1, 0x0306 },
1510 { 0x1FB1, 0x03B1, 0x0304 },
1511 { 0x1FB2, 0x1F70, 0x0345 },
1512 { 0x1FB3, 0x03B1, 0x0345 },
1513 { 0x1FB4, 0x03AC, 0x0345 },
1514 { 0x1FB6, 0x03B1, 0x0342 },
1515 { 0x1FB7, 0x1FB6, 0x0345 },
1516 { 0x1FB8, 0x0391, 0x0306 },
1517 { 0x1FB9, 0x0391, 0x0304 },
1518 { 0x1FBA, 0x0391, 0x0300 },
1519 { 0x1FBC, 0x0391, 0x0345 },
1520 { 0x1FC1, 0x00A8, 0x0342 },
1521 { 0x1FC2, 0x1F74, 0x0345 },
1522 { 0x1FC3, 0x03B7, 0x0345 },
1523 { 0x1FC4, 0x03AE, 0x0345 },
1524 { 0x1FC6, 0x03B7, 0x0342 },
1525 { 0x1FC7, 0x1FC6, 0x0345 },
1526 { 0x1FC8, 0x0395, 0x0300 },
1527 { 0x1FCA, 0x0397, 0x0300 },
1528 { 0x1FCC, 0x0397, 0x0345 },
1529 { 0x1FCD, 0x1FBF, 0x0300 },
1530 { 0x1FCE, 0x1FBF, 0x0301 },
1531 { 0x1FCF, 0x1FBF, 0x0342 },
1532 { 0x1FD0, 0x03B9, 0x0306 },
1533 { 0x1FD1, 0x03B9, 0x0304 },
1534 { 0x1FD2, 0x03CA, 0x0300 },
1535 { 0x1FD6, 0x03B9, 0x0342 },
1536 { 0x1FD7, 0x03CA, 0x0342 },
1537 { 0x1FD8, 0x0399, 0x0306 },
1538 { 0x1FD9, 0x0399, 0x0304 },
1539 { 0x1FDA, 0x0399, 0x0300 },
1540 { 0x1FDD, 0x1FFE, 0x0300 },
1541 { 0x1FDE, 0x1FFE, 0x0301 },
1542 { 0x1FDF, 0x1FFE, 0x0342 },
1543 { 0x1FE0, 0x03C5, 0x0306 },
1544 { 0x1FE1, 0x03C5, 0x0304 },
1545 { 0x1FE2, 0x03CB, 0x0300 },
1546 { 0x1FE4, 0x03C1, 0x0313 },
1547 { 0x1FE5, 0x03C1, 0x0314 },
1548 { 0x1FE6, 0x03C5, 0x0342 },
1549 { 0x1FE7, 0x03CB, 0x0342 },
1550 { 0x1FE8, 0x03A5, 0x0306 },
1551 { 0x1FE9, 0x03A5, 0x0304 },
1552 { 0x1FEA, 0x03A5, 0x0300 },
1553 { 0x1FEC, 0x03A1, 0x0314 },
1554 { 0x1FED, 0x00A8, 0x0300 },
1555 { 0x1FF2, 0x1F7C, 0x0345 },
1556 { 0x1FF3, 0x03C9, 0x0345 },
1557 { 0x1FF4, 0x03CE, 0x0345 },
1558 { 0x1FF6, 0x03C9, 0x0342 },
1559 { 0x1FF7, 0x1FF6, 0x0345 },
1560 { 0x1FF8, 0x039F, 0x0300 },
1561 { 0x1FFA, 0x03A9, 0x0300 },
1562 { 0x1FFC, 0x03A9, 0x0345 },
1563 { 0x219A, 0x2190, 0x0338 },
1564 { 0x219B, 0x2192, 0x0338 },
1565 { 0x21AE, 0x2194, 0x0338 },
1566 { 0x21CD, 0x21D0, 0x0338 },
1567 { 0x21CE, 0x21D4, 0x0338 },
1568 { 0x21CF, 0x21D2, 0x0338 },
1569 { 0x2204, 0x2203, 0x0338 },
1570 { 0x2209, 0x2208, 0x0338 },
1571 { 0x220C, 0x220B, 0x0338 },
1572 { 0x2224, 0x2223, 0x0338 },
1573 { 0x2226, 0x2225, 0x0338 },
1574 { 0x2241, 0x223C, 0x0338 },
1575 { 0x2244, 0x2243, 0x0338 },
1576 { 0x2247, 0x2245, 0x0338 },
1577 { 0x2249, 0x2248, 0x0338 },
1578 { 0x2260, 0x003D, 0x0338 },
1579 { 0x2262, 0x2261, 0x0338 },
1580 { 0x226D, 0x224D, 0x0338 },
1581 { 0x226E, 0x003C, 0x0338 },
1582 { 0x226F, 0x003E, 0x0338 },
1583 { 0x2270, 0x2264, 0x0338 },
1584 { 0x2271, 0x2265, 0x0338 },
1585 { 0x2274, 0x2272, 0x0338 },
1586 { 0x2275, 0x2273, 0x0338 },
1587 { 0x2278, 0x2276, 0x0338 },
1588 { 0x2279, 0x2277, 0x0338 },
1589 { 0x2280, 0x227A, 0x0338 },
1590 { 0x2281, 0x227B, 0x0338 },
1591 { 0x2284, 0x2282, 0x0338 },
1592 { 0x2285, 0x2283, 0x0338 },
1593 { 0x2288, 0x2286, 0x0338 },
1594 { 0x2289, 0x2287, 0x0338 },
1595 { 0x22AC, 0x22A2, 0x0338 },
1596 { 0x22AD, 0x22A8, 0x0338 },
1597 { 0x22AE, 0x22A9, 0x0338 },
1598 { 0x22AF, 0x22AB, 0x0338 },
1599 { 0x22E0, 0x227C, 0x0338 },
1600 { 0x22E1, 0x227D, 0x0338 },
1601 { 0x22E2, 0x2291, 0x0338 },
1602 { 0x22E3, 0x2292, 0x0338 },
1603 { 0x22EA, 0x22B2, 0x0338 },
1604 { 0x22EB, 0x22B3, 0x0338 },
1605 { 0x22EC, 0x22B4, 0x0338 },
1606 { 0x22ED, 0x22B5, 0x0338 },
1607 { 0x2ADC, 0x2ADD, 0x0338 },
1608 { 0x304C, 0x304B, 0x3099 },
1609 { 0x304E, 0x304D, 0x3099 },
1610 { 0x3050, 0x304F, 0x3099 },
1611 { 0x3052, 0x3051, 0x3099 },
1612 { 0x3054, 0x3053, 0x3099 },
1613 { 0x3056, 0x3055, 0x3099 },
1614 { 0x3058, 0x3057, 0x3099 },
1615 { 0x305A, 0x3059, 0x3099 },
1616 { 0x305C, 0x305B, 0x3099 },
1617 { 0x305E, 0x305D, 0x3099 },
1618 { 0x3060, 0x305F, 0x3099 },
1619 { 0x3062, 0x3061, 0x3099 },
1620 { 0x3065, 0x3064, 0x3099 },
1621 { 0x3067, 0x3066, 0x3099 },
1622 { 0x3069, 0x3068, 0x3099 },
1623 { 0x3070, 0x306F, 0x3099 },
1624 { 0x3071, 0x306F, 0x309A },
1625 { 0x3073, 0x3072, 0x3099 },
1626 { 0x3074, 0x3072, 0x309A },
1627 { 0x3076, 0x3075, 0x3099 },
1628 { 0x3077, 0x3075, 0x309A },
1629 { 0x3079, 0x3078, 0x3099 },
1630 { 0x307A, 0x3078, 0x309A },
1631 { 0x307C, 0x307B, 0x3099 },
1632 { 0x307D, 0x307B, 0x309A },
1633 { 0x3094, 0x3046, 0x3099 },
1634 { 0x309E, 0x309D, 0x3099 },
1635 { 0x30AC, 0x30AB, 0x3099 },
1636 { 0x30AE, 0x30AD, 0x3099 },
1637 { 0x30B0, 0x30AF, 0x3099 },
1638 { 0x30B2, 0x30B1, 0x3099 },
1639 { 0x30B4, 0x30B3, 0x3099 },
1640 { 0x30B6, 0x30B5, 0x3099 },
1641 { 0x30B8, 0x30B7, 0x3099 },
1642 { 0x30BA, 0x30B9, 0x3099 },
1643 { 0x30BC, 0x30BB, 0x3099 },
1644 { 0x30BE, 0x30BD, 0x3099 },
1645 { 0x30C0, 0x30BF, 0x3099 },
1646 { 0x30C2, 0x30C1, 0x3099 },
1647 { 0x30C5, 0x30C4, 0x3099 },
1648 { 0x30C7, 0x30C6, 0x3099 },
1649 { 0x30C9, 0x30C8, 0x3099 },
1650 { 0x30D0, 0x30CF, 0x3099 },
1651 { 0x30D1, 0x30CF, 0x309A },
1652 { 0x30D3, 0x30D2, 0x3099 },
1653 { 0x30D4, 0x30D2, 0x309A },
1654 { 0x30D6, 0x30D5, 0x3099 },
1655 { 0x30D7, 0x30D5, 0x309A },
1656 { 0x30D9, 0x30D8, 0x3099 },
1657 { 0x30DA, 0x30D8, 0x309A },
1658 { 0x30DC, 0x30DB, 0x3099 },
1659 { 0x30DD, 0x30DB, 0x309A },
1660 { 0x30F4, 0x30A6, 0x3099 },
1661 { 0x30F7, 0x30EF, 0x3099 },
1662 { 0x30F8, 0x30F0, 0x3099 },
1663 { 0x30F9, 0x30F1, 0x3099 },
1664 { 0x30FA, 0x30F2, 0x3099 },
1665 { 0x30FE, 0x30FD, 0x3099 },
1666 { 0xFB1D, 0x05D9, 0x05B4 },
1667 { 0xFB1F, 0x05F2, 0x05B7 },
1668 { 0xFB2A, 0x05E9, 0x05C1 },
1669 { 0xFB2B, 0x05E9, 0x05C2 },
1670 { 0xFB2C, 0xFB49, 0x05C1 },
1671 { 0xFB2D, 0xFB49, 0x05C2 },
1672 { 0xFB2E, 0x05D0, 0x05B7 },
1673 { 0xFB2F, 0x05D0, 0x05B8 },
1674 { 0xFB30, 0x05D0, 0x05BC },
1675 { 0xFB31, 0x05D1, 0x05BC },
1676 { 0xFB32, 0x05D2, 0x05BC },
1677 { 0xFB33, 0x05D3, 0x05BC },
1678 { 0xFB34, 0x05D4, 0x05BC },
1679 { 0xFB35, 0x05D5, 0x05BC },
1680 { 0xFB36, 0x05D6, 0x05BC },
1681 { 0xFB38, 0x05D8, 0x05BC },
1682 { 0xFB39, 0x05D9, 0x05BC },
1683 { 0xFB3A, 0x05DA, 0x05BC },
1684 { 0xFB3B, 0x05DB, 0x05BC },
1685 { 0xFB3C, 0x05DC, 0x05BC },
1686 { 0xFB3E, 0x05DE, 0x05BC },
1687 { 0xFB40, 0x05E0, 0x05BC },
1688 { 0xFB41, 0x05E1, 0x05BC },
1689 { 0xFB43, 0x05E3, 0x05BC },
1690 { 0xFB44, 0x05E4, 0x05BC },
1691 { 0xFB46, 0x05E6, 0x05BC },
1692 { 0xFB47, 0x05E7, 0x05BC },
1693 { 0xFB48, 0x05E8, 0x05BC },
1694 { 0xFB49, 0x05E9, 0x05BC },
1695 { 0xFB4A, 0x05EA, 0x05BC },
1696 { 0xFB4B, 0x05D5, 0x05B9 },
1697 { 0xFB4C, 0x05D1, 0x05BF },
1698 { 0xFB4D, 0x05DB, 0x05BF },
1699 { 0xFB4E, 0x05E4, 0x05BF },
1700 /* out of range of unsigned short... */
1702 { 0x1D15E, 0x1D157, 0x1D165 },
1703 { 0x1D15F, 0x1D158, 0x1D165 },
1704 { 0x1D160, 0x1D15F, 0x1D16E },
1705 { 0x1D161, 0x1D15F, 0x1D16F },
1706 { 0x1D162, 0x1D15F, 0x1D170 },
1707 { 0x1D163, 0x1D15F, 0x1D171 },
1708 { 0x1D164, 0x1D15F, 0x1D172 },
1709 { 0x1D1BB, 0x1D1B9, 0x1D165 },
1710 { 0x1D1BC, 0x1D1BA, 0x1D165 },
1711 { 0x1D1BD, 0x1D1BB, 0x1D16E },
1712 { 0x1D1BE, 0x1D1BC, 0x1D16E },
1713 { 0x1D1BF, 0x1D1BB, 0x1D16F },
1714 { 0x1D1C0, 0x1D1BC, 0x1D16F },
1716 /* special hack, treat Arabic ligatures as combining characters */
1717 /* combine them to the isolated presentation form, then let
1718 * the shaping and joining take care of it */
1719 { 0xFEF5, 0x0644, 0x0622 }, /* LAM_ALEF_MADDA */
1720 { 0xFEF7, 0x0644, 0x0623 }, /* LAM_ALEF_HAMZA_ABOVE */
1721 { 0xFEF9, 0x0644, 0x0625 }, /* LAM_ALEF_HAMZA_BELOW */
1722 { 0xFEFB, 0x0644, 0x0627 }, /* LAM_ALEF */
1725 /* -------------------------- local functions ------------------------------ */
1728 /* look-up functions, maybe theese should use binary search?
1729 would require a duplicate of comb_table to reverse map... */
1731 get_combining_class(unsigned short ch
)
1734 int table_size
= sizeof(combclass_table
) / sizeof(combclass_table
[0]);
1736 for (count
= 0; count
< table_size
; count
++)
1738 if (combclass_table
[count
].key
== ch
)
1740 return combclass_table
[count
].combclass
;
1747 static const char_comb_t
*
1748 get_comb_entry_decomposed(unsigned short ch
)
1751 int table_size
= sizeof(comb_table
) / sizeof(comb_table
[0]);
1753 for (count
= 0; count
< table_size
; count
++)
1755 if (comb_table
[count
].key
== ch
)
1757 return &comb_table
[count
];
1764 static unsigned short
1765 get_comb_entry_composed(unsigned short first
, unsigned short second
)
1768 int table_size
= sizeof(comb_table
) / sizeof(comb_table
[0]);
1770 for (count
= 0; count
< table_size
; count
++)
1772 if (comb_table
[count
].first
== first
&&
1773 comb_table
[count
].second
== second
)
1775 return comb_table
[count
].key
;
1779 return (unsigned short) 0;
1784 const unsigned char *str_utf8
, unsigned short *str_ucs2
, int len
)
1788 while (in_pos
< len
)
1790 if (str_utf8
[in_pos
] <= 0x7f)
1793 (unsigned short)str_utf8
[in_pos
];
1798 if ((str_utf8
[in_pos
] & 0300) != 0300)
1801 str_ucs2
[out_pos
] = REPLACEMENT_CHARACTER
;
1804 else if (in_pos
< len
-1 && str_utf8
[in_pos
] <= 0xdf &&
1805 str_utf8
[in_pos
+ 1] <= 0xbf &&
1806 str_utf8
[in_pos
+ 1] >= 0x80)
1809 ((str_utf8
[in_pos
] & 0x1f) << 6) +
1810 (str_utf8
[in_pos
+1] & 0x3f);
1811 /* check for overlong sequence */
1812 if(str_ucs2
[out_pos
] < 0x80)
1814 REPLACEMENT_CHARACTER
;
1817 else if (in_pos
< len
-2 && str_utf8
[in_pos
] <= 0xef &&
1818 str_utf8
[in_pos
+ 1] <= 0xbf &&
1819 str_utf8
[in_pos
+ 1] >= 0x80 &&
1820 str_utf8
[in_pos
+ 2] <= 0xbf &&
1821 str_utf8
[in_pos
+ 2] >= 0x80)
1824 ((str_utf8
[in_pos
] & 0x0f) << 12) +
1825 ((str_utf8
[in_pos
+1] & 0x3f) << 6) +
1826 (str_utf8
[in_pos
+2] & 0x3f);
1827 /* check for overlong sequence */
1828 if(str_ucs2
[out_pos
] < 0x800)
1830 REPLACEMENT_CHARACTER
;
1835 /* incomplete sequence */
1836 str_ucs2
[out_pos
] = REPLACEMENT_CHARACTER
;
1847 const unsigned short *str_ucs2
, unsigned char *str_utf8
, int len
)
1852 for (in_pos
= 0 ; in_pos
< len
; in_pos
++)
1854 if (str_ucs2
[in_pos
] <= 0x7f)
1856 str_utf8
[out_pos
] = str_ucs2
[in_pos
];
1859 else if (str_ucs2
[in_pos
] <= 0x7ff)
1862 (str_ucs2
[in_pos
] >> 6) | 0xc0;
1863 str_utf8
[out_pos
+1] =
1864 (str_ucs2
[in_pos
] & 0x3f) | 0x80;
1870 (str_ucs2
[in_pos
] >> 12) | 0xe0;
1871 str_utf8
[out_pos
+1] =
1872 ((str_ucs2
[in_pos
] & 0xfff) >> 6) | 0x80;
1873 str_utf8
[out_pos
+2] =
1874 (str_ucs2
[in_pos
] & 0x3f) | 0x80;
1877 /* this doesn't handle values outside UCS2 (16-bit) */
1884 takes a pointer to a string (UTF-8)
1885 first decomposes string, then rearrange combining characters, the
1887 Result is stored in original string (can never be "expanded" from
1888 original size), new length is returned
1894 unsigned char *str_visual
, int len
, superimpose_char_t
**comb_chars
,
1897 int i
,j
,k
; /* counters */
1898 unsigned short *source
;
1899 unsigned short *dest
;
1905 int comp_str_len
= 0;
1908 /* if input has zero length, return immediatly */
1914 /* decompose composed characters */
1915 source
= (unsigned short *)safemalloc(
1916 (len
+ 1) * sizeof(unsigned short));
1917 /* convert from UTF-8-encoded text to internal 16-bit encoding */
1918 str_len
= convert_to_ucs2(str_visual
,source
,len
);
1919 in_str_len
= str_len
;
1920 /* we don't really need to NULL-terminate source, since we
1921 have string length */
1923 /* be pessimistic, assume all characters are decomposed */
1924 dest
= (unsigned short *)safemalloc(
1925 (str_len
+ 1) * 2 * sizeof(unsigned short));
1926 /* use theese to keep track of the mapping of characters from
1927 logical to visual */
1928 source_v_to_l
= (int *)safemalloc(str_len
* sizeof(int));
1929 dest_v_to_l
= (int *)safemalloc(str_len
* 2 * sizeof(int));
1930 /* setup initial mapping 1-to-1 */
1931 for(i
= 0 ; i
< str_len
; i
++)
1933 source_v_to_l
[i
] = i
;
1937 has_changed
= False
;
1938 for (i
= 0, j
= 0; i
< str_len
; i
++)
1940 const char_comb_t
*decomp
=
1941 get_comb_entry_decomposed(source
[i
]);
1942 /* current character is decomposable */
1945 dest
[j
] = decomp
->first
;
1946 dest
[j
+1] = decomp
->second
;
1947 dest_v_to_l
[j
] = source_v_to_l
[i
];
1948 dest_v_to_l
[j
+1] = source_v_to_l
[i
];
1952 else /* leave it as is */
1954 dest
[j
] = source
[i
];
1955 dest_v_to_l
[j
] = source_v_to_l
[i
];
1962 free(source_v_to_l
);
1964 source_v_to_l
= dest_v_to_l
;
1966 dest
= (unsigned short *)safemalloc(
1967 (str_len
+ 1) * 2 * sizeof(unsigned short));
1968 dest_v_to_l
= (int *)safemalloc(str_len
* 2 * sizeof(int));
1969 } while (has_changed
);
1970 /* source now holds decomposed string (got swapped before exiting
1971 loop, str_len holds string length */
1972 /* we reuse dest for composing, can use existing string lengths
1973 since it will only get shorter */
1974 /* source_v_to_l holds the mapping from positions in decomposed
1975 string to original string */
1977 /* rearrange combining characters */
1980 has_changed
= False
;
1981 for (i
= 0; i
< str_len
- 1; i
++)
1983 /* swap if combining-class(c1) > combining-class(c2)
1984 and combining-class(c2) != 0 */
1985 /* use negative values for marks that have combining
1986 class 0, but should be taken out for drawing
1988 int c1
= get_combining_class(source
[i
]);
1989 int c2
= get_combining_class(source
[i
+1]);
1990 if (c1
> c2
&& c2
> 0)
1992 unsigned short temp
= source
[i
];
1993 int temp_v_to_l
= source_v_to_l
[i
];
1994 source
[i
] = source
[i
+1];
1996 source_v_to_l
[i
] = source_v_to_l
[i
+1];
1997 source_v_to_l
[i
+1] = temp_v_to_l
;
2001 } while (has_changed
);
2006 unsigned short *temp
;
2008 Bool last_changed
= False
;
2009 has_changed
= False
;
2011 for (i
= 0, j
= 0; i
< str_len
- 1; j
++)
2013 unsigned short composed
=
2014 get_comb_entry_composed(source
[i
],
2016 dest_v_to_l
[j
] = source_v_to_l
[i
];
2020 /* if the last character was "absorbed" */
2021 if (i
== str_len
- 2)
2023 last_changed
= True
;
2030 dest
[j
] = source
[i
];
2037 temp_v_to_l
= dest_v_to_l
;
2038 dest_v_to_l
= source_v_to_l
;
2039 source_v_to_l
= temp_v_to_l
;
2040 /* fixup the last character, the loop above goes to second
2041 last, since it needs to look at 2 consecutive,
2042 if the last character is a non-combining character */
2043 /* since we have an immediate return on zero length, this works
2044 otherwise this would introduce crap here */
2047 source
[j
] = dest
[i
];
2048 source_v_to_l
[j
] = dest_v_to_l
[i
];
2055 } while (has_changed
);
2057 /* source contains composed string */
2059 /* gather "uncomposed" combining characters here for rendering
2060 over normal characters later */
2062 if (comb_chars
!= NULL
)
2064 /* calculate number of combining characters left */
2065 for (i
= 0 ; i
< str_len
; i
++)
2067 if (get_combining_class(source
[i
]) != 0)
2072 /* allocate storage for combining characters */
2073 *comb_chars
= (superimpose_char_t
*)
2074 safemalloc((comp_str_len
+ 1) *
2075 sizeof(superimpose_char_t
));
2077 for (i
= 0,j
= 0,k
= 0 ; i
< str_len
; i
++)
2079 /* if character is non-combining,
2080 just copy it over to output */
2081 /* if first character is a combing character, just output
2082 it as if it where a base character */
2083 if (get_combining_class(source
[i
]) == 0)
2085 dest
[j
] = source
[i
];
2086 dest_v_to_l
[j
] = source_v_to_l
[i
];
2091 if (comb_chars
!= NULL
)
2093 /* store composing character as associated
2094 with last base charcter */
2095 (*comb_chars
)[k
].position
= j
== 0 ? 0 : j
-1;
2096 (*comb_chars
)[k
].c
.byte1
= source
[i
] >> 8;
2097 (*comb_chars
)[k
].c
.byte2
= source
[i
] & 0xff;
2103 if (comb_chars
!= NULL
)
2105 (*comb_chars
)[comp_str_len
].position
= 0;
2106 (*comb_chars
)[comp_str_len
].c
.byte1
= 0;
2107 (*comb_chars
)[comp_str_len
].c
.byte2
= 0;
2109 str_len
= convert_to_utf8(dest
,str_visual
,j
);
2111 str_visual
[str_len
] = 0;
2115 *l_to_v
= (int *)safemalloc((in_str_len
+ 1) * sizeof(int));
2116 /* map the visual to logical mapping obtained above into
2117 a logical to visual mapping */
2118 /* setup the final mapping from logical to visual positions */
2119 /* if no base characters out, all positions map to zero,
2120 because there we have combining chars in that case */
2121 if(out_str_len
== 0)
2123 for(i
= 0 ; i
< in_str_len
; i
++)
2128 for(i
= 0, j
= 0 ; i
< out_str_len
; i
++)
2130 /* for each element in mapping from visual string
2131 insert "backtracked" references from logical
2132 string by inserting consequitive entries, as many
2133 as the step in the mapping from visual to logical
2135 int step
= (i
== out_str_len
- 1) ?
2137 dest_v_to_l
[i
+1] - dest_v_to_l
[i
];
2138 for(k
= 0 ; k
< step
; k
++, j
++)
2143 /* terminated it with -1, to avoid have to send around
2145 (*l_to_v
)[in_str_len
] = -1;
2151 free(source_v_to_l
);