diff options
author | Thomas Roessler <roessler@does-not-exist.org> | 1998-09-13 15:26:52 +0000 |
---|---|---|
committer | Thomas Roessler <roessler@does-not-exist.org> | 1998-09-13 15:26:52 +0000 |
commit | 2fe89e82d26131cabbe9c9676608d1b72d3c1af0 (patch) | |
tree | d77d43b0c2ff8f33f4d512621f78d3c455f1d4a4 | |
parent | 439510c9447bf27162f7fc02687c155b0103c502 (diff) |
This patch adds on-demand loading of character set tables,
changes the default location of $SHAREDIR, and fixes some
compilation problems occuring on machines without PGP
installed.
-rw-r--r-- | Makefile.in | 9 | ||||
-rw-r--r-- | charset.c | 398 | ||||
-rw-r--r-- | charset.h | 11 | ||||
-rw-r--r-- | commands.c | 11 | ||||
-rwxr-xr-x | configure | 40 | ||||
-rw-r--r-- | configure.in | 12 | ||||
-rw-r--r-- | gen-charset.c | 302 | ||||
-rw-r--r-- | handler.c | 21 | ||||
-rw-r--r-- | hash.h | 5 | ||||
-rw-r--r-- | recvattach.c | 6 | ||||
-rw-r--r-- | rfc2047.c | 6 | ||||
-rw-r--r-- | sendlib.c | 4 |
12 files changed, 522 insertions, 303 deletions
diff --git a/Makefile.in b/Makefile.in index c753c7fc..5d436be1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -57,7 +57,7 @@ NONEXPORT=pgp.c pgp.h pgpinvoke.c pgpkey.c pgppubring.c sha.h sha1dgst.c \ gnupgparse.c sha_locl.h OPS.PGP doc/pgp-Notes.txt doc/language.txt \ doc/language50.txt -all: mutt @DOTLOCK_TARGET@ +all: mutt @DOTLOCK_TARGET@ gen-charset mutt: keymap_defs.h $(OBJS) $(REGEX) $(CC) -o mutt $(OBJS) $(REGEX) $(LDFLAGS) $(LIBS) @@ -65,11 +65,14 @@ mutt: keymap_defs.h $(OBJS) $(REGEX) dotlock: dotlock.o @SNPRINTFOBJS@ $(CC) -o dotlock dotlock.o @SNPRINTFOBJS@ +gen-charset: gen-charset.o + $(CC) -o gen-charset gen-charset.o + keymap_defs.h: Makefile $(OPS) rm -f keymap_defs.h $(srcdir)/gen_defs $(OPS) > keymap_defs.h -install: mutt install.doc @DOTLOCK_INSTALL_TARGET@ +install: mutt install.doc @DOTLOCK_INSTALL_TARGET@ gen-charset $(srcdir)/mkinstalldirs $(bindir) -mv -f $(bindir)/mutt $(bindir)/mutt.old $(INSTALL) -m 755 mutt $(bindir) @@ -80,6 +83,8 @@ install: mutt install.doc @DOTLOCK_INSTALL_TARGET@ -if [ ! -f $(sharedir)/mime.types ]; then \ $(INSTALL) -m 644 $(srcdir)/mime.types $(sharedir); \ fi + $(srcdir)/mkinstalldirs $(sharedir)/charsets + ./gen-charset $(sharedir)/charsets install.dotlock: dotlock $(srcdir)/mkinstalldirs $(bindir) @@ -1,5 +1,6 @@ /* - * Copyright (C) 1998 Ruslan Ermilov <ru@ucb.crimea.ua> + * Copyright (C) 1998 Ruslan Ermilov <ru@ucb.crimea.ua>, + * Thomas Roessler <roessler@guug.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,289 +21,188 @@ #include "charset.h" #include <string.h> +#include <ctype.h> +static HASH *Translations = NULL; +static HASH *Charsets = NULL; -static UNICODE_MAP iso_8859_1 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF -}; - -static UNICODE_MAP iso_8859_2 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, - 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, - 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, - 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, - 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, - 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, - 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, - 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, - 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, - 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, - 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, - 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 -}; - -static UNICODE_MAP iso_8859_3 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, -1, 0x0124, 0x00A7, - 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, -1, 0x017B, - 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, - 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, -1, 0x017C, - 0x00C0, 0x00C1, 0x00C2, -1, 0x00C4, 0x010A, 0x0108, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - -1, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, - 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, -1, 0x00E4, 0x010B, 0x0109, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - -1, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, - 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 -}; +static CHARSET *mutt_new_charset(void) +{ + CHARSET *chs; + + chs = safe_malloc(sizeof(CHARSET)); + chs->name = NULL; + chs->map = NULL; + + return chs; +} -static UNICODE_MAP iso_8859_4 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, - 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, - 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, - 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, - 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, - 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, - 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, - 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, - 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, - 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9 -}; +#if 0 -static UNICODE_MAP iso_8859_5 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, - 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F -}; +static void mutt_free_charset(CHARSET **chsp) +{ + CHARSET *chs = *chsp; + + safe_free((void **) &chs->name); + safe_free((void **) &chs->map); + safe_free((void **) chsp); +} -static UNICODE_MAP iso_8859_6 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, -1, -1, -1, 0x00A4, -1, -1, -1, - -1, -1, -1, -1, 0x060C, 0x00AD, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0x061B, -1, -1, -1, 0x061F, - -1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, - 0x0638, 0x0639, 0x063A, -1, -1, -1, -1, -1, - 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, - 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, - 0x0650, 0x0651, 0x0652, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1 -}; +#endif -static UNICODE_MAP iso_8859_7 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x02BD, 0x02BC, 0x00A3, -1, -1, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, -1, 0x00AB, 0x00AC, 0x00AD, -1, 0x2015, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, - 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - 0x03A0, 0x03A1, -1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, - 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, -1 -}; +static void canonical_charset(char *dest, size_t dlen, const char *name) +{ + int i; + + if(!strncasecmp(name, "x-", 2)) + name = name + 2; + + for(i = 0; name[i] && i < dlen - 1; i++) + { + if(strchr("_/. ", name[i])) + dest[i] = '-'; + else + dest[i] = tolower(name[i]); + } + + dest[i] = '\0'; +} -static UNICODE_MAP iso_8859_8 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, -1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 0x2017, - 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, - 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, - 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, - 0x05E8, 0x05E9, 0x05EA, -1, -1, -1, -1, -1 -}; +static CHARSET *load_charset(const char *name) +{ + char path[_POSIX_PATH_MAX]; + char buffer[SHORT_STRING]; + CHARSET *chs; + FILE *fp = NULL; + int i; -static UNICODE_MAP iso_8859_9 = { - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF -}; + chs = mutt_new_charset(); + chs->name = safe_strdup(name); + + snprintf(path, sizeof(path), "%s/charsets/%s", SHAREDIR, name); + if((fp = fopen(path, "r")) == NULL) + goto bail; + + if(fgets(buffer, sizeof(buffer), fp) == NULL) + goto bail; + + if(strcmp(buffer, CHARSET_MAGIC) != 0) + goto bail; -static UNICODE_MAP koi8_r = { - 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, - 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, - 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, - 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, - 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, - 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, - 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, - 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a -}; + chs->map = safe_malloc(sizeof(UNICODE_MAP)); + + for(i = 0; i < 128; i++) + { + if(fscanf(fp, "%i", &(*chs->map)[i]) != 1) + { + safe_free((void **) &chs->map); + break; + } + } -static UNICODE_MAP microsoft_cp1251 = { - 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, - -1, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, - 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - -1, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, - 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, - 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, - 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, - 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F -}; + bail: + + if(fp) fclose(fp); + return chs; +} -static UNICODE_MAP microsoft_cp866 = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0 -}; +static void init_charsets() +{ + if(Charsets) return; -static CHARSET Charsets[] = { - {"iso-8859-1", &iso_8859_1}, - {"iso-8859-2", &iso_8859_2}, - {"iso-8859-3", &iso_8859_3}, - {"iso-8859-4", &iso_8859_4}, - {"iso-8859-5", &iso_8859_5}, - {"iso-8859-6", &iso_8859_6}, - {"iso-8859-7", &iso_8859_7}, - {"iso-8859-8", &iso_8859_8}, - {"iso-8859-9", &iso_8859_9}, - {"koi8-r", &koi8_r}, - {"windows-1251",µsoft_cp1251}, - {"x-cp866", µsoft_cp866}, - {NULL, NULL} -}; + Charsets = hash_create(16); + Translations = hash_create(32); +} CHARSET *mutt_get_charset(const char *name) { CHARSET *charset; - - if (name == NULL) return NULL; - for (charset = Charsets; charset->name; charset++) + char buffer[SHORT_STRING]; + + init_charsets(); + canonical_charset(buffer, sizeof(buffer), name); + if(!(charset = hash_find(Charsets, buffer))) { - if (strcasecmp(charset->name, name) == 0) - return charset; + charset = load_charset(buffer); + hash_insert(Charsets, buffer, charset, 0); } - return NULL; + return charset; } -int mutt_display_char(int ch, CHARSET *in_charset, CHARSET *out_charset) +static int translate_char(UNICODE_MAP *to, int ch) { int i; - if (!in_charset || !out_charset || (in_charset == out_charset) || (ch < 128) || (ch > 255)) - return ch; - - ch = (*in_charset->map)[ch - 128]; if (ch == -1) return '?'; if (ch < 128) return ch; for (i = 0; i < 128; i++) { - if ((*out_charset->map)[i] == ch) + if ((*to)[i] == ch) return (128 + i); } return '?'; } -int mutt_display_string(char *str, CHARSET *in_charset, CHARSET *out_charset) +UNICODE_MAP *build_translation(UNICODE_MAP *from, UNICODE_MAP *to) +{ + int i; + UNICODE_MAP *map = safe_malloc(sizeof(UNICODE_MAP)); + + for(i = 0; i < 128; i++) + (*map)[i] = translate_char(to, (*from)[i]); + + return map; +} + +UNICODE_MAP *mutt_get_translation(const char *_from, const char *_to) +{ + char from[SHORT_STRING]; + char to[SHORT_STRING]; + char key[SHORT_STRING]; + CHARSET *from_cs, *to_cs; + UNICODE_MAP *map; + + if(!_from || !_to) + return NULL; + + init_charsets(); + + canonical_charset(from, sizeof(from), _from); + canonical_charset(to, sizeof(to), _to); + + /* quick check for the identity mapping */ + if((*from == *to) && !strcmp(from, to)) + return NULL; + + snprintf(key, sizeof(key), "%s %s", from, to); + if((map = hash_find(Translations, key)) == NULL) + { + from_cs = mutt_get_charset(from); + to_cs = mutt_get_charset(to); + + if(!from_cs->map || !to_cs->map) + return NULL; + + map = build_translation(from_cs->map, to_cs->map); + hash_insert(Translations, key, map, 0); + } + return map; +} + +int mutt_display_char(int ch, UNICODE_MAP *map) +{ + if (!map || (ch < 128) || (ch > 255)) + return ch; + + return (*map)[ch - 128]; +} + +int mutt_display_string(char *str, UNICODE_MAP *map) { - if (!in_charset || !out_charset) + if(!map) return -1; - while ((*str = mutt_display_char((unsigned char)*str, in_charset, out_charset))) + while ((*str = mutt_display_char((unsigned char)*str, map))) str++; return 0; @@ -27,8 +27,15 @@ typedef struct UNICODE_MAP *map; } CHARSET; +#define CHARSET_MAGIC "Mutt Character Set Definition 1.0\n" + +#ifndef _GEN_CHARSETS + CHARSET *mutt_get_charset(const char *); -int mutt_display_char(int, CHARSET *, CHARSET *); -int mutt_display_string(char *, CHARSET *, CHARSET *); +UNICODE_MAP *mutt_get_translation(const char *, const char *); +int mutt_display_char(int, UNICODE_MAP *); +int mutt_display_string(char *, UNICODE_MAP *); + +#endif #endif /* _CHARSET_H */ @@ -554,7 +554,10 @@ static void _mutt_save_message (HEADER *h, CONTEXT *ctx, int delete, int decode, /* returns 0 if the copy/save was successful, or -1 on error/abort */ int mutt_save_message (HEADER *h, int delete, int decode, int decrypt, int *redraw) { - int i, need_buffy_cleanup, need_passphrase = 0; + int i, need_buffy_cleanup; +#ifdef _PGPPATH + int need_passphrase = 0; +#endif char prompt[SHORT_STRING], buf[_POSIX_PATH_MAX]; CONTEXT ctx; struct stat st; @@ -573,7 +576,9 @@ int mutt_save_message (HEADER *h, int delete, int decode, int decrypt, int *redr if (h) { +#ifdef _PGPPATH need_passphrase = h->pgp & PGPENCRYPT; +#endif mutt_default_save (buf, sizeof (buf), h); } else @@ -592,7 +597,9 @@ int mutt_save_message (HEADER *h, int delete, int decode, int decrypt, int *redr if (h) { mutt_default_save (buf, sizeof (buf), h); +#ifdef _PGPPATH need_passphrase |= h->pgp & PGPENCRYPT; +#endif h = NULL; } } @@ -629,8 +636,10 @@ int mutt_save_message (HEADER *h, int delete, int decode, int decrypt, int *redr return (-1); } +#ifdef _PGPPATH if(need_passphrase && (decode || decrypt) && !pgp_valid_passphrase()) return -1; +#endif mutt_message ("Copying to %s...", buf); @@ -2626,11 +2626,7 @@ echo "configure:2626: checking where to put architecture-dependent files" >&5 if eval "test \"`echo '$''{'mutt_cv_libdir'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else - if test -d ${mutt_cv_prefix}/lib/misc; then - mutt_cv_libdir="${mutt_cv_prefix}/lib/misc" - else - mutt_cv_libdir="${mutt_cv_prefix}/lib" - fi + mutt_cv_libdir="${mutt_cv_prefix}/lib/mutt " fi echo "$ac_t""$mutt_cv_libdir" 1>&6 @@ -2647,16 +2643,12 @@ if test "${with_sharedir+set}" = set; then mutt_cv_sharedir=$withval else echo $ac_n "checking where to put architecture-independent data files""... $ac_c" 1>&6 -echo "configure:2651: checking where to put architecture-independent data files" >&5 +echo "configure:2647: checking where to put architecture-independent data files" >&5 if eval "test \"`echo '$''{'mutt_cv_sharedir'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -d ${mutt_cv_prefix}/share; then - if test -d ${mutt_cv_prefix}/share/misc; then - mutt_cv_sharedir="${mutt_cv_prefix}/share/misc" - else - mutt_cv_sharedir="${mutt_cv_prefix}/share" - fi + mutt_cv_sharedir="${mutt_cv_prefix}/share/mutt" else mutt_cv_sharedir="$libdir" fi @@ -2677,7 +2669,7 @@ if test "${with_docdir+set}" = set; then mutt_cv_docdir=$withval else echo $ac_n "checking where to put the documentation""... $ac_c" 1>&6 -echo "configure:2681: checking where to put the documentation" >&5 +echo "configure:2673: checking where to put the documentation" >&5 if eval "test \"`echo '$''{'mutt_cv_docdir'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2728,7 +2720,7 @@ if test "${enable_pop+set}" = set; then EOF echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6 -echo "configure:2732: checking for socket in -lsocket" >&5 +echo "configure:2724: checking for socket in -lsocket" >&5 ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2736,7 +2728,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <<EOF -#line 2740 "configure" +#line 2732 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -2747,7 +2739,7 @@ int main() { socket() ; return 0; } EOF -if { (eval echo configure:2751: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2743: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2775,7 +2767,7 @@ else fi echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:2779: checking for gethostbyname in -lnsl" >&5 +echo "configure:2771: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2783,7 +2775,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <<EOF -#line 2787 "configure" +#line 2779 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -2794,7 +2786,7 @@ int main() { gethostbyname() ; return 0; } EOF -if { (eval echo configure:2798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2790: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2834,7 +2826,7 @@ if test "${enable_imap+set}" = set; then EOF echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6 -echo "configure:2838: checking for socket in -lsocket" >&5 +echo "configure:2830: checking for socket in -lsocket" >&5 ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2842,7 +2834,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <<EOF -#line 2846 "configure" +#line 2838 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -2853,7 +2845,7 @@ int main() { socket() ; return 0; } EOF -if { (eval echo configure:2857: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2849: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2881,7 +2873,7 @@ else fi echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:2885: checking for gethostbyname in -lnsl" >&5 +echo "configure:2877: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2889,7 +2881,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <<EOF -#line 2893 "configure" +#line 2885 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -2900,7 +2892,7 @@ int main() { gethostbyname() ; return 0; } EOF -if { (eval echo configure:2904: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else diff --git a/configure.in b/configure.in index c2bf1ed6..a83a853a 100644 --- a/configure.in +++ b/configure.in @@ -319,11 +319,7 @@ AC_ARG_WITH(libdir, [ --with-libdir=PATH specify where to put arch depend [mutt_cv_libdir=$withval], [ AC_CACHE_CHECK(where to put architecture-dependent files, mutt_cv_libdir, - [if test -d ${mutt_cv_prefix}/lib/misc; then - mutt_cv_libdir="${mutt_cv_prefix}/lib/misc" - else - mutt_cv_libdir="${mutt_cv_prefix}/lib" - fi]) + [ mutt_cv_libdir="${mutt_cv_prefix}/lib/mutt " ]) ]) libdir=$mutt_cv_libdir @@ -334,11 +330,7 @@ AC_ARG_WITH(sharedir, [ --with-sharedir=PATH specify where to put arch in [ AC_CACHE_CHECK(where to put architecture-independent data files, mutt_cv_sharedir, [if test -d ${mutt_cv_prefix}/share; then - if test -d ${mutt_cv_prefix}/share/misc; then - mutt_cv_sharedir="${mutt_cv_prefix}/share/misc" - else - mutt_cv_sharedir="${mutt_cv_prefix}/share" - fi + mutt_cv_sharedir="${mutt_cv_prefix}/share/mutt" else mutt_cv_sharedir="$libdir" fi]) diff --git a/gen-charset.c b/gen-charset.c new file mode 100644 index 00000000..dbc8ecaf --- /dev/null +++ b/gen-charset.c @@ -0,0 +1,302 @@ +/* + * Copyright (C) 1998 Ruslan Ermilov <ru@ucb.crimea.ua>, + * Thomas Roessler <roessler@guug.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <string.h> +#include <stdio.h> +#include <unistd.h> + +#define _GEN_CHARSETS +#include "charset.h" + +static UNICODE_MAP iso_8859_1 = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +static UNICODE_MAP iso_8859_2 = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, + 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, + 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, + 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +}; + +static UNICODE_MAP iso_8859_3 = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, -1, 0x0124, 0x00A7, + 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, -1, 0x017B, + 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, + 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, -1, 0x017C, + 0x00C0, 0x00C1, 0x00C2, -1, 0x00C4, 0x010A, 0x0108, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + -1, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, + 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, -1, 0x00E4, 0x010B, 0x0109, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + -1, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, + 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 +}; + +static UNICODE_MAP iso_8859_4 = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, + 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, + 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, + 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, + 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, + 0x0111, 0x0146, 0x014D |