(open_chise_data_source_maybe): New implementation; don't use
authorMORIOKA Tomohiko <tomo.git@chise.org>
Thu, 2 May 2013 06:43:30 +0000 (15:43 +0900)
committerMORIOKA Tomohiko <tomo.git@chise.org>
Thu, 2 May 2013 06:43:30 +0000 (15:43 +0900)
`build_string' and `Fexpand_file_name' to avoid GC.
(char_table_get_db_cos): New function when HAVE_LIBCHISE is defined.
(load_char_attribute_maybe_cos): Likewise.

src/chartab.c

index 630b2a6..ea4860f 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, 2012 MORIOKA Tomohiko
+     2010, 2011, 2012, 2013 MORIOKA Tomohiko
 
 This file is part of XEmacs.
 
 
 This file is part of XEmacs.
 
@@ -3804,22 +3804,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);
+
+         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, XSTRING_DATA (db_dir),
-                        0 /* DB_HASH */, modemask);
+      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;
 }
@@ -3895,13 +3916,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;
@@ -3916,6 +3932,17 @@ char_table_get_db (Lisp_Char_Table* cit, Emchar ch)
   return val;
 }
 
   return val;
 }
 
+#ifdef HAVE_LIBCHISE
+COS_object
+char_table_get_db_cos (Lisp_Char_Table* cit, Emchar ch)
+{
+  return
+    concord_object_get_feature_value
+    (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,
@@ -4186,6 +4213,27 @@ load_char_attribute_maybe (Lisp_Char_Table* cit, Emchar ch)
   return Qunbound;
 }
 
   return Qunbound;
 }
 
+#ifdef HAVE_LIBCHISE
+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 Qunbound;
+
+      val = char_table_get_db_cos (cit, ch);
+
+      return val;
+    }
+  return Qunbound;
+}
+#endif
+
 Lisp_Char_Table* char_attribute_table_to_load;
 
 #ifdef HAVE_LIBCHISE
 Lisp_Char_Table* char_attribute_table_to_load;
 
 #ifdef HAVE_LIBCHISE