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