(add_emchar_rune): Use `ASCII_TO_CHARC', `CHAR_TO_CHARC' and
[chise/xemacs-chise.git-] / src / char-ucs.h
index 63fdc8f..7f40f29 100644 (file)
@@ -18,8 +18,6 @@ along with XEmacs; see the file COPYING.  If not, write to
 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-/* Rewritten by MORIOKA Tomohiko <tomo@m17n.org>. */
-
 #ifndef INCLUDED_char_ucs_h_
 #define INCLUDED_char_ucs_h_
 
@@ -28,41 +26,41 @@ Boston, MA 02111-1307, USA.  */
 #define CHAR_ASCII_P(ch) ((ch) <= 0x7F)
 
 \f
-struct Lisp_Char_Byte_Table
+struct Lisp_Byte_Table
 {
   struct lcrecord_header header;
 
   Lisp_Object property[256];
 };
-typedef struct Lisp_Char_Byte_Table Lisp_Char_Byte_Table;
-
-DECLARE_LRECORD (char_byte_table, Lisp_Char_Byte_Table);
-#define XCHAR_BYTE_TABLE(x) XRECORD (x, char_byte_table, Lisp_Char_Byte_Table)
-#define XSETCHAR_BYTE_TABLE(x, p) XSETRECORD (x, p, char_byte_table)
-#define CHAR_BYTE_TABLE_P(x) RECORDP (x, char_byte_table)
-#define GC_CHAR_BYTE_TABLE_P(x) GC_RECORDP (x, char_byte_table)
-/* #define CHECK_CHAR_BYTE_TABLE(x) CHECK_RECORD (x, char_byte_table)
+typedef struct Lisp_Byte_Table Lisp_Byte_Table;
+
+DECLARE_LRECORD (byte_table, Lisp_Byte_Table);
+#define XBYTE_TABLE(x) XRECORD (x, byte_table, Lisp_Byte_Table)
+#define XSETBYTE_TABLE(x, p) XSETRECORD (x, p, byte_table)
+#define BYTE_TABLE_P(x) RECORDP (x, byte_table)
+#define GC_BYTE_TABLE_P(x) GC_RECORDP (x, byte_table)
+/* #define CHECK_BYTE_TABLE(x) CHECK_RECORD (x, byte_table)
    char table entries should never escape to Lisp */
 
 
-struct Lisp_Char_Code_Table
+struct Lisp_Char_ID_Table
 {
   struct lcrecord_header header;
 
   Lisp_Object table;
 };
-typedef struct Lisp_Char_Code_Table Lisp_Char_Code_Table;
-
-DECLARE_LRECORD (char_code_table, Lisp_Char_Code_Table);
-#define XCHAR_CODE_TABLE(x) XRECORD (x, char_code_table, Lisp_Char_Code_Table)
-#define XSETCHAR_CODE_TABLE(x, p) XSETRECORD (x, p, char_code_table)
-#define CHAR_CODE_TABLE_P(x) RECORDP (x, char_code_table)
-#define GC_CHAR_CODE_TABLE_P(x) GC_RECORDP (x, char_code_table)
-/* #define CHECK_CHAR_CODE_TABLE(x) CHECK_RECORD (x, char_code_table)
+typedef struct Lisp_Char_ID_Table Lisp_Char_ID_Table;
+
+DECLARE_LRECORD (char_id_table, Lisp_Char_ID_Table);
+#define XCHAR_ID_TABLE(x) XRECORD (x, char_id_table, Lisp_Char_ID_Table)
+#define XSETCHAR_ID_TABLE(x, p) XSETRECORD (x, p, char_id_table)
+#define CHAR_ID_TABLE_P(x) RECORDP (x, char_id_table)
+#define GC_CHAR_ID_TABLE_P(x) GC_RECORDP (x, char_id_table)
+/* #define CHECK_CHAR_ID_TABLE(x) CHECK_RECORD (x, char_id_table)
    char table entries should never escape to Lisp */
 
 
-Lisp_Object get_char_code_table (Emchar ch, Lisp_Object table);
+Lisp_Object get_char_id_table (Emchar ch, Lisp_Object table);
 
 
 extern Lisp_Object Vcharset_mojikyo;
@@ -73,7 +71,7 @@ extern Lisp_Object Vcharset_latin_jisx0201;
 /*                    Definition of leading bytes                       */
 /************************************************************************/
 
-typedef int Charset_ID;
+typedef short Charset_ID;
 
 #define MIN_LEADING_BYTE               -0x60
 #define CHARSET_ID_OFFSET              0x00
@@ -278,9 +276,12 @@ struct Lisp_Charset
   /* Which half of font to be used to display this character set */
   unsigned int graphic;
 
-  /* Byte->character mapping table */
+  /* Code-point->character mapping table */
   Lisp_Object decoding_table;
 
+  /* Character->code-point mapping table */
+  Lisp_Object encoding_table;
+
   /* Range of character code */
   Emchar ucs_min, ucs_max;
 
@@ -329,6 +330,7 @@ DECLARE_LRECORD (charset, Lisp_Charset);
 #define CHARSET_CHARS(cs)       ((cs)->chars)
 #define CHARSET_REVERSE_DIRECTION_CHARSET(cs) ((cs)->reverse_direction_charset)
 #define CHARSET_DECODING_TABLE(cs) ((cs)->decoding_table)
+#define CHARSET_ENCODING_TABLE(cs) ((cs)->encoding_table)
 #define CHARSET_UCS_MIN(cs)     ((cs)->ucs_min)
 #define CHARSET_UCS_MAX(cs)     ((cs)->ucs_max)
 #define CHARSET_CODE_OFFSET(cs)         ((cs)->code_offset)
@@ -351,6 +353,7 @@ DECLARE_LRECORD (charset, Lisp_Charset);
 #define XCHARSET_REVERSE_DIRECTION_CHARSET(cs) \
   CHARSET_REVERSE_DIRECTION_CHARSET (XCHARSET (cs))
 #define XCHARSET_DECODING_TABLE(cs) CHARSET_DECODING_TABLE(XCHARSET(cs))
+#define XCHARSET_ENCODING_TABLE(cs) CHARSET_ENCODING_TABLE(XCHARSET(cs))
 #define XCHARSET_UCS_MIN(cs)     CHARSET_UCS_MIN(XCHARSET(cs))
 #define XCHARSET_UCS_MAX(cs)     CHARSET_UCS_MAX(XCHARSET(cs))
 #define XCHARSET_CODE_OFFSET(cs)  CHARSET_CODE_OFFSET(XCHARSET(cs))
@@ -529,87 +532,60 @@ INLINE_HEADER int charset_code_point (Lisp_Object charset, Emchar ch);
 INLINE_HEADER int
 charset_code_point (Lisp_Object charset, Emchar ch)
 {
-  Lisp_Object cdef = get_char_code_table (ch, Vcharacter_attribute_table);
-
-  if (!NILP (cdef))
-    {
-      Lisp_Object field = Fassq (charset, cdef);
+  Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (charset);
+  Lisp_Object ret;
 
-      if (!NILP (field))
-       return XINT (Fcdr (field));
-    }
-  return range_charset_code_point (charset, ch);
+  if ( CHAR_ID_TABLE_P (encoding_table)
+       && INTP (ret = get_char_id_table (ch, encoding_table)) )
+    return XINT (ret);
+  else
+    return range_charset_code_point (charset, ch);
 }
 
 extern Lisp_Object Vdefault_coded_charset_priority_list;
 EXFUN (Ffind_charset, 1);
 
-INLINE_HEADER int encode_char_1 (Emchar c, Lisp_Object* charset);
+INLINE_HEADER int encode_char_1 (Emchar ch, Lisp_Object* charset);
 INLINE_HEADER int
-encode_char_1 (Emchar c, Lisp_Object* charset)
+encode_char_1 (Emchar ch, Lisp_Object* charset)
 {
-  Lisp_Object cdef = get_char_code_table (c, Vcharacter_attribute_table);
+  Lisp_Object charsets = Vdefault_coded_charset_priority_list;
 
-  if (!EQ (cdef, Qnil))
+  while (!NILP (charsets))
     {
-      Lisp_Object charsets = Vdefault_coded_charset_priority_list;
-      Lisp_Object field;
-
-      while (!EQ (charsets, Qnil))
+      *charset = Ffind_charset (Fcar (charsets));
+      if (!NILP (*charset))
        {
-         *charset = Ffind_charset (Fcar (charsets));
-         if (!EQ (*charset, Qnil))
+         Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (*charset);
+         Lisp_Object ret;
+
+         if ( CHAR_ID_TABLE_P (encoding_table)
+              && INTP (ret = get_char_id_table (ch, encoding_table)) )
+           return XINT (ret);
+         else
            {
              int code_point;
 
-             if (!NILP (field = Fassq (*charset, cdef)))
-               return XINT (Fcdr (field));
-             else if ((code_point
-                       = range_charset_code_point (*charset, c)) >= 0)
+             if ((code_point
+                  = range_charset_code_point (*charset, ch)) >= 0)
                return code_point;
            }
-         charsets = Fcdr (charsets);         
        }
+      charsets = Fcdr (charsets);            
     }
   
   /* otherwise --- maybe for bootstrap */
-  return encode_builtin_char_1 (c, charset);
+  return encode_builtin_char_1 (ch, charset);
 }
 
-INLINE_HEADER int encode_char_2 (Emchar ch, Lisp_Object* charset);
-INLINE_HEADER int
-encode_char_2 (Emchar ch, Lisp_Object* charset)
-{
-  int code_point = encode_char_1 (ch, charset);
-
-  if (EQ (*charset, Vcharset_mojikyo))
-    {
-      int plane, byte1, byte2;
-
-      code_point--;
-      plane = code_point / (94 * 60);
-      byte1 = (code_point % (94 * 60)) / 94;
-      if (byte1 < 30)
-       byte1 += 16 + 32;
-      else
-       byte1 += 18 + 32;
-      byte2 = code_point % 94 + 33;
-      *charset
-       = CHARSET_BY_LEADING_BYTE (LEADING_BYTE_MOJIKYO_PJ_1 - plane);
-      return (byte1 << 8) | byte2;
-    }
-  else
-    return code_point;
-}
-
-#define ENCODE_CHAR(ch, charset)       encode_char_2 (ch, &(charset))
+#define ENCODE_CHAR(ch, charset)       encode_char_1 (ch, &(charset))
 
 INLINE_HEADER void
 breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2);
 INLINE_HEADER void
 breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2)
 {
-  int code_point = encode_char_2 (c, charset);
+  int code_point = encode_char_1 (c, charset);
 
   if (code_point >= 0)
     {
@@ -647,6 +623,39 @@ CHAR_CHARSET (Emchar ch)
 #define CHAR_CHARSET_ID(c)  (XCHARSET_ID(CHAR_CHARSET(c)))
 #define CHAR_COLUMNS(c)     (CHARSET_COLUMNS(XCHARSET(CHAR_CHARSET(c))))
 
+
+typedef struct Charc
+{
+  Lisp_Object charset;
+  int code_point;
+} Charc;
+
+INLINE_HEADER Charc CHAR_TO_CHARC (Emchar ch);
+INLINE_HEADER Charc
+CHAR_TO_CHARC (Emchar ch)
+{
+  Charc cc;
+
+  cc.code_point = encode_char_1 (ch, &cc.charset);
+  if (EQ (cc.charset, Vcharset_mojikyo))
+    {
+      int plane, byte1, byte2;
+
+      cc.code_point--;
+      plane = cc.code_point / (94 * 60);
+      byte1 = (cc.code_point % (94 * 60)) / 94;
+      if (byte1 < 30)
+       byte1 += 16 + 32;
+      else
+       byte1 += 18 + 32;
+      byte2 = cc.code_point % 94 + 33;
+      cc.charset
+       = CHARSET_BY_LEADING_BYTE (LEADING_BYTE_MOJIKYO_PJ_1 - plane);
+      cc.code_point = (byte1 << 8) | byte2;
+    }
+  return cc;
+}
+
 \f
 /************************************************************************/
 /*                            Exported functions                        */