(U+4386): Apply new conventions for glyph granularity.
[chise/xemacs-chise.git.1] / src / text-coding.c
index 6df01da..7071934 100644 (file)
@@ -2,7 +2,7 @@
    Copyright (C) 1991, 1995 Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2011,
    Copyright (C) 1991, 1995 Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2011,
-     2012 MORIOKA Tomohiko
+     2012, 2013, 2016 MORIOKA Tomohiko
 
 This file is part of XEmacs.
 
 
 This file is part of XEmacs.
 
@@ -38,6 +38,9 @@ Boston, MA 02111-1307, USA.  */
 #include "mule-ccl.h"
 #include "chartab.h"
 #endif
 #include "mule-ccl.h"
 #include "chartab.h"
 #endif
+#ifdef USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE
+#include <cos.h>
+#endif
 #include "file-coding.h"
 
 Lisp_Object Qcoding_system_error;
 #include "file-coding.h"
 
 Lisp_Object Qcoding_system_error;
@@ -1076,6 +1079,8 @@ if TYPE is 'ccl:
              CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 1) = value;
            else if (EQ (key, Qcharset_g2))
              CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 2) = value;
              CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 1) = value;
            else if (EQ (key, Qcharset_g2))
              CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 2) = value;
+           else if (EQ (key, Qcharset_g3))
+             CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, 3) = value;
            else
              signal_simple_error ("Unrecognized property", key);
          }
            else
              signal_simple_error ("Unrecognized property", key);
          }
@@ -2334,7 +2339,11 @@ struct decoding_stream
 
   unsigned combined_char_count;
   Emchar combined_chars[16];
 
   unsigned combined_char_count;
   Emchar combined_chars[16];
+#ifdef USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE
+  COS_object combining_table;
+#else
   Lisp_Object combining_table;
   Lisp_Object combining_table;
+#endif /* USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE */
 #endif
   struct detection_state decst;
 };
 #endif
   struct detection_state decst;
 };
@@ -2476,7 +2485,11 @@ reset_decoding_stream (struct decoding_stream *str)
   str->bom_flag = 0;
   str->er_counter = 0;
   str->combined_char_count = 0;
   str->bom_flag = 0;
   str->er_counter = 0;
   str->combined_char_count = 0;
+#ifdef USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE
+  str->combining_table = COS_NIL;
+#else
   str->combining_table = Qnil;
   str->combining_table = Qnil;
+#endif /* USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE */
 #endif
   if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_AUTODETECT
       || CODING_SYSTEM_EOL_TYPE (str->codesys) == EOL_AUTODETECT)
 #endif
   if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_AUTODETECT
       || CODING_SYSTEM_EOL_TYPE (str->codesys) == EOL_AUTODETECT)
@@ -3507,8 +3520,26 @@ COMPOSE_FLUSH_CHARS (struct decoding_stream *str, unsigned_char_dynarr* dst)
   for (i = 0; i < str->combined_char_count; i++)
     decode_add_er_char (str, str->combined_chars[i], dst);
   str->combined_char_count = 0;
   for (i = 0; i < str->combined_char_count; i++)
     decode_add_er_char (str, str->combined_chars[i], dst);
   str->combined_char_count = 0;
+#ifdef USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE
+  str->combining_table = COS_NIL;
+#else
   str->combining_table = Qnil;
   str->combining_table = Qnil;
+#endif /* USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE */
+}
+
+extern CONCORD_DS concord_current_env;
+
+#if 0
+static int
+concord_setup_env_maybe ()
+{
+  if (concord_current_env == NULL)
+    {
+      concord_open_env ("/usr/local/share/chise/1.0/db/");
+    }
+  return 0;
 }
 }
+#endif
 
 void COMPOSE_ADD_CHAR (struct decoding_stream *str, Emchar character,
                       unsigned_char_dynarr* dst);
 
 void COMPOSE_ADD_CHAR (struct decoding_stream *str, Emchar character,
                       unsigned_char_dynarr* dst);
@@ -3518,6 +3549,72 @@ COMPOSE_ADD_CHAR (struct decoding_stream *str,
 {
   if (CODING_SYSTEM_DISABLE_COMPOSITION (str->codesys))
     decode_add_er_char (str, character, dst);
 {
   if (CODING_SYSTEM_DISABLE_COMPOSITION (str->codesys))
     decode_add_er_char (str, character, dst);
+#ifdef USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE
+  else if (!cos_cons_p (str->combining_table))
+    {
+      COS_object ret;
+
+      /* concord_setup_env_maybe (); */
+      open_chise_data_source_maybe ();
+      ret = concord_object_get_attribute (cos_make_char (character),
+                                             COS_COMPOSITION);
+
+      if (!cos_cons_p (ret))
+       decode_add_er_char (str, character, dst);
+      else
+       {
+         str->combined_chars[0] = character;
+         str->combined_char_count = 1;
+         str->combining_table = ret;
+       }
+    }
+  else
+    {
+      COS_object ret
+       = cos_cdr (cos_assoc (cos_make_char (character),
+                             str->combining_table));
+
+      if (cos_char_p (ret))
+       {
+         Emchar char2 = cos_char_id (ret);
+         COS_object ret2;
+
+         /* concord_setup_env_maybe (); */
+         open_chise_data_source_maybe ();
+         ret2 = concord_object_get_attribute (ret, COS_COMPOSITION);
+
+         if (!cos_cons_p (ret2))
+           {
+             decode_add_er_char (str, char2, dst);
+             str->combined_char_count = 0;
+             str->combining_table = COS_NIL;
+           }
+         else
+           {
+             str->combined_chars[0] = char2;
+             str->combined_char_count = 1;
+             str->combining_table = ret2;
+           }
+       }
+      else
+       {
+         /* concord_setup_env_maybe (); */
+         open_chise_data_source_maybe ();
+         ret = concord_object_get_attribute (cos_make_char (character),
+                                                 COS_COMPOSITION);
+
+         COMPOSE_FLUSH_CHARS (str, dst);
+         if (!cos_cons_p (ret))
+           decode_add_er_char (str, character, dst);
+         else
+           {
+             str->combined_chars[0] = character;
+             str->combined_char_count = 1;
+             str->combining_table = ret;
+           }
+       }
+    }
+#else
   else if (!CONSP (str->combining_table))
     {
       Lisp_Object ret
   else if (!CONSP (str->combining_table))
     {
       Lisp_Object ret
@@ -3573,6 +3670,7 @@ COMPOSE_ADD_CHAR (struct decoding_stream *str,
            }
        }
     }
            }
        }
     }
+#endif /* USE_CONCORD_OBJECT_SYSTEM_TO_COMPOSE */
 }
 #else /* not UTF2000 */
 #define COMPOSE_FLUSH_CHARS(str, dst)
 }
 #else /* not UTF2000 */
 #define COMPOSE_FLUSH_CHARS(str, dst)
@@ -4729,6 +4827,13 @@ char_encode_utf8 (struct encoding_stream *str, Emchar ch,
                                                  map, Qnil,
                                                  Qnil, Qnil)) )
            code_point = XINT (ret);
                                                  map, Qnil,
                                                  Qnil, Qnil)) )
            code_point = XINT (ret);
+         else if ( !NILP (map =
+                          CODING_SYSTEM_ISO2022_INITIAL_CHARSET
+                          (str->codesys, 3))
+                   && INTP (ret = Fchar_feature (make_char (ch),
+                                                 map, Qnil,
+                                                 Qnil, Qnil)) )
+           code_point = XINT (ret);
          else if (CODING_SYSTEM_USE_ENTITY_REFERENCE (str->codesys))
            {
              char buf[18];
          else if (CODING_SYSTEM_USE_ENTITY_REFERENCE (str->codesys))
            {
              char buf[18];