(ccl_driver): If ccl->suppress_error is nonzeor, don't
[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.
4ed46869 4
369314dc
KH
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
4ed46869 11
369314dc
KH
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
4ed46869 16
369314dc
KH
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
4ed46869 21
6f776e81
KH
22#ifndef EMACS_CODING_H
23#define EMACS_CODING_H
4ed46869 24
2ea6666c 25#include "ccl.h"
4ed46869 26
0ef69138 27/*** EMACS' INTERNAL FORMAT (emacs-mule) section ***/
4ed46869
KH
28
29/* All code (1-byte) of Emacs' internal format is classified into one
30 of the followings. See also `charset.h'. */
31enum emacs_code_class_type
32 {
33 EMACS_control_code, /* Control codes in the range
34 0x00..0x1F and 0x7F except for the
35 following two codes. */
36 EMACS_linefeed_code, /* 0x0A (linefeed) to denote
37 end-of-line. */
38 EMACS_carriage_return_code, /* 0x0D (carriage-return) to be used
39 in selective display mode. */
40 EMACS_ascii_code, /* ASCII characters. */
4ed46869
KH
41 EMACS_leading_code_2, /* Base leading code of official
42 TYPE9N character. */
43 EMACS_leading_code_3, /* Base leading code of private TYPE9N
44 or official TYPE9Nx9N character. */
45 EMACS_leading_code_4, /* Base leading code of private
46 TYPE9Nx9N character. */
47 EMACS_invalid_code /* Invalid code, i.e. a base leading
48 code not yet assigned to any
49 charset, or a code of the range
50 0xA0..0xFF. */
51 };
52
53extern enum emacs_code_class_type emacs_code_class[256];
54
55/*** ISO2022 section ***/
56
57/* Macros to define code of control characters for ISO2022's functions. */
58 /* code */ /* function */
59#define ISO_CODE_LF 0x0A /* line-feed */
60#define ISO_CODE_CR 0x0D /* carriage-return */
61#define ISO_CODE_SO 0x0E /* shift-out */
62#define ISO_CODE_SI 0x0F /* shift-in */
63#define ISO_CODE_SS2_7 0x19 /* single-shift-2 for 7-bit code */
64#define ISO_CODE_ESC 0x1B /* escape */
65#define ISO_CODE_SS2 0x8E /* single-shift-2 */
66#define ISO_CODE_SS3 0x8F /* single-shift-3 */
67#define ISO_CODE_CSI 0x9B /* control-sequence-introduce */
68
69/* All code (1-byte) of ISO2022 is classified into one of the
70 followings. */
71enum iso_code_class_type
72 {
811ea086
KH
73 ISO_control_0, /* Control codes in the range
74 0x00..0x1F and 0x7F, except for the
75 following 5 codes. */
4ed46869
KH
76 ISO_carriage_return, /* ISO_CODE_CR (0x0D) */
77 ISO_shift_out, /* ISO_CODE_SO (0x0E) */
78 ISO_shift_in, /* ISO_CODE_SI (0x0F) */
79 ISO_single_shift_2_7, /* ISO_CODE_SS2_7 (0x19) */
80 ISO_escape, /* ISO_CODE_SO (0x1B) */
811ea086
KH
81 ISO_control_1, /* Control codes in the range
82 0x80..0x9F, except for the
83 following 3 codes. */
4ed46869
KH
84 ISO_single_shift_2, /* ISO_CODE_SS2 (0x8E) */
85 ISO_single_shift_3, /* ISO_CODE_SS3 (0x8F) */
86 ISO_control_sequence_introducer, /* ISO_CODE_CSI (0x9B) */
87 ISO_0x20_or_0x7F, /* Codes of the values 0x20 or 0x7F. */
88 ISO_graphic_plane_0, /* Graphic codes in the range 0x21..0x7E. */
89 ISO_0xA0_or_0xFF, /* Codes of the values 0xA0 or 0xFF. */
90 ISO_graphic_plane_1 /* Graphic codes in the range 0xA1..0xFE. */
91 };
92
93/** The macros CODING_FLAG_ISO_XXX defines a flag bit of the `flags'
94 element in the structure `coding_system'. This information is used
95 while encoding a text to ISO2022. **/
96
97/* If set, produce short-form designation sequence (e.g. ESC $ A)
98 instead of long-form sequence (e.g. ESC $ ( A). */
99#define CODING_FLAG_ISO_SHORT_FORM 0x0001
100
101/* If set, reset graphic planes and registers at end-of-line to the
102 initial state. */
103#define CODING_FLAG_ISO_RESET_AT_EOL 0x0002
104
105/* If set, reset graphic planes and registers before any control
106 characters to the initial state. */
107#define CODING_FLAG_ISO_RESET_AT_CNTL 0x0004
108
109/* If set, encode by 7-bit environment. */
110#define CODING_FLAG_ISO_SEVEN_BITS 0x0008
111
112/* If set, use locking-shift function. */
113#define CODING_FLAG_ISO_LOCKING_SHIFT 0x0010
114
115/* If set, use single-shift function. Overwrite
116 CODING_FLAG_ISO_LOCKING_SHIFT. */
117#define CODING_FLAG_ISO_SINGLE_SHIFT 0x0020
118
119/* If set, designate JISX0201-Roman instead of ASCII. */
120#define CODING_FLAG_ISO_USE_ROMAN 0x0040
121
122/* If set, designate JISX0208-1978 instead of JISX0208-1983. */
123#define CODING_FLAG_ISO_USE_OLDJIS 0x0080
124
125/* If set, do not produce ISO6429's direction specifying sequence. */
126#define CODING_FLAG_ISO_NO_DIRECTION 0x0100
127
8ddb35b2
KH
128/* If set, assume designation states are reset at beginning of line on
129 output. */
130#define CODING_FLAG_ISO_INIT_AT_BOL 0x0200
131
132/* If set, designation sequence should be placed at beginning of line
133 on output. */
134#define CODING_FLAG_ISO_DESIGNATE_AT_BOL 0x0400
135
1db9ba06 136/* If set, do not encode unsafe charactes on output. */
fbaa2ed9
KH
137#define CODING_FLAG_ISO_SAFE 0x0800
138
c0c69d45
KH
139/* If set, extra latin codes (128..159) are accepted as a valid code
140 on input. */
141#define CODING_FLAG_ISO_LATIN_EXTRA 0x1000
142
658cc252
KH
143/* If set, use designation escape sequence. */
144#define CODING_FLAG_ISO_DESIGNATION 0x10000
145
fbaa2ed9
KH
146/* A character to be produced on output if encoding of the original
147 character is prohibited by CODING_FLAG_ISO_SAFE. */
c0c69d45 148#define CODING_INHIBIT_CHARACTER_SUBSTITUTION 077 /* 077 == `?' */
fbaa2ed9 149
4ed46869
KH
150/* Structure of the field `spec.iso2022' in the structure `coding_system'. */
151struct iso2022_spec
152{
153 /* The current graphic register invoked to each graphic plane. */
154 int current_invocation[2];
155
156 /* The current charset designated to each graphic register. */
157 int current_designation[4];
158
159 /* A charset initially designated to each graphic register. */
160 int initial_designation[4];
161
658cc252
KH
162 /* If not -1, it is a graphic register specified in an invalid
163 designation sequence. */
164 int last_invalid_designation_register;
165
4ed46869 166 /* A graphic register to which each charset should be designated. */
da30d5b1 167 unsigned char requested_designation[MAX_CHARSET + 1];
4ed46869 168
1db9ba06
KH
169 /* A revision number to be specified for each charset on encoding.
170 The value 255 means no revision number for the corresponding
171 charset. */
172 unsigned char charset_revision_number[MAX_CHARSET + 1];
e6de76f8 173
4ed46869
KH
174 /* Set to 1 temporarily only when graphic register 2 or 3 is invoked
175 by single-shift while encoding. */
176 int single_shifting;
8ddb35b2
KH
177
178 /* Set to 1 temporarily only when processing at beginning of line. */
179 int bol;
4ed46869
KH
180};
181
182/* Macros to access each field in the structure `spec.iso2022'. */
183#define CODING_SPEC_ISO_INVOCATION(coding, plane) \
658cc252 184 (coding)->spec.iso2022.current_invocation[plane]
4ed46869 185#define CODING_SPEC_ISO_DESIGNATION(coding, reg) \
658cc252 186 (coding)->spec.iso2022.current_designation[reg]
4ed46869 187#define CODING_SPEC_ISO_INITIAL_DESIGNATION(coding, reg) \
658cc252 188 (coding)->spec.iso2022.initial_designation[reg]
4ed46869 189#define CODING_SPEC_ISO_REQUESTED_DESIGNATION(coding, charset) \
658cc252 190 (coding)->spec.iso2022.requested_designation[charset]
1db9ba06 191#define CODING_SPEC_ISO_REVISION_NUMBER(coding, charset) \
658cc252 192 (coding)->spec.iso2022.charset_revision_number[charset]
4ed46869 193#define CODING_SPEC_ISO_SINGLE_SHIFTING(coding) \
658cc252 194 (coding)->spec.iso2022.single_shifting
8ddb35b2 195#define CODING_SPEC_ISO_BOL(coding) \
658cc252 196 (coding)->spec.iso2022.bol
4ed46869 197
da30d5b1
KH
198/* A value which may appear in
199 coding->spec.iso2022.requested_designation indicating that the
200 corresponding charset does not request any graphic register to be
201 designated. */
202#define CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION 4
203
4ed46869
KH
204/* Return a charset which is currently designated to the graphic plane
205 PLANE in the coding-system CODING. */
ceb58510
KH
206#define CODING_SPEC_ISO_PLANE_CHARSET(coding, plane) \
207 ((CODING_SPEC_ISO_INVOCATION (coding, plane) < 0) \
208 ? -1 \
209 : CODING_SPEC_ISO_DESIGNATION (coding, \
210 CODING_SPEC_ISO_INVOCATION (coding, plane)))
4ed46869
KH
211
212/*** BIG5 section ***/
213
214/* Macros to denote each type of BIG5 coding system. */
215#define CODING_FLAG_BIG5_HKU 0x00 /* BIG5-HKU is one of variants of
216 BIG5 developed by Hong Kong
217 University. */
218#define CODING_FLAG_BIG5_ETEN 0x01 /* BIG5_ETen is one of variants
219 of BIG5 developed by the
220 company ETen in Taiwan. */
221
222/*** GENERAL section ***/
223
224/* Types of coding system. */
225enum coding_type
226 {
227 coding_type_no_conversion, /* A coding system which requires no
228 conversion for reading and writing
229 including end-of-line format. */
0ef69138 230 coding_type_emacs_mule, /* A coding system used in Emacs'
4ed46869
KH
231 buffer and string. Requires no
232 conversion for reading and writing
233 except for end-of-line format. */
0ef69138 234 coding_type_undecided, /* A coding system which requires
4ed46869
KH
235 automatic detection of a real
236 coding system. */
237 coding_type_sjis, /* SJIS coding system for Japanese. */
238 coding_type_iso2022, /* Any coding system of ISO2022
239 variants. */
240 coding_type_big5, /* BIG5 coding system for Chinese. */
e80de6b1 241 coding_type_ccl, /* The coding system of which decoder
4ed46869 242 and encoder are written in CCL. */
e80de6b1
KH
243 coding_type_raw_text /* A coding system for a text
244 containing ramdom 8-bit code which
245 does not require code conversion
246 except for end-of-line format. */
4ed46869
KH
247 };
248
249/* Formats of end-of-line. */
250#define CODING_EOL_LF 0 /* Line-feed only, same as Emacs'
251 internal format. */
252#define CODING_EOL_CRLF 1 /* Sequence of carriage-return and
253 line-feed. */
254#define CODING_EOL_CR 2 /* Carriage-return only. */
0ef69138 255#define CODING_EOL_UNDECIDED 3 /* This value is used to denote the
4ed46869 256 eol-type is not yet decided. */
e80de6b1
KH
257#define CODING_EOL_INCONSISTENT 4 /* This value is used to denote the
258 eol-type is not consistent
259 through the file. */
4ed46869 260
4ed46869 261/* 1 iff composing. */
279d9f7b
KH
262#define COMPOSING_P(coding) ((int) coding->composing > (int) COMPOSITION_NO)
263
264#define COMPOSITION_DATA_SIZE 4080
265#define COMPOSITION_DATA_MAX_BUNCH_LENGTH (4 + MAX_COMPOSITION_COMPONENTS*2)
266
267/* Data structure to hold information about compositions of text that
268 is being decoded or encode. ISO 2022 base code conversion routines
269 handle special ESC sequences for composition specification. But,
270 they can't get/put such information directly from/to a buffer in
271 the deepest place. So, they store or retrieve the information
272 through this structure.
273
274 The encoder stores the information in this structure when it meets
275 ESC sequences for composition while encoding codes, then, after all
276 text codes are encoded, puts `composition' properties on the text
277 by refering the structure.
278
279 The decoder at first stores the information of a text to be
280 decoded, then, while decoding codes, generates ESC sequences for
281 composition at proper places by refering the structure. */
282
283struct composition_data
284{
285 /* The character position of the first character to be encoded or
286 decoded. START and END (see below) are relative to this
287 position. */
288 int char_offset;
289
290 /* The composition data. These elements are repeated for each
291 composition:
292 LENGTH START END METHOD [ COMPONENT ... ]
293 where,
294 LENGTH is the number of elements for this composition.
295
296 START and END are starting and ending character positions of
297 the composition relative to `char_offset'.
298
299 METHOD is one of `enum cmposing_status' specifying the way of
300 composition.
301
302 COMPONENT is a character or an encoded composition rule. */
303 int data[COMPOSITION_DATA_SIZE];
304
305 /* The number of elements in `data' currently used. */
306 int used;
307
308 /* Pointers to the previous and next structures. When `data' is
309 filled up, another structure is allocated and linked in `next'.
310 The new struture has backward link to this struture in `prev'.
311 The number of chaind structures depends on how many compositions
312 the text being encoded or decoded contains. */
313 struct composition_data *prev, *next;
314};
4ed46869 315
0749a608 316/* Macros used for the member `result' of the struct
658cc252
KH
317 coding_system. */
318#define CODING_FINISH_NORMAL 0
319#define CODING_FINISH_INSUFFICIENT_SRC 1
320#define CODING_FINISH_INSUFFICIENT_DST 2
321#define CODING_FINISH_INCONSISTENT_EOL 3
279d9f7b
KH
322#define CODING_FINISH_INSUFFICIENT_CMP 4
323#define CODING_FINISH_INTERRUPT 5
658cc252 324
3b2d77fe 325/* Macros used for the member `mode' of the struct coding_system. */
658cc252
KH
326
327/* If set, recover the original CR or LF of the already decoded text
328 when the decoding routine encounters an inconsistent eol format. */
329#define CODING_MODE_INHIBIT_INCONSISTENT_EOL 0x01
330
331/* If set, the decoding/encoding routines treat the current data as
332 the last block of the whole text to be converted, and do
333 appropriate fisishing job. */
334#define CODING_MODE_LAST_BLOCK 0x02
335
336/* If set, it means that the current source text is in a buffer which
337 enables selective display. */
338#define CODING_MODE_SELECTIVE_DISPLAY 0x04
339
340/* This flag is used by the decoding/encoding routines on the fly. If
341 set, it means that right-to-left text is being processed. */
342#define CODING_MODE_DIRECTION 0x08
343
4ed46869
KH
344struct coding_system
345{
346 /* Type of the coding system. */
347 enum coding_type type;
348
658cc252
KH
349 /* Type of end-of-line format (LF, CRLF, or CR) of the coding system. */
350 int eol_type;
351
a5ee738b 352 /* Flag bits of the coding system. The meaning of each bit is common
658cc252 353 to all types of coding systems. */
a5ee738b 354 unsigned int common_flags;
4ed46869
KH
355
356 /* Flag bits of the coding system. The meaning of each bit depends
357 on the type of the coding system. */
358 unsigned int flags;
359
658cc252
KH
360 /* Mode bits of the coding system. See the comments of the macros
361 CODING_MODE_XXX. */
362 unsigned int mode;
4ed46869 363
279d9f7b 364 /* The current status of composition handling. */
4ed46869
KH
365 int composing;
366
279d9f7b
KH
367 /* 1 iff the next character is a composition rule. */
368 int composition_rule_follows;
369
370 /* Information of compositions are stored here on decoding and set
371 in advance on encoding. */
372 struct composition_data *cmp_data;
373
374 /* Index to cmp_data->data for the first element for the current
375 composition. */
376 int cmp_data_start;
377
378 /* Index to cmp_data->data for the current element for the current
379 composition. */
380 int cmp_data_index;
450c60a5 381
4ed46869
KH
382 /* Detailed information specific to each type of coding system. */
383 union spec
384 {
385 struct iso2022_spec iso2022;
386 struct ccl_spec ccl; /* Defined in ccl.h. */
387 } spec;
388
658cc252
KH
389 /* Index number of coding category of the coding system. */
390 int category_idx;
391
d23ee514
KH
392 /* The following two members specify how characters 128..159 are
393 represented in source and destination text respectively. 1 means
394 they are represented by 2-byte sequence, 0 means they are
395 represented by 1-byte as is (see the comment in charset.h). */
811ea086
KH
396 unsigned src_multibyte : 1;
397 unsigned dst_multibyte : 1;
398
a137bb00
KH
399 /* How may heading bytes we can skip for decoding. This is set to
400 -1 in setup_coding_system, and updated by detect_coding. So,
401 when this is equal to the byte length of the text being
402 converted, we can skip the actual conversion process. */
658cc252
KH
403 int heading_ascii;
404
405 /* The following members are set by encoding/decoding routine. */
406 int produced, produced_char, consumed, consumed_char;
407
811ea086
KH
408 /* Number of error source data found in a decoding routine. */
409 int errors;
410
411 /* Finish status of code conversion. It should be one of macros
412 CODING_FINISH_XXXX. */
413 int result;
e6a9a0bc 414
658cc252
KH
415 /* The following members are all Lisp symbols. We don't have to
416 protect them from GC because the current garbage collection
417 doesn't relocate Lisp symbols. But, when it is changed, we must
418 find a way to protect them. */
419
4ed46869
KH
420 /* Backward pointer to the Lisp symbol of the coding system. */
421 Lisp_Object symbol;
422
423 /* Lisp function (symbol) to be called after decoding to do
658cc252 424 additional conversion, or nil. */
4ed46869
KH
425 Lisp_Object post_read_conversion;
426
427 /* Lisp function (symbol) to be called before encoding to do
658cc252 428 additional conversion, or nil. */
4ed46869
KH
429 Lisp_Object pre_write_conversion;
430
ab45712c 431 /* Character translation tables to look up, or nil. */
f967223b
KH
432 Lisp_Object translation_table_for_decode;
433 Lisp_Object translation_table_for_encode;
4ed46869
KH
434};
435
a5ee738b
KH
436#define CODING_REQUIRE_FLUSHING_MASK 1
437#define CODING_REQUIRE_DECODING_MASK 2
438#define CODING_REQUIRE_ENCODING_MASK 4
439#define CODING_REQUIRE_DETECTION_MASK 8
440
441/* Return 1 if the coding system CODING requires specific code to be
442 attached at the tail of converted text. */
443#define CODING_REQUIRE_FLUSHING(coding) \
444 ((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK)
445
446/* Return 1 if the coding system CODING requires code conversion on
447 decoding. */
448#define CODING_REQUIRE_DECODING(coding) \
811ea086
KH
449 ((coding)->dst_multibyte \
450 || (coding)->common_flags & CODING_REQUIRE_DECODING_MASK)
a5ee738b
KH
451
452/* Return 1 if the coding system CODING requires code conversion on
453 encoding. */
454#define CODING_REQUIRE_ENCODING(coding) \
811ea086
KH
455 ((coding)->src_multibyte \
456 || (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK)
a5ee738b
KH
457
458/* Return 1 if the coding system CODING requires some kind of code
459 detection. */
460#define CODING_REQUIRE_DETECTION(coding) \
461 ((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK)
462
811ea086
KH
463/* Return 1 if the coding system CODING requires code conversion on
464 decoding or some kind of code detection. */
658cc252 465#define CODING_MAY_REQUIRE_DECODING(coding) \
811ea086
KH
466 (CODING_REQUIRE_DECODING (coding) \
467 || CODING_REQUIRE_DETECTION (coding))
4ed46869
KH
468
469/* Index for each coding category in `coding_category_table' */
0ef69138 470#define CODING_CATEGORY_IDX_EMACS_MULE 0
4ed46869
KH
471#define CODING_CATEGORY_IDX_SJIS 1
472#define CODING_CATEGORY_IDX_ISO_7 2
658cc252
KH
473#define CODING_CATEGORY_IDX_ISO_7_TIGHT 3
474#define CODING_CATEGORY_IDX_ISO_8_1 4
475#define CODING_CATEGORY_IDX_ISO_8_2 5
476#define CODING_CATEGORY_IDX_ISO_7_ELSE 6
477#define CODING_CATEGORY_IDX_ISO_8_ELSE 7
8469bb88
KH
478#define CODING_CATEGORY_IDX_CCL 8
479#define CODING_CATEGORY_IDX_BIG5 9
62537270
KH
480#define CODING_CATEGORY_IDX_UTF_8 10
481#define CODING_CATEGORY_IDX_UTF_16_BE 11
482#define CODING_CATEGORY_IDX_UTF_16_LE 12
483#define CODING_CATEGORY_IDX_RAW_TEXT 13
484#define CODING_CATEGORY_IDX_BINARY 14
485#define CODING_CATEGORY_IDX_MAX 15
4ed46869
KH
486
487/* Definitions of flag bits returned by the function
488 detect_coding_mask (). */
0ef69138 489#define CODING_CATEGORY_MASK_EMACS_MULE (1 << CODING_CATEGORY_IDX_EMACS_MULE)
4ed46869
KH
490#define CODING_CATEGORY_MASK_SJIS (1 << CODING_CATEGORY_IDX_SJIS)
491#define CODING_CATEGORY_MASK_ISO_7 (1 << CODING_CATEGORY_IDX_ISO_7)
658cc252 492#define CODING_CATEGORY_MASK_ISO_7_TIGHT (1 << CODING_CATEGORY_IDX_ISO_7_TIGHT)
4ed46869
KH
493#define CODING_CATEGORY_MASK_ISO_8_1 (1 << CODING_CATEGORY_IDX_ISO_8_1)
494#define CODING_CATEGORY_MASK_ISO_8_2 (1 << CODING_CATEGORY_IDX_ISO_8_2)
a38ede41
KH
495#define CODING_CATEGORY_MASK_ISO_7_ELSE (1 << CODING_CATEGORY_IDX_ISO_7_ELSE)
496#define CODING_CATEGORY_MASK_ISO_8_ELSE (1 << CODING_CATEGORY_IDX_ISO_8_ELSE)
8469bb88 497#define CODING_CATEGORY_MASK_CCL (1 << CODING_CATEGORY_IDX_CCL)
4ed46869 498#define CODING_CATEGORY_MASK_BIG5 (1 << CODING_CATEGORY_IDX_BIG5)
62537270
KH
499#define CODING_CATEGORY_MASK_UTF_8 (1 << CODING_CATEGORY_IDX_UTF_8)
500#define CODING_CATEGORY_MASK_UTF_16_BE (1 << CODING_CATEGORY_IDX_UTF_16_BE)
501#define CODING_CATEGORY_MASK_UTF_16_LE (1 << CODING_CATEGORY_IDX_UTF_16_LE)
f1651811 502#define CODING_CATEGORY_MASK_RAW_TEXT (1 << CODING_CATEGORY_IDX_RAW_TEXT)
1f312d8a 503#define CODING_CATEGORY_MASK_BINARY (1 << CODING_CATEGORY_IDX_BINARY)
4ed46869
KH
504
505/* This value is returned if detect_coding_mask () find nothing other
506 than ASCII characters. */
507#define CODING_CATEGORY_MASK_ANY \
0ef69138 508 ( CODING_CATEGORY_MASK_EMACS_MULE \
4ed46869
KH
509 | CODING_CATEGORY_MASK_SJIS \
510 | CODING_CATEGORY_MASK_ISO_7 \
658cc252 511 | CODING_CATEGORY_MASK_ISO_7_TIGHT \
4ed46869
KH
512 | CODING_CATEGORY_MASK_ISO_8_1 \
513 | CODING_CATEGORY_MASK_ISO_8_2 \
a38ede41
KH
514 | CODING_CATEGORY_MASK_ISO_7_ELSE \
515 | CODING_CATEGORY_MASK_ISO_8_ELSE \
8469bb88 516 | CODING_CATEGORY_MASK_CCL \
62537270
KH
517 | CODING_CATEGORY_MASK_BIG5 \
518 | CODING_CATEGORY_MASK_UTF_8 \
519 | CODING_CATEGORY_MASK_UTF_16_BE \
520 | CODING_CATEGORY_MASK_UTF_16_LE)
4ed46869 521
658cc252
KH
522#define CODING_CATEGORY_MASK_ISO_7BIT \
523 (CODING_CATEGORY_MASK_ISO_7 | CODING_CATEGORY_MASK_ISO_7_TIGHT)
524
525#define CODING_CATEGORY_MASK_ISO_8BIT \
526 (CODING_CATEGORY_MASK_ISO_8_1 | CODING_CATEGORY_MASK_ISO_8_2)
527
528#define CODING_CATEGORY_MASK_ISO_SHIFT \
529 (CODING_CATEGORY_MASK_ISO_7_ELSE | CODING_CATEGORY_MASK_ISO_8_ELSE)
530
531#define CODING_CATEGORY_MASK_ISO \
532 ( CODING_CATEGORY_MASK_ISO_7BIT \
533 | CODING_CATEGORY_MASK_ISO_SHIFT \
534 | CODING_CATEGORY_MASK_ISO_8BIT)
535
62537270
KH
536#define CODING_CATEGORY_MASK_UTF_16_BE_LE \
537 (CODING_CATEGORY_MASK_UTF_16_BE | CODING_CATEGORY_MASK_UTF_16_LE)
538
4ed46869
KH
539/* Macros to decode or encode a character of JISX0208 in SJIS. S1 and
540 S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding
541 system. C1 and C2 are the 1st and 2nd position codes of Emacs'
542 internal format. */
543
544#define DECODE_SJIS(s1, s2, c1, c2) \
545 do { \
546 if (s2 >= 0x9F) \
547 c1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0), \
548 c2 = s2 - 0x7E; \
549 else \
550 c1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1), \
551 c2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F); \
552 } while (0)
553
554#define ENCODE_SJIS(c1, c2, s1, s2) \
555 do { \
556 if (c1 & 1) \
557 s1 = c1 / 2 + ((c1 < 0x5F) ? 0x71 : 0xB1), \
558 s2 = c2 + ((c2 >= 0x60) ? 0x20 : 0x1F); \
559 else \
560 s1 = c1 / 2 + ((c1 < 0x5F) ? 0x70 : 0xB0), \
561 s2 = c2 + 0x7E; \
562 } while (0)
563
290591c8
KH
564/* Encode the file name NAME using the specified coding system
565 for file names, if any. */
566#define ENCODE_FILE(name) \
567 (! NILP (Vfile_name_coding_system) \
568 && XFASTINT (Vfile_name_coding_system) != 0 \
afee9150 569 ? code_convert_string_norecord (name, Vfile_name_coding_system, 1) \
290591c8 570 : (! NILP (Vdefault_file_name_coding_system) \
afee9150
KH
571 && XFASTINT (Vdefault_file_name_coding_system) != 0 \
572 ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \
290591c8
KH
573 : name))
574
575/* Decode the file name NAME using the specified coding system
576 for file names, if any. */
577#define DECODE_FILE(name) \
578 (! NILP (Vfile_name_coding_system) \
579 && XFASTINT (Vfile_name_coding_system) != 0 \
afee9150 580 ? code_convert_string_norecord (name, Vfile_name_coding_system, 0) \
290591c8 581 : (! NILP (Vdefault_file_name_coding_system) \
afee9150
KH
582 && XFASTINT (Vdefault_file_name_coding_system) != 0 \
583 ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \
290591c8
KH
584 : name))
585
2dfda962
JR
586#ifdef WINDOWSNT
587/* Encode the string STR using the specified coding system
588 for w32 system functions, if any. */
589#define ENCODE_SYSTEM(str) \
590 (! NILP (Vw32_system_coding_system) \
591 && XFASTINT (Vw32_system_coding_system) != 0 \
592 ? code_convert_string_norecord (str, Vw32_system_coding_system, 1) \
593 : str)
594
595/* Decode the string STR using the specified coding system
596 for w32 system functions, if any. */
597#define DECODE_SYSTEM(name) \
598 (! NILP (Vw32_system_coding_system) \
599 && XFASTINT (Vw32_system_coding_system) != 0 \
600 ? code_convert_string_norecord (str, Vw32_system_coding_system, 0) \
601 : str)
602#endif
603
4ed46869 604/* Extern declarations. */
c04809fb 605extern int decode_coding P_ ((struct coding_system *, unsigned char *,
658cc252 606 unsigned char *, int, int));
c04809fb 607extern int encode_coding P_ ((struct coding_system *, unsigned char *,
658cc252 608 unsigned char *, int, int));
279d9f7b
KH
609extern void coding_save_composition P_ ((struct coding_system *, int, int,
610 Lisp_Object));
611extern void coding_free_composition_data P_ ((struct coding_system *));
612extern void coding_adjust_composition_offset P_ ((struct coding_system *,
613 int));
55fff3f9
KH
614extern void coding_allocate_composition_data P_ ((struct coding_system *,
615 int));
616extern void coding_restore_composition P_ ((struct coding_system *,
617 Lisp_Object));
ec5d8db7
AS
618extern int code_convert_region P_ ((int, int, int, int, struct coding_system *,
619 int, int));
c04809fb
AS
620extern int decoding_buffer_size P_ ((struct coding_system *, int));
621extern int encoding_buffer_size P_ ((struct coding_system *, int));
622extern void detect_coding P_ ((struct coding_system *, unsigned char *, int));
623extern void detect_eol P_ ((struct coding_system *, unsigned char *, int));
c04809fb 624extern int setup_coding_system P_ ((Lisp_Object, struct coding_system *));
8000e212
KR
625extern Lisp_Object code_convert_string P_ ((Lisp_Object,
626 struct coding_system *, int, int));
6dd24186
KR
627extern Lisp_Object code_convert_string1 P_ ((Lisp_Object, Lisp_Object,
628 Lisp_Object, int));
eb545596
DL
629extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,
630 int));
e5ff4bc2 631extern void setup_raw_text_coding_system P_ ((struct coding_system *));
52e386c2
KR
632extern Lisp_Object encode_coding_string P_ ((Lisp_Object,
633 struct coding_system *, int));
8a6d111e
KR
634extern Lisp_Object decode_coding_string P_ ((Lisp_Object,
635 struct coding_system *, int));
4ed46869 636extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
64abe701 637extern Lisp_Object Qraw_text, Qemacs_mule;
4ed46869
KH
638extern Lisp_Object Qbuffer_file_coding_system;
639extern Lisp_Object Vcoding_category_list;
640
f967223b
KH
641extern Lisp_Object Qtranslation_table;
642extern Lisp_Object Qtranslation_table_id;
ab45712c 643
20ee919e
EZ
644/* Mnemonic strings to indicate each type of end-of-line. */
645extern Lisp_Object eol_mnemonic_unix, eol_mnemonic_dos, eol_mnemonic_mac;
646/* Mnemonic string to indicate type of end-of-line is not yet decided. */
647extern Lisp_Object eol_mnemonic_undecided;
4ed46869 648
4ed46869
KH
649#ifdef emacs
650extern Lisp_Object Qfile_coding_system;
651extern Lisp_Object Qcall_process, Qcall_process_region, Qprocess_argument;
652extern Lisp_Object Qstart_process, Qopen_network_stream;
d008a7cc 653extern Lisp_Object Qwrite_region;
4ed46869 654
68c45bf0
PE
655extern char *emacs_strerror P_ ((int));
656
4ed46869
KH
657/* Coding-system for reading files and receiving data from process. */
658extern Lisp_Object Vcoding_system_for_read;
659/* Coding-system for writing files and sending data to process. */
660extern Lisp_Object Vcoding_system_for_write;
661/* Coding-system actually used in the latest I/O. */
662extern Lisp_Object Vlast_coding_system_used;
68c45bf0
PE
663/* Coding-system to use with system messages (e.g. strerror). */
664extern Lisp_Object Vlocale_coding_system;
4ed46869 665
77a9bc9a
EZ
666/* If non-zero, process buffer inherits the coding system used to decode
667 the subprocess output. */
668extern int inherit_process_coding_system;
669
4ed46869
KH
670/* Coding-system to be used for encoding terminal output. This
671 structure contains information of a coding-system specified by the
672 function `set-terminal-coding-system'. */
673extern struct coding_system terminal_coding;
674
fbaa2ed9
KH
675/* Coding system to be used to encode text for terminal display when
676 terminal coding system is nil. */
677extern struct coding_system safe_terminal_coding;
678
4ed46869
KH
679/* Coding-system of what is sent from terminal keyboard. This
680 structure contains information of a coding-system specified by the
681 function `set-keyboard-coding-system'. */
682extern struct coding_system keyboard_coding;
683
0827f88d
KH
684/* Default coding system to be used to write a file. */
685extern struct coding_system default_buffer_file_coding;
686
a5825a24
KH
687/* Default coding systems used for process I/O. */
688extern Lisp_Object Vdefault_process_coding_system;
4ed46869 689
658cc252
KH
690/* Function to call to force a user to force select a propert coding
691 system. */
692extern Lisp_Object Vselect_safe_coding_system_function;
693
31406df1
RS
694/* Coding system for file names, or nil if none. */
695extern Lisp_Object Vfile_name_coding_system;
696
697/* Coding system for file names used only when
698 Vfile_name_coding_system is nil. */
699extern Lisp_Object Vdefault_file_name_coding_system;
2dfda962
JR
700
701#ifdef WINDOWSNT
702/* Coding system for w32 system strings, or nil if none. */
703extern Lisp_Object Vw32_system_coding_system;
704#endif
4ed46869
KH
705#endif
706
d008a7cc
GM
707/* Error signaled when there's a problem with detecting coding system */
708extern Lisp_Object Qcoding_system_error;
709
6f776e81 710#endif /* EMACS_CODING_H */