First draft of Unicode support in pterm. It's pretty complete: it
[u/mdw/putty] / charset / mimeenc.c
1 /*
2 * mimeenc.c - translate our internal character set codes to and
3 * from MIME standard character-set names.
4 *
5 */
6
7 #include <ctype.h>
8 #include "charset.h"
9 #include "internal.h"
10
11 static const struct {
12 const char *name;
13 int charset;
14 } mimeencs[] = {
15 /*
16 * These names are taken from
17 *
18 * http://www.iana.org/assignments/character-sets
19 *
20 * Where multiple encoding names map to the same encoding id
21 * (such as the variety of aliases for ISO-8859-1), the first
22 * is considered canonical and will be returned when
23 * translating the id to a string.
24 */
25 { "ISO-8859-1", CS_ISO8859_1 },
26 { "iso-ir-100", CS_ISO8859_1 },
27 { "ISO_8859-1", CS_ISO8859_1 },
28 { "ISO_8859-1:1987", CS_ISO8859_1 },
29 { "latin1", CS_ISO8859_1 },
30 { "l1", CS_ISO8859_1 },
31 { "IBM819", CS_ISO8859_1 },
32 { "CP819", CS_ISO8859_1 },
33 { "csISOLatin1", CS_ISO8859_1 },
34
35 { "ISO-8859-2", CS_ISO8859_2 },
36 { "ISO_8859-2:1987", CS_ISO8859_2 },
37 { "iso-ir-101", CS_ISO8859_2 },
38 { "ISO_8859-2", CS_ISO8859_2 },
39 { "latin2", CS_ISO8859_2 },
40 { "l2", CS_ISO8859_2 },
41 { "csISOLatin2", CS_ISO8859_2 },
42
43 { "ISO-8859-3", CS_ISO8859_3 },
44 { "ISO_8859-3:1988", CS_ISO8859_3 },
45 { "iso-ir-109", CS_ISO8859_3 },
46 { "ISO_8859-3", CS_ISO8859_3 },
47 { "latin3", CS_ISO8859_3 },
48 { "l3", CS_ISO8859_3 },
49 { "csISOLatin3", CS_ISO8859_3 },
50
51 { "ISO-8859-4", CS_ISO8859_4 },
52 { "ISO_8859-4:1988", CS_ISO8859_4 },
53 { "iso-ir-110", CS_ISO8859_4 },
54 { "ISO_8859-4", CS_ISO8859_4 },
55 { "latin4", CS_ISO8859_4 },
56 { "l4", CS_ISO8859_4 },
57 { "csISOLatin4", CS_ISO8859_4 },
58
59 { "ISO-8859-5", CS_ISO8859_5 },
60 { "ISO_8859-5:1988", CS_ISO8859_5 },
61 { "iso-ir-144", CS_ISO8859_5 },
62 { "ISO_8859-5", CS_ISO8859_5 },
63 { "cyrillic", CS_ISO8859_5 },
64 { "csISOLatinCyrillic", CS_ISO8859_5 },
65
66 { "ISO-8859-6", CS_ISO8859_6 },
67 { "ISO_8859-6:1987", CS_ISO8859_6 },
68 { "iso-ir-127", CS_ISO8859_6 },
69 { "ISO_8859-6", CS_ISO8859_6 },
70 { "ECMA-114", CS_ISO8859_6 },
71 { "ASMO-708", CS_ISO8859_6 },
72 { "arabic", CS_ISO8859_6 },
73 { "csISOLatinArabic", CS_ISO8859_6 },
74
75 { "ISO-8859-7", CS_ISO8859_7 },
76 { "ISO_8859-7:1987", CS_ISO8859_7 },
77 { "iso-ir-126", CS_ISO8859_7 },
78 { "ISO_8859-7", CS_ISO8859_7 },
79 { "ELOT_928", CS_ISO8859_7 },
80 { "ECMA-118", CS_ISO8859_7 },
81 { "greek", CS_ISO8859_7 },
82 { "greek8", CS_ISO8859_7 },
83 { "csISOLatinGreek", CS_ISO8859_7 },
84
85 { "ISO-8859-8", CS_ISO8859_8 },
86 { "ISO_8859-8:1988", CS_ISO8859_8 },
87 { "iso-ir-138", CS_ISO8859_8 },
88 { "ISO_8859-8", CS_ISO8859_8 },
89 { "hebrew", CS_ISO8859_8 },
90 { "csISOLatinHebrew", CS_ISO8859_8 },
91
92 { "ISO-8859-9", CS_ISO8859_9 },
93 { "ISO_8859-9:1989", CS_ISO8859_9 },
94 { "iso-ir-148", CS_ISO8859_9 },
95 { "ISO_8859-9", CS_ISO8859_9 },
96 { "latin5", CS_ISO8859_9 },
97 { "l5", CS_ISO8859_9 },
98 { "csISOLatin5", CS_ISO8859_9 },
99
100 { "ISO-8859-10", CS_ISO8859_10 },
101 { "iso-ir-157", CS_ISO8859_10 },
102 { "l6", CS_ISO8859_10 },
103 { "ISO_8859-10:1992", CS_ISO8859_10 },
104 { "csISOLatin6", CS_ISO8859_10 },
105 { "latin6", CS_ISO8859_10 },
106
107 { "ISO-8859-13", CS_ISO8859_13 },
108
109 { "ISO-8859-14", CS_ISO8859_14 },
110 { "iso-ir-199", CS_ISO8859_14 },
111 { "ISO_8859-14:1998", CS_ISO8859_14 },
112 { "ISO_8859-14", CS_ISO8859_14 },
113 { "latin8", CS_ISO8859_14 },
114 { "iso-celtic", CS_ISO8859_14 },
115 { "l8", CS_ISO8859_14 },
116
117 { "ISO-8859-15", CS_ISO8859_15 },
118 { "ISO_8859-15", CS_ISO8859_15 },
119 { "Latin-9", CS_ISO8859_15 },
120
121 { "ISO-8859-16", CS_ISO8859_16 },
122 { "iso-ir-226", CS_ISO8859_16 },
123 { "ISO_8859-16", CS_ISO8859_16 },
124 { "ISO_8859-16:2001", CS_ISO8859_16 },
125 { "latin10", CS_ISO8859_16 },
126 { "l10", CS_ISO8859_16 },
127
128 { "IBM437", CS_CP437 },
129 { "cp437", CS_CP437 },
130 { "437", CS_CP437 },
131 { "csPC8CodePage437", CS_CP437 },
132
133 { "IBM850", CS_CP850 },
134 { "cp850", CS_CP850 },
135 { "850", CS_CP850 },
136 { "csPC850Multilingual", CS_CP850 },
137
138 { "windows-1250", CS_CP1250 },
139
140 { "windows-1251", CS_CP1251 },
141
142 { "windows-1252", CS_CP1252 },
143
144 { "windows-1253", CS_CP1253 },
145
146 { "windows-1254", CS_CP1254 },
147
148 { "windows-1255", CS_CP1255 },
149
150 { "windows-1256", CS_CP1256 },
151
152 { "windows-1257", CS_CP1257 },
153
154 { "windows-1258", CS_CP1258 },
155
156 { "KOI8-R", CS_KOI8_R },
157 { "csKOI8R", CS_KOI8_R },
158
159 { "KOI8-U", CS_KOI8_U },
160
161 { "macintosh", CS_MAC_ROMAN },
162 { "mac", CS_MAC_ROMAN },
163 { "csMacintosh", CS_MAC_ROMAN },
164
165 { "VISCII", CS_VISCII },
166 { "csVISCII", CS_VISCII },
167
168 { "hp-roman8", CS_HP_ROMAN8 },
169 { "roman8", CS_HP_ROMAN8 },
170 { "r8", CS_HP_ROMAN8 },
171 { "csHPRoman8", CS_HP_ROMAN8 },
172
173 { "DEC-MCS", CS_DEC_MCS },
174 { "dec", CS_DEC_MCS },
175 { "csDECMCS", CS_DEC_MCS },
176
177 { "UTF-8", CS_UTF8 },
178 };
179
180 const char *charset_to_mimeenc(int charset)
181 {
182 int i;
183
184 for (i = 0; i < (int)lenof(mimeencs); i++)
185 if (charset == mimeencs[i].charset)
186 return mimeencs[i].name;
187
188 return NULL; /* not found */
189 }
190
191 int charset_from_mimeenc(const char *name)
192 {
193 int i;
194
195 for (i = 0; i < (int)lenof(mimeencs); i++) {
196 const char *p, *q;
197 p = name;
198 q = mimeencs[i].name;
199 while (*p || *q) {
200 if (tolower(*p) != tolower(*q))
201 break;
202 p++; q++;
203 }
204 if (!*p && !*q)
205 return mimeencs[i].charset;
206 }
207
208 return CS_NONE; /* not found */
209 }