(Vcharset_chinese_gb12345): New variable.
[chise/xemacs-chise.git-] / src / lrecord.h
index 1a39ab5..0acf348 100644 (file)
@@ -75,11 +75,35 @@ struct lrecord_header
 
   /* 1 if the object is readonly from lisp */
   unsigned int lisp_readonly :1;
+
+#ifdef UTF2000
+  /* The `older field is a flag that indicates whether this lcrecord
+     is on a "older storage". */
+  unsigned int older :1;
+#endif
 };
 
 struct lrecord_implementation;
 int lrecord_type_index (const struct lrecord_implementation *implementation);
 
+#ifdef UTF2000
+#define set_lheader_implementation(header,imp) do {    \
+  struct lrecord_header* SLI_header = (header);                \
+  SLI_header->type = (imp)->lrecord_type_index;                \
+  SLI_header->mark = 0;                                        \
+  SLI_header->older = 0;                               \
+  SLI_header->c_readonly = 0;                          \
+  SLI_header->lisp_readonly = 0;                       \
+} while (0)
+#define set_lheader_older_implementation(header,imp) do {      \
+  struct lrecord_header* SLI_header = (header);                        \
+  SLI_header->type = (imp)->lrecord_type_index;                        \
+  SLI_header->mark = 0;                                                \
+  SLI_header->older = 1;                                       \
+  SLI_header->c_readonly = 0;                                  \
+  SLI_header->lisp_readonly = 0;                               \
+} while (0)
+#else
 #define set_lheader_implementation(header,imp) do {    \
   struct lrecord_header* SLI_header = (header);                \
   SLI_header->type = (imp)->lrecord_type_index;                \
@@ -87,6 +111,7 @@ int lrecord_type_index (const struct lrecord_implementation *implementation);
   SLI_header->c_readonly = 0;                          \
   SLI_header->lisp_readonly = 0;                       \
 } while (0)
+#endif
 
 struct lcrecord_header
 {
@@ -154,6 +179,10 @@ enum lrecord_type
   lrecord_type_coding_system,
   lrecord_type_char_table,
   lrecord_type_char_table_entry,
+  lrecord_type_char_id_table,
+  lrecord_type_byte_table,
+  lrecord_type_uint16_byte_table,
+  lrecord_type_uint8_byte_table,
   lrecord_type_range_table,
   lrecord_type_opaque,
   lrecord_type_opaque_ptr,
@@ -188,6 +217,7 @@ enum lrecord_type
   lrecord_type_pgresult,
   lrecord_type_devmode,
   lrecord_type_mswindows_dialog_id,
+  lrecord_type_case_table,
   lrecord_type_last_built_in_type /* must be last */
 };
 
@@ -280,6 +310,10 @@ extern int gc_in_progress;
 #define MARK_RECORD_HEADER(lheader)   ((void) ((lheader)->mark = 1))
 #define UNMARK_RECORD_HEADER(lheader) ((void) ((lheader)->mark = 0))
 
+#define OLDER_RECORD_P(obj) (XRECORD_LHEADER (obj)->older)
+#define OLDER_RECORD_HEADER_P(lheader) ((lheader)->older)
+
+
 #define C_READONLY_RECORD_HEADER_P(lheader)  ((lheader)->c_readonly)
 #define LISP_READONLY_RECORD_HEADER_P(lheader)  ((lheader)->lisp_readonly)
 #define SET_C_READONLY_RECORD_HEADER(lheader) do {     \
@@ -328,10 +362,6 @@ extern int gc_in_progress;
   An array of Lisp objects or pointers to lrecords.
   The third element is the count.
 
-    XD_LO_RESET_NIL
-  Lisp objects which will be reset to Qnil when dumping.  Useful for cleaning
-  up caches.
-
     XD_LO_LINK
   Link in a linked list of objects of the same type.
 
@@ -386,7 +416,6 @@ extern int gc_in_progress;
 enum lrecord_description_type {
   XD_LISP_OBJECT_ARRAY,
   XD_LISP_OBJECT,
-  XD_LO_RESET_NIL,
   XD_LO_LINK,
   XD_OPAQUE_PTR,
   XD_STRUCT_PTR,
@@ -477,11 +506,11 @@ MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash
 
 #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \
 DECLARE_ERROR_CHECK_TYPECHECK(c_name, structtype)                      \
-unsigned int lrecord_type_##c_name = lrecord_type_count++;              \
-const struct lrecord_implementation lrecord_##c_name =                 \
+unsigned int lrecord_type_##c_name;                                    \
+struct lrecord_implementation lrecord_##c_name =                       \
   { name, marker, printer, nuker, equal, hash, desc,                   \
     getprop, putprop, remprop, plist, size, sizer,                     \
-    (enum lrecord_type)lrecord_type_##c_name, basic_p }
+    lrecord_type_last_built_in_type, basic_p }
 
 
 extern Lisp_Object (*lrecord_markers[]) (Lisp_Object);
@@ -492,6 +521,12 @@ extern Lisp_Object (*lrecord_markers[]) (Lisp_Object);
     lrecord_implementations_table[lrecord_type_##type]->marker;                \
 } while (0)
 
+#define INIT_EXTERNAL_LRECORD_IMPLEMENTATION(type) do {                        \
+  lrecord_type_##type = lrecord_type_count++;                          \
+  lrecord_##type.lrecord_type_index = lrecord_type_##type;             \
+  INIT_LRECORD_IMPLEMENTATION(type);                                   \
+} while (0)
+
 #define LRECORDP(a) (XTYPE (a) == Lisp_Type_Record)
 #define XRECORD_LHEADER(a) ((struct lrecord_header *) XPNTR (a))
 
@@ -646,7 +681,16 @@ extern Lisp_Object Q##c_name##p
 
 # define DECLARE_EXTERNAL_LRECORD(c_name, structtype)          \
 extern unsigned int lrecord_type_##c_name;                      \
-DECLARE_LRECORD(c_name, structtype)
+extern struct lrecord_implementation lrecord_##c_name;         \
+INLINE_HEADER structtype *                                     \
+error_check_##c_name (Lisp_Object obj);                                \
+INLINE_HEADER structtype *                                     \
+error_check_##c_name (Lisp_Object obj)                         \
+{                                                              \
+  assert (RECORD_TYPEP (obj, lrecord_type_##c_name));          \
+  return (structtype *) XPNTR (obj);                           \
+}                                                              \
+extern Lisp_Object Q##c_name##p
 
 # define DECLARE_NONRECORD(c_name, type_enum, structtype)      \
 INLINE_HEADER structtype *                                     \
@@ -676,7 +720,7 @@ extern const struct lrecord_implementation lrecord_##c_name
 # define DECLARE_EXTERNAL_LRECORD(c_name, structtype)          \
 extern Lisp_Object Q##c_name##p;                               \
 extern unsigned int lrecord_type_##c_name;                     \
-extern const struct lrecord_implementation lrecord_##c_name
+extern struct lrecord_implementation lrecord_##c_name
 # define DECLARE_NONRECORD(c_name, type_enum, structtype)      \
 extern Lisp_Object Q##c_name##p
 # define XRECORD(x, c_name, structtype) ((structtype *) XPNTR (x))
@@ -733,6 +777,14 @@ void *alloc_lcrecord (size_t size, const struct lrecord_implementation *);
 #define alloc_lcrecord_type(type, lrecord_implementation) \
   ((type *) alloc_lcrecord (sizeof (type), lrecord_implementation))
 
+#ifdef UTF2000
+void *
+alloc_older_lcrecord (size_t size, const struct lrecord_implementation *);
+
+#define alloc_older_lcrecord_type(type, lrecord_implementation) \
+  ((type *) alloc_older_lcrecord (sizeof (type), lrecord_implementation))
+#endif
+
 /* Copy the data from one lcrecord structure into another, but don't
    overwrite the header information. */