diff options
author | pst <pst@FreeBSD.org> | 1996-10-13 16:13:18 +0800 |
---|---|---|
committer | pst <pst@FreeBSD.org> | 1996-10-13 16:13:18 +0800 |
commit | 78dd562760515145f4cbc3b7f6dd435c10df7665 (patch) | |
tree | a3a97506736bdee8a707f9742e70e8373e2efcc6 | |
parent | 8d35befd7d5d8eff1ab2127986a8dd4a96ea67b3 (diff) | |
download | freebsd-ports-gnome-78dd562760515145f4cbc3b7f6dd435c10df7665.tar.gz freebsd-ports-gnome-78dd562760515145f4cbc3b7f6dd435c10df7665.tar.zst freebsd-ports-gnome-78dd562760515145f4cbc3b7f6dd435c10df7665.zip |
The following patches enable RFC1342 compatible decoding of header fields
for non-ascii character sets.
Additional tips:
setenv MM_CHARSET <rfc1342 charset>
setenv LC_TYPE <proper locale>
e.g. setenv MM_CHARSET KOI8-R
setenv LC_TYPE ru_RU.KOI8-R
or setenv MM_CHARSET iso-8859-1
setenv LC_TYPE iso_8859_1
Change your mhl.format to read so that the new code will be invoked on
interesting fields when you do a "show":
From:formatfield="%(comp{text})"
Reply-To:formatfield="%(comp{text})"
To:formatfield="%(comp{text})"
cc:formatfield="%(comp{text})"
Obtained from: Ola Stromfors <Ola.S.Stromfors@telia.se>,
Frederik H. Andersen <fha@dde.dk>,
with fixes from anders@ifi.uio.no and pst@freebsd.org
-rw-r--r-- | mail/mh/files/patch-ae | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/mail/mh/files/patch-ae b/mail/mh/files/patch-ae new file mode 100644 index 000000000000..c080ee22cced --- /dev/null +++ b/mail/mh/files/patch-ae @@ -0,0 +1,341 @@ +The following patches enable RFC1342 compatible decoding of header fields +for non-ascii character sets. + +Additional tips: + setenv MM_CHARSET <rfc1342 charset> + setenv LC_TYPE <proper locale> + +e.g. setenv MM_CHARSET KOI8-R + setenv LC_TYPE ru_RU.KOI8-R + +or setenv MM_CHARSET iso-8859-1 + setenv LC_TYPE iso_8859_1 + +Change your mhl.format to read so that the new code will be invoked on +interesting fields when you do a "show": + +From:formatfield="%(comp{text})" +Reply-To:formatfield="%(comp{text})" +To:formatfield="%(comp{text})" +cc:formatfield="%(comp{text})" + + --------------------------------------------------------- + + +--- conf/FreeBSD.orig Sat Oct 12 23:04:23 1996 ++++ conf/FreeBSD Sat Oct 12 23:36:19 1996 +@@ -18,7 +20,7 @@ + options BSD42 BSD43 BSD44 WAITINT UNISTD VSPRINTF MORE='"/usr/bin/more"' + options NORUSERPASS DBMPWD POSIX NTOHLSWAP SYS5DIR OVERHEAD MSGID FCNTL + options BIND MIME SENDMTS SMTP WHATNOW ZONEINFO +-options GCOS_HACK RENAME LOCALE ++options GCOS_HACK RENAME LOCALE RFC1342 + + # If you want POP support, this will help you get started, but feel + # free to customize it. +--- sbr/formatsbr.c.orig Sat Oct 12 23:05:07 1996 ++++ sbr/formatsbr.c Sun Oct 13 00:08:31 1996 +@@ -114,13 +114,13 @@ + */ + + static int match (str, sub) +-register char *str, +- *sub; ++register unsigned char *str, ++ *sub; + { + register int c1; + register int c2; +- register char *s1; +- register char *s2; ++ register unsigned char *s1; ++ register unsigned char *s2; + + #ifdef LOCALE + while (c1 = *sub) { +@@ -203,14 +203,14 @@ + i++;\ + }\ + } else {\ +- while ((c = *sp) && (iscntrl(c) || isspace(c)))\ ++ while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ + sp++;\ + }\ +- while ((c = *sp++) && --i >= 0 && cp < ep)\ ++ while ((c = (unsigned char) *sp++) && --i >= 0 && cp < ep)\ + if (isgraph(c)) \ + *cp++ = c;\ + else {\ +- while ((c = *sp) && (iscntrl(c) || isspace(c)))\ ++ while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ + sp++;\ + *cp++ = ' ';\ + }\ +@@ -221,13 +221,13 @@ + } + #define PUTS(cp, str) {\ + if (sp = (str)) {\ +- while ((c = *sp) && (iscntrl(c) || isspace(c)))\ ++ while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ + sp++;\ +- while((c = *sp++) && cp < ep)\ ++ while((c = (unsigned char) *sp++) && cp < ep)\ + if (isgraph(c)) \ + *cp++ = c;\ + else {\ +- while ((c = *sp) && (iscntrl(c) || isspace(c)))\ ++ while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ + sp++;\ + *cp++ = ' ';\ + }\ +@@ -358,15 +358,30 @@ + long l; + char *savestr; + char buffer[BUFSIZ]; ++ char workbuff[BUFSIZ]; + + while (cp < ep) { + switch (fmt->f_type) { + + case FT_COMP: ++#ifdef RFC1342 ++ str = fmt->f_comp->c_text; ++ if (maybe_decode_rfc1342(str, buffer)) ++ str = buffer; ++ PUTS (cp, str); ++#else + PUTS (cp, fmt->f_comp->c_text); ++#endif + break; + case FT_COMPF: ++#ifdef RFC1342 ++ str = fmt->f_comp->c_text; ++ if (maybe_decode_rfc1342(str, buffer)) ++ str = buffer; ++ PUTSF (cp, str, fmt->f_width, fmt->f_fill); ++#else + PUTSF (cp, fmt->f_comp->c_text, fmt->f_width, fmt->f_fill); ++#endif + break; + + case FT_LIT: +@@ -500,6 +515,10 @@ + + case FT_LS_COMP: + str = fmt->f_comp->c_text; ++#ifdef RFC1342 ++ if (maybe_decode_rfc1342(str, buffer)) ++ str = buffer; ++#endif + break; + case FT_LS_LIT: + str = fmt->f_text; +@@ -722,6 +741,10 @@ + else + break; + } ++#ifdef RFC1342 ++ if (maybe_decode_rfc1342(str, workbuff)) ++ str = workbuff; ++#endif /* RFC1342 */ + if (*str) + break; + } +@@ -744,6 +767,10 @@ + break; + } + } ++#ifdef RFC1342 ++ if (maybe_decode_rfc1342(str, workbuff)) ++ str = workbuff; ++#endif /* RFC1342 */ + #endif /* BERK */ + break; + +--- /dev/null Sat Oct 12 23:27:32 1996 ++++ sbr/rfc1342.c Sun Oct 13 00:02:22 1996 +@@ -0,0 +1,184 @@ ++/* rfc1342.c */ ++/* ++ * Decode RFC1342 header format ++ */ ++ ++#ifdef RFC1342 ++static char hexindex[] = { ++ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, ++ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, ++ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, ++ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, ++ -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, ++ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, ++ -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, ++ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ++}; ++ ++static char index_64[128] = { ++ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, ++ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, ++ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, ++ 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, ++ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, ++ 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, ++ -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, ++ 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 ++}; ++ ++#define char64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)]) ++ ++static int ++unqp (byte1, byte2) ++ char byte1; ++ char byte2; ++{ ++ if (hexindex[byte1] == -1 || hexindex[byte2] == -1) ++ return -1; ++ return hexindex[byte1]<<4 | hexindex[byte2]; ++} ++ ++int ++maybe_decode_rfc1342 (src, dst) ++ char *src; ++ char *dst; ++{ ++ static char *mm_charset = 0; ++ static char *alt_charset = 0; ++ extern char *getenv(); ++ char *p; ++ char *q; ++ char *pp; ++ char *startofmime = 0; ++ char *endofmime = 0; ++ int c; ++ int quoted_printable; ++ ++ if (!mm_charset) { ++ mm_charset = getenv ("MM_CHARSET"); ++ if (mm_charset && strcasecmp(mm_charset, "iso-8859-1") == 0) { ++ alt_charset = "us-ascii"; /* Accept a common subset */ ++ } ++ } ++ if (!mm_charset || src == 0) ++ return 0; ++ ++ for (p = src, q = dst; *p; p++) { ++ *q++ = *p; ++ if (*p == '=' && p[1] && p[1] == '?' && p[2]) { ++ /* Have: =? */ ++ startofmime = p + 2; ++ if (strncasecmp(startofmime, mm_charset, ++ strlen(mm_charset)) == 0) { ++ startofmime += strlen (mm_charset); ++ } else if (alt_charset && ++ (strncasecmp(startofmime, alt_charset, ++ strlen(alt_charset)) == 0)) { ++ startofmime += strlen (alt_charset); ++ } else { ++ continue; ++ } ++ /* Have: =?charset */ ++ if (startofmime[0] != '?') ++ continue; ++ /* Have: =?charset? */ ++ startofmime++; ++ if (*startofmime != 'B' && ++ *startofmime != 'b' && ++ *startofmime != 'Q' && ++ *startofmime != 'q') ++ continue; ++ /* Have: =?charset?E */ ++ quoted_printable = *startofmime == 'Q' || ++ *startofmime == 'q';; ++ startofmime++; ++ if (*startofmime != '?') ++ continue; ++ /* Have: =?charset?E? */ ++ startofmime++; ++ for (pp = startofmime; *pp && *(pp+1); pp++) ++ if (*pp == '?' && pp[1] == '=') { ++ endofmime = pp; ++ break; ++ } ++ /* Have: =?charset?E?text?= */ ++ if (endofmime) { ++ q--; ++ if (quoted_printable) ++ for (pp = startofmime; pp < endofmime; pp++) { ++ if (*pp == '=') { ++ c = unqp (pp[1], pp[2]); ++ if ( c == -1) ++ continue; ++ if ( c != 0) ++ *q++ = c; ++ pp += 2; ++ } else if (*pp == '_') ++ *q++ = ' '; ++ else ++ *q++ = *pp; ++ } ++ else { /* base64 */ ++ int c1, c2, c3, c4; ++ pp = startofmime; ++ while (pp < endofmime) { ++ /* 6 + 2 bits */ ++ while ((pp < endofmime) && ++ ((c1 = char64(*pp)) == -1)) { ++ pp++; ++ } ++ if (pp < endofmime) { ++ pp++; ++ } ++ while ((pp < endofmime) && ++ ((c2 = char64(*pp)) == -1)) { ++ pp++; ++ } ++ if (pp < endofmime && c1 != -1 && c2 != -1) { ++ *q++ = (c1 << 2) | (c2 >> 4); ++ pp++; ++ } ++ /* 4 + 4 bits */ ++ while ((pp < endofmime) && ++ ((c3 = char64(*pp)) == -1)) { ++ pp++; ++ } ++ if (pp < endofmime && c2 != -1 && c3 != -1) { ++ *q++ = ((c2 & 0xF) << 4) | (c3 >> 2); ++ pp++; ++ } ++ /* 2 + 6 bits */ ++ while ((pp < endofmime) && ++ ((c4 = char64(*pp)) == -1)) { ++ pp++; ++ } ++ if (pp < endofmime && c3 != -1 && c4 != -1) { ++ *q++ = ((c3 & 0x3) << 6) | (c4); ++ pp++; ++ } ++ } ++ } ++ p = endofmime + 1; ++ if (*p == ' ') ++ p++; ++ } ++ } ++ } ++ *q = 0; ++ return endofmime != 0; ++} ++#endif ++ ++#ifdef notdef /* For debugging */ ++int ++main(argc, argv) ++ int argc; ++ char **argv; ++{ ++ char buff[100]; ++ if (maybe_decode_rfc1342 (argv[1], buff)) ++ puts (buff); ++ else ++ puts ("NEI!"); ++} ++#endif |