···
ctx->reverse_video = false;
ctx->dec_private = false;
ctx->insert_mode = false;
62
+
ctx->unicode_remaining = 0;
ctx->charsets[0] = CHARSET_DEFAULT;
ctx->charsets[1] = CHARSET_DEC_SPECIAL;
···
855
+
static int unicode_to_cp437(uint64_t code_point) {
856
+
switch (code_point) {
857
+
case 0x263a: return 1;
858
+
case 0x263b: return 2;
859
+
case 0x2665: return 3;
860
+
case 0x2666: return 4;
861
+
case 0x2663: return 5;
862
+
case 0x2660: return 6;
863
+
case 0x2022: return 7;
864
+
case 0x25d8: return 8;
865
+
case 0x25cb: return 9;
866
+
case 0x25d9: return 10;
867
+
case 0x2642: return 11;
868
+
case 0x2640: return 12;
869
+
case 0x266a: return 13;
870
+
case 0x266b: return 14;
871
+
case 0x263c: return 15;
872
+
case 0x25ba: return 16;
873
+
case 0x25c4: return 17;
874
+
case 0x2195: return 18;
875
+
case 0x203c: return 19;
876
+
case 0x00b6: return 20;
877
+
case 0x00a7: return 21;
878
+
case 0x25ac: return 22;
879
+
case 0x21a8: return 23;
880
+
case 0x2191: return 24;
881
+
case 0x2193: return 25;
882
+
case 0x2192: return 26;
883
+
case 0x2190: return 27;
884
+
case 0x221f: return 28;
885
+
case 0x2194: return 29;
886
+
case 0x25b2: return 30;
887
+
case 0x25bc: return 31;
889
+
case 0x2302: return 127;
890
+
case 0x00c7: return 128;
891
+
case 0x00fc: return 129;
892
+
case 0x00e9: return 130;
893
+
case 0x00e2: return 131;
894
+
case 0x00e4: return 132;
895
+
case 0x00e0: return 133;
896
+
case 0x00e5: return 134;
897
+
case 0x00e7: return 135;
898
+
case 0x00ea: return 136;
899
+
case 0x00eb: return 137;
900
+
case 0x00e8: return 138;
901
+
case 0x00ef: return 139;
902
+
case 0x00ee: return 140;
903
+
case 0x00ec: return 141;
904
+
case 0x00c4: return 142;
905
+
case 0x00c5: return 143;
906
+
case 0x00c9: return 144;
907
+
case 0x00e6: return 145;
908
+
case 0x00c6: return 146;
909
+
case 0x00f4: return 147;
910
+
case 0x00f6: return 148;
911
+
case 0x00f2: return 149;
912
+
case 0x00fb: return 150;
913
+
case 0x00f9: return 151;
914
+
case 0x00ff: return 152;
915
+
case 0x00d6: return 153;
916
+
case 0x00dc: return 154;
917
+
case 0x00a2: return 155;
918
+
case 0x00a3: return 156;
919
+
case 0x00a5: return 157;
920
+
case 0x20a7: return 158;
921
+
case 0x0192: return 159;
922
+
case 0x00e1: return 160;
923
+
case 0x00ed: return 161;
924
+
case 0x00f3: return 162;
925
+
case 0x00fa: return 163;
926
+
case 0x00f1: return 164;
927
+
case 0x00d1: return 165;
928
+
case 0x00aa: return 166;
929
+
case 0x00ba: return 167;
930
+
case 0x00bf: return 168;
931
+
case 0x2310: return 169;
932
+
case 0x00ac: return 170;
933
+
case 0x00bd: return 171;
934
+
case 0x00bc: return 172;
935
+
case 0x00a1: return 173;
936
+
case 0x00ab: return 174;
937
+
case 0x00bb: return 175;
938
+
case 0x2591: return 176;
939
+
case 0x2592: return 177;
940
+
case 0x2593: return 178;
941
+
case 0x2502: return 179;
942
+
case 0x2524: return 180;
943
+
case 0x2561: return 181;
944
+
case 0x2562: return 182;
945
+
case 0x2556: return 183;
946
+
case 0x2555: return 184;
947
+
case 0x2563: return 185;
948
+
case 0x2551: return 186;
949
+
case 0x2557: return 187;
950
+
case 0x255d: return 188;
951
+
case 0x255c: return 189;
952
+
case 0x255b: return 190;
953
+
case 0x2510: return 191;
954
+
case 0x2514: return 192;
955
+
case 0x2534: return 193;
956
+
case 0x252c: return 194;
957
+
case 0x251c: return 195;
958
+
case 0x2500: return 196;
959
+
case 0x253c: return 197;
960
+
case 0x255e: return 198;
961
+
case 0x255f: return 199;
962
+
case 0x255a: return 200;
963
+
case 0x2554: return 201;
964
+
case 0x2569: return 202;
965
+
case 0x2566: return 203;
966
+
case 0x2560: return 204;
967
+
case 0x2550: return 205;
968
+
case 0x256c: return 206;
969
+
case 0x2567: return 207;
970
+
case 0x2568: return 208;
971
+
case 0x2564: return 209;
972
+
case 0x2565: return 210;
973
+
case 0x2559: return 211;
974
+
case 0x2558: return 212;
975
+
case 0x2552: return 213;
976
+
case 0x2553: return 214;
977
+
case 0x256b: return 215;
978
+
case 0x256a: return 216;
979
+
case 0x2518: return 217;
980
+
case 0x250c: return 218;
981
+
case 0x2588: return 219;
982
+
case 0x2584: return 220;
983
+
case 0x258c: return 221;
984
+
case 0x2590: return 222;
985
+
case 0x2580: return 223;
986
+
case 0x03b1: return 224;
987
+
case 0x00df: return 225;
988
+
case 0x0393: return 226;
989
+
case 0x03c0: return 227;
990
+
case 0x03a3: return 228;
991
+
case 0x03c3: return 229;
992
+
case 0x00b5: return 230;
993
+
case 0x03c4: return 231;
994
+
case 0x03a6: return 232;
995
+
case 0x0398: return 233;
996
+
case 0x03a9: return 234;
997
+
case 0x03b4: return 235;
998
+
case 0x221e: return 236;
999
+
case 0x03c6: return 237;
1000
+
case 0x03b5: return 238;
1001
+
case 0x2229: return 239;
1002
+
case 0x2261: return 240;
1003
+
case 0x00b1: return 241;
1004
+
case 0x2265: return 242;
1005
+
case 0x2264: return 243;
1006
+
case 0x2320: return 244;
1007
+
case 0x2321: return 245;
1008
+
case 0x00f7: return 246;
1009
+
case 0x2248: return 247;
1010
+
case 0x00b0: return 248;
1011
+
case 0x2219: return 249;
1012
+
case 0x00b7: return 250;
1013
+
case 0x221a: return 251;
1014
+
case 0x207f: return 252;
1015
+
case 0x00b2: return 253;
1016
+
case 0x25a0: return 254;
static void term_putchar(struct term_context *ctx, uint8_t c) {
if (ctx->discard_next || (ctx->in_bootloader == false && (c == 0x18 || c == 0x1a))) {
ctx->discard_next = false;
ctx->control_sequence = false;
1028
+
ctx->unicode_remaining = 0;
1035
+
if (ctx->unicode_remaining != 0) {
1036
+
ctx->unicode_remaining--;
1037
+
ctx->code_point |= (c & 0x3f) << (6 * ctx->unicode_remaining);
1038
+
if (ctx->unicode_remaining != 0) {
1042
+
int cc = unicode_to_cp437(ctx->code_point);
1045
+
//for (size_t i = 0; i < ctx->unicode_width; i++) {
1046
+
ctx->raw_putchar(ctx, 8);
1049
+
ctx->raw_putchar(ctx, cc);
1054
+
if (c > 0x7f && ctx->in_bootloader == false) {
1055
+
if (c >= 0xc0 && c <= 0xdf) {
1056
+
ctx->unicode_width = 2;
1057
+
ctx->unicode_remaining = 1;
1058
+
ctx->code_point = (c & 0x1f) << 6;
1059
+
} else if (c >= 0xe0 && c <= 0xef) {
1060
+
ctx->unicode_width = 3;
1061
+
ctx->unicode_remaining = 2;
1062
+
ctx->code_point = (c & 0x0f) << (6 * 2);
1063
+
} else if (c >= 0xf0 && c <= 0xf7) {
1064
+
ctx->unicode_width = 4;
1065
+
ctx->unicode_remaining = 3;
1066
+
ctx->code_point = (c & 0x07) << (6 * 3);
···
case CHARSET_DEC_SPECIAL:
c = dec_special_to_cp437(c);
ctx->raw_putchar(ctx, c);