OSDN Git Service

* Remove itoh4().
[nkf/nkf.git] / nkf.c
diff --git a/nkf.c b/nkf.c
index a7432ae..4cdf9ef 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.143 2007/10/10 19:35:39 naruse Exp $ */
+/* $Id: nkf.c,v 1.145 2007/11/02 21:40:15 naruse Exp $ */
 #define NKF_VERSION "2.0.8"
-#define NKF_RELEASE_DATE "2007-10-11"
+#define NKF_RELEASE_DATE "2007-11-03"
 #define COPY_RIGHT \
     "Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW\n" \
     "Copyright (C) 2002-2007 Kono, Furukawa, Naruse, mastodon"
@@ -223,6 +223,9 @@ void  djgpp_setbinmode(FILE *fp)
                     ('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
@@ -5559,7 +5562,6 @@ static nkf_char b64c;
 char mimeout_buf[MIMEOUT_BUF_LENGTH+1];
 int mimeout_buf_count = 0;
 int mimeout_preserve_space = 0;
-#define itoh4(c)   (c>=10?c+'A'-10:c+'0')
 
 void open_mime(nkf_char mode)
 {
@@ -5657,8 +5659,8 @@ void mimeout_addchar(nkf_char c)
            base64_count = 0;
        } else if(!nkf_isalnum(c)) {
            (*o_mputc)('=');
-           (*o_mputc)(itoh4(((c>>4)&0xf)));
-           (*o_mputc)(itoh4((c&0xf)));
+           (*o_mputc)(bin2hex(((c>>4)&0xf)));
+           (*o_mputc)(bin2hex((c&0xf)));
            base64_count += 3;
        } else {
            (*o_mputc)(c);
@@ -5707,6 +5709,12 @@ void mime_prechar(nkf_char c2, nkf_char c1)
                 (*o_base64conv)(0,LF);
                 (*o_base64conv)(0,SP);
             }
+        } else {
+            if (base64_count + mimeout_buf_count/3*4> 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 +5809,20 @@ void mime_putc(nkf_char c)
                    (*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(output_mode);
+               }
+               if (!nkf_noescape_mime(c)) {
+                   mimeout_addchar(c);
+                   return;
+               }
+           }
+           (*o_mputc)(c);
+           base64_count++;
         }
         return;
     }
@@ -5882,6 +5901,8 @@ void mime_putc(nkf_char c)
                     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;i<mimeout_buf_count;i++) {
@@ -5904,7 +5925,7 @@ void mime_putc(nkf_char c)
                     mimeout_buf_count = 0;
                 }
                 return;
-            }
+           }
             if (mimeout_buf_count>0 && SP<c && c!='=') {
                 mimeout_buf[mimeout_buf_count++] = (char)c;
                 if (mimeout_buf_count>MIMEOUT_BUF_LENGTH) {