-Lisp_Object
-get_char_id_table (Lisp_Char_Table* cit, Emchar ch)
-{
- Lisp_Object val = get_byte_table (get_byte_table
- (get_byte_table
- (get_byte_table
- (cit->table,
- (unsigned char)(ch >> 24)),
- (unsigned char) (ch >> 16)),
- (unsigned char) (ch >> 8)),
- (unsigned char) ch);
- if (UNBOUNDP (val))
- return cit->default_value;
- else
- return val;
-}
-
-void
-put_char_id_table (Lisp_Char_Table* cit,
- Lisp_Object character, Lisp_Object value)
-{
- struct chartab_range range;
-
- decode_char_table_range (character, &range);
- switch (range.type)
- {
- case CHARTAB_RANGE_ALL:
- cit->table = value;
- break;
- case CHARTAB_RANGE_DEFAULT:
- cit->default_value = value;
- break;
- case CHARTAB_RANGE_CHARSET:
- {
- Emchar c;
- Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (range.charset);
-
- if ( CHAR_TABLEP (encoding_table) )
- {
- for (c = 0; c < 1 << 24; c++)
- {
- if ( INTP (get_char_id_table (XCHAR_TABLE(encoding_table),
- c)) )
- put_char_id_table_0 (cit, c, value);
- }
- }
- else
- {
- for (c = 0; c < 1 << 24; c++)
- {
- if ( charset_code_point (range.charset, c) >= 0 )
- put_char_id_table_0 (cit, c, value);
- }
- }
- }
- break;
- case CHARTAB_RANGE_ROW:
- {
- int cell_min, cell_max, i;
-
- if (XCHARSET_DIMENSION (range.charset) < 2)
- signal_simple_error ("Charset in row vector must be multi-byte",
- range.charset);
- else
- {
- switch (XCHARSET_CHARS (range.charset))
- {
- case 94:
- cell_min = 33; cell_max = 126;
- break;
- case 96:
- cell_min = 32; cell_max = 127;
- break;
- case 128:
- cell_min = 0; cell_max = 127;
- break;
- case 256:
- cell_min = 0; cell_max = 255;
- break;
- default:
- abort ();
- }
- }
- if (XCHARSET_DIMENSION (range.charset) == 2)
- check_int_range (range.row, cell_min, cell_max);
- else if (XCHARSET_DIMENSION (range.charset) == 3)
- {
- check_int_range (range.row >> 8 , cell_min, cell_max);
- check_int_range (range.row & 0xFF, cell_min, cell_max);
- }
- else if (XCHARSET_DIMENSION (range.charset) == 4)
- {
- check_int_range ( range.row >> 16 , cell_min, cell_max);
- check_int_range ((range.row >> 8) & 0xFF, cell_min, cell_max);
- check_int_range ( range.row & 0xFF, cell_min, cell_max);
- }
- else
- abort ();
-
- for (i = cell_min; i <= cell_max; i++)
- {
- Emchar ch = DECODE_CHAR (range.charset, (range.row << 8) | i);
- if ( charset_code_point (range.charset, ch) >= 0 )
- put_char_id_table_0 (cit, ch, value);
- }
- }
- break;
- case CHARTAB_RANGE_CHAR:
- put_char_id_table_0 (cit, range.ch, value);
- break;
- }
-}
-