(enum lrecord_type): Rename `lrecord_type_char_code_table' to
[chise/xemacs-chise.git-] / src / char-ucs.h
index 7c873a8..9829e95 100644 (file)
@@ -20,59 +20,53 @@ Boston, MA 02111-1307, USA.  */
 
 /* Rewritten by MORIOKA Tomohiko <tomo@m17n.org>. */
 
-#ifndef _XEMACS_CHAR_UCS_H
-#define _XEMACS_CHAR_UCS_H
+#ifndef INCLUDED_char_ucs_h_
+#define INCLUDED_char_ucs_h_
 
 #define valid_char_p(ch) 1
 
 #define CHAR_ASCII_P(ch) ((ch) <= 0x7F)
 
 \f
-DECLARE_LRECORD (char_byte_table, struct Lisp_Char_Byte_Table);
-#define XCHAR_BYTE_TABLE(x) \
-  XRECORD (x, char_byte_table, struct 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)
-   char table entries should never escape to Lisp */
-
-struct Lisp_Char_Byte_Table
+struct Lisp_Byte_Table
 {
   struct lcrecord_header header;
 
   Lisp_Object property[256];
 };
-
-
-DECLARE_LRECORD (char_code_table, struct Lisp_Char_Code_Table);
-#define XCHAR_CODE_TABLE(x) \
-  XRECORD (x, char_code_table, struct 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_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_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_ucs;
-extern Lisp_Object Vcharset_ucs_bmp;
+extern Lisp_Object Vcharset_mojikyo;
 extern Lisp_Object Vcharset_latin_jisx0201;
-extern Lisp_Object Vcharset_latin_iso8859_2;
-extern Lisp_Object Vcharset_latin_iso8859_3;
-extern Lisp_Object Vcharset_latin_iso8859_4;
-extern Lisp_Object Vcharset_latin_iso8859_9;
-extern Lisp_Object Vcharset_latin_viscii_lower;
-extern Lisp_Object Vcharset_latin_viscii_upper;
 
 \f
 /************************************************************************/
@@ -256,7 +250,10 @@ struct Lisp_Charset
 
   int id;
   Lisp_Object name;
-  Lisp_Object doc_string, registry, short_name, long_name;
+  Lisp_Object doc_string;
+  Lisp_Object registry;
+  Lisp_Object short_name;
+  Lisp_Object long_name;
 
   Lisp_Object reverse_direction_charset;
 
@@ -293,9 +290,10 @@ struct Lisp_Charset
   /* Offset for each byte */
   Emchar byte_offset;
 };
+typedef struct Lisp_Charset Lisp_Charset;
 
-DECLARE_LRECORD (charset, struct Lisp_Charset);
-#define XCHARSET(x) XRECORD (x, charset, struct Lisp_Charset)
+DECLARE_LRECORD (charset, Lisp_Charset);
+#define XCHARSET(x) XRECORD (x, charset, Lisp_Charset)
 #define XSETCHARSET(x, p) XSETRECORD (x, p, charset)
 #define CHARSETP(x) RECORDP (x, charset)
 #define GC_CHARSETP(x) GC_RECORDP (x, charset)
@@ -364,6 +362,8 @@ struct charset_lookup {
   
   /* Table of charsets indexed by type/final-byte/direction. */
   Lisp_Object charset_by_attributes[4][128];
+
+  Charset_ID next_allocated_leading_byte;
 };
 
 extern struct charset_lookup *chlook;
@@ -372,8 +372,8 @@ extern struct charset_lookup *chlook;
 /* int not Bufbyte even though that is the actual type of a leading byte.
    This way, out-ot-range values will get caught rather than automatically
    truncated. */
-INLINE Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb);
-INLINE Lisp_Object
+INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb);
+INLINE_HEADER Lisp_Object
 CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 {
   assert (lb >= MIN_LEADING_BYTE &&
@@ -428,7 +428,8 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 #define MIN_CHAR_MOJIKYO       0xE00000
 #define MIN_CHAR_DAIKANWA      MIN_CHAR_MOJIKYO
 #define MAX_CHAR_DAIKANWA      0xE0FFFF
-#define MAX_CHAR_MOJIKYO       0xE9093F
+/* #define MAX_CHAR_MOJIKYO    0xE9093F */
+#define MAX_CHAR_MOJIKYO       (MIN_CHAR_MOJIKYO + 94 * 60 * 22)
 
 #define MIN_CHAR_94            0xE90940
 #define MAX_CHAR_94            (MIN_CHAR_94 + 94 * 80 - 1)
@@ -445,8 +446,8 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb)
 
 Emchar make_builtin_char (Lisp_Object charset, int c1, int c2);
 
-INLINE Emchar DECODE_CHAR (Lisp_Object charset, int code_point);
-INLINE Emchar
+INLINE_HEADER Emchar DECODE_CHAR (Lisp_Object charset, int code_point);
+INLINE_HEADER Emchar
 DECODE_CHAR (Lisp_Object charset, int code_point)
 {
   int dim = XCHARSET_DIMENSION (charset);
@@ -474,14 +475,43 @@ DECODE_CHAR (Lisp_Object charset, int code_point)
   if (XCHARSET_DIMENSION (charset) == 1)
     return make_builtin_char (charset, code_point, 0);
   else
-    return make_builtin_char (charset, code_point >> 8, code_point & 255);
+    {
+      int plane = LEADING_BYTE_MOJIKYO_PJ_1 - XCHARSET_ID (charset);
+
+      if ( (0 <= plane) && (plane <= 21) )
+       {
+         int c1 = code_point >> 8;
+         int c2 = code_point & 255;
+
+         if (c1 < 16 + 32)
+           return ' ';
+         else if (c1 < 16 + 32 + 30)
+           return DECODE_CHAR (Vcharset_mojikyo,
+                               plane * (94 * 60)
+                               + (c1 - (16 + 32)) * 94
+                               + (c2 - 33)
+                               + 1);
+         else if (c1 < 18 + 32 + 30)
+           return ' ';
+         else if (c1 < 18 + 32 + 60)
+           return DECODE_CHAR (Vcharset_mojikyo,
+                               plane * (94 * 60)
+                               + (c1 - (18 + 32)) * 94
+                               + (c2 - 33)
+                               + 1);
+         else
+           return ' ';
+       }
+      else
+       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
+INLINE_HEADER Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2);
+INLINE_HEADER Emchar
 MAKE_CHAR (Lisp_Object charset, int c1, int c2)
 {
   if (XCHARSET_DIMENSION (charset) == 1)
@@ -495,11 +525,11 @@ extern Lisp_Object Vcharacter_attribute_table;
 int encode_builtin_char_1 (Emchar c, Lisp_Object* charset);
 int range_charset_code_point (Lisp_Object charset, Emchar ch);
 
-INLINE int charset_code_point (Lisp_Object charset, Emchar ch);
-INLINE int
+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);
+  Lisp_Object cdef = get_char_id_table (ch, Vcharacter_attribute_table);
 
   if (!NILP (cdef))
     {
@@ -514,11 +544,11 @@ charset_code_point (Lisp_Object charset, Emchar ch)
 extern Lisp_Object Vdefault_coded_charset_priority_list;
 EXFUN (Ffind_charset, 1);
 
-INLINE int encode_char_1 (Emchar c, Lisp_Object* charset);
-INLINE int
+INLINE_HEADER int encode_char_1 (Emchar c, Lisp_Object* charset);
+INLINE_HEADER int
 encode_char_1 (Emchar c, Lisp_Object* charset)
 {
-  Lisp_Object cdef = get_char_code_table (c, Vcharacter_attribute_table);
+  Lisp_Object cdef = get_char_id_table (c, Vcharacter_attribute_table);
 
   if (!EQ (cdef, Qnil))
     {
@@ -527,11 +557,11 @@ encode_char_1 (Emchar c, Lisp_Object* charset)
 
       while (!EQ (charsets, Qnil))
        {
-         int code_point;
-
          *charset = Ffind_charset (Fcar (charsets));
          if (!EQ (*charset, Qnil))
            {
+             int code_point;
+
              if (!NILP (field = Fassq (*charset, cdef)))
                return XINT (Fcdr (field));
              else if ((code_point
@@ -546,13 +576,40 @@ encode_char_1 (Emchar c, Lisp_Object* charset)
   return encode_builtin_char_1 (c, charset);
 }
 
-#define ENCODE_CHAR(ch, charset)       encode_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);
 
-INLINE void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2);
-INLINE void
+  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))
+
+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_1 (c, charset);
+  int code_point = encode_char_2 (c, charset);
 
   if (code_point >= 0)
     {
@@ -577,14 +634,13 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2)
 #define BREAKUP_CHAR(ch, charset, b1, b2) \
   breakup_char_1 (ch, &(charset), &(b1), &(b2))
 
-INLINE Lisp_Object CHAR_CHARSET (Emchar ch);
-INLINE Lisp_Object
+INLINE_HEADER Lisp_Object CHAR_CHARSET (Emchar ch);
+INLINE_HEADER Lisp_Object
 CHAR_CHARSET (Emchar ch)
 {
   Lisp_Object charset;
-  int b1, b2;
-
-  BREAKUP_CHAR(ch, charset, b1, b2);
+  ENCODE_CHAR (ch, charset);
   return charset;
 }
 
@@ -603,4 +659,4 @@ extern Lisp_Object Vcharset_chinese_big5_2;
 extern Lisp_Object Vcharset_japanese_jisx0208;
 extern Lisp_Object Vcharset_japanese_jisx0212;
 
-#endif /* _XEMACS_CHAR_UCS_H */
+#endif /* INCLUDED_char_ucs_h_ */