OSDN Git Service

* Fix: mime_encode test.
[nkf/nkf.git] / nkf.c
diff --git a/nkf.c b/nkf.c
index 4cdf9ef..3c87333 100644 (file)
--- a/nkf.c
+++ b/nkf.c
@@ -30,9 +30,9 @@
  * \e$B8=:_!"\e(Bnkf \e$B$O\e(B SorceForge \e$B$K$F%a%s%F%J%s%9$,B3$1$i$l$F$$$^$9!#\e(B
  * http://sourceforge.jp/projects/nkf/
 ***********************************************************************/
-/* $Id: nkf.c,v 1.145 2007/11/02 21:40:15 naruse Exp $ */
+/* $Id: nkf.c,v 1.148 2007/11/06 12:09:44 naruse Exp $ */
 #define NKF_VERSION "2.0.8"
-#define NKF_RELEASE_DATE "2007-11-03"
+#define NKF_RELEASE_DATE "2007-11-06"
 #define COPY_RIGHT \
     "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW\n" \
     "Copyright (C) 2002-2007 Kono, Furukawa, Naruse, mastodon"
@@ -225,7 +225,7 @@ void  djgpp_setbinmode(FILE *fp)
 #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)))
+     && (c != '(') && (c != ')') && (c != '.') && (c != 0x22)))
 
 #define CP932_TABLE_BEGIN 0xFA
 #define CP932_TABLE_END   0xFC
@@ -532,7 +532,7 @@ struct input_code input_code_list[] = {
     {0}
 };
 
-static int              mimeout_mode = 0;
+static int              mimeout_mode = 0; /* 0, -1, 'Q', 'B', 1, 2 */
 static int              base64_count = 0;
 
 /* X0208 -> ASCII converter */
@@ -3866,7 +3866,7 @@ void w_oconv(nkf_char c2, nkf_char c1)
        output_mode = ASCII;
         (*o_putc)(c1);
     } else if (c2 == ISO8859_1) {
-       output_mode = ISO8859_1;
+       output_mode = UTF8;
         (*o_putc)(c1 | 0x080);
     } else {
         output_mode = UTF8;
@@ -5541,13 +5541,15 @@ nkf_char base64decode(nkf_char c)
     if (c > '@') {
         if (c < '[') {
             i = c - 'A';                        /* A..Z 0-25 */
+       } else if (c == '_') {
+           i = '?'         /* 63 */ ;          /* _  63 */
         } else {
             i = c - 'G'     /* - 'a' + 26 */ ;  /* a..z 26-51 */
        }
     } else if (c > '/') {
         i = c - '0' + '4'   /* - '0' + 52 */ ;  /* 0..9 52-61 */
-    } else if (c == '+') {
-        i = '>'             /* 62 */ ;          /* +  62 */
+    } else if (c == '+' || c == '-') {
+        i = '>'             /* 62 */ ;          /* + and -  62 */
     } else {
         i = '?'             /* 63 */ ;          /* / 63 */
     }
@@ -5561,7 +5563,6 @@ static nkf_char b64c;
 #define MIMEOUT_BUF_LENGTH (60)
 char mimeout_buf[MIMEOUT_BUF_LENGTH+1];
 int mimeout_buf_count = 0;
-int mimeout_preserve_space = 0;
 
 void open_mime(nkf_char mode)
 {
@@ -5576,7 +5577,6 @@ void open_mime(nkf_char mode)
        }
     }
     mimeout_mode = mime_encode_method[i];
-
     i = 0;
     if (base64_count>45) {
        if (mimeout_buf_count>0 && nkf_isblank(mimeout_buf[i])){
@@ -5586,25 +5586,21 @@ void open_mime(nkf_char mode)
        (*o_mputc)(LF);
        (*o_mputc)(SP);
        base64_count = 1;
-       if (!mimeout_preserve_space && mimeout_buf_count>0
+       if (mimeout_buf_count>0
            && (mimeout_buf[i]==SP || mimeout_buf[i]==TAB
                || mimeout_buf[i]==CR || mimeout_buf[i]==LF)) {
            i++;
        }
     }
-    if (!mimeout_preserve_space) {
-       for (;i<mimeout_buf_count;i++) {
-           if (mimeout_buf[i]==SP || mimeout_buf[i]==TAB
-               || mimeout_buf[i]==CR || mimeout_buf[i]==LF) {
-               (*o_mputc)(mimeout_buf[i]);
-               base64_count ++;
-           } else {
-               break;
-           }
+    for (;i<mimeout_buf_count;i++) {
+       if (mimeout_buf[i]==SP || mimeout_buf[i]==TAB
+           || mimeout_buf[i]==CR || mimeout_buf[i]==LF) {
+           (*o_mputc)(mimeout_buf[i]);
+           base64_count ++;
+       } else {
+           break;
        }
     }
-    mimeout_preserve_space = FALSE;
-
     while(*p) {
         (*o_mputc)(*p++);
         base64_count ++;
@@ -5642,7 +5638,7 @@ void eof_mime(void)
        base64_count += 2;
        break;
     }
-    if (mimeout_mode) {
+    if (mimeout_mode > 0) {
        if (mimeout_f!=FIXED_MIME) {
            close_mime();
        } else if (mimeout_mode != 'Q')
@@ -5696,38 +5692,34 @@ void mimeout_addchar(nkf_char c)
 
 void mime_prechar(nkf_char c2, nkf_char c1)
 {
-    if (mimeout_mode){
+    if (mimeout_mode > 0){
         if (c2 == EOF){
             if (base64_count + mimeout_buf_count/3*4> 73){
                 (*o_base64conv)(EOF,0);
                 (*o_base64conv)(0,LF);
                 (*o_base64conv)(0,SP);
-            }
-        } else if (c2){
-            if (base64_count + mimeout_buf_count/3*4> 66){
-                (*o_base64conv)(EOF,0);
-                (*o_base64conv)(0,LF);
-                (*o_base64conv)(0,SP);
+                base64_count = 1;
             }
         } else {
-            if (base64_count + mimeout_buf_count/3*4> 66){
+            if (base64_count + mimeout_buf_count/3*4> 66) {
                 (*o_base64conv)(EOF,0);
                 (*o_base64conv)(0,LF);
                 (*o_base64conv)(0,SP);
+                base64_count = 1;
+                mimeout_mode = -1;
             }
-        }/*else if (mime_lastchar2){
-            if (c1 <=DEL && !nkf_isspace(c1)){
-                (*o_base64conv)(0,SP);
-            }
-        }*/
-    }/*else{
-        if (c2 && mime_lastchar2 == 0
-            && mime_lastchar1 && !nkf_isspace(mime_lastchar1)){
-            (*o_base64conv)(0,SP);
         }
-    }*/
-    /*mime_lastchar2 = c2;
-    mime_lastchar1 = c1;*/
+    } else if (c2) {
+       if (c2 != EOF && base64_count + mimeout_buf_count/3*4> 60) {
+           mimeout_mode =  (output_mode==ASCII ||output_mode == ISO8859_1) ? 'Q' : 'B';
+           open_mime(output_mode);
+           (*o_base64conv)(EOF,0);
+           (*o_base64conv)(0,LF);
+           (*o_base64conv)(0,SP);
+           base64_count = 1;
+           mimeout_mode = -1;
+       }
+    }
 }
 
 void mime_putc(nkf_char c)
@@ -5763,10 +5755,11 @@ void mime_putc(nkf_char c)
     /* mimeout_f != FIXED_MIME */
 
     if (c == EOF) { /* c==EOF */
+       if (mimeout_mode == -1 && mimeout_buf_count > 1) open_mime(output_mode);
        j = mimeout_buf_count;
        mimeout_buf_count = 0;
        i = 0;
-       if (mimeout_mode) {
+       if (mimeout_mode > 0) {
            if (!nkf_isblank(mimeout_buf[j-1])) {
                for (;i<j;i++) {
                    if (nkf_isspace(mimeout_buf[i]) && base64_count < 71){
@@ -5792,6 +5785,12 @@ void mime_putc(nkf_char c)
         return;
     }
 
+    if (mimeout_buf_count > 0){
+        lastchar = mimeout_buf[mimeout_buf_count - 1];
+    }else{
+        lastchar = -1;
+    }
+
     if (mimeout_mode=='Q') {
         if (c <= DEL && (output_mode==ASCII ||output_mode == ISO8859_1)) {
            if (c == CR || c == LF) {
@@ -5813,7 +5812,8 @@ void mime_putc(nkf_char c)
                if (base64_count > 70) {
                    close_mime();
                    (*o_mputc)(LF);
-                   base64_count = 0;
+                   (*o_mputc)(SP);
+                   base64_count = 1;
                    open_mime(output_mode);
                }
                if (!nkf_noescape_mime(c)) {
@@ -5827,17 +5827,20 @@ void mime_putc(nkf_char c)
         return;
     }
 
-    if (mimeout_buf_count > 0){
-        lastchar = mimeout_buf[mimeout_buf_count - 1];
-    }else{
-        lastchar = -1;
-    }
-
-    if (!mimeout_mode) {
+    if (mimeout_mode <= 0) {
         if (c <= DEL && (output_mode==ASCII ||output_mode == ISO8859_1)) {
             if (nkf_isspace(c)) {
+               int flag = 0;
+               if (mimeout_mode == -1) {
+                   flag = 1;
+               }
                 if (c==CR || c==LF) {
-                    base64_count=0;
+                   if (flag) {
+                       open_mime(output_mode);
+                       output_mode = 0;
+                   } else {
+                       base64_count = 0;
+                   }
                 }
                 for (i=0;i<mimeout_buf_count;i++) {
                     (*o_mputc)(mimeout_buf[i]);
@@ -5847,8 +5850,13 @@ void mime_putc(nkf_char c)
                         base64_count++;
                     }
                 }
-                mimeout_buf[0] = (char)c;
-                mimeout_buf_count = 1;
+               if (flag) {
+                   eof_mime();
+                   base64_count = 0;
+                   mimeout_mode = 0;
+                }
+               mimeout_buf[0] = (char)c;
+               mimeout_buf_count = 1;
             }else{
                 if (base64_count > 1
                     && base64_count + mimeout_buf_count > 76