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