changeset 24324:2eec590faf26

(Fdecode_sjis_char, Fencode_sjis_char): Hanlde ASCII correctly. Signal error on invalid characters. (Fdecode_big5_char, Fencode_big5_char): Likewise.
author Kenichi Handa <handa@m17n.org>
date Tue, 16 Feb 1999 01:38:01 +0000
parents c1bb999de64e
children 5960d6c4bf10
files src/coding.c
diffstat 1 files changed, 39 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/coding.c	Tue Feb 16 01:05:33 1999 +0000
+++ b/src/coding.c	Tue Feb 16 01:38:01 1999 +0000
@@ -2034,7 +2034,7 @@
    (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 @@
   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 @@
 
   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 @@
     }
   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 @@
 
   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 @@
 
   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;
 }