OSDN Git Service

* Add support --ic=UTF-32
authorNARUSE, Yui <naruse@users.sourceforge.jp>
Fri, 15 Sep 2006 16:23:20 +0000 (16:23 +0000)
committerNARUSE, Yui <naruse@users.sourceforge.jp>
Fri, 15 Sep 2006 16:23:20 +0000 (16:23 +0000)
* Fix: can't guess UTF-16 and UTF-32
* Fix: can't decode beyond BMP of UTF-16LE

nkf.c

diff --git a/nkf.c b/nkf.c
index 407c6eb..51753f6 100644 (file)
--- a/nkf.c
+++ b/nkf.c
@@ -39,7 +39,7 @@
 **        E-Mail: furukawa@tcp-ip.or.jp
 **    \e$B$^$G8fO"Mm$r$*4j$$$7$^$9!#\e(B
 ***********************************************************************/
-/* $Id: nkf.c,v 1.106 2006/09/14 19:30:03 naruse Exp $ */
+/* $Id: nkf.c,v 1.107 2006/09/15 07:23:20 naruse Exp $ */
 #define NKF_VERSION "2.0.8"
 #define NKF_RELEASE_DATE "2006-09-15"
 #include "config.h"
@@ -377,7 +377,7 @@ static  nkf_char     w_iconv16(nkf_char c2,nkf_char c1,nkf_char c0);
 static  nkf_char     w_iconv32(nkf_char c2,nkf_char c1,nkf_char c0);
 static  nkf_char       unicode_to_jis_common(nkf_char c2,nkf_char c1,nkf_char c0,nkf_char *p2,nkf_char *p1);
 static  nkf_char       w_iconv_common(nkf_char c1,nkf_char c0,const unsigned short *const *pp,nkf_char psize,nkf_char *p2,nkf_char *p1);
-static  void    w16w_conv(nkf_char val, nkf_char *p2, nkf_char *p1, nkf_char *p0);\r
+static  void    w16w_conv(nkf_char val, nkf_char *p2, nkf_char *p1, nkf_char *p0);
 static  nkf_char     ww16_conv(nkf_char c2, nkf_char c1, nkf_char c0);
 static  nkf_char     w16e_conv(nkf_char val,nkf_char *p2,nkf_char *p1);
 static  void    w_status(struct input_code *, nkf_char);
@@ -1293,6 +1293,15 @@ void options(unsigned char *cp)
                             strcmp(codeset, "UTF-16LE-BOM") == 0){
                        input_f = UTF16_INPUT;
                        input_endian = ENDIAN_LITTLE;
+                   }else if(strcmp(codeset, "UTF-32") == 0 ||
+                            strcmp(codeset, "UTF-32BE") == 0 ||
+                            strcmp(codeset, "UTF-32BE-BOM") == 0){
+                       input_f = UTF32_INPUT;
+                       input_endian = ENDIAN_BIG;
+                   }else if(strcmp(codeset, "UTF-32LE") == 0 ||
+                            strcmp(codeset, "UTF-32LE-BOM") == 0){
+                       input_f = UTF32_INPUT;
+                       input_endian = ENDIAN_LITTLE;
 #endif
                    }
                     continue;
@@ -1901,12 +1910,7 @@ void options(unsigned char *cp)
     }
 }
 
-#ifdef ANSI_C_PROTOTYPE
 struct input_code * find_inputcode_byfunc(nkf_char (*iconv_func)(nkf_char c2,nkf_char c1,nkf_char c0))
-#else
-struct input_code * find_inputcode_byfunc(iconv_func)
-     nkf_char (*iconv_func)();
-#endif
 {
     if (iconv_func){
         struct input_code *p = input_code_list;
@@ -2227,6 +2231,8 @@ void code_status(nkf_char c)
     struct input_code *result = 0;
     struct input_code *p = input_code_list;
     while (p->name){
+        if (!p->status_func)
+           continue;
         (p->status_func)(p, c);
         if (p->stat > 0){
             action_flag = 0;
@@ -2396,9 +2402,9 @@ void module_connection(void)
 /*
  * Check and Ignore BOM
  */
-void check_bom(FILE *f)\r
-{\r
-    int c2;\r
+void check_bom(FILE *f)
+{
+    int c2;
     switch(c2 = (*i_getc)(f)){
     case 0x00:
        if((c2 = (*i_getc)(f)) == 0x00){
@@ -2482,7 +2488,7 @@ void check_bom(FILE *f)
        break;
     }
 }
-\r
+
 /*
    Conversion main loop. Code detection only. 
  */
@@ -2565,8 +2571,8 @@ nkf_char kanji_convert(FILE *f)
                    if ((c2 = (*i_getc)(f)) != EOF) {
                        if (0xD8 <= c2 && c2 <= 0xDB) {
                            if ((c3 = (*i_getc)(f)) != EOF) {
-                               c3 <<= 8;
                                if ((c0 = (*i_getc)(f)) != EOF) {
+                                   c0 <<= 8;
                                    c0 |= c3;
                                } else c1 = EOF;
                            } else c1 = EOF;