]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fdecode_sjis_char, Fencode_sjis_char): Hanlde
authorKenichi Handa <handa@m17n.org>
Tue, 16 Feb 1999 01:38:01 +0000 (01:38 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 16 Feb 1999 01:38:01 +0000 (01:38 +0000)
ASCII correctly.  Signal error on invalid characters.
(Fdecode_big5_char, Fencode_big5_char): Likewise.

src/coding.c

index 45cfb053930914861e91bb02820fd7764d343ee3..15eadaf58ff11baf324da5e7a5e1395340ce9269 100644 (file)
@@ -2034,7 +2034,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 .. 0xEF
+   JISX0208 (1st byte) 0x81 .. 0x9F and 0xE0 .. 0xEF
            (2nd byte)  0x40 .. 0x7E and 0x80 .. 0xFC
    -------------------------------
 
@@ -5034,15 +5034,19 @@ Return the corresponding character.")
   s1 = (XFASTINT (code)) >> 8, s2 = (XFASTINT (code)) & 0xFF;
   if (s1 == 0)
     {
-      if (s2 < 0xA0 || s2 > 0xDF)
-       error ("Invalid Shift JIS code: %s", XFASTINT (code));
-      XSETFASTINT (val, MAKE_NON_ASCII_CHAR (charset_katakana_jisx0201, s2, 0));
+      if (s2 < 0x80)
+       XSETFASTINT (val, s2);
+      else if (s2 >= 0xA0 || s2 <= 0xDF)
+       XSETFASTINT (val,
+                    MAKE_NON_ASCII_CHAR (charset_katakana_jisx0201, s2, 0));
+      else
+       error ("Invalid Shift JIS code: %d", XFASTINT (code));
     }
   else
     {
       if ((s1 < 0x80 || s1 > 0x9F && s1 < 0xE0 || s1 > 0xEF)
          || (s2 < 0x40 || s2 == 0x7F || s2 > 0xFC))
-       error ("Invalid Shift JIS code: %s", XFASTINT (code));
+       error ("Invalid Shift JIS code: %d", XFASTINT (code));
       DECODE_SJIS (s1, s2, c1, c2);
       XSETFASTINT (val, MAKE_NON_ASCII_CHAR (charset_jisx0208, c1, c2));
     }
@@ -5060,8 +5064,12 @@ Return the corresponding code in SJIS.")
 
   CHECK_NUMBER (ch, 0);
   SPLIT_CHAR (XFASTINT (ch), charset, c1, c2);
-  if (charset == charset_jisx0208
-      && c1 > 0x20 && c1 < 0x7F && c2 > 0x20 && c2 < 0x7F)
+  if (charset == CHARSET_ASCII)
+    {
+      val = ch;
+    }
+  else if (charset == charset_jisx0208
+          && c1 > 0x20 && c1 < 0x7F && c2 > 0x20 && c2 < 0x7F)
     {
       ENCODE_SJIS (c1, c2, s1, s2);
       XSETFASTINT (val, (s1 << 8) | s2);
@@ -5073,13 +5081,11 @@ Return the corresponding code in SJIS.")
     }
   else
     error ("Can't encode to shift_jis: %d", XFASTINT (ch));
-    
   return val;
 }
 
 DEFUN ("decode-big5-char", Fdecode_big5_char, Sdecode_big5_char, 1, 1, 0,
-  "Decode a Big5 character CODE of BIG5 coding system.\n\
-CODE is the character code in BIG5.\n\
+  "Decode a Big5 character which has CODE in BIG5 coding system.\n\
 Return the corresponding character.")
   (code)
      Lisp_Object code;
@@ -5090,8 +5096,20 @@ Return the corresponding character.")
 
   CHECK_NUMBER (code, 0);
   b1 = (XFASTINT (code)) >> 8, b2 = (XFASTINT (code)) & 0xFF;
-  DECODE_BIG5 (b1, b2, charset, c1, c2);
-  XSETFASTINT (val, MAKE_NON_ASCII_CHAR (charset, c1, c2));
+  if (b1 == 0)
+    {
+      if (b2 >= 0x80)
+       error ("Invalid BIG5 code: %d", XFASTINT (code));
+      val = code;
+    }
+  else
+    {
+      if ((b1 < 0xA1 || b1 > 0xFE)
+         || (b2 < 0x40 || (b2 > 0x7E && b2 < 0xA1) || b2 > 0xFE))
+       error ("Invalid BIG5 code: %d", XFASTINT (code));
+      DECODE_BIG5 (b1, b2, charset, c1, c2);
+      XSETFASTINT (val, MAKE_NON_ASCII_CHAR (charset, c1, c2));
+    }
   return val;
 }
 
@@ -5106,13 +5124,20 @@ Return the corresponding character code in Big5.")
 
   CHECK_NUMBER (ch, 0);
   SPLIT_CHAR (XFASTINT (ch), charset, c1, c2);
-  if (charset == charset_big5_1 || charset == charset_big5_2)
+  if (charset == CHARSET_ASCII)
+    {
+      val = ch;
+    }
+  else if ((charset == charset_big5_1
+           && (XFASTINT (ch) >= 0x250a1 && XFASTINT (ch) <= 0x271ec))
+          || (charset == charset_big5_2
+              && XFASTINT (ch) >= 0x290a1 && XFASTINT (ch) <= 0x2bdb2))
     {
       ENCODE_BIG5 (charset, c1, c2, b1, b2);
       XSETFASTINT (val, (b1 << 8) | b2);
     }
   else
-    XSETFASTINT (val, 0);
+    error ("Can't encode to Big5: %d", XFASTINT (ch));
   return val;
 }
 \f