X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchartab.c;h=ea4860fe3c9b586325cf6c5cfa744d386e2a7c28;hb=1d0f965ba499c40eb5b24415c62ec0dc2b0b8ff7;hp=7967606ad8381354cb9b86d63536d1423f3c9911;hpb=db9d6060083d0b67086746491e474cbce07cfcd2;p=chise%2Fxemacs-chise.git.1 diff --git a/src/chartab.c b/src/chartab.c index 7967606..ea4860f 100644 --- a/src/chartab.c +++ b/src/chartab.c @@ -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, - 2010, 2011 MORIOKA Tomohiko + 2010, 2011, 2012, 2013 MORIOKA Tomohiko This file is part of XEmacs. @@ -100,7 +100,7 @@ Lisp_Object Vchar_db_stingy_mode; INLINE_HEADER int INT_UINT8_P (Lisp_Object obj); INLINE_HEADER int UINT8_VALUE_P (Lisp_Object obj); INLINE_HEADER unsigned char UINT8_ENCODE (Lisp_Object obj); -INLINE_HEADER Lisp_Object UINT8_DECODE (unsigned char n); +/* INLINE_HEADER */ Lisp_Object UINT8_DECODE (unsigned char n); INLINE_HEADER unsigned short UINT8_TO_UINT16 (unsigned char n); INLINE_HEADER int @@ -138,7 +138,7 @@ UINT8_ENCODE (Lisp_Object obj) return XINT (obj); } -INLINE_HEADER Lisp_Object +/* INLINE_HEADER */ Lisp_Object UINT8_DECODE (unsigned char n) { if (n == BT_UINT8_unloaded) @@ -392,7 +392,7 @@ save_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root, INLINE_HEADER int INT_UINT16_P (Lisp_Object obj); INLINE_HEADER int UINT16_VALUE_P (Lisp_Object obj); INLINE_HEADER unsigned short UINT16_ENCODE (Lisp_Object obj); -INLINE_HEADER Lisp_Object UINT16_DECODE (unsigned short us); +/* INLINE_HEADER */ Lisp_Object UINT16_DECODE (unsigned short us); INLINE_HEADER int INT_UINT16_P (Lisp_Object obj) @@ -429,7 +429,7 @@ UINT16_ENCODE (Lisp_Object obj) return XINT (obj); } -INLINE_HEADER Lisp_Object +/* INLINE_HEADER */ Lisp_Object UINT16_DECODE (unsigned short n) { if (n == BT_UINT16_unloaded) @@ -3340,6 +3340,7 @@ find_char_feature_in_family (Lisp_Object character, { Lisp_Object ancestors = Fget_char_attribute (character, con_feature, Qnil); +#if 0 while (!NILP (ancestors)) { @@ -3364,6 +3365,38 @@ find_char_feature_in_family (Lisp_Object character, 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; } @@ -3771,22 +3804,43 @@ open_chise_data_source_maybe () { if (default_chise_data_source == NULL) { - Lisp_Object db_dir = Vdata_directory; int modemask = 0755; /* rwxr-xr-x */ + char* db_dir_name; + size_t len; + + if (STRINGP (Vdata_directory)) + { + char* dir_name = XSTRING_DATA (Vdata_directory); - if (NILP (db_dir)) - db_dir = build_string ("../etc"); - db_dir = Fexpand_file_name (build_string ("chise-db"), db_dir); + 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); - default_chise_data_source - = CHISE_DS_open (CHISE_DS_Berkeley_DB, XSTRING_DATA (db_dir), - 0 /* DB_HASH */, modemask); + 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 0 - chise_ds_set_make_string_function (default_chise_data_source, - &make_string); -#endif } return 0; } @@ -3862,13 +3916,8 @@ char_table_get_db (Lisp_Char_Table* cit, Emchar ch) 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) ); -#endif } else val = Qunbound; @@ -3883,6 +3932,17 @@ char_table_get_db (Lisp_Char_Table* cit, Emchar ch) 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, @@ -4153,6 +4213,27 @@ load_char_attribute_maybe (Lisp_Char_Table* cit, Emchar ch) 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