update.
[chise/xemacs-chise.git] / src / char-ucs.h
index c51639d..395cf6c 100644 (file)
@@ -359,6 +359,9 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 #define MIN_CHAR_HALFWIDTH_KATAKANA    0xFF61
 #define MAX_CHAR_HALFWIDTH_KATAKANA    0xFF9F
 
+#define MIN_CHAR_OBS_94x94     0xE00000
+#define MAX_CHAR_OBS_94x94     (0xE00000 + 94 * 94 * 14 - 1)
+
 #define MIN_CHAR_94            0xE90940
 #define MAX_CHAR_94            (MIN_CHAR_94 + 94 * 80 - 1)
 #define MIN_CHAR_96            (MIN_CHAR_94 + 94 * 80)
@@ -378,28 +381,47 @@ INLINE Emchar
 MAKE_CHAR (Lisp_Object charset, int c1, int c2)
 {
   Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (charset);
-  int idx;
+  int ofs, idx;
   Lisp_Object ch;
 
   if (!EQ (decoding_table, Qnil)
-      && (0 <= (idx = c1 - (XCHARSET_CHARS (charset) == 94 ? 33 : 32)))
+      && (0 <= (idx =
+               c1 - (ofs = (XCHARSET_CHARS (charset) == 94 ? 33 : 32))))
       && (idx < XVECTOR_LENGTH (decoding_table))
       && !EQ (ch = XVECTOR_DATA(decoding_table)[idx], Qnil))
-    return XCHAR (ch);
-  else if (EQ (charset, Vcharset_katakana_jisx0201))
+    {
+      if (VECTORP (ch))
+       {
+         if ((0 <= (idx = c2 - ofs))
+             && (idx < XVECTOR_LENGTH (ch))
+             && !EQ (ch = XVECTOR_DATA(ch)[idx], Qnil))
+           return XCHAR (ch);
+       }
+      else
+       return XCHAR (ch);
+    }
+  if (EQ (charset, Vcharset_katakana_jisx0201))
     if (c1 < 0x60)
       return c1 + MIN_CHAR_HALFWIDTH_KATAKANA - 33;
     else
       /* return MIN_CHAR_94 + ('I' - '0') * 94 + (c1 - 33); */
       return ' ';
   else if (XCHARSET_UCS_MAX (charset))
-    return (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);
+    {
+      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))
@@ -442,7 +464,7 @@ INLINE void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2);
 INLINE void
 breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2)
 {
-  if (c < MIN_CHAR_94)
+  if (c < MIN_CHAR_OBS_94x94)
     {
       Lisp_Object charsets = Vdefault_coded_charset_priority_list;
       while (!EQ (charsets, Qnil))
@@ -513,6 +535,15 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2)
          *c2 = c & 0xff;
        }
     }
+  else if (c <= MAX_CHAR_OBS_94x94)
+    {
+      *charset
+       = CHARSET_BY_ATTRIBUTES (CHARSET_TYPE_94X94,
+                                ((c - MIN_CHAR_OBS_94x94) / (94 * 94)) + '@',
+                                CHARSET_LEFT_TO_RIGHT);
+      *c1 = (((c - MIN_CHAR_OBS_94x94) / 94) % 94) + 33;
+      *c2 = ((c - MIN_CHAR_OBS_94x94) % 94) + 33;
+    }
   else if (c <= MAX_CHAR_94)
     {
       *charset