(Fsave_charset_mapping_table): Open database as "w+" mode.
[chise/xemacs-chise.git-] / src / text-coding.c
index 449152b..2a0ed68 100644 (file)
@@ -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;
@@ -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)
        {