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