changeset 88874:82c5e4f67e4a

(charset_ordered_list_tick): New variable. (Fdefine_charset_internal): Increment charset_ordered_list_tick. (Funify_charset): New optional arg DEUNIFY. If it is non-nil, deunify intead of unify a charset. (string_xstring_p): Add `const' to local variables. (find_charsets_in_text): Add `const' to arguemnts and local variables. (encode_char): Adjusted for the change of Funify_charset. Fix detecting of invalid code. (Fset_charset_priority): Increment charset_ordered_list_tick.
author Kenichi Handa <handa@m17n.org>
date Mon, 22 Jul 2002 06:35:00 +0000
parents 7d441bc35e9b
children 1a232a6d79fc
files src/charset.c
diffstat 1 files changed, 54 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/charset.c	Mon Jul 22 06:30:30 2002 +0000
+++ b/src/charset.c	Mon Jul 22 06:35:00 2002 +0000
@@ -107,6 +107,11 @@
 /* List of charsets ordered by the priority.  */
 Lisp_Object Vcharset_ordered_list;
 
+/* Incremented everytime we change Vcharset_ordered_list.  This is
+   unsigned short so that it fits in Lisp_Int and never match with
+   -1.  */
+unsigned short charset_ordered_list_tick;
+
 /* List of iso-2022 charsets.  */
 Lisp_Object Viso_2022_charset_list;
 
@@ -1055,6 +1060,7 @@
       Vcharset_list = Fcons (args[charset_arg_name], Vcharset_list);
       Vcharset_ordered_list = nconc2 (Vcharset_ordered_list, 
 				      Fcons (make_number (id), Qnil));
+      charset_ordered_list_tick++;
     }
 
   return Qnil;
@@ -1124,12 +1130,18 @@
 }
 
 
-DEFUN ("unify-charset", Funify_charset, Sunify_charset, 1, 2, 0,
+DEFUN ("unify-charset", Funify_charset, Sunify_charset, 1, 3, 0,
        doc: /* Unify characters of CHARSET with Unicode.
 This means reading the relevant file and installing the table defined
-by CHARSET's `:unify-map' property.  */)
-     (charset, unify_map)
-     Lisp_Object charset, unify_map;
+by CHARSET's `:unify-map' property.
+
+Optional second arg UNIFY-MAP a file name string or vector that has
+the same meaning of the `:unify-map' attribute of the function
+`define-charset' (which see).
+
+Optional third argument DEUNIFY, if non-nil, means to de-unify CHARSET.  */)
+     (charset, unify_map, deunify)
+     Lisp_Object charset, unify_map, deunify;
 {
   int id;
   struct charset *cs;
@@ -1138,21 +1150,38 @@
   cs = CHARSET_FROM_ID (id);
   if (CHARSET_METHOD (cs) == CHARSET_METHOD_MAP_DEFERRED)
     load_charset (cs);
-  if (CHARSET_UNIFIED_P (cs)
-      && CHAR_TABLE_P (CHARSET_DEUNIFIER (cs)))
+  if (NILP (deunify)
+      ? CHARSET_UNIFIED_P (cs) && ! NILP (CHARSET_DEUNIFIER (cs))
+      : ! CHARSET_UNIFIED_P (cs))
     return Qnil;
+
   CHARSET_UNIFIED_P (cs) = 0;
-  if (NILP (unify_map))
-    unify_map = CHARSET_UNIFY_MAP (cs);
-  if (STRINGP (unify_map))
-    load_charset_map_from_file (cs, unify_map, 2);
-  else if (VECTORP (unify_map))
-    load_charset_map_from_vector (cs, unify_map, 2);
-  else if (NILP (unify_map))
-    error ("No unify-map for charset");
-  else
-    error ("Bad unify-map arg");
-  CHARSET_UNIFIED_P (cs) = 1;
+  if (NILP (deunify))
+    {
+      if (CHARSET_METHOD (cs) != CHARSET_METHOD_OFFSET)
+	error ("Can't unify charset: %s", XSYMBOL (charset)->name->data);
+      if (NILP (unify_map))
+	unify_map = CHARSET_UNIFY_MAP (cs);
+      if (STRINGP (unify_map))
+	load_charset_map_from_file (cs, unify_map, 2);
+      else if (VECTORP (unify_map))
+	load_charset_map_from_vector (cs, unify_map, 2);
+      else if (NILP (unify_map))
+	error ("No unify-map for charset");
+      else
+	error ("Bad unify-map arg");
+      CHARSET_UNIFIED_P (cs) = 1;
+    }
+  else if (CHAR_TABLE_P (Vchar_unify_table))
+    {
+      int min_code = CHARSET_MIN_CODE (cs);
+      int max_code = CHARSET_MAX_CODE (cs);
+      int min_char = DECODE_CHAR (cs, min_code);
+      int max_char = DECODE_CHAR (cs, max_code);
+      
+      char_table_set_range (Vchar_unify_table, min_char, max_char, Qnil);
+    }
+    
   return Qnil;
 }
 
@@ -1235,8 +1264,8 @@
 string_xstring_p (string)
      Lisp_Object string;
 {
-  unsigned char *p = XSTRING (string)->data;
-  unsigned char *endp = p + STRING_BYTES (XSTRING (string));
+  const unsigned char *p = XSTRING (string)->data;
+  const unsigned char *endp = p + STRING_BYTES (XSTRING (string));
   struct charset *charset;
 
   if (XSTRING (string)->size == STRING_BYTES (XSTRING (string)))
@@ -1265,11 +1294,11 @@
 
 static void
 find_charsets_in_text (ptr, nchars, nbytes, charsets, table)
-     unsigned char *ptr;
+     const unsigned char *ptr;
      int nchars, nbytes;
      Lisp_Object charsets, table;
 {
-  unsigned char *pend = ptr + nbytes;
+  const unsigned char *pend = ptr + nbytes;
   int ncharsets = ASIZE (charsets);
 
   if (nchars == nbytes)
@@ -1490,7 +1519,7 @@
       deunifier = CHARSET_DEUNIFIER (charset);
       if (! CHAR_TABLE_P (deunifier))
 	{
-	  Funify_charset (CHARSET_NAME (charset), Qnil);
+	  Funify_charset (CHARSET_NAME (charset), Qnil, Qnil);
 	  deunifier = CHARSET_DEUNIFIER (charset);
 	}
       deunified = CHAR_TABLE_REF (deunifier, c);
@@ -1530,14 +1559,8 @@
 	  struct charset *this_charset = CHARSET_FROM_ID (id);
 
 	  code = ENCODE_CHAR (this_charset, c);
-	  if (code != CHARSET_INVALID_CODE (this_charset)
-	      && (code_offset < 0 || code >= code_offset))
-	    {
-	      code += code_offset;
-	      if (code >= charset->min_code && code <= charset->max_code
-		  && CODE_POINT_TO_INDEX (charset, code) >= 0)
-		return code;
-	    }
+	  if (code != CHARSET_INVALID_CODE (this_charset))
+	    return code + code_offset;
 	}
       return CHARSET_INVALID_CODE (charset);
     }
@@ -1904,6 +1927,7 @@
   arglist[0] = Fnreverse (new_head);
   arglist[1] = old_list;
   Vcharset_ordered_list = Fnconc (2, arglist);
+  charset_ordered_list_tick++;
   return Qnil;
 }