(coded-charset-entity-reference-alist): Add setting for
[chise/xemacs-chise.git.1] / src / text-coding.c
index 4089607..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;
@@ -107,7 +110,7 @@ Lisp_Object Qshort, Qno_ascii_eol, Qno_ascii_cntl, Qseven, Qlock_shift;
 #endif
 #ifdef UTF2000
 Lisp_Object Qutf_8_mcs;
 #endif
 #ifdef UTF2000
 Lisp_Object Qutf_8_mcs;
-Lisp_Object Qdisable_composition;
+Lisp_Object Qdisable_composition, Qenable_decomposition;
 Lisp_Object Qccs_priority_list;
 Lisp_Object Quse_entity_reference;
 Lisp_Object Qd, Qx, QX;
 Lisp_Object Qccs_priority_list;
 Lisp_Object Quse_entity_reference;
 Lisp_Object Qd, Qx, QX;
@@ -849,8 +852,10 @@ character set.  Recognized properties are:
                `coding-system-property' will return nil.)
 
 'disable-composition
                `coding-system-property' will return nil.)
 
 'disable-composition
-     If non-nil, composition/decomposition for combining characters
-     are disabled.
+     If non-nil, composition for combining characters is disabled.
+
+'enable-decomposition
+     If non-nil, decomposition for combining characters is enabled.
 
 'use-entity-reference
      If non-nil, SGML style entity-reference is used for non-system-characters.
 
 'use-entity-reference
      If non-nil, SGML style entity-reference is used for non-system-characters.
@@ -1007,6 +1012,8 @@ if TYPE is 'ccl:
 #ifdef UTF2000
        else if (EQ (key, Qdisable_composition))
          CODING_SYSTEM_DISABLE_COMPOSITION (codesys) = !NILP (value);
 #ifdef UTF2000
        else if (EQ (key, Qdisable_composition))
          CODING_SYSTEM_DISABLE_COMPOSITION (codesys) = !NILP (value);
+       else if (EQ (key, Qenable_decomposition))
+         CODING_SYSTEM_ENABLE_DECOMPOSITION (codesys) = !NILP (value);
        else if (EQ (key, Quse_entity_reference))
          CODING_SYSTEM_USE_ENTITY_REFERENCE (codesys) = !NILP (value);
 #endif
        else if (EQ (key, Quse_entity_reference))
          CODING_SYSTEM_USE_ENTITY_REFERENCE (codesys) = !NILP (value);
 #endif
@@ -1072,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);
          }
@@ -1491,6 +1500,8 @@ Return the PROP property of CODING-SYSTEM.
 #ifdef UTF2000
   else if (EQ (prop, Qdisable_composition))
     return XCODING_SYSTEM_DISABLE_COMPOSITION (coding_system) ? Qt : Qnil;
 #ifdef UTF2000
   else if (EQ (prop, Qdisable_composition))
     return XCODING_SYSTEM_DISABLE_COMPOSITION (coding_system) ? Qt : Qnil;
+  else if (EQ (prop, Qenable_decomposition))
+    return XCODING_SYSTEM_ENABLE_DECOMPOSITION (coding_system) ? Qt : Qnil;
   else if (EQ (prop, Quse_entity_reference))
     return XCODING_SYSTEM_USE_ENTITY_REFERENCE (coding_system) ? Qt : Qnil;
   else if (EQ (prop, Qccs_priority_list))
   else if (EQ (prop, Quse_entity_reference))
     return XCODING_SYSTEM_USE_ENTITY_REFERENCE (coding_system) ? Qt : Qnil;
   else if (EQ (prop, Qccs_priority_list))
@@ -2328,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;
 };
@@ -2470,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)
@@ -3501,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);
@@ -3512,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
@@ -3567,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)
@@ -4670,38 +4774,42 @@ char_encode_utf8 (struct encoding_stream *str, Emchar ch,
 
       if ( (code_point < 0) || (code_point > 0xEFFFF) )
        {
 
       if ( (code_point < 0) || (code_point > 0xEFFFF) )
        {
-         Lisp_Object rest = Vdecomposition_feature_list;
-         Lisp_Object decomp_f;
-         Lisp_Object seq = Qnil;
          Lisp_Object map, ret;
          Lisp_Object map, ret;
-         struct gcpro gcpro1;
 
 
-         while ( CONSP (rest) )
+         if ( CODING_SYSTEM_ENABLE_DECOMPOSITION (str->codesys) )
            {
            {
-             decomp_f = XCAR (rest);
-             GCPRO1 (rest);
-             seq = Fchar_feature (make_char (ch), decomp_f, Qnil,
-                                  Qnil, Qnil);
-             UNGCPRO;
-             if ( !NILP (seq) )
-               break;
-             rest = XCDR (rest);
-           }
+             Lisp_Object rest = Vdecomposition_feature_list;
+             Lisp_Object decomp_f;
+             Lisp_Object seq = Qnil;
+             struct gcpro gcpro1;
 
 
-         if ( CONSP (seq) )
-           {
-             Lisp_Object base = Fcar (seq);
+             while ( CONSP (rest) )
+               {
+                 decomp_f = XCAR (rest);
+                 GCPRO1 (rest);
+                 seq = Fchar_feature (make_char (ch), decomp_f, Qnil,
+                                      Qnil, Qnil);
+                 UNGCPRO;
+                 if ( !NILP (seq) )
+                   break;
+                 rest = XCDR (rest);
+               }
 
 
-             seq = Fcdr (seq);
-             if ( CHARP (base) && CONSP (seq) )
+             if ( CONSP (seq) )
                {
                {
-                 Lisp_Object comb = Fcar (seq);
+                 Lisp_Object base = Fcar (seq);
 
 
-                 if ( CHARP (comb) )
+                 seq = Fcdr (seq);
+                 if ( CHARP (base) && CONSP (seq) )
                    {
                    {
-                     char_encode_utf8 (str, XCHAR (base), dst, flags);
-                     char_encode_utf8 (str, XCHAR (comb), dst, flags);
-                     return;
+                     Lisp_Object comb = Fcar (seq);
+
+                     if ( CHARP (comb) )
+                       {
+                         char_encode_utf8 (str, XCHAR (base), dst, flags);
+                         char_encode_utf8 (str, XCHAR (comb), dst, flags);
+                         return;
+                       }
                    }
                }
            }
                    }
                }
            }
@@ -4719,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];
@@ -6451,6 +6566,7 @@ syms_of_file_coding (void)
 #ifdef UTF2000
   defsymbol (&Qutf_8_mcs, "utf-8-mcs");
   defsymbol (&Qdisable_composition, "disable-composition");
 #ifdef UTF2000
   defsymbol (&Qutf_8_mcs, "utf-8-mcs");
   defsymbol (&Qdisable_composition, "disable-composition");
+  defsymbol (&Qenable_decomposition, "enable-decomposition");
   defsymbol (&Qccs_priority_list, "ccs-priority-list");
   defsymbol (&Quse_entity_reference, "use-entity-reference");
   defsymbol (&Qd, "d");
   defsymbol (&Qccs_priority_list, "ccs-priority-list");
   defsymbol (&Quse_entity_reference, "use-entity-reference");
   defsymbol (&Qd, "d");
@@ -6641,6 +6757,7 @@ complex_vars_of_file_coding (void)
   DEFINE_CODESYS_PROP (CODESYS_PROP_CCL,     Qdecode);
 #ifdef UTF2000
   DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qdisable_composition);
   DEFINE_CODESYS_PROP (CODESYS_PROP_CCL,     Qdecode);
 #ifdef UTF2000
   DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qdisable_composition);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qenable_decomposition);
   DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Quse_entity_reference);
 #endif
 #endif /* MULE */
   DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Quse_entity_reference);
 #endif
 #endif /* MULE */