** E-Mail: furukawa@tcp-ip.or.jp
** \e$B$^$G8fO"Mm$r$*4j$$$7$^$9!#\e(B
***********************************************************************/
-/* $Id: nkf.c,v 1.51 2004/12/31 17:19:43 naruse Exp $ */
+/* $Id: nkf.c,v 1.56 2005/02/02 17:52:31 naruse Exp $ */
#define NKF_VERSION "2.0.4"
#define NKF_RELEASE_DATE "2005-01-01"
#include "config.h"
int j;
p = (unsigned char *)long_option[i].name;
for (j=0;*p && (*p != '=') && *p == cp[j];p++, j++);
- if (!*p || *p == cp[j]){
+ if (*p == cp[j]){
p = &cp[j];
break;
}
return 0;
}
+#ifdef CHECK_OPTION
+static int (*iconv_for_check)() = 0;
+#endif
+
#ifdef ANSI_C_PROTOTYPE
void set_iconv(int f, int (*iconv_func)(int c2,int c1,int c0))
#else
int (*iconv_func)();
#endif
{
-#ifdef CHECK_OPTION
- static int (*iconv_for_check)() = 0;
-#endif
#ifdef INPUT_CODE_FIX
if (f || !input_f)
#endif
/* second byte */
if (c2 > DEL) {
/* in case of 8th bit is on */
- if (!estab_f) {
+ if (!estab_f&&!mime_decode_mode) {
/* in case of not established yet */
/* It is still ambiguious */
if (h_conv(f, c2, c1)==EOF)
}
mime_decode_mode = p[i-2];
+ set_iconv(FALSE, mime_priority_func[j]);
clr_code_score(find_inputcode_byfunc(mime_priority_func[j]), SCORE_iMIME);
if (mime_decode_mode=='B') {
{
switch(mimeout_mode) {
case 'Q':
- if(c>=DEL) {
+ if(c==SPACE){
+ (*o_mputc)('_');
+ base64_count++;
+ } else if (c==CR||c==NL) {
+ (*o_mputc)(c);
+ base64_count = 0;
+ } else if(c<SPACE||c=='='||c=='?'||c=='_'||DEL<=c) {
(*o_mputc)('=');
(*o_mputc)(itoh4(((c>>4)&0xf)));
(*o_mputc)(itoh4((c&0xf)));
mimeout_mode='B';
base64_count += 2;
break;
+ default:
+ (*o_mputc)(c);
+ base64_count++;
+ break;
}
}
int i = 0;
int j = 0;
- if (mimeout_f==FIXED_MIME && base64_count>50) {
- eof_mime();
- (*o_mputc)(NL);
+ if (mimeout_f==FIXED_MIME && base64_count>71) {
+ if (mimeout_mode=='Q') {
+ if (c!=CR && c!=NL) {
+ (*o_mputc)('=');
+ (*o_mputc)(NL);
+ }
+ } else {
+ eof_mime();
+ (*o_mputc)(NL);
+ }
base64_count=0;
- } else if (mimeout_f!=FIXED_MIME && (c==CR||c==NL)) {
+ } else if (mimeout_f!=FIXED_MIME && !mimeout_mode && (c==CR||c==NL)) {
base64_count=0;
}
if (c!=EOF && mimeout_f!=FIXED_MIME) {
base64_count++;
return;
} else if (mimeout_mode) {
- if (base64_count>63) {
- eof_mime();
- (*o_mputc)(NL);
- (*o_mputc)(SPACE);
- base64_count=1;
- mimeout_preserve_space = TRUE;
+ if (mimeout_buf_count>0
+ && (mimeout_buf[mimeout_buf_count-1]==CR || mimeout_buf[mimeout_buf_count-1]==NL)) {
+ if (c==SPACE || c==TAB) {
+ for (i=0;i<mimeout_buf_count;i++) {
+ mimeout_addchar(mimeout_buf[i]);
+ }
+ mimeout_buf_count = 0;
+ } else if (SPACE<c && c<DEL) {
+ eof_mime();
+ for (i=0;i<mimeout_buf_count;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ }
+ base64_count = 0;
+ mimeout_buf_count = 0;
+ }
}
if (c==SPACE || c==TAB || c==CR || c==NL) {
for (i=0;i<mimeout_buf_count;i++) {
mimeout_buf[mimeout_buf_count++] = c;
if (mimeout_buf_count>MIMEOUT_BUF_LENGTH) {
eof_mime();
- base64_count = 0;
for (i=0;i<mimeout_buf_count;i++) {
(*o_mputc)(mimeout_buf[i]);
base64_count++;
}
+ mimeout_buf_count = 0;
}
return;
}
- if (mimeout_buf_count>0 && SPACE<c) {
+
+ if (mimeout_buf_count>0 && SPACE<c && c!='=') {
mimeout_buf[mimeout_buf_count++] = c;
if (mimeout_buf_count>MIMEOUT_BUF_LENGTH) {
- } else {
- return;
+ j = mimeout_buf_count;
+ mimeout_buf_count = 0;
+ for (i=0;i<j;i++) {
+ mimeout_addchar(mimeout_buf[i]);
+ }
}
+ return;
}
} else if (!mimeout_mode) {
if (c==SPACE || c==TAB || c==CR || c==NL) {
}
} else if (c == EOF) { /* c==EOF */
j = mimeout_buf_count;
+ mimeout_buf_count = 0;
i = 0;
for (;i<j;i++) {
if (mimeout_buf[i]==SPACE || mimeout_buf[i]==TAB
|| mimeout_buf[i]==CR || mimeout_buf[i]==NL)
break;
- (*mime_putc)(mimeout_buf[i]);
+ mimeout_addchar(mimeout_buf[i]);
}
eof_mime();
for (;i<j;i++) {
j = mimeout_buf_count;
mimeout_buf_count = 0;
for (i=0;i<j;i++) {
+ if (mimeout_buf[i]==CR || mimeout_buf[i]==NL)
+ break;
mimeout_addchar(mimeout_buf[i]);
}
+ if (i<j) {
+ eof_mime();
+ base64_count=0;
+ for (;i<j;i++) {
+ (*o_mputc)(mimeout_buf[i]);
+ }
+ open_mime(output_mode);
+ }
}
mimeout_addchar(c);
}
broken_counter = 0;
broken_last = 0;
z_prev2=0,z_prev1=0;
-
+#ifdef CHECK_OPTION
+ iconv_for_check = 0;
+#endif
}
#endif