diff -ruN mutt-1.5.19.orig/init.h init.h --- mutt-1.5.19.orig/init.h 2009-02-11 11:57:36.000000000 +0800 +++ init.h 2009-02-11 11:57:40.000000000 +0800 @@ -279,6 +279,11 @@ ** unset, you must first use the \fC\fP function (bound to ``;'' ** by default) to make the next function apply to all tagged messages. */ + { "bbsislame", DT_BOOL, R_NONE, OPTBBSISLAME, 0 }, + /* + ** .pp + ** When this variable is set, mutt will beep when an error occurs. + */ { "beep", DT_BOOL, R_NONE, OPTBEEP, 1 }, /* ** .pp @@ -2681,7 +2686,7 @@ ** mutt scores are always greater than or equal to zero, the default setting ** of this variable will never mark a message read. */ - { "send_charset", DT_STR, R_NONE, UL &SendCharset, UL "us-ascii:iso-8859-1:utf-8" }, + { "send_charset", DT_STR, R_NONE, UL &SendCharset, UL "big5:gb2312:us-ascii:iso-8859-1:utf-8" }, /* ** .pp ** A colon-delimited list of character sets for outgoing messages. Mutt will use the @@ -3143,7 +3148,7 @@ ** machine without having to enter a password. */ #endif - { "use_8bitmime", DT_BOOL, R_NONE, OPTUSE8BITMIME, 0 }, + { "use_8bitmime", DT_BOOL, R_NONE, OPTUSE8BITMIME, 1 }, /* ** .pp ** \fBWarning:\fP do not set this variable unless you are using a version diff -ruN mutt-1.5.19.orig/mbyte.c mbyte.c --- mutt-1.5.19.orig/mbyte.c 2009-02-11 11:57:36.000000000 +0800 +++ mbyte.c 2009-02-11 11:57:40.000000000 +0800 @@ -24,6 +24,9 @@ # include "config.h" #endif +/* + * Trad. Chinese (Big5) support by yjchou@linux.cis.nctu.edu.tw + */ #include "mutt.h" #include "mbyte.h" #include "charset.h" @@ -39,6 +42,7 @@ int Charset_is_utf8 = 0; #ifndef HAVE_WC_FUNCS static int charset_is_ja = 0; +static int charset_is_big5 = 0; static iconv_t charset_to_utf8 = (iconv_t)(-1); static iconv_t charset_from_utf8 = (iconv_t)(-1); #endif @@ -52,6 +56,7 @@ Charset_is_utf8 = 0; #ifndef HAVE_WC_FUNCS charset_is_ja = 0; + charset_is_big5 = 0; if (charset_to_utf8 != (iconv_t)(-1)) { iconv_close (charset_to_utf8); @@ -82,6 +87,14 @@ charset_from_utf8 = mutt_iconv_open (charset, "utf-8", 0); } #endif +#ifndef HAVE_WC_FUNCS + else if (!strcmp(buffer, "big5")) + { + charset_is_big5 = 1; + charset_to_utf8 = iconv_open ("UTF-8", charset); + charset_from_utf8 = iconv_open (charset, "UTF-8"); + } +#endif #if defined(HAVE_BIND_TEXTDOMAIN_CODESET) && defined(ENABLE_NLS) bind_textdomain_codeset(PACKAGE, buffer); @@ -256,7 +269,7 @@ int iswprint (wint_t wc) { - if (Charset_is_utf8 || charset_is_ja) + if (Charset_is_utf8 || charset_is_ja || charset_is_big5) return ((0x20 <= wc && wc < 0x7f) || 0xa0 <= wc); else return (0 <= wc && wc < 256) ? IsPrint (wc) : 0; @@ -264,7 +277,7 @@ int iswspace (wint_t wc) { - if (Charset_is_utf8 || charset_is_ja) + if (Charset_is_utf8 || charset_is_ja || charset_is_big5) return (9 <= wc && wc <= 13) || wc == 32; else return (0 <= wc && wc < 256) ? isspace (wc) : 0; @@ -345,7 +358,7 @@ wint_t towupper (wint_t wc) { - if (Charset_is_utf8 || charset_is_ja) + if (Charset_is_utf8 || charset_is_ja || charset_is_big5) return towupper_ucs (wc); else return (0 <= wc && wc < 256) ? toupper (wc) : wc; @@ -353,7 +366,7 @@ wint_t towlower (wint_t wc) { - if (Charset_is_utf8 || charset_is_ja) + if (Charset_is_utf8 || charset_is_ja || charset_is_big5) return towlower_ucs (wc); else return (0 <= wc && wc < 256) ? tolower (wc) : wc; @@ -361,7 +374,7 @@ int iswalnum (wint_t wc) { - if (Charset_is_utf8 || charset_is_ja) + if (Charset_is_utf8 || charset_is_ja || charset_is_big5) return iswalnum_ucs (wc); else return (0 <= wc && wc < 256) ? isalnum (wc) : 0; @@ -402,13 +415,31 @@ return -1; } +int wcwidth_big5(wchar_t ucs) +{ + return wcwidth_ja (ucs); +} + int wcwidth_ucs(wchar_t ucs); int wcwidth (wchar_t wc) { if (!Charset_is_utf8) { - if (!charset_is_ja) + if (charset_is_ja) + { + /* Japanese */ + int k = wcwidth_ja (wc); + if (k != -1) + return k; + } + else if (charset_is_big5) + { + int k = wcwidth_big5 (wc); + if (k != -1) + return k; + } + else { /* 8-bit case */ if (!wc) @@ -418,13 +449,6 @@ else return -1; } - else - { - /* Japanese */ - int k = wcwidth_ja (wc); - if (k != -1) - return k; - } } return wcwidth_ucs (wc); } diff -ruN mutt-1.5.19.orig/mutt.h mutt.h --- mutt-1.5.19.orig/mutt.h 2009-02-11 11:57:36.000000000 +0800 +++ mutt.h 2009-02-11 11:57:40.000000000 +0800 @@ -315,6 +315,7 @@ OPTATTACHSPLIT, OPTAUTOEDIT, OPTAUTOTAG, + OPTBBSISLAME, OPTBEEP, OPTBEEPNEW, OPTBOUNCEDELIVERED, diff -ruN mutt-1.5.19.orig/myiconv.c myiconv.c --- mutt-1.5.19.orig/myiconv.c 1970-01-01 08:00:00.000000000 +0800 +++ myiconv.c 2009-02-11 11:57:40.000000000 +0800 @@ -0,0 +1,167 @@ +/* + * Contributed by Kuang-che Wu + */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include "mutt.h" +#include "charset.h" +#include +#include + + + +#ifdef HAVE_ICONV + +typedef struct myiconv { + iconv_t cd; + int incode,outcode; + int myjob; +} myiconv_t; + +static int is_init; +static void *dlh; +static iconv_t (*old_iconv_open)(const char *tocode, const char *fromcode); +static size_t (*old_iconv)(iconv_t cd, ICONV_CONST char **inbuf, + size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +static int (*old_iconv_close) (iconv_t cd); +static int inst; + +static void init(void) +{ + hz_setup(); + dlh=dlopen("libiconv.so",RTLD_LAZY); + if(dlh) { + old_iconv_open=dlsym(dlh,"iconv_open"); + old_iconv=dlsym(dlh,"iconv"); + old_iconv_close=dlsym(dlh,"iconv_close"); + } + is_init=1; +} + +static size_t myconv(ICONV_CONST char **inbuf, + size_t *inbytesleft, char **outbuf, size_t *outbytesleft) +{ + /* reference to autogb.c */ + int count; + char buff[MAX_BUFFER*3]; + char *pbuf,*ps; + size_t rt=0; + + pbuf=&buff[2]; + + count=*inbytesleft; + if(count>MAX_BUFFER) count=MAX_BUFFER; + memcpy(pbuf,*inbuf,count); + *inbuf+=count; + *inbytesleft-=count; + while(count>0) { + rt+=count; + ps=hz_convert(pbuf,&count,0); + memcpy(*outbuf,ps,count); + *outbuf+=count; *outbytesleft+=count; + pbuf=&buff[2]; + + count=*inbytesleft; + if(count>MAX_BUFFER) count=MAX_BUFFER; + memcpy(pbuf,*inbuf,count); + *inbuf+=count; + *inbytesleft-=count; + } + return rt; +} + +int conv_str(const char* str_code) +{ + int i; + char *str; + struct mapping { + char *code; + int value; + } map[]={ + {"gb2312",GB_CODE}, + {"euccn",GB_CODE}, + {"big5",BIG5_CODE}, + {0,OTHER_CODE}, /* should we handle below cases? */ + {"hz",HZ_CODE}, + {"uni",UNI_CODE}, + {"utf7",UTF7_CODE}, + {"utf8",UTF8_CODE}, + }; + str=strdup(str_code); + if(strchr(str,'/')) + *strchr(str,'/')=0; + for(i=0;map[i].code;i++) + if(mutt_chscmp(str,map[i].code)) + break; + free(str); + return map[i].value; +} + +iconv_t iconv_open (const char *tocode, const char *fromcode) +{ + myiconv_t *mycd=(myiconv_t*)-1; + iconv_t cd; + char *_tocode, *_fromcode; + + _tocode = tocode; + _fromcode = fromcode; + + if (!mutt_strcmp(tocode,"big5")) _tocode = "big5-hkscs"; + if (!mutt_strcmp(fromcode,"big5")) _fromcode = "big5-hkscs"; + + if(!is_init) init(); + if(!old_iconv_open) + return (iconv_t)(-1); + + if((cd=old_iconv_open(_tocode,_fromcode))!=(iconv_t)-1) { + mycd=(myiconv_t*)calloc(1,sizeof(myiconv_t)); + mycd->cd=cd; + mycd->incode=conv_str(fromcode); + mycd->outcode=conv_str(tocode); + /* inst==0 is because: + libhz only has one stack, and + it will destroy all instance's data when setup stack. + + If want to fix, libhz's init func should know which inst. + */ + if(inst==0 && mycd->incode!=mycd->outcode && + hz_search(mycd->incode,mycd->outcode,8)) { + inst++; + mycd->myjob=1; + } + } + return (iconv_t)mycd; +} + +size_t iconv (iconv_t cd, ICONV_CONST char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft) +{ + myiconv_t *mycd=(myiconv_t*)cd; + size_t rt=(size_t)0; + if(mycd->myjob) { + if(!inbuf || !*inbuf || !outbuf || !*outbuf) + hz_search(mycd->incode,mycd->outcode,8); + else + rt=myconv(inbuf,inbytesleft,outbuf,outbytesleft); + } else if(old_iconv) + rt=old_iconv(mycd->cd,inbuf,inbytesleft,outbuf,outbytesleft); + return rt; +} + +int iconv_close (iconv_t cd) +{ + myiconv_t *mycd=(myiconv_t*)cd; + if(!old_iconv_close) + return 0; + old_iconv_close(mycd->cd); + if(mycd->myjob) + inst--; + free(mycd); + return 0; +} + +#endif diff -ruN mutt-1.5.19.orig/pager.c pager.c --- mutt-1.5.19.orig/pager.c 2009-02-11 11:57:36.000000000 +0800 +++ pager.c 2009-02-11 11:57:40.000000000 +0800 @@ -20,6 +20,10 @@ # include "config.h" #endif +/* + * Trad. Chinese support by Michael Hsin + */ + #include "mutt.h" #include "mutt_curses.h" #include "mutt_regex.h" @@ -1055,7 +1059,7 @@ { int space = -1; /* index of the last space or TAB */ int col = option (OPTMARKERS) ? (*lineInfo)[n].continuation : 0; - int ch, vch, k, last_special = -1, special = 0, t; + int ch, vch, k, last_special = -1, special = 0, t = 0, old_t = 0; wchar_t wc; mbstate_t mbstate; @@ -1153,7 +1157,10 @@ { if (wc == ' ') space = ch; + old_t = t; t = wcwidth (wc); + if(t > 1 || old_t > 1) + space = ch; if (col + t > wrap_cols) break; col += t; @@ -1370,6 +1377,7 @@ { buf_ptr = buf + ch; /* skip trailing blanks */ + ch --; while (ch && (buf[ch] == ' ' || buf[ch] == '\t' || buf[ch] == '\r')) ch--; /* a very long word with leading spaces causes infinite wrapping */ diff -ruN mutt-1.5.19.orig/parse.c parse.c --- mutt-1.5.19.orig/parse.c 2009-02-11 11:57:36.000000000 +0800 +++ parse.c 2009-02-11 11:57:54.000000000 +0800 @@ -381,7 +381,10 @@ s++; SKIPWS (s); if ((s = mutt_get_parameter ("filename", (parms = parse_parameters (s))))) - mutt_str_replace (&ct->filename, s); + { + mutt_str_replace (&ct->filename, s); + rfc2047_decode (&ct->filename); + } if ((s = mutt_get_parameter ("name", parms))) ct->form_name = safe_strdup (s); mutt_free_parameter (&parms); diff -ruN mutt-1.5.19.orig/pgp.c pgp.c --- mutt-1.5.19.orig/pgp.c 2009-02-11 11:57:36.000000000 +0800 +++ pgp.c 2009-02-11 11:57:40.000000000 +0800 @@ -1006,7 +1006,7 @@ int empty = 1; pid_t thepid; - convert_to_7bit (a); /* Signed data _must_ be in 7-bit format. */ + if (!option(OPTBBSISLAME)) convert_to_7bit (a); /* Signed data _must_ be in 7-bit format. */ mutt_mktemp (sigfile); if ((fp = safe_fopen (sigfile, "w")) == NULL) diff -ruN mutt-1.5.19.orig/po/zh_TW.po po/zh_TW.po --- mutt-1.5.19.orig/po/zh_TW.po 2009-02-11 11:57:36.000000000 +0800 +++ po/zh_TW.po 2009-02-11 11:57:40.000000000 +0800 @@ -1777,7 +1777,7 @@ "~w 檔案\t\t將訊息寫入檔案\n" "~x\t\t停止修改並離開編輯器\n" "~?\t\t這訊息\n" -".\t\t如果是一行裏的唯一字符,則代表結束輸入\n" +".\t\t如果是一行裡的唯一字符,則代表結束輸入\n" #: edit.c:52 #, fuzzy @@ -1809,7 +1809,7 @@ "~w 檔案\t\t將訊息寫入檔案\n" "~x\t\t停止修改並離開編輯器\n" "~?\t\t這訊息\n" -".\t\t如果是一行裏的唯一字符,則代表結束輸入\n" +".\t\t如果是一行裡的唯一字符,則代表結束輸入\n" #: edit.c:188 #, c-format @@ -1818,7 +1818,7 @@ #: edit.c:330 msgid "(End message with a . on a line by itself)\n" -msgstr "(在一行裏輸入一個 . 符號來結束信件)\n" +msgstr "(在一行裡輸入一個 . 符號來結束信件)\n" #: edit.c:389 msgid "No mailbox.\n" @@ -4565,7 +4565,7 @@ #: ../keymap_alldefs.h:43 msgid "rename/move an attached file" -msgstr "更改檔名∕移動 已被附帶的檔案" +msgstr "更改檔名/移動 已被附帶的檔案" #: ../keymap_alldefs.h:44 msgid "send the message" @@ -4573,7 +4573,7 @@ #: ../keymap_alldefs.h:45 msgid "toggle disposition between inline/attachment" -msgstr "切換 合拼∕附件式 觀看模式" +msgstr "切換 合拼/附件式 觀看模式" #: ../keymap_alldefs.h:46 msgid "toggle whether to delete file after sending it" @@ -5183,11 +5183,11 @@ #: ../keymap_alldefs.h:195 msgid "Select the previous element of the chain" -msgstr "選擇鏈結裏對上一個部份" +msgstr "選擇鏈結裡對上一個部份" #: ../keymap_alldefs.h:196 msgid "Select the next element of the chain" -msgstr "選擇鏈結裏跟著的一個部份" +msgstr "選擇鏈結裡跟著的一個部份" #: ../keymap_alldefs.h:197 msgid "send the message through a mixmaster remailer chain" diff -ruN mutt-1.5.19.orig/sendlib.c sendlib.c --- mutt-1.5.19.orig/sendlib.c 2009-02-11 11:57:36.000000000 +0800 +++ sendlib.c 2009-02-11 11:57:40.000000000 +0800 @@ -2289,7 +2289,7 @@ rfc2047_encode_adrlist (env->reply_to, "Reply-To"); rfc2047_encode_string (&env->x_label); - if (env->subject) + if (env->subject && !option(OPTBBSISLAME)) { rfc2047_encode_string (&env->subject); }