(Fsave_charset_mapping_table): Open database as "w+" mode.
[chise/xemacs-chise.git-] / src / text-coding.c
index 7b9173b..2a0ed68 100644 (file)
@@ -47,17 +47,17 @@ Lisp_Object Vcoding_system_for_write;
 Lisp_Object Vfile_name_coding_system;
 
 /* Table of symbols identifying each coding category. */
-Lisp_Object coding_category_symbol[CODING_CATEGORY_LAST + 1];
+Lisp_Object coding_category_symbol[CODING_CATEGORY_LAST];
 
 
 
 struct file_coding_dump {
   /* Coding system currently associated with each coding category. */
-  Lisp_Object coding_category_system[CODING_CATEGORY_LAST + 1];
+  Lisp_Object coding_category_system[CODING_CATEGORY_LAST];
 
   /* Table of all coding categories in decreasing order of priority.
      This describes a permutation of the possible coding categories. */
-  int coding_category_by_priority[CODING_CATEGORY_LAST + 1];
+  int coding_category_by_priority[CODING_CATEGORY_LAST];
 
 #if defined(MULE) && !defined(UTF2000)
   Lisp_Object ucs_to_mule_table[65536];
@@ -65,7 +65,7 @@ struct file_coding_dump {
 } *fcd;
 
 static const struct lrecord_description fcd_description_1[] = {
-  { XD_LISP_OBJECT_ARRAY, offsetof (struct file_coding_dump, coding_category_system), CODING_CATEGORY_LAST + 1 },
+  { XD_LISP_OBJECT_ARRAY, offsetof (struct file_coding_dump, coding_category_system), CODING_CATEGORY_LAST },
 #if defined(MULE) && !defined(UTF2000)
   { XD_LISP_OBJECT_ARRAY, offsetof (struct file_coding_dump, ucs_to_mule_table), countof (fcd->ucs_to_mule_table) },
 #endif
@@ -379,6 +379,13 @@ mark_coding_system (Lisp_Object obj)
            }
        }
       break;
+#ifdef UTF2000
+
+    case CODESYS_BIG5:
+      mark_object (CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 0));
+      mark_object (CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 1));
+      break;
+#endif
 
     case CODESYS_CCL:
       mark_object (CODING_SYSTEM_CCL_DECODE (codesys));
@@ -644,6 +651,19 @@ allocate_coding_system (enum coding_system_type type, Lisp_Object name)
       for (i = 0; i < 4; i++)
        CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i) = Qnil;
     }
+#ifdef UTF2000
+  if (type == CODESYS_BIG5)
+    {
+      CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 0)
+       = Vcharset_ascii;
+      CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 1)
+       = Vcharset_chinese_big5;
+      CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 2)
+       = Qnil;
+      CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 3)
+       = Qnil;
+    }
+#endif
   else if (type == CODESYS_CCL)
     {
       CODING_SYSTEM_CCL_DECODE (codesys) = Qnil;
@@ -994,6 +1014,15 @@ if TYPE is 'ccl:
            else
              signal_simple_error ("Unrecognized property", key);
          }
+#ifdef UTF2000
+       else if (ty == CODESYS_BIG5)
+         {
+           if      (EQ (key, Qcharset_g0)) FROB_INITIAL_CHARSET (0);
+           else if (EQ (key, Qcharset_g1)) FROB_INITIAL_CHARSET (1);
+           else
+             signal_simple_error ("Unrecognized property", key);
+         }
+#endif
        else if (EQ (type, Qccl))
          {
            Lisp_Object sym;
@@ -1467,7 +1496,7 @@ decode_coding_category (Lisp_Object symbol)
   int i;
 
   CHECK_SYMBOL (symbol);
-  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+  for (i = 0; i < CODING_CATEGORY_LAST; i++)
     if (EQ (coding_category_symbol[i], symbol))
       return i;
 
@@ -1483,7 +1512,7 @@ Return a list of all recognized coding categories.
   int i;
   Lisp_Object list = Qnil;
 
-  for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+  for (i = CODING_CATEGORY_LAST - 1; i >= 0; i--)
     list = Fcons (coding_category_symbol[i], list);
   return list;
 }
@@ -1497,13 +1526,13 @@ previously.
 */
        (list))
 {
-  int category_to_priority[CODING_CATEGORY_LAST + 1];
+  int category_to_priority[CODING_CATEGORY_LAST];
   int i, j;
   Lisp_Object rest;
 
   /* First generate a list that maps coding categories to priorities. */
 
-  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+  for (i = 0; i < CODING_CATEGORY_LAST; i++)
     category_to_priority[i] = -1;
 
   /* Highest priority comes from the specified list. */
@@ -1520,7 +1549,7 @@ previously.
   /* Now go through the existing categories by priority to retrieve
      the categories not yet specified and preserve their priority
      order. */
-  for (j = 0; j <= CODING_CATEGORY_LAST; j++)
+  for (j = 0; j < CODING_CATEGORY_LAST; j++)
     {
       int cat = fcd->coding_category_by_priority[j];
       if (category_to_priority[cat] < 0)
@@ -1530,7 +1559,7 @@ previously.
   /* Now we need to construct the inverse of the mapping we just
      constructed. */
 
-  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+  for (i = 0; i < CODING_CATEGORY_LAST; i++)
     fcd->coding_category_by_priority[category_to_priority[i]] = i;
 
   /* Phew!  That was confusing. */
@@ -1545,7 +1574,7 @@ Return a list of coding categories in descending order of priority.
   int i;
   Lisp_Object list = Qnil;
 
-  for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+  for (i = CODING_CATEGORY_LAST - 1; i >= 0; i--)
     list = Fcons (coding_category_symbol[fcd->coding_category_by_priority[i]],
                  list);
   return list;
@@ -1795,7 +1824,7 @@ coding_system_from_mask (int mask)
 #endif
       /* Look through the coding categories by priority and find
         the first one that is allowed. */
-      for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+      for (i = 0; i < CODING_CATEGORY_LAST; i++)
        {
          cat = fcd->coding_category_by_priority[i];
          if ((mask & (1 << cat)) &&
@@ -1993,7 +2022,7 @@ type.  Optional arg BUFFER defaults to the current buffer.
 #ifdef MULE
       decst.mask = postprocess_iso2022_mask (decst.mask);
 #endif
-      for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+      for (i = CODING_CATEGORY_LAST - 1; i >= 0; i--)
        {
          int sys = fcd->coding_category_by_priority[i];
          if (decst.mask & (1 << sys))
@@ -2226,10 +2255,11 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str,
 {
   if (CODING_SYSTEM_DISABLE_COMPOSITION (str->codesys))
     DECODE_ADD_UCS_CHAR (character, dst);
-  else if (!CHAR_ID_TABLE_P (str->combining_table))
+  else if (!CHAR_TABLEP (str->combining_table))
     {
       Lisp_Object ret
-       = get_char_id_table (character, Vcharacter_composition_table);
+       = get_char_id_table (XCHAR_TABLE(Vcharacter_composition_table),
+                            character);
 
       if (NILP (ret))
        DECODE_ADD_UCS_CHAR (character, dst);
@@ -2243,12 +2273,15 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str,
   else
     {
       Lisp_Object ret
-       = get_char_id_table (character, str->combining_table);
+       = get_char_id_table (XCHAR_TABLE(str->combining_table),
+                            character);
 
       if (CHARP (ret))
        {
          Emchar char2 = XCHARVAL (ret);
-         ret = get_char_id_table (char2, Vcharacter_composition_table);
+         ret =
+           get_char_id_table (XCHAR_TABLE(Vcharacter_composition_table),
+                              char2);
          if (NILP (ret))
            {
              DECODE_ADD_UCS_CHAR (char2, dst);
@@ -2262,7 +2295,7 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str,
              str->combining_table = ret;
            }
        }
-      else if (CHAR_ID_TABLE_P (ret))
+      else if (CHAR_TABLEP (ret))
        {
          str->combined_chars[str->combined_char_count++] = character;
          str->combining_table = ret;
@@ -3575,6 +3608,11 @@ decode_coding_big5 (Lstream *decoding, const Extbyte *src,
   unsigned int flags  = str->flags;
   unsigned int cpos   = str->cpos;
   eol_type_t eol_type = str->eol_type;
+#ifdef UTF2000
+  Lisp_Object ccs
+    = CODING_SYSTEM_ISO2022_INITIAL_CHARSET (DECODING_STREAM_DATA
+                                            (decoding)->codesys, 1);
+#endif
 
   while (n--)
     {
@@ -3585,9 +3623,12 @@ decode_coding_big5 (Lstream *decoding, const Extbyte *src,
          if (BYTE_BIG5_TWO_BYTE_2_P (c))
            {
 #ifdef UTF2000
-             DECODE_ADD_UCS_CHAR
-               (DECODE_CHAR (Vcharset_chinese_big5, (cpos << 8) | c),
-                dst);
+             int code_point = (cpos << 8) | c;
+             Emchar char_id = DECODE_DEFINED_CHAR (ccs, code_point);
+
+             if (char_id < 0)
+               char_id = DECODE_CHAR (Vcharset_chinese_big5, code_point);
+             DECODE_ADD_UCS_CHAR (char_id, dst);
 #else
              unsigned char b1, b2, b3;
              DECODE_BIG5 (cpos, c, b1, b2, b3);
@@ -3639,9 +3680,16 @@ char_encode_big5 (struct encoding_stream *str, Emchar ch,
     {
 #ifdef UTF2000
       int code_point;
+      Lisp_Object ccs
+       = CODING_SYSTEM_ISO2022_INITIAL_CHARSET (str->codesys, 1);
 
       if ((code_point = charset_code_point (Vcharset_ascii, ch)) >= 0)
        Dynarr_add (dst, code_point);
+      else if ((code_point = charset_code_point (ccs, ch)) >= 0)
+       {
+         Dynarr_add (dst, code_point >> 8);
+         Dynarr_add (dst, code_point & 0xFF);
+       }
       else if ((code_point
                = charset_code_point (Vcharset_chinese_big5, ch)) >= 0)
        {
@@ -5795,10 +5843,10 @@ vars_of_file_coding (void)
   int i;
 
   fcd = xnew (struct file_coding_dump);
-  dumpstruct (&fcd, &fcd_description);
+  dump_add_root_struct_ptr (&fcd, &fcd_description);
 
   /* Initialize to something reasonable ... */
-  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+  for (i = 0; i < CODING_CATEGORY_LAST; i++)
     {
       fcd->coding_category_system[i] = Qnil;
       fcd->coding_category_by_priority[i] = i;
@@ -5862,7 +5910,7 @@ complex_vars_of_file_coding (void)
     make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
 
   the_codesys_prop_dynarr = Dynarr_new (codesys_prop);
-  dumpstruct (&the_codesys_prop_dynarr, &codesys_prop_dynarr_description);
+  dump_add_root_struct_ptr (&the_codesys_prop_dynarr, &codesys_prop_dynarr_description);
 
 #define DEFINE_CODESYS_PROP(Prop_Type, Sym) do \
 {                                              \
@@ -5938,7 +5986,7 @@ complex_vars_of_file_coding (void)
 
 #if defined(MULE) && !defined(UTF2000)
   {
-    unsigned int i;
+    size_t i;
 
     for (i = 0; i < countof (fcd->ucs_to_mule_table); i++)
       fcd->ucs_to_mule_table[i] = Qnil;