diff src/charset.c @ 94921:c2449f1de3ac

(Vcharset_non_preferred_head): New variable. (Vcurrent_iso639_language): New variable. (syms_of_charset): Declare it as a Lisp variable. (char_charset): Don't check non preferred charsets. As a last resort, return charset_unicode. (Fset_charset_priority): Update Vcharset_non_preferred_head.
author Kenichi Handa <handa@m17n.org>
date Wed, 14 May 2008 01:22:48 +0000
parents 33248fa26b8c
children 8971ddf55736
line wrap: on
line diff
--- a/src/charset.c	Wed May 14 01:22:19 2008 +0000
+++ b/src/charset.c	Wed May 14 01:22:48 2008 +0000
@@ -97,6 +97,10 @@
 /* List of charsets ordered by the priority.  */
 Lisp_Object Vcharset_ordered_list;
 
+/* Sub-list of Vcharset_ordered_list that contains all non-preferred
+   charsets.  */
+Lisp_Object Vcharset_non_preferred_head;
+
 /* Incremented everytime we change Vcharset_ordered_list.  This is
    unsigned short so that it fits in Lisp_Int and never matches
    -1.  */
@@ -118,6 +122,8 @@
 
 Lisp_Object Vchar_unified_charset_table;
 
+Lisp_Object Vcurrent_iso639_language;
+
 /* Defined in chartab.c */
 extern void
 map_char_table_for_charset P_ ((void (*c_function) (Lisp_Object, Lisp_Object),
@@ -1810,7 +1816,8 @@
   if (NILP (charset_list))
     charset_list = Vcharset_ordered_list;
 
-  while (CONSP (charset_list))
+  while (CONSP (charset_list)
+	 && ! EQ (charset_list, Vcharset_non_preferred_head))
     {
       struct charset *charset = CHARSET_FROM_ID (XINT (XCAR (charset_list)));
       unsigned code = ENCODE_CHAR (charset, c);
@@ -1823,7 +1830,8 @@
 	}
       charset_list = XCDR (charset_list);
     }
-  return NULL;
+  return (c <= MAX_UNICODE_CHAR ? CHARSET_FROM_ID (charset_unicode)
+	  : CHARSET_FROM_ID (charset_eight_bit));
 }
 
 
@@ -1994,7 +2002,7 @@
 	}
     }
   arglist[0] = Fnreverse (new_head);
-  arglist[1] = old_list;
+  arglist[1] = Vcharset_non_preferred_head = old_list;
   Vcharset_ordered_list = Fnconc (2, arglist);
   charset_ordered_list_tick++;
 
@@ -2133,6 +2141,12 @@
 	       doc: /* List of all charsets ever defined.  */);
   Vcharset_list = Qnil;
 
+  DEFVAR_LISP ("current-iso639-language", &Vcurrent_iso639_language,
+	       doc: /* ISO639 language mnemonic symbol for the current language environment.
+If the current language environment is for multiple languages (e.g. "Latin-1"),
+the value may be a list of mnemonics.  */);
+  Vcurrent_iso639_language = Qnil;
+
   charset_ascii
     = define_charset_internal (Qascii, 1, "\x00\x7F\x00\x00\x00\x00",
 			       0, 127, 'B', -1, 0, 1, 0, 0);