]>
Commit | Line | Data |
---|---|---|
1c1af145 | 1 | /* |
2 | * xenc.c - translate our internal character set codes to and from | |
3 | * X11 character encoding 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 | } xencs[] = { | |
15 | /* | |
16 | * Officially registered encoding names. This list is derived | |
17 | * from the font encodings section of | |
18 | * | |
19 | * http://ftp.x.org/pub/DOCS/registry | |
20 | * | |
21 | * Where multiple encoding names map to the same encoding id | |
22 | * (such as iso8859-15 and fcd8859-15), the first is considered | |
23 | * canonical and will be returned when translating the id to a | |
24 | * string. | |
25 | */ | |
26 | { "iso8859-1", CS_ISO8859_1 }, | |
27 | { "iso8859-2", CS_ISO8859_2 }, | |
28 | { "iso8859-3", CS_ISO8859_3 }, | |
29 | { "iso8859-4", CS_ISO8859_4 }, | |
30 | { "iso8859-5", CS_ISO8859_5 }, | |
31 | { "iso8859-6", CS_ISO8859_6 }, | |
32 | { "iso8859-7", CS_ISO8859_7 }, | |
33 | { "iso8859-8", CS_ISO8859_8 }, | |
34 | { "iso8859-9", CS_ISO8859_9 }, | |
35 | { "iso8859-10", CS_ISO8859_10 }, | |
36 | { "iso8859-13", CS_ISO8859_13 }, | |
37 | { "iso8859-14", CS_ISO8859_14 }, | |
38 | { "iso8859-15", CS_ISO8859_15 }, | |
39 | { "fcd8859-15", CS_ISO8859_15 }, | |
40 | { "hp-roman8", CS_HP_ROMAN8 }, | |
41 | { "koi8-r", CS_KOI8_R }, | |
42 | /* | |
43 | * Unofficial encoding names found in the wild. | |
44 | */ | |
45 | { "iso8859-16", CS_ISO8859_16 }, | |
46 | { "koi8-u", CS_KOI8_U }, | |
47 | { "ibm-cp437", CS_CP437 }, | |
48 | { "ibm-cp850", CS_CP850 }, | |
49 | { "ibm-cp866", CS_CP866 }, | |
50 | { "microsoft-cp1250", CS_CP1250 }, | |
51 | { "microsoft-cp1251", CS_CP1251 }, | |
52 | { "microsoft-cp1252", CS_CP1252 }, | |
53 | { "microsoft-cp1253", CS_CP1253 }, | |
54 | { "microsoft-cp1254", CS_CP1254 }, | |
55 | { "microsoft-cp1255", CS_CP1255 }, | |
56 | { "microsoft-cp1256", CS_CP1256 }, | |
57 | { "microsoft-cp1257", CS_CP1257 }, | |
58 | { "microsoft-cp1258", CS_CP1258 }, | |
59 | { "mac-roman", CS_MAC_ROMAN }, | |
60 | { "viscii1.1-1", CS_VISCII }, | |
61 | { "viscii1-1", CS_VISCII }, | |
62 | }; | |
63 | ||
64 | const char *charset_to_xenc(int charset) | |
65 | { | |
66 | int i; | |
67 | ||
68 | for (i = 0; i < (int)lenof(xencs); i++) | |
69 | if (charset == xencs[i].charset) | |
70 | return xencs[i].name; | |
71 | ||
72 | return NULL; /* not found */ | |
73 | } | |
74 | ||
75 | int charset_from_xenc(const char *name) | |
76 | { | |
77 | int i; | |
78 | ||
79 | for (i = 0; i < (int)lenof(xencs); i++) { | |
80 | const char *p, *q; | |
81 | p = name; | |
82 | q = xencs[i].name; | |
83 | while (*p || *q) { | |
84 | if (tolower((unsigned char)*p) != tolower((unsigned char)*q)) | |
85 | break; | |
86 | p++; q++; | |
87 | } | |
88 | if (!*p && !*q) | |
89 | return xencs[i].charset; | |
90 | } | |
91 | ||
92 | return CS_NONE; /* not found */ | |
93 | } |