Common subdirectories: nkf-208c-071010/NKF.mod and nkf-208c-071101/NKF.mod Common subdirectories: nkf-208c-071010/man and nkf-208c-071101/man Only in nkf-208c-071101/: nkf diff -au nkf-208c-071010/nkf.c nkf-208c-071101/nkf.c --- nkf-208c-071010/nkf.c 2007-10-11 04:35:39.000000000 +0900 +++ nkf-208c-071101/nkf.c 2007-11-02 14:31:27.000000000 +0900 @@ -223,6 +223,9 @@ ('a'<=c&&c<='f') ? (c-'a'+10) : 0) #define bin2hex(c) ("0123456789ABCDEF"[c&15]) #define is_eucg3(c2) (((unsigned short)c2 >> 8) == SS3) +#define nkf_noescape_mime(c) ((c == CR) || (c == LF) || \ + ((c > SP) && (c < DEL) && (c != '?') && (c != '=') && (c != '_') \ + && (c != '.') && (c != 0x22))) #define CP932_TABLE_BEGIN 0xFA #define CP932_TABLE_END 0xFC @@ -606,6 +609,7 @@ input_mode = ASCII, /* input kanji mode */ shift_mode = FALSE; /* TRUE shift out, or X0201 */ static int mime_decode_mode = FALSE; /* MIME mode B base64, Q hex */ +static int mime_output_mode = ASCII; /* specify mime codeset */ /* X0201 / X0208 conversion tables */ @@ -2550,6 +2554,7 @@ input_mode = ASCII; output_mode = ASCII; + mime_output_mode = ASCII; shift_mode = FALSE; #define NEXT continue /* no output, get next */ @@ -3861,12 +3866,15 @@ if (c2 == 0) { output_mode = ASCII; + mime_output_mode = UTF8; (*o_putc)(c1); } else if (c2 == ISO8859_1) { output_mode = ISO8859_1; + mime_output_mode = UTF8; (*o_putc)(c1 | 0x080); } else { output_mode = UTF8; + mime_output_mode = UTF8; val = e2w_conv(c2, c1); if (val){ w16w_conv(val, &c2, &c1, &c0); @@ -4020,16 +4028,20 @@ return; } else if (c2 == 0) { output_mode = ASCII; + mime_output_mode = JAPANESE_EUC; (*o_putc)(c1); } else if (c2 == X0201) { output_mode = JAPANESE_EUC; + mime_output_mode = JAPANESE_EUC; (*o_putc)(SSO); (*o_putc)(c1|0x80); } else if (c2 == ISO8859_1) { output_mode = ISO8859_1; + mime_output_mode = ISO8859_1; (*o_putc)(c1 | 0x080); #ifdef X0212_ENABLE } else if (is_eucg3(c2)){ output_mode = JAPANESE_EUC; + mime_output_mode = JAPANESE_EUC; #ifdef SHIFTJIS_CP932 if (!cp932inv_f){ nkf_char s2, s1; @@ -4040,14 +4052,17 @@ #endif if (c2 == 0) { output_mode = ASCII; + mime_output_mode = JAPANESE_EUC; (*o_putc)(c1); }else if (is_eucg3(c2)){ + mime_output_mode = JAPANESE_EUC; if (x0212_f){ (*o_putc)(0x8f); (*o_putc)((c2 & 0x7f) | 0x080); (*o_putc)(c1 | 0x080); } }else{ + mime_output_mode = JAPANESE_EUC; /* extra care */ (*o_putc)((c2 & 0x7f) | 0x080); (*o_putc)(c1 | 0x080); } @@ -4058,6 +4073,7 @@ return; /* too late to rescue this char */ } output_mode = JAPANESE_EUC; + mime_output_mode = JAPANESE_EUC; (*o_putc)(c2 | 0x080); (*o_putc)(c1 | 0x080); } @@ -4163,16 +4179,20 @@ return; } else if (c2 == 0) { output_mode = ASCII; + mime_output_mode = SHIFT_JIS; (*o_putc)(c1); } else if (c2 == X0201) { output_mode = SHIFT_JIS; + mime_output_mode = SHIFT_JIS; (*o_putc)(c1|0x80); } else if (c2 == ISO8859_1) { output_mode = ISO8859_1; + mime_output_mode = ISO8859_1; (*o_putc)(c1 | 0x080); #ifdef X0212_ENABLE } else if (is_eucg3(c2)){ output_mode = SHIFT_JIS; + mime_output_mode = SHIFT_JIS; if (e2s_conv(c2, c1, &c2, &c1) == 0){ (*o_putc)(c2); (*o_putc)(c1); @@ -4184,6 +4204,7 @@ return; /* too late to rescue this char */ } output_mode = SHIFT_JIS; + mime_output_mode = SHIFT_JIS; e2s_conv(c2, c1, &c2, &c1); #ifdef SHIFTJIS_CP932 @@ -4225,6 +4246,7 @@ } #endif if (c2 == EOF) { + mime_output_mode = X0208; if (output_mode !=ASCII && output_mode!=ISO8859_1) { (*o_putc)(ESC); (*o_putc)('('); @@ -4234,6 +4256,7 @@ (*o_putc)(EOF); #ifdef X0212_ENABLE } else if (is_eucg3(c2)){ + mime_output_mode = X0208; if(x0213_f){ if(output_mode!=X0213_2){ output_mode = X0213_2; @@ -4255,6 +4278,7 @@ (*o_putc)(c1); #endif } else if (c2==X0201) { + mime_output_mode = X0208; if (output_mode!=X0201) { output_mode = X0201; (*o_putc)(ESC); @@ -4267,8 +4291,10 @@ /* Can we convert in 7bit form using ESC-'-'-A ? Is this popular? */ output_mode = ISO8859_1; + mime_output_mode = ISO8859_1; (*o_putc)(c1|0x80); } else if (c2 == 0) { + mime_output_mode = X0208; if (output_mode !=ASCII && output_mode!=ISO8859_1) { (*o_putc)(ESC); (*o_putc)('('); @@ -4280,6 +4306,7 @@ if(ms_ucs_map_f ? c2<0x20 || 0x92 66){ + (*o_base64conv)(EOF,0); + (*o_base64conv)(0,LF); + (*o_base64conv)(0,SP); + } }/*else if (mime_lastchar2){ if (c1 <=DEL && !nkf_isspace(c1)){ (*o_base64conv)(0,SP); @@ -5801,9 +5834,20 @@ (*o_mputc)(SP); base64_count++; } - } - (*o_mputc)(c); - base64_count++; + } else { + if (base64_count > 70) { + close_mime(); + (*o_mputc)(LF); + base64_count = 0; + open_mime(mime_output_mode); + } + if (!nkf_noescape_mime(c)) { + mimeout_addchar(c); + return; + } + } + (*o_mputc)(c); + base64_count++; } return; } @@ -5843,7 +5887,7 @@ } mimeout_buf[mimeout_buf_count++] = (char)c; if (mimeout_buf_count>MIMEOUT_BUF_LENGTH) { - open_mime(output_mode); + open_mime(mime_output_mode); } } return; @@ -5863,7 +5907,7 @@ mimeout_buf[0] = SP; mimeout_buf_count = 1; } - open_mime(output_mode); + open_mime(mime_output_mode); } }else{ /* mimeout_mode == 'B', 1, 2 */ @@ -5882,6 +5926,8 @@ base64_count = 0; mimeout_buf_count = 0; } + mimeout_buf[mimeout_buf_count++] = (char)c; + return; } if (c==SP || c==TAB || c==CR || c==LF) { for (i=0;i0 && SPMIMEOUT_BUF_LENGTH) { @@ -5932,7 +5978,7 @@ for (;i