(Fsave_charset_mapping_table): Open database as "w+" mode.
[chise/xemacs-chise.git-] / src / text-coding.c
index e9749b1..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,10 @@ 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 (XCHAR_ID_TABLE(Vcharacter_composition_table),
+       = get_char_id_table (XCHAR_TABLE(Vcharacter_composition_table),
                             character);
 
       if (NILP (ret))
@@ -2244,14 +2273,14 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str,
   else
     {
       Lisp_Object ret
-       = get_char_id_table (XCHAR_ID_TABLE(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 (XCHAR_ID_TABLE(Vcharacter_composition_table),
+           get_char_id_table (XCHAR_TABLE(Vcharacter_composition_table),
                               char2);
          if (NILP (ret))
            {
@@ -2266,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;
@@ -3579,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--)
     {
@@ -3589,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);
@@ -3643,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)
        {