* lisp/faces.el (face-spec-set-match-display): Don't match toolkit
[bpt/emacs.git] / src / charset.h
CommitLineData
3263d5a2 1/* Header for charset handler.
73b0cd50 2 Copyright (C) 2001-2011 Free Software Foundation, Inc.
7976eda0 3 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5df4f04c 4 2005, 2006, 2007, 2008, 2009, 2010, 2011
ce03bf76
KH
5 National Institute of Advanced Industrial Science and Technology (AIST)
6 Registration Number H14PRO021
4ed46869 7
8f924df7 8 Copyright (C) 2003
3263d5a2
KH
9 National Institute of Advanced Industrial Science and Technology (AIST)
10 Registration Number H13PRO009
4ed46869 11
369314dc
KH
12This file is part of GNU Emacs.
13
b9b1cc14 14GNU Emacs is free software: you can redistribute it and/or modify
369314dc 15it under the terms of the GNU General Public License as published by
b9b1cc14
GM
16the Free Software Foundation, either version 3 of the License, or
17(at your option) any later version.
4ed46869 18
369314dc
KH
19GNU Emacs is distributed in the hope that it will be useful,
20but WITHOUT ANY WARRANTY; without even the implied warranty of
21MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22GNU General Public License for more details.
4ed46869 23
369314dc 24You should have received a copy of the GNU General Public License
b9b1cc14 25along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
4ed46869 26
aa01a892
KH
27#ifndef EMACS_CHARSET_H
28#define EMACS_CHARSET_H
4ed46869 29
3263d5a2
KH
30/* Index to arguments of Fdefine_charset_internal. */
31
32enum define_charset_arg_index
33 {
34 charset_arg_name,
35 charset_arg_dimension,
36 charset_arg_code_space,
315c0139
KH
37 charset_arg_min_code,
38 charset_arg_max_code,
3263d5a2
KH
39 charset_arg_iso_final,
40 charset_arg_iso_revision,
41 charset_arg_emacs_mule_id,
42 charset_arg_ascii_compatible_p,
43 charset_arg_supplementary_p,
44 charset_arg_invalid_code,
45 charset_arg_code_offset,
46 charset_arg_map,
ec7dd615
KH
47 charset_arg_subset,
48 charset_arg_superset,
3263d5a2
KH
49 charset_arg_unify_map,
50 charset_arg_plist,
51 charset_arg_max
52 };
53
54
55/* Indices to charset attributes vector. */
56
57enum charset_attr_index
58 {
59 /* ID number of the charset. */
60 charset_id,
4ed46869 61
3263d5a2
KH
62 /* Name of the charset (symbol). */
63 charset_name,
64
65 /* Property list of the charset. */
66 charset_plist,
67
2bc20f0b
KH
68 /* If the method of the charset is `MAP', the value is a mapping
69 vector or a file name that contains mapping vector. Otherwise,
70 nil. */
3263d5a2
KH
71 charset_map,
72
73 /* If the method of the charset is `MAP', the value is a vector
74 that maps code points of the charset to characters. The vector
75 is indexed by a character index. A character index is
76 calculated from a code point and the code-space table of the
77 charset. */
78 charset_decoder,
79
80 /* If the method of the charset is `MAP', the value is a
81 char-table that maps characters of the charset to code
82 points. */
83 charset_encoder,
84
ec7dd615
KH
85 /* If the method of the charset is `SUBSET', the value is a vector
86 that has this form:
87
88 [ CHARSET-ID MIN-CODE MAX-CODE OFFSET ]
89
90 CHARSET-ID is an ID number of a parent charset. MIN-CODE and
91 MAX-CODE specify the range of characters inherited from the
92 parent. OFFSET is an integer value to add to a code point of
93 the parent charset to get the corresponding code point of this
94 charset. */
95 charset_subset,
96
97 /* If the method of the charset is `SUPERSET', the value is a list
98 whose elements have this form:
99
100 (CHARSET-ID . OFFSET)
101
924b41ee
JB
102 CHARSET-IDs are ID numbers of parent charsets. OFFSET is an
103 integer value to add to a code point of the parent charset to
104 get the corresponding code point of this charset. */
ec7dd615 105 charset_superset,
3263d5a2 106
7619dee9
DL
107 /* The value is a mapping vector or a file name that contains the
108 mapping. This defines how characters in the charset should be
109 unified with Unicode. The value of the member
3e4abc9e 110 `charset_deunifier' is created from this information. */
3263d5a2
KH
111 charset_unify_map,
112
3e4abc9e 113 /* If characters in the charset must be unified Unicode, the value
1c305bc1
KH
114 is a char table that maps a unified Unicode character code to
115 the non-unified character code in the charset. */
3263d5a2
KH
116 charset_deunifier,
117
7619dee9 118 /* The length of the charset attribute vector. */
3263d5a2
KH
119 charset_attr_max
120 };
121
122/* Methods for converting code points and characters of charsets. */
123
124enum charset_method
125 {
126 /* For a charset of this method, a character code is calculated
127 from a character index (which is calculated from a code point)
128 simply by adding an offset value. */
129 CHARSET_METHOD_OFFSET,
130
131 /* For a charset of this method, a decoder vector and an encoder
132 char-table is used for code point <-> character code
133 conversion. */
134 CHARSET_METHOD_MAP,
135
7619dee9 136 /* A charset of this method is a subset of another charset. */
ec7dd615
KH
137 CHARSET_METHOD_SUBSET,
138
7619dee9 139 /* A charset of this method is a superset of other charsets. */
ec7dd615 140 CHARSET_METHOD_SUPERSET
3263d5a2
KH
141 };
142
143struct charset
144{
3e4abc9e 145 /* Index to charset_table. */
3263d5a2 146 int id;
4ed46869 147
3e4abc9e 148 /* Index to Vcharset_hash_table. */
3263d5a2
KH
149 int hash_index;
150
151 /* Dimension of the charset: 1, 2, 3, or 4. */
152 int dimension;
153
ac6a8028
KH
154 /* Byte code range of each dimension. <code_space>[4N] is a mininum
155 byte code of the (N+1)th dimension, <code_space>[4N+1] is a
156 maximum byte code of the (N+1)th dimension, <code_space>[4N+2] is
157 (<code_space>[4N+1] - <code_space>[4N] + 1), <code_space>[4N+3]
158 is a number of characters containd in the first to (N+1)th
159 dismesions. We get `char-index' of a `code-point' from this
160 information. */
3263d5a2 161 int code_space[16];
54e15bb9 162
ac6a8028
KH
163 /* If B is a byte of Nth dimension of a code-point, the (N-1)th bit
164 of code_space_mask[B] is set. This array is used to quickly
165 check if a code-point is in a valid range. */
166 unsigned char *code_space_mask;
d3985b78 167
3263d5a2
KH
168 /* 1 if there's no gap in code-points. */
169 int code_linear_p;
d3985b78 170
3263d5a2
KH
171 /* If the charset is treated as 94-chars in ISO-2022, the value is 0.
172 If the charset is treated as 96-chars in ISO-2022, the value is 1. */
173 int iso_chars_96;
d3985b78 174
3e4abc9e
KH
175 /* ISO final byte of the charset: 48..127. It may be -1 if the
176 charset doesn't conform to ISO-2022. */
3263d5a2 177 int iso_final;
d3985b78 178
3e4abc9e 179 /* ISO revision number of the charset. */
3263d5a2 180 int iso_revision;
d3985b78 181
3263d5a2
KH
182 /* If the charset is identical to what supported by Emacs 21 and the
183 priors, the identification number of the charset used in those
184 version. Otherwise, -1. */
185 int emacs_mule_id;
186
b2e6b10f 187 /* Nonzero if the charset is compatible with ASCII. */
3263d5a2 188 int ascii_compatible_p;
4ed46869 189
b2e6b10f 190 /* Nonzero if the charset is supplementary. */
3263d5a2
KH
191 int supplementary_p;
192
b2e6b10f 193 /* Nonzero if all the code points are representable by Lisp_Int. */
3263d5a2
KH
194 int compact_codes_p;
195
196 /* The method for encoding/decoding characters of the charset. */
197 enum charset_method method;
198
199 /* Mininum and Maximum code points of the charset. */
200 unsigned min_code, max_code;
201
315c0139
KH
202 /* Offset value used by macros CODE_POINT_TO_INDEX and
203 INDEX_TO_CODE_POINT. . */
204 unsigned char_index_offset;
205
3263d5a2
KH
206 /* Mininum and Maximum character codes of the charset. If the
207 charset is compatible with ASCII, min_char is a minimum non-ASCII
39d992af
KH
208 character of the charset. If the method of charset is
209 CHARSET_METHOD_OFFSET, even if the charset is unified, min_char
210 and max_char doesn't change. */
3263d5a2
KH
211 int min_char, max_char;
212
213 /* The code returned by ENCODE_CHAR if a character is not encodable
214 by the charset. */
215 unsigned invalid_code;
216
217 /* If the method of the charset is CHARSET_METHOD_MAP, this is a
218 table of bits used to quickly and roughly guess if a character
219 belongs to the charset.
220
221 The first 64 elements are 512 bits for characters less than
222 0x10000. Each bit corresponds to 128-character block. The last
223 126 elements are 1008 bits for the greater characters
224 (0x10000..0x3FFFFF). Each bit corresponds to 4096-character
225 block.
226
7619dee9 227 If a bit is 1, at least one character in the corresponding block is
3263d5a2
KH
228 in this charset. */
229 unsigned char fast_map[190];
230
231 /* Offset value to calculate a character code from code-point, and
232 visa versa. */
233 int code_offset;
234
235 int unified_p;
236};
237
238/* Hash table of charset symbols vs. the correponding attribute
239 vectors. */
240extern Lisp_Object Vcharset_hash_table;
241
242/* Table of struct charset. */
243extern struct charset *charset_table;
3263d5a2
KH
244
245#define CHARSET_FROM_ID(id) (charset_table + (id))
246
39d992af 247extern Lisp_Object Vcharset_ordered_list;
370cefff 248extern Lisp_Object Vcharset_non_preferred_head;
39d992af
KH
249
250/* Incremented everytime we change the priority of charsets. */
a0b31951 251extern unsigned short charset_ordered_list_tick;
39d992af 252
3263d5a2
KH
253extern Lisp_Object Viso_2022_charset_list;
254extern Lisp_Object Vemacs_mule_charset_list;
255
b84ae584 256extern int emacs_mule_charset[256];
3263d5a2 257
3263d5a2
KH
258/* Macros to access information about charset. */
259
260/* Return the attribute vector of charset whose symbol is SYMBOL. */
261#define CHARSET_SYMBOL_ATTRIBUTES(symbol) \
262 Fgethash ((symbol), Vcharset_hash_table, Qnil)
263
264#define CHARSET_ATTR_ID(attrs) AREF ((attrs), charset_id)
265#define CHARSET_ATTR_NAME(attrs) AREF ((attrs), charset_name)
266#define CHARSET_ATTR_PLIST(attrs) AREF ((attrs), charset_plist)
267#define CHARSET_ATTR_MAP(attrs) AREF ((attrs), charset_map)
268#define CHARSET_ATTR_DECODER(attrs) AREF ((attrs), charset_decoder)
269#define CHARSET_ATTR_ENCODER(attrs) AREF ((attrs), charset_encoder)
ec7dd615
KH
270#define CHARSET_ATTR_SUBSET(attrs) AREF ((attrs), charset_subset)
271#define CHARSET_ATTR_SUPERSET(attrs) AREF ((attrs), charset_superset)
3263d5a2
KH
272#define CHARSET_ATTR_UNIFY_MAP(attrs) AREF ((attrs), charset_unify_map)
273#define CHARSET_ATTR_DEUNIFIER(attrs) AREF ((attrs), charset_deunifier)
274
275#define CHARSET_SYMBOL_ID(symbol) \
276 CHARSET_ATTR_ID (CHARSET_SYMBOL_ATTRIBUTES (symbol))
277
278/* Return an index to Vcharset_hash_table of the charset whose symbol
279 is SYMBOL. */
280#define CHARSET_SYMBOL_HASH_INDEX(symbol) \
281 hash_lookup (XHASH_TABLE (Vcharset_hash_table), symbol, NULL)
282
283/* Return the attribute vector of CHARSET. */
284#define CHARSET_ATTRIBUTES(charset) \
285 (HASH_VALUE (XHASH_TABLE (Vcharset_hash_table), (charset)->hash_index))
286
287#define CHARSET_ID(charset) ((charset)->id)
288#define CHARSET_HASH_INDEX(charset) ((charset)->hash_index)
289#define CHARSET_DIMENSION(charset) ((charset)->dimension)
290#define CHARSET_CODE_SPACE(charset) ((charset)->code_space)
291#define CHARSET_CODE_LINEAR_P(charset) ((charset)->code_linear_p)
292#define CHARSET_ISO_CHARS_96(charset) ((charset)->iso_chars_96)
293#define CHARSET_ISO_FINAL(charset) ((charset)->iso_final)
294#define CHARSET_ISO_PLANE(charset) ((charset)->iso_plane)
295#define CHARSET_ISO_REVISION(charset) ((charset)->iso_revision)
296#define CHARSET_EMACS_MULE_ID(charset) ((charset)->emacs_mule_id)
297#define CHARSET_ASCII_COMPATIBLE_P(charset) ((charset)->ascii_compatible_p)
298#define CHARSET_COMPACT_CODES_P(charset) ((charset)->compact_codes_p)
299#define CHARSET_METHOD(charset) ((charset)->method)
300#define CHARSET_MIN_CODE(charset) ((charset)->min_code)
301#define CHARSET_MAX_CODE(charset) ((charset)->max_code)
302#define CHARSET_INVALID_CODE(charset) ((charset)->invalid_code)
303#define CHARSET_MIN_CHAR(charset) ((charset)->min_char)
304#define CHARSET_MAX_CHAR(charset) ((charset)->max_char)
305#define CHARSET_CODE_OFFSET(charset) ((charset)->code_offset)
306#define CHARSET_UNIFIED_P(charset) ((charset)->unified_p)
307
308#define CHARSET_NAME(charset) \
309 (CHARSET_ATTR_NAME (CHARSET_ATTRIBUTES (charset)))
310#define CHARSET_MAP(charset) \
311 (CHARSET_ATTR_MAP (CHARSET_ATTRIBUTES (charset)))
312#define CHARSET_DECODER(charset) \
313 (CHARSET_ATTR_DECODER (CHARSET_ATTRIBUTES (charset)))
314#define CHARSET_ENCODER(charset) \
315 (CHARSET_ATTR_ENCODER (CHARSET_ATTRIBUTES (charset)))
ec7dd615
KH
316#define CHARSET_SUBSET(charset) \
317 (CHARSET_ATTR_SUBSET (CHARSET_ATTRIBUTES (charset)))
318#define CHARSET_SUPERSET(charset) \
319 (CHARSET_ATTR_SUPERSET (CHARSET_ATTRIBUTES (charset)))
3263d5a2
KH
320#define CHARSET_UNIFY_MAP(charset) \
321 (CHARSET_ATTR_UNIFY_MAP (CHARSET_ATTRIBUTES (charset)))
322#define CHARSET_DEUNIFIER(charset) \
323 (CHARSET_ATTR_DEUNIFIER (CHARSET_ATTRIBUTES (charset)))
324
325
b2e6b10f 326/* Nonzero if OBJ is a valid charset symbol. */
3263d5a2
KH
327#define CHARSETP(obj) (CHARSET_SYMBOL_HASH_INDEX (obj) >= 0)
328
329/* Check if X is a valid charset symbol. If not, signal an error. */
330#define CHECK_CHARSET(x) \
384107f2 331 do { \
3263d5a2 332 if (! SYMBOLP (x) || CHARSET_SYMBOL_HASH_INDEX (x) < 0) \
43d1af23 333 wrong_type_argument (Qcharsetp, (x)); \
384107f2 334 } while (0)
6e4dc3e1 335
6e4dc3e1 336
3263d5a2
KH
337/* Check if X is a valid charset symbol. If valid, set ID to the id
338 number of the charset. Otherwise, signal an error. */
339#define CHECK_CHARSET_GET_ID(x, id) \
340 do { \
341 int idx; \
342 \
343 if (! SYMBOLP (x) || (idx = CHARSET_SYMBOL_HASH_INDEX (x)) < 0) \
43d1af23 344 wrong_type_argument (Qcharsetp, (x)); \
73e92b8c
DL
345 id = XINT (AREF (HASH_VALUE (XHASH_TABLE (Vcharset_hash_table), idx), \
346 charset_id)); \
4ed46869
KH
347 } while (0)
348
6e4dc3e1 349
3263d5a2
KH
350/* Check if X is a valid charset symbol. If valid, set ATTR to the
351 attr vector of the charset. Otherwise, signal an error. */
352#define CHECK_CHARSET_GET_ATTR(x, attr) \
353 do { \
354 if (!SYMBOLP (x) || NILP (attr = CHARSET_SYMBOL_ATTRIBUTES (x))) \
43d1af23 355 wrong_type_argument (Qcharsetp, (x)); \
6e4dc3e1
KH
356 } while (0)
357
6e4dc3e1 358
3263d5a2
KH
359#define CHECK_CHARSET_GET_CHARSET(x, charset) \
360 do { \
f6095868
PE
361 int csid; \
362 CHECK_CHARSET_GET_ID (x, csid); \
363 charset = CHARSET_FROM_ID (csid); \
c399b461
RS
364 } while (0)
365
c399b461 366
924b41ee 367/* Lookup Vcharset_ordered_list and return the first charset that
3263d5a2 368 contains the character C. */
ec91b3c9
KH
369#define CHAR_CHARSET(c) \
370 ((c) < 0x80 ? CHARSET_FROM_ID (charset_ascii) \
371 : char_charset ((c), Qnil, NULL))
c399b461 372
3263d5a2
KH
373#if 0
374/* Char-table of charset-sets. Each element is a bool vector indexed
375 by a charset ID. */
376extern Lisp_Object Vchar_charset_set;
6e4dc3e1 377
3263d5a2
KH
378/* Charset-bag of character C. */
379#define CHAR_CHARSET_SET(c) \
380 CHAR_TABLE_REF (Vchar_charset_set, c)
6e4dc3e1 381
3263d5a2
KH
382/* Check if two characters C1 and C2 belong to the same charset. */
383#define SAME_CHARSET_P(c1, c2) \
384 intersection_p (CHAR_CHARSET_SET (c1), CHAR_CHARSET_SET (c2))
385
386#endif
387
388
389/* Return a character correponding to the code-point CODE of CHARSET.
390 Try some optimization before calling decode_char. */
391
392#define DECODE_CHAR(charset, code) \
393 ((ASCII_BYTE_P (code) && (charset)->ascii_compatible_p) \
394 ? (code) \
395 : ((code) < (charset)->min_code || (code) > (charset)->max_code) \
396 ? -1 \
397 : (charset)->unified_p \
398 ? decode_char ((charset), (code)) \
399 : (charset)->method == CHARSET_METHOD_OFFSET \
400 ? ((charset)->code_linear_p \
401 ? (code) - (charset)->min_code + (charset)->code_offset \
402 : decode_char ((charset), (code))) \
403 : (charset)->method == CHARSET_METHOD_MAP \
2bc20f0b
KH
404 ? (((charset)->code_linear_p \
405 && VECTORP (CHARSET_DECODER (charset))) \
3263d5a2 406 ? XINT (AREF (CHARSET_DECODER (charset), \
2bc20f0b 407 (code) - (charset)->min_code)) \
3263d5a2
KH
408 : decode_char ((charset), (code))) \
409 : decode_char ((charset), (code)))
410
411
8cf93b6e
KH
412/* If CHARSET is a simple offset base charset, return it's offset,
413 otherwise return -1. */
414#define CHARSET_OFFSET(charset) \
415 (((charset)->method == CHARSET_METHOD_OFFSET \
416 && (charset)->code_linear_p \
417 && ! (charset)->unified_p) \
418 ? (charset)->code_offset - (charset)->min_code \
419 : -1)
420
ec7dd615
KH
421extern Lisp_Object charset_work;
422
3263d5a2
KH
423/* Return a code point of CHAR in CHARSET.
424 Try some optimization before calling encode_char. */
425
ec7dd615
KH
426#define ENCODE_CHAR(charset, c) \
427 ((ASCII_CHAR_P (c) && (charset)->ascii_compatible_p) \
428 ? (c) \
9a02732d
KH
429 : ((charset)->unified_p \
430 || (charset)->method == CHARSET_METHOD_SUBSET \
431 || (charset)->method == CHARSET_METHOD_SUPERSET) \
ec7dd615
KH
432 ? encode_char ((charset), (c)) \
433 : ((c) < (charset)->min_char || (c) > (charset)->max_char) \
434 ? (charset)->invalid_code \
435 : (charset)->method == CHARSET_METHOD_OFFSET \
436 ? ((charset)->code_linear_p \
437 ? (c) - (charset)->code_offset + (charset)->min_code \
438 : encode_char ((charset), (c))) \
439 : (charset)->method == CHARSET_METHOD_MAP \
2bc20f0b
KH
440 ? (((charset)->compact_codes_p \
441 && CHAR_TABLE_P (CHARSET_ENCODER (charset))) \
ec7dd615
KH
442 ? (charset_work = CHAR_TABLE_REF (CHARSET_ENCODER (charset), (c)), \
443 (NILP (charset_work) \
444 ? (charset)->invalid_code \
445 : XFASTINT (charset_work))) \
446 : encode_char ((charset), (c))) \
3263d5a2
KH
447 : encode_char ((charset), (c)))
448
449
450/* Set to 1 when a charset map is loaded to warn that a buffer text
451 and a string data may be relocated. */
452extern int charset_map_loaded;
453
454
455/* Set CHARSET to the charset highest priority of C, CODE to the
456 code-point of C in CHARSET. */
457#define SPLIT_CHAR(c, charset, code) \
458 ((charset) = char_charset ((c), Qnil, &(code)))
459
460
461#define ISO_MAX_DIMENSION 3
462#define ISO_MAX_CHARS 2
463#define ISO_MAX_FINAL 0x80 /* only 0x30..0xFF are used */
464
465/* Mapping table from ISO2022's charset (specified by DIMENSION,
466 CHARS, and FINAL_CHAR) to Emacs' charset ID. Should be accessed by
467 macro ISO_CHARSET_TABLE (DIMENSION, CHARS, FINAL_CHAR). */
468extern int iso_charset_table[ISO_MAX_DIMENSION][ISO_MAX_CHARS][ISO_MAX_FINAL];
c399b461 469
3263d5a2
KH
470/* A charset of type iso2022 who has DIMENSION, CHARS, and FINAL
471 (final character). */
472#define ISO_CHARSET_TABLE(dimension, chars_96, final) \
473 iso_charset_table[(dimension) - 1][(chars_96)][(final)]
6e4dc3e1 474
b2e6b10f 475/* Nonzero if the charset who has FAST_MAP may contain C. */
3263d5a2
KH
476#define CHARSET_FAST_MAP_REF(c, fast_map) \
477 ((c) < 0x10000 \
478 ? fast_map[(c) >> 10] & (1 << (((c) >> 7) & 7)) \
479 : fast_map[((c) >> 15) + 62] & (1 << (((c) >> 12) & 7)))
6e4dc3e1 480
3263d5a2 481#define CHARSET_FAST_MAP_SET(c, fast_map) \
384107f2 482 do { \
3263d5a2
KH
483 if ((c) < 0x10000) \
484 (fast_map)[(c) >> 10] |= 1 << (((c) >> 7) & 7); \
384107f2 485 else \
3263d5a2 486 (fast_map)[((c) >> 15) + 62] |= 1 << (((c) >> 12) & 7); \
384107f2
KH
487 } while (0)
488
6e4dc3e1 489
6e4dc3e1 490
b2e6b10f 491/* 1 if CHARSET may contain the character C. */
ec7dd615
KH
492#define CHAR_CHARSET_P(c, charset) \
493 ((ASCII_CHAR_P (c) && (charset)->ascii_compatible_p) \
1c305bc1
KH
494 || ((CHARSET_UNIFIED_P (charset) \
495 || (charset)->method == CHARSET_METHOD_SUBSET \
496 || (charset)->method == CHARSET_METHOD_SUPERSET) \
ec7dd615
KH
497 ? encode_char ((charset), (c)) != (charset)->invalid_code \
498 : (CHARSET_FAST_MAP_REF ((c), (charset)->fast_map) \
499 && ((charset)->method == CHARSET_METHOD_OFFSET \
500 ? (c) >= (charset)->min_char && (c) <= (charset)->max_char \
501 : ((charset)->method == CHARSET_METHOD_MAP \
8cc53f96
KH
502 && (charset)->compact_codes_p \
503 && CHAR_TABLE_P (CHARSET_ENCODER (charset))) \
ec7dd615 504 ? ! NILP (CHAR_TABLE_REF (CHARSET_ENCODER (charset), (c))) \
3263d5a2 505 : encode_char ((charset), (c)) != (charset)->invalid_code))))
6e4dc3e1 506
39d992af
KH
507\f
508/* Special macros for emacs-mule encoding. */
4ed46869 509
39d992af
KH
510/* Leading-code followed by extended leading-code. DIMENSION/COLUMN */
511#define EMACS_MULE_LEADING_CODE_PRIVATE_11 0x9A /* 1/1 */
512#define EMACS_MULE_LEADING_CODE_PRIVATE_12 0x9B /* 1/2 */
513#define EMACS_MULE_LEADING_CODE_PRIVATE_21 0x9C /* 2/2 */
514#define EMACS_MULE_LEADING_CODE_PRIVATE_22 0x9D /* 2/2 */
515
39d992af 516\f
4ed46869 517
3263d5a2
KH
518extern Lisp_Object Qcharsetp;
519
955cbe7b 520extern Lisp_Object Qascii;
21f9c39d 521extern int charset_ascii, charset_eight_bit;
96f45cf0 522extern int charset_unicode;
e73576a3
KH
523extern int charset_jisx0201_roman;
524extern int charset_jisx0208_1978;
525extern int charset_jisx0208;
3c908a57 526extern int charset_ksc5601;
3263d5a2 527
3fd31366
KH
528extern int charset_unibyte;
529
383e0970
J
530extern struct charset *char_charset (int, Lisp_Object, unsigned *);
531extern Lisp_Object charset_attributes (int);
3263d5a2 532
383e0970
J
533extern int maybe_unify_char (int, Lisp_Object);
534extern int decode_char (struct charset *, unsigned);
535extern unsigned encode_char (struct charset *, int);
536extern int string_xstring_p (Lisp_Object);
3263d5a2 537
383e0970
J
538extern void map_charset_chars (void (*) (Lisp_Object, Lisp_Object),
539 Lisp_Object, Lisp_Object,
540 struct charset *, unsigned, unsigned);
ec7dd615 541
aa01a892 542#endif /* EMACS_CHARSET_H */