changeset 103762:e72df94a89ca

(detect_coding_sjis): Handle shift_jis-2004 correctly. (encode_coding_sjis): Fix the code range check.
author Kenichi Handa <handa@m17n.org>
date Wed, 08 Jul 2009 02:22:05 +0000
parents 1e43f752ee1c
children 578826d532dc
files src/coding.c
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/coding.c	Wed Jul 08 02:19:24 2009 +0000
+++ b/src/coding.c	Wed Jul 08 02:22:05 2009 +0000
@@ -4671,6 +4671,12 @@
   int consumed_chars = 0;
   int found = 0;
   int c;
+  Lisp_Object attrs, charset_list;
+  int max_first_byte_of_2_byte_code;
+
+  CODING_GET_INFO (coding, attrs, charset_list);
+  max_first_byte_of_2_byte_code
+    = (XINT (Flength (charset_list)) > 3 ? 0xFC : 0xEF);
 
   detect_info->checked |= CATEGORY_MASK_SJIS;
   /* A coding system of this category is always ASCII compatible.  */
@@ -4682,7 +4688,8 @@
       ONE_MORE_BYTE (c);
       if (c < 0x80)
 	continue;
-      if ((c >= 0x81 && c <= 0x9F) || (c >= 0xE0 && c <= 0xEF))
+      if ((c >= 0x81 && c <= 0x9F)
+	  || (c >= 0xE0 && c <= max_first_byte_of_2_byte_code))
 	{
 	  ONE_MORE_BYTE (c);
 	  if (c < 0x40 || c == 0x7F || c > 0xFC)
@@ -5055,7 +5062,8 @@
 	      int c1, c2;
 
 	      c1 = code >> 8;
-	      if (c1 == 0x21 || (c1 >= 0x23 && c1 < 0x25)
+	      if (c1 == 0x21 || (c1 >= 0x23 && c1 <= 0x25)
+		  || c1 == 0x28
 		  || (c1 >= 0x2C && c1 <= 0x2F) || c1 >= 0x6E)
 		{
 		  JIS_TO_SJIS2 (code);