(M31000): New character.
[chise/xemacs-chise.git] / src / char-ucs.h
index 3c0958c..3cd3d5c 100644 (file)
@@ -111,35 +111,37 @@ typedef int Charset_ID;
 #define LEADING_BYTE_ETHIOPIC_UCS      (CHARSET_ID_OFFSET - 9)
 
 #define LEADING_BYTE_DAIKANWA          (CHARSET_ID_OFFSET - 10)
+#define LEADING_BYTE_DAIKANWA_EKANJI   (CHARSET_ID_OFFSET - 11)
+#define LEADING_BYTE_MOJIKYO           (CHARSET_ID_OFFSET - 12)
 
 /* Japanese JIS X0208-1990     2/4 2/{(8),9,10,11} 4/2 (B) */
-#define LEADING_BYTE_JAPANESE_JISX0208_1990 (CHARSET_ID_OFFSET - 11)
+#define LEADING_BYTE_JAPANESE_JISX0208_1990 (CHARSET_ID_OFFSET - 13)
 
 /* Konjaku-Mojikyo font (for pseudo-JIS X 0208 encoding) */
-#define LEADING_BYTE_MOJIKYO_PJ_1      (CHARSET_ID_OFFSET - 12)
-#define LEADING_BYTE_MOJIKYO_PJ_2      (CHARSET_ID_OFFSET - 13)
-#define LEADING_BYTE_MOJIKYO_PJ_3      (CHARSET_ID_OFFSET - 14)
-#define LEADING_BYTE_MOJIKYO_PJ_4      (CHARSET_ID_OFFSET - 15)
-#define LEADING_BYTE_MOJIKYO_PJ_5      (CHARSET_ID_OFFSET - 16)
-#define LEADING_BYTE_MOJIKYO_PJ_6      (CHARSET_ID_OFFSET - 17)
-#define LEADING_BYTE_MOJIKYO_PJ_7      (CHARSET_ID_OFFSET - 18)
-#define LEADING_BYTE_MOJIKYO_PJ_8      (CHARSET_ID_OFFSET - 19)
-#define LEADING_BYTE_MOJIKYO_PJ_9      (CHARSET_ID_OFFSET - 20)
-#define LEADING_BYTE_MOJIKYO_PJ_10     (CHARSET_ID_OFFSET - 21)
-#define LEADING_BYTE_MOJIKYO_PJ_11     (CHARSET_ID_OFFSET - 22)
-#define LEADING_BYTE_MOJIKYO_PJ_12     (CHARSET_ID_OFFSET - 23)
-#define LEADING_BYTE_MOJIKYO_PJ_13     (CHARSET_ID_OFFSET - 24)
-#define LEADING_BYTE_MOJIKYO_PJ_14     (CHARSET_ID_OFFSET - 25)
-#define LEADING_BYTE_MOJIKYO_PJ_15     (CHARSET_ID_OFFSET - 26)
-#define LEADING_BYTE_MOJIKYO_PJ_16     (CHARSET_ID_OFFSET - 27)
-#define LEADING_BYTE_MOJIKYO_PJ_17     (CHARSET_ID_OFFSET - 28)
-#define LEADING_BYTE_MOJIKYO_PJ_18     (CHARSET_ID_OFFSET - 29)
-#define LEADING_BYTE_MOJIKYO_PJ_19     (CHARSET_ID_OFFSET - 30)
-#define LEADING_BYTE_MOJIKYO_PJ_20     (CHARSET_ID_OFFSET - 31)
-#define LEADING_BYTE_MOJIKYO_PJ_21     (CHARSET_ID_OFFSET - 32)
+#define LEADING_BYTE_MOJIKYO_PJ_1      (CHARSET_ID_OFFSET - 14)
+#define LEADING_BYTE_MOJIKYO_PJ_2      (CHARSET_ID_OFFSET - 15)
+#define LEADING_BYTE_MOJIKYO_PJ_3      (CHARSET_ID_OFFSET - 16)
+#define LEADING_BYTE_MOJIKYO_PJ_4      (CHARSET_ID_OFFSET - 17)
+#define LEADING_BYTE_MOJIKYO_PJ_5      (CHARSET_ID_OFFSET - 18)
+#define LEADING_BYTE_MOJIKYO_PJ_6      (CHARSET_ID_OFFSET - 19)
+#define LEADING_BYTE_MOJIKYO_PJ_7      (CHARSET_ID_OFFSET - 20)
+#define LEADING_BYTE_MOJIKYO_PJ_8      (CHARSET_ID_OFFSET - 21)
+#define LEADING_BYTE_MOJIKYO_PJ_9      (CHARSET_ID_OFFSET - 22)
+#define LEADING_BYTE_MOJIKYO_PJ_10     (CHARSET_ID_OFFSET - 23)
+#define LEADING_BYTE_MOJIKYO_PJ_11     (CHARSET_ID_OFFSET - 24)
+#define LEADING_BYTE_MOJIKYO_PJ_12     (CHARSET_ID_OFFSET - 25)
+#define LEADING_BYTE_MOJIKYO_PJ_13     (CHARSET_ID_OFFSET - 26)
+#define LEADING_BYTE_MOJIKYO_PJ_14     (CHARSET_ID_OFFSET - 27)
+#define LEADING_BYTE_MOJIKYO_PJ_15     (CHARSET_ID_OFFSET - 28)
+#define LEADING_BYTE_MOJIKYO_PJ_16     (CHARSET_ID_OFFSET - 29)
+#define LEADING_BYTE_MOJIKYO_PJ_17     (CHARSET_ID_OFFSET - 30)
+#define LEADING_BYTE_MOJIKYO_PJ_18     (CHARSET_ID_OFFSET - 31)
+#define LEADING_BYTE_MOJIKYO_PJ_19     (CHARSET_ID_OFFSET - 32)
+#define LEADING_BYTE_MOJIKYO_PJ_20     (CHARSET_ID_OFFSET - 33)
+#define LEADING_BYTE_MOJIKYO_PJ_21     (CHARSET_ID_OFFSET - 34)
 
 #define MIN_LEADING_BYTE_PRIVATE       MIN_LEADING_BYTE
-#define MAX_LEADING_BYTE_PRIVATE       (CHARSET_ID_OFFSET - 33)
+#define MAX_LEADING_BYTE_PRIVATE       (CHARSET_ID_OFFSET - 35)
 
 
 /* #define CHARSET_ID_OFFSET_94                (CHARSET_ID_OFFSET - '0') */
@@ -394,11 +396,13 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 
 #define MAX_CHAR_BASIC_LATIN   0x007F
 
+/*
 #define MIN_CHAR_GREEK         0x0370
 #define MAX_CHAR_GREEK         0x03CF
 
 #define MIN_CHAR_CYRILLIC      0x0400
 #define MAX_CHAR_CYRILLIC      0x045F
+*/
 
 #define MIN_CHAR_HEBREW                0x0590
 #define MAX_CHAR_HEBREW                0x05EF
@@ -419,8 +423,10 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 
 #define MAX_CHAR_BMP           0x00FFFF
 
-#define MIN_CHAR_DAIKANWA      0xE00000
+#define MIN_CHAR_MOJIKYO       0xE00000
+#define MIN_CHAR_DAIKANWA      MIN_CHAR_MOJIKYO
 #define MAX_CHAR_DAIKANWA      0xE0FFFF
+#define MAX_CHAR_MOJIKYO       0xE9093F
 
 #define MIN_CHAR_94            0xE90940
 #define MAX_CHAR_94            (MIN_CHAR_94 + 94 * 80 - 1)
@@ -435,78 +441,51 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 #define MAX_CHAR_96x96         (MIN_CHAR_96x96 + 96 * 96 * 80 - 1)
 
 
-/* Return a character whose charset is CHARSET and position-codes
-   are C1 and C2.  TYPE9N character ignores C2. */
+Emchar make_builtin_char (Lisp_Object charset, int c1, int c2);
 
-INLINE Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2);
+INLINE Emchar DECODE_CHAR (Lisp_Object charset, int code_point);
 INLINE Emchar
-MAKE_CHAR (Lisp_Object charset, int c1, int c2)
+DECODE_CHAR (Lisp_Object charset, int code_point)
 {
+  int dim = XCHARSET_DIMENSION (charset);
   Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (charset);
   int idx;
   Lisp_Object ch;
 
-  if (!EQ (decoding_table, Qnil)
-      && (0 <= (idx = c1 - XCHARSET_BYTE_OFFSET (charset)))
-      && (idx < XVECTOR_LENGTH (decoding_table))
-      && !EQ (ch = XVECTOR_DATA(decoding_table)[idx], Qnil))
+  while (dim > 0)
     {
-      if (VECTORP (ch))
+      dim--;
+      if ( VECTORP (decoding_table)
+          && ( 0 <= (idx = ((code_point >> (dim * 8))
+                            & 255) - XCHARSET_BYTE_OFFSET (charset)) )
+          && ( idx < XVECTOR_LENGTH (decoding_table) )
+          && !NILP (ch = XVECTOR_DATA(decoding_table)[idx]) )
        {
-         if ((0 <= (idx = c2 - XCHARSET_BYTE_OFFSET (charset)))
-             && (idx < XVECTOR_LENGTH (ch))
-             && !EQ (ch = XVECTOR_DATA(ch)[idx], Qnil))
+         if (CHARP (ch))
            return XCHAR (ch);
+         else
+           decoding_table = ch;
        }
       else
-       return XCHAR (ch);
-    }
-  if (XCHARSET_UCS_MAX (charset))
-    {
-      Emchar code
-       = (XCHARSET_DIMENSION (charset) == 1
-          ?
-          c1 - XCHARSET_BYTE_OFFSET (charset)
-          :
-          (c1 - XCHARSET_BYTE_OFFSET (charset)) * XCHARSET_CHARS (charset)
-          + c2  - XCHARSET_BYTE_OFFSET (charset))
-       - XCHARSET_CODE_OFFSET (charset) + XCHARSET_UCS_MIN (charset);
-      if ((code < XCHARSET_UCS_MIN (charset))
-         || (XCHARSET_UCS_MAX (charset) < code))
-       signal_simple_error ("Arguments makes invalid character",
-                            make_char (code));
-      return code;
-    }
-  else if (XCHARSET_DIMENSION (charset) == 1)
-    {
-      switch (XCHARSET_CHARS (charset))
-       {
-       case 94:
-         return MIN_CHAR_94
-           + (XCHARSET_FINAL (charset) - '0') * 94 + (c1 - 33);
-       case 96:
-         return MIN_CHAR_96
-           + (XCHARSET_FINAL (charset) - '0') * 96 + (c1 - 32);
-       default:
-         abort ();
-       }
+       break;
     }
+  if (XCHARSET_DIMENSION (charset) == 1)
+    return make_builtin_char (charset, code_point, 0);
   else
-    {
-      switch (XCHARSET_CHARS (charset))
-       {
-       case 94:
-         return MIN_CHAR_94x94
-           + (XCHARSET_FINAL (charset) - '0') * 94 * 94
-           + (c1 - 33) * 94 + (c2 - 33);
-       case 96:
-         return MIN_CHAR_96x96
-           + (XCHARSET_FINAL (charset) - '0') * 96 * 96
-           + (c1 - 32) * 96 + (c2 - 32);
-       default:
-         abort ();
-       }
-    }
+    return make_builtin_char (charset, code_point >> 8, code_point & 255);
+}
+
+/* Return a character whose charset is CHARSET and position-codes
+   are C1 and C2.  TYPE9N character ignores C2. */
+
+INLINE Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2);
+INLINE Emchar
+MAKE_CHAR (Lisp_Object charset, int c1, int c2)
+{
+  if (XCHARSET_DIMENSION (charset) == 1)
+    return DECODE_CHAR (charset, c1);
+  else
+    return DECODE_CHAR (charset, (c1 << 8) | c2);
 }
 
 extern Lisp_Object Vcharacter_attribute_table;