Copyright (C) 1995, 1996 Ben Wing.
Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
Licensed to the Free Software Foundation.
- Copyright (C) 1999,2000,2001,2002 MORIOKA Tomohiko
+ Copyright (C) 1999,2000,2001,2002,2003 MORIOKA Tomohiko
This file is part of XEmacs.
\f
#ifdef UTF2000
+EXFUN (Fchar_refs_simplify_char_specs, 1);
+extern Lisp_Object Qideographic_structure;
+
EXFUN (Fmap_char_attribute, 3);
-#if defined(HAVE_DATABASE)
+#if defined(HAVE_CHISE_CLIENT)
EXFUN (Fload_char_attribute_table, 1);
Lisp_Object Vchar_db_stingy_mode;
return retval;
}
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
static void
save_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root,
Lisp_Object db,
- Emchar ofs, int place)
+ Emchar ofs, int place,
+ Lisp_Object (*filter)(Lisp_Object value))
{
struct chartab_range rainj;
int i, retval;
return retval;
}
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
static void
save_uint16_byte_table (Lisp_Uint16_Byte_Table *ct, Lisp_Char_Table* root,
Lisp_Object db,
- Emchar ofs, int place)
+ Emchar ofs, int place,
+ Lisp_Object (*filter)(Lisp_Object value))
{
struct chartab_range rainj;
int i, retval;
return retval;
}
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
static void
save_byte_table (Lisp_Byte_Table *ct, Lisp_Char_Table* root,
Lisp_Object db,
- Emchar ofs, int place)
+ Emchar ofs, int place,
+ Lisp_Object (*filter)(Lisp_Object value))
{
int i, retval;
Lisp_Object v;
if (UINT8_BYTE_TABLE_P (v))
{
save_uint8_byte_table (XUINT8_BYTE_TABLE(v), root, db,
- c, place - 1);
+ c, place - 1, filter);
c += unit;
}
else if (UINT16_BYTE_TABLE_P (v))
{
save_uint16_byte_table (XUINT16_BYTE_TABLE(v), root, db,
- c, place - 1);
+ c, place - 1, filter);
c += unit;
}
else if (BYTE_TABLE_P (v))
{
save_byte_table (XBYTE_TABLE(v), root, db,
- c, place - 1);
+ c, place - 1, filter);
c += unit;
}
else if (EQ (v, Qunloaded))
struct chartab_range rainj;
Emchar c1 = c + unit;
+ if (filter != NULL)
+ v = (*filter)(v);
+
rainj.type = CHARTAB_RANGE_CHAR;
for (; c < c1 && retval == 0; c++)
{
Lisp_Object ret = get_char_id_table (ct, ch);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
if (NILP (ret))
{
if (EQ (CHAR_TABLE_NAME (ct), Qdowncase))
case CHARTAB_RANGE_CHARSET:
#ifdef UTF2000
{
- Emchar c;
Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (range->charset);
/* printf ("put-char-table: range = charset: %d\n",
*/
if ( CHAR_TABLEP (encoding_table) )
{
-#if 1
char_attribute_table_to_put = ct;
value_to_put = val;
Fmap_char_attribute (Qput_char_table_map_function,
XCHAR_TABLE_NAME (encoding_table),
Qnil);
-#else
- for (c = 0; c < 1 << 24; c++)
- {
- if ( INTP (get_char_id_table (XCHAR_TABLE(encoding_table),
- c)) )
- put_char_id_table_0 (ct, c, val);
- }
-#endif
}
+#if 0
else
{
+ Emchar c;
+
for (c = 0; c < 1 << 24; c++)
{
if ( charset_code_point (range->charset, c) >= 0 )
put_char_id_table_0 (ct, c, val);
}
}
+#endif
}
#else
if (EQ (range->charset, Vcharset_ascii))
{
Emchar ch = DECODE_CHAR (range->charset, (range->row << 8) | i);
- if ( charset_code_point (range->charset, ch) >= 0 )
+ if ( charset_code_point (range->charset, ch, 0) >= 0 )
put_char_id_table_0 (ct, ch, val);
}
}
struct chartab_range rainj;
struct map_char_table_for_charset_arg mcarg;
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
if (XCHAR_TABLE_UNLOADED(encoding_table))
Fload_char_attribute_table (XCHAR_TABLE_NAME (encoding_table));
#endif
{
Emchar ch = DECODE_CHAR (range->charset, (range->row << 8) | i);
- if ( charset_code_point (range->charset, ch) >= 0 )
+ if ( charset_code_point (range->charset, ch, 0) >= 0 )
{
Lisp_Object val
= get_byte_table (get_byte_table
return default_value;
}
-DEFUN ("put-char-attribute", Fput_char_attribute, 3, 3, 0, /*
-Store CHARACTER's ATTRIBUTE with VALUE.
-*/
- (character, attribute, value))
+void put_char_composition (Lisp_Object character, Lisp_Object value);
+void
+put_char_composition (Lisp_Object character, Lisp_Object value)
{
- Lisp_Object ccs = Ffind_charset (attribute);
+ if (!CONSP (value))
+ signal_simple_error ("Invalid value for ->decomposition",
+ value);
- if (!NILP (ccs))
+ if (CONSP (Fcdr (value)))
{
- CHECK_CHAR (character);
- value = put_char_ccs_code_point (character, ccs, value);
- }
- else if (EQ (attribute, Q_decomposition))
- {
- CHECK_CHAR (character);
- if (!CONSP (value))
- signal_simple_error ("Invalid value for ->decomposition",
- value);
-
- if (CONSP (Fcdr (value)))
+ if (NILP (Fcdr (Fcdr (value))))
{
- if (NILP (Fcdr (Fcdr (value))))
- {
- Lisp_Object base = Fcar (value);
- Lisp_Object modifier = Fcar (Fcdr (value));
+ Lisp_Object base = Fcar (value);
+ Lisp_Object modifier = Fcar (Fcdr (value));
- if (INTP (base))
- {
- base = make_char (XINT (base));
- Fsetcar (value, base);
- }
- if (INTP (modifier))
- {
- modifier = make_char (XINT (modifier));
- Fsetcar (Fcdr (value), modifier);
- }
- if (CHARP (base))
- {
- Lisp_Object alist = Fget_char_attribute (base, Qcomposition, Qnil);
- Lisp_Object ret = Fassq (modifier, alist);
-
- if (NILP (ret))
- Fput_char_attribute (base, Qcomposition,
- Fcons (Fcons (modifier, character), alist));
- else
- Fsetcdr (ret, character);
- }
+ if (INTP (base))
+ {
+ base = make_char (XINT (base));
+ Fsetcar (value, base);
+ }
+ if (INTP (modifier))
+ {
+ modifier = make_char (XINT (modifier));
+ Fsetcar (Fcdr (value), modifier);
+ }
+ if (CHARP (base))
+ {
+ Lisp_Object alist
+ = Fget_char_attribute (base, Qcomposition, Qnil);
+ Lisp_Object ret = Fassq (modifier, alist);
+
+ if (NILP (ret))
+ Fput_char_attribute (base, Qcomposition,
+ Fcons (Fcons (modifier, character),
+ alist));
+ else
+ Fsetcdr (ret, character);
}
}
- else
+ }
+ else
+ {
+ Lisp_Object v = Fcar (value);
+
+ if (INTP (v))
{
- Lisp_Object v = Fcar (value);
+ Emchar c = XINT (v);
+ Lisp_Object ret
+ = Fget_char_attribute (make_char (c), Q_ucs_variants, Qnil);
- if (INTP (v))
+ if (!CONSP (ret))
{
- Emchar c = XINT (v);
- Lisp_Object ret
- = Fget_char_attribute (make_char (c), Q_ucs_variants, Qnil);
-
- if (!CONSP (ret))
- {
- Fput_char_attribute (make_char (c), Q_ucs_variants,
- Fcons (character, Qnil));
- }
- else if (NILP (Fmemq (character, ret)))
- {
- Fput_char_attribute (make_char (c), Q_ucs_variants,
- Fcons (character, ret));
- }
+ Fput_char_attribute (make_char (c), Q_ucs_variants,
+ Fcons (character, Qnil));
+ }
+ else if (NILP (Fmemq (character, ret)))
+ {
+ Fput_char_attribute (make_char (c), Q_ucs_variants,
+ Fcons (character, ret));
}
}
}
+}
+
+DEFUN ("put-char-attribute", Fput_char_attribute, 3, 3, 0, /*
+Store CHARACTER's ATTRIBUTE with VALUE.
+*/
+ (character, attribute, value))
+{
+ Lisp_Object ccs = Ffind_charset (attribute);
+
+ CHECK_CHAR (character);
+
+ if (!NILP (ccs))
+ {
+ value = put_char_ccs_code_point (character, ccs, value);
+ attribute = XCHARSET_NAME (ccs);
+ }
+ else if (EQ (attribute, Q_decomposition))
+ put_char_composition (character, value);
else if (EQ (attribute, Qto_ucs) || EQ (attribute, Q_ucs))
{
Lisp_Object ret;
Emchar c;
- CHECK_CHAR (character);
if (!INTP (value))
- signal_simple_error ("Invalid value for ->ucs", value);
+ signal_simple_error ("Invalid value for =>ucs", value);
c = XINT (value);
attribute = Qto_ucs;
#endif
}
+#if 0
+ else if (EQ (attribute, Qideographic_structure))
+ value = Fcopy_sequence (Fchar_refs_simplify_char_specs (value));
+#endif
{
Lisp_Object table = Fgethash (attribute,
Vchar_attribute_hash_table,
{
table = make_char_id_table (Qunbound);
Fputhash (attribute, table, Vchar_attribute_hash_table);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
XCHAR_TABLE_NAME (table) = attribute;
#endif
}
return Qnil;
}
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
Lisp_Object
char_attribute_system_db_file (Lisp_Object key_type, Lisp_Object attribute,
int writing_mode)
*/
(attribute))
{
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
Lisp_Object table = Fgethash (attribute,
Vchar_attribute_hash_table, Qunbound);
Lisp_Char_Table *ct;
db = Fopen_database (db_file, Qnil, Qnil, build_string ("w+"), Qnil);
if (!NILP (db))
{
+ Lisp_Object (*filter)(Lisp_Object value);
+
+ if (EQ (attribute, Qideographic_structure))
+ filter = &Fchar_refs_simplify_char_specs;
+ else
+ filter = NULL;
+
if (UINT8_BYTE_TABLE_P (ct->table))
- save_uint8_byte_table (XUINT8_BYTE_TABLE(ct->table), ct, db, 0, 3);
+ save_uint8_byte_table (XUINT8_BYTE_TABLE(ct->table), ct, db,
+ 0, 3, filter);
else if (UINT16_BYTE_TABLE_P (ct->table))
- save_uint16_byte_table (XUINT16_BYTE_TABLE(ct->table), ct, db, 0, 3);
+ save_uint16_byte_table (XUINT16_BYTE_TABLE(ct->table), ct, db,
+ 0, 3, filter);
else if (BYTE_TABLE_P (ct->table))
- save_byte_table (XBYTE_TABLE(ct->table), ct, db, 0, 3);
+ save_byte_table (XBYTE_TABLE(ct->table), ct, db, 0, 3, filter);
Fclose_database (db);
return Qt;
}
*/
(attribute))
{
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
Lisp_Object table = Fgethash (attribute,
Vchar_attribute_hash_table, Qunbound);
*/
(attribute))
{
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
Lisp_Object table = Fgethash (attribute,
Vchar_attribute_hash_table, Qunbound);
Lisp_Char_Table *ct;
*/
(attribute))
{
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
Lisp_Object table = Fgethash (attribute,
Vchar_attribute_hash_table, Qunbound);
Lisp_Char_Table *ct;
if (NILP (range))
range = Qt;
decode_char_table_range (range, &rainj);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
if (CHAR_TABLE_UNLOADED(ct))
Fload_char_attribute_table (attribute);
#endif
(attributes))
{
Lisp_Object rest = attributes;
- Lisp_Object code = Fcdr (Fassq (Qucs, attributes));
+ Lisp_Object code = Fcdr (Fassq (Qmap_ucs, attributes));
Lisp_Object character;
if (NILP (code))
+ code = Fcdr (Fassq (Qucs, attributes));
+ if (NILP (code))
{
while (CONSP (rest))
{
DEFSUBR (Ffind_char_attribute_table);
defsymbol (&Qput_char_table_map_function, "put-char-table-map-function");
DEFSUBR (Fput_char_table_map_function);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
DEFSUBR (Fsave_char_attribute_table);
DEFSUBR (Fmount_char_attribute_table);
DEFSUBR (Freset_char_attribute_table);
vars_of_chartab (void)
{
#ifdef UTF2000
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
DEFVAR_LISP ("char-db-stingy-mode", &Vchar_db_stingy_mode /*
*/ );
Vchar_db_stingy_mode = Qt;
-#endif /* HAVE_DATABASE */
+#endif /* HAVE_CHISE_CLIENT */
#endif
/* DO NOT staticpro this. It works just like Vweak_hash_tables. */
Vall_syntax_tables = Qnil;