(setup_raw_text_coding_system): New function.
authorKenichi Handa <handa@m17n.org>
Fri, 26 Jun 1998 03:29:15 +0000 (03:29 +0000)
committerKenichi Handa <handa@m17n.org>
Fri, 26 Jun 1998 03:29:15 +0000 (03:29 +0000)
(decode_coding_sjis_big5): Bug for handling invalid code fixed.

src/coding.c

index 2a986fd..6c537df 100644 (file)
@@ -1990,7 +1990,7 @@ encode_coding_iso2022 (coding, source, destination, src_bytes, dst_bytes)
    (character set)     (range)
    ASCII               0x00 .. 0x7F
    KATAKANA-JISX0201   0xA0 .. 0xDF
-   JISX0208 (1st byte) 0x80 .. 0x9F and 0xE0 .. 0xFF
+   JISX0208 (1st byte) 0x80 .. 0x9F and 0xE0 .. 0xEF
            (2nd byte)  0x40 .. 0xFF
    -------------------------------
 
@@ -2236,69 +2236,47 @@ decode_coding_sjis_big5 (coding, source, destination,
        }
       else if (c1 < 0x80)
        DECODE_SJIS_BIG5_CHARACTER (charset_ascii, c1, /* dummy */ c2);
-      else if (c1 < 0xA0)
+      else
        {
-         /* SJIS -> JISX0208 */
          if (sjis_p)
            {
-             ONE_MORE_BYTE (c2);
-             if (c2 >= 0x40)
+             if (c1 < 0xA0 || (c1 >= 0xE0 && c1 < 0xF0))
                {
-                 DECODE_SJIS (c1, c2, c3, c4);
-                 DECODE_SJIS_BIG5_CHARACTER (charset_jisx0208, c3, c4);
+                 /* SJIS -> JISX0208 */
+                 ONE_MORE_BYTE (c2);
+                 if (c2 >= 0x40)
+                   {
+                     DECODE_SJIS (c1, c2, c3, c4);
+                     DECODE_SJIS_BIG5_CHARACTER (charset_jisx0208, c3, c4);
+                   }
+                 else
+                   goto label_invalid_code_2;
                }
+             else if (c1 < 0xE0)
+               /* SJIS -> JISX0201-Kana */
+               DECODE_SJIS_BIG5_CHARACTER (charset_katakana_jisx0201, c1,
+                                           /* dummy */ c2);
              else
-               goto label_invalid_code_2;
+               goto label_invalid_code_1;
            }
-         else
-           goto label_invalid_code_1;
-       }
-      else if (c1 < 0xE0)
-       {
-         /* SJIS -> JISX0201-Kana, BIG5 -> Big5 */
-         if (sjis_p)
-           DECODE_SJIS_BIG5_CHARACTER (charset_katakana_jisx0201, c1,
-                                       /* dummy */ c2);
          else
            {
-             int charset;
-
-             ONE_MORE_BYTE (c2);
-             if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE))
+             /* BIG5 -> Big5 */
+             if (c1 >= 0xA1 && c1 <= 0xFE)
                {
-                 DECODE_BIG5 (c1, c2, charset, c3, c4);
-                 DECODE_SJIS_BIG5_CHARACTER (charset, c3, c4);
-               }
-             else
-               goto label_invalid_code_2;
-           }
-       }
-      else                     /* C1 >= 0xE0 */
-       {
-         /* SJIS -> JISX0208, BIG5 -> Big5 */
-         if (sjis_p)
-           {
-             ONE_MORE_BYTE (c2);
-             if (c2 >= 0x40)
-               {
-                 DECODE_SJIS (c1, c2, c3, c4);
-                 DECODE_SJIS_BIG5_CHARACTER (charset_jisx0208, c3, c4);
-               }
-             else
-               goto label_invalid_code_2;
-           }
-         else
-           {
-             int charset;
+                 ONE_MORE_BYTE (c2);
+                 if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE))
+                   {
+                     int charset;
 
-             ONE_MORE_BYTE (c2);
-             if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE))
-               {
-                 DECODE_BIG5 (c1, c2, charset, c3, c4);
-                 DECODE_SJIS_BIG5_CHARACTER (charset, c3, c4);
+                     DECODE_BIG5 (c1, c2, charset, c3, c4);
+                     DECODE_SJIS_BIG5_CHARACTER (charset, c3, c4);
+                   }
+                 else
+                   goto label_invalid_code_2;
                }
              else
-               goto label_invalid_code_2;
+               goto label_invalid_code_1;
            }
        }
       continue;
@@ -3087,6 +3065,32 @@ setup_coding_system (coding_system, coding)
   return -1;
 }
 
+/* Setup raw-text or one of its subsidiaries in the structure
+   coding_system CODING according to the already setup value eol_type
+   in CODING.  CODING should be setup for some coding system in
+   advance.  */
+
+void
+setup_raw_text_coding_system (coding)
+     struct coding_system *coding;
+{
+  if (coding->type != coding_type_raw_text)
+    {
+      coding->symbol = Qraw_text;
+      coding->type = coding_type_raw_text;
+      if (coding->eol_type != CODING_EOL_UNDECIDED)
+       {
+         Lisp_Object subsidiaries = Fget (Qraw_text, Qeol_type);
+
+         if (VECTORP (subsidiaries)
+             && XVECTOR (subsidiaries)->size == 3)
+           coding->symbol
+             = XVECTOR (subsidiaries)->contents[coding->eol_type];
+       }
+    }
+  return;
+}
+
 /* Emacs has a mechanism to automatically detect a coding system if it
    is one of Emacs' internal format, ISO2022, SJIS, and BIG5.  But,
    it's impossible to distinguish some coding systems accurately