]>
Commit | Line | Data |
---|---|---|
1c1af145 | 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 | { "IBM866", CS_CP866 }, | |
139 | { "cp866", CS_CP866 }, | |
140 | { "866", CS_CP866 }, | |
141 | { "csIBM866", CS_CP866 }, | |
142 | ||
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 | ||
166 | { "macintosh", CS_MAC_ROMAN_OLD }, | |
167 | { "mac", CS_MAC_ROMAN_OLD }, | |
168 | { "csMacintosh", CS_MAC_ROMAN_OLD }, | |
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((unsigned char)*p) != tolower((unsigned char)*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 | } |