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