2dc6356a |
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 | |
6d177721 |
138 | { "IBM866", CS_CP866 }, |
139 | { "cp866", CS_CP866 }, |
140 | { "866", CS_CP866 }, |
141 | { "csIBM866", CS_CP866 }, |
142 | |
2dc6356a |
143 | { "windows-1250", CS_CP1250 }, |
144 | |
145 | { "windows-1251", CS_CP1251 }, |
146 | |
147 | { "windows-1252", CS_CP1252 }, |
148 | |
149 | { "windows-1253", CS_CP1253 }, |
150 | |
151 | { "windows-1254", CS_CP1254 }, |
152 | |
153 | { "windows-1255", CS_CP1255 }, |
154 | |
155 | { "windows-1256", CS_CP1256 }, |
156 | |
157 | { "windows-1257", CS_CP1257 }, |
158 | |
159 | { "windows-1258", CS_CP1258 }, |
160 | |
161 | { "KOI8-R", CS_KOI8_R }, |
162 | { "csKOI8R", CS_KOI8_R }, |
163 | |
164 | { "KOI8-U", CS_KOI8_U }, |
165 | |
9a4486bd |
166 | { "macintosh", CS_MAC_ROMAN_OLD }, |
167 | { "mac", CS_MAC_ROMAN_OLD }, |
168 | { "csMacintosh", CS_MAC_ROMAN_OLD }, |
2dc6356a |
169 | |
170 | { "VISCII", CS_VISCII }, |
171 | { "csVISCII", CS_VISCII }, |
172 | |
173 | { "hp-roman8", CS_HP_ROMAN8 }, |
174 | { "roman8", CS_HP_ROMAN8 }, |
175 | { "r8", CS_HP_ROMAN8 }, |
176 | { "csHPRoman8", CS_HP_ROMAN8 }, |
177 | |
178 | { "DEC-MCS", CS_DEC_MCS }, |
179 | { "dec", CS_DEC_MCS }, |
180 | { "csDECMCS", CS_DEC_MCS }, |
181 | |
182 | { "UTF-8", CS_UTF8 }, |
183 | }; |
184 | |
185 | const char *charset_to_mimeenc(int charset) |
186 | { |
187 | int i; |
188 | |
189 | for (i = 0; i < (int)lenof(mimeencs); i++) |
190 | if (charset == mimeencs[i].charset) |
191 | return mimeencs[i].name; |
192 | |
193 | return NULL; /* not found */ |
194 | } |
195 | |
196 | int charset_from_mimeenc(const char *name) |
197 | { |
198 | int i; |
199 | |
200 | for (i = 0; i < (int)lenof(mimeencs); i++) { |
201 | const char *p, *q; |
202 | p = name; |
203 | q = mimeencs[i].name; |
204 | while (*p || *q) { |
205 | if (tolower(*p) != tolower(*q)) |
206 | break; |
207 | p++; q++; |
208 | } |
209 | if (!*p && !*q) |
210 | return mimeencs[i].charset; |
211 | } |
212 | |
213 | return CS_NONE; /* not found */ |
214 | } |