coding.h 21.9 KB
Newer Older
Karl Heuer's avatar
Karl Heuer committed
1
/* Header for coding system handler.
2 3
   Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN.
   Licensed to the Free Software Foundation.
Kenichi Handa's avatar
Kenichi Handa committed
4 5 6
   Copyright (C) 2001, 2002
     National Institute of Advanced Industrial Science and Technology (AIST)
     Registration Number H13PRO009
Karl Heuer's avatar
Karl Heuer committed
7

Karl Heuer's avatar
Karl Heuer committed
8 9 10 11 12 13
This file is part of GNU Emacs.

GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Karl Heuer's avatar
Karl Heuer committed
14

Karl Heuer's avatar
Karl Heuer committed
15 16 17 18
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
Karl Heuer's avatar
Karl Heuer committed
19

Karl Heuer's avatar
Karl Heuer committed
20 21 22 23
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */
Karl Heuer's avatar
Karl Heuer committed
24

25 26
#ifndef EMACS_CODING_H
#define EMACS_CODING_H
Karl Heuer's avatar
Karl Heuer committed
27

Kenichi Handa's avatar
Kenichi Handa committed
28
/* Index to arguments of Fdefine_coding_system_internal.  */
Karl Heuer's avatar
Karl Heuer committed
29

Kenichi Handa's avatar
Kenichi Handa committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
enum define_coding_system_arg_index
  {
    coding_arg_name,
    coding_arg_mnemonic,
    coding_arg_coding_type,
    coding_arg_charset_list,
    coding_arg_ascii_compatible_p,
    coding_arg_decode_translation_table,
    coding_arg_encode_translation_table,
    coding_arg_post_read_conversion,
    coding_arg_pre_write_conversion,
    coding_arg_default_char,
    coding_arg_plist,
    coding_arg_eol_type,
    coding_arg_max
  };
Karl Heuer's avatar
Karl Heuer committed
46

Kenichi Handa's avatar
Kenichi Handa committed
47
enum define_coding_iso2022_arg_index
Karl Heuer's avatar
Karl Heuer committed
48
  {
Kenichi Handa's avatar
Kenichi Handa committed
49 50 51 52 53
    coding_arg_iso2022_initial = coding_arg_max,
    coding_arg_iso2022_reg_usage,
    coding_arg_iso2022_request,
    coding_arg_iso2022_flags,
    coding_arg_iso2022_max
Karl Heuer's avatar
Karl Heuer committed
54 55
  };

Kenichi Handa's avatar
Kenichi Handa committed
56
enum define_coding_utf16_arg_index
Karl Heuer's avatar
Karl Heuer committed
57
  {
Kenichi Handa's avatar
Kenichi Handa committed
58 59 60
    coding_arg_utf16_bom = coding_arg_max,
    coding_arg_utf16_endian,
    coding_arg_utf16_max
Karl Heuer's avatar
Karl Heuer committed
61 62
  };

Kenichi Handa's avatar
Kenichi Handa committed
63 64 65 66 67 68 69
enum define_coding_ccl_arg_index
  {
    coding_arg_ccl_decoder,
    coding_arg_ccl_encoder,
    coding_arg_ccl_valids,
    coding_arg_ccl_max
  };
Karl Heuer's avatar
Karl Heuer committed
70

Kenichi Handa's avatar
Kenichi Handa committed
71
extern Lisp_Object Vcoding_system_hash_table;
Karl Heuer's avatar
Karl Heuer committed
72

Kenichi Handa's avatar
Kenichi Handa committed
73
/* Enumeration of coding system type.  */
Karl Heuer's avatar
Karl Heuer committed
74

Kenichi Handa's avatar
Kenichi Handa committed
75 76 77 78 79 80 81 82 83 84 85 86 87
enum coding_system_type
  {
    coding_type_charset,
    coding_type_utf_8,
    coding_type_utf_16,
    coding_type_iso_2022,
    coding_type_emacs_mule,
    coding_type_sjis,
    coding_type_ccl,
    coding_type_raw_text,
    coding_type_undecided,
    coding_type_max
  };
Karl Heuer's avatar
Karl Heuer committed
88 89


Kenichi Handa's avatar
Kenichi Handa committed
90
/* Enumeration of end-of-line format type.  */
Karl Heuer's avatar
Karl Heuer committed
91

Kenichi Handa's avatar
Kenichi Handa committed
92 93 94 95 96 97 98 99 100 101 102 103 104
enum end_of_line_type
  {
    eol_lf,		/* Line-feed only, same as Emacs' internal
			   format.  */
    eol_crlf,		/* Sequence of carriage-return and
			   line-feed.  */
    eol_cr,		/* Carriage-return only.  */
    eol_any,		/* Accept any of above.  Produce line-feed
			   only.  */
    eol_undecided,	/* This value is used to denote that the
			   eol-type is not yet undecided.  */
    eol_type_max
  };
Karl Heuer's avatar
Karl Heuer committed
105

Kenichi Handa's avatar
Kenichi Handa committed
106
/* Enumeration of index to an attribute vector of a coding system.  */
Karl Heuer's avatar
Karl Heuer committed
107

Kenichi Handa's avatar
Kenichi Handa committed
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
enum coding_attr_index
  {
    coding_attr_base_name,
    coding_attr_docstring,
    coding_attr_mnemonic,
    coding_attr_type,
    coding_attr_charset_list,
    coding_attr_ascii_compat,
    coding_attr_decode_tbl,
    coding_attr_encode_tbl,
    coding_attr_post_read,
    coding_attr_pre_write,
    coding_attr_default_char,
    coding_attr_plist,

    coding_attr_category,
    coding_attr_safe_charsets,

    /* The followings are extra attributes for each type.  */
    coding_attr_charset_valids,

    coding_attr_ccl_decoder,
    coding_attr_ccl_encoder,
    coding_attr_ccl_valids,

    coding_attr_iso_initial,
    coding_attr_iso_usage,
    coding_attr_iso_request,
    coding_attr_iso_flags,

    coding_attr_utf_16_bom,
    coding_attr_utf_16_endian,

    coding_attr_emacs_mule_full,

    coding_attr_last_index
  };
Karl Heuer's avatar
Karl Heuer committed
145 146


Kenichi Handa's avatar
Kenichi Handa committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#define CODING_ATTR_BASE_NAME(attrs)	AREF (attrs, coding_attr_base_name)
#define CODING_ATTR_TYPE(attrs)		AREF (attrs, coding_attr_type)
#define CODING_ATTR_CHARSET_LIST(attrs)	AREF (attrs, coding_attr_charset_list)
#define CODING_ATTR_MNEMONIC(attrs)	AREF (attrs, coding_attr_mnemonic)
#define CODING_ATTR_DOCSTRING(attrs)	AREF (attrs, coding_attr_docstring)
#define CODING_ATTR_ASCII_COMPAT(attrs)	AREF (attrs, coding_attr_ascii_compat)
#define CODING_ATTR_DECODE_TBL(attrs)	AREF (attrs, coding_attr_decode_tbl)
#define CODING_ATTR_ENCODE_TBL(attrs)	AREF (attrs, coding_attr_encode_tbl)
#define CODING_ATTR_POST_READ(attrs)	AREF (attrs, coding_attr_post_read)
#define CODING_ATTR_PRE_WRITE(attrs)	AREF (attrs, coding_attr_pre_write)
#define CODING_ATTR_DEFAULT_CHAR(attrs)	AREF (attrs, coding_attr_default_char)
#define CODING_ATTR_DIRECTION(attrs)	AREF (attrs, coding_attr_direction)
#define CODING_ATTR_FLUSHING(attrs)	AREF (attrs, coding_attr_flushing)
#define CODING_ATTR_PLIST(attrs)	AREF (attrs, coding_attr_plist)
#define CODING_ATTR_CATEGORY(attrs)	AREF (attrs, coding_attr_category)
#define CODING_ATTR_SAFE_CHARSETS(attrs)AREF (attrs, coding_attr_safe_charsets)
163 164


Kenichi Handa's avatar
Kenichi Handa committed
165 166
#define CODING_ID_ATTRS(id)	\
  (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 0))
167

Kenichi Handa's avatar
Kenichi Handa committed
168 169
#define CODING_ID_ALIASES(id)	\
  (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 1))
170

Kenichi Handa's avatar
Kenichi Handa committed
171 172
#define CODING_ID_EOL_TYPE(id)	\
  (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 2))
173

Kenichi Handa's avatar
Kenichi Handa committed
174 175
#define CODING_ID_NAME(id) \
  (HASH_KEY (XHASH_TABLE (Vcoding_system_hash_table), id))
176

Kenichi Handa's avatar
Kenichi Handa committed
177 178
#define CODING_SYSTEM_SPEC(coding_system_symbol)	\
  (Fgethash (coding_system_symbol, Vcoding_system_hash_table, Qnil))
Karl Heuer's avatar
Karl Heuer committed
179

Kenichi Handa's avatar
Kenichi Handa committed
180 181 182
#define CODING_SYSTEM_ID(coding_system_symbol)			\
  hash_lookup (XHASH_TABLE (Vcoding_system_hash_table),		\
	       coding_system_symbol, NULL)
Karl Heuer's avatar
Karl Heuer committed
183

Kenichi Handa's avatar
Kenichi Handa committed
184 185
#define CODING_SYSTEM_P(coding_system_symbol)	\
  (! NILP (CODING_SYSTEM_SPEC (coding_system_symbol)))
Karl Heuer's avatar
Karl Heuer committed
186

Kenichi Handa's avatar
Kenichi Handa committed
187 188 189 190 191
#define  CHECK_CODING_SYSTEM(x)				\
  do {							\
    if (!CODING_SYSTEM_P (x))				\
      x = wrong_type_argument (Qcoding_system_p, (x));	\
  } while (0)
192

Karl Heuer's avatar
Karl Heuer committed
193

Kenichi Handa's avatar
Kenichi Handa committed
194 195 196 197 198 199
#define CHECK_CODING_SYSTEM_GET_SPEC(x, spec)		\
  do {							\
    spec = CODING_SYSTEM_SPEC (x);			\
    if (NILP (spec))					\
      x = wrong_type_argument (Qcoding_system_p, (x));	\
  } while (0)
200

201

Kenichi Handa's avatar
Kenichi Handa committed
202 203 204 205 206 207 208
#define CHECK_CODING_SYSTEM_GET_ID(x, id)			\
  do								\
    {								\
      id = CODING_SYSTEM_ID (x);				\
      if (id < 0)						\
	x = wrong_type_argument (Qcoding_system_p, (x));	\
    } while (0)
Karl Heuer's avatar
Karl Heuer committed
209 210 211 212


/*** GENERAL section ***/

Kenichi Handa's avatar
Kenichi Handa committed
213 214
/* Enumeration of result code of code conversion.  */
enum coding_result_code
Karl Heuer's avatar
Karl Heuer committed
215
  {
Kenichi Handa's avatar
Kenichi Handa committed
216 217 218 219 220 221 222
    CODING_RESULT_SUCCESS,
    CODING_RESULT_INSUFFICIENT_SRC,
    CODING_RESULT_INSUFFICIENT_DST,
    CODING_RESULT_INCONSISTENT_EOL,
    CODING_RESULT_INSUFFICIENT_CMP,
    CODING_RESULT_INTERRUPT,
    CODING_RESULT_INSUFFICIENT_MEM
Karl Heuer's avatar
Karl Heuer committed
223 224
  };

225

Kenichi Handa's avatar
Kenichi Handa committed
226
/* Macros used for the member `mode' of the struct coding_system.  */
227 228 229 230 231 232

/* If set, recover the original CR or LF of the already decoded text
   when the decoding routine encounters an inconsistent eol format.  */
#define CODING_MODE_INHIBIT_INCONSISTENT_EOL	0x01

/* If set, the decoding/encoding routines treat the current data as
Dave Love's avatar
Dave Love committed
233 234
   the last block of the whole text to be converted, and do the
   appropriate finishing job.  */
235 236 237 238 239 240 241 242 243 244
#define CODING_MODE_LAST_BLOCK			0x02

/* If set, it means that the current source text is in a buffer which
   enables selective display.  */
#define CODING_MODE_SELECTIVE_DISPLAY		0x04

/* This flag is used by the decoding/encoding routines on the fly.  If
   set, it means that right-to-left text is being processed.  */
#define CODING_MODE_DIRECTION			0x08

Kenichi Handa's avatar
Kenichi Handa committed
245 246 247 248 249 250 251
#define CODING_MODE_FIXED_DESTINATION		0x10

#define CODING_MODE_SAFE_ENCODING		0x20

/* Structure of the field `spec.iso_2022' in the structure
   `coding_system'.  */
struct iso_2022_spec
Karl Heuer's avatar
Karl Heuer committed
252
{
Kenichi Handa's avatar
Kenichi Handa committed
253
  /* Bit-wise-or of CODING_ISO_FLAG_XXX.  */
Kenichi Handa's avatar
Kenichi Handa committed
254
  unsigned flags;
Karl Heuer's avatar
Karl Heuer committed
255

Kenichi Handa's avatar
Kenichi Handa committed
256 257
  /* The current graphic register invoked to each graphic plane.  */
  int current_invocation[2];
258

Kenichi Handa's avatar
Kenichi Handa committed
259 260 261 262
  /* The current charset designated to each graphic register.  The
     value -1 means that not charset is designated, -2 means that
     there was an invalid designation previously.  */
  int current_designation[4];
Karl Heuer's avatar
Karl Heuer committed
263

Kenichi Handa's avatar
Kenichi Handa committed
264 265 266
  /* Set to 1 temporarily only when graphic register 2 or 3 is invoked
     by single-shift while encoding.  */
  int single_shifting;
Karl Heuer's avatar
Karl Heuer committed
267

Kenichi Handa's avatar
Kenichi Handa committed
268 269 270
  /* Set to 1 temporarily only when processing at beginning of line.  */
  int bol;
};
Karl Heuer's avatar
Karl Heuer committed
271

Kenichi Handa's avatar
Kenichi Handa committed
272
struct ccl_spec;
Karl Heuer's avatar
Karl Heuer committed
273

Kenichi Handa's avatar
Kenichi Handa committed
274 275 276 277 278 279
enum utf_16_bom_type
  {
    utf_16_detect_bom,
    utf_16_without_bom,
    utf_16_with_bom
  };
280

Kenichi Handa's avatar
Kenichi Handa committed
281 282 283 284 285
enum utf_16_endian_type
  {
    utf_16_big_endian,
    utf_16_little_endian
  };
286

Kenichi Handa's avatar
Kenichi Handa committed
287 288 289 290 291 292
struct utf_16_spec
{
  enum utf_16_bom_type bom;
  enum utf_16_endian_type endian;
  int surrogate;
};
293

294 295 296 297 298 299 300 301 302 303 304 305
struct coding_detection_info
{
  /* Values of these members are bitwise-OR of CATEGORY_MASK_XXXs.  */
  /* Which categories are already checked.  */
  int checked;
  /* Which categories are strongly found.  */
  int found;
  /* Which categories are rejected.  */
  int rejected;
};


Kenichi Handa's avatar
Kenichi Handa committed
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
struct coding_system
{
  /* ID number of the coding system.  This is an index to
     Vcoding_system_hash_table.  This value is set by
     setup_coding_system.  At the early stage of building time, this
     value is -1 in the array coding_categories to indicate that no
     coding-system of that category is yet defined.  */
  int id;

  /* Flag bits of the coding system.  The meaning of each bit is common
     to all types of coding systems.  */
  int common_flags;

  /* Mode bits of the coding system.  See the comments of the macros
     CODING_MODE_XXX.  */
  unsigned int mode;
322

Karl Heuer's avatar
Karl Heuer committed
323
  /* Detailed information specific to each type of coding system.  */
Kenichi Handa's avatar
Kenichi Handa committed
324
  union
Karl Heuer's avatar
Karl Heuer committed
325
    {
Kenichi Handa's avatar
Kenichi Handa committed
326 327 328 329
      struct iso_2022_spec iso_2022;
      struct ccl_spec *ccl;	/* Defined in ccl.h.  */
      struct utf_16_spec utf_16;
      int emacs_mule_full_support;
Karl Heuer's avatar
Karl Heuer committed
330 331
    } spec;

Kenichi Handa's avatar
Kenichi Handa committed
332 333
  int max_charset_id;
  char *safe_charsets;
334

Kenichi Handa's avatar
Kenichi Handa committed
335 336 337 338
  /* The following two members specify how binary 8-bit code 128..255
     are represented in source and destination text respectively.  1
     means they are represented by 2-byte sequence, 0 means they are
     represented by 1-byte as is (see the comment in character.h).  */
339 340 341
  unsigned src_multibyte : 1;
  unsigned dst_multibyte : 1;

342 343 344 345
  /* How may heading bytes we can skip for decoding.  This is set to
     -1 in setup_coding_system, and updated by detect_coding.  So,
     when this is equal to the byte length of the text being
     converted, we can skip the actual conversion process.  */
Kenichi Handa's avatar
Kenichi Handa committed
346
  int head_ascii;
347 348

  /* The following members are set by encoding/decoding routine.  */
Kenichi Handa's avatar
Kenichi Handa committed
349
  EMACS_INT produced, produced_char, consumed, consumed_char;
350

351 352 353
  /* Number of error source data found in a decoding routine.  */
  int errors;

Kenichi Handa's avatar
Kenichi Handa committed
354 355
  /* Store the positions of error source data. */
  EMACS_INT *error_positions;
356

Kenichi Handa's avatar
Kenichi Handa committed
357 358
  /* Finish status of code conversion.  */
  enum coding_result_code result;
359

360 361 362 363 364
  /* The following members are all Lisp symbols.  We don't have to
     protect them from GC because the current garbage collection
     doesn't relocate Lisp symbols.  But, when it is changed, we must
     find a way to protect them.  */

Kenichi Handa's avatar
Kenichi Handa committed
365 366 367
  EMACS_INT src_pos, src_pos_byte, src_chars, src_bytes;
  Lisp_Object src_object;
  unsigned char *source;
Karl Heuer's avatar
Karl Heuer committed
368

Kenichi Handa's avatar
Kenichi Handa committed
369 370 371
  EMACS_INT dst_pos, dst_pos_byte, dst_bytes;
  Lisp_Object dst_object;
  unsigned char *destination;
Karl Heuer's avatar
Karl Heuer committed
372

Kenichi Handa's avatar
Kenichi Handa committed
373
  int chars_at_source;
Karl Heuer's avatar
Karl Heuer committed
374

Kenichi Handa's avatar
Kenichi Handa committed
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
  /* If an element is non-negative, it is a character code.

     If it is in the range -128..-1, it is a 8-bit character code
     minus 256.

     If it is less than -128, it specifies the start of an annotation
     chunk.  The length of the chunk is -128 minus the value of the
     element.  The following elements are OFFSET, ANNOTATION-TYPE, and
     a sequence of actual data for the annotation.  OFFSET is a
     character position offset from dst_pos or src_pos,
     ANNOTATION-TYPE specfies the meaning of the annotation and how to
     handle the following data..  */
  int *charbuf;
  int charbuf_size, charbuf_used;

  /* Set to 1 if charbuf contains an annotation.  */
  int annotated;
Karl Heuer's avatar
Karl Heuer committed
392

Kenichi Handa's avatar
Kenichi Handa committed
393 394
  unsigned char carryover[64];
  int carryover_bytes;
395

Kenichi Handa's avatar
Kenichi Handa committed
396 397
  int default_char;

398 399
  int (*detector) P_ ((struct coding_system *,
		       struct coding_detection_info *));
Kenichi Handa's avatar
Kenichi Handa committed
400 401 402 403 404 405 406 407 408 409
  void (*decoder) P_ ((struct coding_system *));
  int (*encoder) P_ ((struct coding_system *));
};

/* Meanings of bits in the member `common_flags' of the structure
   coding_system.  The lowest 8 bits are reserved for various kind of
   annotations (currently two of them are used).  */
#define CODING_ANNOTATION_MASK			0x00FF
#define CODING_ANNOTATE_COMPOSITION_MASK	0x0001
#define CODING_ANNOTATE_DIRECTION_MASK		0x0002
410
#define CODING_ANNOTATE_CHARSET_MASK		0x0003
Kenichi Handa's avatar
Kenichi Handa committed
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
#define CODING_FOR_UNIBYTE_MASK			0x0100
#define CODING_REQUIRE_FLUSHING_MASK		0x0200
#define CODING_REQUIRE_DECODING_MASK		0x0400
#define CODING_REQUIRE_ENCODING_MASK		0x0800
#define CODING_REQUIRE_DETECTION_MASK		0x1000
#define CODING_RESET_AT_BOL_MASK		0x2000

/* Return 1 if the coding context CODING requires annotaion
   handling.  */
#define CODING_REQUIRE_ANNOTATION(coding) \
  ((coding)->common_flags & CODING_ANNOTATION_MASK)

/* Return 1 if the coding context CODING prefers decoding into unibyte.  */
#define CODING_FOR_UNIBYTE(coding) \
  ((coding)->common_flags & CODING_FOR_UNIBYTE_MASK)

/* Return 1 if the coding context CODING requires specific code to be
428 429 430 431
   attached at the tail of converted text.  */
#define CODING_REQUIRE_FLUSHING(coding) \
  ((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK)

Kenichi Handa's avatar
Kenichi Handa committed
432
/* Return 1 if the coding context CODING requires code conversion on
433 434
   decoding.  */
#define CODING_REQUIRE_DECODING(coding)	\
435 436
  ((coding)->dst_multibyte		\
   || (coding)->common_flags & CODING_REQUIRE_DECODING_MASK)
437

Kenichi Handa's avatar
Kenichi Handa committed
438 439

/* Return 1 if the coding context CODING requires code conversion on
440
   encoding.  */
Kenichi Handa's avatar
Kenichi Handa committed
441 442 443 444 445
#define CODING_REQUIRE_ENCODING(coding)				\
  ((coding)->src_multibyte					\
   || (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK	\
   || (coding)->mode & CODING_MODE_SELECTIVE_DISPLAY)

446

Kenichi Handa's avatar
Kenichi Handa committed
447
/* Return 1 if the coding context CODING requires some kind of code
448 449 450 451
   detection.  */
#define CODING_REQUIRE_DETECTION(coding) \
  ((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK)

Kenichi Handa's avatar
Kenichi Handa committed
452
/* Return 1 if the coding context CODING requires code conversion on
453
   decoding or some kind of code detection.  */
454
#define CODING_MAY_REQUIRE_DECODING(coding)	\
455 456
  (CODING_REQUIRE_DECODING (coding)		\
   || CODING_REQUIRE_DETECTION (coding))
Karl Heuer's avatar
Karl Heuer committed
457 458 459 460 461 462

/* Macros to decode or encode a character of JISX0208 in SJIS.  S1 and
   S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding
   system.  C1 and C2 are the 1st and 2nd position codes of Emacs'
   internal format.  */

Kenichi Handa's avatar
Kenichi Handa committed
463 464 465 466 467 468 469 470 471 472 473 474 475
#define SJIS_TO_JIS(code)				\
  do {							\
    int s1, s2, j1, j2;					\
							\
    s1 = (code) >> 8, s2 = (code) & 0xFF;		\
							\
    if (s2 >= 0x9F)					\
      (j1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0),	\
       j2 = s2 - 0x7E);					\
    else						\
      (j1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1),	\
       j2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F));		\
    (code) = (j1 << 8) | j2;				\
Karl Heuer's avatar
Karl Heuer committed
476 477
  } while (0)

Kenichi Handa's avatar
Kenichi Handa committed
478 479

#define JIS_TO_SJIS(code)				\
Karl Heuer's avatar
Karl Heuer committed
480
  do {							\
Kenichi Handa's avatar
Kenichi Handa committed
481 482 483 484 485 486
    int s1, s2, j1, j2;					\
							\
    j1 = (code) >> 8, j2 = (code) & 0xFF;		\
    if (j1 & 1)						\
      (s1 = j1 / 2 + ((j1 < 0x5F) ? 0x71 : 0xB1),	\
       s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F));		\
Karl Heuer's avatar
Karl Heuer committed
487
    else						\
Kenichi Handa's avatar
Kenichi Handa committed
488 489
      (s1 = j1 / 2 + ((j1 < 0x5F) ? 0x70 : 0xB0),	\
       s2 = j2 + 0x7E);					\
490
    (code) = (s1 << 8) | s2;				\
Karl Heuer's avatar
Karl Heuer committed
491 492
  } while (0)

Kenichi Handa's avatar
Kenichi Handa committed
493

494 495 496 497 498
/* Encode the file name NAME using the specified coding system
   for file names, if any.  */
#define ENCODE_FILE(name)						   \
  (! NILP (Vfile_name_coding_system)					   \
   && XFASTINT (Vfile_name_coding_system) != 0				   \
Karl Heuer's avatar
Karl Heuer committed
499
   ? code_convert_string_norecord (name, Vfile_name_coding_system, 1)	   \
500
   : (! NILP (Vdefault_file_name_coding_system)				   \
Karl Heuer's avatar
Karl Heuer committed
501 502
      && XFASTINT (Vdefault_file_name_coding_system) != 0		   \
      ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \
503 504
      : name))

Kenichi Handa's avatar
Kenichi Handa committed
505

506 507 508 509 510
/* Decode the file name NAME using the specified coding system
   for file names, if any.  */
#define DECODE_FILE(name)						   \
  (! NILP (Vfile_name_coding_system)					   \
   && XFASTINT (Vfile_name_coding_system) != 0				   \
Karl Heuer's avatar
Karl Heuer committed
511
   ? code_convert_string_norecord (name, Vfile_name_coding_system, 0)	   \
512
   : (! NILP (Vdefault_file_name_coding_system)				   \
Karl Heuer's avatar
Karl Heuer committed
513 514
      && XFASTINT (Vdefault_file_name_coding_system) != 0		   \
      ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \
515 516
      : name))

Kenichi Handa's avatar
Kenichi Handa committed
517

518 519 520
#ifdef WINDOWSNT
/* Encode the string STR using the specified coding system
   for w32 system functions, if any.  */
Kenichi Handa's avatar
Kenichi Handa committed
521 522 523 524
#define ENCODE_SYSTEM(str)						\
  (! NILP (Vlocale_coding_system)					\
   && XFASTINT (Vlocale_coding_system) != 0				\
   ? code_convert_string_norecord (str, Vlocale_coding_system, 1)	\
525 526 527 528
   : str)

/* Decode the string STR using the specified coding system
   for w32 system functions, if any.  */
Kenichi Handa's avatar
Kenichi Handa committed
529 530 531 532
#define DECODE_SYSTEM(name)						\
  (! NILP (Vlocale_coding_system)					\
   && XFASTINT (Vlocale_coding_system) != 0				\
   ? code_convert_string_norecord (str, Vlocale_coding_system, 0)	\
533
   : str)
534 535 536 537 538 539 540

#else /* WINDOWSNT */

#define ENCODE_SYSTEM(str) string_make_unibyte(str)
#define DECODE_SYSTEM(name) name

#endif /* !WINDOWSNT */
541

Karl Heuer's avatar
Karl Heuer committed
542
/* Extern declarations.  */
Kenichi Handa's avatar
Kenichi Handa committed
543 544
extern Lisp_Object make_conversion_work_buffer P_ ((int));
extern Lisp_Object code_conversion_restore P_ ((Lisp_Object));
545 546
extern int decoding_buffer_size P_ ((struct coding_system *, int));
extern int encoding_buffer_size P_ ((struct coding_system *, int));
Kenichi Handa's avatar
Kenichi Handa committed
547 548
extern void setup_coding_system P_ ((Lisp_Object, struct coding_system *));
extern void detect_coding P_ ((struct coding_system *));
549
extern Lisp_Object code_convert_region P_ ((Lisp_Object, Lisp_Object,
Kenichi Handa's avatar
Kenichi Handa committed
550 551 552 553
					    Lisp_Object, Lisp_Object,
					    int, int));
extern Lisp_Object code_convert_string P_ ((Lisp_Object, Lisp_Object,
					    Lisp_Object, int, int, int));
554 555
extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,
						     int));
Kenichi Handa's avatar
Kenichi Handa committed
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
extern Lisp_Object raw_text_coding_system P_ ((Lisp_Object));
extern Lisp_Object coding_inherit_eol_type P_ ((Lisp_Object, Lisp_Object));

extern int decode_coding_gap P_ ((struct coding_system *,
				  EMACS_INT, EMACS_INT));
extern int encode_coding_gap P_ ((struct coding_system *,
				  EMACS_INT, EMACS_INT));
extern void decode_coding_object P_ ((struct coding_system *,
				      Lisp_Object, EMACS_INT, EMACS_INT,
				      EMACS_INT, EMACS_INT, Lisp_Object));
extern void encode_coding_object P_ ((struct coding_system *,
				      Lisp_Object, EMACS_INT, EMACS_INT,
				      EMACS_INT, EMACS_INT, Lisp_Object));

#define decode_coding_region(coding, from, to)		\
  decode_coding_object (coding, Fcurrent_buffer (),	\
			from, CHAR_TO_BYTE (from),	\
			to, CHAR_TO_BYTE (to), Fcurrent_buffer ())


#define encode_coding_region(coding, from, to)		\
  encode_coding_object (coding, Fcurrent_buffer (),	\
			from, CHAR_TO_BYTE (from),	\
			to, CHAR_TO_BYTE (to), Fcurrent_buffer ())


#define decode_coding_string(coding, string, nocopy)			\
  decode_coding_object (coding, string, 0, 0, XSTRING (string)->size,	\
			STRING_BYTES (XSTRING (string)), Qt)

#define encode_coding_string(coding, string, nocopy)			\
  (encode_coding_object (coding, string, 0, 0, XSTRING (string)->size,	\
			 STRING_BYTES (XSTRING (string)), Qt),		\
   (coding)->dst_object)


#define decode_coding_c_string(coding, src, bytes, dst_object)		\
  do {									\
    (coding)->source = (src);						\
    (coding)->src_chars = (coding)->src_bytes = (bytes);		\
    decode_coding_object ((coding), Qnil, 0, 0, (bytes), (bytes),	\
			  (dst_object));				\
  } while (0)


extern Lisp_Object preferred_coding_system P_ (());


Karl Heuer's avatar
Karl Heuer committed
604
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
Kenichi Handa's avatar
Kenichi Handa committed
605 606 607
extern Lisp_Object Qcoding_system_p;
extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided;
extern Lisp_Object Qiso_2022;
Karl Heuer's avatar
Karl Heuer committed
608
extern Lisp_Object Qbuffer_file_coding_system;
Kenichi Handa's avatar
Kenichi Handa committed
609 610

extern Lisp_Object Qunix, Qdos, Qmac;
Karl Heuer's avatar
Karl Heuer committed
611

612 613
extern Lisp_Object Qtranslation_table;
extern Lisp_Object Qtranslation_table_id;
614

615 616 617 618
/* Mnemonic strings to indicate each type of end-of-line.  */
extern Lisp_Object eol_mnemonic_unix, eol_mnemonic_dos, eol_mnemonic_mac;
/* Mnemonic string to indicate type of end-of-line is not yet decided.  */
extern Lisp_Object eol_mnemonic_undecided;
Karl Heuer's avatar
Karl Heuer committed
619 620 621 622 623

#ifdef emacs
extern Lisp_Object Qfile_coding_system;
extern Lisp_Object Qcall_process, Qcall_process_region, Qprocess_argument;
extern Lisp_Object Qstart_process, Qopen_network_stream;
624
extern Lisp_Object Qwrite_region;
Karl Heuer's avatar
Karl Heuer committed
625

626 627
extern char *emacs_strerror P_ ((int));

Karl Heuer's avatar
Karl Heuer committed
628 629 630 631 632 633
/* Coding-system for reading files and receiving data from process.  */
extern Lisp_Object Vcoding_system_for_read;
/* Coding-system for writing files and sending data to process.  */
extern Lisp_Object Vcoding_system_for_write;
/* Coding-system actually used in the latest I/O.  */
extern Lisp_Object Vlast_coding_system_used;
634 635
/* Coding-system to use with system messages (e.g. strerror).  */
extern Lisp_Object Vlocale_coding_system;
Karl Heuer's avatar
Karl Heuer committed
636

637 638 639 640
/* If non-zero, process buffer inherits the coding system used to decode
   the subprocess output.  */
extern int inherit_process_coding_system;

Karl Heuer's avatar
Karl Heuer committed
641 642 643 644 645
/* Coding-system to be used for encoding terminal output.  This
   structure contains information of a coding-system specified by the
   function `set-terminal-coding-system'.  */
extern struct coding_system terminal_coding;

646 647 648 649
/* Coding system to be used to encode text for terminal display when
   terminal coding system is nil.  */
extern struct coding_system safe_terminal_coding;

Karl Heuer's avatar
Karl Heuer committed
650 651 652 653 654
/* Coding-system of what is sent from terminal keyboard.  This
   structure contains information of a coding-system specified by the
   function `set-keyboard-coding-system'.  */
extern struct coding_system keyboard_coding;

655 656
/* Default coding systems used for process I/O.  */
extern Lisp_Object Vdefault_process_coding_system;
Karl Heuer's avatar
Karl Heuer committed
657

Kenichi Handa's avatar
Kenichi Handa committed
658
/* Function to call to force a user to force select a propert coding
659 660 661
   system.  */
extern Lisp_Object Vselect_safe_coding_system_function;

662 663 664 665 666 667
/* Coding system for file names, or nil if none.  */
extern Lisp_Object Vfile_name_coding_system;

/* Coding system for file names used only when
   Vfile_name_coding_system is nil.  */
extern Lisp_Object Vdefault_file_name_coding_system;
668

Karl Heuer's avatar
Karl Heuer committed
669 670
#endif

671 672 673
/* Error signaled when there's a problem with detecting coding system */
extern Lisp_Object Qcoding_system_error;

Kenichi Handa's avatar
Kenichi Handa committed
674 675 676
extern char emacs_mule_bytes[256];
extern int emacs_mule_string_char P_ ((unsigned char *));

677
#endif /* EMACS_CODING_H */