update.
[chise/xemacs-chise.git.1] / src / chartab.c
index 8fbc30f..7c1408a 100644 (file)
@@ -5,7 +5,7 @@
    Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
    Licensed to the Free Software Foundation.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008,
    Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
    Licensed to the Free Software Foundation.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008,
-     2010, 2011 MORIOKA Tomohiko
+     2010, 2011, 2012, 2013, 2015, 2016 MORIOKA Tomohiko
 
 This file is part of XEmacs.
 
 
 This file is part of XEmacs.
 
@@ -3340,6 +3340,7 @@ find_char_feature_in_family (Lisp_Object character,
 {
   Lisp_Object ancestors
     = Fget_char_attribute (character, con_feature, Qnil);
 {
   Lisp_Object ancestors
     = Fget_char_attribute (character, con_feature, Qnil);
+#if 0
 
   while (!NILP (ancestors))
     {
 
   while (!NILP (ancestors))
     {
@@ -3364,6 +3365,38 @@ find_char_feature_in_family (Lisp_Object character,
       if (!NILP (ret))
        ancestors = nconc2 (Fcopy_sequence (ancestors), ret);
     }
       if (!NILP (ret))
        ancestors = nconc2 (Fcopy_sequence (ancestors), ret);
     }
+#else
+  Lisp_Object ancestor;
+
+  if (CONSP (ancestors))
+    ancestor = XCAR (ancestors);
+  else
+    ancestor = ancestors;
+
+  if (!NILP (ancestor))
+    {
+      Lisp_Object ret;
+      Lisp_Object anc;
+
+      if (EQ (ancestor, character))
+       return Qunbound;
+
+      ret = Fchar_feature (ancestor, feature, Qunbound,
+                          Qnil, make_int (0));
+      if (!UNBOUNDP (ret))
+       return ret;
+
+      ret = find_char_feature_in_family (ancestor, Q_subsumptive_from,
+                                        feature, feature_rel_max);
+      if (!UNBOUNDP (ret))
+       return ret;
+
+      ret = find_char_feature_in_family (ancestor, Q_denotational_from,
+                                        feature, feature_rel_max);
+      if (!UNBOUNDP (ret))
+       return ret;
+    }
+#endif
   return Qunbound;
 }
 
   return Qunbound;
 }
 
@@ -3380,6 +3413,7 @@ Return DEFAULT-VALUE if the value is not exist.
   if (!UNBOUNDP (ret))
     return ret;
 
   if (!UNBOUNDP (ret))
     return ret;
 
+#if 0
   if (NILP (feature_rel_max)
       || (INTP (feature_rel_max) &&
          XINT (feature_rel_max) > 0))
   if (NILP (feature_rel_max)
       || (INTP (feature_rel_max) &&
          XINT (feature_rel_max) > 0))
@@ -3404,6 +3438,7 @@ Return DEFAULT-VALUE if the value is not exist.
            return ret;
        }
     }
            return ret;
        }
     }
+#endif
 
   if ( !(EQ (attribute, Q_identical)) &&
        !(EQ (attribute, Q_subsumptive_from)) &&
 
   if ( !(EQ (attribute, Q_identical)) &&
        !(EQ (attribute, Q_subsumptive_from)) &&
@@ -3412,11 +3447,13 @@ Return DEFAULT-VALUE if the value is not exist.
          || (INTP (char_rel_max) &&
              XINT (char_rel_max) > 0)) ) )
     {
          || (INTP (char_rel_max) &&
              XINT (char_rel_max) > 0)) ) )
     {
+#if 0
       Lisp_String* name = symbol_name (XSYMBOL (attribute));
       Bufbyte *name_str = string_data (name);
 
       if ( (name_str[0] != '=') || (name_str[1] == '>') )
        {
       Lisp_String* name = symbol_name (XSYMBOL (attribute));
       Bufbyte *name_str = string_data (name);
 
       if ( (name_str[0] != '=') || (name_str[1] == '>') )
        {
+#endif
          ret = find_char_feature_in_family (character, Q_identical,
                                             attribute, feature_rel_max);
          if (!UNBOUNDP (ret))
          ret = find_char_feature_in_family (character, Q_identical,
                                             attribute, feature_rel_max);
          if (!UNBOUNDP (ret))
@@ -3431,7 +3468,9 @@ Return DEFAULT-VALUE if the value is not exist.
                                             attribute, feature_rel_max);
          if (!UNBOUNDP (ret))
            return ret;
                                             attribute, feature_rel_max);
          if (!UNBOUNDP (ret))
            return ret;
+#if 0
        }
        }
+#endif
     }
   return default_value;
 }
     }
   return default_value;
 }
@@ -3771,22 +3810,43 @@ open_chise_data_source_maybe ()
 {
   if (default_chise_data_source == NULL)
     {
 {
   if (default_chise_data_source == NULL)
     {
-      Lisp_Object db_dir = Vdata_directory;
       int modemask = 0755;             /* rwxr-xr-x */
       int modemask = 0755;             /* rwxr-xr-x */
+      char* db_dir_name;
+      size_t len;
 
 
-      if (NILP (db_dir))
-       db_dir = build_string ("../etc");
-      db_dir = Fexpand_file_name (build_string ("chise-db"), db_dir);
+      if (STRINGP (Vdata_directory))
+       {
+         char* dir_name = XSTRING_DATA (Vdata_directory);
 
 
-      default_chise_data_source
-       = CHISE_DS_open (CHISE_DS_Berkeley_DB, XSTRING_DATA (db_dir),
-                        0 /* DB_HASH */, modemask);
+         len = strlen (dir_name) + 8;
+         db_dir_name = alloca (len + 1);
+         strncpy (db_dir_name, dir_name, len);
+       }
+      else
+       {
+         if (STRINGP (current_buffer->directory))
+           {
+             char* dir_name = XSTRING_DATA (current_buffer->directory);
+
+             len = strlen (dir_name) + 7 + 8;
+             db_dir_name = alloca (len + 1);
+             strncpy (db_dir_name, dir_name, len);
+             strncat(db_dir_name, "../etc/", 15);
+           }
+         else
+           {
+             len = 7 + 8;
+             db_dir_name = alloca (len + 1);
+             strncpy (db_dir_name, "../etc/", len);
+           }
+       }
+      strncat(db_dir_name, "chise-db", 8);
+
+      default_chise_data_source = CHISE_DS_open (CHISE_DS_Berkeley_DB,
+                                                db_dir_name,
+                                                0 /* DB_HASH */, modemask);
       if (default_chise_data_source == NULL)
        return -1;
       if (default_chise_data_source == NULL)
        return -1;
-#if 0
-      chise_ds_set_make_string_function (default_chise_data_source,
-                                        &make_string);
-#endif
     }
   return 0;
 }
     }
   return 0;
 }
@@ -3862,13 +3922,8 @@ char_table_get_db (Lisp_Char_Table* cit, Emchar ch)
 
   if (!status)
     {
 
   if (!status)
     {
-#if 0
-      val = Fread (make_string (chise_value_data (&value),
-                               chise_value_size (&value) ));
-#else
       val = read_from_c_string (chise_value_data (&value),
                                chise_value_size (&value) );
       val = read_from_c_string (chise_value_data (&value),
                                chise_value_size (&value) );
-#endif
     }
   else
     val = Qunbound;
     }
   else
     val = Qunbound;
@@ -3883,6 +3938,17 @@ char_table_get_db (Lisp_Char_Table* cit, Emchar ch)
   return val;
 }
 
   return val;
 }
 
+#ifdef USE_CONCORD_OBJECT_SYSTEM
+COS_object
+char_table_get_db_cos (Lisp_Char_Table* cit, Emchar ch)
+{
+  return
+    concord_object_get_attribute
+    (cos_make_char (ch),
+     cos_intern (XSTRING_DATA (Fsymbol_name (cit->name))));
+}
+#endif
+
 #ifndef HAVE_LIBCHISE
 Lisp_Object
 char_attribute_system_db_file (Lisp_Object key_type, Lisp_Object attribute,
 #ifndef HAVE_LIBCHISE
 Lisp_Object
 char_attribute_system_db_file (Lisp_Object key_type, Lisp_Object attribute,
@@ -4153,6 +4219,27 @@ load_char_attribute_maybe (Lisp_Char_Table* cit, Emchar ch)
   return Qunbound;
 }
 
   return Qunbound;
 }
 
+#ifdef USE_CONCORD_OBJECT_SYSTEM
+COS_object
+load_char_attribute_maybe_cos (Lisp_Char_Table* cit, Emchar ch)
+{
+  Lisp_Object attribute = CHAR_TABLE_NAME (cit);
+
+  if (!NILP (attribute))
+    {
+      COS_object val;
+
+      if (char_table_open_db_maybe (cit))
+       return NULL;
+
+      val = char_table_get_db_cos (cit, ch);
+
+      return val;
+    }
+  return NULL;
+}
+#endif
+
 Lisp_Char_Table* char_attribute_table_to_load;
 
 #ifdef HAVE_LIBCHISE
 Lisp_Char_Table* char_attribute_table_to_load;
 
 #ifdef HAVE_LIBCHISE