OSDN Git Service

--cp932 オプション
authorRei FURUKAWA <rei_furukawa@users.sourceforge.jp>
Thu, 20 Feb 2003 03:11:46 +0000 (03:11 +0000)
committerRei FURUKAWA <rei_furukawa@users.sourceforge.jp>
Thu, 20 Feb 2003 03:11:46 +0000 (03:11 +0000)
--numchar-input オプション

config.h
nkf.c

index e1d091d..5f873f9 100644 (file)
--- a/config.h
+++ b/config.h
@@ -5,6 +5,9 @@
 #define UTF8_INPUT_ENABLE
 #define UTF8_OUTPUT_ENABLE
 
 #define UTF8_INPUT_ENABLE
 #define UTF8_OUTPUT_ENABLE
 
+/* Shift_JIS \e$BHO0O30$NJ8;z$r!"\e(BCP932 \e$B$GF1CM$JJ8;z$KFI$_49$($k\e(B */
+#define SHIFTJIS_CP932
+
 /* \e$B%*%W%7%g%s$GF~NO$r;XDj$7$?;~$K!"J8;z%3!<%I$r8GDj$9$k\e(B */
 #define INPUT_CODE_FIX
 
 /* \e$B%*%W%7%g%s$GF~NO$r;XDj$7$?;~$K!"J8;z%3!<%I$r8GDj$9$k\e(B */
 #define INPUT_CODE_FIX
 
@@ -12,8 +15,8 @@
 /* by Satoru Takabayashi <ccsatoru@vega.aichi-u.ac.jp> */
 #define OVERWRITE
 
 /* by Satoru Takabayashi <ccsatoru@vega.aichi-u.ac.jp> */
 #define OVERWRITE
 
-/* --cap-input, --url-input \e$B%*%W%7%g%s\e(B */
-#define CAP_URL_OPTION
+/* --cap-input, --url-input, --numchar-input \e$B%*%W%7%g%s\e(B */
+#define INPUT_OPTION
 
 /* --debug, --no-output \e$B%*%W%7%g%s\e(B */
 #define CHECK_OPTION
 
 /* --debug, --no-output \e$B%*%W%7%g%s\e(B */
 #define CHECK_OPTION
diff --git a/nkf.c b/nkf.c
index f48060b..ef40684 100644 (file)
--- a/nkf.c
+++ b/nkf.c
@@ -275,6 +275,7 @@ STATIC  void    w_oconv PROTO((int c2,int c1));
 STATIC  void    w_oconv16 PROTO((int c2,int c1));
 #endif
 STATIC  void    e_oconv PROTO((int c2,int c1));
 STATIC  void    w_oconv16 PROTO((int c2,int c1));
 #endif
 STATIC  void    e_oconv PROTO((int c2,int c1));
+STATIC  void    e2s_conv PROTO((int c2, int c1, int *p2, int *p1));
 STATIC  void    s_oconv PROTO((int c2,int c1));
 STATIC  void    j_oconv PROTO((int c2,int c1));
 STATIC  void    fold_conv PROTO((int c2,int c1));
 STATIC  void    s_oconv PROTO((int c2,int c1));
 STATIC  void    j_oconv PROTO((int c2,int c1));
 STATIC  void    fold_conv PROTO((int c2,int c1));
@@ -359,7 +360,7 @@ static int             w_oconv16_begin_f= 0;   /* utf-16 header */
 #endif
 
 
 #endif
 
 
-#ifdef CAP_URL_OPTION
+#ifdef INPUT_OPTION
 static int cap_f = FALSE;
 static int (*i_cgetc)PROTO((FILE *)) = std_getc; /* input of cgetc */
 static int (*i_cungetc)PROTO((int c ,FILE *f)) = std_ungetc;
 static int cap_f = FALSE;
 static int (*i_cgetc)PROTO((FILE *)) = std_getc; /* input of cgetc */
 static int (*i_cungetc)PROTO((int c ,FILE *f)) = std_ungetc;
@@ -371,6 +372,12 @@ static int (*i_ugetc)PROTO((FILE *)) = std_getc; /* input of ugetc */
 static int (*i_uungetc)PROTO((int c ,FILE *f)) = std_ungetc;
 STATIC int url_getc PROTO((FILE *f));
 STATIC int url_ungetc PROTO((int c,FILE *f));
 static int (*i_uungetc)PROTO((int c ,FILE *f)) = std_ungetc;
 STATIC int url_getc PROTO((FILE *f));
 STATIC int url_ungetc PROTO((int c,FILE *f));
+
+static int numchar_f = FALSE;
+static int (*i_ngetc)PROTO((FILE *)) = std_getc; /* input of ugetc */
+static int (*i_nungetc)PROTO((int c ,FILE *f)) = std_ungetc;
+STATIC int numchar_getc PROTO((FILE *f));
+STATIC int numchar_ungetc PROTO((int c,FILE *f));
 #endif
 
 #ifdef CHECK_OPTION
 #endif
 
 #ifdef CHECK_OPTION
@@ -380,6 +387,13 @@ static int debug_f = FALSE;
 STATIC void debug PROTO((char *str));
 #endif
 
 STATIC void debug PROTO((char *str));
 #endif
 
+#ifdef SHIFTJIS_CP932
+STATIC int cp932_f = FALSE;
+#define CP932_TABLE_BEGIN (0xfa)
+#define CP932_TABLE_END   (0xfc)
+
+#endif /* SHIFTJIS_CP932 */
+
 STATIC void e_status PROTO((struct input_code *, int));
 STATIC void s_status PROTO((struct input_code *, int));
 
 STATIC void e_status PROTO((struct input_code *, int));
 STATIC void s_status PROTO((struct input_code *, int));
 
@@ -805,14 +819,18 @@ struct {
 #ifdef OVERWRITE
     {"overwrite", ""},
 #endif
 #ifdef OVERWRITE
     {"overwrite", ""},
 #endif
-#ifdef CAP_URL_OPTION
+#ifdef INPUT_OPTION
     {"cap-input", ""},
     {"url-input", ""},
     {"cap-input", ""},
     {"url-input", ""},
+    {"numchar-input", ""},
 #endif
 #ifdef CHECK_OPTION
     {"no-output", ""},
     {"debug", ""},
 #endif
 #endif
 #ifdef CHECK_OPTION
     {"no-output", ""},
     {"debug", ""},
 #endif
+#ifdef SHIFTJIS_CP932
+    {"cp932", ""},
+#endif
 };
 
 static int option_mode;
 };
 
 static int option_mode;
@@ -851,7 +869,7 @@ options(cp)
                     continue;
                 }
 #endif
                     continue;
                 }
 #endif
-#ifdef CAP_URL_OPTION
+#ifdef INPUT_OPTION
                 if (strcmp(long_option[i].name, "cap-input") == 0){
                     cap_f = TRUE;
                     continue;
                 if (strcmp(long_option[i].name, "cap-input") == 0){
                     cap_f = TRUE;
                     continue;
@@ -860,6 +878,10 @@ options(cp)
                     url_f = TRUE;
                     continue;
                 }
                     url_f = TRUE;
                     continue;
                 }
+                if (strcmp(long_option[i].name, "numchar-input") == 0){
+                    numchar_f = TRUE;
+                    continue;
+                }
 #endif
 #ifdef CHECK_OPTION
                 if (strcmp(long_option[i].name, "no-output") == 0){
 #endif
 #ifdef CHECK_OPTION
                 if (strcmp(long_option[i].name, "no-output") == 0){
@@ -871,6 +893,12 @@ options(cp)
                     continue;
                 }
 #endif
                     continue;
                 }
 #endif
+#ifdef SHIFTJIS_CP932
+                if (strcmp(long_option[i].name, "cp932") == 0){
+                    cp932_f = TRUE;
+                    continue;
+                }
+#endif
             }
             continue;
         case 'b':           /* buffered mode */
             }
             continue;
         case 'b':           /* buffered mode */
@@ -1116,10 +1144,15 @@ void set_iconv(f, iconv_func)
 #endif
 }
 
 #endif
 }
 
-#define SCORE_KANA     (1)                      /* \e$B$$$o$f$kH>3Q%+%J\e(B */
-#define SCORE_DEPEND   (SCORE_KANA << 1)        /* \e$B5!<o0MB8J8;z\e(B */
-#define SCORE_NO_EXIST (SCORE_DEPEND << 1)      /* \e$BB8:_$7$J$$J8;z\e(B */
-#define SCORE_ERROR    (SCORE_NO_EXIST << 1)    /* \e$B%(%i!<\e(B */
+#define SCORE_KANA     (1)                   /* \e$B$$$o$f$kH>3Q%+%J\e(B */
+#define SCORE_DEPEND   (SCORE_KANA << 1)     /* \e$B5!<o0MB8J8;z\e(B */
+#ifdef SHIFTJIS_CP932
+#define SCORE_CP932    (SCORE_DEPEND << 1)   /* CP932 \e$B$K$h$kFI$_49$(\e(B */
+#define SCORE_NO_EXIST (SCORE_CP932 << 1)    /* \e$BB8:_$7$J$$J8;z\e(B */
+#else
+#define SCORE_NO_EXIST (SCORE_DEPEND << 1)   /* \e$BB8:_$7$J$$J8;z\e(B */
+#endif
+#define SCORE_ERROR    (SCORE_NO_EXIST << 1) /* \e$B%(%i!<\e(B */
 int score_table_A0[] = {
     0, 0, 0, 0,
     0, 0, 0, 0,
 int score_table_A0[] = {
     0, 0, 0, 0,
     0, 0, 0, 0,
@@ -1134,27 +1167,32 @@ int score_table_F0[] = {
     SCORE_DEPEND, SCORE_NO_EXIST, SCORE_NO_EXIST, SCORE_ERROR,
 };
 
     SCORE_DEPEND, SCORE_NO_EXIST, SCORE_NO_EXIST, SCORE_ERROR,
 };
 
+void set_code_score(ptr, score)
+     struct input_code *ptr;
+     int score;
+{
+    ptr->score |= score;
+}
+
 void code_score(ptr)
      struct input_code *ptr;
 {
 void code_score(ptr)
      struct input_code *ptr;
 {
-    int s = ptr->score;
     int c2 = ptr->buf[0];
     int c1 = ptr->buf[1];
     if (c2 < 0){
     int c2 = ptr->buf[0];
     int c1 = ptr->buf[1];
     if (c2 < 0){
-        s |= SCORE_ERROR;
+        set_code_score(ptr, SCORE_ERROR);
     }else if ((c2 & 0xf0) == 0xa0){
     }else if ((c2 & 0xf0) == 0xa0){
-        s |= score_table_A0[c2 & 0x0f];
+        set_code_score(ptr, score_table_A0[c2 & 0x0f]);
     }else if ((c2 & 0xf0) == 0xf0){
     }else if ((c2 & 0xf0) == 0xf0){
-        s |= score_table_F0[c2 & 0x0f];
+        set_code_score(ptr, score_table_F0[c2 & 0x0f]);
     }else if (c2 == SSO){
     }else if (c2 == SSO){
-        s |= SCORE_KANA;
+        set_code_score(ptr, SCORE_KANA);
     }
 #ifdef UTF8_OUTPUT_ENABLE
     else if (!e2w_conv(c2, c1)){
     }
 #ifdef UTF8_OUTPUT_ENABLE
     else if (!e2w_conv(c2, c1)){
-        s |= SCORE_NO_EXIST;
+        set_code_score(ptr, SCORE_NO_EXIST);
     }
 #endif
     }
 #endif
-    ptr->score = s;
 }
 
 void status_disable(ptr)
 }
 
 void status_disable(ptr)
@@ -1206,9 +1244,15 @@ void s_status(ptr, c)
               status_push_ch(ptr, c);
               code_score(ptr);
               status_reset(ptr);
               status_push_ch(ptr, c);
               code_score(ptr);
               status_reset(ptr);
-          }else if ((0x81 <= c && c < 0xa0) || (0xe0 <= c && c <= 0xea)){
+          }else if ((0x81 <= c && c < 0xa0) || (0xe0 <= c && c <= 0xef)){
               ptr->stat = 1;
               status_push_ch(ptr, c);
               ptr->stat = 1;
               status_push_ch(ptr, c);
+#ifdef SHIFTJIS_CP932
+          }else if (cp932_f
+                    && CP932_TABLE_BEGIN <= c && c <= CP932_TABLE_END){
+              ptr->stat = 2;
+              status_push_ch(ptr, c);
+#endif /* SHIFTJIS_CP932 */
           }else{
               status_disable(ptr);
           }
           }else{
               status_disable(ptr);
           }
@@ -1223,6 +1267,19 @@ void s_status(ptr, c)
               status_disable(ptr);
           }
           break;
               status_disable(ptr);
           }
           break;
+#ifdef SHIFTJIS_CP932
+      case 2:
+          if ((0x40 <= c && c <= 0x7e) || (0x80 <= c && c <= 0xfc)){
+              status_push_ch(ptr, c);
+              if (s2e_conv(ptr->buf[0], ptr->buf[1], &ptr->buf[0], &ptr->buf[1]) == 0){
+                  set_code_score(ptr, SCORE_CP932);
+                  status_reset(ptr);
+                  break;
+              }
+          }
+          status_disable(ptr);
+          break;
+#endif /* SHIFTJIS_CP932 */
     }
 }
 
     }
 }
 
@@ -1410,7 +1467,7 @@ module_connection()
 
     i_getc = std_getc;
     /* input redicrection */
 
     i_getc = std_getc;
     /* input redicrection */
-#ifdef CAP_URL_OPTION
+#ifdef INPUT_OPTION
     if (cap_f){
         i_cgetc = i_getc; i_getc = cap_getc;
         i_cungetc = i_ungetc; i_ungetc= cap_ungetc;
     if (cap_f){
         i_cgetc = i_getc; i_getc = cap_getc;
         i_cungetc = i_ungetc; i_ungetc= cap_ungetc;
@@ -1419,6 +1476,10 @@ module_connection()
         i_ugetc = i_getc; i_getc = url_getc;
         i_uungetc = i_ungetc; i_ungetc= url_ungetc;
     }
         i_ugetc = i_getc; i_getc = url_getc;
         i_uungetc = i_ungetc; i_ungetc= url_ungetc;
     }
+    if (numchar_f){
+        i_ngetc = i_getc; i_getc = numchar_getc;
+        i_nungetc = i_ungetc; i_ungetc= numchar_ungetc;
+    }
 #endif
     if (mime_f && mimebuf_f==FIXED_MIME) {
        i_mgetc = i_getc; i_getc = mime_getc;
 #endif
     if (mime_f && mimebuf_f==FIXED_MIME) {
        i_mgetc = i_getc; i_getc = mime_getc;
@@ -1829,6 +1890,15 @@ int s2e_conv(c2, c1, p2, p1)
      int c2, c1;
      int *p2, *p1;
 {
      int c2, c1;
      int *p2, *p1;
 {
+#ifdef SHIFTJIS_CP932
+    if (CP932_TABLE_BEGIN <= c2 && c2 <= CP932_TABLE_END){
+        extern unsigned short shiftjis_cp932[3][189];
+        c1 = shiftjis_cp932[c2 - CP932_TABLE_BEGIN][c1 - 0x40];
+        if (c1 == 0) return 1;
+        c2 = c1 >> 8;
+        c1 &= 0xff;
+    }
+#endif /* SHIFTJIS_CP932 */
     c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
     if (c1 < 0x9f)
         c1 = c1 - ((c1 > DEL) ? SPACE : 0x1f);
     c2 = c2 + c2 - ((c2 <= 0x9f) ? SJ0162 : SJ6394);
     if (c1 < 0x9f)
         c1 = c1 - ((c1 > DEL) ? SPACE : 0x1f);
@@ -1838,7 +1908,7 @@ int s2e_conv(c2, c1, p2, p1)
     }
     if (p2) *p2 = c2;
     if (p1) *p1 = c1;
     }
     if (p2) *p2 = c2;
     if (p1) *p1 = c1;
-    return (c2 << 8) | c1;
+    return 0;
 }
 
 int
 }
 
 int
@@ -1851,7 +1921,8 @@ s_iconv(c2, c1, c0)
     } else if ((c2 == EOF) || (c2 == 0) || c2 < SPACE) {
         /* NOP */
     } else {
     } else if ((c2 == EOF) || (c2 == 0) || c2 < SPACE) {
         /* NOP */
     } else {
-        s2e_conv(c2, c1, &c2, &c1);
+        int ret = s2e_conv(c2, c1, &c2, &c1);
+        if (ret) return ret;
     }
     (*oconv)(c2, c1);
     return 0;
     }
     (*oconv)(c2, c1);
     return 0;
@@ -1916,15 +1987,55 @@ w_iconv(c2, c1, c0)
     return ret;
 }
 
     return ret;
 }
 
+void
+w16w_conv(val, p2, p1, p0)
+     unsigned short val;
+     int *p2, *p1, *p0;
+{
+    if (val < 0x80){
+        *p2 = val;
+        *p1 = 0;
+        *p0 = 0;
+    }else if (val < 0x800){
+       *p2 = 0xc0 | (val >> 6);
+       *p1 = 0x80 | (val & 0x3f);
+        *p0 = 0;
+    }else{
+        *p2 = 0xe0 | (val >> 12);
+        *p1 = 0x80 | ((val >> 6) & 0x3f);
+        *p0 = 0x80 | (val        & 0x3f);
+    }
+}
+
 int
 int
-w_iconv16(c2, c1, c0)
-    int    c2, c1,c0;
+w16e_conv(val, p2, p1)
+     unsigned short val;
+     int *p2, *p1;
 {
     extern unsigned short * utf8_to_euc_2bytes[];
     extern unsigned short ** utf8_to_euc_3bytes[];
 {
     extern unsigned short * utf8_to_euc_2bytes[];
     extern unsigned short ** utf8_to_euc_3bytes[];
+    int c2, c1, c0;
     unsigned short **pp;
     unsigned short **pp;
-    unsigned short val;
     int psize;
     int psize;
+
+    w16w_conv(val, &c2, &c1, &c0);
+    if (c1){
+        if (c0){
+            pp = utf8_to_euc_3bytes[c2 - 0x80];
+            psize = sizeof_utf8_to_euc_C2;
+        }else{
+            pp = utf8_to_euc_2bytes;
+            psize = sizeof_utf8_to_euc_2bytes;
+        }
+        return w_iconv_common(c1, c0, pp, psize, p2, p1);
+    }
+    return val;
+}
+
+int
+w_iconv16(c2, c1, c0)
+    int    c2, c1,c0;
+{
     int ret;
 
     if (c2==0376 && c1==0377){
     int ret;
 
     if (c2==0376 && c1==0377){
@@ -1942,25 +2053,7 @@ w_iconv16(c2, c1, c0)
        (*oconv)(c2, c1);
        return 0;
     }
        (*oconv)(c2, c1);
        return 0;
     }
-    val = ((c2<<8)&0xff00) + c1;
-    if (c2 < 0x8){
-       c0 = (0x80 | (c1 & 0x3f));
-       c1 = (0xc0 | (val >> 6));
-       pp = utf8_to_euc_2bytes;
-        psize = sizeof_utf8_to_euc_2bytes;
-    }else{
-       c0 = (0x80 | (c1 & 0x3f));
-       c2 = (0xe0 | (val >> 12));
-       c1 = (0x80 | ((val >> 6) & 0x3f));
-       if (c0 == 0) return -1;
-       if (0<=c2-0x80 && c2-0x80 <sizeof_utf8_to_euc_3bytes){
-           pp = utf8_to_euc_3bytes[c2 - 0x80];
-            psize = sizeof_utf8_to_euc_C2;
-        }else{
-           return 0;
-        }
-    }
-    ret = w_iconv_common(c1, c0, pp, psize, &c2, &c1);
+    ret = w16e_conv(((c2<<8)&0xff00) + c1, &c2, &c1);
     if (ret) return ret;
     (*oconv)(c2, c1);
     return 0;
     if (ret) return ret;
     (*oconv)(c2, c1);
     return 0;
@@ -2114,7 +2207,13 @@ e_oconv(c2, c1)
     }
 }
 
     }
 }
 
-
+void
+e2s_conv(c2, c1, p2, p1)
+     int c2, c1, *p2, *p1;
+{
+    if (p2) *p2 = ((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1);
+    if (p1) *p1 = c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e);
+}
 
 void
 s_oconv(c2, c1)
 
 void
 s_oconv(c2, c1)
@@ -2140,8 +2239,9 @@ s_oconv(c2, c1)
             return; /* too late to rescue this char */
         }
        output_mode = SHIFT_JIS;
             return; /* too late to rescue this char */
         }
        output_mode = SHIFT_JIS;
-        (*o_putc)((((c2 - 1) >> 1) + ((c2 <= 0x5e) ? 0x71 : 0xb1)));
-        (*o_putc)((c1 + ((c2 & 1) ? ((c1 < 0x60) ? 0x1f : 0x20) : 0x7e)));
+        e2s_conv(c2, c1, &c2, &c1);
+        (*o_putc)(c2);
+        (*o_putc)(c1);
     }
 }
 
     }
 }
 
@@ -2861,7 +2961,7 @@ void debug(str)
 }
 #endif
 
 }
 #endif
 
-#ifdef CAP_URL_OPTION
+#ifdef INPUT_OPTION
 int
 hex2bin(x)
      int x;
 int
 hex2bin(x)
      int x;
@@ -2887,12 +2987,12 @@ hex_getc(ch, f, g, u)
         return c1;
     }
     c2 = (*g)(f);
         return c1;
     }
     c2 = (*g)(f);
-    if (!nkf_isxdigit(c2) == EOF){
+    if (!nkf_isxdigit(c2)){
         (*u)(c2, f);
         return c1;
     }
     c3 = (*g)(f);
         (*u)(c2, f);
         return c1;
     }
     c3 = (*g)(f);
-    if (!nkf_isxdigit(c3) == EOF){
+    if (!nkf_isxdigit(c3)){
         (*u)(c2, f);
         (*u)(c3, f);
         return c1;
         (*u)(c2, f);
         (*u)(c3, f);
         return c1;
@@ -2929,6 +3029,91 @@ url_ungetc(c, f)
 {
     return (*i_uungetc)(c, f);
 }
 {
     return (*i_uungetc)(c, f);
 }
+
+int
+numchar_getc(f)
+     FILE *f;
+{
+    int (*g)() = i_ngetc;
+    int (*u)() = i_nungetc;
+    int i = 0, j;
+    int buf[8];
+    long c = -1;
+
+    buf[i] = (*g)(f);
+    if (buf[i] == '&'){
+        buf[++i] = (*g)(f);
+        if (buf[i] == '#'){
+            c = 0;
+            buf[++i] = (*g)(f);
+            if (buf[i] == 'x' || buf[i] == 'X'){
+                for (j = 0; j < 5; j++){
+                    buf[++i] = (*g)(f);
+                    if (!nkf_isxdigit(buf[i])){
+                        if (buf[i] != ';'){
+                            c = -1;
+                        }
+                        break;
+                    }
+                    c <<= 4;
+                    c |= hex2bin(buf[i]);
+                }
+            }else{
+                for (j = 0; j < 6; j++){
+                    if (j){
+                        buf[++i] = (*g)(f);
+                    }
+                    if (!nkf_isdigit(buf[i])){
+                        if (buf[i] != ';'){
+                            c = -1;
+                        }
+                        break;
+                    }
+                    c *= 10;
+                    c += hex2bin(buf[i]);
+                }
+            }
+        }
+    }
+    if (c != -1){
+        int c2, c1, c0;
+        if (c < 0x80){
+            return c;
+        }
+        if (0x100 <= c){
+            w16w_conv(c, &c2, &c1, &c0);
+            if (iconv == w_iconv){
+                if (c0){
+                    (*u)(c0, f);
+                }
+                (*u)(c1, f);
+                return c2;
+            }
+            if (w2e_conv(c2, c1, c0, &c2, &c1) == 0){
+                c2 |= 0x80;
+                c1 |= 0x80;
+                if (iconv == s_iconv){
+                    e2s_conv(c2, c1, &c2, &c1);
+                }
+                (*u)(c1, f);
+                return c2;
+            }
+        }
+    }
+    while (i > 0){
+        (*u)(buf[i], f);
+        --i;
+    }
+    return buf[0];
+}
+
+int
+numchar_ungetc(c, f)
+     int c;
+     FILE *f;
+{
+    return (*i_nungetc)(c, f);
+}
 #endif
 
 
 #endif