# HG changeset patch # User kono # Date 1133597166 -32400 # Node ID 47d488958a4cdde387068fb905eb874ff933b988 # Parent 6bc439d68ff90c793fec670d6a11051068402d57 support contents-encoding in mhl. diff -r 6bc439d68ff9 -r 47d488958a4c config/version --- a/config/version Wed Apr 20 14:39:40 2005 +0900 +++ b/config/version Sat Dec 03 17:06:06 2005 +0900 @@ -1,1 +1,1 @@ -6.8.3.34 +6.8.3.65 diff -r 6bc439d68ff9 -r 47d488958a4c config/version.c --- a/config/version.c Wed Apr 20 14:39:40 2005 +0900 +++ b/config/version.c Sat Dec 03 17:06:06 2005 +0900 @@ -1,5 +1,5 @@ #ifndef JAPAN -char *version = "@(#)MH 6.8.3 #34[UCI] (leo.ie.u-ryukyu.ac.jp) of Wed Apr 20 14:24:42 JST 2005"; +char *version = "@(#)MH 6.8.3 #65[UCI] (leo.ie.u-ryukyu.ac.jp) of Sat Dec 3 17:04:36 JST 2005"; #else /* JAPAN */ -char *version = "@(#)MH 6.8.3.JP-pre3.05-20010615 #34[UCI] (leo.ie.u-ryukyu.ac.jp) of Wed Apr 20 14:24:43 JST 2005"; +char *version = "@(#)MH 6.8.3.JP-pre3.05-20010615 #65[UCI] (leo.ie.u-ryukyu.ac.jp) of Sat Dec 3 17:04:36 JST 2005"; #endif /* JAPAN */ diff -r 6bc439d68ff9 -r 47d488958a4c doc/version.rf --- a/doc/version.rf Wed Apr 20 14:39:40 2005 +0900 +++ b/doc/version.rf Sat Dec 03 17:06:06 2005 +0900 @@ -1,1 +1,1 @@ -.ds MH 6.8.3 #34[UCI] +.ds MH 6.8.3 #65[UCI] diff -r 6bc439d68ff9 -r 47d488958a4c h/mh.h --- a/h/mh.h Wed Apr 20 14:39:40 2005 +0900 +++ b/h/mh.h Sat Dec 03 17:06:06 2005 +0900 @@ -383,6 +383,7 @@ void ml_pretty_fputs (); void junet_fputs (); char *ml_conv (); +char *ml_conv_decode (); #endif /* JAPAN */ #ifdef MIME_HEADERS char *exthdr_encode (); diff -r 6bc439d68ff9 -r 47d488958a4c sbr/ml_codeconv.c --- a/sbr/ml_codeconv.c Wed Apr 20 14:39:40 2005 +0900 +++ b/sbr/ml_codeconv.c Sat Dec 03 17:06:06 2005 +0900 @@ -35,6 +35,17 @@ ((0xe0 <= (c)) && ((c) <= 0xfc))) #define IS_SJIS2(c) ((0x40 <= (c)) && ((c) <= 0xfc) && ((c) != 0x7f)) +/* encoding (mhn) */ + +#define CE_UNKNOWN 0x00 +#define CE_BASE64 0x01 +#define CE_QUOTED 0x02 +#define CE_8BIT 0x03 +#define CE_7BIT 0x04 +#define CE_BINARY 0x05 +#define CE_EXTENSION 0x06 +#define CE_EXTERNAL 0x07 /* for external-body */ + /* hold coding system information */ static coding_system_t ml_coding_info[CSL_SIZE] = { CS_DEFAULT, CS_DEFAULT, CS_DEFAULT }; @@ -60,17 +71,17 @@ static int nkf_output_ctr; static int nkf_limit; static int nkf_ilimit; -static void (*nkf_flush)(char *,int); +static void (*nkf_flush)(unsigned char *,int); -static void nkf_open(char *opt, char *in,int ilimit, - char *out,int limit,void (*flush)(char *,int),FILE *fp); -static void nkf_continue(char *in,int ilimit); +static void nkf_open(unsigned char *opt, unsigned char *in,int ilimit, + unsigned char *out,int limit,void (*flush)(unsigned char *,int),FILE *fp); +static void nkf_continue(unsigned char *in,int ilimit) ; static void nkf_end() ; -static void none(char *a,int b); +static void none(unsigned char *a,int b); -static void my_flush(char *out,int out_count); -static void extend(char *out,int out_count); -static void my_pretty(char *out,int out_count); +static void my_flush(unsigned char *out,int out_count); +static void extend(unsigned char *out,int out_count); +static void my_pretty(unsigned char *out,int out_count); static FILE *nkf_file; @@ -260,7 +271,7 @@ FILE *stream; int pretty; { - nkf_open("-w80",scanlk,-1,buf,BUFSIZ,pretty?my_pretty: my_flush,stream); + nkf_open((unsigned char *)"-w80",(unsigned char *)scanlk,-1,(unsigned char *)buf,BUFSIZ,pretty?my_pretty: my_flush,stream); nkf_end(); } @@ -405,7 +416,21 @@ if ((s == NULL) || ((coding = CSL_FILE(ml_coding_info)) == CS_NOCONV)) return(s); - ml_conv_sbr(s, coding); + ml_conv_sbr(s, coding, CE_UNKNOWN); + return(s); +} + +char * +ml_conv_decode(s,encode) + char *s; + int encode; +{ + coding_system_t coding; + + if ((s == NULL) || ((coding = CSL_FILE(ml_coding_info)) == CS_NOCONV)) + return(s); + + ml_conv_sbr(s, coding, encode); return(s); } @@ -424,11 +449,30 @@ case CS_UTF8: return "-w80"; case CS_NOCONV: return "-t"; } + return "-t"; } static char * -cs_input_opt(int cs) +cs_input_opt(int cs, int encode) { + switch(encode) { + case CE_BASE64: + switch(cs) { + case CS_JIS7: return "-JemB"; + case CS_JEUC: return "-EemB"; + case CS_SJIS: return "-SemB"; + case CS_UTF8: return "-W8emB"; + case CS_NOCONV: return "-t"; + } + case CE_QUOTED: + switch(cs) { + case CS_JIS7: return "-JemQ"; + case CS_JEUC: return "-EemQ"; + case CS_SJIS: return "-SemQ"; + case CS_UTF8: return "-W8emQ"; + case CS_NOCONV: return "-t"; + } + } switch(cs) { case CS_JIS7: return "-Je"; case CS_JEUC: return "-Ee"; @@ -436,16 +480,18 @@ case CS_UTF8: return "-W8e"; case CS_NOCONV: return "-t"; } + return "-e"; } static void -ml_conv_sbr(in, cs) +ml_conv_sbr(in, cs, encode) char *in; coding_system_t cs; + int encode; { - char *opt = cs_input_opt(cs); + char *opt = cs_input_opt(cs,encode); int len = strlen(in); - nkf_open(opt,in,len,in,len,extend,0); + nkf_open((unsigned char *)opt,(unsigned char *)in,len,(unsigned char *)in,len,extend,0); nkf_end(); nkf_output[nkf_output_ctr]=0; } @@ -454,7 +500,7 @@ mime_convert(char *ptr) { int len = strlen(ptr); - nkf_open("-me",ptr,len,ptr,len,extend,0); + nkf_open((unsigned char *)"-me",(unsigned char *)ptr,len,(unsigned char *)ptr,len,extend,0); nkf_end(); nkf_output[nkf_output_ctr]=0; } @@ -528,8 +574,8 @@ */ static void -nkf_open(char *opt, char *in,int ilimit, - char *out,int limit,void (*flush)(char *,int),FILE *fp) { +nkf_open(unsigned char *opt, unsigned char *in,int ilimit, + unsigned char *out,int limit,void (*flush)(unsigned char *,int),FILE *fp) { /* Flags are reset at each call. */ reinit(); @@ -553,7 +599,7 @@ } static void -nkf_continue(char *in,int ilimit) { +nkf_continue(unsigned char *in,int ilimit) { nkf_input_ctr = 0; nkf_input = in; nkf_ilimit = ilimit; @@ -570,24 +616,24 @@ } static void -extend(char *out,int out_count) +extend(unsigned char *out,int out_count) { nkf_output += nkf_output_ctr; } static void -none(char *a,int b) +none(unsigned char *a,int b) { } static void -my_flush(char *out,int out_count) +my_flush(unsigned char *out,int out_count) { fwrite(out,out_count,1,nkf_file); } static void -my_pretty(char *out,int out_count) +my_pretty(unsigned char *out,int out_count) { int c; FILE *fp = nkf_file; diff -r 6bc439d68ff9 -r 47d488958a4c uip/.gdb_history --- a/uip/.gdb_history Wed Apr 20 14:39:40 2005 +0900 +++ b/uip/.gdb_history Sat Dec 03 17:06:06 2005 +0900 @@ -1,83 +1,256 @@ -quit -b fcc -run /tmp/ahoaho -l -quit -b fcc -run /tmp/ahoaho -l -l -l -p fileproc -whatis fileproc -b 2542 -c -quit -l fcc -l -l -l -l -b 2549 -run /tmp/ahoaho -l -p status -quit +run /tmp/draft.1 +b main +run +b main +l main +run +q +b main +run +l main +b 408 +run /tmp/draft.1 +run -junet /tmp/draft.1 +b ml_conv run q -run -where -up -q -show -q -run -p nkf_file +l main +b main +run -junet /tmp/draft.1 q -run show -l -quit -show -run -l -quit +run -junet /tmp/draft.1 +b main +run -junet /tmp/draft.1 +file xmhn +l main +b main +run -junet /tmp/draft.1 q +b main +run /tmp/draft.1 q -run -l -q +b main run -l q +b main run -l -where -up -down +q l -p nkf_output_ctr -p nkf_output -p nkf_file -p nkf_flush -b nkf_open +b main +run +b printf +run +q +b main run -c +q +b main run -up -l +exit q -b nkf_open -b open_nkf +b main +run +exit +q b main run q -b nkf_open +b main +b ml_conv +run /tmp/draft.1 +c +c +n +p codeing +p coding +l +p ml_coding_info +up +l +where +n +p s +c +c +run +run -auto -headers -junet /tmp/draft.1 +c +p ml_coding_info +c +where +s +s +n +p opt +n +run +c +n +n +p s +c +b ml_puts +b ml_fputs +c +c +b fputs +run +p argv[1] +c +c run c -ls -b main -run -info b +where +up +l +tb putc +c +b jis7_fputs +up +c +d 4 +c +c +c +c +c +c +c +c +n +n +c +q +b exthdr_encode +run -auto -headers -junet /tmp/draft.1 +c +n +n +o component +p component +p p +p *p +n +n +n +n +p input +p width +p output +s +n +n +s +s +p pp +l +n +n +n +n +n +n +n +p ip +p *ip +p (void*)*ip +n +n +n +n +n +n +n +s +n c c q +b ml_conv_decode +l ml_conv_decode +q +l ml_conv_decode +l ml_conv +l main +q +b main +run -form mhl.news /Users/kono/Mail/inspire/103 +b ml_conv_decode +c +s +q +l ml_conv +l process +b 972 +run -form mhl.news /Users/kono/Mail/inspire/103 +n +p cp +n +ru +p buf +n +p cp +p buf +n +p cp +q +b 972 +l process +b 972 +run -form mhl.news /Users/kono/Mail/inspire/103 +n +n +s +n +l +up +s +n +p cp +n +n +p cp +n +n +p content_encoding +p (int)content_encoding +b ml_conv_decode +c +n +p coding +where +l ml_conv_svr +l ml_conv_sbr +up +l +p content_encoding +p (int)content_encoding +down +l +s +l +q +b ml_conv_decode +run -form mhl.news /Users/kono/Mail/inspire/103 +n +p encode +n +run +n +s +s +s +n +p opt +run +s +p encode +s +p encode +l +p cs +s +s +l +p opt +q diff -r 6bc439d68ff9 -r 47d488958a4c uip/mhlsbr.c --- a/uip/mhlsbr.c Wed Apr 20 14:39:40 2005 +0900 +++ b/uip/mhlsbr.c Sat Dec 03 17:06:06 2005 +0900 @@ -233,6 +233,56 @@ NULL }; +/* from mhn */ + +static int content_encoding; /* internal form */ +#define CE_UNKNOWN 0x00 +#define CE_BASE64 0x01 +#define CE_QUOTED 0x02 +#define CE_8BIT 0x03 +#define CE_7BIT 0x04 +#define CE_BINARY 0x05 +#define CE_EXTENSION 0x06 +#define CE_EXTERNAL 0x07 /* for external-body */ + +#define ENCODING_FIELD "Content-Transfer-Encoding" + +struct str2init { + char *mhnsi_key; + int mhnsi_value; +}; + +static struct str2init str2ces[] = { + {"base64", CE_BASE64}, + {"quoted-printable", CE_QUOTED}, + {"8bit", CE_8BIT}, + {"7bit", CE_7BIT}, + {"binary", CE_BINARY}, + + {NULL, CE_EXTENSION}, + {NULL, CE_UNKNOWN}, +}; + +#define istoken(c) \ + (!isspace (c) \ + && !iscntrl (c) \ + && !((c) & 0x80) \ + && (c) != '(' \ + && (c) != ')' \ + && (c) != '<' \ + && (c) != '>' \ + && (c) != '@' \ + && (c) != ',' \ + && (c) != ';' \ + && (c) != ':' \ + && (c) != '\\' \ + && (c) != '"' \ + && (c) != '/' \ + && (c) != '[' \ + && (c) != ']' \ + && (c) != '?' \ + && (c) != '=') + /* */ static int bellflg = 0; @@ -907,9 +957,49 @@ /* */ for (state = FLD;;) + next: switch (state = m_getfld (state, name, buf, sizeof buf, fp)) { case FLD: case FLDPLUS: +#ifdef ENCODING_FIELD + /* form mhn */ + if (uleq (name, ENCODING_FIELD)) { + char *cp, + *dp; + char c; + register struct str2init *s2i; + + cp = add (buf, NULLCP); + while (state == FLDPLUS) { + state = m_getfld (state, name, buf, sizeof buf, fp); + cp = add (buf, cp); + } + while (isspace (*cp)) + cp++; + for (dp = index (cp, '\n'); dp; dp = index (dp, '\n')) + *dp++ = ' '; + if (*cp == '(' ) { /* comment */ + int i; + for (i = 1;i;) { + switch (*cp++) { + case '(': i++; break; + case ')': --i; break; + case '\\': if ((*cp++) != '\0') break; + case '\0': goto next; + } + } + } + for (dp = cp; istoken (*dp); dp++); + c = *dp, *dp = '\0'; + for (s2i = str2ces; s2i -> mhnsi_key; s2i++) + if (uleq (cp, s2i -> mhnsi_key)) + break; + if (!s2i -> mhnsi_key && !uprf (cp, "X-")) + s2i++; + *dp = c; + content_encoding = s2i -> mhnsi_value; + } +#endif for (ip = ignores; *ip; ip++) if (uleq (name, *ip)) { while (state == FLDPLUS) @@ -988,7 +1078,7 @@ } else { strcpy(buf, ++cp); *cp = 0; - (void) ml_conv(holder.c_text); + (void) ml_conv_decode(holder.c_text,content_encoding); /* putcomp() may change the address of holder.c_text */ putcomp(c1, &holder, BODYCOMP); @@ -1005,7 +1095,7 @@ holder.c_text + buflen - cp, fp); } - (void) ml_conv(holder.c_text); + (void) ml_conv_decode(holder.c_text,content_encoding); putcomp(c1, &holder, BODYCOMP); #else /* JAPAN */ while (state == BODY) {