summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Roessler <roessler@does-not-exist.org>1998-09-12 19:51:47 +0000
committerThomas Roessler <roessler@does-not-exist.org>1998-09-12 19:51:47 +0000
commit43c36fea59cd40d1f7393b921acf477590429fef (patch)
treec649bf4b9c808786047702e222a472af0c60c167
parent3d99b5254b7a81d4ce32663c53291ab66e406212 (diff)
[patch-0.93.2i.ru.mmultiple_charsets.gz] This patch adds
support for international character sets. Currently, mutt knows about the following character sets and is able to convert between them: iso-8859-1, ..., iso-8859-9, koi8-r, windows-1251, x-cp866. (From: Ruslan Ermilov <ru@ucb.crimea.ua>)
-rw-r--r--Makefile.in2
-rw-r--r--charset.c309
-rw-r--r--charset.h34
-rw-r--r--handler.c37
-rw-r--r--rfc2047.c20
5 files changed, 381 insertions, 21 deletions
diff --git a/Makefile.in b/Makefile.in
index e28b5d53..c753c7fc 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ OBJS= addrbook.o alias.o attach.o browser.o buffy.o color.o \
main.o mbox.o menu.o mh.o mx.o pager.o parse.o pattern.o \
postpone.o query.o recvattach.o rfc822.o \
rfc1524.o rfc2047.o score.o send.o sendlib.o signal.o sort.o \
- status.o system.o thread.o @LIBOBJS@
+ status.o system.o thread.o charset.o @LIBOBJS@
CLEANFILES=dotlock mutt *.o core
VERYCLEANFILES=$(CLEANFILES) Makefile config.cache config.log \
diff --git a/charset.c b/charset.c
new file mode 100644
index 00000000..aefe610e
--- /dev/null
+++ b/charset.c
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 1998 Ruslan Ermilov <ru@ucb.crimea.ua>
+ *
+ * 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 "mutt.h"
+#include "charset.h"
+
+#include <string.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,
+ 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 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
+};
+
+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 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 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
+};
+
+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
+};
+
+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
+};
+
+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 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}
+};
+
+CHARSET *mutt_get_charset(const char *name)
+{
+ CHARSET *charset;
+
+ if (name == NULL) return NULL;
+ for (charset = Charsets; charset->name; charset++)
+ {
+ if (strcasecmp(charset->name, name) == 0)
+ return charset;
+ }
+ return NULL;
+}
+
+int mutt_display_char(int ch, CHARSET *in_charset, CHARSET *out_charset)
+{
+ 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)
+ return (128 + i);
+ }
+ return '?';
+}
+
+int mutt_display_string(char *str, CHARSET *in_charset, CHARSET *out_charset)
+{
+ if (!in_charset || !out_charset)
+ return -1;
+
+ while ((*str = mutt_display_char((unsigned char)*str, in_charset, out_charset)))
+ str++;
+
+ return 0;
+}
diff --git a/charset.h b/charset.h
new file mode 100644
index 00000000..b2c6878c
--- /dev/null
+++ b/charset.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 1998 Ruslan Ermilov <ru@ucb.crimea.ua>
+ *
+ * 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.
+ */
+
+#ifndef _CHARSET_H
+#define _CHARSET_H
+
+typedef int UNICODE_MAP[128];
+
+typedef struct
+{
+ char *name;
+ UNICODE_MAP *map;
+} CHARSET;
+
+CHARSET *mutt_get_charset(const char *);
+int mutt_display_char(int, CHARSET *, CHARSET *);
+int mutt_display_string(char *, CHARSET *, CHARSET *);
+
+#endif /* _CHARSET_H */
diff --git a/handler.c b/handler.c
index eeebed74..75169964 100644
--- a/handler.c
+++ b/handler.c
@@ -29,6 +29,7 @@
#include "keymap.h"
#include "mime.h"
#include "copy.h"
+#include "charset.h"
@@ -63,13 +64,17 @@ int Index_64[128] = {
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
};
-void mutt_decode_xbit (STATE *s, long len, int istext)
+void mutt_decode_xbit (STATE *s, BODY *b, int istext)
{
+ long len = b->length;
int c;
int lbreak = 1;
if (istext)
{
+ CHARSET *body_charset = mutt_get_charset(mutt_get_parameter("charset", b->parameter));
+ CHARSET *display_charset = mutt_get_charset(Charset);
+
while ((c = fgetc(s->fpin)) != EOF && len--)
{
if(lbreak && s->prefix)
@@ -91,7 +96,7 @@ void mutt_decode_xbit (STATE *s, long len, int istext)
}
}
- fputc(c, s->fpout);
+ state_putc(mutt_display_char(c, body_charset, display_charset), s);
if(c == '\n')
lbreak = 1;
}
@@ -112,9 +117,12 @@ static int handler_state_fgetc(STATE *s)
return ch;
}
-void mutt_decode_quoted (STATE *s, long len, int istext)
+void mutt_decode_quoted (STATE *s, BODY *b, int istext)
{
+ long len = b->length;
int ch, lbreak = 1;
+ CHARSET *body_charset = mutt_get_charset(mutt_get_parameter("charset", b->parameter));
+ CHARSET *display_charset = mutt_get_charset(Charset);
while (len > 0)
{
@@ -182,17 +190,20 @@ void mutt_decode_quoted (STATE *s, long len, int istext)
}
if(ch != EOF)
- state_putc (ch, s);
+ state_putc(istext ? mutt_display_char(ch, body_charset, display_charset) : ch, s);
if(ch == '\n')
lbreak = 1;
}
}
-void mutt_decode_base64 (STATE *s, long len, int istext)
+void mutt_decode_base64 (STATE *s, BODY *b, int istext)
{
+ long len = b->length;
char buf[5];
int c1, c2, c3, c4, ch, cr = 0, i;
+ CHARSET *body_charset = mutt_get_charset(mutt_get_parameter("charset", b->parameter));
+ CHARSET *display_charset = mutt_get_charset(Charset);
buf[4] = 0;
@@ -221,7 +232,7 @@ void mutt_decode_base64 (STATE *s, long len, int istext)
cr = 1;
else
{
- state_putc (ch, s);
+ state_putc(istext ? mutt_display_char(ch, body_charset, display_charset) : ch, s);
if (ch == '\n' && s->prefix) state_puts (s->prefix, s);
}
@@ -238,7 +249,7 @@ void mutt_decode_base64 (STATE *s, long len, int istext)
cr = 1;
else
{
- state_putc (ch, s);
+ state_putc(istext ? mutt_display_char(ch, body_charset, display_charset) : ch, s);
if (ch == '\n' && s->prefix)
state_puts (s->prefix, s);
}
@@ -255,7 +266,7 @@ void mutt_decode_base64 (STATE *s, long len, int istext)
cr = 1;
else
{
- state_putc (ch, s);
+ state_putc(istext ? mutt_display_char(ch, body_charset, display_charset) : ch, s);
if (ch == '\n' && s->prefix)
state_puts (s->prefix, s);
}
@@ -1134,13 +1145,13 @@ void mutt_decode_attachment (BODY *b, STATE *s)
switch (b->encoding)
{
case ENCQUOTEDPRINTABLE:
- mutt_decode_quoted (s, b->length, mutt_is_text_type (b->type, b->subtype));
+ mutt_decode_quoted (s, b, mutt_is_text_type (b->type, b->subtype));
break;
case ENCBASE64:
- mutt_decode_base64 (s, b->length, mutt_is_text_type (b->type, b->subtype));
+ mutt_decode_base64 (s, b, mutt_is_text_type (b->type, b->subtype));
break;
default:
- mutt_decode_xbit (s, b->length, mutt_is_text_type (b->type, b->subtype));
+ mutt_decode_xbit (s, b, mutt_is_text_type (b->type, b->subtype));
break;
}
}
@@ -1252,7 +1263,7 @@ void mutt_body_handler (BODY *b, STATE *s)
/* see if we need to decode this part before processing it */
if (b->encoding == ENCBASE64 || b->encoding == ENCQUOTEDPRINTABLE ||
- (s->prefix && plaintext))
+ plaintext)
{
int origType = b->type;
char *savePrefix = NULL;
@@ -1304,8 +1315,6 @@ void mutt_body_handler (BODY *b, STATE *s)
b->type = origType;
}
- else if (plaintext)
- mutt_copy_bytes (s->fpin, s->fpout, b->length);
/* process the (decoded) body part */
if (handler)
diff --git a/rfc2047.c b/rfc2047.c
index 25ba7914..a302afb2 100644
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -18,6 +18,7 @@
#include "mutt.h"
#include "mime.h"
+#include "charset.h"
#include "rfc2047.h"
#include <ctype.h>
@@ -244,6 +245,7 @@ static int rfc2047_decode_word (char *d, const char *s, size_t len)
char *pp = p;
char *pd = d;
int enc = 0, filter = 0, count = 0, c1, c2, c3, c4;
+ char *charset;
while ((pp = strtok (pp, "?")) != NULL)
{
@@ -252,7 +254,10 @@ static int rfc2047_decode_word (char *d, const char *s, size_t len)
{
case 2:
if (strcasecmp (pp, NONULL(Charset)) != 0)
+ {
filter = 1;
+ charset = pp;
+ }
break;
case 3:
if (toupper (*pp) == 'Q')
@@ -319,17 +324,20 @@ static int rfc2047_decode_word (char *d, const char *s, size_t len)
}
pp = 0;
}
- safe_free ((void **) &p);
if (filter)
{
- pd = d;
- while (*pd)
+ if (mutt_display_string(d, mutt_get_charset(charset), mutt_get_charset(Charset)) == -1)
{
- if (!IsPrint (*pd))
- *pd = '?';
- pd++;
+ pd = d;
+ while (*pd)
+ {
+ if (!IsPrint (*pd))
+ *pd = '?';
+ pd++;
+ }
}
}
+ safe_free ((void **) &p);
return (0);
}