092f5cab2076264f804a5afc2e7ca3f3a4a71c4f
[u/mdw/putty] / xlat.c
1 #include <windows.h>
2 #include <stdio.h>
3 #include "putty.h"
4
5 static unsigned char win2koi[] =
6 {
7 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
8 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
9 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
10 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
11 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
12 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
13 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
14 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
15 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
16 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
17 160,161,162,163,164,189,166,167,179,169,180,171,172,173,174,183,
18 176,177,182,166,173,181,182,183,163,185,164,187,188,189,190,167,
19 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
20 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
21 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
22 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209
23 };
24
25 static unsigned char koi2win[] =
26 {
27 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
28 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
29 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
30 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
31 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
32 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
33 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
34 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
35 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
36 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
37 160,161,162,184,186,165,179,191,168,169,170,171,172,180,174,175,
38 176,177,178,168,170,181,178,175,184,185,186,187,188,165,190,191,
39 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
40 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
41 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
42 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218
43 };
44
45 static unsigned char xlatWIN1250toISO88592[] =
46 {
47 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
48 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
49 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
50 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
51 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
52 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
53 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
54 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
55 128,129, 39,131, 34, 46,124,124,136, 47,169, 60,166,171,174,172,
56 144, 96, 39, 34, 34, 42, 45, 45,152, 84,185, 62,182,187,190,188,
57 160,183,162,163,164,161,124,167,168, 99,170, 34, 39,173, 82,175,
58 176, 63,178,179,180,117,182,255,184,177,186, 34,165,189,181,191,
59 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
60 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
61 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
62 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
63 };
64
65 static unsigned char xlatISO88592toWIN1250[] =
66 {
67 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
68 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
69 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
70 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
71 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
72 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
73 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
74 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
75 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
76 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
77 160,165,162,163,164,188,140,167,168,138,170,141,143,173,142,175,
78 176,185,178,179,180,190,156,161,184,154,186,157,159,189,158,191,
79 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
80 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
81 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
82 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
83 };
84
85 static unsigned char xlatISO88592toCP852[] =
86 {
87 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
88 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
89 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
90 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
91 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
92 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
93 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
94 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
95 242, 32, 34, 32, 34, 46, 43, 35, 32, 47,138, 60,151,141,166,141,
96 032, 34, 34, 34, 34,254, 45, 45, 32,126,154, 62,152,157,167,171,
97 255,164,244,157,207,149,151,245,249,230,184,155,141,240,166,189,
98 248,165,247,136,239,150,152,243,242,231,173,156,171,241,167,190,
99 232,181,182,198,142,145,143,128,172,144,168,211,183,214,215,210,
100 209,227,213,224,226,138,153,158,252,222,233,235,154,237,221,225,
101 234,160,131,199,132,146,134,135,159,130,169,137,216,161,140,212,
102 208,228,229,162,147,139,148,246,253,133,163,251,129,236,238,250,
103 };
104
105 static unsigned char xlatCP852toISO88592[] =
106 {
107 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
108 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
109 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
110 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
111 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
112 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
113 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
114 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
115 199,252,233,226,228,249,230,231,179,235,138,245,238,141,196,198,
116 201,197,229,244,246,165,181,140,156,214,154,171,187,157,215,232,
117 225,237,243,250,161,177,142,158,202,234,170,159,200,186,174,175,
118 176,177,178,179,180,193,194,204,170,185,186,187,188,175,191,191,
119 192,193,194,195,196,197,195,227,200,201,202,203,204,205,206,164,
120 240,208,207,203,239,210,205,206,236,217,218,219,220,222,217,223,
121 211,223,212,209,241,242,169,185,192,218,224,219,253,221,254,180,
122 173,189,128,183,162,167,247,178,176,168,255,251,216,248,149,160,
123 };
124
125 unsigned char xlat_kbd2tty(unsigned char c)
126 {
127 if(cfg.xlat_enablekoiwin)
128 return win2koi[c];
129 else if (cfg.xlat_88592w1250 || cfg.xlat_88592cp852)
130 return xlatWIN1250toISO88592[c];
131 return c;
132 }
133
134 unsigned char xlat_tty2scr(unsigned char c)
135 {
136 if(cfg.xlat_enablekoiwin)
137 return koi2win[c];
138 else if (cfg.xlat_88592w1250)
139 return xlatISO88592toWIN1250[c];
140 else if (cfg.xlat_88592cp852)
141 return xlatISO88592toCP852[c];
142 return c;
143 }
144
145
146 static unsigned char latkbd2_win[]=
147 {
148 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
149 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
150 32, 33,221, 35, 36, 37, 38,253, 40, 41, 42,178,225,186,254, 46,
151 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,198,230,193,179,222, 44,
152 64,212,200,209,194,211,192,207,208,216,206,203,196,220,210,217,
153 199,201,202,219,197,195,204,214,215,205,223,245,191,250, 94,170,
154 96,244,232,241,226,243,224,239,240,248,238,235,228,252,242,249,
155 231,233,234,251,229,227,236,246,247,237,255,213,175,218,126,127,
156 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
157 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
158 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
159 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
160 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
161 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
162 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
163 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
164 };
165
166 unsigned char xlat_latkbd2win(unsigned char c)
167 {
168 if(cfg.xlat_capslockcyr)
169 return latkbd2_win[c];
170 return c;
171 }