(CODING_ISO_CMP_STATUS): New macro.
[bpt/emacs.git] / src / coding.h
CommitLineData
4ed46869 1/* Header for coding system handler.
429ab54e 2 Copyright (C) 2001, 2002, 2003, 2004, 2005,
76b6f707 3 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
7976eda0 4 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
76b6f707 5 2005, 2006, 2007, 2008, 2009
ce03bf76
KH
6 National Institute of Advanced Industrial Science and Technology (AIST)
7 Registration Number H14PRO021
8f924df7 8 Copyright (C) 2003
df7492f9
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
6f776e81
KH
27#ifndef EMACS_CODING_H
28#define EMACS_CODING_H
4ed46869 29
df7492f9 30/* Index to arguments of Fdefine_coding_system_internal. */
4ed46869 31
df7492f9
KH
32enum define_coding_system_arg_index
33 {
34 coding_arg_name,
35 coding_arg_mnemonic,
36 coding_arg_coding_type,
37 coding_arg_charset_list,
38 coding_arg_ascii_compatible_p,
39 coding_arg_decode_translation_table,
40 coding_arg_encode_translation_table,
41 coding_arg_post_read_conversion,
42 coding_arg_pre_write_conversion,
43 coding_arg_default_char,
8f924df7 44 coding_arg_for_unibyte,
df7492f9
KH
45 coding_arg_plist,
46 coding_arg_eol_type,
47 coding_arg_max
48 };
4ed46869 49
df7492f9 50enum define_coding_iso2022_arg_index
4ed46869 51 {
df7492f9
KH
52 coding_arg_iso2022_initial = coding_arg_max,
53 coding_arg_iso2022_reg_usage,
54 coding_arg_iso2022_request,
55 coding_arg_iso2022_flags,
56 coding_arg_iso2022_max
4ed46869
KH
57 };
58
e4215ddd
KH
59enum define_coding_utf8_arg_index
60 {
61 coding_arg_utf8_bom = coding_arg_max,
62 coding_arg_utf8_max
63 };
64
df7492f9 65enum define_coding_utf16_arg_index
4ed46869 66 {
df7492f9
KH
67 coding_arg_utf16_bom = coding_arg_max,
68 coding_arg_utf16_endian,
69 coding_arg_utf16_max
4ed46869
KH
70 };
71
df7492f9
KH
72enum define_coding_ccl_arg_index
73 {
35d47d18 74 coding_arg_ccl_decoder = coding_arg_max,
df7492f9
KH
75 coding_arg_ccl_encoder,
76 coding_arg_ccl_valids,
77 coding_arg_ccl_max
78 };
4ed46869 79
933373ed
KH
80/* Hash table for all coding systems. Keys are coding system symbols
81 and values are spec vectors of the corresponding coding system. A
82 spec vector has the form [ ATTRS ALIASES EOL-TYPE ]. ATTRS is a
83 vector of attribute of the coding system. ALIASES is a list of
84 aliases (symbols) of the coding system. EOL-TYPE is `unix', `dos',
85 `mac' or a vector of coding systems (symbols). */
86
df7492f9 87extern Lisp_Object Vcoding_system_hash_table;
4ed46869 88
933373ed 89
df7492f9 90/* Enumeration of coding system type. */
4ed46869 91
df7492f9
KH
92enum coding_system_type
93 {
94 coding_type_charset,
95 coding_type_utf_8,
96 coding_type_utf_16,
97 coding_type_iso_2022,
98 coding_type_emacs_mule,
99 coding_type_sjis,
100 coding_type_ccl,
101 coding_type_raw_text,
102 coding_type_undecided,
103 coding_type_max
104 };
4ed46869 105
4ed46869 106
df7492f9 107/* Enumeration of end-of-line format type. */
4ed46869 108
df7492f9
KH
109enum end_of_line_type
110 {
111 eol_lf, /* Line-feed only, same as Emacs' internal
112 format. */
113 eol_crlf, /* Sequence of carriage-return and
114 line-feed. */
115 eol_cr, /* Carriage-return only. */
116 eol_any, /* Accept any of above. Produce line-feed
117 only. */
118 eol_undecided, /* This value is used to denote that the
119 eol-type is not yet undecided. */
120 eol_type_max
121 };
4ed46869 122
df7492f9 123/* Enumeration of index to an attribute vector of a coding system. */
4ed46869 124
df7492f9
KH
125enum coding_attr_index
126 {
127 coding_attr_base_name,
128 coding_attr_docstring,
129 coding_attr_mnemonic,
130 coding_attr_type,
131 coding_attr_charset_list,
132 coding_attr_ascii_compat,
133 coding_attr_decode_tbl,
134 coding_attr_encode_tbl,
404202e7 135 coding_attr_trans_tbl,
df7492f9
KH
136 coding_attr_post_read,
137 coding_attr_pre_write,
138 coding_attr_default_char,
8f924df7 139 coding_attr_for_unibyte,
df7492f9
KH
140 coding_attr_plist,
141
142 coding_attr_category,
143 coding_attr_safe_charsets,
144
145 /* The followings are extra attributes for each type. */
146 coding_attr_charset_valids,
147
148 coding_attr_ccl_decoder,
149 coding_attr_ccl_encoder,
150 coding_attr_ccl_valids,
151
152 coding_attr_iso_initial,
153 coding_attr_iso_usage,
154 coding_attr_iso_request,
155 coding_attr_iso_flags,
156
e4215ddd 157 coding_attr_utf_bom,
df7492f9
KH
158 coding_attr_utf_16_endian,
159
160 coding_attr_emacs_mule_full,
161
162 coding_attr_last_index
163 };
4ed46869 164
4ed46869 165
933373ed
KH
166/* Macros to access an element of an attribute vector. */
167
04e05596
JB
168#define CODING_ATTR_BASE_NAME(attrs) AREF (attrs, coding_attr_base_name)
169#define CODING_ATTR_TYPE(attrs) AREF (attrs, coding_attr_type)
170#define CODING_ATTR_CHARSET_LIST(attrs) AREF (attrs, coding_attr_charset_list)
171#define CODING_ATTR_MNEMONIC(attrs) AREF (attrs, coding_attr_mnemonic)
172#define CODING_ATTR_DOCSTRING(attrs) AREF (attrs, coding_attr_docstring)
173#define CODING_ATTR_ASCII_COMPAT(attrs) AREF (attrs, coding_attr_ascii_compat)
174#define CODING_ATTR_DECODE_TBL(attrs) AREF (attrs, coding_attr_decode_tbl)
175#define CODING_ATTR_ENCODE_TBL(attrs) AREF (attrs, coding_attr_encode_tbl)
176#define CODING_ATTR_TRANS_TBL(attrs) AREF (attrs, coding_attr_trans_tbl)
177#define CODING_ATTR_POST_READ(attrs) AREF (attrs, coding_attr_post_read)
178#define CODING_ATTR_PRE_WRITE(attrs) AREF (attrs, coding_attr_pre_write)
179#define CODING_ATTR_DEFAULT_CHAR(attrs) AREF (attrs, coding_attr_default_char)
180#define CODING_ATTR_FOR_UNIBYTE(attrs) AREF (attrs, coding_attr_for_unibyte)
181#define CODING_ATTR_FLUSHING(attrs) AREF (attrs, coding_attr_flushing)
182#define CODING_ATTR_PLIST(attrs) AREF (attrs, coding_attr_plist)
183#define CODING_ATTR_CATEGORY(attrs) AREF (attrs, coding_attr_category)
184#define CODING_ATTR_SAFE_CHARSETS(attrs)AREF (attrs, coding_attr_safe_charsets)
8ddb35b2 185
8ddb35b2 186
933373ed
KH
187/* Return the name of a coding system specified by ID. */
188#define CODING_ID_NAME(id) \
189 (HASH_KEY (XHASH_TABLE (Vcoding_system_hash_table), id))
190
191/* Return the attribute vector of a coding system specified by ID. */
192
df7492f9
KH
193#define CODING_ID_ATTRS(id) \
194 (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 0))
fbaa2ed9 195
933373ed
KH
196/* Return the list of aliases of a coding system specified by ID. */
197
df7492f9
KH
198#define CODING_ID_ALIASES(id) \
199 (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 1))
c0c69d45 200
933373ed
KH
201/* Return the eol-type of a coding system specified by ID. */
202
df7492f9
KH
203#define CODING_ID_EOL_TYPE(id) \
204 (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 2))
658cc252 205
933373ed
KH
206
207/* Return the spec vector of CODING_SYSTEM_SYMBOL. */
fbaa2ed9 208
df7492f9
KH
209#define CODING_SYSTEM_SPEC(coding_system_symbol) \
210 (Fgethash (coding_system_symbol, Vcoding_system_hash_table, Qnil))
4ed46869 211
933373ed
KH
212
213/* Return the ID of CODING_SYSTEM_SYMBOL. */
214
df7492f9
KH
215#define CODING_SYSTEM_ID(coding_system_symbol) \
216 hash_lookup (XHASH_TABLE (Vcoding_system_hash_table), \
217 coding_system_symbol, NULL)
4ed46869 218
b2e6b10f 219/* Return 1 if CODING_SYSTEM_SYMBOL is a coding system. */
933373ed 220
7c00e33d
KH
221#define CODING_SYSTEM_P(coding_system_symbol) \
222 (CODING_SYSTEM_ID (coding_system_symbol) >= 0 \
223 || (! NILP (coding_system_symbol) \
224 && ! NILP (Fcoding_system_p (coding_system_symbol))))
4ed46869 225
933373ed
KH
226/* Check if X is a coding system or not. */
227
8f924df7 228#define CHECK_CODING_SYSTEM(x) \
df7492f9 229 do { \
7c00e33d
KH
230 if (CODING_SYSTEM_ID (x) < 0 \
231 && NILP (Fcheck_coding_system (x))) \
8f924df7 232 wrong_type_argument (Qcoding_system_p, (x)); \
df7492f9 233 } while (0)
658cc252 234
4ed46869 235
933373ed
KH
236/* Check if X is a coding system or not. If it is, set SEPC to the
237 spec vector of the coding system. */
238
df7492f9
KH
239#define CHECK_CODING_SYSTEM_GET_SPEC(x, spec) \
240 do { \
241 spec = CODING_SYSTEM_SPEC (x); \
7c00e33d
KH
242 if (NILP (spec)) \
243 { \
244 Fcheck_coding_system (x); \
245 spec = CODING_SYSTEM_SPEC (x); \
246 } \
df7492f9 247 if (NILP (spec)) \
02dfeba8 248 wrong_type_argument (Qcoding_system_p, (x)); \
df7492f9 249 } while (0)
e6de76f8 250
8ddb35b2 251
933373ed
KH
252/* Check if X is a coding system or not. If it is, set ID to the
253 ID of the coding system. */
254
df7492f9
KH
255#define CHECK_CODING_SYSTEM_GET_ID(x, id) \
256 do \
257 { \
258 id = CODING_SYSTEM_ID (x); \
7c00e33d
KH
259 if (id < 0) \
260 { \
261 Fcheck_coding_system (x); \
262 id = CODING_SYSTEM_ID (x); \
263 } \
df7492f9 264 if (id < 0) \
02dfeba8 265 wrong_type_argument (Qcoding_system_p, (x)); \
df7492f9 266 } while (0)
4ed46869 267
4ed46869
KH
268
269/*** GENERAL section ***/
270
df7492f9
KH
271/* Enumeration of result code of code conversion. */
272enum coding_result_code
4ed46869 273 {
df7492f9
KH
274 CODING_RESULT_SUCCESS,
275 CODING_RESULT_INSUFFICIENT_SRC,
276 CODING_RESULT_INSUFFICIENT_DST,
277 CODING_RESULT_INCONSISTENT_EOL,
63e11478 278 CODING_RESULT_INVALID_SRC,
df7492f9
KH
279 CODING_RESULT_INTERRUPT,
280 CODING_RESULT_INSUFFICIENT_MEM
4ed46869
KH
281 };
282
658cc252 283
3b2d77fe 284/* Macros used for the member `mode' of the struct coding_system. */
658cc252
KH
285
286/* If set, recover the original CR or LF of the already decoded text
287 when the decoding routine encounters an inconsistent eol format. */
288#define CODING_MODE_INHIBIT_INCONSISTENT_EOL 0x01
289
290/* If set, the decoding/encoding routines treat the current data as
5998373a 291 the last block of the whole text to be converted, and do the
55496054 292 appropriate finishing job. */
658cc252
KH
293#define CODING_MODE_LAST_BLOCK 0x02
294
295/* If set, it means that the current source text is in a buffer which
296 enables selective display. */
297#define CODING_MODE_SELECTIVE_DISPLAY 0x04
298
299/* This flag is used by the decoding/encoding routines on the fly. If
300 set, it means that right-to-left text is being processed. */
301#define CODING_MODE_DIRECTION 0x08
302
df7492f9
KH
303#define CODING_MODE_FIXED_DESTINATION 0x10
304
933373ed
KH
305/* If set, it means that the encoding routines produces some safe
306 ASCII characters (usually '?') for unsupported characters. */
df7492f9
KH
307#define CODING_MODE_SAFE_ENCODING 0x20
308
309/* Structure of the field `spec.iso_2022' in the structure
310 `coding_system'. */
311struct iso_2022_spec
4ed46869 312{
2ec49574 313 /* Bit-wise-or of CODING_ISO_FLAG_XXX. */
df7492f9 314 unsigned flags;
4ed46869 315
df7492f9
KH
316 /* The current graphic register invoked to each graphic plane. */
317 int current_invocation[2];
658cc252 318
df7492f9
KH
319 /* The current charset designated to each graphic register. The
320 value -1 means that not charset is designated, -2 means that
321 there was an invalid designation previously. */
322 int current_designation[4];
4ed46869 323
df7492f9
KH
324 /* Set to 1 temporarily only when graphic register 2 or 3 is invoked
325 by single-shift while encoding. */
326 int single_shifting;
4ed46869 327
df7492f9
KH
328 /* Set to 1 temporarily only when processing at beginning of line. */
329 int bol;
330};
4ed46869 331
df7492f9 332struct ccl_spec;
4ed46869 333
e4215ddd 334enum utf_bom_type
df7492f9 335 {
e4215ddd
KH
336 utf_detect_bom,
337 utf_without_bom,
338 utf_with_bom
df7492f9 339 };
279d9f7b 340
df7492f9
KH
341enum utf_16_endian_type
342 {
343 utf_16_big_endian,
344 utf_16_little_endian
345 };
279d9f7b 346
df7492f9
KH
347struct utf_16_spec
348{
e4215ddd 349 enum utf_bom_type bom;
df7492f9
KH
350 enum utf_16_endian_type endian;
351 int surrogate;
352};
279d9f7b 353
4fecac5c
KH
354struct coding_detection_info
355{
356 /* Values of these members are bitwise-OR of CATEGORY_MASK_XXXs. */
357 /* Which categories are already checked. */
358 int checked;
359 /* Which categories are strongly found. */
360 int found;
361 /* Which categories are rejected. */
362 int rejected;
363};
279d9f7b 364
279d9f7b 365
df7492f9
KH
366struct coding_system
367{
368 /* ID number of the coding system. This is an index to
369 Vcoding_system_hash_table. This value is set by
370 setup_coding_system. At the early stage of building time, this
371 value is -1 in the array coding_categories to indicate that no
372 coding-system of that category is yet defined. */
373 int id;
374
375 /* Flag bits of the coding system. The meaning of each bit is common
376 to all types of coding systems. */
377 int common_flags;
378
379 /* Mode bits of the coding system. See the comments of the macros
380 CODING_MODE_XXX. */
381 unsigned int mode;
450c60a5 382
4ed46869 383 /* Detailed information specific to each type of coding system. */
df7492f9 384 union
4ed46869 385 {
df7492f9
KH
386 struct iso_2022_spec iso_2022;
387 struct ccl_spec *ccl; /* Defined in ccl.h. */
388 struct utf_16_spec utf_16;
e4215ddd 389 enum utf_bom_type utf_8_bom;
df7492f9 390 int emacs_mule_full_support;
4ed46869
KH
391 } spec;
392
df7492f9 393 int max_charset_id;
1b3b981b 394 unsigned char *safe_charsets;
658cc252 395
df7492f9
KH
396 /* The following two members specify how binary 8-bit code 128..255
397 are represented in source and destination text respectively. 1
398 means they are represented by 2-byte sequence, 0 means they are
399 represented by 1-byte as is (see the comment in character.h). */
811ea086
KH
400 unsigned src_multibyte : 1;
401 unsigned dst_multibyte : 1;
402
a137bb00
KH
403 /* How may heading bytes we can skip for decoding. This is set to
404 -1 in setup_coding_system, and updated by detect_coding. So,
405 when this is equal to the byte length of the text being
406 converted, we can skip the actual conversion process. */
df7492f9 407 int head_ascii;
658cc252
KH
408
409 /* The following members are set by encoding/decoding routine. */
df7492f9 410 EMACS_INT produced, produced_char, consumed, consumed_char;
658cc252 411
811ea086
KH
412 /* Number of error source data found in a decoding routine. */
413 int errors;
414
df7492f9
KH
415 /* Store the positions of error source data. */
416 EMACS_INT *error_positions;
e6a9a0bc 417
df7492f9
KH
418 /* Finish status of code conversion. */
419 enum coding_result_code result;
6041c9ce 420
df7492f9
KH
421 EMACS_INT src_pos, src_pos_byte, src_chars, src_bytes;
422 Lisp_Object src_object;
8f924df7 423 const unsigned char *source;
4ed46869 424
df7492f9
KH
425 EMACS_INT dst_pos, dst_pos_byte, dst_bytes;
426 Lisp_Object dst_object;
427 unsigned char *destination;
4ed46869 428
b2e6b10f 429 /* Set to 1 if the source of conversion is not in the member
933373ed 430 `charbuf', but at `src_object'. */
df7492f9 431 int chars_at_source;
4ed46869 432
df7492f9
KH
433 /* If an element is non-negative, it is a character code.
434
435 If it is in the range -128..-1, it is a 8-bit character code
436 minus 256.
437
438 If it is less than -128, it specifies the start of an annotation
439 chunk. The length of the chunk is -128 minus the value of the
440 element. The following elements are OFFSET, ANNOTATION-TYPE, and
441 a sequence of actual data for the annotation. OFFSET is a
442 character position offset from dst_pos or src_pos,
443 ANNOTATION-TYPE specfies the meaning of the annotation and how to
444 handle the following data.. */
445 int *charbuf;
446 int charbuf_size, charbuf_used;
447
448 /* Set to 1 if charbuf contains an annotation. */
449 int annotated;
4ed46869 450
df7492f9
KH
451 unsigned char carryover[64];
452 int carryover_bytes;
a5ee738b 453
df7492f9
KH
454 int default_char;
455
4fecac5c
KH
456 int (*detector) P_ ((struct coding_system *,
457 struct coding_detection_info *));
df7492f9
KH
458 void (*decoder) P_ ((struct coding_system *));
459 int (*encoder) P_ ((struct coding_system *));
460};
461
462/* Meanings of bits in the member `common_flags' of the structure
463 coding_system. The lowest 8 bits are reserved for various kind of
464 annotations (currently two of them are used). */
465#define CODING_ANNOTATION_MASK 0x00FF
466#define CODING_ANNOTATE_COMPOSITION_MASK 0x0001
467#define CODING_ANNOTATE_DIRECTION_MASK 0x0002
4fecac5c 468#define CODING_ANNOTATE_CHARSET_MASK 0x0003
df7492f9
KH
469#define CODING_FOR_UNIBYTE_MASK 0x0100
470#define CODING_REQUIRE_FLUSHING_MASK 0x0200
471#define CODING_REQUIRE_DECODING_MASK 0x0400
472#define CODING_REQUIRE_ENCODING_MASK 0x0800
473#define CODING_REQUIRE_DETECTION_MASK 0x1000
474#define CODING_RESET_AT_BOL_MASK 0x2000
475
476/* Return 1 if the coding context CODING requires annotaion
477 handling. */
478#define CODING_REQUIRE_ANNOTATION(coding) \
479 ((coding)->common_flags & CODING_ANNOTATION_MASK)
480
481/* Return 1 if the coding context CODING prefers decoding into unibyte. */
482#define CODING_FOR_UNIBYTE(coding) \
483 ((coding)->common_flags & CODING_FOR_UNIBYTE_MASK)
484
485/* Return 1 if the coding context CODING requires specific code to be
a5ee738b
KH
486 attached at the tail of converted text. */
487#define CODING_REQUIRE_FLUSHING(coding) \
488 ((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK)
489
df7492f9 490/* Return 1 if the coding context CODING requires code conversion on
a5ee738b
KH
491 decoding. */
492#define CODING_REQUIRE_DECODING(coding) \
811ea086
KH
493 ((coding)->dst_multibyte \
494 || (coding)->common_flags & CODING_REQUIRE_DECODING_MASK)
a5ee738b 495
df7492f9
KH
496
497/* Return 1 if the coding context CODING requires code conversion on
c198294f
KH
498 encoding.
499 The non-multibyte part of the condition is to support encoding of
500 unibyte strings/buffers generated by string-as-unibyte or
501 (set-buffer-multibyte nil) from multibyte strings/buffers. */
df7492f9
KH
502#define CODING_REQUIRE_ENCODING(coding) \
503 ((coding)->src_multibyte \
504 || (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK \
505 || (coding)->mode & CODING_MODE_SELECTIVE_DISPLAY)
506
a5ee738b 507
df7492f9 508/* Return 1 if the coding context CODING requires some kind of code
a5ee738b
KH
509 detection. */
510#define CODING_REQUIRE_DETECTION(coding) \
511 ((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK)
512
df7492f9 513/* Return 1 if the coding context CODING requires code conversion on
811ea086 514 decoding or some kind of code detection. */
658cc252 515#define CODING_MAY_REQUIRE_DECODING(coding) \
811ea086
KH
516 (CODING_REQUIRE_DECODING (coding) \
517 || CODING_REQUIRE_DETECTION (coding))
4ed46869 518
4ed46869
KH
519/* Macros to decode or encode a character of JISX0208 in SJIS. S1 and
520 S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding
521 system. C1 and C2 are the 1st and 2nd position codes of Emacs'
522 internal format. */
523
df7492f9
KH
524#define SJIS_TO_JIS(code) \
525 do { \
526 int s1, s2, j1, j2; \
527 \
528 s1 = (code) >> 8, s2 = (code) & 0xFF; \
529 \
530 if (s2 >= 0x9F) \
531 (j1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0), \
532 j2 = s2 - 0x7E); \
533 else \
534 (j1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1), \
535 j2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F)); \
536 (code) = (j1 << 8) | j2; \
4ed46869
KH
537 } while (0)
538
6e58724e
KH
539#define SJIS_TO_JIS2(code) \
540 do { \
541 int s1, s2, j1, j2; \
542 \
543 s1 = (code) >> 8, s2 = (code) & 0xFF; \
544 \
545 if (s2 >= 0x9F) \
546 { \
547 j1 = (s1 == 0xF0 ? 0x28 \
548 : s1 == 0xF1 ? 0x24 \
549 : s1 == 0xF2 ? 0x2C \
550 : s1 == 0xF3 ? 0x2E \
551 : 0x6E + (s1 - 0xF4) * 2); \
552 j2 = s2 - 0x7E; \
553 } \
554 else \
555 { \
556 j1 = (s1 <= 0xF2 ? 0x21 + (s1 - 0xF0) * 2 \
557 : s1 <= 0xF4 ? 0x2D + (s1 - 0xF3) * 2 \
558 : 0x6F + (s1 - 0xF5) * 2); \
559 j2 = s2 - ((s2 >= 0x7F ? 0x20 : 0x1F)); \
560 } \
561 (code) = (j1 << 8) | j2; \
562 } while (0)
563
df7492f9
KH
564
565#define JIS_TO_SJIS(code) \
4ed46869 566 do { \
df7492f9
KH
567 int s1, s2, j1, j2; \
568 \
569 j1 = (code) >> 8, j2 = (code) & 0xFF; \
570 if (j1 & 1) \
571 (s1 = j1 / 2 + ((j1 < 0x5F) ? 0x71 : 0xB1), \
572 s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F)); \
4ed46869 573 else \
df7492f9
KH
574 (s1 = j1 / 2 + ((j1 < 0x5F) ? 0x70 : 0xB0), \
575 s2 = j2 + 0x7E); \
5afaefc1 576 (code) = (s1 << 8) | s2; \
4ed46869
KH
577 } while (0)
578
6e58724e
KH
579#define JIS_TO_SJIS2(code) \
580 do { \
581 int s1, s2, j1, j2; \
582 \
583 j1 = (code) >> 8, j2 = (code) & 0xFF; \
584 if (j1 & 1) \
585 { \
586 s1 = (j1 <= 0x25 ? 0xF0 + (j1 - 0x21) / 2 \
587 : j1 <= 0x27 ? 0xF3 + (j1 - 0x2D) / 2 \
588 : 0xF5 + (j1 - 0x6F) / 2); \
589 s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F); \
590 } \
591 else \
592 { \
593 s1 = (j1 == 0x28 ? 0xF0 \
594 : j1 == 0x24 ? 0xF1 \
595 : j1 == 0x2C ? 0xF2 \
596 : j1 == 0x2E ? 0xF3 \
597 : 0xF4 + (j1 - 0x6E) / 2); \
598 s2 = j2 + 0x7E; \
599 } \
600 (code) = (s1 << 8) | s2; \
601 } while (0)
df7492f9 602
290591c8
KH
603/* Encode the file name NAME using the specified coding system
604 for file names, if any. */
605#define ENCODE_FILE(name) \
606 (! NILP (Vfile_name_coding_system) \
5e92b1ca 607 && !EQ (Vfile_name_coding_system, make_number (0)) \
afee9150 608 ? code_convert_string_norecord (name, Vfile_name_coding_system, 1) \
290591c8 609 : (! NILP (Vdefault_file_name_coding_system) \
5e92b1ca 610 && !EQ (Vdefault_file_name_coding_system, make_number (0)) \
afee9150 611 ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \
290591c8
KH
612 : name))
613
df7492f9 614
290591c8
KH
615/* Decode the file name NAME using the specified coding system
616 for file names, if any. */
617#define DECODE_FILE(name) \
618 (! NILP (Vfile_name_coding_system) \
5e92b1ca 619 && !EQ (Vfile_name_coding_system, make_number (0)) \
afee9150 620 ? code_convert_string_norecord (name, Vfile_name_coding_system, 0) \
290591c8 621 : (! NILP (Vdefault_file_name_coding_system) \
5e92b1ca 622 && !EQ (Vdefault_file_name_coding_system, make_number (0)) \
afee9150 623 ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \
290591c8
KH
624 : name))
625
df7492f9 626
2dfda962 627/* Encode the string STR using the specified coding system
53eda481 628 for system functions, if any. */
2dfda962 629#define ENCODE_SYSTEM(str) \
9b58c683 630 (! NILP (Vlocale_coding_system) \
5e92b1ca 631 && !EQ (Vlocale_coding_system, make_number (0)) \
9b58c683 632 ? code_convert_string_norecord (str, Vlocale_coding_system, 1) \
2dfda962
JR
633 : str)
634
635/* Decode the string STR using the specified coding system
53eda481 636 for system functions, if any. */
581e7427 637#define DECODE_SYSTEM(str) \
9b58c683 638 (! NILP (Vlocale_coding_system) \
5e92b1ca 639 && !EQ (Vlocale_coding_system, make_number (0)) \
9b58c683 640 ? code_convert_string_norecord (str, Vlocale_coding_system, 0) \
2dfda962 641 : str)
cf29bf99 642
b3a208b0
DL
643/* Used by the gtk menu code. Note that this encodes utf-8, not
644 utf-8-emacs, so it's not a no-op. */
645#define ENCODE_UTF_8(str) code_convert_string_norecord (str, Qutf_8, 1)
646
4ed46869 647/* Extern declarations. */
16869d7e 648extern Lisp_Object code_conversion_save P_ ((int, int));
c04809fb
AS
649extern int decoding_buffer_size P_ ((struct coding_system *, int));
650extern int encoding_buffer_size P_ ((struct coding_system *, int));
df7492f9 651extern void setup_coding_system P_ ((Lisp_Object, struct coding_system *));
76c26397 652extern Lisp_Object coding_charset_list P_ ((struct coding_system *));
cde42f0f 653extern Lisp_Object coding_system_charset_list P_ ((Lisp_Object));
df7492f9 654extern void detect_coding P_ ((struct coding_system *));
511dd8e7 655extern Lisp_Object code_convert_region P_ ((Lisp_Object, Lisp_Object,
df7492f9
KH
656 Lisp_Object, Lisp_Object,
657 int, int));
658extern Lisp_Object code_convert_string P_ ((Lisp_Object, Lisp_Object,
659 Lisp_Object, int, int, int));
eb545596
DL
660extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,
661 int));
df7492f9
KH
662extern Lisp_Object raw_text_coding_system P_ ((Lisp_Object));
663extern Lisp_Object coding_inherit_eol_type P_ ((Lisp_Object, Lisp_Object));
664
665extern int decode_coding_gap P_ ((struct coding_system *,
666 EMACS_INT, EMACS_INT));
667extern int encode_coding_gap P_ ((struct coding_system *,
668 EMACS_INT, EMACS_INT));
669extern void decode_coding_object P_ ((struct coding_system *,
670 Lisp_Object, EMACS_INT, EMACS_INT,
671 EMACS_INT, EMACS_INT, Lisp_Object));
672extern void encode_coding_object P_ ((struct coding_system *,
673 Lisp_Object, EMACS_INT, EMACS_INT,
674 EMACS_INT, EMACS_INT, Lisp_Object));
675
933373ed
KH
676/* Macros for backward compatibility. */
677
df7492f9
KH
678#define decode_coding_region(coding, from, to) \
679 decode_coding_object (coding, Fcurrent_buffer (), \
680 from, CHAR_TO_BYTE (from), \
681 to, CHAR_TO_BYTE (to), Fcurrent_buffer ())
682
683
684#define encode_coding_region(coding, from, to) \
685 encode_coding_object (coding, Fcurrent_buffer (), \
686 from, CHAR_TO_BYTE (from), \
687 to, CHAR_TO_BYTE (to), Fcurrent_buffer ())
688
689
690#define decode_coding_string(coding, string, nocopy) \
691 decode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \
692 STRING_BYTES (XSTRING (string)), Qt)
693
694#define encode_coding_string(coding, string, nocopy) \
695 (encode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \
696 STRING_BYTES (XSTRING (string)), Qt), \
697 (coding)->dst_object)
698
699
700#define decode_coding_c_string(coding, src, bytes, dst_object) \
701 do { \
702 (coding)->source = (src); \
703 (coding)->src_chars = (coding)->src_bytes = (bytes); \
704 decode_coding_object ((coding), Qnil, 0, 0, (bytes), (bytes), \
705 (dst_object)); \
706 } while (0)
707
708
709extern Lisp_Object preferred_coding_system P_ (());
710
711
8f924df7
KH
712extern Lisp_Object Qutf_8, Qutf_8_emacs;
713
4ed46869 714extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
df7492f9
KH
715extern Lisp_Object Qcoding_system_p;
716extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided;
717extern Lisp_Object Qiso_2022;
4ed46869 718extern Lisp_Object Qbuffer_file_coding_system;
df7492f9
KH
719
720extern Lisp_Object Qunix, Qdos, Qmac;
4ed46869 721
f967223b
KH
722extern Lisp_Object Qtranslation_table;
723extern Lisp_Object Qtranslation_table_id;
ab45712c 724
20ee919e
EZ
725/* Mnemonic strings to indicate each type of end-of-line. */
726extern Lisp_Object eol_mnemonic_unix, eol_mnemonic_dos, eol_mnemonic_mac;
727/* Mnemonic string to indicate type of end-of-line is not yet decided. */
728extern Lisp_Object eol_mnemonic_undecided;
4ed46869 729
4ed46869
KH
730#ifdef emacs
731extern Lisp_Object Qfile_coding_system;
387f6ba5 732extern Lisp_Object Qcall_process, Qcall_process_region;
4ed46869 733extern Lisp_Object Qstart_process, Qopen_network_stream;
d008a7cc 734extern Lisp_Object Qwrite_region;
4ed46869 735
68c45bf0
PE
736extern char *emacs_strerror P_ ((int));
737
4ed46869
KH
738/* Coding-system for reading files and receiving data from process. */
739extern Lisp_Object Vcoding_system_for_read;
740/* Coding-system for writing files and sending data to process. */
741extern Lisp_Object Vcoding_system_for_write;
742/* Coding-system actually used in the latest I/O. */
743extern Lisp_Object Vlast_coding_system_used;
68c45bf0
PE
744/* Coding-system to use with system messages (e.g. strerror). */
745extern Lisp_Object Vlocale_coding_system;
4ed46869 746
77a9bc9a
EZ
747/* If non-zero, process buffer inherits the coding system used to decode
748 the subprocess output. */
749extern int inherit_process_coding_system;
750
fbaa2ed9
KH
751/* Coding system to be used to encode text for terminal display when
752 terminal coding system is nil. */
753extern struct coding_system safe_terminal_coding;
754
a5825a24
KH
755/* Default coding systems used for process I/O. */
756extern Lisp_Object Vdefault_process_coding_system;
4ed46869 757
df7492f9 758/* Function to call to force a user to force select a propert coding
658cc252
KH
759 system. */
760extern Lisp_Object Vselect_safe_coding_system_function;
761
6926d591
KH
762/* If nonzero, on writing a file, Vselect_safe_coding_system_function
763 is called even if Vcoding_system_for_write is non-nil. */
764extern int coding_system_require_warning;
765
31406df1
RS
766/* Coding system for file names, or nil if none. */
767extern Lisp_Object Vfile_name_coding_system;
768
769/* Coding system for file names used only when
770 Vfile_name_coding_system is nil. */
771extern Lisp_Object Vdefault_file_name_coding_system;
2dfda962 772
4ed46869
KH
773#endif
774
d008a7cc
GM
775/* Error signaled when there's a problem with detecting coding system */
776extern Lisp_Object Qcoding_system_error;
777
df7492f9
KH
778extern char emacs_mule_bytes[256];
779extern int emacs_mule_string_char P_ ((unsigned char *));
780
6f776e81 781#endif /* EMACS_CODING_H */
cefd8c4f
KH
782
783/* arch-tag: 2bc3b4fa-6870-4f64-8135-b962b2d290e4
784 (do not change this comment) */