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 MORIOKA Tomohiko
+ 2010, 2011, 2012, 2013, 2015, 2016 MORIOKA Tomohiko
This file is part of XEmacs.
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
return XINT (obj);
}
-INLINE_HEADER Lisp_Object
+/* INLINE_HEADER */ Lisp_Object
UINT8_DECODE (unsigned char n)
{
if (n == BT_UINT8_unloaded)
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)
return XINT (obj);
}
-INLINE_HEADER Lisp_Object
+/* INLINE_HEADER */ Lisp_Object
UINT16_DECODE (unsigned short n)
{
if (n == BT_UINT16_unloaded)
return alist;
}
+DEFUN ("char-feature-base-name=", Fchar_feature_base_name_eq, 2, 2, 0, /*
+Return the alist of attributes of CHARACTER.
+*/
+ (base_name, feature_name))
+{
+ Lisp_String *bn, *fn;
+ Bytecount len_bn, len_fn, i;
+ Bufbyte *ptr_bn, *ptr_fn;
+
+ CHECK_SYMBOL (base_name);
+ CHECK_SYMBOL (feature_name);
+
+ bn = XSYMBOL (base_name)->name;
+ fn = XSYMBOL (feature_name)->name;
+ len_bn = string_length (bn);
+ len_fn = string_length (fn);
+
+ if ( len_bn > len_fn )
+ return Qnil;
+
+ ptr_bn = string_data (bn);
+ ptr_fn = string_data (fn);
+ for ( i = len_fn - 1; i >= 0; i-- )
+ {
+ if ( ptr_fn[i] == '*' )
+ return Qnil;
+ if ( ptr_fn[i] == '@' )
+ break;
+ }
+ if ( i < 0 )
+ i = len_fn;
+ if ( (len_bn == i) && (memcmp (ptr_bn, ptr_fn, len_bn) == 0) )
+ return Qt;
+ else
+ return Qnil;
+}
+
DEFUN ("get-char-attribute", Fget_char_attribute, 2, 3, 0, /*
Return the value of CHARACTER's ATTRIBUTE.
Return DEFAULT-VALUE if the value is not exist.
{
Lisp_Object ancestors
= Fget_char_attribute (character, con_feature, Qnil);
+#if 0
while (!NILP (ancestors))
{
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;
}
if (!UNBOUNDP (ret))
return ret;
+#if 0
if (NILP (feature_rel_max)
|| (INTP (feature_rel_max) &&
XINT (feature_rel_max) > 0))
return ret;
}
}
+#endif
if ( !(EQ (attribute, Q_identical)) &&
!(EQ (attribute, Q_subsumptive_from)) &&
|| (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] == '>') )
{
+#endif
ret = find_char_feature_in_family (character, Q_identical,
attribute, feature_rel_max);
if (!UNBOUNDP (ret))
attribute, feature_rel_max);
if (!UNBOUNDP (ret))
return ret;
+#if 0
}
+#endif
}
return default_value;
}
if (!NILP (ccs))
{
- value = put_char_ccs_code_point (character, ccs, value);
+ if ( !NILP (value) )
+ value = put_char_ccs_code_point (character, ccs, value);
attribute = XCHARSET_NAME (ccs);
}
- else if ( EQ (attribute, Qrep_decomposition) ||
- EQ (attribute, Q_decomposition) )
+ else if (
+#if 0
+ EQ (attribute, Qrep_decomposition) ||
+#else
+ !NILP (Fchar_feature_base_name_eq (Qrep_decomposition,
+ attribute)) ||
+#endif
+ EQ (attribute, Q_decomposition) /* || */
+#if 0
+ !NILP (Fstring_match (build_string ("^=decomposition@[^*]+$"),
+ Fsymbol_name (attribute),
+ Qnil, Qnil))
+#endif
+ )
{
+ Lisp_Object ret;
+
value = Fcopy_sequence (Fchar_refs_simplify_char_specs (value));
- attribute = put_char_composition (character, value);
- if ( !EQ (attribute, Qrep_decomposition) &&
+ ret = put_char_composition (character, value);
+ if ( !EQ (ret, Qrep_decomposition) &&
SYMBOLP (XCAR (value)) )
- value = XCDR (value);
+ {
+ attribute = ret;
+ value = XCDR (value);
+ }
}
else if (EQ (attribute, Qto_ucs))
{
{
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 (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 0
- chise_ds_set_make_string_function (default_chise_data_source,
- &make_string);
-#endif
}
return 0;
}
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;
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,
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
return slarg.retval;
}
-Lisp_Object
+static Lisp_Object
allocate_character ()
{
int cid = XINT (Vnext_defined_char_id);
#endif
DEFSUBR (Fload_char_attribute_table);
#endif
+ DEFSUBR (Fchar_feature_base_name_eq);
DEFSUBR (Fchar_feature);
DEFSUBR (Fchar_attribute_alist);
DEFSUBR (Fget_char_attribute);