summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.in9
-rw-r--r--charset.c398
-rw-r--r--charset.h11
-rw-r--r--commands.c11
-rwxr-xr-xconfigure40
-rw-r--r--configure.in12
-rw-r--r--gen-charset.c302
-rw-r--r--handler.c21
-rw-r--r--hash.h5
-rw-r--r--recvattach.c6
-rw-r--r--rfc2047.c6
-rw-r--r--sendlib.c4
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)
diff --git a/charset.c b/charset.c
index aefe610e..96e6b94a 100644
--- a/charset.c
+++ b/charset.c
@@ -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",&microsoft_cp1251},
- {"x-cp866", &microsoft_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;
diff --git a/charset.h b/charset.h
index b2c6878c..d60dfaf8 100644
--- a/charset.h
+++ b/charset.h
@@ -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 */
diff --git a/commands.c b/commands.c
index 6b9958f7..715d2902 100644
--- a/commands.c
+++ b/commands.c
@@ -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);
diff --git a/configure b/configure
index 2baa1834..ab3d8d6c 100755
--- a/configure
+++ b/configure
@@ -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, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
+};
+
+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,
+