annotate src/coding.c @ 88477:5f974cbba7b3

(coding_set_source): Delete the local variable beg_byte. (encode_coding_charset): Delete the local variable charset. (Fdefine_coding_system_internal): Likewise. (Fdefine_coding_system_internal): Setup attrs[coding_attr_charset_valids] correctly.
author Kenichi Handa <handa@m17n.org>
date Fri, 10 May 2002 03:55:40 +0000
parents b47ee8b1ce03
children e92f62c0073e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1 /* Coding system handler (conversion, detection, and etc).
20708
ed9ed828415e Update copyright year.
Richard M. Stallman <rms@gnu.org>
parents: 20680
diff changeset
2 Copyright (C) 1995, 1997, 1998 Electrotechnical Laboratory, JAPAN.
18269
888bfd80db2c Change copyright notices.
Richard M. Stallman <rms@gnu.org>
parents: 18180
diff changeset
3 Licensed to the Free Software Foundation.
38518
883da5f3dbac (code_convert_region): Handle the multibyte case if
Gerd Moellmann <gerd@gnu.org>
parents: 38473
diff changeset
4 Copyright (C) 2001 Free Software Foundation, Inc.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5 Copyright (C) 2001, 2002
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6 National Institute of Advanced Industrial Science and Technology (AIST)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7 Registration Number H13PRO009
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8
17071
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
9 This file is part of GNU Emacs.
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
10
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
11 GNU Emacs is free software; you can redistribute it and/or modify
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
12 it under the terms of the GNU General Public License as published by
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
13 the Free Software Foundation; either version 2, or (at your option)
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
14 any later version.
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
15
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
16 GNU Emacs is distributed in the hope that it will be useful,
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
19 GNU General Public License for more details.
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
20
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
21 You should have received a copy of the GNU General Public License
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
22 along with GNU Emacs; see the file COPYING. If not, write to
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
23 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
70194012fb3a Fix FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 17052
diff changeset
24 Boston, MA 02111-1307, USA. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
25
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
26 /*** TABLE OF CONTENTS ***
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
28 0. General comments
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29 1. Preamble
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
30 2. Emacs' internal format (emacs-utf-8) handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
31 3. UTF-8 handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
32 4. UTF-16 handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
33 5. Charset-base coding systems handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
34 6. emacs-mule (old Emacs' internal format) handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
35 7. ISO2022 handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
36 8. Shift-JIS and BIG5 handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
37 9. CCL handlers
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
38 10. C library functions
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
39 11. Emacs Lisp library functions
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
40 12. Postamble
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
41
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
42 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
43
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
44 /*** 0. General comments ***
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
45
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
46
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
47 CODING SYSTEM
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
48
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
49 Coding system is an object for a encoding mechanism that contains
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
50 information about how to convert byte sequence to character
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
51 sequences and vice versa. When we say "decode", it means converting
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
52 a byte sequence of a specific coding system into a character
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
53 sequence that is represented by Emacs' internal coding system
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
54 `emacs-utf-8', and when we say "encode", it means converting a
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
55 character sequence of emacs-utf-8 to a byte sequence of a specific
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
56 coding system.
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
57
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
58 In Emacs Lisp, a coding system is represented by a Lisp symbol. In
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
59 C level, a coding system is represented by a vector of attributes
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
60 stored in the hash table Vcharset_hash_table. The conversion from a
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
61 coding system symbol to attributes vector is done by looking up
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
62 Vcharset_hash_table by the symbol.
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
63
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
64 Coding systems are classified into the following types depending on
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
65 the mechanism of encoding. Here's a brief descrition about type.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
66
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
67 o UTF-8
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
68
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
69 o UTF-16
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
70
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
71 o Charset-base coding system
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
72
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
73 A coding system defined by one or more (coded) character sets.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
74 Decoding and encoding are done by code converter defined for each
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
75 character set.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
76
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
77 o Old Emacs' internal format (emacs-mule)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
78
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
79 The coding system adopted by an old versions of Emacs (20 and 21).
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
80
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
81 o ISO2022-base coding system
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
82
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
83 The most famous coding system for multiple character sets. X's
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
84 Compound Text, various EUCs (Extended Unix Code), and coding systems
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
85 used in the Internet communication such as ISO-2022-JP are all
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
86 variants of ISO2022.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
87
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
88 o SJIS (or Shift-JIS or MS-Kanji-Code)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
89
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
90 A coding system to encode character sets: ASCII, JISX0201, and
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
91 JISX0208. Widely used for PC's in Japan. Details are described in
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
92 section 8.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
93
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
94 o BIG5
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
95
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
96 A coding system to encode character sets: ASCII and Big5. Widely
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
97 used by Chinese (mainly in Taiwan and Hong Kong). Details are
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
98 described in section 8. In this file, when we write "big5" (all
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
99 lowercase), we mean the coding system, and when we write "Big5"
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
100 (capitalized), we mean the character set.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
101
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
102 o CCL
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
103
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
104 If a user wants to decode/encode a text encoded in a coding system
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
105 not listed above, he can supply a decoder and an encoder for it in
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
106 CCL (Code Conversion Language) programs. Emacs executes the CCL
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
107 program while decoding/encoding.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
108
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
109 o Raw-text
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
110
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
111 A coding system for a text containing raw eight-bit data. Emacs
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
112 treat each byte of source text as a character (except for
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
113 end-of-line conversion).
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
114
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
115 o No-conversion
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
116
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
117 Like raw text, but don't do end-of-line conversion.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
118
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
119
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
120 END-OF-LINE FORMAT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
121
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
122 How end-of-line of a text is encoded depends on a system. For
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
123 instance, Unix's format is just one byte of LF (line-feed) code,
18766
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
124 whereas DOS's format is two-byte sequence of `carriage-return' and
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
125 `line-feed' codes. MacOS's format is usually one byte of
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
126 `carriage-return'.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
128 Since text characters encoding and end-of-line encoding are
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
129 independent, any coding system described above can take any format
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
130 of end-of-line (except for no-conversion).
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
132 STRUCT CODING_SYSTEM
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
133
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
134 Before using a coding system for code conversion (i.e. decoding and
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
135 encoding), we setup a structure of type `struct coding_system'.
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
136 This structure keeps various information about a specific code
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
137 conversion (e.g. the location of source and destination data).
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
138
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
139 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
141 /* COMMON MACROS */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
142
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
143
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144 /*** GENERAL NOTES on `detect_coding_XXX ()' functions ***
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
146 These functions check if a byte sequence specified as a source in
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
147 CODING conforms to the format of XXX. Return 1 if the data contains
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
148 a byte sequence which can be decoded into non-ASCII characters by
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
149 the coding system. Otherwize (i.e. the data contains only ASCII
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
150 characters or invalid sequence) return 0.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
151
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
152 It also resets some bits of an integer pointed by MASK. The macros
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
153 CATEGORY_MASK_XXX specifies each bit of this integer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
154
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
155 Below is the template of these functions. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
156
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
157 #if 0
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
158 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
159 detect_coding_XXX (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
160 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
161 int *mask;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
163 unsigned char *src = coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
164 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
165 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
166 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
167 int found = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
168 ...;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
169
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
170 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
171 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
172 /* Get one byte from the source. If the souce is exausted, jump
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
173 to no_more_source:. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
174 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
175 /* Check if it conforms to XXX. If not, break the loop. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
176 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
177 /* As the data is invalid for XXX, reset a proper bits. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
178 *mask &= ~CODING_CATEGORY_XXX;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
179 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
180 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
181 /* The source exausted. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
182 if (!found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
183 /* ASCII characters only. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
184 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
185 /* Some data should be decoded into non-ASCII characters. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
186 *mask &= CODING_CATEGORY_XXX;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
187 return 1;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189 #endif
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 /*** GENERAL NOTES on `decode_coding_XXX ()' functions ***
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
193 These functions decode a byte sequence specified as a source by
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
194 CODING. The resulting multibyte text goes to a place pointed to by
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
195 CODING->charbuf, the length of which should not exceed
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
196 CODING->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
197
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
198 These functions set the information of original and decoded texts in
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
199 CODING->consumed, CODING->consumed_char, and CODING->charbuf_used.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
200 They also set CODING->result to one of CODING_RESULT_XXX indicating
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
201 how the decoding is finished.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
202
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
203 Below is the template of these functions. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
204
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
205 #if 0
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
206 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
207 decode_coding_XXXX (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
208 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
209 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
210 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
211 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
212 /* SRC_BASE remembers the start position in source in each loop.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
213 The loop will be exited when there's not enough source code, or
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
214 when there's no room in CHARBUF for a decoded character. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
215 unsigned char *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
216 /* A buffer to produce decoded characters. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
217 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
218 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
219 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
220
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
221 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
222 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
223 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
224 if (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
225 /* No more room to produce a decoded character. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
226 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
227 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
228 /* Decode it. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
229 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
230
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
231 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
232 if (src_base < src_end
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
233 && coding->mode & CODING_MODE_LAST_BLOCK)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
234 /* If the source ends by partial bytes to construct a character,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
235 treat them as eight-bit raw data. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
236 while (src_base < src_end && charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
237 *charbuf++ = *src_base++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
238 /* Remember how many bytes and characters we consumed. If the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
239 source is multibyte, the bytes and chars are not identical. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
240 coding->consumed = coding->consumed_char = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
241 /* Remember how many characters we produced. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
242 coding->charbuf_used = charbuf - coding->charbuf;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
243 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
244 #endif
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
245
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
246 /*** GENERAL NOTES on `encode_coding_XXX ()' functions ***
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
247
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
248 These functions encode SRC_BYTES length text at SOURCE of Emacs'
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
249 internal multibyte format by CODING. The resulting byte sequence
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
250 goes to a place pointed to by DESTINATION, the length of which
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
251 should not exceed DST_BYTES.
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
252
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
253 These functions set the information of original and encoded texts in
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
254 the members produced, produced_char, consumed, and consumed_char of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
255 the structure *CODING. They also set the member result to one of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
256 CODING_RESULT_XXX indicating how the encoding finished.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
257
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
258 DST_BYTES zero means that source area and destination area are
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
259 overlapped, which means that we can produce a encoded text until it
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
260 reaches at the head of not-yet-encoded source text.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
261
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
262 Below is a template of these functions. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
263 #if 0
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
264 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
265 encode_coding_XXX (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
266 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
267 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
268 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
269 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
270 int *charbuf_end = charbuf->charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
271 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
272 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
273 unsigned char *adjusted_dst_end = dst_end - _MAX_BYTES_PRODUCED_IN_LOOP_;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
274 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
275
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
276 for (; charbuf < charbuf_end && dst < adjusted_dst_end; charbuf++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
277 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
278 int c = *charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
279 /* Encode C into DST, and increment DST. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
280 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
281 label_no_more_destination:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
282 /* How many chars and bytes we produced. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
283 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
284 coding->produced = dst - coding->destination;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
285 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
286 #endif
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
287
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
288
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
289 /*** 1. Preamble ***/
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
290
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
291 #include <config.h>
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
292 #include <stdio.h>
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
293
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
294 #include "lisp.h"
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
295 #include "buffer.h"
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
296 #include "character.h"
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
297 #include "charset.h"
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
298 #include "ccl.h"
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
299 #include "composite.h"
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
300 #include "coding.h"
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
301 #include "window.h"
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
302
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
303 Lisp_Object Vcoding_system_hash_table;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
304
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
305 Lisp_Object Qcoding_system, Qcoding_aliases, Qeol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
306 Lisp_Object Qunix, Qdos, Qmac;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
307 Lisp_Object Qbuffer_file_coding_system;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
308 Lisp_Object Qpost_read_conversion, Qpre_write_conversion;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
309 Lisp_Object Qdefault_char;
19612
783efd6c7c1e (Qno_conversion, Qundecided): New variables.
Kenichi Handa <handa@m17n.org>
parents: 19546
diff changeset
310 Lisp_Object Qno_conversion, Qundecided;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
311 Lisp_Object Qcharset, Qiso_2022, Qutf_8, Qutf_16, Qshift_jis, Qbig5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
312 Lisp_Object Qutf_16_be_nosig, Qutf_16_be, Qutf_16_le_nosig, Qutf_16_le;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
313 Lisp_Object Qsignature, Qendian, Qbig, Qlittle;
19750
95e4e1cba6ac (Qcoding_system_history): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 19747
diff changeset
314 Lisp_Object Qcoding_system_history;
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
315 Lisp_Object Qvalid_codes;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
316
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
317 extern Lisp_Object Qinsert_file_contents, Qwrite_region;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
318 Lisp_Object Qcall_process, Qcall_process_region, Qprocess_argument;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
319 Lisp_Object Qstart_process, Qopen_network_stream;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
320 Lisp_Object Qtarget_idx;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
321
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
322 Lisp_Object Vselect_safe_coding_system_function;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
323
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
324 /* Mnemonic string for each format of end-of-line. */
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
325 Lisp_Object eol_mnemonic_unix, eol_mnemonic_dos, eol_mnemonic_mac;
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
326 /* Mnemonic string to indicate format of end-of-line is not yet
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
327 decided. */
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
328 Lisp_Object eol_mnemonic_undecided;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
329
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
330 #ifdef emacs
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
331
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
332 Lisp_Object Vcoding_system_list, Vcoding_system_alist;
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
333
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
334 Lisp_Object Qcoding_system_p, Qcoding_system_error;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
335
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
336 /* Coding system emacs-mule and raw-text are for converting only
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
337 end-of-line format. */
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
338 Lisp_Object Qemacs_mule, Qraw_text;
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
339
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
340 /* Coding-systems are handed between Emacs Lisp programs and C internal
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
341 routines by the following three variables. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
342 /* Coding-system for reading files and receiving data from process. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
343 Lisp_Object Vcoding_system_for_read;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
344 /* Coding-system for writing files and sending data to process. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
345 Lisp_Object Vcoding_system_for_write;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
346 /* Coding-system actually used in the latest I/O. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
347 Lisp_Object Vlast_coding_system_used;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
348
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
349 /* A vector of length 256 which contains information about special
22529
d9eac134a41b Doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 22502
diff changeset
350 Latin codes (especially for dealing with Microsoft codes). */
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
351 Lisp_Object Vlatin_extra_code_table;
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
352
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
353 /* Flag to inhibit code conversion of end-of-line format. */
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
354 int inhibit_eol_conversion;
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
355
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
356 /* Flag to inhibit ISO2022 escape sequence detection. */
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
357 int inhibit_iso_escape_detection;
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
358
21574
30394e3ae7f8 (syms_of_coding): Declare and define inherit-process-coding-system.
Eli Zaretskii <eliz@gnu.org>
parents: 21520
diff changeset
359 /* Flag to make buffer-file-coding-system inherit from process-coding. */
30394e3ae7f8 (syms_of_coding): Declare and define inherit-process-coding-system.
Eli Zaretskii <eliz@gnu.org>
parents: 21520
diff changeset
360 int inherit_process_coding_system;
30394e3ae7f8 (syms_of_coding): Declare and define inherit-process-coding-system.
Eli Zaretskii <eliz@gnu.org>
parents: 21520
diff changeset
361
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
362 /* Coding system to be used to encode text for terminal display. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
363 struct coding_system terminal_coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
364
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
365 /* Coding system to be used to encode text for terminal display when
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
366 terminal coding system is nil. */
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
367 struct coding_system safe_terminal_coding;
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
368
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
369 /* Coding system of what is sent from terminal keyboard. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
370 struct coding_system keyboard_coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
371
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
372 Lisp_Object Vfile_coding_system_alist;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
373 Lisp_Object Vprocess_coding_system_alist;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
374 Lisp_Object Vnetwork_coding_system_alist;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
375
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
376 Lisp_Object Vlocale_coding_system;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
377
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
378 #endif /* emacs */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
379
22186
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
380 /* Flag to tell if we look up translation table on character code
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
381 conversion. */
22119
592bb8b9bcfd Change terms unify/unification to
Kenichi Handa <handa@m17n.org>
parents: 22020
diff changeset
382 Lisp_Object Venable_character_translation;
22186
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
383 /* Standard translation table to look up on decoding (reading). */
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
384 Lisp_Object Vstandard_translation_table_for_decode;
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
385 /* Standard translation table to look up on encoding (writing). */
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
386 Lisp_Object Vstandard_translation_table_for_encode;
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
387
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
388 Lisp_Object Qtranslation_table;
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
389 Lisp_Object Qtranslation_table_id;
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
390 Lisp_Object Qtranslation_table_for_decode;
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
391 Lisp_Object Qtranslation_table_for_encode;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
392
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
393 /* Alist of charsets vs revision number. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
394 static Lisp_Object Vcharset_revision_table;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
395
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
396 /* Default coding systems used for process I/O. */
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
397 Lisp_Object Vdefault_process_coding_system;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
398
26067
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
399 /* Global flag to tell that we can't call post-read-conversion and
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
400 pre-write-conversion functions. Usually the value is zero, but it
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
401 is set to 1 temporarily while such functions are running. This is
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
402 to avoid infinite recursive call. */
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
403 static int inhibit_pre_post_conversion;
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
404
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
405 /* Char-table containing safe coding systems of each character. */
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
406 Lisp_Object Vchar_coding_system_table;
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
407 Lisp_Object Qchar_coding_system;
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
408
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
409 /* Two special coding systems. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
410 Lisp_Object Vsjis_coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
411 Lisp_Object Vbig5_coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
412
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
413
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
414 static int detect_coding_utf_8 P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
415 static void decode_coding_utf_8 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
416 static int encode_coding_utf_8 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
417
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
418 static int detect_coding_utf_16 P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
419 static void decode_coding_utf_16 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
420 static int encode_coding_utf_16 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
421
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
422 static int detect_coding_iso_2022 P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
423 static void decode_coding_iso_2022 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
424 static int encode_coding_iso_2022 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
425
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
426 static int detect_coding_emacs_mule P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
427 static void decode_coding_emacs_mule P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
428 static int encode_coding_emacs_mule P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
429
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
430 static int detect_coding_sjis P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
431 static void decode_coding_sjis P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
432 static int encode_coding_sjis P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
433
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
434 static int detect_coding_big5 P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
435 static void decode_coding_big5 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
436 static int encode_coding_big5 P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
437
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
438 static int detect_coding_ccl P_ ((struct coding_system *, int *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
439 static void decode_coding_ccl P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
440 static int encode_coding_ccl P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
441
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
442 static void decode_coding_raw_text P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
443 static int encode_coding_raw_text P_ ((struct coding_system *));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
444
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
445
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
446 /* ISO2022 section */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
447
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
448 #define CODING_ISO_INITIAL(coding, reg) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
449 (XINT (AREF (AREF (CODING_ID_ATTRS ((coding)->id), \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
450 coding_attr_iso_initial), \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
451 reg)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
452
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
453
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
454 #define CODING_ISO_REQUEST(coding, charset_id) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
455 ((charset_id <= (coding)->max_charset_id \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
456 ? (coding)->safe_charsets[charset_id] \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
457 : -1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
458
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
459
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
460 #define CODING_ISO_FLAGS(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
461 ((coding)->spec.iso_2022.flags)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
462 #define CODING_ISO_DESIGNATION(coding, reg) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
463 ((coding)->spec.iso_2022.current_designation[reg])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
464 #define CODING_ISO_INVOCATION(coding, plane) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
465 ((coding)->spec.iso_2022.current_invocation[plane])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
466 #define CODING_ISO_SINGLE_SHIFTING(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
467 ((coding)->spec.iso_2022.single_shifting)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
468 #define CODING_ISO_BOL(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
469 ((coding)->spec.iso_2022.bol)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
470 #define CODING_ISO_INVOKED_CHARSET(coding, plane) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
471 CODING_ISO_DESIGNATION ((coding), CODING_ISO_INVOCATION ((coding), (plane)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
472
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
473 /* Control characters of ISO2022. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
474 /* code */ /* function */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
475 #define ISO_CODE_LF 0x0A /* line-feed */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
476 #define ISO_CODE_CR 0x0D /* carriage-return */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
477 #define ISO_CODE_SO 0x0E /* shift-out */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
478 #define ISO_CODE_SI 0x0F /* shift-in */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
479 #define ISO_CODE_SS2_7 0x19 /* single-shift-2 for 7-bit code */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
480 #define ISO_CODE_ESC 0x1B /* escape */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
481 #define ISO_CODE_SS2 0x8E /* single-shift-2 */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
482 #define ISO_CODE_SS3 0x8F /* single-shift-3 */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
483 #define ISO_CODE_CSI 0x9B /* control-sequence-introducer */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
484
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
485 /* All code (1-byte) of ISO2022 is classified into one of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
486 followings. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
487 enum iso_code_class_type
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
488 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
489 ISO_control_0, /* Control codes in the range
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
490 0x00..0x1F and 0x7F, except for the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
491 following 5 codes. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
492 ISO_carriage_return, /* ISO_CODE_CR (0x0D) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
493 ISO_shift_out, /* ISO_CODE_SO (0x0E) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
494 ISO_shift_in, /* ISO_CODE_SI (0x0F) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
495 ISO_single_shift_2_7, /* ISO_CODE_SS2_7 (0x19) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
496 ISO_escape, /* ISO_CODE_SO (0x1B) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
497 ISO_control_1, /* Control codes in the range
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
498 0x80..0x9F, except for the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
499 following 3 codes. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
500 ISO_single_shift_2, /* ISO_CODE_SS2 (0x8E) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
501 ISO_single_shift_3, /* ISO_CODE_SS3 (0x8F) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
502 ISO_control_sequence_introducer, /* ISO_CODE_CSI (0x9B) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
503 ISO_0x20_or_0x7F, /* Codes of the values 0x20 or 0x7F. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
504 ISO_graphic_plane_0, /* Graphic codes in the range 0x21..0x7E. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
505 ISO_0xA0_or_0xFF, /* Codes of the values 0xA0 or 0xFF. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
506 ISO_graphic_plane_1 /* Graphic codes in the range 0xA1..0xFE. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
507 };
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
508
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
509 /** The macros CODING_ISO_FLAG_XXX defines a flag bit of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
510 `iso-flags' attribute of an iso2022 coding system. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
511
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
512 /* If set, produce long-form designation sequence (e.g. ESC $ ( A)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
513 instead of the correct short-form sequence (e.g. ESC $ A). */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
514 #define CODING_ISO_FLAG_LONG_FORM 0x0001
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
515
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
516 /* If set, reset graphic planes and registers at end-of-line to the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
517 initial state. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
518 #define CODING_ISO_FLAG_RESET_AT_EOL 0x0002
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
519
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
520 /* If set, reset graphic planes and registers before any control
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
521 characters to the initial state. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
522 #define CODING_ISO_FLAG_RESET_AT_CNTL 0x0004
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
523
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
524 /* If set, encode by 7-bit environment. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
525 #define CODING_ISO_FLAG_SEVEN_BITS 0x0008
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
526
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
527 /* If set, use locking-shift function. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
528 #define CODING_ISO_FLAG_LOCKING_SHIFT 0x0010
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
529
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
530 /* If set, use single-shift function. Overwrite
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
531 CODING_ISO_FLAG_LOCKING_SHIFT. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
532 #define CODING_ISO_FLAG_SINGLE_SHIFT 0x0020
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
533
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
534 /* If set, use designation escape sequence. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
535 #define CODING_ISO_FLAG_DESIGNATION 0x0040
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
536
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
537 /* If set, produce revision number sequence. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
538 #define CODING_ISO_FLAG_REVISION 0x0080
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
539
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
540 /* If set, produce ISO6429's direction specifying sequence. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
541 #define CODING_ISO_FLAG_DIRECTION 0x0100
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
542
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
543 /* If set, assume designation states are reset at beginning of line on
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
544 output. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
545 #define CODING_ISO_FLAG_INIT_AT_BOL 0x0200
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
546
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
547 /* If set, designation sequence should be placed at beginning of line
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
548 on output. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
549 #define CODING_ISO_FLAG_DESIGNATE_AT_BOL 0x0400
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
550
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
551 /* If set, do not encode unsafe charactes on output. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
552 #define CODING_ISO_FLAG_SAFE 0x0800
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
553
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
554 /* If set, extra latin codes (128..159) are accepted as a valid code
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
555 on input. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
556 #define CODING_ISO_FLAG_LATIN_EXTRA 0x1000
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
557
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
558 #define CODING_ISO_FLAG_COMPOSITION 0x2000
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
559
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
560 #define CODING_ISO_FLAG_EUC_TW_SHIFT 0x4000
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
561
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
562 #define CODING_ISO_FLAG_FULL_SUPPORT 0x8000
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
563
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
564 /* A character to be produced on output if encoding of the original
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
565 character is prohibited by CODING_ISO_FLAG_SAFE. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
566 #define CODING_INHIBIT_CHARACTER_SUBSTITUTION '?'
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
567
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
568
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
569 /* UTF-16 section */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
570 #define CODING_UTF_16_BOM(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
571 ((coding)->spec.utf_16.bom)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
572
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
573 #define CODING_UTF_16_ENDIAN(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
574 ((coding)->spec.utf_16.endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
575
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
576 #define CODING_UTF_16_SURROGATE(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
577 ((coding)->spec.utf_16.surrogate)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
578
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
579
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
580 /* CCL section */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
581 #define CODING_CCL_DECODER(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
582 AREF (CODING_ID_ATTRS ((coding)->id), coding_attr_ccl_decoder)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
583 #define CODING_CCL_ENCODER(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
584 AREF (CODING_ID_ATTRS ((coding)->id), coding_attr_ccl_encoder)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
585 #define CODING_CCL_VALIDS(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
586 (XSTRING (AREF (CODING_ID_ATTRS ((coding)->id), coding_attr_ccl_valids)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
587 ->data)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
588
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
589 /* Index for each coding category in `coding_category_table' */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
590
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
591 enum coding_category
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
592 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
593 coding_category_iso_7,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
594 coding_category_iso_7_tight,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
595 coding_category_iso_8_1,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
596 coding_category_iso_8_2,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
597 coding_category_iso_7_else,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
598 coding_category_iso_8_else,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
599 coding_category_utf_8,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
600 coding_category_utf_16_auto,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
601 coding_category_utf_16_be,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
602 coding_category_utf_16_le,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
603 coding_category_utf_16_be_nosig,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
604 coding_category_utf_16_le_nosig,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
605 coding_category_charset,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
606 coding_category_sjis,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
607 coding_category_big5,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
608 coding_category_ccl,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
609 coding_category_emacs_mule,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
610 /* All above are targets of code detection. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
611 coding_category_raw_text,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
612 coding_category_undecided,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
613 coding_category_max
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
614 };
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
615
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
616 /* Definitions of flag bits used in detect_coding_XXXX. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
617 #define CATEGORY_MASK_ISO_7 (1 << coding_category_iso_7)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
618 #define CATEGORY_MASK_ISO_7_TIGHT (1 << coding_category_iso_7_tight)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
619 #define CATEGORY_MASK_ISO_8_1 (1 << coding_category_iso_8_1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
620 #define CATEGORY_MASK_ISO_8_2 (1 << coding_category_iso_8_2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
621 #define CATEGORY_MASK_ISO_7_ELSE (1 << coding_category_iso_7_else)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
622 #define CATEGORY_MASK_ISO_8_ELSE (1 << coding_category_iso_8_else)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
623 #define CATEGORY_MASK_UTF_8 (1 << coding_category_utf_8)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
624 #define CATEGORY_MASK_UTF_16_BE (1 << coding_category_utf_16_be)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
625 #define CATEGORY_MASK_UTF_16_LE (1 << coding_category_utf_16_le)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
626 #define CATEGORY_MASK_UTF_16_BE_NOSIG (1 << coding_category_utf_16_be_nosig)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
627 #define CATEGORY_MASK_UTF_16_LE_NOSIG (1 << coding_category_utf_16_le_nosig)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
628 #define CATEGORY_MASK_CHARSET (1 << coding_category_charset)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
629 #define CATEGORY_MASK_SJIS (1 << coding_category_sjis)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
630 #define CATEGORY_MASK_BIG5 (1 << coding_category_big5)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
631 #define CATEGORY_MASK_CCL (1 << coding_category_ccl)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
632 #define CATEGORY_MASK_EMACS_MULE (1 << coding_category_emacs_mule)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
633
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
634 /* This value is returned if detect_coding_mask () find nothing other
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
635 than ASCII characters. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
636 #define CATEGORY_MASK_ANY \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
637 (CATEGORY_MASK_ISO_7 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
638 | CATEGORY_MASK_ISO_7_TIGHT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
639 | CATEGORY_MASK_ISO_8_1 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
640 | CATEGORY_MASK_ISO_8_2 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
641 | CATEGORY_MASK_ISO_7_ELSE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
642 | CATEGORY_MASK_ISO_8_ELSE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
643 | CATEGORY_MASK_UTF_8 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
644 | CATEGORY_MASK_UTF_16_BE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
645 | CATEGORY_MASK_UTF_16_LE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
646 | CATEGORY_MASK_UTF_16_BE_NOSIG \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
647 | CATEGORY_MASK_UTF_16_LE_NOSIG \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
648 | CATEGORY_MASK_CHARSET \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
649 | CATEGORY_MASK_SJIS \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
650 | CATEGORY_MASK_BIG5 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
651 | CATEGORY_MASK_CCL \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
652 | CATEGORY_MASK_EMACS_MULE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
653
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
654
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
655 #define CATEGORY_MASK_ISO_7BIT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
656 (CATEGORY_MASK_ISO_7 | CATEGORY_MASK_ISO_7_TIGHT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
657
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
658 #define CATEGORY_MASK_ISO_8BIT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
659 (CATEGORY_MASK_ISO_8_1 | CATEGORY_MASK_ISO_8_2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
660
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
661 #define CATEGORY_MASK_ISO_ELSE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
662 (CATEGORY_MASK_ISO_7_ELSE | CATEGORY_MASK_ISO_8_ELSE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
663
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
664 #define CATEGORY_MASK_ISO_ESCAPE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
665 (CATEGORY_MASK_ISO_7 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
666 | CATEGORY_MASK_ISO_7_TIGHT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
667 | CATEGORY_MASK_ISO_7_ELSE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
668 | CATEGORY_MASK_ISO_8_ELSE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
669
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
670 #define CATEGORY_MASK_ISO \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
671 ( CATEGORY_MASK_ISO_7BIT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
672 | CATEGORY_MASK_ISO_8BIT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
673 | CATEGORY_MASK_ISO_ELSE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
674
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
675 #define CATEGORY_MASK_UTF_16 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
676 (CATEGORY_MASK_UTF_16_BE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
677 | CATEGORY_MASK_UTF_16_LE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
678 | CATEGORY_MASK_UTF_16_BE_NOSIG \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
679 | CATEGORY_MASK_UTF_16_LE_NOSIG)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
680
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
681
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
682 /* List of symbols `coding-category-xxx' ordered by priority. This
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
683 variable is exposed to Emacs Lisp. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
684 static Lisp_Object Vcoding_category_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
685
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
686 /* Table of coding categories (Lisp symbols). This variable is for
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
687 internal use oly. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
688 static Lisp_Object Vcoding_category_table;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
689
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
690 /* Table of coding-categories ordered by priority. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
691 static enum coding_category coding_priorities[coding_category_max];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
692
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
693 /* Nth element is a coding context for the coding system bound to the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
694 Nth coding category. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
695 static struct coding_system coding_categories[coding_category_max];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
696
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
697 static int detected_mask[coding_category_raw_text] =
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
698 { CATEGORY_MASK_ISO,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
699 CATEGORY_MASK_ISO,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
700 CATEGORY_MASK_ISO,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
701 CATEGORY_MASK_ISO,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
702 CATEGORY_MASK_ISO,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
703 CATEGORY_MASK_ISO,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
704 CATEGORY_MASK_UTF_8,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
705 CATEGORY_MASK_UTF_16,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
706 CATEGORY_MASK_UTF_16,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
707 CATEGORY_MASK_UTF_16,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
708 CATEGORY_MASK_UTF_16,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
709 CATEGORY_MASK_UTF_16,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
710 CATEGORY_MASK_CHARSET,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
711 CATEGORY_MASK_SJIS,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
712 CATEGORY_MASK_BIG5,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
713 CATEGORY_MASK_CCL,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
714 CATEGORY_MASK_EMACS_MULE
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
715 };
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
716
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
717 /*** Commonly used macros and functions ***/
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
718
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
719 #ifndef min
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
720 #define min(a, b) ((a) < (b) ? (a) : (b))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
721 #endif
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
722 #ifndef max
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
723 #define max(a, b) ((a) > (b) ? (a) : (b))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
724 #endif
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
725
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
726 #define CODING_GET_INFO(coding, attrs, eol_type, charset_list) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
727 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
728 attrs = CODING_ID_ATTRS (coding->id); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
729 eol_type = CODING_ID_EOL_TYPE (coding->id); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
730 if (VECTORP (eol_type)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
731 eol_type = Qunix; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
732 charset_list = CODING_ATTR_CHARSET_LIST (attrs); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
733 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
734
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
735
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
736 /* Safely get one byte from the source text pointed by SRC which ends
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
737 at SRC_END, and set C to that byte. If there are not enough bytes
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
738 in the source, it jumps to `no_more_source'. The caller
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
739 should declare and set these variables appropriately in advance:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
740 src, src_end, multibytep
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
741 */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
742
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
743 #define ONE_MORE_BYTE(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
744 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
745 if (src == src_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
746 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
747 if (src_base < src) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
748 coding->result = CODING_RESULT_INSUFFICIENT_SRC; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
749 goto no_more_source; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
750 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
751 c = *src++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
752 if (multibytep && (c & 0x80)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
753 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
754 if ((c & 0xFE) != 0xC0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
755 error ("Undecodable char found"); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
756 c = ((c & 1) << 6) | *src++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
757 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
758 consumed_chars++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
759 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
760
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
761
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
762 #define ONE_MORE_BYTE_NO_CHECK(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
763 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
764 c = *src++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
765 if (multibytep && (c & 0x80)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
766 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
767 if ((c & 0xFE) != 0xC0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
768 error ("Undecodable char found"); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
769 c = ((c & 1) << 6) | *src++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
770 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
771 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
772
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
773
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
774 /* Store a byte C in the place pointed by DST and increment DST to the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
775 next free point, and increment PRODUCED_CHARS. The caller should
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
776 assure that C is 0..127, and declare and set the variable `dst'
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
777 appropriately in advance.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
778 */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
779
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
780
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
781 #define EMIT_ONE_ASCII_BYTE(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
782 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
783 produced_chars++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
784 *dst++ = (c); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
785 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
786
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
787
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
788 /* Like EMIT_ONE_ASCII_BYTE byt store two bytes; C1 and C2. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
789
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
790 #define EMIT_TWO_ASCII_BYTES(c1, c2) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
791 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
792 produced_chars += 2; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
793 *dst++ = (c1), *dst++ = (c2); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
794 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
795
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
796
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
797 /* Store a byte C in the place pointed by DST and increment DST to the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
798 next free point, and increment PRODUCED_CHARS. If MULTIBYTEP is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
799 nonzero, store in an appropriate multibyte from. The caller should
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
800 declare and set the variables `dst' and `multibytep' appropriately
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
801 in advance. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
802
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
803 #define EMIT_ONE_BYTE(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
804 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
805 produced_chars++; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
806 if (multibytep) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
807 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
808 int ch = (c); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
809 if (ch >= 0x80) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
810 ch = BYTE8_TO_CHAR (ch); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
811 CHAR_STRING_ADVANCE (ch, dst); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
812 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
813 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
814 *dst++ = (c); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
815 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
816
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
817
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
818 /* Like EMIT_ONE_BYTE, but emit two bytes; C1 and C2. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
819
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
820 #define EMIT_TWO_BYTES(c1, c2) \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
821 do { \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
822 produced_chars += 2; \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
823 if (multibytep) \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
824 { \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
825 int ch; \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
826 \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
827 ch = (c1); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
828 if (ch >= 0x80) \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
829 ch = BYTE8_TO_CHAR (ch); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
830 CHAR_STRING_ADVANCE (ch, dst); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
831 ch = (c2); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
832 if (ch >= 0x80) \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
833 ch = BYTE8_TO_CHAR (ch); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
834 CHAR_STRING_ADVANCE (ch, dst); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
835 } \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
836 else \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
837 { \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
838 *dst++ = (c1); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
839 *dst++ = (c2); \
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
840 } \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
841 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
842
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
843
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
844 #define EMIT_THREE_BYTES(c1, c2, c3) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
845 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
846 EMIT_ONE_BYTE (c1); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
847 EMIT_TWO_BYTES (c2, c3); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
848 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
849
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
850
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
851 #define EMIT_FOUR_BYTES(c1, c2, c3, c4) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
852 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
853 EMIT_TWO_BYTES (c1, c2); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
854 EMIT_TWO_BYTES (c3, c4); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
855 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
856
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
857
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
858 #define CODING_DECODE_CHAR(coding, src, src_base, src_end, charset, code, c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
859 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
860 charset_map_loaded = 0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
861 c = DECODE_CHAR (charset, code); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
862 if (charset_map_loaded) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
863 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
864 unsigned char *orig = coding->source; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
865 EMACS_INT offset; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
866 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
867 coding_set_source (coding); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
868 offset = coding->source - orig; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
869 src += offset; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
870 src_base += offset; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
871 src_end += offset; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
872 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
873 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
874
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
875
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
876 #define ASSURE_DESTINATION(bytes) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
877 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
878 if (dst + (bytes) >= dst_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
879 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
880 int more_bytes = charbuf_end - charbuf + (bytes); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
881 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
882 dst = alloc_destination (coding, more_bytes, dst); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
883 dst_end = coding->destination + coding->dst_bytes; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
884 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
885 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
886
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
887
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
888
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
889 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
890 coding_set_source (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
891 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
892 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
893 if (BUFFERP (coding->src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
894 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
895 if (coding->src_pos < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
896 coding->source = GAP_END_ADDR + coding->src_pos_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
897 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
898 {
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
899 struct buffer *buf = XBUFFER (coding->src_object);
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
900 EMACS_INT gpt_byte = BUF_GPT_BYTE (buf);
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
901 unsigned char *beg_addr = BUF_BEG_ADDR (buf);
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
902
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
903 coding->source = beg_addr + coding->src_pos_byte - 1;
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
904 if (coding->src_pos_byte >= gpt_byte)
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
905 coding->source += BUF_GAP_SIZE (buf);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
906 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
907 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
908 else if (STRINGP (coding->src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
909 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
910 coding->source = (XSTRING (coding->src_object)->data
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
911 + coding->src_pos_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
912 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
913 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
914 /* Otherwise, the source is C string and is never relocated
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
915 automatically. Thus we don't have to update anything. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
916 ;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
917 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
918
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
919 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
920 coding_set_destination (coding)
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
921 struct coding_system *coding;
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
922 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
923 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
924 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
925 /* We are sure that coding->dst_pos_byte is before the gap of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
926 buffer. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
927 coding->destination = (BUF_BEG_ADDR (XBUFFER (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
928 + coding->dst_pos_byte - 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
929 if (coding->src_pos < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
930 coding->dst_bytes = (GAP_END_ADDR
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
931 - (coding->src_bytes - coding->consumed)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
932 - coding->destination);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
933 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
934 coding->dst_bytes = (BUF_GAP_END_ADDR (XBUFFER (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
935 - coding->destination);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
936 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
937 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
938 /* Otherwise, the destination is C string and is never relocated
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
939 automatically. Thus we don't have to update anything. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
940 ;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
941 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
942
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
943
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
944 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
945 coding_alloc_by_realloc (coding, bytes)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
946 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
947 EMACS_INT bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
948 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
949 coding->destination = (unsigned char *) xrealloc (coding->destination,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
950 coding->dst_bytes + bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
951 coding->dst_bytes += bytes;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
952 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
953
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
954 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
955 coding_alloc_by_making_gap (coding, bytes)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
956 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
957 EMACS_INT bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
958 {
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
959 if (BUFFERP (coding->dst_object)
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
960 && EQ (coding->src_object, coding->dst_object))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
961 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
962 EMACS_INT add = coding->src_bytes - coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
963
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
964 GAP_SIZE -= add; ZV += add; Z += add; ZV_BYTE += add; Z_BYTE += add;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
965 make_gap (bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
966 GAP_SIZE += add; ZV -= add; Z -= add; ZV_BYTE -= add; Z_BYTE -= add;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
967 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
968 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
969 {
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
970 Lisp_Object this_buffer;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
971
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
972 this_buffer = Fcurrent_buffer ();
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
973 set_buffer_internal (XBUFFER (coding->dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
974 make_gap (bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
975 set_buffer_internal (XBUFFER (this_buffer));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
976 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
977 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
978
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
979
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
980 static unsigned char *
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
981 alloc_destination (coding, nbytes, dst)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
982 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
983 int nbytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
984 unsigned char *dst;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
985 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
986 EMACS_INT offset = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
987
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
988 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
989 coding_alloc_by_making_gap (coding, nbytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
990 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
991 coding_alloc_by_realloc (coding, nbytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
992 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
993 coding_set_destination (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
994 dst = coding->destination + offset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
995 return dst;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
996 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
997
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
998
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
999 /*** 2. Emacs' internal format (emacs-utf-8) ***/
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1000
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1001
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
1002
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1003
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1004 /*** 3. UTF-8 ***/
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1005
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1006 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1007 Check if a text is encoded in UTF-8. If it is, return
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1008 CATEGORY_MASK_UTF_8, else return 0. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1009
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1010 #define UTF_8_1_OCTET_P(c) ((c) < 0x80)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1011 #define UTF_8_EXTRA_OCTET_P(c) (((c) & 0xC0) == 0x80)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1012 #define UTF_8_2_OCTET_LEADING_P(c) (((c) & 0xE0) == 0xC0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1013 #define UTF_8_3_OCTET_LEADING_P(c) (((c) & 0xF0) == 0xE0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1014 #define UTF_8_4_OCTET_LEADING_P(c) (((c) & 0xF8) == 0xF0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1015 #define UTF_8_5_OCTET_LEADING_P(c) (((c) & 0xFC) == 0xF8)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1016
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1017 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1018 detect_coding_utf_8 (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1019 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1020 int *mask;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1021 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1022 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1023 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1024 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1025 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1026 int found = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1027
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1028 /* A coding system of this category is always ASCII compatible. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1029 src += coding->head_ascii;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1030
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1031 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1032 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1033 int c, c1, c2, c3, c4;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1034
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1035 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1036 if (UTF_8_1_OCTET_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1037 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1038 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1039 if (! UTF_8_EXTRA_OCTET_P (c1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1040 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1041 if (UTF_8_2_OCTET_LEADING_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1042 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1043 found++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1044 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1045 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1046 ONE_MORE_BYTE (c2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1047 if (! UTF_8_EXTRA_OCTET_P (c2))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1048 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1049 if (UTF_8_3_OCTET_LEADING_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1050 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1051 found++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1052 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1053 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1054 ONE_MORE_BYTE (c3);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1055 if (! UTF_8_EXTRA_OCTET_P (c3))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1056 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1057 if (UTF_8_4_OCTET_LEADING_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1058 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1059 found++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1060 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1061 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1062 ONE_MORE_BYTE (c4);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1063 if (! UTF_8_EXTRA_OCTET_P (c4))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1064 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1065 if (UTF_8_5_OCTET_LEADING_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1066 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1067 found++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1068 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1069 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1070 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1071 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1072 *mask &= ~CATEGORY_MASK_UTF_8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1073 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1074
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1075 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1076 if (! found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1077 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1078 *mask &= CATEGORY_MASK_UTF_8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1079 return 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1080 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1081
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1082
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1083 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1084 decode_coding_utf_8 (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1085 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1086 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1087 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1088 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1089 unsigned char *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1090 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1091 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1092 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1093 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1094 Lisp_Object attr, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1095
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1096 CODING_GET_INFO (coding, attr, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1097
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1098 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1099 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1100 int c, c1, c2, c3, c4, c5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1101
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1102 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1103 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1104
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1105 if (charbuf >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1106 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1107
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1108 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1109 if (UTF_8_1_OCTET_P(c1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1110 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1111 c = c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1112 if (c == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1113 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1114 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1115 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1116 if (src == src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1117 goto no_more_source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1118 if (*src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1119 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1120 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1121 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1122 c = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1123 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1124 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1125 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1126 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1127 ONE_MORE_BYTE (c2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1128 if (! UTF_8_EXTRA_OCTET_P (c2))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1129 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1130 if (UTF_8_2_OCTET_LEADING_P (c1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1131 c = ((c1 & 0x1F) << 6) | (c2 & 0x3F);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1132 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1133 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1134 ONE_MORE_BYTE (c3);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1135 if (! UTF_8_EXTRA_OCTET_P (c3))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1136 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1137 if (UTF_8_3_OCTET_LEADING_P (c1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1138 c = (((c1 & 0xF) << 12)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1139 | ((c2 & 0x3F) << 6) | (c3 & 0x3F));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1140 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1141 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1142 ONE_MORE_BYTE (c4);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1143 if (! UTF_8_EXTRA_OCTET_P (c4))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1144 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1145 if (UTF_8_4_OCTET_LEADING_P (c1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1146 c = (((c1 & 0x7) << 18) | ((c2 & 0x3F) << 12)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1147 | ((c3 & 0x3F) << 6) | (c4 & 0x3F));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1148 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1149 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1150 ONE_MORE_BYTE (c5);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1151 if (! UTF_8_EXTRA_OCTET_P (c5))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1152 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1153 if (UTF_8_5_OCTET_LEADING_P (c1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1154 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1155 c = (((c1 & 0x3) << 24) | ((c2 & 0x3F) << 18)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1156 | ((c3 & 0x3F) << 12) | ((c4 & 0x3F) << 6)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1157 | (c5 & 0x3F));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1158 if (c > MAX_CHAR)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1159 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1160 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1161 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1162 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1163 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1164 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1165 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1166 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1167
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1168 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1169 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1170
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1171 invalid_code:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1172 src = src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1173 consumed_chars = consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1174 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1175 *charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1176 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1177 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1178
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1179 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1180 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1181 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1182 coding->charbuf_used = charbuf - coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1183 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1184
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1185
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1186 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1187 encode_coding_utf_8 (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1188 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1189 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1190 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1191 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1192 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1193 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1194 unsigned char *dst_end = coding->destination + coding->dst_bytes;
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
1195 int produced_chars = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1196 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1197
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1198 if (multibytep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1199 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1200 int safe_room = MAX_MULTIBYTE_LENGTH * 2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1201
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1202 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1203 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1204 unsigned char str[MAX_MULTIBYTE_LENGTH], *p, *pend = str;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1205
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1206 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1207 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1208 CHAR_STRING_ADVANCE (c, pend);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1209 for (p = str; p < pend; p++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1210 EMIT_ONE_BYTE (*p);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1211 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1212 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1213 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1214 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1215 int safe_room = MAX_MULTIBYTE_LENGTH;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1216
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1217 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1218 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1219 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1220 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1221 dst += CHAR_STRING (c, dst);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1222 produced_chars++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1223 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1224 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1225 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1226 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1227 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1228 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1229 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1230
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1231
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1232 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1233 Check if a text is encoded in UTF-16 Big Endian (endian == 1) or
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1234 Little Endian (otherwise). If it is, return
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1235 CATEGORY_MASK_UTF_16_BE or CATEGORY_MASK_UTF_16_LE,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1236 else return 0. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1237
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1238 #define UTF_16_HIGH_SURROGATE_P(val) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1239 (((val) & 0xFC00) == 0xD800)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1240
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1241 #define UTF_16_LOW_SURROGATE_P(val) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1242 (((val) & 0xFC00) == 0xDC00)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1243
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1244 #define UTF_16_INVALID_P(val) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1245 (((val) == 0xFFFE) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1246 || ((val) == 0xFFFF) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1247 || UTF_16_LOW_SURROGATE_P (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1248
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1249
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1250 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1251 detect_coding_utf_16 (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1252 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1253 int *mask;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1254 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1255 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1256 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1257 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1258 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1259 int c1, c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1260
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1261 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1262 ONE_MORE_BYTE (c2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1263
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1264 if ((c1 == 0xFF) && (c2 == 0xFE))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1265 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1266 *mask &= CATEGORY_MASK_UTF_16_LE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1267 return 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1268 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1269 else if ((c1 == 0xFE) && (c2 == 0xFF))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1270 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1271 *mask &= CATEGORY_MASK_UTF_16_BE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1272 return 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1273 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1274 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1275 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1276 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1277
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1278 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1279 decode_coding_utf_16 (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1280 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1281 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1282 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1283 unsigned char *src_end = coding->source + coding->src_bytes;
88430
6418a272b97e * coding.c: Delete unused variables.
Kenichi Handa <handa@m17n.org>
parents: 88365
diff changeset
1284 unsigned char *src_base;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1285 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1286 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1287 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1288 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1289 enum utf_16_bom_type bom = CODING_UTF_16_BOM (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1290 enum utf_16_endian_type endian = CODING_UTF_16_ENDIAN (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1291 int surrogate = CODING_UTF_16_SURROGATE (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1292 Lisp_Object attr, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1293
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1294 CODING_GET_INFO (coding, attr, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1295
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1296 if (bom != utf_16_without_bom)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1297 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1298 int c, c1, c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1299
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1300 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1301 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1302 ONE_MORE_BYTE (c2);
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
1303 c = (c1 << 8) | c2;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1304 if (bom == utf_16_with_bom)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1305 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1306 if (endian == utf_16_big_endian
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1307 ? c != 0xFFFE : c != 0xFEFF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1308 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1309 /* We are sure that there's enouph room at CHARBUF. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1310 *charbuf++ = c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1311 *charbuf++ = c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1312 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1313 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1314 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1315 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1316 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1317 if (c == 0xFFFE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1318 CODING_UTF_16_ENDIAN (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1319 = endian = utf_16_big_endian;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1320 else if (c == 0xFEFF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1321 CODING_UTF_16_ENDIAN (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1322 = endian = utf_16_little_endian;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1323 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1324 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1325 CODING_UTF_16_ENDIAN (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1326 = endian = utf_16_big_endian;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1327 src = src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1328 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1329 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1330 CODING_UTF_16_BOM (coding) = utf_16_with_bom;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1331 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1332
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1333 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1334 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1335 int c, c1, c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1336
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1337 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1338 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1339
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1340 if (charbuf + 2 >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1341 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1342
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1343 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1344 ONE_MORE_BYTE (c2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1345 c = (endian == utf_16_big_endian
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
1346 ? ((c1 << 8) | c2) : ((c2 << 8) | c1));
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1347 if (surrogate)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1348 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1349 if (! UTF_16_LOW_SURROGATE_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1350 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1351 if (endian == utf_16_big_endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1352 c1 = surrogate >> 8, c2 = surrogate & 0xFF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1353 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1354 c1 = surrogate & 0xFF, c2 = surrogate >> 8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1355 *charbuf++ = c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1356 *charbuf++ = c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1357 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1358 if (UTF_16_HIGH_SURROGATE_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1359 CODING_UTF_16_SURROGATE (coding) = surrogate = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1360 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1361 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1362 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1363 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1364 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1365 c = ((surrogate - 0xD800) << 10) | (c - 0xDC00);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1366 CODING_UTF_16_SURROGATE (coding) = surrogate = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1367 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1368 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1369 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1370 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1371 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1372 if (UTF_16_HIGH_SURROGATE_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1373 CODING_UTF_16_SURROGATE (coding) = surrogate = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1374 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1375 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1376 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1377 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1378
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1379 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1380 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1381 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1382 coding->charbuf_used = charbuf - coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1383 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1384
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1385 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1386 encode_coding_utf_16 (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1387 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1388 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1389 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1390 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1391 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1392 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1393 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1394 int safe_room = 8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1395 enum utf_16_bom_type bom = CODING_UTF_16_BOM (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1396 int big_endian = CODING_UTF_16_ENDIAN (coding) == utf_16_big_endian;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1397 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1398 Lisp_Object attrs, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1399 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1400
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1401 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1402
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1403 if (bom == utf_16_with_bom)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1404 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1405 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1406 if (big_endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1407 EMIT_TWO_BYTES (0xFF, 0xFE);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1408 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1409 EMIT_TWO_BYTES (0xFE, 0xFF);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1410 CODING_UTF_16_BOM (coding) = utf_16_without_bom;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1411 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1412
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1413 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1414 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1415 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1416 c = *charbuf++;
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
1417 if (c >= MAX_UNICODE_CHAR)
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
1418 c = coding->default_char;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1419
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1420 if (c < 0x10000)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1421 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1422 if (big_endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1423 EMIT_TWO_BYTES (c >> 8, c & 0xFF);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1424 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1425 EMIT_TWO_BYTES (c & 0xFF, c >> 8);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1426 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1427 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1428 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1429 int c1, c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1430
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1431 c -= 0x10000;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1432 c1 = (c >> 10) + 0xD800;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1433 c2 = (c & 0x3FF) + 0xDC00;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1434 if (big_endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1435 EMIT_FOUR_BYTES (c1 >> 8, c1 & 0xFF, c2 >> 8, c2 & 0xFF);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1436 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1437 EMIT_FOUR_BYTES (c1 & 0xFF, c1 >> 8, c2 & 0xFF, c2 >> 8);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1438 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1439 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1440 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1441 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1442 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1443 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1444 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1445
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1446
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1447 /*** 6. Old Emacs' internal format (emacs-mule) ***/
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1448
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1449 /* Emacs' internal format for representation of multiple character
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1450 sets is a kind of multi-byte encoding, i.e. characters are
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1451 represented by variable-length sequences of one-byte codes.
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1452
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1453 ASCII characters and control characters (e.g. `tab', `newline') are
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1454 represented by one-byte sequences which are their ASCII codes, in
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1455 the range 0x00 through 0x7F.
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1456
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1457 8-bit characters of the range 0x80..0x9F are represented by
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1458 two-byte sequences of LEADING_CODE_8_BIT_CONTROL and (their 8-bit
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1459 code + 0x20).
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1460
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1461 8-bit characters of the range 0xA0..0xFF are represented by
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1462 one-byte sequences which are their 8-bit code.
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1463
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1464 The other characters are represented by a sequence of `base
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1465 leading-code', optional `extended leading-code', and one or two
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1466 `position-code's. The length of the sequence is determined by the
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1467 base leading-code. Leading-code takes the range 0x81 through 0x9D,
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1468 whereas extended leading-code and position-code take the range 0xA0
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1469 through 0xFF. See `charset.h' for more details about leading-code
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1470 and position-code.
18766
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
1471
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1472 --- CODE RANGE of Emacs' internal format ---
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1473 character set range
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1474 ------------- -----
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1475 ascii 0x00..0x7F
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1476 eight-bit-control LEADING_CODE_8_BIT_CONTROL + 0xA0..0xBF
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1477 eight-bit-graphic 0xA0..0xBF
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1478 ELSE 0x81..0x9D + [0xA0..0xFF]+
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1479 ---------------------------------------------
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1480
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1481 As this is the internal character representation, the format is
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1482 usually not used externally (i.e. in a file or in a data sent to a
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1483 process). But, it is possible to have a text externally in this
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1484 format (i.e. by encoding by the coding system `emacs-mule').
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1485
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1486 In that case, a sequence of one-byte codes has a slightly different
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1487 form.
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1488
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1489 At first, all characters in eight-bit-control are represented by
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1490 one-byte sequences which are their 8-bit code.
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1491
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1492 Next, character composition data are represented by the byte
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1493 sequence of the form: 0x80 METHOD BYTES CHARS COMPONENT ...,
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1494 where,
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1495 METHOD is 0xF0 plus one of composition method (enum
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1496 composition_method),
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1497
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1498 BYTES is 0xA0 plus a byte length of this composition data,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1499
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1500 CHARS is 0x20 plus a number of characters composed by this
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1501 data,
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1502
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1503 COMPONENTs are characters of multibye form or composition
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1504 rules encoded by two-byte of ASCII codes.
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1505
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1506 In addition, for backward compatibility, the following formats are
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1507 also recognized as composition data on decoding.
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1508
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1509 0x80 MSEQ ...
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1510 0x80 0xFF MSEQ RULE MSEQ RULE ... MSEQ
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1511
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1512 Here,
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1513 MSEQ is a multibyte form but in these special format:
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1514 ASCII: 0xA0 ASCII_CODE+0x80,
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1515 other: LEADING_CODE+0x20 FOLLOWING-BYTE ...,
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1516 RULE is a one byte code of the range 0xA0..0xF0 that
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1517 represents a composition rule.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1518 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1519
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1520 char emacs_mule_bytes[256];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1521
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1522 /* Leading-code followed by extended leading-code. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1523 #define LEADING_CODE_PRIVATE_11 0x9A /* for private DIMENSION1 of 1-column */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1524 #define LEADING_CODE_PRIVATE_12 0x9B /* for private DIMENSION1 of 2-column */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1525 #define LEADING_CODE_PRIVATE_21 0x9C /* for private DIMENSION2 of 1-column */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1526 #define LEADING_CODE_PRIVATE_22 0x9D /* for private DIMENSION2 of 2-column */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1527
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1528
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1529 int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1530 emacs_mule_char (coding, composition, nbytes, nchars)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1531 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1532 int composition;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1533 int *nbytes, *nchars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1534 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1535 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1536 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1537 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1538 unsigned char *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1539 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1540 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1541 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1542 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1543
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1544 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1545 if (composition)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1546 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1547 c -= 0x20;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1548 if (c == 0x80)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1549 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1550 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1551 if (c < 0xA0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1552 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1553 *nbytes = src - src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1554 *nchars = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1555 return (c - 0x80);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1556 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1557 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1558
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1559 switch (emacs_mule_bytes[c])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1560 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1561 case 2:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1562 if (! (charset = emacs_mule_charset[c]))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1563 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1564 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1565 code = c & 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1566 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1567
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1568 case 3:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1569 if (c == LEADING_CODE_PRIVATE_11
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1570 || c == LEADING_CODE_PRIVATE_12)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1571 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1572 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1573 if (! (charset = emacs_mule_charset[c]))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1574 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1575 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1576 code = c & 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1577 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1578 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1579 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1580 if (! (charset = emacs_mule_charset[c]))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1581 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1582 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1583 code = (c & 0x7F) << 7;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1584 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1585 code |= c & 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1586 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1587 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1588
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1589 case 4:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1590 if (! (charset = emacs_mule_charset[c]))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1591 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1592 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1593 code = (c & 0x7F) << 7;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1594 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1595 code |= c & 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1596 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1597
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1598 case 1:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1599 code = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1600 charset = CHARSET_FROM_ID (ASCII_BYTE_P (code) ? charset_ascii
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1601 : code < 0xA0 ? charset_8_bit_control
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1602 : charset_8_bit_graphic);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1603 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1604
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1605 default:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1606 abort ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1607 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1608 c = DECODE_CHAR (charset, code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1609 if (c < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1610 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1611 *nbytes = src - src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1612 *nchars = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1613 return c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1614
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1615 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1616 return -2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1617
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1618 invalid_code:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1619 return -1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1620 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1621
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1622
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1623 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1624 Check if a text is encoded in `emacs-mule'. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1625
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
1626 static int
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1627 detect_coding_emacs_mule (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1628 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1629 int *mask;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1630 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1631 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1632 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1633 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1634 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1635 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1636 int found = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1637
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1638 /* A coding system of this category is always ASCII compatible. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1639 src += coding->head_ascii;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1640
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1641 while (1)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1642 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1643 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1644
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1645 if (c == 0x80)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1646 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1647 /* Perhaps the start of composite character. We simple skip
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1648 it because analyzing it is too heavy for detecting. But,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1649 at least, we check that the composite character
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1650 constitues of more than 4 bytes. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1651 unsigned char *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1652
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1653 repeat:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1654 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1655 do
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1656 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1657 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1658 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1659 while (c >= 0xA0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1660
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1661 if (src - src_base <= 4)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1662 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1663 found = 1;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1664 if (c == 0x80)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1665 goto repeat;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1666 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1667
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1668 if (c < 0x80)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1669 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1670 if (c < 0x20
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1671 && (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1672 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1673 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1674 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1675 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1676 unsigned char *src_base = src - 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1677
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1678 do
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1679 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1680 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1681 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1682 while (c >= 0xA0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1683 if (src - src_base != emacs_mule_bytes[*src_base])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1684 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1685 found = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1686 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1687 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1688 *mask &= ~CATEGORY_MASK_EMACS_MULE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1689 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1690
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1691 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1692 if (!found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1693 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1694 *mask &= CATEGORY_MASK_EMACS_MULE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1695 return 1;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1696 }
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1697
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1698
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1699 /* See the above "GENERAL NOTES on `decode_coding_XXX ()' functions". */
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1700
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1701 /* Decode a character represented as a component of composition
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1702 sequence of Emacs 20/21 style at SRC. Set C to that character and
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1703 update SRC to the head of next character (or an encoded composition
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1704 rule). If SRC doesn't points a composition component, set C to -1.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1705 If SRC points an invalid byte sequence, global exit by a return
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1706 value 0. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1707
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1708 #define DECODE_EMACS_MULE_COMPOSITION_CHAR(buf) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1709 if (1) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1710 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1711 int c; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1712 int nbytes, nchars; \
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1713 \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1714 if (src == src_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1715 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1716 c = emacs_mule_char (coding, 1, &nbytes, &nchars); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1717 if (c < 0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1718 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1719 if (c == -2) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1720 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1721 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1722 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1723 *buf++ = c; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1724 src += nbytes; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1725 consumed_chars += nchars; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1726 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1727 else
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1728
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1729
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1730 /* Decode a composition rule represented as a component of composition
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1731 sequence of Emacs 20 style at SRC. Set C to the rule. If SRC
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1732 points an invalid byte sequence, set C to -1. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1733
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1734 #define DECODE_EMACS_MULE_COMPOSITION_RULE(buf) \
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1735 do { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1736 int c, gref, nref; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1737 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1738 if (src < src_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1739 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1740 ONE_MORE_BYTE_NO_CHECK (c); \
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1741 c -= 0xA0; \
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1742 if (c < 0 || c >= 81) \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1743 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1744 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1745 gref = c / 9, nref = c % 9; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1746 *buf++ = COMPOSITION_ENCODE_RULE (gref, nref); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1747 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1748
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1749
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1750 #define ADD_COMPOSITION_DATA(buf, method, nchars) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1751 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1752 *buf++ = -5; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1753 *buf++ = coding->produced_char + char_offset; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1754 *buf++ = CODING_ANNOTATE_COMPOSITION_MASK; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1755 *buf++ = method; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1756 *buf++ = nchars; \
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1757 } while (0)
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1758
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1759
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1760 #define DECODE_EMACS_MULE_21_COMPOSITION(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1761 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1762 /* Emacs 21 style format. The first three bytes at SRC are \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1763 (METHOD - 0xF0), (BYTES - 0xA0), (CHARS - 0xA0), where BYTES is \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1764 the byte length of this composition information, CHARS is the \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1765 number of characters composed by this composition. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1766 enum composition_method method = c - 0xF0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1767 int consumed_chars_limit; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1768 int nbytes, nchars; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1769 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1770 ONE_MORE_BYTE (c); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1771 nbytes = c - 0xA0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1772 if (nbytes < 3) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1773 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1774 ONE_MORE_BYTE (c); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1775 nchars = c - 0xA0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1776 ADD_COMPOSITION_DATA (charbuf, method, nchars); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1777 consumed_chars_limit = consumed_chars_base + nbytes; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1778 if (method != COMPOSITION_RELATIVE) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1779 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1780 int i = 0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1781 while (consumed_chars < consumed_chars_limit) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1782 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1783 if (i % 2 && method != COMPOSITION_WITH_ALTCHARS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1784 DECODE_EMACS_MULE_COMPOSITION_RULE (charbuf); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1785 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1786 DECODE_EMACS_MULE_COMPOSITION_CHAR (charbuf); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1787 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1788 if (consumed_chars < consumed_chars_limit) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1789 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1790 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1791 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1792
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1793
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1794 #define DECODE_EMACS_MULE_20_RELATIVE_COMPOSITION(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1795 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1796 /* Emacs 20 style format for relative composition. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1797 /* Store multibyte form of characters to be composed. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1798 int components[MAX_COMPOSITION_COMPONENTS * 2 - 1]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1799 int *buf = components; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1800 int i, j; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1801 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1802 src = src_base; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1803 ONE_MORE_BYTE (c); /* skip 0x80 */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1804 for (i = 0; i < MAX_COMPOSITION_COMPONENTS; i++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1805 DECODE_EMACS_MULE_COMPOSITION_CHAR (buf); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1806 if (i < 2) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1807 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1808 ADD_COMPOSITION_DATA (charbuf, COMPOSITION_RELATIVE, i); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1809 for (j = 0; j < i; j++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1810 *charbuf++ = components[j]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1811 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1812
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1813
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1814 #define DECODE_EMACS_MULE_20_RULEBASE_COMPOSITION(c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1815 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1816 /* Emacs 20 style format for rule-base composition. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1817 /* Store multibyte form of characters to be composed. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1818 int components[MAX_COMPOSITION_COMPONENTS * 2 - 1]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1819 int *buf = components; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1820 int i, j; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1821 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1822 DECODE_EMACS_MULE_COMPOSITION_CHAR (buf); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1823 for (i = 0; i < MAX_COMPOSITION_COMPONENTS; i++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1824 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1825 DECODE_EMACS_MULE_COMPOSITION_RULE (buf); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1826 DECODE_EMACS_MULE_COMPOSITION_CHAR (buf); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1827 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1828 if (i < 1 || (buf - components) % 2 == 0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1829 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1830 if (charbuf + i + (i / 2) + 1 < charbuf_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1831 goto no_more_source; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1832 ADD_COMPOSITION_DATA (buf, COMPOSITION_WITH_RULE, i); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1833 for (j = 0; j < i; j++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1834 *charbuf++ = components[j]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1835 for (j = 0; j < i; j += 2) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1836 *charbuf++ = components[j]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1837 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1838
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1839
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1840 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1841 decode_coding_emacs_mule (coding)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1842 struct coding_system *coding;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1843 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1844 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1845 unsigned char *src_end = coding->source + coding->src_bytes;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1846 unsigned char *src_base;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1847 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1848 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1849 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1850 int char_offset = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1851 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1852 Lisp_Object attrs, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1853
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1854 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1855
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1856 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1857 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1858 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1859
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1860 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1861 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1862
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1863 if (charbuf >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1864 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1865
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1866 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1867
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1868 if (c < 0x80)
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1869 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1870 if (c == '\r')
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1871 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1872 if (EQ (eol_type, Qdos))
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1873 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1874 if (src == src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1875 goto no_more_source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1876 if (*src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1877 ONE_MORE_BYTE (c);
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1878 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1879 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1880 c = '\n';
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1881 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1882 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1883 char_offset++;
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1884 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1885 else if (c == 0x80)
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1886 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1887 if (charbuf + 5 + (MAX_COMPOSITION_COMPONENTS * 2) - 1 > charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1888 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1889 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1890 if (c - 0xF0 >= COMPOSITION_RELATIVE
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1891 && c - 0xF0 <= COMPOSITION_WITH_RULE_ALTCHARS)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1892 DECODE_EMACS_MULE_21_COMPOSITION (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1893 else if (c < 0xC0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1894 DECODE_EMACS_MULE_20_RELATIVE_COMPOSITION (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1895 else if (c == 0xFF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1896 DECODE_EMACS_MULE_20_RULEBASE_COMPOSITION (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1897 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1898 goto invalid_code;
32806
9502d0a5b2ad (decode_coding_emacs_mule): If coding->eol_type is CR
Eli Zaretskii <eliz@gnu.org>
parents: 32745
diff changeset
1899 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1900 else if (c < 0xA0 && emacs_mule_bytes[c] > 1)
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1901 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1902 int nbytes, nchars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1903 src--;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1904 c = emacs_mule_char (coding, 0, &nbytes, &nchars);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1905 if (c < 0)
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1906 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1907 if (c == -2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1908 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1909 goto invalid_code;
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1910 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1911 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1912 char_offset++;
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
1913 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1914 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1915
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1916 invalid_code:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1917 src = src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1918 consumed_chars = consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1919 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1920 *charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1921 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1922 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1923
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1924 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1925 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1926 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1927 coding->charbuf_used = charbuf - coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1928 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1929
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1930
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1931 #define EMACS_MULE_LEADING_CODES(id, codes) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1932 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1933 if (id < 0xA0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1934 codes[0] = id, codes[1] = 0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1935 else if (id < 0xE0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1936 codes[0] = 0x9A, codes[1] = id; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1937 else if (id < 0xF0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1938 codes[0] = 0x9B, codes[1] = id; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1939 else if (id < 0xF5) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1940 codes[0] = 0x9C, codes[1] = id; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1941 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1942 codes[0] = 0x9D, codes[1] = id; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1943 } while (0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1944
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1945
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1946 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1947 encode_coding_emacs_mule (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1948 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1949 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1950 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1951 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1952 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1953 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1954 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1955 int safe_room = 8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1956 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1957 Lisp_Object attrs, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1958 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1959
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1960 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1961
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1962 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1963 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1964 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1965 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1966 if (ASCII_CHAR_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1967 EMIT_ONE_ASCII_BYTE (c);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1968 else
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
1969 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1970 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1971 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1972 int dimension;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1973 int emacs_mule_id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1974 unsigned char leading_codes[2];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1975
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1976 charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1977 if (! charset)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1978 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1979 c = coding->default_char;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1980 if (ASCII_CHAR_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1981 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1982 EMIT_ONE_ASCII_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1983 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1984 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1985 charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1986 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1987 dimension = CHARSET_DIMENSION (charset);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1988 emacs_mule_id = CHARSET_EMACS_MULE_ID (charset);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1989 EMACS_MULE_LEADING_CODES (emacs_mule_id, leading_codes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1990 EMIT_ONE_BYTE (leading_codes[0]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1991 if (leading_codes[1])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1992 EMIT_ONE_BYTE (leading_codes[1]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1993 if (dimension == 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1994 EMIT_ONE_BYTE (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1995 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1996 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1997 EMIT_ONE_BYTE (code >> 8);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1998 EMIT_ONE_BYTE (code & 0xFF);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
1999 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2000 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2001 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2002 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2003 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2004 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2005 return 0;
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
2006 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2007
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2008
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2009 /*** 7. ISO2022 handlers ***/
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2010
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2011 /* The following note describes the coding system ISO2022 briefly.
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2012 Since the intention of this note is to help understand the
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2013 functions in this file, some parts are NOT ACCURATE or OVERLY
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2014 SIMPLIFIED. For thorough understanding, please refer to the
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2015 original document of ISO2022.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2016
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2017 ISO2022 provides many mechanisms to encode several character sets
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2018 in 7-bit and 8-bit environments. For 7-bite environments, all text
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2019 is encoded using bytes less than 128. This may make the encoded
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2020 text a little bit longer, but the text passes more easily through
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2021 several gateways, some of which strip off MSB (Most Signigant Bit).
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2022
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2023 There are two kinds of character sets: control character set and
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2024 graphic character set. The former contains control characters such
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2025 as `newline' and `escape' to provide control functions (control
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2026 functions are also provided by escape sequences). The latter
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2027 contains graphic characters such as 'A' and '-'. Emacs recognizes
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2028 two control character sets and many graphic character sets.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2029
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2030 Graphic character sets are classified into one of the following
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2031 four classes, according to the number of bytes (DIMENSION) and
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2032 number of characters in one dimension (CHARS) of the set:
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2033 - DIMENSION1_CHARS94
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2034 - DIMENSION1_CHARS96
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2035 - DIMENSION2_CHARS94
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2036 - DIMENSION2_CHARS96
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2037
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2038 In addition, each character set is assigned an identification tag,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2039 unique for each set, called "final character" (denoted as <F>
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2040 hereafter). The <F> of each character set is decided by ECMA(*)
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2041 when it is registered in ISO. The code range of <F> is 0x30..0x7F
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2042 (0x30..0x3F are for private use only).
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2043
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2044 Note (*): ECMA = European Computer Manufacturers Association
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2045
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2046 Here are examples of graphic character set [NAME(<F>)]:
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2047 o DIMENSION1_CHARS94 -- ASCII('B'), right-half-of-JISX0201('I'), ...
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2048 o DIMENSION1_CHARS96 -- right-half-of-ISO8859-1('A'), ...
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2049 o DIMENSION2_CHARS94 -- GB2312('A'), JISX0208('B'), ...
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2050 o DIMENSION2_CHARS96 -- none for the moment
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2051
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2052 A code area (1 byte=8 bits) is divided into 4 areas, C0, GL, C1, and GR.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2053 C0 [0x00..0x1F] -- control character plane 0
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2054 GL [0x20..0x7F] -- graphic character plane 0
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2055 C1 [0x80..0x9F] -- control character plane 1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2056 GR [0xA0..0xFF] -- graphic character plane 1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2057
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2058 A control character set is directly designated and invoked to C0 or
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2059 C1 by an escape sequence. The most common case is that:
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2060 - ISO646's control character set is designated/invoked to C0, and
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2061 - ISO6429's control character set is designated/invoked to C1,
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2062 and usually these designations/invocations are omitted in encoded
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2063 text. In a 7-bit environment, only C0 can be used, and a control
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2064 character for C1 is encoded by an appropriate escape sequence to
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2065 fit into the environment. All control characters for C1 are
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2066 defined to have corresponding escape sequences.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2067
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2068 A graphic character set is at first designated to one of four
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2069 graphic registers (G0 through G3), then these graphic registers are
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2070 invoked to GL or GR. These designations and invocations can be
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2071 done independently. The most common case is that G0 is invoked to
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2072 GL, G1 is invoked to GR, and ASCII is designated to G0. Usually
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2073 these invocations and designations are omitted in encoded text.
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2074 In a 7-bit environment, only GL can be used.
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2075
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2076 When a graphic character set of CHARS94 is invoked to GL, codes
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2077 0x20 and 0x7F of the GL area work as control characters SPACE and
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2078 DEL respectively, and codes 0xA0 and 0xFF of the GR area should not
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2079 be used.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2080
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2081 There are two ways of invocation: locking-shift and single-shift.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2082 With locking-shift, the invocation lasts until the next different
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2083 invocation, whereas with single-shift, the invocation affects the
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2084 following character only and doesn't affect the locking-shift
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2085 state. Invocations are done by the following control characters or
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2086 escape sequences:
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2087
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2088 ----------------------------------------------------------------------
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2089 abbrev function cntrl escape seq description
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2090 ----------------------------------------------------------------------
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2091 SI/LS0 (shift-in) 0x0F none invoke G0 into GL
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2092 SO/LS1 (shift-out) 0x0E none invoke G1 into GL
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2093 LS2 (locking-shift-2) none ESC 'n' invoke G2 into GL
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2094 LS3 (locking-shift-3) none ESC 'o' invoke G3 into GL
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2095 LS1R (locking-shift-1 right) none ESC '~' invoke G1 into GR (*)
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2096 LS2R (locking-shift-2 right) none ESC '}' invoke G2 into GR (*)
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2097 LS3R (locking-shift 3 right) none ESC '|' invoke G3 into GR (*)
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2098 SS2 (single-shift-2) 0x8E ESC 'N' invoke G2 for one char
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2099 SS3 (single-shift-3) 0x8F ESC 'O' invoke G3 for one char
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2100 ----------------------------------------------------------------------
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2101 (*) These are not used by any known coding system.
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2102
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2103 Control characters for these functions are defined by macros
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2104 ISO_CODE_XXX in `coding.h'.
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2105
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2106 Designations are done by the following escape sequences:
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2107 ----------------------------------------------------------------------
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2108 escape sequence description
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2109 ----------------------------------------------------------------------
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2110 ESC '(' <F> designate DIMENSION1_CHARS94<F> to G0
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2111 ESC ')' <F> designate DIMENSION1_CHARS94<F> to G1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2112 ESC '*' <F> designate DIMENSION1_CHARS94<F> to G2
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2113 ESC '+' <F> designate DIMENSION1_CHARS94<F> to G3
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2114 ESC ',' <F> designate DIMENSION1_CHARS96<F> to G0 (*)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2115 ESC '-' <F> designate DIMENSION1_CHARS96<F> to G1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2116 ESC '.' <F> designate DIMENSION1_CHARS96<F> to G2
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2117 ESC '/' <F> designate DIMENSION1_CHARS96<F> to G3
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2118 ESC '$' '(' <F> designate DIMENSION2_CHARS94<F> to G0 (**)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2119 ESC '$' ')' <F> designate DIMENSION2_CHARS94<F> to G1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2120 ESC '$' '*' <F> designate DIMENSION2_CHARS94<F> to G2
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2121 ESC '$' '+' <F> designate DIMENSION2_CHARS94<F> to G3
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2122 ESC '$' ',' <F> designate DIMENSION2_CHARS96<F> to G0 (*)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2123 ESC '$' '-' <F> designate DIMENSION2_CHARS96<F> to G1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2124 ESC '$' '.' <F> designate DIMENSION2_CHARS96<F> to G2
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2125 ESC '$' '/' <F> designate DIMENSION2_CHARS96<F> to G3
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2126 ----------------------------------------------------------------------
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2127
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2128 In this list, "DIMENSION1_CHARS94<F>" means a graphic character set
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2129 of dimension 1, chars 94, and final character <F>, etc...
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2130
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2131 Note (*): Although these designations are not allowed in ISO2022,
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2132 Emacs accepts them on decoding, and produces them on encoding
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2133 CHARS96 character sets in a coding system which is characterized as
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2134 7-bit environment, non-locking-shift, and non-single-shift.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2135
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2136 Note (**): If <F> is '@', 'A', or 'B', the intermediate character
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2137 '(' must be omitted. We refer to this as "short-form" hereafter.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2138
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2139 Now you may notice that there are a lot of ways for encoding the
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2140 same multilingual text in ISO2022. Actually, there exist many
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2141 coding systems such as Compound Text (used in X11's inter client
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2142 communication, ISO-2022-JP (used in Japanese internet), ISO-2022-KR
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2143 (used in Korean internet), EUC (Extended UNIX Code, used in Asian
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2144 localized platforms), and all of these are variants of ISO2022.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2145
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2146 In addition to the above, Emacs handles two more kinds of escape
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2147 sequences: ISO6429's direction specification and Emacs' private
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2148 sequence for specifying character composition.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2149
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2150 ISO6429's direction specification takes the following form:
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2151 o CSI ']' -- end of the current direction
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2152 o CSI '0' ']' -- end of the current direction
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2153 o CSI '1' ']' -- start of left-to-right text
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2154 o CSI '2' ']' -- start of right-to-left text
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2155 The control character CSI (0x9B: control sequence introducer) is
24425
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2156 abbreviated to the escape sequence ESC '[' in a 7-bit environment.
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2157
61c6b3be1d51 Comment for ISO 2022 encoding mechanism modified.
Kenichi Handa <handa@m17n.org>
parents: 24344
diff changeset
2158 Character composition specification takes the following form:
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2159 o ESC '0' -- start relative composition
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2160 o ESC '1' -- end composition
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2161 o ESC '2' -- start rule-base composition (*)
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2162 o ESC '3' -- start relative composition with alternate chars (**)
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2163 o ESC '4' -- start rule-base composition with alternate chars (**)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2164 Since these are not standard escape sequences of any ISO standard,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2165 the use of them for these meaning is restricted to Emacs only.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2166
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2167 (*) This form is used only in Emacs 20.5 and the older versions,
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2168 but the newer versions can safely decode it.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2169 (**) This form is used only in Emacs 21.1 and the newer versions,
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2170 and the older versions can't decode it.
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2171
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2172 Here's a list of examples usages of these composition escape
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2173 sequences (categorized by `enum composition_method').
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2174
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2175 COMPOSITION_RELATIVE:
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2176 ESC 0 CHAR [ CHAR ] ESC 1
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2177 COMPOSITOIN_WITH_RULE:
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2178 ESC 2 CHAR [ RULE CHAR ] ESC 1
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2179 COMPOSITION_WITH_ALTCHARS:
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2180 ESC 3 ALTCHAR [ ALTCHAR ] ESC 0 CHAR [ CHAR ] ESC 1
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2181 COMPOSITION_WITH_RULE_ALTCHARS:
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2182 ESC 4 ALTCHAR [ RULE ALTCHAR ] ESC 0 CHAR [ CHAR ] ESC 1 */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2183
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2184 enum iso_code_class_type iso_code_class[256];
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2185
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2186 #define SAFE_CHARSET_P(coding, id) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2187 ((id) <= (coding)->max_charset_id \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2188 && (coding)->safe_charsets[id] >= 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2189
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2190
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2191 #define SHIFT_OUT_OK(category) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2192 (CODING_ISO_INITIAL (&coding_categories[category], 1) >= 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2193
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2194 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2195 setup_iso_safe_charsets (Lisp_Object attrs)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2196 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2197 Lisp_Object charset_list, safe_charsets;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2198 Lisp_Object request;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2199 Lisp_Object reg_usage;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2200 Lisp_Object tail;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2201 int reg94, reg96;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2202 int flags = XINT (AREF (attrs, coding_attr_iso_flags));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2203 int max_charset_id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2204
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2205 charset_list = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2206 if ((flags & CODING_ISO_FLAG_FULL_SUPPORT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2207 && ! EQ (charset_list, Viso_2022_charset_list))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2208 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2209 CODING_ATTR_CHARSET_LIST (attrs)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2210 = charset_list = Viso_2022_charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2211 ASET (attrs, coding_attr_safe_charsets, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2212 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2213
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2214 if (STRINGP (AREF (attrs, coding_attr_safe_charsets)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2215 return;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2216
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2217 max_charset_id = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2218 for (tail = charset_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2219 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2220 int id = XINT (XCAR (tail));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2221 if (max_charset_id < id)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2222 max_charset_id = id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2223 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2224
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2225 safe_charsets = Fmake_string (make_number (max_charset_id + 1),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2226 make_number (255));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2227 request = AREF (attrs, coding_attr_iso_request);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2228 reg_usage = AREF (attrs, coding_attr_iso_usage);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2229 reg94 = XINT (XCAR (reg_usage));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2230 reg96 = XINT (XCDR (reg_usage));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2231
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2232 for (tail = charset_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2233 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2234 Lisp_Object id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2235 Lisp_Object reg;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2236 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2237
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2238 id = XCAR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2239 charset = CHARSET_FROM_ID (XINT (id));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2240 reg = Fcdr (Fassq (request, id));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2241 if (! NILP (reg))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2242 XSTRING (safe_charsets)->data[XINT (id)] = XINT (reg);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2243 else if (charset->iso_chars_96)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2244 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2245 if (reg96 < 4)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2246 XSTRING (safe_charsets)->data[XINT (id)] = reg96;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2247 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2248 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2249 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2250 if (reg94 < 4)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2251 XSTRING (safe_charsets)->data[XINT (id)] = reg94;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2252 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2253 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2254 ASET (attrs, coding_attr_safe_charsets, safe_charsets);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2255 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2256
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2257
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2258 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2259 Check if a text is encoded in ISO2022. If it is, returns an
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2260 integer in which appropriate flag bits any of:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2261 CATEGORY_MASK_ISO_7
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2262 CATEGORY_MASK_ISO_7_TIGHT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2263 CATEGORY_MASK_ISO_8_1
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2264 CATEGORY_MASK_ISO_8_2
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2265 CATEGORY_MASK_ISO_7_ELSE
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2266 CATEGORY_MASK_ISO_8_ELSE
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2267 are set. If a code which should never appear in ISO2022 is found,
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2268 returns 0. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2269
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
2270 static int
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2271 detect_coding_iso_2022 (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2272 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2273 int *mask;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2274 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2275 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2276 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2277 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2278 int mask_iso = CATEGORY_MASK_ISO;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2279 int mask_found = 0, mask_8bit_found = 0;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2280 int reg[4], shift_out = 0, single_shifting = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2281 int id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2282 int c, c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2283 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2284 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2285
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2286 for (i = coding_category_iso_7; i <= coding_category_iso_8_else; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2287 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2288 struct coding_system *this = &(coding_categories[i]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2289 Lisp_Object attrs, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2290
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2291 attrs = CODING_ID_ATTRS (this->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2292 if (CODING_ISO_FLAGS (this) & CODING_ISO_FLAG_FULL_SUPPORT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2293 && ! EQ (CODING_ATTR_SAFE_CHARSETS (attrs), Viso_2022_charset_list))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2294 setup_iso_safe_charsets (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2295 val = CODING_ATTR_SAFE_CHARSETS (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2296 this->max_charset_id = XSTRING (val)->size - 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2297 this->safe_charsets = (char *) XSTRING (val)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2298 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2299
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2300 /* A coding system of this category is always ASCII compatible. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2301 src += coding->head_ascii;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2302
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2303 reg[0] = charset_ascii, reg[1] = reg[2] = reg[3] = -1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2304 while (mask_iso && src < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2305 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2306 ONE_MORE_BYTE (c);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2307 switch (c)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2308 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2309 case ISO_CODE_ESC:
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2310 if (inhibit_iso_escape_detection)
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2311 break;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2312 single_shifting = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2313 ONE_MORE_BYTE (c);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2314 if (c >= '(' && c <= '/')
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2315 {
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2316 /* Designation sequence for a charset of dimension 1. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2317 ONE_MORE_BYTE (c1);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2318 if (c1 < ' ' || c1 >= 0x80
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2319 || (id = iso_charset_table[0][c >= ','][c1]) < 0)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2320 /* Invalid designation sequence. Just ignore. */
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2321 break;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2322 reg[(c - '(') % 4] = id;
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2323 }
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2324 else if (c == '$')
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2325 {
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2326 /* Designation sequence for a charset of dimension 2. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2327 ONE_MORE_BYTE (c);
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2328 if (c >= '@' && c <= 'B')
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2329 /* Designation for JISX0208.1978, GB2312, or JISX0208. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2330 reg[0] = id = iso_charset_table[1][0][c];
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2331 else if (c >= '(' && c <= '/')
17320
9d15bec5f47e (detect_coding_iso2022, detect_coding_mask): Ignore
Kenichi Handa <handa@m17n.org>
parents: 17304
diff changeset
2332 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2333 ONE_MORE_BYTE (c1);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2334 if (c1 < ' ' || c1 >= 0x80
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2335 || (id = iso_charset_table[1][c >= ','][c1]) < 0)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2336 /* Invalid designation sequence. Just ignore. */
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2337 break;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2338 reg[(c - '(') % 4] = id;
17320
9d15bec5f47e (detect_coding_iso2022, detect_coding_mask): Ignore
Kenichi Handa <handa@m17n.org>
parents: 17304
diff changeset
2339 }
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2340 else
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2341 /* Invalid designation sequence. Just ignore. */
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2342 break;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2343 }
23116
6736da064f4a (detect_coding_iso2022): Handle ESC N and ESC O
Kenichi Handa <handa@m17n.org>
parents: 23089
diff changeset
2344 else if (c == 'N' || c == 'O')
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2345 {
23116
6736da064f4a (detect_coding_iso2022): Handle ESC N and ESC O
Kenichi Handa <handa@m17n.org>
parents: 23089
diff changeset
2346 /* ESC <Fe> for SS2 or SS3. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2347 mask_iso &= CATEGORY_MASK_ISO_7_ELSE;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2348 break;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2349 }
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2350 else if (c >= '0' && c <= '4')
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2351 {
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2352 /* ESC <Fp> for start/end composition. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2353 mask_found |= CATEGORY_MASK_ISO;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2354 break;
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2355 }
19134
8fa6e23f8d22 (detect_coding_iso2022): Do not exclude posibility of
Kenichi Handa <handa@m17n.org>
parents: 19118
diff changeset
2356 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2357 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2358 /* Invalid escape sequence. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2359 mask_iso &= ~CATEGORY_MASK_ISO_ESCAPE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2360 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2361 }
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2362
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2363 /* We found a valid designation sequence for CHARSET. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2364 mask_iso &= ~CATEGORY_MASK_ISO_8BIT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2365 if (SAFE_CHARSET_P (&coding_categories[coding_category_iso_7],
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2366 id))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2367 mask_found |= CATEGORY_MASK_ISO_7;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2368 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2369 mask_iso &= ~CATEGORY_MASK_ISO_7;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2370 if (SAFE_CHARSET_P (&coding_categories[coding_category_iso_7_tight],
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2371 id))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2372 mask_found |= CATEGORY_MASK_ISO_7_TIGHT;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2373 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2374 mask_iso &= ~CATEGORY_MASK_ISO_7_TIGHT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2375 if (SAFE_CHARSET_P (&coding_categories[coding_category_iso_7_else],
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2376 id))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2377 mask_found |= CATEGORY_MASK_ISO_7_ELSE;
23116
6736da064f4a (detect_coding_iso2022): Handle ESC N and ESC O
Kenichi Handa <handa@m17n.org>
parents: 23089
diff changeset
2378 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2379 mask_iso &= ~CATEGORY_MASK_ISO_7_ELSE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2380 if (SAFE_CHARSET_P (&coding_categories[coding_category_iso_8_else],
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2381 id))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2382 mask_found |= CATEGORY_MASK_ISO_8_ELSE;
23116
6736da064f4a (detect_coding_iso2022): Handle ESC N and ESC O
Kenichi Handa <handa@m17n.org>
parents: 23089
diff changeset
2383 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2384 mask_iso &= ~CATEGORY_MASK_ISO_8_ELSE;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2385 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2386
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2387 case ISO_CODE_SO:
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2388 if (inhibit_iso_escape_detection)
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2389 break;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2390 single_shifting = 0;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2391 if (shift_out == 0
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2392 && (reg[1] >= 0
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2393 || SHIFT_OUT_OK (coding_category_iso_7_else)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2394 || SHIFT_OUT_OK (coding_category_iso_8_else)))
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2395 {
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2396 /* Locking shift out. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2397 mask_iso &= ~CATEGORY_MASK_ISO_7BIT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2398 mask_found |= CATEGORY_MASK_ISO_ELSE;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2399 }
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
2400 break;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2401
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2402 case ISO_CODE_SI:
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2403 if (inhibit_iso_escape_detection)
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2404 break;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2405 single_shifting = 0;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2406 if (shift_out == 1)
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2407 {
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2408 /* Locking shift in. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2409 mask_iso &= ~CATEGORY_MASK_ISO_7BIT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2410 mask_found |= CATEGORY_MASK_ISO_ELSE;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2411 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2412 break;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2413
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2414 case ISO_CODE_CSI:
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2415 single_shifting = 0;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2416 case ISO_CODE_SS2:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2417 case ISO_CODE_SS3:
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2418 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2419 int newmask = CATEGORY_MASK_ISO_8_ELSE;
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2420
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2421 if (inhibit_iso_escape_detection)
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
2422 break;
20150
402b6e5f4b58 (encode_designation_at_bol): Fix bug of finding graphic
Kenichi Handa <handa@m17n.org>
parents: 20105
diff changeset
2423 if (c != ISO_CODE_CSI)
402b6e5f4b58 (encode_designation_at_bol): Fix bug of finding graphic
Kenichi Handa <handa@m17n.org>
parents: 20105
diff changeset
2424 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2425 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_1])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2426 & CODING_ISO_FLAG_SINGLE_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2427 newmask |= CATEGORY_MASK_ISO_8_1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2428 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_2])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2429 & CODING_ISO_FLAG_SINGLE_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2430 newmask |= CATEGORY_MASK_ISO_8_2;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2431 single_shifting = 1;
20150
402b6e5f4b58 (encode_designation_at_bol): Fix bug of finding graphic
Kenichi Handa <handa@m17n.org>
parents: 20105
diff changeset
2432 }
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2433 if (VECTORP (Vlatin_extra_code_table)
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2434 && !NILP (XVECTOR (Vlatin_extra_code_table)->contents[c]))
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2435 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2436 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_1])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2437 & CODING_ISO_FLAG_LATIN_EXTRA)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2438 newmask |= CATEGORY_MASK_ISO_8_1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2439 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_2])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2440 & CODING_ISO_FLAG_LATIN_EXTRA)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2441 newmask |= CATEGORY_MASK_ISO_8_2;
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2442 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2443 mask_iso &= newmask;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2444 mask_found |= newmask;
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2445 }
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2446 break;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2447
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2448 default:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2449 if (c < 0x80)
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2450 {
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2451 single_shifting = 0;
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2452 break;
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2453 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2454 else if (c < 0xA0)
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
2455 {
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2456 single_shifting = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2457 mask_8bit_found = 1;
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2458 if (VECTORP (Vlatin_extra_code_table)
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2459 && !NILP (XVECTOR (Vlatin_extra_code_table)->contents[c]))
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
2460 {
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2461 int newmask = 0;
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2462
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2463 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_1])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2464 & CODING_ISO_FLAG_LATIN_EXTRA)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2465 newmask |= CATEGORY_MASK_ISO_8_1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2466 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_2])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2467 & CODING_ISO_FLAG_LATIN_EXTRA)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2468 newmask |= CATEGORY_MASK_ISO_8_2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2469 mask_iso &= newmask;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2470 mask_found |= newmask;
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
2471 }
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2472 else
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
2473 return 0;
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
2474 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2475 else
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2476 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2477 mask_iso &= ~(CATEGORY_MASK_ISO_7BIT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2478 | CATEGORY_MASK_ISO_7_ELSE);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2479 mask_found |= CATEGORY_MASK_ISO_8_1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2480 mask_8bit_found = 1;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2481 /* Check the length of succeeding codes of the range
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2482 0xA0..0FF. If the byte length is odd, we exclude
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2483 CATEGORY_MASK_ISO_8_2. We can check this only
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2484 when we are not single shifting. */
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2485 if (!single_shifting
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2486 && mask_iso & CATEGORY_MASK_ISO_8_2)
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2487 {
29299
b33b38d81020 (detect_coding_iso2022): Fix code for checking
Kenichi Handa <handa@m17n.org>
parents: 29275
diff changeset
2488 int i = 1;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2489 while (src < src_end)
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2490 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2491 ONE_MORE_BYTE (c);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2492 if (c < 0xA0)
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2493 break;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2494 i++;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2495 }
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2496
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2497 if (i & 1 && src < src_end)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2498 mask_iso &= ~CATEGORY_MASK_ISO_8_2;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2499 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2500 mask_found |= CATEGORY_MASK_ISO_8_2;
23088
45c36d636f66 (detect_coding_iso2022): Don't check the byte length of
Kenichi Handa <handa@m17n.org>
parents: 23082
diff changeset
2501 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2502 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2503 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2504 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2505 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2506 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2507 if (!mask_iso)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2508 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2509 *mask &= ~CATEGORY_MASK_ISO;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2510 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2511 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2512 if (!mask_found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2513 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2514 *mask &= mask_iso & mask_found;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2515 if (! mask_8bit_found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2516 *mask &= ~(CATEGORY_MASK_ISO_8BIT | CATEGORY_MASK_ISO_8_ELSE);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2517 return 1;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2518 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2519
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2520
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2521 /* Set designation state into CODING. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2522 #define DECODE_DESIGNATION(reg, dim, chars_96, final) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2523 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2524 int id, prev; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2525 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2526 if (final < '0' || final >= 128 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2527 || ((id = ISO_CHARSET_TABLE (dim, chars_96, final)) < 0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2528 || !SAFE_CHARSET_P (coding, id)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2529 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2530 CODING_ISO_DESIGNATION (coding, reg) = -2; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2531 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2532 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2533 prev = CODING_ISO_DESIGNATION (coding, reg); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2534 CODING_ISO_DESIGNATION (coding, reg) = id; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2535 /* If there was an invalid designation to REG previously, and this \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2536 designation is ASCII to REG, we should keep this designation \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2537 sequence. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2538 if (prev == -2 && id == charset_ascii) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2539 goto invalid_code; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2540 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2541
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2542
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2543 #define MAYBE_FINISH_COMPOSITION() \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2544 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2545 int i; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2546 if (composition_state == COMPOSING_NO) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2547 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2548 /* It is assured that we have enough room for producing \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2549 characters stored in the table `components'. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2550 if (charbuf + component_idx > charbuf_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2551 goto no_more_source; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2552 composition_state = COMPOSING_NO; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2553 if (method == COMPOSITION_RELATIVE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2554 || method == COMPOSITION_WITH_ALTCHARS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2555 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2556 for (i = 0; i < component_idx; i++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2557 *charbuf++ = components[i]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2558 char_offset += component_idx; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2559 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2560 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2561 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2562 for (i = 0; i < component_idx; i += 2) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2563 *charbuf++ = components[i]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2564 char_offset += (component_idx / 2) + 1; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2565 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2566 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2567
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2568
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
2569 /* Handle composition start sequence ESC 0, ESC 2, ESC 3, or ESC 4.
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
2570 ESC 0 : relative composition : ESC 0 CHAR ... ESC 1
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
2571 ESC 2 : rulebase composition : ESC 2 CHAR RULE CHAR RULE ... CHAR ESC 1
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2572 ESC 3 : altchar composition : ESC 3 CHAR ... ESC 0 CHAR ... ESC 1
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2573 ESC 4 : alt&rule composition : ESC 4 CHAR RULE ... CHAR ESC 0 CHAR ... ESC 1
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
2574 */
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2575
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2576 #define DECODE_COMPOSITION_START(c1) \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2577 do { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2578 if (c1 == '0' \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2579 && composition_state == COMPOSING_COMPONENT_CHAR) \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2580 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2581 component_len = component_idx; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2582 composition_state = COMPOSING_CHAR; \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2583 } \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2584 else \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2585 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2586 unsigned char *p; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2587 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2588 MAYBE_FINISH_COMPOSITION (); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2589 if (charbuf + MAX_COMPOSITION_COMPONENTS > charbuf_end) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2590 goto no_more_source; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2591 for (p = src; p < src_end - 1; p++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2592 if (*p == ISO_CODE_ESC && p[1] == '1') \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2593 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2594 if (p == src_end - 1) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2595 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2596 if (coding->mode & CODING_MODE_LAST_BLOCK) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2597 goto invalid_code; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2598 goto no_more_source; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2599 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2600 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2601 /* This is surely the start of a composition. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2602 method = (c1 == '0' ? COMPOSITION_RELATIVE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2603 : c1 == '2' ? COMPOSITION_WITH_RULE \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2604 : c1 == '3' ? COMPOSITION_WITH_ALTCHARS \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2605 : COMPOSITION_WITH_RULE_ALTCHARS); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2606 composition_state = (c1 <= '2' ? COMPOSING_CHAR \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2607 : COMPOSING_COMPONENT_CHAR); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2608 component_idx = component_len = 0; \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2609 } \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2610 } while (0)
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2611
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2612
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2613 /* Handle compositoin end sequence ESC 1. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2614
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2615 #define DECODE_COMPOSITION_END() \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2616 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2617 int nchars = (component_len > 0 ? component_idx - component_len \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2618 : method == COMPOSITION_RELATIVE ? component_idx \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2619 : (component_idx + 1) / 2); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2620 int i; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2621 int *saved_charbuf = charbuf; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2622 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2623 ADD_COMPOSITION_DATA (charbuf, method, nchars); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2624 if (method != COMPOSITION_RELATIVE) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2625 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2626 if (component_len == 0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2627 for (i = 0; i < component_idx; i++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2628 *charbuf++ = components[i]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2629 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2630 for (i = 0; i < component_len; i++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2631 *charbuf++ = components[i]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2632 *saved_charbuf = saved_charbuf - charbuf; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2633 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2634 if (method == COMPOSITION_WITH_RULE) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2635 for (i = 0; i < component_idx; i += 2, char_offset++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2636 *charbuf++ = components[i]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2637 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2638 for (i = component_len; i < component_idx; i++, char_offset++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2639 *charbuf++ = components[i]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2640 coding->annotated = 1; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2641 composition_state = COMPOSING_NO; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2642 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2643
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2644
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2645 /* Decode a composition rule from the byte C1 (and maybe one more byte
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2646 from SRC) and store one encoded composition rule in
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2647 coding->cmp_data. */
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2648
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2649 #define DECODE_COMPOSITION_RULE(c1) \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2650 do { \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2651 (c1) -= 32; \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2652 if (c1 < 81) /* old format (before ver.21) */ \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2653 { \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2654 int gref = (c1) / 9; \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2655 int nref = (c1) % 9; \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2656 if (gref == 4) gref = 10; \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2657 if (nref == 4) nref = 10; \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2658 c1 = COMPOSITION_ENCODE_RULE (gref, nref); \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2659 } \
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2660 else if (c1 < 93) /* new format (after ver.21) */ \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2661 { \
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2662 ONE_MORE_BYTE (c2); \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2663 c1 = COMPOSITION_ENCODE_RULE (c1 - 81, c2 - 32); \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2664 } \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2665 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2666 c1 = 0; \
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2667 } while (0)
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2668
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2669
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2670 /* See the above "GENERAL NOTES on `decode_coding_XXX ()' functions". */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2671
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2672 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2673 decode_coding_iso_2022 (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2674 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2675 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2676 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2677 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2678 unsigned char *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2679 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2680 int *charbuf_end = charbuf + coding->charbuf_size - 4;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2681 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2682 int char_offset = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2683 int multibytep = coding->src_multibyte;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2684 /* Charsets invoked to graphic plane 0 and 1 respectively. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2685 int charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2686 int charset_id_1 = CODING_ISO_INVOKED_CHARSET (coding, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2687 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2688 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2689 /* For handling composition sequence. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2690 #define COMPOSING_NO 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2691 #define COMPOSING_CHAR 1
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2692 #define COMPOSING_RULE 2
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2693 #define COMPOSING_COMPONENT_CHAR 3
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2694 #define COMPOSING_COMPONENT_RULE 4
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2695
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2696 int composition_state = COMPOSING_NO;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2697 enum composition_method method;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2698 int components[MAX_COMPOSITION_COMPONENTS * 2 + 1];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2699 int component_idx;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2700 int component_len;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2701 Lisp_Object attrs, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2702
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2703 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2704 setup_iso_safe_charsets (attrs);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2705
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2706 while (1)
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2707 {
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2708 int c1, c2;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2709
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2710 src_base = src;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2711 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2712
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2713 if (charbuf >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2714 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2715
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2716 ONE_MORE_BYTE (c1);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2717
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2718 /* We produce no character or one character. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2719 switch (iso_code_class [c1])
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2720 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2721 case ISO_0x20_or_0x7F:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2722 if (composition_state != COMPOSING_NO)
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2723 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2724 if (composition_state == COMPOSING_RULE
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2725 || composition_state == COMPOSING_COMPONENT_RULE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2726 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2727 DECODE_COMPOSITION_RULE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2728 components[component_idx++] = c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2729 composition_state--;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2730 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2731 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2732 else if (method == COMPOSITION_WITH_RULE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2733 composition_state = COMPOSING_RULE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2734 else if (method == COMPOSITION_WITH_RULE_ALTCHARS
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2735 && composition_state == COMPOSING_COMPONENT_CHAR)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2736 composition_state = COMPOSING_COMPONENT_CHAR;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2737 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2738 if (charset_id_0 < 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2739 || ! CHARSET_ISO_CHARS_96 (CHARSET_FROM_ID (charset_id_0)))
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2740 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2741 /* This is SPACE or DEL. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2742 charset = CHARSET_FROM_ID (charset_ascii);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2743 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2744 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2745 /* This is a graphic character, we fall down ... */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2746
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2747 case ISO_graphic_plane_0:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2748 if (composition_state == COMPOSING_RULE)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2749 {
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2750 DECODE_COMPOSITION_RULE (c1);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2751 components[component_idx++] = c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2752 composition_state = COMPOSING_CHAR;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2753 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2754 charset = CHARSET_FROM_ID (charset_id_0);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2755 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2756
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2757 case ISO_0xA0_or_0xFF:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2758 if (charset_id_1 < 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2759 || ! CHARSET_ISO_CHARS_96 (CHARSET_FROM_ID (charset_id_1))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2760 || CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SEVEN_BITS)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2761 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2762 /* This is a graphic character, we fall down ... */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2763
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2764 case ISO_graphic_plane_1:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2765 if (charset_id_1 < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2766 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2767 charset = CHARSET_FROM_ID (charset_id_1);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2768 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2769
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2770 case ISO_carriage_return:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2771 if (c1 == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2772 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2773 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2774 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2775 if (src == src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2776 goto no_more_source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2777 if (*src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2778 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2779 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2780 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2781 c1 = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2782 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2783 /* fall through */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2784
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2785 case ISO_control_0:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2786 MAYBE_FINISH_COMPOSITION ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2787 charset = CHARSET_FROM_ID (charset_ascii);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2788 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2789
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2790 case ISO_control_1:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2791 MAYBE_FINISH_COMPOSITION ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2792 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2793
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2794 case ISO_shift_out:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2795 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LOCKING_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2796 || CODING_ISO_DESIGNATION (coding, 1) < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2797 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2798 CODING_ISO_INVOCATION (coding, 0) = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2799 charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2800 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2801
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2802 case ISO_shift_in:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2803 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LOCKING_SHIFT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2804 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2805 CODING_ISO_INVOCATION (coding, 0) = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2806 charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2807 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2808
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2809 case ISO_single_shift_2_7:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2810 case ISO_single_shift_2:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2811 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SINGLE_SHIFT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2812 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2813 /* SS2 is handled as an escape sequence of ESC 'N' */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2814 c1 = 'N';
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2815 goto label_escape_sequence;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2816
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2817 case ISO_single_shift_3:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2818 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SINGLE_SHIFT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2819 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2820 /* SS2 is handled as an escape sequence of ESC 'O' */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2821 c1 = 'O';
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2822 goto label_escape_sequence;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2823
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2824 case ISO_control_sequence_introducer:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2825 /* CSI is handled as an escape sequence of ESC '[' ... */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2826 c1 = '[';
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2827 goto label_escape_sequence;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2828
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2829 case ISO_escape:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2830 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2831 label_escape_sequence:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2832 /* Escape sequences handled here are invocation,
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2833 designation, direction specification, and character
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2834 composition specification. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2835 switch (c1)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2836 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2837 case '&': /* revision of following character set */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2838 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2839 if (!(c1 >= '@' && c1 <= '~'))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2840 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2841 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2842 if (c1 != ISO_CODE_ESC)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2843 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2844 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2845 goto label_escape_sequence;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2846
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2847 case '$': /* designation of 2-byte character set */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2848 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_DESIGNATION))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2849 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2850 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2851 if (c1 >= '@' && c1 <= 'B')
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2852 { /* designation of JISX0208.1978, GB2312.1980,
23339
2da87b489590 (check_composing_code): Fix previous change. Now it
Kenichi Handa <handa@m17n.org>
parents: 23325
diff changeset
2853 or JISX0208.1980 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2854 DECODE_DESIGNATION (0, 2, 0, c1);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2855 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2856 else if (c1 >= 0x28 && c1 <= 0x2B)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2857 { /* designation of DIMENSION2_CHARS94 character set */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2858 ONE_MORE_BYTE (c2);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2859 DECODE_DESIGNATION (c1 - 0x28, 2, 0, c2);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2860 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2861 else if (c1 >= 0x2C && c1 <= 0x2F)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2862 { /* designation of DIMENSION2_CHARS96 character set */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2863 ONE_MORE_BYTE (c2);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2864 DECODE_DESIGNATION (c1 - 0x2C, 2, 1, c2);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2865 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2866 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2867 goto invalid_code;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2868 /* We must update these variables now. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2869 charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2870 charset_id_1 = CODING_ISO_INVOKED_CHARSET (coding, 1);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2871 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2872
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2873 case 'n': /* invocation of locking-shift-2 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2874 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LOCKING_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2875 || CODING_ISO_DESIGNATION (coding, 2) < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2876 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2877 CODING_ISO_INVOCATION (coding, 0) = 2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2878 charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2879 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2880
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2881 case 'o': /* invocation of locking-shift-3 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2882 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LOCKING_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2883 || CODING_ISO_DESIGNATION (coding, 3) < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2884 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2885 CODING_ISO_INVOCATION (coding, 0) = 3;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2886 charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2887 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2888
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2889 case 'N': /* invocation of single-shift-2 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2890 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SINGLE_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2891 || CODING_ISO_DESIGNATION (coding, 2) < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2892 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2893 charset = CHARSET_FROM_ID (CODING_ISO_DESIGNATION (coding, 2));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2894 ONE_MORE_BYTE (c1);
30578
705b94e152b1 (decode_coding_iso2022): More strict check for handling single
Kenichi Handa <handa@m17n.org>
parents: 30487
diff changeset
2895 if (c1 < 0x20 || (c1 >= 0x80 && c1 < 0xA0))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2896 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2897 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2898
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2899 case 'O': /* invocation of single-shift-3 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2900 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SINGLE_SHIFT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2901 || CODING_ISO_DESIGNATION (coding, 3) < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2902 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2903 charset = CHARSET_FROM_ID (CODING_ISO_DESIGNATION (coding, 3));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2904 ONE_MORE_BYTE (c1);
30578
705b94e152b1 (decode_coding_iso2022): More strict check for handling single
Kenichi Handa <handa@m17n.org>
parents: 30487
diff changeset
2905 if (c1 < 0x20 || (c1 >= 0x80 && c1 < 0xA0))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2906 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2907 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2908
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2909 case '0': case '2': case '3': case '4': /* start composition */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2910 if (! (coding->common_flags & CODING_ANNOTATE_COMPOSITION_MASK))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2911 goto invalid_code;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2912 DECODE_COMPOSITION_START (c1);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2913 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2914
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
2915 case '1': /* end composition */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2916 if (composition_state == COMPOSING_NO)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2917 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2918 DECODE_COMPOSITION_END ();
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2919 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2920
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2921 case '[': /* specification of direction */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2922 if (! CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_DIRECTION)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2923 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2924 /* For the moment, nested direction is not supported.
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2925 So, `coding->mode & CODING_MODE_DIRECTION' zero means
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2926 left-to-right, and nozero means right-to-left. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2927 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2928 switch (c1)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2929 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2930 case ']': /* end of the current direction */
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2931 coding->mode &= ~CODING_MODE_DIRECTION;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2932
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2933 case '0': /* end of the current direction */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2934 case '1': /* start of left-to-right direction */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2935 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2936 if (c1 == ']')
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2937 coding->mode &= ~CODING_MODE_DIRECTION;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2938 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2939 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2940 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2941
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2942 case '2': /* start of right-to-left direction */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2943 ONE_MORE_BYTE (c1);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2944 if (c1 == ']')
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
2945 coding->mode |= CODING_MODE_DIRECTION;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2946 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2947 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2948 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2949
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2950 default:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2951 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2952 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2953 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2954
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2955 default:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2956 if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_DESIGNATION))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2957 goto invalid_code;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2958 if (c1 >= 0x28 && c1 <= 0x2B)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2959 { /* designation of DIMENSION1_CHARS94 character set */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2960 ONE_MORE_BYTE (c2);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2961 DECODE_DESIGNATION (c1 - 0x28, 1, 0, c2);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2962 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2963 else if (c1 >= 0x2C && c1 <= 0x2F)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2964 { /* designation of DIMENSION1_CHARS96 character set */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2965 ONE_MORE_BYTE (c2);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2966 DECODE_DESIGNATION (c1 - 0x2C, 1, 1, c2);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2967 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2968 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2969 goto invalid_code;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2970 /* We must update these variables now. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2971 charset_id_0 = CODING_ISO_INVOKED_CHARSET (coding, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2972 charset_id_1 = CODING_ISO_INVOKED_CHARSET (coding, 1);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2973 continue;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2974 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2975 }
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2976
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2977 /* Now we know CHARSET and 1st position code C1 of a character.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2978 Produce a decoded character while getting 2nd position code
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2979 C2 if necessary. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2980 c1 &= 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2981 if (CHARSET_DIMENSION (charset) > 1)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2982 {
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2983 ONE_MORE_BYTE (c2);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2984 if (c2 < 0x20 || (c2 >= 0x80 && c2 < 0xA0))
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
2985 /* C2 is not in a valid range. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2986 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2987 c1 = (c1 << 8) | (c2 & 0x7F);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2988 if (CHARSET_DIMENSION (charset) > 2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2989 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2990 ONE_MORE_BYTE (c2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2991 if (c2 < 0x20 || (c2 >= 0x80 && c2 < 0xA0))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2992 /* C2 is not in a valid range. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2993 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2994 c1 = (c1 << 8) | (c2 & 0x7F);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2995 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2996 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2997
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2998 CODING_DECODE_CHAR (coding, src, src_base, src_end, charset, c1, c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
2999 if (c < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3000 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3001 MAYBE_FINISH_COMPOSITION ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3002 for (; src_base < src; src_base++, char_offset++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3003 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3004 if (ASCII_BYTE_P (*src_base))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3005 *charbuf++ = *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3006 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3007 *charbuf++ = BYTE8_TO_CHAR (*src_base);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3008 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3009 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3010 else if (composition_state == COMPOSING_NO)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3011 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3012 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3013 char_offset++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3014 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3015 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3016 components[component_idx++] = c;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3017 continue;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3018
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3019 invalid_code:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3020 MAYBE_FINISH_COMPOSITION ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3021 src = src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3022 consumed_chars = consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3023 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3024 *charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3025 coding->errors++;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3026 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3027
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3028 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3029 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3030 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3031 coding->charbuf_used = charbuf - coding->charbuf;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3032 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3033
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3034
18766
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
3035 /* ISO2022 encoding stuff. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3036
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3037 /*
18766
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
3038 It is not enough to say just "ISO2022" on encoding, we have to
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3039 specify more details. In Emacs, each coding system of ISO2022
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3040 variant has the following specifications:
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3041 1. Initial designation to G0 thru G3.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3042 2. Allows short-form designation?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3043 3. ASCII should be designated to G0 before control characters?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3044 4. ASCII should be designated to G0 at end of line?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3045 5. 7-bit environment or 8-bit environment?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3046 6. Use locking-shift?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3047 7. Use Single-shift?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3048 And the following two are only for Japanese:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3049 8. Use ASCII in place of JIS0201-1976-Roman?
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3050 9. Use JISX0208-1983 in place of JISX0208-1978?
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3051 These specifications are encoded in CODING_ISO_FLAGS (coding) as flag bits
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3052 defined by macros CODING_ISO_FLAG_XXX. See `coding.h' for more
18766
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
3053 details.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3054 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3055
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3056 /* Produce codes (escape sequence) for designating CHARSET to graphic
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3057 register REG at DST, and increment DST. If <final-char> of CHARSET is
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3058 '@', 'A', or 'B' and the coding system CODING allows, produce
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3059 designation sequence of short-form. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3060
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3061 #define ENCODE_DESIGNATION(charset, reg, coding) \
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3062 do { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3063 unsigned char final_char = CHARSET_ISO_FINAL (charset); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3064 char *intermediate_char_94 = "()*+"; \
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3065 char *intermediate_char_96 = ",-./"; \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3066 int revision = -1; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3067 int c; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3068 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3069 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_REVISION) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3070 revision = XINT (CHARSET_ISO_REVISION (charset)); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3071 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3072 if (revision >= 0) \
20150
402b6e5f4b58 (encode_designation_at_bol): Fix bug of finding graphic
Kenichi Handa <handa@m17n.org>
parents: 20105
diff changeset
3073 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3074 EMIT_TWO_ASCII_BYTES (ISO_CODE_ESC, '&'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3075 EMIT_ONE_BYTE ('@' + revision); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3076 } \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3077 EMIT_ONE_ASCII_BYTE (ISO_CODE_ESC); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3078 if (CHARSET_DIMENSION (charset) == 1) \
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3079 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3080 if (! CHARSET_ISO_CHARS_96 (charset)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3081 c = intermediate_char_94[reg]; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3082 else \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3083 c = intermediate_char_96[reg]; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3084 EMIT_ONE_ASCII_BYTE (c); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3085 } \
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3086 else \
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3087 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3088 EMIT_ONE_ASCII_BYTE ('$'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3089 if (! CHARSET_ISO_CHARS_96 (charset)) \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3090 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3091 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LONG_FORM \
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3092 || reg != 0 \
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3093 || final_char < '@' || final_char > 'B') \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3094 EMIT_ONE_ASCII_BYTE (intermediate_char_94[reg]); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3095 } \
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3096 else \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3097 EMIT_ONE_ASCII_BYTE (intermediate_char_96[reg]); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3098 } \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3099 EMIT_ONE_ASCII_BYTE (final_char); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3100 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3101 CODING_ISO_DESIGNATION (coding, reg) = CHARSET_ID (charset); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3102 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3103
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3104
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3105 /* The following two macros produce codes (control character or escape
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3106 sequence) for ISO2022 single-shift functions (single-shift-2 and
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3107 single-shift-3). */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3108
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3109 #define ENCODE_SINGLE_SHIFT_2 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3110 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3111 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SEVEN_BITS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3112 EMIT_TWO_ASCII_BYTES (ISO_CODE_ESC, 'N'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3113 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3114 EMIT_ONE_BYTE (ISO_CODE_SS2); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3115 CODING_ISO_SINGLE_SHIFTING (coding) = 1; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3116 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3117
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3118
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3119 #define ENCODE_SINGLE_SHIFT_3 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3120 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3121 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SEVEN_BITS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3122 EMIT_TWO_ASCII_BYTES (ISO_CODE_ESC, 'O'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3123 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3124 EMIT_ONE_BYTE (ISO_CODE_SS3); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3125 CODING_ISO_SINGLE_SHIFTING (coding) = 1; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3126 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3127
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3128
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3129 /* The following four macros produce codes (control character or
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3130 escape sequence) for ISO2022 locking-shift functions (shift-in,
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3131 shift-out, locking-shift-2, and locking-shift-3). */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3132
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3133 #define ENCODE_SHIFT_IN \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3134 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3135 EMIT_ONE_ASCII_BYTE (ISO_CODE_SI); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3136 CODING_ISO_INVOCATION (coding, 0) = 0; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3137 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3138
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3139
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3140 #define ENCODE_SHIFT_OUT \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3141 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3142 EMIT_ONE_ASCII_BYTE (ISO_CODE_SO); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3143 CODING_ISO_INVOCATION (coding, 0) = 1; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3144 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3145
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3146
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3147 #define ENCODE_LOCKING_SHIFT_2 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3148 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3149 EMIT_TWO_ASCII_BYTES (ISO_CODE_ESC, 'n'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3150 CODING_ISO_INVOCATION (coding, 0) = 2; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3151 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3152
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3153
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3154 #define ENCODE_LOCKING_SHIFT_3 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3155 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3156 EMIT_TWO_ASCII_BYTES (ISO_CODE_ESC, 'n'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3157 CODING_ISO_INVOCATION (coding, 0) = 3; \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3158 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3159
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3160
18766
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
3161 /* Produce codes for a DIMENSION1 character whose character set is
ac2e7e21abb0 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 18747
diff changeset
3162 CHARSET and whose position-code is C1. Designation and invocation
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3163 sequences are also produced in advance if necessary. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3164
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3165 #define ENCODE_ISO_CHARACTER_DIMENSION1(charset, c1) \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3166 do { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3167 int id = CHARSET_ID (charset); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3168 if (CODING_ISO_SINGLE_SHIFTING (coding)) \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3169 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3170 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SEVEN_BITS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3171 EMIT_ONE_ASCII_BYTE (c1 & 0x7F); \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3172 else \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3173 EMIT_ONE_BYTE (c1 | 0x80); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3174 CODING_ISO_SINGLE_SHIFTING (coding) = 0; \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3175 break; \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3176 } \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3177 else if (id == CODING_ISO_INVOKED_CHARSET (coding, 0)) \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3178 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3179 EMIT_ONE_ASCII_BYTE (c1 & 0x7F); \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3180 break; \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3181 } \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3182 else if (id == CODING_ISO_INVOKED_CHARSET (coding, 1)) \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3183 { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3184 EMIT_ONE_BYTE (c1 | 0x80); \
19285
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3185 break; \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3186 } \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3187 else \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3188 /* Since CHARSET is not yet invoked to any graphic planes, we \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3189 must invoke it, or, at first, designate it to some graphic \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3190 register. Then repeat the loop to actually produce the \
af3d00fde172 (Fset_terminal_coding_system_internal): Set
Kenichi Handa <handa@m17n.org>
parents: 19280
diff changeset
3191 character. */ \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3192 dst = encode_invocation_designation (charset, coding, dst, \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3193 &produced_chars); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3194 } while (1)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3195
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3196
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3197 /* Produce codes for a DIMENSION2 character whose character set is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3198 CHARSET and whose position-codes are C1 and C2. Designation and
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3199 invocation codes are also produced in advance if necessary. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3200
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3201 #define ENCODE_ISO_CHARACTER_DIMENSION2(charset, c1, c2) \
24506
219c99669e4b (ENCODE_ISO_CHARACTER): Check validity of CHARSET. If
Kenichi Handa <handa@m17n.org>
parents: 24460
diff changeset
3202 do { \
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3203 int id = CHARSET_ID (charset); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3204 if (CODING_ISO_SINGLE_SHIFTING (coding)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3205 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3206 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SEVEN_BITS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3207 EMIT_TWO_ASCII_BYTES ((c1) & 0x7F, (c2) & 0x7F); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3208 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3209 EMIT_TWO_BYTES ((c1) | 0x80, (c2) | 0x80); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3210 CODING_ISO_SINGLE_SHIFTING (coding) = 0; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3211 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3212 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3213 else if (id == CODING_ISO_INVOKED_CHARSET (coding, 0)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3214 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3215 EMIT_TWO_ASCII_BYTES ((c1) & 0x7F, (c2) & 0x7F); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3216 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3217 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3218 else if (id == CODING_ISO_INVOKED_CHARSET (coding, 1)) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3219 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3220 EMIT_TWO_BYTES ((c1) | 0x80, (c2) | 0x80); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3221 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3222 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3223 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3224 /* Since CHARSET is not yet invoked to any graphic planes, we \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3225 must invoke it, or, at first, designate it to some graphic \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3226 register. Then repeat the loop to actually produce the \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3227 character. */ \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3228 dst = encode_invocation_designation (charset, coding, dst, \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3229 &produced_chars); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3230 } while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3231
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3232
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3233 #define ENCODE_ISO_CHARACTER(charset, c) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3234 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3235 int code = ENCODE_CHAR ((charset),(c)); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3236 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3237 if (CHARSET_DIMENSION (charset) == 1) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3238 ENCODE_ISO_CHARACTER_DIMENSION1 ((charset), code); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3239 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3240 ENCODE_ISO_CHARACTER_DIMENSION2 ((charset), code >> 8, code & 0xFF); \
22119
592bb8b9bcfd Change terms unify/unification to
Kenichi Handa <handa@m17n.org>
parents: 22020
diff changeset
3241 } while (0)
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3242
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
3243
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3244 /* Produce designation and invocation codes at a place pointed by DST
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3245 to use CHARSET. The element `spec.iso_2022' of *CODING is updated.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3246 Return new DST. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3247
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3248 unsigned char *
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3249 encode_invocation_designation (charset, coding, dst, p_nchars)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3250 struct charset *charset;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3251 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3252 unsigned char *dst;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3253 int *p_nchars;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3254 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3255 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3256 int produced_chars = *p_nchars;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3257 int reg; /* graphic register number */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3258 int id = CHARSET_ID (charset);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3259
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3260 /* At first, check designations. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3261 for (reg = 0; reg < 4; reg++)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3262 if (id == CODING_ISO_DESIGNATION (coding, reg))
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3263 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3264
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3265 if (reg >= 4)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3266 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3267 /* CHARSET is not yet designated to any graphic registers. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3268 /* At first check the requested designation. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3269 reg = CODING_ISO_REQUEST (coding, id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3270 if (reg < 0)
18002
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
3271 /* Since CHARSET requests no special designation, designate it
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
3272 to graphic register 0. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3273 reg = 0;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3274
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3275 ENCODE_DESIGNATION (charset, reg, coding);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3276 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3277
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3278 if (CODING_ISO_INVOCATION (coding, 0) != reg
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3279 && CODING_ISO_INVOCATION (coding, 1) != reg)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3280 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3281 /* Since the graphic register REG is not invoked to any graphic
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3282 planes, invoke it to graphic plane 0. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3283 switch (reg)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3284 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3285 case 0: /* graphic register 0 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3286 ENCODE_SHIFT_IN;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3287 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3288
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3289 case 1: /* graphic register 1 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3290 ENCODE_SHIFT_OUT;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3291 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3292
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3293 case 2: /* graphic register 2 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3294 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SINGLE_SHIFT)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3295 ENCODE_SINGLE_SHIFT_2;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3296 else
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3297 ENCODE_LOCKING_SHIFT_2;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3298 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3299
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3300 case 3: /* graphic register 3 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3301 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_SINGLE_SHIFT)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3302 ENCODE_SINGLE_SHIFT_3;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3303 else
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3304 ENCODE_LOCKING_SHIFT_3;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3305 break;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3306 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3307 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3308
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3309 *p_nchars = produced_chars;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3310 return dst;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3311 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3312
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3313 /* The following three macros produce codes for indicating direction
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3314 of text. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3315 #define ENCODE_CONTROL_SEQUENCE_INTRODUCER \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3316 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3317 if (CODING_ISO_FLAGS (coding) == CODING_ISO_FLAG_SEVEN_BITS) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3318 EMIT_TWO_ASCII_BYTES (ISO_CODE_ESC, '['); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3319 else \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3320 EMIT_ONE_BYTE (ISO_CODE_CSI); \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3321 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3322
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3323
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3324 #define ENCODE_DIRECTION_R2L() \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3325 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3326 ENCODE_CONTROL_SEQUENCE_INTRODUCER (dst); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3327 EMIT_TWO_ASCII_BYTES ('2', ']'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3328 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3329
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3330
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3331 #define ENCODE_DIRECTION_L2R() \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3332 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3333 ENCODE_CONTROL_SEQUENCE_INTRODUCER (dst); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3334 EMIT_TWO_ASCII_BYTES ('0', ']'); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3335 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3336
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3337
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3338 /* Produce codes for designation and invocation to reset the graphic
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3339 planes and registers to initial state. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3340 #define ENCODE_RESET_PLANE_AND_REGISTER() \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3341 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3342 int reg; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3343 struct charset *charset; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3344 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3345 if (CODING_ISO_INVOCATION (coding, 0) != 0) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3346 ENCODE_SHIFT_IN; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3347 for (reg = 0; reg < 4; reg++) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3348 if (CODING_ISO_INITIAL (coding, reg) >= 0 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3349 && (CODING_ISO_DESIGNATION (coding, reg) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3350 != CODING_ISO_INITIAL (coding, reg))) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3351 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3352 charset = CHARSET_FROM_ID (CODING_ISO_INITIAL (coding, reg)); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3353 ENCODE_DESIGNATION (charset, reg, coding); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3354 } \
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3355 } while (0)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3356
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3357
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3358 /* Produce designation sequences of charsets in the line started from
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3359 SRC to a place pointed by DST, and return updated DST.
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3360
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3361 If the current block ends before any end-of-line, we may fail to
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
3362 find all the necessary designations. */
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
3363
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3364 static unsigned char *
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3365 encode_designation_at_bol (coding, charbuf, charbuf_end, dst)
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3366 struct coding_system *coding;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3367 int *charbuf, *charbuf_end;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3368 unsigned char *dst;
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3369 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3370 struct charset *charset;
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3371 /* Table of charsets to be designated to each graphic register. */
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3372 int r[4];
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3373 int c, found = 0, reg;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3374 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3375 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3376 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3377 Lisp_Object charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3378
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3379 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3380 charset_list = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3381 if (EQ (charset_list, Qiso_2022))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3382 charset_list = Viso_2022_charset_list;
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3383
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3384 for (reg = 0; reg < 4; reg++)
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3385 r[reg] = -1;
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3386
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3387 while (found < 4)
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3388 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3389 int id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3390
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3391 c = *charbuf++;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3392 if (c == '\n')
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3393 break;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3394 charset = char_charset (c, charset_list, NULL);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3395 id = CHARSET_ID (charset);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3396 reg = CODING_ISO_REQUEST (coding, id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3397 if (reg >= 0 && r[reg] < 0)
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3398 {
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3399 found++;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3400 r[reg] = id;
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3401 }
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3402 }
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3403
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3404 if (found)
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3405 {
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3406 for (reg = 0; reg < 4; reg++)
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3407 if (r[reg] >= 0
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3408 && CODING_ISO_DESIGNATION (coding, reg) != r[reg])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3409 ENCODE_DESIGNATION (CHARSET_FROM_ID (r[reg]), reg, coding);
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3410 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3411
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3412 return dst;
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3413 }
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3414
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3415 /* See the above "GENERAL NOTES on `encode_coding_XXX ()' functions". */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3416
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3417 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3418 encode_coding_iso_2022 (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3419 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3420 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3421 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3422 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3423 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3424 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3425 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3426 int safe_room = 16;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3427 int bol_designation
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3428 = (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_DESIGNATE_AT_BOL
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3429 && CODING_ISO_BOL (coding));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3430 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3431 Lisp_Object attrs, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3432 int ascii_compatible;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3433 int c;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3434
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3435 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3436
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3437 ascii_compatible = ! NILP (CODING_ATTR_ASCII_COMPAT (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3438
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3439 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3440 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3441 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3442
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3443 if (bol_designation)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3444 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3445 unsigned char *dst_prev = dst;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3446
17725
92f042f73be2 (Valternate_charset_table): The valiable deleted.
Kenichi Handa <handa@m17n.org>
parents: 17717
diff changeset
3447 /* We have to produce designation sequences if any now. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3448 dst = encode_designation_at_bol (coding, charbuf, charbuf_end, dst);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3449 bol_designation = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3450 /* We are sure that designation sequences are all ASCII bytes. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3451 produced_chars += dst - dst_prev;
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3452 }
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
3453
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3454 c = *charbuf++;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3455
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3456 /* Now encode the character C. */
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3457 if (c < 0x20 || c == 0x7F)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3458 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3459 if (c == '\n'
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3460 || (c == '\r' && EQ (eol_type, Qmac)))
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3461 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3462 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_RESET_AT_EOL)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3463 ENCODE_RESET_PLANE_AND_REGISTER ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3464 if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_INIT_AT_BOL)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3465 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3466 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3467
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3468 for (i = 0; i < 4; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3469 CODING_ISO_DESIGNATION (coding, i)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3470 = CODING_ISO_INITIAL (coding, i);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3471 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3472 bol_designation
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3473 = CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_DESIGNATE_AT_BOL;
19052
302a7b2a6948 (encode_coding_iso2022): Write out invalid multibyte
Kenichi Handa <handa@m17n.org>
parents: 18910
diff changeset
3474 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3475 else if (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_RESET_AT_CNTL)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3476 ENCODE_RESET_PLANE_AND_REGISTER ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3477 EMIT_ONE_ASCII_BYTE (c);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3478 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3479 else if (ASCII_CHAR_P (c))
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3480 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3481 if (ascii_compatible)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3482 EMIT_ONE_ASCII_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3483 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3484 ENCODE_ISO_CHARACTER (CHARSET_FROM_ID (charset_ascii), c);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3485 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3486 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3487 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3488 struct charset *charset = char_charset (c, charset_list, NULL);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3489
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3490 if (!charset)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3491 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3492 c = coding->default_char;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3493 charset = char_charset (c, charset_list, NULL);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3494 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3495 ENCODE_ISO_CHARACTER (charset, c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3496 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3497 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3498
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3499 if (coding->mode & CODING_MODE_LAST_BLOCK
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3500 && CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_RESET_AT_EOL)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3501 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3502 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3503 ENCODE_RESET_PLANE_AND_REGISTER ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3504 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3505 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3506 CODING_ISO_BOL (coding) = bol_designation;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3507 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3508 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3509 return 0;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3510 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3511
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3512
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3513 /*** 8,9. SJIS and BIG5 handlers ***/
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3514
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3515 /* Although SJIS and BIG5 are not ISO's coding system, they are used
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3516 quite widely. So, for the moment, Emacs supports them in the bare
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3517 C code. But, in the future, they may be supported only by CCL. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3518
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3519 /* SJIS is a coding system encoding three character sets: ASCII, right
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3520 half of JISX0201-Kana, and JISX0208. An ASCII character is encoded
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3521 as is. A character of charset katakana-jisx0201 is encoded by
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3522 "position-code + 0x80". A character of charset japanese-jisx0208
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3523 is encoded in 2-byte but two position-codes are divided and shifted
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3524 so that it fit in the range below.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3525
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3526 --- CODE RANGE of SJIS ---
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3527 (character set) (range)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3528 ASCII 0x00 .. 0x7F
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3529 KATAKANA-JISX0201 0xA0 .. 0xDF
24324
2eec590faf26 (Fdecode_sjis_char, Fencode_sjis_char): Hanlde
Kenichi Handa <handa@m17n.org>
parents: 24316
diff changeset
3530 JISX0208 (1st byte) 0x81 .. 0x9F and 0xE0 .. 0xEF
23564
6eb3e346d1fd (DECODE_CHARACTER_ASCII): Check validity of inserted
Kenichi Handa <handa@m17n.org>
parents: 23542
diff changeset
3531 (2nd byte) 0x40 .. 0x7E and 0x80 .. 0xFC
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3532 -------------------------------
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3533
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3534 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3535
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3536 /* BIG5 is a coding system encoding two character sets: ASCII and
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3537 Big5. An ASCII character is encoded as is. Big5 is a two-byte
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3538 character set and is encoded in two-byte.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3539
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3540 --- CODE RANGE of BIG5 ---
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3541 (character set) (range)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3542 ASCII 0x00 .. 0x7F
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3543 Big5 (1st byte) 0xA1 .. 0xFE
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3544 (2nd byte) 0x40 .. 0x7E and 0xA1 .. 0xFE
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3545 --------------------------
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3546
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3547 */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3548
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3549 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3550 Check if a text is encoded in SJIS. If it is, return
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3551 CATEGORY_MASK_SJIS, else return 0. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3552
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
3553 static int
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3554 detect_coding_sjis (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3555 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3556 int *mask;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3557 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3558 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3559 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3560 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3561 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3562 int found = 0;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3563 int c;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3564
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3565 /* A coding system of this category is always ASCII compatible. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3566 src += coding->head_ascii;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3567
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3568 while (1)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3569 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3570 ONE_MORE_BYTE (c);
36647
0a75ccbe42b2 (detect_coding_sjis): Do more rigid check.
Kenichi Handa <handa@m17n.org>
parents: 36520
diff changeset
3571 if (c < 0x80)
0a75ccbe42b2 (detect_coding_sjis): Do more rigid check.
Kenichi Handa <handa@m17n.org>
parents: 36520
diff changeset
3572 continue;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3573 if ((c >= 0x81 && c <= 0x9F) || (c >= 0xE0 && c <= 0xEF))
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3574 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3575 ONE_MORE_BYTE (c);
36647
0a75ccbe42b2 (detect_coding_sjis): Do more rigid check.
Kenichi Handa <handa@m17n.org>
parents: 36520
diff changeset
3576 if (c < 0x40 || c == 0x7F || c > 0xFC)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3577 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3578 found = 1;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3579 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3580 else if (c >= 0xA0 && c < 0xE0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3581 found = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3582 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3583 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3584 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3585 *mask &= ~CATEGORY_MASK_SJIS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3586 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3587
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3588 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3589 if (!found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3590 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3591 *mask &= CATEGORY_MASK_SJIS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3592 return 1;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3593 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3594
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3595 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3596 Check if a text is encoded in BIG5. If it is, return
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3597 CATEGORY_MASK_BIG5, else return 0. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3598
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
3599 static int
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3600 detect_coding_big5 (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3601 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3602 int *mask;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3603 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3604 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3605 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3606 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3607 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3608 int found = 0;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3609 int c;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3610
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3611 /* A coding system of this category is always ASCII compatible. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3612 src += coding->head_ascii;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3613
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3614 while (1)
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3615 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3616 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3617 if (c < 0x80)
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3618 continue;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3619 if (c >= 0xA1)
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3620 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3621 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3622 if (c < 0x40 || (c >= 0x7F && c <= 0xA0))
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3623 return 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3624 found = 1;
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3625 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3626 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3627 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3628 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3629 *mask &= ~CATEGORY_MASK_BIG5;
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3630 return 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3631
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3632 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3633 if (!found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3634 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3635 *mask &= CATEGORY_MASK_BIG5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3636 return 1;
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3637 }
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
3638
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3639 /* See the above "GENERAL NOTES on `decode_coding_XXX ()' functions".
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3640 If SJIS_P is 1, decode SJIS text, else decode BIG5 test. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3641
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3642 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3643 decode_coding_sjis (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3644 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3645 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3646 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3647 unsigned char *src_end = coding->source + coding->src_bytes;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3648 unsigned char *src_base;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3649 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3650 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3651 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3652 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3653 struct charset *charset_roman, *charset_kanji, *charset_kana;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3654 Lisp_Object attrs, eol_type, charset_list, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3655
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3656 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3657
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3658 val = charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3659 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3660 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3661 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3662
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3663 while (1)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3664 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3665 int c, c1;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3666
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3667 src_base = src;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3668 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3669
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3670 if (charbuf >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3671 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3672
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3673 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3674
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3675 if (c == '\r')
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3676 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3677 if (EQ (eol_type, Qdos))
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3678 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3679 if (src == src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3680 goto no_more_source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3681 if (*src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3682 ONE_MORE_BYTE (c);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3683 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3684 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3685 c = '\n';
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3686 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3687 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3688 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3689 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3690
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3691 if (c < 0x80)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3692 charset = charset_roman;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3693 else
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3694 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3695 if (c >= 0xF0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3696 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3697 if (c < 0xA0 || c >= 0xE0)
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3698 {
22616
c493ce6a31e4 (setup_raw_text_coding_system): New function.
Kenichi Handa <handa@m17n.org>
parents: 22529
diff changeset
3699 /* SJIS -> JISX0208 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3700 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3701 if (c1 < 0x40 || c1 == 0x7F || c1 > 0xFC)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3702 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3703 c = (c << 8) | c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3704 SJIS_TO_JIS (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3705 charset = charset_kanji;
24870
b0f6eab5deeb (decode_coding_sjis_big5): Avoid compiler warning.
Kenichi Handa <handa@m17n.org>
parents: 24822
diff changeset
3706 }
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3707 else
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3708 /* SJIS -> JISX0201-Kana */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3709 charset = charset_kana;
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3710 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3711 CODING_DECODE_CHAR (coding, src, src_base, src_end, charset, c, c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3712 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3713 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3714 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3715
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3716 invalid_code:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3717 src = src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3718 consumed_chars = consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3719 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3720 *charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3721 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3722 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3723
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3724 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3725 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3726 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3727 coding->charbuf_used = charbuf - coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3728 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3729
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3730 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3731 decode_coding_big5 (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3732 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3733 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3734 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3735 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3736 unsigned char *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3737 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3738 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3739 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3740 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3741 struct charset *charset_roman, *charset_big5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3742 Lisp_Object attrs, eol_type, charset_list, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3743
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3744 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3745 val = charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3746 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3747 charset_big5 = CHARSET_FROM_ID (XINT (XCAR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3748
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3749 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3750 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3751 int c, c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3752
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3753 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3754 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3755
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3756 if (charbuf >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3757 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3758
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3759 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3760
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3761 if (c == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3762 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3763 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3764 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3765 if (src == src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3766 goto no_more_source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3767 if (*src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3768 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3769 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3770 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3771 c = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3772 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3773 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3774 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3775 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3776 if (c < 0x80)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3777 charset = charset_roman;
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3778 else
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3779 {
22616
c493ce6a31e4 (setup_raw_text_coding_system): New function.
Kenichi Handa <handa@m17n.org>
parents: 22529
diff changeset
3780 /* BIG5 -> Big5 */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3781 if (c < 0xA1 || c > 0xFE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3782 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3783 ONE_MORE_BYTE (c1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3784 if (c1 < 0x40 || (c1 > 0x7E && c1 < 0xA1) || c1 > 0xFE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3785 goto invalid_code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3786 c = c << 8 | c1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3787 charset = charset_big5;
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3788 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3789 CODING_DECODE_CHAR (coding, src, src_base, src_end, charset, c, c);
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3790 }
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3791
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3792 *charbuf++ = c;
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3793 continue;
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
3794
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3795 invalid_code:
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3796 src = src_base;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3797 consumed_chars = consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3798 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3799 *charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3800 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3801 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3802
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3803 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3804 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3805 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3806 coding->charbuf_used = charbuf - coding->charbuf;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3807 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3808
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3809 /* See the above "GENERAL NOTES on `encode_coding_XXX ()' functions".
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3810 This function can encode charsets `ascii', `katakana-jisx0201',
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3811 `japanese-jisx0208', `chinese-big5-1', and `chinese-big5-2'. We
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3812 are sure that all these charsets are registered as official charset
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3813 (i.e. do not have extended leading-codes). Characters of other
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3814 charsets are produced without any encoding. If SJIS_P is 1, encode
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3815 SJIS text, else encode BIG5 text. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3816
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3817 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3818 encode_coding_sjis (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3819 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3820 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3821 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3822 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3823 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3824 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3825 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3826 int safe_room = 4;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3827 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3828 Lisp_Object attrs, eol_type, charset_list, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3829 int ascii_compatible;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3830 struct charset *charset_roman, *charset_kanji, *charset_kana;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3831 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3832
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3833 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3834 val = charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3835 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3836 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3837 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3838
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3839 ascii_compatible = ! NILP (CODING_ATTR_ASCII_COMPAT (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3840
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3841 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3842 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3843 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3844 c = *charbuf++;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3845 /* Now encode the character C. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3846 if (ASCII_CHAR_P (c) && ascii_compatible)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3847 EMIT_ONE_ASCII_BYTE (c);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3848 else
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3849 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3850 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3851 struct charset *charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3852
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3853 if (!charset)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3854 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3855 c = coding->default_char;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3856 charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3857 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3858 if (code == CHARSET_INVALID_CODE (charset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3859 abort ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3860 if (charset == charset_kanji)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3861 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3862 int c1, c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3863 JIS_TO_SJIS (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3864 c1 = code >> 8, c2 = code & 0xFF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3865 EMIT_TWO_BYTES (c1, c2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3866 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3867 else if (charset == charset_kana)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3868 EMIT_ONE_BYTE (code | 0x80);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3869 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3870 EMIT_ONE_ASCII_BYTE (code & 0x7F);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3871 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3872 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3873 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3874 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3875 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3876 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3877 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3878
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3879 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3880 encode_coding_big5 (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3881 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3882 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3883 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3884 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3885 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3886 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3887 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3888 int safe_room = 4;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3889 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3890 Lisp_Object attrs, eol_type, charset_list, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3891 int ascii_compatible;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3892 struct charset *charset_roman, *charset_big5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3893 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3894
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3895 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3896 val = charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3897 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3898 charset_big5 = CHARSET_FROM_ID (XINT (XCAR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3899 ascii_compatible = ! NILP (CODING_ATTR_ASCII_COMPAT (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3900
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3901 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3902 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3903 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3904 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3905 /* Now encode the character C. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3906 if (ASCII_CHAR_P (c) && ascii_compatible)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3907 EMIT_ONE_ASCII_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3908 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3909 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3910 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3911 struct charset *charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3912
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3913 if (! charset)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3914 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3915 c = coding->default_char;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3916 charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3917 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3918 if (code == CHARSET_INVALID_CODE (charset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3919 abort ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3920 if (charset == charset_big5)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3921 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3922 int c1, c2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3923
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3924 c1 = code >> 8, c2 = code & 0xFF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3925 EMIT_TWO_BYTES (c1, c2);
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
3926 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3927 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3928 EMIT_ONE_ASCII_BYTE (code & 0x7F);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3929 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3930 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3931 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3932 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3933 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3934 return 0;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3935 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3936
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3937
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3938 /*** 10. CCL handlers ***/
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
3939
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
3940 /* See the above "GENERAL NOTES on `detect_coding_XXX ()' functions".
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
3941 Check if a text is encoded in a coding system of which
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
3942 encoder/decoder are written in CCL program. If it is, return
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3943 CATEGORY_MASK_CCL, else return 0. */
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
3944
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
3945 static int
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3946 detect_coding_ccl (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3947 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3948 int *mask;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3949 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3950 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3951 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3952 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3953 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3954 int found = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3955 unsigned char *valids = CODING_CCL_VALIDS (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3956 int head_ascii = coding->head_ascii;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3957 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3958
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3959 coding = &coding_categories[coding_category_ccl];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3960 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3961 if (! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3962 src += head_ascii;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3963
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3964 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3965 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3966 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3967 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3968 if (! valids[c])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3969 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3970 if (!found && valids[c] > 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3971 found = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3972 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3973 *mask &= ~CATEGORY_MASK_CCL;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3974 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3975
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3976 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3977 if (!found)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3978 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3979 *mask &= CATEGORY_MASK_CCL;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3980 return 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3981 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3982
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3983 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3984 decode_coding_ccl (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3985 struct coding_system *coding;
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
3986 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3987 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3988 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3989 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3990 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3991 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3992 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3993 struct ccl_program ccl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3994 int source_charbuf[1024];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3995 int source_byteidx[1024];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3996
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3997 setup_ccl_program (&ccl, CODING_CCL_DECODER (coding));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3998
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
3999 while (src < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4000 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4001 unsigned char *p = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4002 int *source, *source_end;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4003 int i = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4004
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4005 if (multibytep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4006 while (i < 1024 && p < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4007 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4008 source_byteidx[i] = p - src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4009 source_charbuf[i++] = STRING_CHAR_ADVANCE (p);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4010 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4011 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4012 while (i < 1024 && p < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4013 source_charbuf[i++] = *p++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4014
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4015 if (p == src_end && coding->mode & CODING_MODE_LAST_BLOCK)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4016 ccl.last_block = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4017
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4018 source = source_charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4019 source_end = source + i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4020 while (source < source_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4021 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4022 ccl_driver (&ccl, source, charbuf,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4023 source_end - source, charbuf_end - charbuf);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4024 source += ccl.consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4025 charbuf += ccl.produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4026 if (ccl.status != CCL_STAT_SUSPEND_BY_DST)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4027 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4028 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4029 if (source < source_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4030 src += source_byteidx[source - source_charbuf];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4031 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4032 src = p;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4033 consumed_chars += source - source_charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4034
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4035 if (ccl.status != CCL_STAT_SUSPEND_BY_SRC
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4036 && ccl.status != CODING_RESULT_INSUFFICIENT_SRC)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4037 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4038 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4039
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4040 switch (ccl.status)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4041 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4042 case CCL_STAT_SUSPEND_BY_SRC:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4043 coding->result = CODING_RESULT_INSUFFICIENT_SRC;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4044 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4045 case CCL_STAT_SUSPEND_BY_DST:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4046 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4047 case CCL_STAT_QUIT:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4048 case CCL_STAT_INVALID_CMD:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4049 coding->result = CODING_RESULT_INTERRUPT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4050 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4051 default:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4052 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4053 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4054 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4055 coding->consumed_char += consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4056 coding->consumed = src - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4057 coding->charbuf_used = charbuf - coding->charbuf;
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4058 }
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4059
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4060 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4061 encode_coding_ccl (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4062 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4063 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4064 struct ccl_program ccl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4065 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4066 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4067 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4068 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4069 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4070 unsigned char *adjusted_dst_end = dst_end - 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4071 int destination_charbuf[1024];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4072 int i, produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4073
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4074 setup_ccl_program (&ccl, CODING_CCL_ENCODER (coding));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4075
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4076 ccl.last_block = coding->mode & CODING_MODE_LAST_BLOCK;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4077 ccl.dst_multibyte = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4078
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4079 while (charbuf < charbuf_end && dst < adjusted_dst_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4080 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4081 int dst_bytes = dst_end - dst;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4082 if (dst_bytes > 1024)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4083 dst_bytes = 1024;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4084
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4085 ccl_driver (&ccl, charbuf, destination_charbuf,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4086 charbuf_end - charbuf, dst_bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4087 charbuf += ccl.consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4088 if (multibytep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4089 for (i = 0; i < ccl.produced; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4090 EMIT_ONE_BYTE (destination_charbuf[i] & 0xFF);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4091 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4092 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4093 for (i = 0; i < ccl.produced; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4094 *dst++ = destination_charbuf[i] & 0xFF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4095 produced_chars += ccl.produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4096 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4097 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4098
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4099 switch (ccl.status)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4100 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4101 case CCL_STAT_SUSPEND_BY_SRC:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4102 coding->result = CODING_RESULT_INSUFFICIENT_SRC;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4103 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4104 case CCL_STAT_SUSPEND_BY_DST:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4105 coding->result = CODING_RESULT_INSUFFICIENT_DST;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4106 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4107 case CCL_STAT_QUIT:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4108 case CCL_STAT_INVALID_CMD:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4109 coding->result = CODING_RESULT_INTERRUPT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4110 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4111 default:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4112 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4113 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4114 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4115
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4116 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4117 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4118 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4119 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4120
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4121
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4122
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4123 /*** 10, 11. no-conversion handlers ***/
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4124
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4125 /* See the above "GENERAL NOTES on `decode_coding_XXX ()' functions". */
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4126
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4127 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4128 decode_coding_raw_text (coding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4129 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4130 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4131 coding->chars_at_source = 1;
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
4132 coding->consumed_char = 0;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
4133 coding->consumed = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4134 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4135 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4136
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4137 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4138 encode_coding_raw_text (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4139 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4140 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4141 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4142 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4143 int *charbuf_end = coding->charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4144 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4145 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4146 int produced_chars = 0;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4147 int c;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4148
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4149 if (multibytep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4150 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4151 int safe_room = MAX_MULTIBYTE_LENGTH * 2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4152
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4153 if (coding->src_multibyte)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4154 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4155 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4156 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4157 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4158 if (ASCII_CHAR_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4159 EMIT_ONE_ASCII_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4160 else if (CHAR_BYTE8_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4161 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4162 c = CHAR_TO_BYTE8 (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4163 EMIT_ONE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4164 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4165 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4166 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4167 unsigned char str[MAX_MULTIBYTE_LENGTH], *p0 = str, *p1 = str;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4168
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4169 CHAR_STRING_ADVANCE (c, p1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4170 while (p0 < p1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4171 EMIT_ONE_BYTE (*p0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4172 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4173 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4174 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4175 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4176 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4177 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4178 c = *charbuf++;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4179 EMIT_ONE_BYTE (c);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4180 }
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4181 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4182 else
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4183 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4184 if (coding->src_multibyte)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4185 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4186 int safe_room = MAX_MULTIBYTE_LENGTH;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4187
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4188 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4189 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4190 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4191 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4192 if (ASCII_CHAR_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4193 *dst++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4194 else if (CHAR_BYTE8_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4195 *dst++ = CHAR_TO_BYTE8 (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4196 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4197 CHAR_STRING_ADVANCE (c, dst);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4198 produced_chars++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4199 }
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4200 }
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
4201 else
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4202 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4203 ASSURE_DESTINATION (charbuf_end - charbuf);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4204 while (charbuf < charbuf_end && dst < dst_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4205 *dst++ = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4206 produced_chars = dst - (coding->destination + coding->dst_bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4207 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4208 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4209 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4210 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4211 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4212 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4213 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4214
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4215 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4216 detect_coding_charset (coding, mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4217 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4218 int *mask;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4219 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4220 unsigned char *src = coding->source, *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4221 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4222 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4223 int consumed_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4224 Lisp_Object attrs, valids;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4225
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4226 coding = &coding_categories[coding_category_charset];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4227 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4228 valids = AREF (attrs, coding_attr_charset_valids);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4229
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4230 if (! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4231 src += coding->head_ascii;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4232
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4233 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4234 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4235 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4236
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4237 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4238 if (NILP (AREF (valids, c)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4239 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4240 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4241 *mask &= ~CATEGORY_MASK_CHARSET;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4242 return 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4243
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4244 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4245 *mask &= CATEGORY_MASK_CHARSET;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4246 return 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4247 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4248
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4249 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4250 decode_coding_charset (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4251 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4252 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4253 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4254 unsigned char *src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4255 unsigned char *src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4256 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4257 int *charbuf_end = charbuf + coding->charbuf_size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4258 int consumed_chars = 0, consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4259 int multibytep = coding->src_multibyte;
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4260 Lisp_Object attrs, eol_type, charset_list, valids;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4261
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4262 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4263 valids = AREF (attrs, coding_attr_charset_valids);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4264
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4265 while (1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4266 {
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4267 int c;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4268
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4269 src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4270 consumed_chars_base = consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4271
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4272 if (charbuf >= charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4273 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4274
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4275 ONE_MORE_BYTE (c);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4276 if (c == '\r')
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4277 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4278 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4279 {
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4280 if (src < src_end
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4281 && *src == '\n')
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4282 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4283 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4284 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4285 c = '\n';
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4286 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4287 else
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4288 {
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4289 Lisp_Object val;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4290 struct charset *charset;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4291 int c1;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4292
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4293 val = AREF (valids, c);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4294 if (NILP (val))
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4295 goto invalid_code;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4296 charset = CHARSET_FROM_ID (XFASTINT (val));
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4297 if (CHARSET_DIMENSION (charset) > 1)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4298 {
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4299 ONE_MORE_BYTE (c1);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4300 c = (c << 8) | c1;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4301 if (CHARSET_DIMENSION (charset) > 2)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4302 {
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4303 ONE_MORE_BYTE (c1);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4304 c = (c << 8) | c1;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4305 if (CHARSET_DIMENSION (charset) > 3)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4306 {
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4307 ONE_MORE_BYTE (c1);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4308 c = (c << 8) | c1;
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4309 }
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4310 }
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4311 }
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4312 CODING_DECODE_CHAR (coding, src, src_base, src_end, charset, c, c);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4313 if (c < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4314 goto invalid_code;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
4315 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4316 *charbuf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4317 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4318
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4319 invalid_code:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4320 src = src_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4321 consumed_chars = consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4322 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4323 *charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4324 coding->errors++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4325 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4326
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4327 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4328 coding->consumed_char += consumed_chars_base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4329 coding->consumed = src_base - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4330 coding->charbuf_used = charbuf - coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4331 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4332
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4333 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4334 encode_coding_charset (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4335 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4336 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4337 int multibytep = coding->dst_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4338 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4339 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4340 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4341 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4342 int safe_room = MAX_MULTIBYTE_LENGTH;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4343 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4344 Lisp_Object attrs, eol_type, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4345 int ascii_compatible;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4346 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4347
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4348 CODING_GET_INFO (coding, attrs, eol_type, charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4349 ascii_compatible = ! NILP (CODING_ATTR_ASCII_COMPAT (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4350
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4351 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4352 {
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4353 struct charset *charset;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4354 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4355
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4356 ASSURE_DESTINATION (safe_room);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4357 c = *charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4358 if (ascii_compatible && ASCII_CHAR_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4359 EMIT_ONE_ASCII_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4360 else
88465
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4361 {
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4362 charset = char_charset (c, charset_list, &code);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4363 if (charset)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4364 {
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4365 if (CHARSET_DIMENSION (charset) == 1)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4366 EMIT_ONE_BYTE (code);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4367 else if (CHARSET_DIMENSION (charset) == 2)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4368 EMIT_TWO_BYTES (code >> 8, code & 0xFF);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4369 else if (CHARSET_DIMENSION (charset) == 3)
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4370 EMIT_THREE_BYTES (code >> 16, (code >> 8) & 0xFF, code & 0xFF);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4371 else
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4372 EMIT_FOUR_BYTES (code >> 24, (code >> 16) & 0xFF,
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4373 (code >> 8) & 0xFF, code & 0xFF);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4374 }
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4375 else
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4376 EMIT_ONE_BYTE (coding->default_char);
ae455bb40718 (decode_coding_charset, encode_coding_charset): Handle
Kenichi Handa <handa@m17n.org>
parents: 88456
diff changeset
4377 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4378 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4379
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4380 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4381 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4382 coding->produced = dst - coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4383 return 0;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4384 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4385
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4386
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4387 /*** 7. C library functions ***/
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4388
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4389 /* In Emacs Lisp, coding system is represented by a Lisp symbol which
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4390 has a property `coding-system'. The value of this property is a
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4391 vector of length 5 (called as coding-vector). Among elements of
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4392 this vector, the first (element[0]) and the fifth (element[4])
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4393 carry important information for decoding/encoding. Before
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4394 decoding/encoding, this information should be set in fields of a
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4395 structure of type `coding_system'.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4396
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4397 A value of property `coding-system' can be a symbol of another
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4398 subsidiary coding-system. In that case, Emacs gets coding-vector
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4399 from that symbol.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4400
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4401 `element[0]' contains information to be set in `coding->type'. The
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4402 value and its meaning is as follows:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4403
17835
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4404 0 -- coding_type_emacs_mule
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4405 1 -- coding_type_sjis
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4406 2 -- coding_type_iso_2022
17835
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4407 3 -- coding_type_big5
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4408 4 -- coding_type_ccl encoder/decoder written in CCL
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4409 nil -- coding_type_no_conversion
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4410 t -- coding_type_undecided (automatic conversion on decoding,
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4411 no-conversion on encoding)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4412
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4413 `element[4]' contains information to be set in `coding->flags' and
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4414 `coding->spec'. The meaning varies by `coding->type'.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4415
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4416 If `coding->type' is `coding_type_iso_2022', element[4] is a vector
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4417 of length 32 (of which the first 13 sub-elements are used now).
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4418 Meanings of these sub-elements are:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4419
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4420 sub-element[N] where N is 0 through 3: to be set in `coding->spec.iso_2022'
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4421 If the value is an integer of valid charset, the charset is
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4422 assumed to be designated to graphic register N initially.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4423
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4424 If the value is minus, it is a minus value of charset which
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4425 reserves graphic register N, which means that the charset is
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4426 not designated initially but should be designated to graphic
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4427 register N just before encoding a character in that charset.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4428
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4429 If the value is nil, graphic register N is never used on
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4430 encoding.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4431
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4432 sub-element[N] where N is 4 through 11: to be set in `coding->flags'
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4433 Each value takes t or nil. See the section ISO2022 of
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4434 `coding.h' for more information.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4435
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4436 If `coding->type' is `coding_type_big5', element[4] is t to denote
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4437 BIG5-ETen or nil to denote BIG5-HKU.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4438
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4439 If `coding->type' takes the other value, element[4] is ignored.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4440
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4441 Emacs Lisp's coding system also carries information about format of
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4442 end-of-line in a value of property `eol-type'. If the value is
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4443 integer, 0 means eol_lf, 1 means eol_crlf, and 2 means eol_cr. If
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4444 it is not integer, it should be a vector of subsidiary coding
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4445 systems of which property `eol-type' has one of above values.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4446
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4447 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4448
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4449 /* Setup coding context CODING from information about CODING_SYSTEM.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4450 If CODING_SYSTEM is nil, `no-conversion' is assumed. If
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4451 CODING_SYSTEM is invalid, signal an error. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4452
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4453 void
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
4454 setup_coding_system (coding_system, coding)
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
4455 Lisp_Object coding_system;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4456 struct coding_system *coding;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4457 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4458 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4459 Lisp_Object eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4460 Lisp_Object coding_type;
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
4461 Lisp_Object val;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4462
24460
be35d27a4bfb (setup_coding_system): Check for CODING_SYSTEM = nil.
Kenichi Handa <handa@m17n.org>
parents: 24425
diff changeset
4463 if (NILP (coding_system))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4464 coding_system = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4465
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4466 CHECK_CODING_SYSTEM_GET_ID (coding_system, coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4467
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4468 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4469 eol_type = CODING_ID_EOL_TYPE (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4470
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4471 coding->mode = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4472 coding->head_ascii = -1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4473 coding->common_flags
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4474 = (VECTORP (eol_type) ? CODING_REQUIRE_DETECTION_MASK : 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4475
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4476 val = CODING_ATTR_SAFE_CHARSETS (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4477 coding->max_charset_id = XSTRING (val)->size - 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4478 coding->safe_charsets = (char *) XSTRING (val)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4479 coding->default_char = XINT (CODING_ATTR_DEFAULT_CHAR (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4480
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4481 coding_type = CODING_ATTR_TYPE (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4482 if (EQ (coding_type, Qundecided))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4483 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4484 coding->detector = NULL;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4485 coding->decoder = decode_coding_raw_text;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4486 coding->encoder = encode_coding_raw_text;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4487 coding->common_flags |= CODING_REQUIRE_DETECTION_MASK;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4488 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4489 else if (EQ (coding_type, Qiso_2022))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4490 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4491 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4492 int flags = XINT (AREF (attrs, coding_attr_iso_flags));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4493
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4494 /* Invoke graphic register 0 to plane 0. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4495 CODING_ISO_INVOCATION (coding, 0) = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4496 /* Invoke graphic register 1 to plane 1 if we can use 8-bit. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4497 CODING_ISO_INVOCATION (coding, 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4498 = (flags & CODING_ISO_FLAG_SEVEN_BITS ? -1 : 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4499 /* Setup the initial status of designation. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4500 for (i = 0; i < 4; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4501 CODING_ISO_DESIGNATION (coding, i) = CODING_ISO_INITIAL (coding, i);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4502 /* Not single shifting initially. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4503 CODING_ISO_SINGLE_SHIFTING (coding) = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4504 /* Beginning of buffer should also be regarded as bol. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4505 CODING_ISO_BOL (coding) = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4506 coding->detector = detect_coding_iso_2022;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4507 coding->decoder = decode_coding_iso_2022;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4508 coding->encoder = encode_coding_iso_2022;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4509 if (flags & CODING_ISO_FLAG_SAFE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4510 coding->mode |= CODING_MODE_SAFE_ENCODING;
20227
71008f909642 (setup_coding_system): Initialize common_flags member
Kenichi Handa <handa@m17n.org>
parents: 20150
diff changeset
4511 coding->common_flags
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4512 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4513 | CODING_REQUIRE_FLUSHING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4514 if (flags & CODING_ISO_FLAG_COMPOSITION)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4515 coding->common_flags |= CODING_ANNOTATE_COMPOSITION_MASK;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4516 if (flags & CODING_ISO_FLAG_FULL_SUPPORT)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4517 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4518 setup_iso_safe_charsets (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4519 val = CODING_ATTR_SAFE_CHARSETS (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4520 coding->max_charset_id = XSTRING (val)->size - 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4521 coding->safe_charsets = (char *) XSTRING (val)->data;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4522 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4523 CODING_ISO_FLAGS (coding) = flags;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4524 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4525 else if (EQ (coding_type, Qcharset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4526 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4527 coding->detector = detect_coding_charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4528 coding->decoder = decode_coding_charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4529 coding->encoder = encode_coding_charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4530 coding->common_flags
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4531 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4532 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4533 else if (EQ (coding_type, Qutf_8))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4534 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4535 coding->detector = detect_coding_utf_8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4536 coding->decoder = decode_coding_utf_8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4537 coding->encoder = encode_coding_utf_8;
34888
b469d29c0815 (SAFE_ONE_MORE_BYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34813
diff changeset
4538 coding->common_flags
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4539 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4540 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4541 else if (EQ (coding_type, Qutf_16))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4542 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4543 val = AREF (attrs, coding_attr_utf_16_bom);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4544 CODING_UTF_16_BOM (coding) = (CONSP (val) ? utf_16_detect_bom
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4545 : EQ (val, Qt) ? utf_16_with_bom
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4546 : utf_16_without_bom);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4547 val = AREF (attrs, coding_attr_utf_16_endian);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4548 CODING_UTF_16_ENDIAN (coding) = (NILP (val) ? utf_16_big_endian
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4549 : utf_16_little_endian);
88438
3a34b722dd71 (encode_coding_utf_8): Initialize produced_chars to 0.
Kenichi Handa <handa@m17n.org>
parents: 88430
diff changeset
4550 CODING_UTF_16_SURROGATE (coding) = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4551 coding->detector = detect_coding_utf_16;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4552 coding->decoder = decode_coding_utf_16;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4553 coding->encoder = encode_coding_utf_16;
20227
71008f909642 (setup_coding_system): Initialize common_flags member
Kenichi Handa <handa@m17n.org>
parents: 20150
diff changeset
4554 coding->common_flags
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4555 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4556 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4557 else if (EQ (coding_type, Qccl))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4558 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4559 coding->detector = detect_coding_ccl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4560 coding->decoder = decode_coding_ccl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4561 coding->encoder = encode_coding_ccl;
20227
71008f909642 (setup_coding_system): Initialize common_flags member
Kenichi Handa <handa@m17n.org>
parents: 20150
diff changeset
4562 coding->common_flags
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4563 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4564 | CODING_REQUIRE_FLUSHING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4565 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4566 else if (EQ (coding_type, Qemacs_mule))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4567 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4568 coding->detector = detect_coding_emacs_mule;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4569 coding->decoder = decode_coding_emacs_mule;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4570 coding->encoder = encode_coding_emacs_mule;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4571 coding->common_flags
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4572 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4573 if (! NILP (AREF (attrs, coding_attr_emacs_mule_full))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4574 && ! EQ (CODING_ATTR_CHARSET_LIST (attrs), Vemacs_mule_charset_list))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4575 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4576 Lisp_Object tail, safe_charsets;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4577 int max_charset_id = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4578
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4579 for (tail = Vemacs_mule_charset_list; CONSP (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4580 tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4581 if (max_charset_id < XFASTINT (XCAR (tail)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4582 max_charset_id = XFASTINT (XCAR (tail));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4583 safe_charsets = Fmake_string (make_number (max_charset_id + 1),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4584 make_number (255));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4585 for (tail = Vemacs_mule_charset_list; CONSP (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4586 tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4587 XSTRING (safe_charsets)->data[XFASTINT (XCAR (tail))] = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4588 coding->max_charset_id = max_charset_id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4589 coding->safe_charsets = (char *) XSTRING (safe_charsets)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4590 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4591 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4592 else if (EQ (coding_type, Qshift_jis))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4593 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4594 coding->detector = detect_coding_sjis;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4595 coding->decoder = decode_coding_sjis;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4596 coding->encoder = encode_coding_sjis;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4597 coding->common_flags
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4598 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4599 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4600 else if (EQ (coding_type, Qbig5))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4601 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4602 coding->detector = detect_coding_big5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4603 coding->decoder = decode_coding_big5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4604 coding->encoder = encode_coding_big5;
20227
71008f909642 (setup_coding_system): Initialize common_flags member
Kenichi Handa <handa@m17n.org>
parents: 20150
diff changeset
4605 coding->common_flags
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4606 |= (CODING_REQUIRE_DECODING_MASK | CODING_REQUIRE_ENCODING_MASK);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4607 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4608 else /* EQ (coding_type, Qraw_text) */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4609 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4610 coding->detector = NULL;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4611 coding->decoder = decode_coding_raw_text;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4612 coding->encoder = encode_coding_raw_text;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4613 coding->common_flags |= CODING_FOR_UNIBYTE_MASK;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4614 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4615
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4616 return;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4617 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4618
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4619 /* Return raw-text or one of its subsidiaries that has the same
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4620 eol_type as CODING-SYSTEM. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4621
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4622 Lisp_Object
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4623 raw_text_coding_system (coding_system)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4624 Lisp_Object coding_system;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
4625 {
88430
6418a272b97e * coding.c: Delete unused variables.
Kenichi Handa <handa@m17n.org>
parents: 88365
diff changeset
4626 Lisp_Object spec, attrs;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4627 Lisp_Object eol_type, raw_text_eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4628
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4629 spec = CODING_SYSTEM_SPEC (coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4630 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4631
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4632 if (EQ (CODING_ATTR_TYPE (attrs), Qraw_text))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4633 return coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4634
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4635 eol_type = AREF (spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4636 if (VECTORP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4637 return Qraw_text;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4638 spec = CODING_SYSTEM_SPEC (Qraw_text);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4639 raw_text_eol_type = AREF (spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4640 return (EQ (eol_type, Qunix) ? AREF (raw_text_eol_type, 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4641 : EQ (eol_type, Qdos) ? AREF (raw_text_eol_type, 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4642 : AREF (raw_text_eol_type, 2));
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
4643 }
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
4644
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4645
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4646 /* If CODING_SYSTEM doesn't specify end-of-line format but PARENT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4647 does, return one of the subsidiary that has the same eol-spec as
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4648 PARENT. Otherwise, return CODING_SYSTEM. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4649
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4650 Lisp_Object
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4651 coding_inherit_eol_type (coding_system, parent)
88473
b47ee8b1ce03 (coding_inherit_eol_type)
Dave Love <fx@gnu.org>
parents: 88465
diff changeset
4652 Lisp_Object coding_system, parent;
22616
c493ce6a31e4 (setup_raw_text_coding_system): New function.
Kenichi Handa <handa@m17n.org>
parents: 22529
diff changeset
4653 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4654 Lisp_Object spec, attrs, eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4655
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4656 spec = CODING_SYSTEM_SPEC (coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4657 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4658 eol_type = AREF (spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4659 if (VECTORP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4660 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4661 Lisp_Object parent_spec;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4662 Lisp_Object parent_eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4663
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4664 parent_spec
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4665 = CODING_SYSTEM_SPEC (buffer_defaults.buffer_file_coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4666 parent_eol_type = AREF (parent_spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4667 if (EQ (parent_eol_type, Qunix))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4668 coding_system = AREF (eol_type, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4669 else if (EQ (parent_eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4670 coding_system = AREF (eol_type, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4671 else if (EQ (parent_eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4672 coding_system = AREF (eol_type, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4673 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4674 return coding_system;
22616
c493ce6a31e4 (setup_raw_text_coding_system): New function.
Kenichi Handa <handa@m17n.org>
parents: 22529
diff changeset
4675 }
c493ce6a31e4 (setup_raw_text_coding_system): New function.
Kenichi Handa <handa@m17n.org>
parents: 22529
diff changeset
4676
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4677 /* Emacs has a mechanism to automatically detect a coding system if it
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4678 is one of Emacs' internal format, ISO2022, SJIS, and BIG5. But,
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4679 it's impossible to distinguish some coding systems accurately
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4680 because they use the same range of codes. So, at first, coding
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4681 systems are categorized into 7, those are:
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4682
17835
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4683 o coding-category-emacs-mule
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4684
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4685 The category for a coding system which has the same code range
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4686 as Emacs' internal format. Assigned the coding-system (Lisp
17835
f36ffb6f1208 Name change through the code:
Kenichi Handa <handa@m17n.org>
parents: 17725
diff changeset
4687 symbol) `emacs-mule' by default.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4688
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4689 o coding-category-sjis
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4690
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4691 The category for a coding system which has the same code range
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4692 as SJIS. Assigned the coding-system (Lisp
18787
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4693 symbol) `japanese-shift-jis' by default.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4694
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4695 o coding-category-iso-7
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4696
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4697 The category for a coding system which has the same code range
18787
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4698 as ISO2022 of 7-bit environment. This doesn't use any locking
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4699 shift and single shift functions. This can encode/decode all
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4700 charsets. Assigned the coding-system (Lisp symbol)
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4701 `iso-2022-7bit' by default.
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4702
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4703 o coding-category-iso-7-tight
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4704
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4705 Same as coding-category-iso-7 except that this can
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4706 encode/decode only the specified charsets.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4707
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4708 o coding-category-iso-8-1
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4709
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4710 The category for a coding system which has the same code range
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4711 as ISO2022 of 8-bit environment and graphic plane 1 used only
18787
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4712 for DIMENSION1 charset. This doesn't use any locking shift
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4713 and single shift functions. Assigned the coding-system (Lisp
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4714 symbol) `iso-latin-1' by default.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4715
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4716 o coding-category-iso-8-2
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4717
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4718 The category for a coding system which has the same code range
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4719 as ISO2022 of 8-bit environment and graphic plane 1 used only
18787
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4720 for DIMENSION2 charset. This doesn't use any locking shift
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4721 and single shift functions. Assigned the coding-system (Lisp
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4722 symbol) `japanese-iso-8bit' by default.
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4723
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4724 o coding-category-iso-7-else
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4725
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4726 The category for a coding system which has the same code range
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4727 as ISO2022 of 7-bit environemnt but uses locking shift or
18787
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4728 single shift functions. Assigned the coding-system (Lisp
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4729 symbol) `iso-2022-7bit-lock' by default.
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4730
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4731 o coding-category-iso-8-else
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4732
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4733 The category for a coding system which has the same code range
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4734 as ISO2022 of 8-bit environemnt but uses locking shift or
18787
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4735 single shift functions. Assigned the coding-system (Lisp
954e6be0a757 (detect_coding_iso2022): Distinguish coding-category-iso-7-else and
Kenichi Handa <handa@m17n.org>
parents: 18766
diff changeset
4736 symbol) `iso-2022-8bit-ss2' by default.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4737
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4738 o coding-category-big5
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4739
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4740 The category for a coding system which has the same code range
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4741 as BIG5. Assigned the coding-system (Lisp symbol)
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
4742 `cn-big5' by default.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4743
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4744 o coding-category-utf-8
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4745
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4746 The category for a coding system which has the same code range
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4747 as UTF-8 (cf. RFC2279). Assigned the coding-system (Lisp
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4748 symbol) `utf-8' by default.
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4749
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4750 o coding-category-utf-16-be
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4751
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4752 The category for a coding system in which a text has an
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4753 Unicode signature (cf. Unicode Standard) in the order of BIG
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4754 endian at the head. Assigned the coding-system (Lisp symbol)
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4755 `utf-16-be' by default.
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4756
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4757 o coding-category-utf-16-le
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4758
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4759 The category for a coding system in which a text has an
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4760 Unicode signature (cf. Unicode Standard) in the order of
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4761 LITTLE endian at the head. Assigned the coding-system (Lisp
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4762 symbol) `utf-16-le' by default.
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4763
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4764 o coding-category-ccl
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4765
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4766 The category for a coding system of which encoder/decoder is
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4767 written in CCL programs. The default value is nil, i.e., no
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4768 coding system is assigned.
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
4769
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4770 o coding-category-binary
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4771
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4772 The category for a coding system not categorized in any of the
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4773 above. Assigned the coding-system (Lisp symbol)
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
4774 `no-conversion' by default.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4775
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4776 Each of them is a Lisp symbol and the value is an actual
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4777 `coding-system's (this is also a Lisp symbol) assigned by a user.
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4778 What Emacs does actually is to detect a category of coding system.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4779 Then, it uses a `coding-system' assigned to it. If Emacs can't
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4780 decide only one possible category, it selects a category of the
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4781 highest priority. Priorities of categories are also specified by a
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4782 user in a Lisp variable `coding-category-list'.
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4783
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4784 */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4785
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4786 #define EOL_SEEN_NONE 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4787 #define EOL_SEEN_LF 1
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4788 #define EOL_SEEN_CR 2
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4789 #define EOL_SEEN_CRLF 4
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4790
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4791 /* Detect how end-of-line of a text of length CODING->src_bytes
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4792 pointed by CODING->source is encoded. Return one of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4793 EOL_SEEN_XXX. */
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4794
19173
04ed7c3f5cee (detect_eol_type): If EOL representation does not
Richard M. Stallman <rms@gnu.org>
parents: 19134
diff changeset
4795 #define MAX_EOL_CHECK_COUNT 3
04ed7c3f5cee (detect_eol_type): If EOL representation does not
Richard M. Stallman <rms@gnu.org>
parents: 19134
diff changeset
4796
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4797 static int
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4798 detect_eol (coding, source, src_bytes)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4799 struct coding_system *coding;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4800 unsigned char *source;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4801 EMACS_INT src_bytes;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4802 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4803 Lisp_Object attrs, coding_type;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4804 unsigned char *src = source, *src_end = src + src_bytes;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4805 unsigned char c;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4806 int total = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4807 int eol_seen = EOL_SEEN_NONE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4808
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4809 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4810 coding_type = CODING_ATTR_TYPE (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4811
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4812 if (EQ (coding_type, Qccl))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4813 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4814 int msb, lsb;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4815
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4816 msb = coding->spec.utf_16.endian == utf_16_little_endian;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4817 lsb = 1 - msb;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4818
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4819 while (src + 1 < src_end)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4820 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4821 c = src[lsb];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4822 if (src[msb] == 0 && (c == '\n' || c == '\r'))
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4823 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4824 int this_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4825
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4826 if (c == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4827 this_eol = EOL_SEEN_LF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4828 else if (src + 3 >= src_end
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4829 || src[msb + 2] != 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4830 || src[lsb + 2] != '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4831 this_eol = EOL_SEEN_CR;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4832 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4833 this_eol = EOL_SEEN_CRLF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4834
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4835 if (eol_seen == EOL_SEEN_NONE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4836 /* This is the first end-of-line. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4837 eol_seen = this_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4838 else if (eol_seen != this_eol)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4839 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4840 /* The found type is different from what found before. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4841 eol_seen = EOL_SEEN_LF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4842 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4843 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4844 if (++total == MAX_EOL_CHECK_COUNT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4845 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4846 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4847 src += 2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4848 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4849 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4850 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4851 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4852 while (src < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4853 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4854 c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4855 if (c == '\n' || c == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4856 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4857 int this_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4858
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4859 if (c == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4860 this_eol = EOL_SEEN_LF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4861 else if (src >= src_end || *src != '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4862 this_eol = EOL_SEEN_CR;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4863 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4864 this_eol = EOL_SEEN_CRLF, src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4865
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4866 if (eol_seen == EOL_SEEN_NONE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4867 /* This is the first end-of-line. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4868 eol_seen = this_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4869 else if (eol_seen != this_eol)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4870 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4871 /* The found type is different from what found before. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4872 eol_seen = EOL_SEEN_LF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4873 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4874 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4875 if (++total == MAX_EOL_CHECK_COUNT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4876 break;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
4877 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4878 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4879 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4880 return eol_seen;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4881 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4882
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4883
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4884 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4885 adjust_coding_eol_type (coding, eol_seen)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4886 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4887 int eol_seen;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4888 {
88430
6418a272b97e * coding.c: Delete unused variables.
Kenichi Handa <handa@m17n.org>
parents: 88365
diff changeset
4889 Lisp_Object eol_type;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4890
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4891 eol_type = CODING_ID_EOL_TYPE (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4892 if (eol_seen & EOL_SEEN_LF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4893 coding->id = CODING_SYSTEM_ID (AREF (eol_type, 0));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4894 else if (eol_type & EOL_SEEN_CRLF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4895 coding->id = CODING_SYSTEM_ID (AREF (eol_type, 1));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4896 else if (eol_type & EOL_SEEN_CR)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4897 coding->id = CODING_SYSTEM_ID (AREF (eol_type, 2));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4898 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4899
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4900 /* Detect how a text specified in CODING is encoded. If a coding
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4901 system is detected, update fields of CODING by the detected coding
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4902 system. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4903
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4904 void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4905 detect_coding (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4906 struct coding_system *coding;
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4907 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4908 unsigned char *src, *src_end;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4909 Lisp_Object attrs, coding_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4910
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4911 coding->consumed = coding->consumed_char = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4912 coding->produced = coding->produced_char = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4913 coding_set_source (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4914
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4915 src_end = coding->source + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4916
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4917 /* If we have not yet decided the text encoding type, detect it
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4918 now. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4919 if (EQ (CODING_ATTR_TYPE (CODING_ID_ATTRS (coding->id)), Qundecided))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4920 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4921 int mask = CATEGORY_MASK_ANY;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4922 int c, i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4923
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4924 for (src = coding->source; src < src_end; src++)
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4925 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4926 c = *src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4927 if (c & 0x80 || (c < 0x20 && (c == ISO_CODE_ESC
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4928 || c == ISO_CODE_SI
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4929 || c == ISO_CODE_SO)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4930 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4931 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4932 coding->head_ascii = src - (coding->source + coding->consumed);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4933
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4934 if (coding->head_ascii < coding->src_bytes)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4935 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4936 int detected = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4937
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4938 for (i = 0; i < coding_category_raw_text; i++)
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4939 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4940 enum coding_category category = coding_priorities[i];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4941 struct coding_system *this = coding_categories + category;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4942
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4943 if (category >= coding_category_raw_text
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4944 || detected & (1 << category))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4945 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4946
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4947 if (this->id < 0)
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4948 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4949 /* No coding system of this category is defined. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4950 mask &= ~(1 << category);
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4951 }
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4952 else
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4953 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4954 detected |= detected_mask[category];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4955 if ((*(this->detector)) (coding, &mask))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4956 break;
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4957 }
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
4958 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4959 if (! mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4960 setup_coding_system (Qraw_text, coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4961 else if (mask != CATEGORY_MASK_ANY)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4962 for (i = 0; i < coding_category_raw_text; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4963 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4964 enum coding_category category = coding_priorities[i];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4965 struct coding_system *this = coding_categories + category;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4966
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4967 if (mask & (1 << category))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4968 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4969 setup_coding_system (CODING_ID_NAME (this->id), coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4970 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4971 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4972 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4973 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4974 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4975
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4976 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4977 coding_type = CODING_ATTR_TYPE (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4978
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4979 /* If we have not yet decided the EOL type, detect it now. But, the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4980 detection is impossible for a CCL based coding system, in which
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4981 case, we detct the EOL type after decoding. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4982 if (VECTORP (CODING_ID_EOL_TYPE (coding->id))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4983 && ! EQ (coding_type, Qccl))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4984 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4985 int eol_seen = detect_eol (coding, coding->source, coding->src_bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4986
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4987 if (eol_seen != EOL_SEEN_NONE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4988 adjust_coding_eol_type (coding, eol_seen);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4989 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4990 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4991
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4992
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4993 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4994 decode_eol (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4995 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4996 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4997 if (VECTORP (CODING_ID_EOL_TYPE (coding->id)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4998 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
4999 unsigned char *p = CHAR_POS_ADDR (coding->dst_pos);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5000 unsigned char *pend = p + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5001 int eol_seen = EOL_SEEN_NONE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5002
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5003 for (; p < pend; p++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5004 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5005 if (*p == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5006 eol_seen |= EOL_SEEN_LF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5007 else if (*p == '\r')
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
5008 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5009 if (p + 1 < pend && *(p + 1) == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5010 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5011 eol_seen |= EOL_SEEN_CRLF;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5012 p++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5013 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5014 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5015 eol_seen |= EOL_SEEN_CR;
28022
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
5016 }
6c41f3276340 Add comments on coding-category-utf-8,
Kenichi Handa <handa@m17n.org>
parents: 27943
diff changeset
5017 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5018 if (eol_seen != EOL_SEEN_NONE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5019 adjust_coding_eol_type (coding, eol_seen);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5020 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5021
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5022 if (EQ (CODING_ID_EOL_TYPE (coding->id), Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5023 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5024 unsigned char *p = CHAR_POS_ADDR (coding->dst_pos);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5025 unsigned char *pend = p + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5026
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5027 for (; p < pend; p++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5028 if (*p == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5029 *p = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5030 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5031 else if (EQ (CODING_ID_EOL_TYPE (coding->id), Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5032 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5033 unsigned char *p, *pbeg, *pend;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5034 Lisp_Object undo_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5035
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5036 move_gap_both (coding->dst_pos + coding->produced_char,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5037 coding->dst_pos_byte + coding->produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5038 undo_list = current_buffer->undo_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5039 current_buffer->undo_list = Qt;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5040 del_range_2 (coding->dst_pos, coding->dst_pos_byte, GPT, GPT_BYTE, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5041 current_buffer->undo_list = undo_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5042 pbeg = GPT_ADDR;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5043 pend = pbeg + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5044
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5045 for (p = pend - 1; p >= pbeg; p--)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5046 if (*p == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5047 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5048 safe_bcopy ((char *) (p + 1), (char *) p, pend - p - 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5049 pend--;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5050 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5051 coding->produced_char -= coding->produced - (pend - pbeg);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5052 coding->produced = pend - pbeg;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5053 insert_from_gap (coding->produced_char, coding->produced);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5054 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5055 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5056
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5057 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5058 translate_chars (coding, table)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5059 struct coding_system *coding;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5060 Lisp_Object table;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5061 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5062 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5063 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5064 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5065
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5066 if (coding->chars_at_source)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5067 return;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5068
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5069 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5070 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5071 c = *charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5072 if (c < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5073 charbuf += c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5074 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5075 *charbuf++ = translate_char (table, c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5076 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5077 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5078
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5079 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5080 produce_chars (coding)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5081 struct coding_system *coding;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5082 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5083 unsigned char *dst = coding->destination + coding->produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5084 unsigned char *dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5085 int produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5086 int produced_chars = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5087
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5088 if (! coding->chars_at_source)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5089 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5090 /* Characters are in coding->charbuf. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5091 int *buf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5092 int *buf_end = buf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5093 unsigned char *adjusted_dst_end;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5094
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5095 if (BUFFERP (coding->src_object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5096 && EQ (coding->src_object, coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5097 dst_end = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5098 adjusted_dst_end = dst_end - MAX_MULTIBYTE_LENGTH;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5099
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5100 while (buf < buf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5101 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5102 int c = *buf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5103
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5104 if (dst >= adjusted_dst_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5105 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5106 dst = alloc_destination (coding,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5107 buf_end - buf + MAX_MULTIBYTE_LENGTH,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5108 dst);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5109 dst_end = coding->destination + coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5110 adjusted_dst_end = dst_end - MAX_MULTIBYTE_LENGTH;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5111 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5112 if (c >= 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5113 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5114 if (coding->dst_multibyte
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5115 || ! CHAR_BYTE8_P (c))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5116 CHAR_STRING_ADVANCE (c, dst);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5117 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5118 *dst++ = CHAR_TO_BYTE8 (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5119 produced_chars++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5120 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5121 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5122 /* This is an annotation data. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5123 buf -= c + 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5124 }
30833
2db6e42a6ba3 (MINIMUM_CONVERSION_BUFFER_SIZE): Macro deleted.
Kenichi Handa <handa@m17n.org>
parents: 30756
diff changeset
5125 }
2db6e42a6ba3 (MINIMUM_CONVERSION_BUFFER_SIZE): Macro deleted.
Kenichi Handa <handa@m17n.org>
parents: 30756
diff changeset
5126 else
2db6e42a6ba3 (MINIMUM_CONVERSION_BUFFER_SIZE): Macro deleted.
Kenichi Handa <handa@m17n.org>
parents: 30756
diff changeset
5127 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5128 unsigned char *src = coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5129 unsigned char *src_end = src + coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5130 Lisp_Object eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5131
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5132 eol_type = CODING_ID_EOL_TYPE (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5133
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5134 if (coding->src_multibyte != coding->dst_multibyte)
34892
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5135 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5136 if (coding->src_multibyte)
34892
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5137 {
88443
6b86cf30a0b9 (produce_chars): Set the variable `multibytep' correctly.
Kenichi Handa <handa@m17n.org>
parents: 88438
diff changeset
5138 int multibytep = 1;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5139 int consumed_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5140
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5141 while (1)
34892
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5142 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5143 unsigned char *src_base = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5144 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5145
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5146 ONE_MORE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5147 if (c == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5148 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5149 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5150 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5151 if (src < src_end
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5152 && *src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5153 c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5154 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5155 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5156 c = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5157 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5158 if (dst == dst_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5159 {
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5160 coding->consumed = src - coding->source;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5161
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5162 if (EQ (coding->src_object, coding->dst_object))
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5163 dst_end = src;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5164 if (dst == dst_end)
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5165 {
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5166 dst = alloc_destination (coding, src_end - src + 1,
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5167 dst);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5168 dst_end = coding->destination + coding->dst_bytes;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5169 coding_set_source (coding);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5170 src = coding->source + coding->consumed;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5171 src_end = coding->source + coding->src_bytes;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5172 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5173 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5174 *dst++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5175 produced_chars++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5176 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5177 no_more_source:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5178 ;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5179 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5180 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5181 while (src < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5182 {
88443
6b86cf30a0b9 (produce_chars): Set the variable `multibytep' correctly.
Kenichi Handa <handa@m17n.org>
parents: 88438
diff changeset
5183 int multibytep = 1;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5184 int c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5185
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5186 if (c == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5187 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5188 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5189 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5190 if (src < src_end
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5191 && *src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5192 c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5193 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5194 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5195 c = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5196 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5197 if (dst >= dst_end - 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5198 {
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5199 coding->consumed = src - coding->source;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5200
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5201 if (EQ (coding->src_object, coding->dst_object))
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5202 dst_end = src;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5203 if (dst >= dst_end - 1)
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5204 {
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5205 dst = alloc_destination (coding, src_end - src + 2,
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5206 dst);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5207 dst_end = coding->destination + coding->dst_bytes;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5208 coding_set_source (coding);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5209 src = coding->source + coding->consumed;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5210 src_end = coding->source + coding->src_bytes;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5211 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5212 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5213 EMIT_ONE_BYTE (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5214 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5215 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5216 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5217 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5218 if (!EQ (coding->src_object, coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5219 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5220 int require = coding->src_bytes - coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5221
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5222 if (require > 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5223 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5224 EMACS_INT offset = src - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5225
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5226 dst = alloc_destination (coding, require, dst);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5227 coding_set_source (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5228 src = coding->source + offset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5229 src_end = coding->source + coding->src_bytes;
34892
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5230 }
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5231 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5232 produced_chars = coding->src_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5233 while (src < src_end)
34892
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5234 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5235 int c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5236
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5237 if (c == '\r')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5238 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5239 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5240 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5241 if (src < src_end
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5242 && *src == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5243 c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5244 produced_chars--;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5245 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5246 else if (EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5247 c = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5248 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5249 *dst++ = c;
34892
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5250 }
3868f2e7355a (setup_coding_system): Initialize
Kenichi Handa <handa@m17n.org>
parents: 34888
diff changeset
5251 }
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5252 coding->consumed = coding->src_bytes;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
5253 coding->consumed_char = coding->src_chars;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5254 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5255
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5256 produced = dst - (coding->destination + coding->produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5257 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5258 insert_from_gap (produced_chars, produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5259 coding->produced += produced;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5260 coding->produced_char += produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5261 return produced_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5262 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5263
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5264 /* [ -LENGTH CHAR_POS_OFFSET MASK METHOD COMP_LEN ]
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5265 or
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5266 [ -LENGTH CHAR_POS_OFFSET MASK METHOD COMP_LEN COMPONENTS... ]
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5267 */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5268
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5269 static INLINE void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5270 produce_composition (coding, charbuf)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5271 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5272 int *charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5273 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5274 Lisp_Object buffer;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5275 int len;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5276 EMACS_INT pos;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5277 enum composition_method method;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5278 int cmp_len;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5279 Lisp_Object components;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5280
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5281 buffer = coding->dst_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5282 len = -charbuf[0];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5283 pos = coding->dst_pos + charbuf[1];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5284 method = (enum composition_method) (charbuf[3]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5285 cmp_len = charbuf[4];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5286
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5287 if (method == COMPOSITION_RELATIVE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5288 components = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5289 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5290 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5291 Lisp_Object args[MAX_COMPOSITION_COMPONENTS * 2 - 1];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5292 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5293
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5294 len -= 5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5295 charbuf += 5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5296 for (i = 0; i < len; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5297 args[i] = make_number (charbuf[i]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5298 components = (method == COMPOSITION_WITH_ALTCHARS
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5299 ? Fstring (len, args) : Fvector (len, args));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5300 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5301 compose_text (pos, pos + cmp_len, components, Qnil, Qnil);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5302 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5303
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5304 static int *
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5305 save_composition_data (buf, buf_end, prop)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5306 int *buf, *buf_end;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5307 Lisp_Object prop;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5308 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5309 enum composition_method method = COMPOSITION_METHOD (prop);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5310 int cmp_len = COMPOSITION_LENGTH (prop);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5311
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5312 if (buf + 4 + (MAX_COMPOSITION_COMPONENTS * 2 - 1) > buf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5313 return NULL;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5314
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5315 buf[1] = CODING_ANNOTATE_COMPOSITION_MASK;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5316 buf[2] = method;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5317 buf[3] = cmp_len;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5318
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5319 if (method == COMPOSITION_RELATIVE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5320 buf[0] = 4;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5321 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5322 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5323 Lisp_Object components;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5324 int len, i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5325
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5326 components = COMPOSITION_COMPONENTS (prop);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5327 if (VECTORP (components))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5328 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5329 len = XVECTOR (components)->size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5330 for (i = 0; i < len; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5331 buf[4 + i] = XINT (AREF (components, i));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5332 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5333 else if (STRINGP (components))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5334 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5335 int i_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5336
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5337 len = XSTRING (components)->size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5338 i = i_byte = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5339 while (i < len)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5340 FETCH_STRING_CHAR_ADVANCE (buf[4 + i], components, i, i_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5341 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5342 else if (INTEGERP (components))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5343 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5344 len = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5345 buf[4] = XINT (components);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5346 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5347 else if (CONSP (components))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5348 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5349 for (len = 0; CONSP (components);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5350 len++, components = XCDR (components))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5351 buf[4 + len] = XINT (XCAR (components));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5352 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5353 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5354 abort ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5355 buf[0] = 4 + len;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5356 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5357 return (buf + buf[0]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5358 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5359
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5360 #define CHARBUF_SIZE 0x4000
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5361
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5362 #define ALLOC_CONVERSION_WORK_AREA(coding) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5363 do { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5364 int size = CHARBUF_SIZE;; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5365 \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5366 coding->charbuf = NULL; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5367 while (size > 1024) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5368 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5369 coding->charbuf = (int *) alloca (sizeof (int) * size); \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5370 if (coding->charbuf) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5371 break; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5372 size >>= 1; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5373 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5374 if (! coding->charbuf) \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5375 { \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5376 coding->result = CODING_RESULT_INSUFFICIENT_MEM; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5377 return coding->result; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5378 } \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5379 coding->charbuf_size = size; \
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5380 } while (0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5381
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5382
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5383 static void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5384 produce_annotation (coding)
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5385 struct coding_system *coding;
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5386 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5387 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5388 int *charbuf_end = charbuf + coding->charbuf_used;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5389
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5390 while (charbuf < charbuf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5391 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5392 if (*charbuf >= 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5393 charbuf++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5394 else
29877
7b43e1fb478a (decode_eol_post_ccl): Special handling for undecided
Eli Zaretskii <eliz@gnu.org>
parents: 29725
diff changeset
5395 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5396 int len = -*charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5397 switch (charbuf[2])
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5398 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5399 case CODING_ANNOTATE_COMPOSITION_MASK:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5400 produce_composition (coding, charbuf);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5401 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5402 default:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5403 abort ();
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5404 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5405 charbuf += len;
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5406 }
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5407 }
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5408 }
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5409
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5410 /* Decode the data at CODING->src_object into CODING->dst_object.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5411 CODING->src_object is a buffer, a string, or nil.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5412 CODING->dst_object is a buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5413
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5414 If CODING->src_object is a buffer, it must be the current buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5415 In this case, if CODING->src_pos is positive, it is a position of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5416 the source text in the buffer, otherwise, the source text is in the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5417 gap area of the buffer, and CODING->src_pos specifies the offset of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5418 the text from GPT (which must be the same as PT). If this is the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5419 same buffer as CODING->dst_object, CODING->src_pos must be
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5420 negative.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5421
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5422 If CODING->src_object is a string, CODING->src_pos in an index to
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5423 that string.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5424
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5425 If CODING->src_object is nil, CODING->source must already point to
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5426 the non-relocatable memory area. In this case, CODING->src_pos is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5427 an offset from CODING->source.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5428
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5429 The decoded data is inserted at the current point of the buffer
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5430 CODING->dst_object.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5431 */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5432
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5433 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5434 decode_coding (coding)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5435 struct coding_system *coding;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5436 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5437 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5438
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5439 if (BUFFERP (coding->src_object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5440 && coding->src_pos > 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5441 && coding->src_pos < GPT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5442 && coding->src_pos + coding->src_chars > GPT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5443 move_gap_both (coding->src_pos, coding->src_pos_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5444
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5445 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5446 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5447 if (current_buffer != XBUFFER (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5448 set_buffer_internal (XBUFFER (coding->dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5449 if (GPT != PT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5450 move_gap_both (PT, PT_BYTE);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5451 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5452
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5453 coding->consumed = coding->consumed_char = 0;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
5454 coding->produced = coding->produced_char = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5455 coding->chars_at_source = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5456 coding->result = CODING_RESULT_SUCCESS;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
5457 coding->errors = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5458
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5459 ALLOC_CONVERSION_WORK_AREA (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5460
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5461 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5462
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5463 do
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5464 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5465 coding_set_source (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5466 coding->annotated = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5467 (*(coding->decoder)) (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5468 if (!NILP (CODING_ATTR_DECODE_TBL (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5469 translate_chars (CODING_ATTR_DECODE_TBL (attrs), coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5470 coding_set_destination (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5471 produce_chars (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5472 if (coding->annotated)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5473 produce_annotation (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5474 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5475 while (coding->consumed < coding->src_bytes
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5476 && ! coding->result);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5477
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5478 if (EQ (CODING_ATTR_TYPE (CODING_ID_ATTRS (coding->id)), Qccl)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5479 && SYMBOLP (CODING_ID_EOL_TYPE (coding->id))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5480 && ! EQ (CODING_ID_EOL_TYPE (coding->id), Qunix))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5481 decode_eol (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5482
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5483 coding->carryover_bytes = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5484 if (coding->consumed < coding->src_bytes)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5485 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5486 int nbytes = coding->src_bytes - coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5487 unsigned char *src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5488
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5489 coding_set_source (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5490 coding_set_destination (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5491 src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5492
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5493 if (coding->mode & CODING_MODE_LAST_BLOCK)
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5494 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5495 /* Flush out unprocessed data as binary chars. We are sure
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5496 that the number of data is less than the size of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5497 coding->charbuf. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5498 int *charbuf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5499
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5500 while (nbytes-- > 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5501 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5502 int c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5503 *charbuf++ = (c & 0x80 ? - c : c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5504 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5505 produce_chars (coding);
29725
2bc397e9b09a (setup_coding_system) <4>: Reset member `cr_carryover'.
Kenichi Handa <handa@m17n.org>
parents: 29663
diff changeset
5506 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5507 else
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5508 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5509 /* Record unprocessed bytes in coding->carryover. We are
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5510 sure that the number of data is less than the size of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5511 coding->carryover. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5512 unsigned char *p = coding->carryover;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5513
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5514 coding->carryover_bytes = nbytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5515 while (nbytes-- > 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5516 *p++ = *src++;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5517 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5518 coding->consumed = coding->src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5519 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5520
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
5521 return coding->result;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5522 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5523
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5524 static void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5525 consume_chars (coding)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5526 struct coding_system *coding;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5527 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5528 int *buf = coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5529 /* -1 is to compensate for CRLF. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5530 int *buf_end = coding->charbuf + coding->charbuf_size - 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5531 unsigned char *src = coding->source + coding->consumed;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5532 int pos = coding->src_pos + coding->consumed_char;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5533 int end_pos = coding->src_pos + coding->src_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5534 int multibytep = coding->src_multibyte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5535 Lisp_Object eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5536 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5537 int start, end, stop;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5538 Lisp_Object object, prop;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5539
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5540 eol_type = CODING_ID_EOL_TYPE (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5541 if (VECTORP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5542 eol_type = Qunix;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5543
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5544 object = coding->src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5545
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5546 /* Note: composition handling is not yet implemented. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5547 coding->common_flags &= ~CODING_ANNOTATE_COMPOSITION_MASK;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5548
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5549 if (coding->common_flags & CODING_ANNOTATE_COMPOSITION_MASK
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5550 && find_composition (pos, end_pos, &start, &end, &prop, object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5551 && end <= end_pos
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5552 && (start >= pos
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5553 || (find_composition (end, end_pos, &start, &end, &prop, object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5554 && end <= end_pos)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5555 stop = start;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5556 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5557 stop = end_pos;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5558
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5559 while (buf < buf_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5560 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5561 if (pos == stop)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5562 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5563 int *p;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5564
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5565 if (pos == end_pos)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5566 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5567 p = save_composition_data (buf, buf_end, prop);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5568 if (p == NULL)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5569 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5570 buf = p;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5571 if (find_composition (end, end_pos, &start, &end, &prop, object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5572 && end <= end_pos)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5573 stop = start;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5574 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5575 stop = end_pos;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5576 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5577
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5578 if (! multibytep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5579 c = *src++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5580 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5581 c = STRING_CHAR_ADVANCE (src);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5582 if ((c == '\r') && (coding->mode & CODING_MODE_SELECTIVE_DISPLAY))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5583 c = '\n';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5584 if (! EQ (eol_type, Qunix))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5585 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5586 if (c == '\n')
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5587 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5588 if (EQ (eol_type, Qdos))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5589 *buf++ = '\r';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5590 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5591 c = '\r';
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5592 }
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5593 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5594 *buf++ = c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5595 pos++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5596 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5597
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5598 coding->consumed = src - coding->source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5599 coding->consumed_char = pos - coding->src_pos;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5600 coding->charbuf_used = buf - coding->charbuf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5601 coding->chars_at_source = 0;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5602 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5603
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5604
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5605 /* Encode the text at CODING->src_object into CODING->dst_object.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5606 CODING->src_object is a buffer or a string.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5607 CODING->dst_object is a buffer or nil.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5608
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5609 If CODING->src_object is a buffer, it must be the current buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5610 In this case, if CODING->src_pos is positive, it is a position of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5611 the source text in the buffer, otherwise. the source text is in the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5612 gap area of the buffer, and coding->src_pos specifies the offset of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5613 the text from GPT (which must be the same as PT). If this is the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5614 same buffer as CODING->dst_object, CODING->src_pos must be
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5615 negative and CODING should not have `pre-write-conversion'.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5616
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5617 If CODING->src_object is a string, CODING should not have
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5618 `pre-write-conversion'.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5619
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5620 If CODING->dst_object is a buffer, the encoded data is inserted at
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5621 the current point of that buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5622
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5623 If CODING->dst_object is nil, the encoded data is placed at the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5624 memory area specified by CODING->destination. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5625
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5626 static int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5627 encode_coding (coding)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5628 struct coding_system *coding;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5629 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5630 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5631
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5632 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5633
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5634 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5635 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5636 set_buffer_internal (XBUFFER (coding->dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5637 coding->dst_multibyte
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5638 = ! NILP (current_buffer->enable_multibyte_characters);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5639 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5640
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5641 coding->consumed = coding->consumed_char = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5642 coding->produced = coding->produced_char = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5643 coding->result = CODING_RESULT_SUCCESS;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5644 coding->errors = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5645
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5646 ALLOC_CONVERSION_WORK_AREA (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5647
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5648 do {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5649 coding_set_source (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5650 consume_chars (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5651
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5652 if (!NILP (CODING_ATTR_ENCODE_TBL (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5653 translate_chars (CODING_ATTR_ENCODE_TBL (attrs), coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5654
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5655 coding_set_destination (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5656 (*(coding->encoder)) (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5657 } while (coding->consumed_char < coding->src_chars);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5658
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5659 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5660 insert_from_gap (coding->produced_char, coding->produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5661
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5662 return (coding->result);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5663 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5664
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5665 /* Work buffer */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5666
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5667 /* List of currently used working buffer. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5668 Lisp_Object Vcode_conversion_work_buf_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5669
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5670 /* A working buffer used by the top level conversion. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5671 Lisp_Object Vcode_conversion_reused_work_buf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5672
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5673
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5674 /* Return a working buffer that can be freely used by the following
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5675 code conversion. MULTIBYTEP specifies the multibyteness of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5676 buffer. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5677
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5678 Lisp_Object
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5679 make_conversion_work_buffer (multibytep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5680 int multibytep;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5681 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5682 struct buffer *current = current_buffer;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5683 Lisp_Object buf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5684
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5685 if (NILP (Vcode_conversion_work_buf_list))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5686 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5687 if (NILP (Vcode_conversion_reused_work_buf))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5688 Vcode_conversion_reused_work_buf
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5689 = Fget_buffer_create (build_string (" *code-conversion-work*"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5690 Vcode_conversion_work_buf_list
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5691 = Fcons (Vcode_conversion_reused_work_buf, Qnil);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5692 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5693 else
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5694 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5695 int depth = Flength (Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5696 char str[128];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5697
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5698 sprintf (str, " *code-conversion-work*<%d>", depth);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5699 Vcode_conversion_work_buf_list
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5700 = Fcons (Fget_buffer_create (build_string (str)),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5701 Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5702 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5703
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5704 buf = XCAR (Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5705 set_buffer_internal (XBUFFER (buf));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5706 current_buffer->undo_list = Qt;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5707 Ferase_buffer ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5708 Fset_buffer_multibyte (multibytep ? Qt : Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5709 set_buffer_internal (current);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5710 return buf;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5711 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5712
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5713 static struct coding_system *saved_coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5714
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5715 Lisp_Object
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5716 code_conversion_restore (info)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5717 Lisp_Object info;
26067
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
5718 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5719 int depth = Flength (Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5720 Lisp_Object buf;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5721
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5722 if (depth > 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5723 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5724 buf = XCAR (Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5725 Vcode_conversion_work_buf_list = XCDR (Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5726 if (depth > 1 && !NILP (Fbuffer_live_p (buf)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5727 Fkill_buffer (buf);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5728 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5729
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5730 if (saved_coding->dst_object == Qt
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5731 && saved_coding->destination)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5732 xfree (saved_coding->destination);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5733
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5734 return save_excursion_restore (info);
26067
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
5735 }
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
5736
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5737
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5738 int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5739 decode_coding_gap (coding, chars, bytes)
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5740 struct coding_system *coding;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5741 EMACS_INT chars, bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5742 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5743 int count = specpdl_ptr - specpdl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5744
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5745 saved_coding = coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5746 record_unwind_protect (code_conversion_restore, save_excursion_save ());
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5747
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5748 coding->src_object = Fcurrent_buffer ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5749 coding->src_chars = chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5750 coding->src_bytes = bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5751 coding->src_pos = -chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5752 coding->src_pos_byte = -bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5753 coding->src_multibyte = chars < bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5754 coding->dst_object = coding->src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5755 coding->dst_pos = PT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5756 coding->dst_pos_byte = PT_BYTE;
88443
6b86cf30a0b9 (produce_chars): Set the variable `multibytep' correctly.
Kenichi Handa <handa@m17n.org>
parents: 88438
diff changeset
5757 coding->dst_multibyte = ! NILP (current_buffer->enable_multibyte_characters);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5758
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5759 if (CODING_REQUIRE_DETECTION (coding))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5760 detect_coding (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5761
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5762 decode_coding (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5763
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5764 unbind_to (count, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5765 return coding->result;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5766 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5767
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5768 int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5769 encode_coding_gap (coding, chars, bytes)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5770 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5771 EMACS_INT chars, bytes;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5772 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5773 int count = specpdl_ptr - specpdl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5774 Lisp_Object buffer;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5775
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5776 saved_coding = coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5777 record_unwind_protect (code_conversion_restore, save_excursion_save ());
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5778
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5779 buffer = Fcurrent_buffer ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5780 coding->src_object = buffer;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5781 coding->src_chars = chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5782 coding->src_bytes = bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5783 coding->src_pos = -chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5784 coding->src_pos_byte = -bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5785 coding->src_multibyte = chars < bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5786 coding->dst_object = coding->src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5787 coding->dst_pos = PT;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5788 coding->dst_pos_byte = PT_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5789
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5790 encode_coding (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5791
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5792 unbind_to (count, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5793 return coding->result;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5794 }
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5795
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5796
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5797 /* Decode the text in the range FROM/FROM_BYTE and TO/TO_BYTE in
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5798 SRC_OBJECT into DST_OBJECT by coding context CODING.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5799
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5800 SRC_OBJECT is a buffer, a string, or Qnil.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5801
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5802 If it is a buffer, the text is at point of the buffer. FROM and TO
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5803 are positions in the buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5804
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5805 If it is a string, the text is at the beginning of the string.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5806 FROM and TO are indices to the string.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5807
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5808 If it is nil, the text is at coding->source. FROM and TO are
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5809 indices to coding->source.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5810
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5811 DST_OBJECT is a buffer, Qt, or Qnil.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5812
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5813 If it is a buffer, the decoded text is inserted at point of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5814 buffer. If the buffer is the same as SRC_OBJECT, the source text
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5815 is deleted.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5816
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5817 If it is Qt, a string is made from the decoded text, and
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5818 set in CODING->dst_object.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5819
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5820 If it is Qnil, the decoded text is stored at CODING->destination.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5821 The called must allocate CODING->dst_bytes bytes at
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5822 CODING->destination by xmalloc. If the decoded text is longer than
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5823 CODING->dst_bytes, CODING->destination is relocated by xrealloc.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5824 */
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5825
29275
b4ea9178e480 (DECODE_COMPOSITION_START): If coding->cmp_data is not
Kenichi Handa <handa@m17n.org>
parents: 29247
diff changeset
5826 void
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5827 decode_coding_object (coding, src_object, from, from_byte, to, to_byte,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5828 dst_object)
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5829 struct coding_system *coding;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5830 Lisp_Object src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5831 EMACS_INT from, from_byte, to, to_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5832 Lisp_Object dst_object;
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5833 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5834 int count = specpdl_ptr - specpdl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5835 unsigned char *destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5836 EMACS_INT dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5837 EMACS_INT chars = to - from;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5838 EMACS_INT bytes = to_byte - from_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5839 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5840
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5841 saved_coding = coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5842 record_unwind_protect (code_conversion_restore, save_excursion_save ());
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5843
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5844 if (NILP (dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5845 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5846 destination = coding->destination;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5847 dst_bytes = coding->dst_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5848 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5849
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5850 coding->src_object = src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5851 coding->src_chars = chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5852 coding->src_bytes = bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5853 coding->src_multibyte = chars < bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5854
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5855 if (STRINGP (src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5856 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5857 coding->src_pos = from;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5858 coding->src_pos_byte = from_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5859 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5860 else if (BUFFERP (src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5861 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5862 set_buffer_internal (XBUFFER (src_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5863 if (from != GPT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5864 move_gap_both (from, from_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5865 if (EQ (src_object, dst_object))
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
5866 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5867 TEMP_SET_PT_BOTH (from, from_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5868 del_range_both (from, from_byte, to, to_byte, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5869 coding->src_pos = -chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5870 coding->src_pos_byte = -bytes;
20931
068eb408c911 (decode_coding_iso2022): Update coding->fake_multibyte.
Kenichi Handa <handa@m17n.org>
parents: 20803
diff changeset
5871 }
42661
e85e4d9494b1 (code_convert_region): Don't copy old text if undo disabled.
Richard M. Stallman <rms@gnu.org>
parents: 42105
diff changeset
5872 else
e85e4d9494b1 (code_convert_region): Don't copy old text if undo disabled.
Richard M. Stallman <rms@gnu.org>
parents: 42105
diff changeset
5873 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5874 coding->src_pos = from;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5875 coding->src_pos_byte = from_byte;
29985
c17e78d8c720 (code_convert_region): Even if the length of text is
Kenichi Handa <handa@m17n.org>
parents: 29932
diff changeset
5876 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5877 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5878
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5879 if (CODING_REQUIRE_DETECTION (coding))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5880 detect_coding (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5881 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5882
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5883 if (! NILP (CODING_ATTR_POST_READ (attrs))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5884 || EQ (dst_object, Qt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5885 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5886 coding->dst_object = make_conversion_work_buffer (1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5887 coding->dst_pos = BEG;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5888 coding->dst_pos_byte = BEG_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5889 coding->dst_multibyte = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5890 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5891 else if (BUFFERP (dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5892 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5893 coding->dst_object = dst_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5894 coding->dst_pos = BUF_PT (XBUFFER (dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5895 coding->dst_pos_byte = BUF_PT_BYTE (XBUFFER (dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5896 coding->dst_multibyte
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5897 = ! NILP (XBUFFER (dst_object)->enable_multibyte_characters);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5898 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5899 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5900 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5901 coding->dst_object = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5902 coding->dst_multibyte = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5903 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5904
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5905 decode_coding (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5906
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5907 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5908 set_buffer_internal (XBUFFER (coding->dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5909
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5910 if (! NILP (CODING_ATTR_POST_READ (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5911 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5912 struct gcpro gcpro1, gcpro2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5913 EMACS_INT prev_Z = Z, prev_Z_BYTE = Z_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5914 Lisp_Object val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5915
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5916 GCPRO2 (coding->src_object, coding->dst_object);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5917 val = call1 (CODING_ATTR_POST_READ (attrs),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5918 make_number (coding->produced_char));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5919 UNGCPRO;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5920 CHECK_NATNUM (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5921 coding->produced_char += Z - prev_Z;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5922 coding->produced += Z_BYTE - prev_Z_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5923 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5924
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5925 if (EQ (dst_object, Qt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5926 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5927 coding->dst_object = Fbuffer_string ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5928 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5929 else if (NILP (dst_object) && BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5930 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5931 set_buffer_internal (XBUFFER (coding->dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5932 if (dst_bytes < coding->produced)
42105
09cc243e2d14 (code_convert_region): Update coding->cmp_data->char_offset
Richard M. Stallman <rms@gnu.org>
parents: 42104
diff changeset
5933 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5934 destination
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5935 = (unsigned char *) xrealloc (destination, coding->produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5936 if (! destination)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5937 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5938 coding->result = CODING_RESULT_INSUFFICIENT_DST;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5939 unbind_to (count, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5940 return;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
5941 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5942 if (BEGV < GPT && GPT < BEGV + coding->produced_char)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5943 move_gap_both (BEGV, BEGV_BYTE);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5944 bcopy (BEGV_ADDR, destination, coding->produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5945 coding->destination = destination;
23279
ca159e828a68 (ccl_coding_driver): If ccl_driver is interrupted by a
Kenichi Handa <handa@m17n.org>
parents: 23258
diff changeset
5946 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5947 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5948
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5949 unbind_to (count, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5950 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5951
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5952
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5953 void
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5954 encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5955 dst_object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5956 struct coding_system *coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5957 Lisp_Object src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5958 EMACS_INT from, from_byte, to, to_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5959 Lisp_Object dst_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5960 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5961 int count = specpdl_ptr - specpdl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5962 EMACS_INT chars = to - from;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5963 EMACS_INT bytes = to_byte - from_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5964 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5965
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5966 saved_coding = coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5967 record_unwind_protect (code_conversion_restore, save_excursion_save ());
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5968
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5969 coding->src_object = src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5970 coding->src_chars = chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5971 coding->src_bytes = bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5972 coding->src_multibyte = chars < bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5973
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5974 attrs = CODING_ID_ATTRS (coding->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5975
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5976 if (! NILP (CODING_ATTR_PRE_WRITE (attrs)))
21062
839b22ad1e42 (code_convert_region): Handle the case that codes
Kenichi Handa <handa@m17n.org>
parents: 20999
diff changeset
5977 {
21140
179c73d91f70 (code_convert_region): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 21132
diff changeset
5978 Lisp_Object val;
23514
7bad909cd6f1 (setup_coding_system): Fix setting up
Kenichi Handa <handa@m17n.org>
parents: 23475
diff changeset
5979
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5980 coding->src_object = make_conversion_work_buffer (coding->src_multibyte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5981 set_buffer_internal (XBUFFER (coding->src_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5982 if (STRINGP (src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5983 insert_from_string (src_object, from, from_byte, chars, bytes, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5984 else if (BUFFERP (src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5985 insert_from_buffer (XBUFFER (src_object), from, chars, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5986 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5987 insert_1_both (coding->source + from, chars, bytes, 0, 0, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5988
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5989 if (EQ (src_object, dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5990 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5991 set_buffer_internal (XBUFFER (src_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5992 del_range_both (from, from_byte, to, to_byte, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5993 set_buffer_internal (XBUFFER (coding->src_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5994 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5995
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5996 val = call2 (CODING_ATTR_PRE_WRITE (attrs),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5997 make_number (1), make_number (chars));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5998 CHECK_NATNUM (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
5999 if (BEG != GPT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6000 move_gap_both (BEG, BEG_BYTE);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6001 coding->src_chars = Z - BEG;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6002 coding->src_bytes = Z_BYTE - BEG_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6003 coding->src_pos = BEG;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6004 coding->src_pos_byte = BEG_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6005 coding->src_multibyte = Z < Z_BYTE;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6006 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6007 else if (STRINGP (src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6008 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6009 coding->src_pos = from;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6010 coding->src_pos_byte = from_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6011 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6012 else if (BUFFERP (src_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6013 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6014 set_buffer_internal (XBUFFER (src_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6015 if (from != GPT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6016 move_gap_both (from, from_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6017 if (EQ (src_object, dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6018 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6019 del_range_both (from, from_byte, to, to_byte, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6020 coding->src_pos = -chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6021 coding->src_pos_byte = -bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6022 }
23514
7bad909cd6f1 (setup_coding_system): Fix setting up
Kenichi Handa <handa@m17n.org>
parents: 23475
diff changeset
6023 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6024 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6025 coding->src_pos = from;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6026 coding->src_pos_byte = from_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6027 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6028 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6029
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6030 if (BUFFERP (dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6031 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6032 coding->dst_object = dst_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6033 coding->dst_pos = BUF_PT (XBUFFER (dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6034 coding->dst_pos_byte = BUF_PT_BYTE (XBUFFER (dst_object));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6035 coding->dst_multibyte
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6036 = ! NILP (XBUFFER (dst_object)->enable_multibyte_characters);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6037 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6038 else if (EQ (dst_object, Qt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6039 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6040 coding->dst_object = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6041 coding->destination = (unsigned char *) xmalloc (coding->src_chars);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6042 coding->dst_bytes = coding->src_chars;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6043 coding->dst_multibyte = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6044 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6045 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6046 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6047 coding->dst_object = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6048 coding->dst_multibyte = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6049 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6050
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6051 encode_coding (coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6052
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6053 if (EQ (dst_object, Qt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6054 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6055 if (BUFFERP (coding->dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6056 coding->dst_object = Fbuffer_string ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6057 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6058 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6059 coding->dst_object
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6060 = make_unibyte_string ((char *) coding->destination,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6061 coding->produced);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6062 xfree (coding->destination);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6063 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6064 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6065
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6066 unbind_to (count, Qnil);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6067 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6068
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
6069
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
6070 Lisp_Object
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6071 preferred_coding_system ()
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6072 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6073 int id = coding_categories[coding_priorities[0]].id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6074
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6075 return CODING_ID_NAME (id);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6076 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6077
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6078
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6079 #ifdef emacs
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
6080 /*** 8. Emacs Lisp library functions ***/
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6081
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6082 DEFUN ("coding-system-p", Fcoding_system_p, Scoding_system_p, 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6083 doc: /* Return t if OBJECT is nil or a coding-system.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6084 See the documentation of `define-coding-system' for information
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6085 about coding-system objects. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6086 (obj)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6087 Lisp_Object obj;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6088 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6089 return ((NILP (obj) || CODING_SYSTEM_P (obj)) ? Qt : Qnil);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6090 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6091
17717
4891aaecc5cc (Fread_coding_system, Fread_non_nil_coding_system):
Richard M. Stallman <rms@gnu.org>
parents: 17485
diff changeset
6092 DEFUN ("read-non-nil-coding-system", Fread_non_nil_coding_system,
4891aaecc5cc (Fread_coding_system, Fread_non_nil_coding_system):
Richard M. Stallman <rms@gnu.org>
parents: 17485
diff changeset
6093 Sread_non_nil_coding_system, 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6094 doc: /* Read a coding system from the minibuffer, prompting with string PROMPT. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6095 (prompt)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6096 Lisp_Object prompt;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6097 {
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
6098 Lisp_Object val;
17717
4891aaecc5cc (Fread_coding_system, Fread_non_nil_coding_system):
Richard M. Stallman <rms@gnu.org>
parents: 17485
diff changeset
6099 do
4891aaecc5cc (Fread_coding_system, Fread_non_nil_coding_system):
Richard M. Stallman <rms@gnu.org>
parents: 17485
diff changeset
6100 {
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
6101 val = Fcompleting_read (prompt, Vcoding_system_alist, Qnil,
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
6102 Qt, Qnil, Qcoding_system_history, Qnil, Qnil);
17717
4891aaecc5cc (Fread_coding_system, Fread_non_nil_coding_system):
Richard M. Stallman <rms@gnu.org>
parents: 17485
diff changeset
6103 }
4891aaecc5cc (Fread_coding_system, Fread_non_nil_coding_system):
Richard M. Stallman <rms@gnu.org>
parents: 17485
diff changeset
6104 while (XSTRING (val)->size == 0);
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
6105 return (Fintern (val, Qnil));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6106 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6107
19758
49a1662b68dd (Fread_coding_system): New optional arg DEFAULT_CODING_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents: 19750
diff changeset
6108 DEFUN ("read-coding-system", Fread_coding_system, Sread_coding_system, 1, 2, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6109 doc: /* Read a coding system from the minibuffer, prompting with string PROMPT.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6110 If the user enters null input, return second argument DEFAULT-CODING-SYSTEM. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6111 (prompt, default_coding_system)
19758
49a1662b68dd (Fread_coding_system): New optional arg DEFAULT_CODING_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents: 19750
diff changeset
6112 Lisp_Object prompt, default_coding_system;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6113 {
19747
bed06df9cbc5 (setup_coding_system, Ffind_operation_coding_system)
Richard M. Stallman <rms@gnu.org>
parents: 19743
diff changeset
6114 Lisp_Object val;
19758
49a1662b68dd (Fread_coding_system): New optional arg DEFAULT_CODING_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents: 19750
diff changeset
6115 if (SYMBOLP (default_coding_system))
49a1662b68dd (Fread_coding_system): New optional arg DEFAULT_CODING_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents: 19750
diff changeset
6116 XSETSTRING (default_coding_system, XSYMBOL (default_coding_system)->name);
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
6117 val = Fcompleting_read (prompt, Vcoding_system_alist, Qnil,
19758
49a1662b68dd (Fread_coding_system): New optional arg DEFAULT_CODING_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents: 19750
diff changeset
6118 Qt, Qnil, Qcoding_system_history,
49a1662b68dd (Fread_coding_system): New optional arg DEFAULT_CODING_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents: 19750
diff changeset
6119 default_coding_system, Qnil);
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
6120 return (XSTRING (val)->size == 0 ? Qnil : Fintern (val, Qnil));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6121 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6122
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6123 DEFUN ("check-coding-system", Fcheck_coding_system, Scheck_coding_system,
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6124 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6125 doc: /* Check validity of CODING-SYSTEM.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6126 If valid, return CODING-SYSTEM, else signal a `coding-system-error' error.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6127 It is valid if it is a symbol with a non-nil `coding-system' property.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6128 The value of property should be a vector of length 5. */)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6129 (coding_system)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6130 Lisp_Object coding_system;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6131 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6132 CHECK_SYMBOL (coding_system);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6133 if (!NILP (Fcoding_system_p (coding_system)))
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6134 return coding_system;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6135 while (1)
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
6136 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6137 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6138
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6139
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6140 Lisp_Object
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6141 detect_coding_system (src, src_bytes, highest, multibytep, coding_system)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6142 unsigned char *src;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6143 int src_bytes, highest;
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
6144 int multibytep;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6145 Lisp_Object coding_system;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6146 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6147 unsigned char *src_end = src + src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6148 int mask = CATEGORY_MASK_ANY;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6149 int detected = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6150 int c, i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6151 Lisp_Object attrs, eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6152 Lisp_Object val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6153 struct coding_system coding;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6154
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6155 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6156 coding_system = Qundecided;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6157 setup_coding_system (coding_system, &coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6158 attrs = CODING_ID_ATTRS (coding.id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6159 eol_type = CODING_ID_EOL_TYPE (coding.id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6160
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6161 coding.source = src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6162 coding.src_bytes = src_bytes;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6163 coding.src_multibyte = multibytep;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6164 coding.consumed = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6165
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6166 if (XINT (CODING_ATTR_CATEGORY (attrs)) != coding_category_undecided)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6167 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6168 mask = 1 << XINT (CODING_ATTR_CATEGORY (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6169 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6170 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6171 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6172 coding_system = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6173 for (; src < src_end; src++)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6174 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6175 c = *src;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6176 if (c & 0x80 || (c < 0x20 && (c == ISO_CODE_ESC
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6177 || c == ISO_CODE_SI
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6178 || c == ISO_CODE_SO)))
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6179 break;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6180 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6181 coding.head_ascii = src - coding.source;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6182
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6183 if (src < src_end)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6184 for (i = 0; i < coding_category_raw_text; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6185 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6186 enum coding_category category = coding_priorities[i];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6187 struct coding_system *this = coding_categories + category;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6188
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6189 if (category >= coding_category_raw_text
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6190 || detected & (1 << category))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6191 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6192
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6193 if (this->id < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6194 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6195 /* No coding system of this category is defined. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6196 mask &= ~(1 << category);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6197 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6198 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6199 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6200 detected |= detected_mask[category];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6201 if ((*(coding_categories[category].detector)) (&coding, &mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6202 && highest)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6203 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6204 mask &= detected_mask[category];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6205 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6206 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6207 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6208 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6209 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6210
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6211 if (!mask)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6212 val = Fcons (make_number (coding_category_raw_text), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6213 else if (mask == CATEGORY_MASK_ANY)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6214 val = Fcons (make_number (coding_category_undecided), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6215 else if (highest)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6216 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6217 for (i = 0; i < coding_category_raw_text; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6218 if (mask & (1 << coding_priorities[i]))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6219 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6220 val = Fcons (make_number (coding_priorities[i]), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6221 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6222 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6223 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6224 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6225 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6226 val = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6227 for (i = coding_category_raw_text - 1; i >= 0; i--)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6228 if (mask & (1 << coding_priorities[i]))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6229 val = Fcons (make_number (coding_priorities[i]), val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6230 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6231
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6232 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6233 int one_byte_eol = -1, two_byte_eol = -1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6234 Lisp_Object tail;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6235
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6236 for (tail = val; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6237 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6238 struct coding_system *this
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6239 = (NILP (coding_system) ? coding_categories + XINT (XCAR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6240 : &coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6241 int this_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6242
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6243 attrs = CODING_ID_ATTRS (this->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6244 eol_type = CODING_ID_EOL_TYPE (this->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6245 XSETCAR (tail, CODING_ID_NAME (this->id));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6246 if (VECTORP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6247 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6248 if (EQ (CODING_ATTR_TYPE (attrs), Qutf_16))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6249 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6250 if (two_byte_eol < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6251 two_byte_eol = detect_eol (this, coding.source, src_bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6252 this_eol = two_byte_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6253 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6254 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6255 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6256 if (one_byte_eol < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6257 one_byte_eol =detect_eol (this, coding.source, src_bytes);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6258 this_eol = one_byte_eol;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6259 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6260 if (this_eol == EOL_SEEN_LF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6261 XSETCAR (tail, AREF (eol_type, 0));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6262 else if (this_eol == EOL_SEEN_CRLF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6263 XSETCAR (tail, AREF (eol_type, 1));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6264 else if (this_eol == EOL_SEEN_CR)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6265 XSETCAR (tail, AREF (eol_type, 2));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6266 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6267 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6268 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6269
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
6270 return (highest ? XCAR (val) : val);
42104
d69c2368e549 (DECODE_COMPOSITION_END): Fixed a typo in the last
Sam Steingold <sds@gnu.org>
parents: 42103
diff changeset
6271 }
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6272
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6273
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6274 DEFUN ("detect-coding-region", Fdetect_coding_region, Sdetect_coding_region,
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6275 2, 3, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6276 doc: /* Detect coding system of the text in the region between START and END.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6277 Return a list of possible coding systems ordered by priority.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6278
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6279 If only ASCII characters are found, it returns a list of single element
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6280 `undecided' or its subsidiary coding system according to a detected
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6281 end-of-line format.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6282
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6283 If optional argument HIGHEST is non-nil, return the coding system of
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6284 highest priority. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6285 (start, end, highest)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6286 Lisp_Object start, end, highest;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6287 {
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6288 int from, to;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6289 int from_byte, to_byte;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6290
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6291 CHECK_NUMBER_COERCE_MARKER (start);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6292 CHECK_NUMBER_COERCE_MARKER (end);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6293
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6294 validate_region (&start, &end);
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6295 from = XINT (start), to = XINT (end);
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6296 from_byte = CHAR_TO_BYTE (from);
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6297 to_byte = CHAR_TO_BYTE (to);
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6298
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6299 if (from < GPT && to >= GPT)
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6300 move_gap_both (to, to_byte);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6301
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6302 return detect_coding_system (BYTE_POS_ADDR (from_byte),
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6303 to_byte - from_byte,
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
6304 !NILP (highest),
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
6305 !NILP (current_buffer
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6306 ->enable_multibyte_characters),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6307 Qnil);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6308 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6309
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6310 DEFUN ("detect-coding-string", Fdetect_coding_string, Sdetect_coding_string,
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6311 1, 2, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6312 doc: /* Detect coding system of the text in STRING.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6313 Return a list of possible coding systems ordered by priority.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6314
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6315 If only ASCII characters are found, it returns a list of single element
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6316 `undecided' or its subsidiary coding system according to a detected
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6317 end-of-line format.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6318
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6319 If optional argument HIGHEST is non-nil, return the coding system of
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6320 highest priority. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6321 (string, highest)
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6322 Lisp_Object string, highest;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6323 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6324 CHECK_STRING (string);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6325
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6326 return detect_coding_system (XSTRING (string)->data,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6327 STRING_BYTES (XSTRING (string)),
34531
37f85e931855 (ONE_MORE_BYTE_CHECK_MULTIBYTE): New macro.
Kenichi Handa <handa@m17n.org>
parents: 34197
diff changeset
6328 !NILP (highest),
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6329 STRING_MULTIBYTE (string),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6330 Qnil);
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6331 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6332
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6333
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6334 static INLINE int
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6335 char_encodable_p (c, attrs)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6336 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6337 Lisp_Object attrs;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6338 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6339 Lisp_Object tail;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6340 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6341
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6342 for (tail = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6343 CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6344 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6345 charset = CHARSET_FROM_ID (XINT (XCAR (tail)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6346 if (CHAR_CHARSET_P (c, charset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6347 break;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6348 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6349 return (! NILP (tail));
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6350 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6351
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6352
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6353 /* Return a list of coding systems that safely encode the text between
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6354 START and END. If EXCLUDE is non-nil, it is a list of coding
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6355 systems not to check. The returned list doesn't contain any such
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6356 coding systems. In any case, If the text contains only ASCII or is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6357 unibyte, return t. */
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6358
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6359 DEFUN ("find-coding-systems-region-internal",
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6360 Ffind_coding_systems_region_internal,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6361 Sfind_coding_systems_region_internal, 2, 3, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6362 doc: /* Internal use only. */)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6363 (start, end, exclude)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6364 Lisp_Object start, end, exclude;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6365 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6366 Lisp_Object coding_attrs_list, safe_codings;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6367 EMACS_INT start_byte, end_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6368 unsigned char *p, *pbeg, *pend;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6369 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6370 Lisp_Object tail, elt;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6371
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6372 if (STRINGP (start))
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6373 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6374 if (!STRING_MULTIBYTE (start)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6375 && XSTRING (start)->size != STRING_BYTES (XSTRING (start)))
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6376 return Qt;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6377 start_byte = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6378 end_byte = STRING_BYTES (XSTRING (start));
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6379 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6380 else
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6381 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6382 CHECK_NUMBER_COERCE_MARKER (start);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6383 CHECK_NUMBER_COERCE_MARKER (end);
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6384 if (XINT (start) < BEG || XINT (end) > Z || XINT (start) > XINT (end))
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6385 args_out_of_range (start, end);
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6386 if (NILP (current_buffer->enable_multibyte_characters))
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6387 return Qt;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6388 start_byte = CHAR_TO_BYTE (XINT (start));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6389 end_byte = CHAR_TO_BYTE (XINT (end));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6390 if (XINT (end) - XINT (start) == end_byte - start_byte)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6391 return Qt;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6392
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6393 if (start < GPT && end > GPT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6394 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6395 if ((GPT - start) < (end - GPT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6396 move_gap_both (start, start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6397 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6398 move_gap_both (end, end_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6399 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6400 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6401
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6402 coding_attrs_list = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6403 for (tail = Vcoding_system_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6404 if (NILP (exclude)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6405 || NILP (Fmemq (XCAR (tail), exclude)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6406 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6407 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6408
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6409 attrs = AREF (CODING_SYSTEM_SPEC (XCAR (tail)), 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6410 if (EQ (XCAR (tail), CODING_ATTR_BASE_NAME (attrs))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6411 && ! EQ (CODING_ATTR_TYPE (attrs), Qundecided))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6412 coding_attrs_list = Fcons (attrs, coding_attrs_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6413 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6414
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6415 if (STRINGP (start))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6416 p = pbeg = XSTRING (start)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6417 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6418 p = pbeg = BYTE_POS_ADDR (start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6419 pend = p + (end_byte - start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6420
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6421 while (p < pend && ASCII_BYTE_P (*p)) p++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6422 while (p < pend && ASCII_BYTE_P (*(pend - 1))) pend--;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6423
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6424 while (p < pend)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6425 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6426 if (ASCII_BYTE_P (*p))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6427 p++;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6428 else
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6429 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6430 c = STRING_CHAR_ADVANCE (p);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6431
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6432 charset_map_loaded = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6433 for (tail = coding_attrs_list; CONSP (tail);)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6434 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6435 elt = XCAR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6436 if (NILP (elt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6437 tail = XCDR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6438 else if (char_encodable_p (c, elt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6439 tail = XCDR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6440 else if (CONSP (XCDR (tail)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6441 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6442 XSETCAR (tail, XCAR (XCDR (tail)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6443 XSETCDR (tail, XCDR (XCDR (tail)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6444 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6445 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6446 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6447 XSETCAR (tail, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6448 tail = XCDR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6449 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6450 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6451 if (charset_map_loaded)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6452 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6453 EMACS_INT p_offset = p - pbeg, pend_offset = pend - pbeg;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6454
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6455 if (STRINGP (start))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6456 pbeg = XSTRING (start)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6457 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6458 pbeg = BYTE_POS_ADDR (start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6459 p = pbeg + p_offset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6460 pend = pbeg + pend_offset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6461 }
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6462 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6463 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6464
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6465 safe_codings = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6466 for (tail = coding_attrs_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6467 if (! NILP (XCAR (tail)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6468 safe_codings = Fcons (CODING_ATTR_BASE_NAME (XCAR (tail)), safe_codings);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6469
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6470 return safe_codings;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6471 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6472
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6473
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6474 DEFUN ("check-coding-systems-region", Fcheck_coding_systems_region,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6475 Scheck_coding_systems_region, 3, 3, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6476 doc: /* Check if the region is encodable by coding systems.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6477
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6478 START and END are buffer positions specifying the region.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6479 CODING-SYSTEM-LIST is a list of coding systems to check.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6480
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6481 The value is an alist ((CODING-SYSTEM POS0 POS1 ...) ...), where
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6482 CODING-SYSTEM is a member of CODING-SYSTEM-LIst and can't encode the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6483 whole region, POS0, POS1, ... are buffer positions where non-encodable
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6484 characters are found.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6485
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6486 If all coding systems in CODING-SYSTEM-LIST can encode the region, the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6487 value is nil.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6488
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6489 START may be a string. In that case, check if the string is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6490 encodable, and the value contains indices to the string instead of
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6491 buffer positions. END is ignored. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6492 (start, end, coding_system_list)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6493 Lisp_Object start, end, coding_system_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6494 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6495 Lisp_Object list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6496 EMACS_INT start_byte, end_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6497 int pos;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6498 unsigned char *p, *pbeg, *pend;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6499 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6500 Lisp_Object tail, elt;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6501
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6502 if (STRINGP (start))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6503 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6504 if (!STRING_MULTIBYTE (start)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6505 && XSTRING (start)->size != STRING_BYTES (XSTRING (start)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6506 return Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6507 start_byte = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6508 end_byte = STRING_BYTES (XSTRING (start));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6509 pos = 0;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6510 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6511 else
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6512 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6513 CHECK_NUMBER_COERCE_MARKER (start);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6514 CHECK_NUMBER_COERCE_MARKER (end);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6515 if (XINT (start) < BEG || XINT (end) > Z || XINT (start) > XINT (end))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6516 args_out_of_range (start, end);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6517 if (NILP (current_buffer->enable_multibyte_characters))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6518 return Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6519 start_byte = CHAR_TO_BYTE (XINT (start));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6520 end_byte = CHAR_TO_BYTE (XINT (end));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6521 if (XINT (end) - XINT (start) == end_byte - start_byte)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6522 return Qt;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6523
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6524 if (start < GPT && end > GPT)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6525 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6526 if ((GPT - start) < (end - GPT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6527 move_gap_both (start, start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6528 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6529 move_gap_both (end, end_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6530 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6531 pos = start;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6532 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6533
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6534 list = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6535 for (tail = coding_system_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6536 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6537 elt = XCAR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6538 list = Fcons (Fcons (elt, Fcons (AREF (CODING_SYSTEM_SPEC (elt), 0),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6539 Qnil)),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6540 list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6541 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6542
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6543 if (STRINGP (start))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6544 p = pbeg = XSTRING (start)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6545 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6546 p = pbeg = BYTE_POS_ADDR (start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6547 pend = p + (end_byte - start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6548
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6549 while (p < pend && ASCII_BYTE_P (*p)) p++, pos++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6550 while (p < pend && ASCII_BYTE_P (*(pend - 1))) pend--;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6551
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6552 while (p < pend)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6553 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6554 if (ASCII_BYTE_P (*p))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6555 p++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6556 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6557 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6558 c = STRING_CHAR_ADVANCE (p);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6559
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6560 charset_map_loaded = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6561 for (tail = list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6562 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6563 elt = XCDR (XCAR (tail));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6564 if (! char_encodable_p (c, XCAR (elt)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6565 XSETCDR (elt, Fcons (make_number (pos), XCDR (elt)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6566 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6567 if (charset_map_loaded)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6568 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6569 EMACS_INT p_offset = p - pbeg, pend_offset = pend - pbeg;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6570
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6571 if (STRINGP (start))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6572 pbeg = XSTRING (start)->data;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6573 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6574 pbeg = BYTE_POS_ADDR (start_byte);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6575 p = pbeg + p_offset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6576 pend = pbeg + pend_offset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6577 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6578 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6579 pos++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6580 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6581
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6582 tail = list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6583 list = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6584 for (; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6585 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6586 elt = XCAR (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6587 if (CONSP (XCDR (XCDR (elt))))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6588 list = Fcons (Fcons (XCAR (elt), Fnreverse (XCDR (XCDR (elt)))),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6589 list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6590 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6591
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6592 return list;
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6593 }
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6594
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
6595
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6596
20803
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6597 Lisp_Object
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6598 code_convert_region (start, end, coding_system, dst_object, encodep, norecord)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6599 Lisp_Object start, end, coding_system, dst_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6600 int encodep, norecord;
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6601 {
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6602 struct coding_system coding;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6603 EMACS_INT from, from_byte, to, to_byte;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6604 Lisp_Object src_object;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6605
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6606 CHECK_NUMBER_COERCE_MARKER (start);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6607 CHECK_NUMBER_COERCE_MARKER (end);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6608 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6609 coding_system = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6610 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6611 CHECK_CODING_SYSTEM (coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6612 src_object = Fcurrent_buffer ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6613 if (NILP (dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6614 dst_object = src_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6615 else if (! EQ (dst_object, Qt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6616 CHECK_BUFFER (dst_object);
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6617
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6618 validate_region (&start, &end);
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6619 from = XFASTINT (start);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6620 from_byte = CHAR_TO_BYTE (from);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6621 to = XFASTINT (end);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6622 to_byte = CHAR_TO_BYTE (to);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6623
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6624 setup_coding_system (coding_system, &coding);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6625 coding.mode |= CODING_MODE_LAST_BLOCK;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6626
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6627 if (encodep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6628 encode_coding_object (&coding, src_object, from, from_byte, to, to_byte,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6629 dst_object);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6630 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6631 decode_coding_object (&coding, src_object, from, from_byte, to, to_byte,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6632 dst_object);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6633 if (! norecord)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6634 Vlast_coding_system_used = CODING_ID_NAME (coding.id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6635
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6636 if (coding.result != CODING_RESULT_SUCCESS)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6637 error ("Code conversion error: %d", coding.result);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6638
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6639 return (BUFFERP (dst_object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6640 ? make_number (coding.produced_char)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6641 : coding.dst_object);
20803
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6642 }
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6643
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6644
20803
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6645 DEFUN ("decode-coding-region", Fdecode_coding_region, Sdecode_coding_region,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6646 3, 4, "r\nzCoding system: ",
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6647 doc: /* Decode the current region from the specified coding system.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6648 When called from a program, takes four arguments:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6649 START, END, CODING-SYSTEM, and DESTINATION.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6650 START and END are buffer positions.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6651
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6652 Optional 4th arguments DESTINATION specifies where the decoded text goes.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6653 If nil, the region between START and END is replace by the decoded text.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6654 If buffer, the decoded text is inserted in the buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6655 If t, the decoded text is returned.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6656
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6657 This function sets `last-coding-system-used' to the precise coding system
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6658 used (which may be different from CODING-SYSTEM if CODING-SYSTEM is
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6659 not fully specified.)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6660 It returns the length of the decoded text. */)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6661 (start, end, coding_system, destination)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6662 Lisp_Object start, end, coding_system, destination;
20803
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6663 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6664 return code_convert_region (start, end, coding_system, destination, 0, 0);
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6665 }
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6666
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6667 DEFUN ("encode-coding-region", Fencode_coding_region, Sencode_coding_region,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6668 3, 4, "r\nzCoding system: ",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6669 doc: /* Encode the current region by specified coding system.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6670 When called from a program, takes three arguments:
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6671 START, END, and CODING-SYSTEM. START and END are buffer positions.
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6672
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6673 Optional 4th arguments DESTINATION specifies where the encoded text goes.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6674 If nil, the region between START and END is replace by the encoded text.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6675 If buffer, the encoded text is inserted in the buffer.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6676 If t, the encoded text is returned.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6677
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6678 This function sets `last-coding-system-used' to the precise coding system
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6679 used (which may be different from CODING-SYSTEM if CODING-SYSTEM is
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6680 not fully specified.)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6681 It returns the length of the encoded text. */)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6682 (start, end, coding_system, destination)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6683 Lisp_Object start, end, coding_system, destination;
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6684 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6685 return code_convert_region (start, end, coding_system, destination, 1, 0);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6686 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6687
20803
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6688 Lisp_Object
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6689 code_convert_string (string, coding_system, dst_object,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6690 encodep, nocopy, norecord)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6691 Lisp_Object string, coding_system, dst_object;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6692 int encodep, nocopy, norecord;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6693 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6694 struct coding_system coding;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6695 EMACS_INT chars, bytes;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6696
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6697 CHECK_STRING (string);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6698 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6699 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6700 if (! norecord)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6701 Vlast_coding_system_used = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6702 if (NILP (dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6703 return (nocopy ? Fcopy_sequence (string) : string);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6704 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6705
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
6706 if (NILP (coding_system))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6707 coding_system = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6708 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6709 CHECK_CODING_SYSTEM (coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6710 if (NILP (dst_object))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6711 dst_object = Qt;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6712 else if (! EQ (dst_object, Qt))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6713 CHECK_BUFFER (dst_object);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6714
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6715 setup_coding_system (coding_system, &coding);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
6716 coding.mode |= CODING_MODE_LAST_BLOCK;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6717 chars = XSTRING (string)->size;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6718 bytes = STRING_BYTES (XSTRING (string));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6719 if (encodep)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6720 encode_coding_object (&coding, string, 0, 0, chars, bytes, dst_object);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6721 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6722 decode_coding_object (&coding, string, 0, 0, chars, bytes, dst_object);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6723 if (! norecord)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6724 Vlast_coding_system_used = CODING_ID_NAME (coding.id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6725
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6726 if (coding.result != CODING_RESULT_SUCCESS)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6727 error ("Code conversion error: %d", coding.result);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6728
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6729 return (BUFFERP (dst_object)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6730 ? make_number (coding.produced_char)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6731 : coding.dst_object);
20803
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6732 }
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6733
0fa2183c587d (ENCODE_ISO_CHARACTER): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 20794
diff changeset
6734
22341
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6735 /* Encode or decode STRING according to CODING_SYSTEM.
26847
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
6736 Do not set Vlast_coding_system_used.
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
6737
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
6738 This function is called only from macros DECODE_FILE and
2f17ea330dae Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 26742
diff changeset
6739 ENCODE_FILE, thus we ignore character composition. */
22341
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6740
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6741 Lisp_Object
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6742 code_convert_string_norecord (string, coding_system, encodep)
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6743 Lisp_Object string, coding_system;
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6744 int encodep;
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6745 {
88430
6418a272b97e * coding.c: Delete unused variables.
Kenichi Handa <handa@m17n.org>
parents: 88365
diff changeset
6746 return code_convert_string (string, coding_system, Qt, encodep, 0, 1);
22341
572ba933a4bf (code_convert_string_norecord): New function.
Karl Heuer <kwzh@gnu.org>
parents: 22329
diff changeset
6747 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6748
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6749
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6750 DEFUN ("decode-coding-string", Fdecode_coding_string, Sdecode_coding_string,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6751 2, 4, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6752 doc: /* Decode STRING which is encoded in CODING-SYSTEM, and return the result.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6753
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6754 Optional third arg NOCOPY non-nil means it is OK to return STRING itself
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6755 if the decoding operation is trivial.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6756
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6757 Optional fourth arg BUFFER non-nil meant that the decoded text is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6758 inserted in BUFFER instead of returned as a astring. In this case,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6759 the return value is BUFFER.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6760
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6761 This function sets `last-coding-system-used' to the precise coding system
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6762 used (which may be different from CODING-SYSTEM if CODING-SYSTEM is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6763 not fully specified. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6764 (string, coding_system, nocopy, buffer)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6765 Lisp_Object string, coding_system, nocopy, buffer;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6766 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6767 return code_convert_string (string, coding_system, buffer,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6768 0, ! NILP (nocopy), 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6769 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6770
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6771 DEFUN ("encode-coding-string", Fencode_coding_string, Sencode_coding_string,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6772 2, 4, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6773 doc: /* Encode STRING to CODING-SYSTEM, and return the result.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6774
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6775 Optional third arg NOCOPY non-nil means it is OK to return STRING
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6776 itself if the encoding operation is trivial.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6777
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6778 Optional fourth arg BUFFER non-nil meant that the encoded text is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6779 inserted in BUFFER instead of returned as a astring. In this case,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6780 the return value is BUFFER.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6781
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6782 This function sets `last-coding-system-used' to the precise coding system
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6783 used (which may be different from CODING-SYSTEM if CODING-SYSTEM is
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6784 not fully specified.) */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6785 (string, coding_system, nocopy, buffer)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6786 Lisp_Object string, coding_system, nocopy, buffer;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6787 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6788 return code_convert_string (string, coding_system, buffer,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6789 nocopy, ! NILP (nocopy), 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6790 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6791
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6792
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6793 DEFUN ("decode-sjis-char", Fdecode_sjis_char, Sdecode_sjis_char, 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6794 doc: /* Decode a Japanese character which has CODE in shift_jis encoding.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6795 Return the corresponding character. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6796 (code)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6797 Lisp_Object code;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6798 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6799 Lisp_Object spec, attrs, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6800 struct charset *charset_roman, *charset_kanji, *charset_kana, *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6801 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6802
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6803 CHECK_NATNUM (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6804 c = XFASTINT (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6805 CHECK_CODING_SYSTEM_GET_SPEC (Vsjis_coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6806 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6807
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6808 if (ASCII_BYTE_P (c)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6809 && ! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6810 return code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6811
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6812 val = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6813 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6814 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6815 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6816
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6817 if (c <= 0x7F)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6818 charset = charset_roman;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6819 else if (c >= 0xA0 && c < 0xDF)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6820 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6821 charset = charset_kana;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6822 c -= 0x80;
24065
7e291dea6141 (Fdecode_sjis_char): Decode Japanese Katakana character
Kenichi Handa <handa@m17n.org>
parents: 24056
diff changeset
6823 }
7e291dea6141 (Fdecode_sjis_char): Decode Japanese Katakana character
Kenichi Handa <handa@m17n.org>
parents: 24056
diff changeset
6824 else
7e291dea6141 (Fdecode_sjis_char): Decode Japanese Katakana character
Kenichi Handa <handa@m17n.org>
parents: 24056
diff changeset
6825 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6826 int s1 = c >> 8, s2 = c & 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6827
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6828 if (s1 < 0x81 || (s1 > 0x9F && s1 < 0xE0) || s1 > 0xEF
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6829 || s2 < 0x40 || s2 == 0x7F || s2 > 0xFC)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6830 error ("Invalid code: %d", code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6831 SJIS_TO_JIS (c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6832 charset = charset_kanji;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6833 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6834 c = DECODE_CHAR (charset, c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6835 if (c < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6836 error ("Invalid code: %d", code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6837 return make_number (c);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6838 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6839
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6840
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6841 DEFUN ("encode-sjis-char", Fencode_sjis_char, Sencode_sjis_char, 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6842 doc: /* Encode a Japanese character CHAR to shift_jis encoding.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6843 Return the corresponding code in SJIS. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6844 (ch)
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6845 Lisp_Object ch;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6846 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6847 Lisp_Object spec, attrs, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6848 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6849 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6850 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6851
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6852 CHECK_CHARACTER (ch);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6853 c = XFASTINT (ch);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6854 CHECK_CODING_SYSTEM_GET_SPEC (Vsjis_coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6855 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6856
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6857 if (ASCII_CHAR_P (c)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6858 && ! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6859 return ch;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6860
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6861 charset_list = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6862 charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6863 if (code == CHARSET_INVALID_CODE (charset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6864 error ("Can't encode by shift_jis encoding: %d", c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6865 JIS_TO_SJIS (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6866
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6867 return make_number (code);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6868 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6869
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6870 DEFUN ("decode-big5-char", Fdecode_big5_char, Sdecode_big5_char, 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6871 doc: /* Decode a Big5 character which has CODE in BIG5 coding system.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6872 Return the corresponding character. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6873 (code)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6874 Lisp_Object code;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6875 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6876 Lisp_Object spec, attrs, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6877 struct charset *charset_roman, *charset_big5, *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6878 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6879
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6880 CHECK_NATNUM (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6881 c = XFASTINT (code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6882 CHECK_CODING_SYSTEM_GET_SPEC (Vbig5_coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6883 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6884
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6885 if (ASCII_BYTE_P (c)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6886 && ! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6887 return code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6888
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6889 val = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6890 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6891 charset_big5 = CHARSET_FROM_ID (XINT (XCAR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6892
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6893 if (c <= 0x7F)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6894 charset = charset_roman;
24324
2eec590faf26 (Fdecode_sjis_char, Fencode_sjis_char): Hanlde
Kenichi Handa <handa@m17n.org>
parents: 24316
diff changeset
6895 else
2eec590faf26 (Fdecode_sjis_char, Fencode_sjis_char): Hanlde
Kenichi Handa <handa@m17n.org>
parents: 24316
diff changeset
6896 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6897 int b1 = c >> 8, b2 = c & 0x7F;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6898 if (b1 < 0xA1 || b1 > 0xFE
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6899 || b2 < 0x40 || (b2 > 0x7E && b2 < 0xA1) || b2 > 0xFE)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6900 error ("Invalid code: %d", code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6901 charset = charset_big5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6902 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6903 c = DECODE_CHAR (charset, (unsigned )c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6904 if (c < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6905 error ("Invalid code: %d", code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6906 return make_number (c);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6907 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6908
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6909 DEFUN ("encode-big5-char", Fencode_big5_char, Sencode_big5_char, 1, 1, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6910 doc: /* Encode the Big5 character CHAR to BIG5 coding system.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6911 Return the corresponding character code in Big5. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6912 (ch)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6913 Lisp_Object ch;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6914 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6915 Lisp_Object spec, attrs, charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6916 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6917 int c;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6918 unsigned code;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6919
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6920 CHECK_CHARACTER (ch);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6921 c = XFASTINT (ch);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6922 CHECK_CODING_SYSTEM_GET_SPEC (Vbig5_coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6923 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6924 if (ASCII_CHAR_P (c)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6925 && ! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6926 return ch;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6927
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6928 charset_list = CODING_ATTR_CHARSET_LIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6929 charset = char_charset (c, charset_list, &code);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6930 if (code == CHARSET_INVALID_CODE (charset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6931 error ("Can't encode by Big5 encoding: %d", c);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6932
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6933 return make_number (code);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6934 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6935
20680
dd46027e8412 (code_convert_region): Always count chars inserted
Richard M. Stallman <rms@gnu.org>
parents: 20668
diff changeset
6936
18002
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
6937 DEFUN ("set-terminal-coding-system-internal",
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
6938 Fset_terminal_coding_system_internal,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6939 Sset_terminal_coding_system_internal, 1, 1, 0,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6940 doc: /* Internal use only. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6941 (coding_system)
88473
b47ee8b1ce03 (coding_inherit_eol_type)
Dave Love <fx@gnu.org>
parents: 88465
diff changeset
6942 Lisp_Object coding_system;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6943 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6944 CHECK_SYMBOL (coding_system);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6945 setup_coding_system (Fcheck_coding_system (coding_system),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6946 &terminal_coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6947
20150
402b6e5f4b58 (encode_designation_at_bol): Fix bug of finding graphic
Kenichi Handa <handa@m17n.org>
parents: 20105
diff changeset
6948 /* We had better not send unsafe characters to terminal. */
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6949 terminal_coding.mode |= CODING_MODE_SAFE_ENCODING;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6950 /* Characer composition should be disabled. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6951 terminal_coding.common_flags &= ~CODING_ANNOTATE_COMPOSITION_MASK;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
6952 terminal_coding.src_multibyte = 1;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
6953 terminal_coding.dst_multibyte = 0;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6954 return Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6955 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6956
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6957 DEFUN ("set-safe-terminal-coding-system-internal",
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6958 Fset_safe_terminal_coding_system_internal,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6959 Sset_safe_terminal_coding_system_internal, 1, 1, 0,
41006
fd83ec62a495 Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 40842
diff changeset
6960 doc: /* Internal use only. */)
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6961 (coding_system)
88473
b47ee8b1ce03 (coding_inherit_eol_type)
Dave Love <fx@gnu.org>
parents: 88465
diff changeset
6962 Lisp_Object coding_system;
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6963 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6964 CHECK_SYMBOL (coding_system);
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6965 setup_coding_system (Fcheck_coding_system (coding_system),
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6966 &safe_terminal_coding);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6967 /* Characer composition should be disabled. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6968 safe_terminal_coding.common_flags &= ~CODING_ANNOTATE_COMPOSITION_MASK;
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
6969 safe_terminal_coding.src_multibyte = 1;
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
6970 safe_terminal_coding.dst_multibyte = 0;
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6971 return Qnil;
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6972 }
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
6973
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6974 DEFUN ("terminal-coding-system",
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6975 Fterminal_coding_system, Sterminal_coding_system, 0, 0, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6976 doc: /* Return coding system specified for terminal output. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6977 ()
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6978 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6979 return CODING_ID_NAME (terminal_coding.id);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6980 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6981
18002
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
6982 DEFUN ("set-keyboard-coding-system-internal",
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
6983 Fset_keyboard_coding_system_internal,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6984 Sset_keyboard_coding_system_internal, 1, 1, 0,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6985 doc: /* Internal use only. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6986 (coding_system)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6987 Lisp_Object coding_system;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6988 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40461
diff changeset
6989 CHECK_SYMBOL (coding_system);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6990 setup_coding_system (Fcheck_coding_system (coding_system),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6991 &keyboard_coding);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6992 /* Characer composition should be disabled. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
6993 keyboard_coding.common_flags &= ~CODING_ANNOTATE_COMPOSITION_MASK;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6994 return Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6995 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6996
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6997 DEFUN ("keyboard-coding-system",
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6998 Fkeyboard_coding_system, Skeyboard_coding_system, 0, 0, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
6999 doc: /* Return coding system specified for decoding keyboard input. */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7000 ()
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7001 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7002 return CODING_ID_NAME (keyboard_coding.id);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7003 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7004
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7005
18536
69c0e220b626 (Vstandard_character_unification_table_for_decode):
Kenichi Handa <handa@m17n.org>
parents: 18523
diff changeset
7006 DEFUN ("find-operation-coding-system", Ffind_operation_coding_system,
69c0e220b626 (Vstandard_character_unification_table_for_decode):
Kenichi Handa <handa@m17n.org>
parents: 18523
diff changeset
7007 Sfind_operation_coding_system, 1, MANY, 0,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7008 doc: /* Choose a coding system for an operation based on the target name.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7009 The value names a pair of coding systems: (DECODING-SYSTEM . ENCODING-SYSTEM).
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7010 DECODING-SYSTEM is the coding system to use for decoding
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7011 \(in case OPERATION does decoding), and ENCODING-SYSTEM is the coding system
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7012 for encoding (in case OPERATION does encoding).
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7013
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7014 The first argument OPERATION specifies an I/O primitive:
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7015 For file I/O, `insert-file-contents' or `write-region'.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7016 For process I/O, `call-process', `call-process-region', or `start-process'.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7017 For network I/O, `open-network-stream'.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7018
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7019 The remaining arguments should be the same arguments that were passed
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7020 to the primitive. Depending on which primitive, one of those arguments
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7021 is selected as the TARGET. For example, if OPERATION does file I/O,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7022 whichever argument specifies the file name is TARGET.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7023
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7024 TARGET has a meaning which depends on OPERATION:
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7025 For file I/O, TARGET is a file name.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7026 For process I/O, TARGET is a process name.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7027 For network I/O, TARGET is a service name or a port number
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7028
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7029 This function looks up what specified for TARGET in,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7030 `file-coding-system-alist', `process-coding-system-alist',
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7031 or `network-coding-system-alist' depending on OPERATION.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7032 They may specify a coding system, a cons of coding systems,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7033 or a function symbol to call.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7034 In the last case, we call the function with one argument,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7035 which is a list of all the arguments given to this function.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7036
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7037 usage: (find-operation-coding-system OPERATION ARGUMENTS ...) */)
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7038 (nargs, args)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7039 int nargs;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7040 Lisp_Object *args;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7041 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7042 Lisp_Object operation, target_idx, target, val;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7043 register Lisp_Object chain;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7044
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7045 if (nargs < 2)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7046 error ("Too few arguments");
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7047 operation = args[0];
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7048 if (!SYMBOLP (operation)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7049 || !INTEGERP (target_idx = Fget (operation, Qtarget_idx)))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7050 error ("Invalid first arguement");
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7051 if (nargs < 1 + XINT (target_idx))
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7052 error ("Too few arguments for operation: %s",
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7053 XSYMBOL (operation)->name->data);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7054 target = args[XINT (target_idx) + 1];
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7055 if (!(STRINGP (target)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7056 || (EQ (operation, Qopen_network_stream) && INTEGERP (target))))
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7057 error ("Invalid %dth argument", XINT (target_idx) + 1);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7058
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18536
diff changeset
7059 chain = ((EQ (operation, Qinsert_file_contents)
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18536
diff changeset
7060 || EQ (operation, Qwrite_region))
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7061 ? Vfile_coding_system_alist
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18536
diff changeset
7062 : (EQ (operation, Qopen_network_stream)
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7063 ? Vnetwork_coding_system_alist
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7064 : Vprocess_coding_system_alist));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7065 if (NILP (chain))
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7066 return Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7067
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
7068 for (; CONSP (chain); chain = XCDR (chain))
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7069 {
19747
bed06df9cbc5 (setup_coding_system, Ffind_operation_coding_system)
Richard M. Stallman <rms@gnu.org>
parents: 19743
diff changeset
7070 Lisp_Object elt;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7071
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
7072 elt = XCAR (chain);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7073 if (CONSP (elt)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7074 && ((STRINGP (target)
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
7075 && STRINGP (XCAR (elt))
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
7076 && fast_string_match (XCAR (elt), target) >= 0)
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
7077 || (INTEGERP (target) && EQ (target, XCAR (elt)))))
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7078 {
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25370
diff changeset
7079 val = XCDR (elt);
19763
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7080 /* Here, if VAL is both a valid coding system and a valid
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7081 function symbol, we return VAL as a coding system. */
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7082 if (CONSP (val))
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7083 return val;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7084 if (! SYMBOLP (val))
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7085 return Qnil;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7086 if (! NILP (Fcoding_system_p (val)))
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7087 return Fcons (val, val);
19763
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7088 if (! NILP (Ffboundp (val)))
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7089 {
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7090 val = call1 (val, Flist (nargs, args));
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7091 if (CONSP (val))
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7092 return val;
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7093 if (SYMBOLP (val) && ! NILP (Fcoding_system_p (val)))
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7094 return Fcons (val, val);
ab2fd2c85986 (Ffind_operation_coding_system): If a function in
Kenichi Handa <handa@m17n.org>
parents: 19758
diff changeset
7095 }
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7096 return Qnil;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
7097 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7098 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7099 return Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7100 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7101
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7102 DEFUN ("set-coding-system-priority", Fset_coding_system_priority,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7103 Sset_coding_system_priority, 1, MANY, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7104 doc: /* Put higher priority to coding systems of the arguments. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7105 (nargs, args)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7106 int nargs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7107 Lisp_Object *args;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7108 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7109 int i, j;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7110 int changed[coding_category_max];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7111 enum coding_category priorities[coding_category_max];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7112
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7113 bzero (changed, sizeof changed);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7114
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7115 for (i = j = 0; i < nargs; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7116 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7117 enum coding_category category;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7118 Lisp_Object spec, attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7119
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7120 CHECK_CODING_SYSTEM_GET_SPEC (args[i], spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7121 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7122 category = XINT (CODING_ATTR_CATEGORY (attrs));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7123 if (changed[category])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7124 /* Ignore this coding system because a coding system of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7125 same category already had a higher priority. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7126 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7127 changed[category] = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7128 priorities[j++] = category;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7129 if (coding_categories[category].id >= 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7130 && ! EQ (args[i], CODING_ID_NAME (coding_categories[category].id)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7131 setup_coding_system (args[i], &coding_categories[category]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7132 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7133
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7134 /* Now we have decided top J priorities. Reflect the order of the
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7135 original priorities to the remaining priorities. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7136
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7137 for (i = j, j = 0; i < coding_category_max; i++, j++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7138 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7139 while (j < coding_category_max
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7140 && changed[coding_priorities[j]])
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7141 j++;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7142 if (j == coding_category_max)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7143 abort ();
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7144 priorities[i] = coding_priorities[j];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7145 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7146
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7147 bcopy (priorities, coding_priorities, sizeof priorities);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7148 return Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7149 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7150
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7151 DEFUN ("coding-system-priority-list", Fcoding_system_priority_list,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7152 Scoding_system_priority_list, 0, 1, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7153 doc: /* Return a list of coding systems ordered by their priorities. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7154 (highestp)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7155 Lisp_Object highestp;
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7156 {
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7157 int i;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7158 Lisp_Object val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7159
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7160 for (i = 0, val = Qnil; i < coding_category_max; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7161 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7162 enum coding_category category = coding_priorities[i];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7163 int id = coding_categories[category].id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7164 Lisp_Object attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7165
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7166 if (id < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7167 continue;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7168 attrs = CODING_ID_ATTRS (id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7169 if (! NILP (highestp))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7170 return CODING_ATTR_BASE_NAME (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7171 val = Fcons (CODING_ATTR_BASE_NAME (attrs), val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7172 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7173 return Fnreverse (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7174 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7175
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7176 static Lisp_Object
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7177 make_subsidiaries (base)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7178 Lisp_Object base;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7179 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7180 Lisp_Object subsidiaries;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7181 char *suffixes[] = { "-unix", "-dos", "-mac" };
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7182 int base_name_len = STRING_BYTES (XSYMBOL (base)->name);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7183 char *buf = (char *) alloca (base_name_len + 6);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7184 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7185
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7186 bcopy (XSYMBOL (base)->name->data, buf, base_name_len);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7187 subsidiaries = Fmake_vector (make_number (3), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7188 for (i = 0; i < 3; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7189 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7190 bcopy (suffixes[i], buf + base_name_len, strlen (suffixes[i]) + 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7191 ASET (subsidiaries, i, intern (buf));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7192 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7193 return subsidiaries;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7194 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7195
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7196
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7197 DEFUN ("define-coding-system-internal", Fdefine_coding_system_internal,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7198 Sdefine_coding_system_internal, coding_arg_max, MANY, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7199 doc: /* For internal use only. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7200 (nargs, args)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7201 int nargs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7202 Lisp_Object *args;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7203 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7204 Lisp_Object name;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7205 Lisp_Object spec_vec; /* [ ATTRS ALIASE EOL_TYPE ] */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7206 Lisp_Object attrs; /* Vector of attributes. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7207 Lisp_Object eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7208 Lisp_Object aliases;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7209 Lisp_Object coding_type, charset_list, safe_charsets;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7210 enum coding_category category;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7211 Lisp_Object tail, val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7212 int max_charset_id = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7213 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7214
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7215 if (nargs < coding_arg_max)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7216 goto short_args;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7217
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7218 attrs = Fmake_vector (make_number (coding_attr_last_index), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7219
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7220 name = args[coding_arg_name];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7221 CHECK_SYMBOL (name);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7222 CODING_ATTR_BASE_NAME (attrs) = name;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7223
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7224 val = args[coding_arg_mnemonic];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7225 if (! STRINGP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7226 CHECK_CHARACTER (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7227 CODING_ATTR_MNEMONIC (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7228
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7229 coding_type = args[coding_arg_coding_type];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7230 CHECK_SYMBOL (coding_type);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7231 CODING_ATTR_TYPE (attrs) = coding_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7232
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7233 charset_list = args[coding_arg_charset_list];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7234 if (SYMBOLP (charset_list))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7235 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7236 if (EQ (charset_list, Qiso_2022))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7237 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7238 if (! EQ (coding_type, Qiso_2022))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7239 error ("Invalid charset-list");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7240 charset_list = Viso_2022_charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7241 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7242 else if (EQ (charset_list, Qemacs_mule))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7243 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7244 if (! EQ (coding_type, Qemacs_mule))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7245 error ("Invalid charset-list");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7246 charset_list = Vemacs_mule_charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7247 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7248 for (tail = charset_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7249 if (max_charset_id < XFASTINT (XCAR (tail)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7250 max_charset_id = XFASTINT (XCAR (tail));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7251 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7252 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7253 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7254 charset_list = Fcopy_sequence (charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7255 for (tail = charset_list; !NILP (tail); tail = Fcdr (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7256 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7257 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7258
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7259 val = Fcar (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7260 CHECK_CHARSET_GET_CHARSET (val, charset);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7261 if (EQ (coding_type, Qiso_2022)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7262 ? CHARSET_ISO_FINAL (charset) < 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7263 : EQ (coding_type, Qemacs_mule)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7264 ? CHARSET_EMACS_MULE_ID (charset) < 0
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7265 : 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7266 error ("Can't handle charset `%s'",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7267 XSYMBOL (CHARSET_NAME (charset))->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7268
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7269 XCAR (tail) = make_number (charset->id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7270 if (max_charset_id < charset->id)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7271 max_charset_id = charset->id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7272 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7273 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7274 CODING_ATTR_CHARSET_LIST (attrs) = charset_list;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7275
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7276 safe_charsets = Fmake_string (make_number (max_charset_id + 1),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7277 make_number (255));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7278 for (tail = charset_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7279 XSTRING (safe_charsets)->data[XFASTINT (XCAR (tail))] = 0;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7280 CODING_ATTR_SAFE_CHARSETS (attrs) = safe_charsets;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7281
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7282 val = args[coding_arg_decode_translation_table];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7283 if (! NILP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7284 CHECK_CHAR_TABLE (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7285 CODING_ATTR_DECODE_TBL (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7286
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7287 val = args[coding_arg_encode_translation_table];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7288 if (! NILP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7289 CHECK_CHAR_TABLE (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7290 CODING_ATTR_ENCODE_TBL (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7291
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7292 val = args[coding_arg_post_read_conversion];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7293 CHECK_SYMBOL (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7294 CODING_ATTR_POST_READ (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7295
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7296 val = args[coding_arg_pre_write_conversion];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7297 CHECK_SYMBOL (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7298 CODING_ATTR_PRE_WRITE (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7299
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7300 val = args[coding_arg_default_char];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7301 if (NILP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7302 CODING_ATTR_DEFAULT_CHAR (attrs) = make_number (' ');
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7303 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7304 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7305 CHECK_CHARACTER (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7306 CODING_ATTR_DEFAULT_CHAR (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7307 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7308
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7309 val = args[coding_arg_plist];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7310 CHECK_LIST (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7311 CODING_ATTR_PLIST (attrs) = val;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7312
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7313 if (EQ (coding_type, Qcharset))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7314 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7315 val = Fmake_vector (make_number (256), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7316
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7317 for (tail = charset_list; CONSP (tail); tail = XCDR (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7318 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7319 struct charset *charset = CHARSET_FROM_ID (XINT (XCAR (tail)));
88477
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7320 int idx = (CHARSET_DIMENSION (charset) - 1) * 4;
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7321
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7322 for (i = charset->code_space[idx];
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7323 i <= charset->code_space[idx + 1]; i++)
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7324 {
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7325 if (NILP (AREF (val, i)))
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7326 ASET (val, i, XCAR (tail));
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7327 else
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7328 error ("Charsets conflicts in the first byte");
5f974cbba7b3 (coding_set_source): Delete the local variable beg_byte.
Kenichi Handa <handa@m17n.org>
parents: 88473
diff changeset
7329 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7330 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7331 ASET (attrs, coding_attr_charset_valids, val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7332 category = coding_category_charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7333 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7334 else if (EQ (coding_type, Qccl))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7335 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7336 Lisp_Object valids;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7337
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7338 if (nargs < coding_arg_ccl_max)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7339 goto short_args;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7340
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7341 val = args[coding_arg_ccl_decoder];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7342 CHECK_CCL_PROGRAM (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7343 if (VECTORP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7344 val = Fcopy_sequence (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7345 ASET (attrs, coding_attr_ccl_decoder, val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7346
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7347 val = args[coding_arg_ccl_encoder];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7348 CHECK_CCL_PROGRAM (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7349 if (VECTORP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7350 val = Fcopy_sequence (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7351 ASET (attrs, coding_attr_ccl_encoder, val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7352
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7353 val = args[coding_arg_ccl_valids];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7354 valids = Fmake_string (make_number (256), make_number (0));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7355 for (tail = val; !NILP (tail); tail = Fcdr (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7356 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7357 val = Fcar (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7358 if (INTEGERP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7359 ASET (valids, XINT (val), 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7360 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7361 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7362 int from, to;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7363
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7364 CHECK_CONS (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7365 CHECK_NUMBER (XCAR (val));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7366 CHECK_NUMBER (XCDR (val));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7367 from = XINT (XCAR (val));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7368 to = XINT (XCDR (val));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7369 for (i = from; i <= to; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7370 ASET (valids, i, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7371 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7372 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7373 ASET (attrs, coding_attr_ccl_valids, valids);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7374
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7375 category = coding_category_ccl;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7376 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7377 else if (EQ (coding_type, Qutf_16))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7378 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7379 Lisp_Object bom, endian;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7380
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7381 if (nargs < coding_arg_utf16_max)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7382 goto short_args;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7383
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7384 bom = args[coding_arg_utf16_bom];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7385 if (! NILP (bom) && ! EQ (bom, Qt))
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
7386 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7387 CHECK_CONS (bom);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7388 CHECK_CODING_SYSTEM (XCAR (bom));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7389 CHECK_CODING_SYSTEM (XCDR (bom));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7390 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7391 ASET (attrs, coding_attr_utf_16_bom, bom);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7392
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7393 endian = args[coding_arg_utf16_endian];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7394 ASET (attrs, coding_attr_utf_16_endian, endian);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7395
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7396 category = (CONSP (bom)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7397 ? coding_category_utf_16_auto
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7398 : NILP (bom)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7399 ? (NILP (endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7400 ? coding_category_utf_16_be_nosig
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7401 : coding_category_utf_16_le_nosig)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7402 : (NILP (endian)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7403 ? coding_category_utf_16_be
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7404 : coding_category_utf_16_le));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7405 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7406 else if (EQ (coding_type, Qiso_2022))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7407 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7408 Lisp_Object initial, reg_usage, request, flags;
88430
6418a272b97e * coding.c: Delete unused variables.
Kenichi Handa <handa@m17n.org>
parents: 88365
diff changeset
7409 int i, id;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7410
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7411 if (nargs < coding_arg_iso2022_max)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7412 goto short_args;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7413
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7414 initial = Fcopy_sequence (args[coding_arg_iso2022_initial]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7415 CHECK_VECTOR (initial);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7416 for (i = 0; i < 4; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7417 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7418 val = Faref (initial, make_number (i));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7419 if (! NILP (val))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7420 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7421 CHECK_CHARSET_GET_ID (val, id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7422 ASET (initial, i, make_number (id));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7423 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7424 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7425 ASET (initial, i, make_number (-1));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7426 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7427
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7428 reg_usage = args[coding_arg_iso2022_reg_usage];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7429 CHECK_CONS (reg_usage);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7430 CHECK_NATNUM (XCAR (reg_usage));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7431 CHECK_NATNUM (XCDR (reg_usage));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7432
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7433 request = Fcopy_sequence (args[coding_arg_iso2022_request]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7434 for (tail = request; ! NILP (tail); tail = Fcdr (tail))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7435 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7436 int id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7437
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7438 val = Fcar (tail);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7439 CHECK_CONS (val);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7440 CHECK_CHARSET_GET_ID (XCAR (val), id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7441 CHECK_NATNUM (XCDR (val));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7442 if (XINT (XCDR (val)) >= 4)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7443 error ("Invalid graphic register number: %d", XINT (XCDR (val)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7444 XCAR (val) = make_number (id);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7445 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7446
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7447 flags = args[coding_arg_iso2022_flags];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7448 CHECK_NATNUM (flags);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7449 i = XINT (flags);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7450 if (EQ (args[coding_arg_charset_list], Qiso_2022))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7451 flags = make_number (i | CODING_ISO_FLAG_FULL_SUPPORT);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7452
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7453 ASET (attrs, coding_attr_iso_initial, initial);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7454 ASET (attrs, coding_attr_iso_usage, reg_usage);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7455 ASET (attrs, coding_attr_iso_request, request);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7456 ASET (attrs, coding_attr_iso_flags, flags);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7457 setup_iso_safe_charsets (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7458
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7459 if (i & CODING_ISO_FLAG_SEVEN_BITS)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7460 category = ((i & (CODING_ISO_FLAG_LOCKING_SHIFT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7461 | CODING_ISO_FLAG_SINGLE_SHIFT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7462 ? coding_category_iso_7_else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7463 : EQ (args[coding_arg_charset_list], Qiso_2022)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7464 ? coding_category_iso_7
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7465 : coding_category_iso_7_tight);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7466 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7467 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7468 int id = XINT (AREF (initial, 1));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7469
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7470 category = (((i & (CODING_ISO_FLAG_LOCKING_SHIFT
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7471 | CODING_ISO_FLAG_SINGLE_SHIFT))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7472 || EQ (args[coding_arg_charset_list], Qiso_2022)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7473 || id < 0)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7474 ? coding_category_iso_8_else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7475 : (CHARSET_DIMENSION (CHARSET_FROM_ID (id)) == 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7476 ? coding_category_iso_8_1
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7477 : coding_category_iso_8_2);
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
7478 }
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7479 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7480 else if (EQ (coding_type, Qemacs_mule))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7481 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7482 if (EQ (args[coding_arg_charset_list], Qemacs_mule))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7483 ASET (attrs, coding_attr_emacs_mule_full, Qt);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7484
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7485 category = coding_category_emacs_mule;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7486 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7487 else if (EQ (coding_type, Qshift_jis))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7488 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7489
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7490 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7491
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7492 if (XINT (Flength (charset_list)) != 3)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7493 error ("There should be just three charsets");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7494
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7495 charset = CHARSET_FROM_ID (XINT (XCAR (charset_list)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7496 if (CHARSET_DIMENSION (charset) != 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7497 error ("Dimension of charset %s is not one",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7498 XSYMBOL (CHARSET_NAME (charset))->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7499
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7500 charset_list = XCDR (charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7501 charset = CHARSET_FROM_ID (XINT (XCAR (charset_list)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7502 if (CHARSET_DIMENSION (charset) != 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7503 error ("Dimension of charset %s is not one",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7504 XSYMBOL (CHARSET_NAME (charset))->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7505
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7506 charset_list = XCDR (charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7507 charset = CHARSET_FROM_ID (XINT (XCAR (charset_list)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7508 if (CHARSET_DIMENSION (charset) != 2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7509 error ("Dimension of charset %s is not two",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7510 XSYMBOL (CHARSET_NAME (charset))->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7511
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7512 category = coding_category_sjis;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7513 Vsjis_coding_system = name;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7514 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7515 else if (EQ (coding_type, Qbig5))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7516 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7517 struct charset *charset;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7518
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7519 if (XINT (Flength (charset_list)) != 2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7520 error ("There should be just two charsets");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7521
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7522 charset = CHARSET_FROM_ID (XINT (XCAR (charset_list)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7523 if (CHARSET_DIMENSION (charset) != 1)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7524 error ("Dimension of charset %s is not one",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7525 XSYMBOL (CHARSET_NAME (charset))->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7526
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7527 charset_list = XCDR (charset_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7528 charset = CHARSET_FROM_ID (XINT (XCAR (charset_list)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7529 if (CHARSET_DIMENSION (charset) != 2)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7530 error ("Dimension of charset %s is not two",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7531 XSYMBOL (CHARSET_NAME (charset))->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7532
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7533 category = coding_category_big5;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7534 Vbig5_coding_system = name;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7535 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7536 else if (EQ (coding_type, Qraw_text))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7537 category = coding_category_raw_text;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7538 else if (EQ (coding_type, Qutf_8))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7539 category = coding_category_utf_8;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7540 else if (EQ (coding_type, Qundecided))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7541 category = coding_category_undecided;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7542 else
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7543 error ("Invalid coding system type: %s",
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7544 XSYMBOL (coding_type)->name->data);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7545
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7546 CODING_ATTR_CATEGORY (attrs) = make_number (category);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7547
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7548 eol_type = args[coding_arg_eol_type];
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7549 if (! NILP (eol_type)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7550 && ! EQ (eol_type, Qunix)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7551 && ! EQ (eol_type, Qdos)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7552 && ! EQ (eol_type, Qmac))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7553 error ("Invalid eol-type");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7554
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7555 aliases = Fcons (name, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7556
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7557 if (NILP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7558 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7559 eol_type = make_subsidiaries (name);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7560 for (i = 0; i < 3; i++)
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
7561 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7562 Lisp_Object this_spec, this_name, this_aliases, this_eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7563
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7564 this_name = AREF (eol_type, i);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7565 this_aliases = Fcons (this_name, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7566 this_eol_type = (i == 0 ? Qunix : i == 1 ? Qdos : Qmac);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7567 this_spec = Fmake_vector (make_number (3), attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7568 ASET (this_spec, 1, this_aliases);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7569 ASET (this_spec, 2, this_eol_type);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7570 Fputhash (this_name, this_spec, Vcoding_system_hash_table);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7571 Vcoding_system_list = Fcons (this_name, Vcoding_system_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7572 Vcoding_system_alist = Fcons (Fcons (Fsymbol_name (this_name), Qnil),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7573 Vcoding_system_alist);
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
7574 }
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7575 }
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
7576
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7577 spec_vec = Fmake_vector (make_number (3), attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7578 ASET (spec_vec, 1, aliases);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7579 ASET (spec_vec, 2, eol_type);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7580
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7581 Fputhash (name, spec_vec, Vcoding_system_hash_table);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7582 Vcoding_system_list = Fcons (name, Vcoding_system_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7583 Vcoding_system_alist = Fcons (Fcons (Fsymbol_name (name), Qnil),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7584 Vcoding_system_alist);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7585
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7586 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7587 int id = coding_categories[category].id;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7588
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7589 if (id < 0 || EQ (name, CODING_ID_NAME (id)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7590 setup_coding_system (name, &coding_categories[category]);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7591 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7592
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7593 return Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7594
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7595 short_args:
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7596 return Fsignal (Qwrong_number_of_arguments,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7597 Fcons (intern ("define-coding-system-internal"),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7598 make_number (nargs)));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7599 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7600
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7601 DEFUN ("define-coding-system-alias", Fdefine_coding_system_alias,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7602 Sdefine_coding_system_alias, 2, 2, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7603 doc: /* Define ALIAS as an alias for CODING-SYSTEM. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7604 (alias, coding_system)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7605 Lisp_Object alias, coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7606 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7607 Lisp_Object spec, aliases, eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7608
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7609 CHECK_SYMBOL (alias);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7610 CHECK_CODING_SYSTEM_GET_SPEC (coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7611 aliases = AREF (spec, 1);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7612 while (!NILP (XCDR (aliases)))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7613 aliases = XCDR (aliases);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7614 XCDR (aliases) = Fcons (alias, Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7615
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7616 eol_type = AREF (spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7617 if (VECTORP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7618 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7619 Lisp_Object subsidiaries;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7620 int i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7621
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7622 subsidiaries = make_subsidiaries (alias);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7623 for (i = 0; i < 3; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7624 Fdefine_coding_system_alias (AREF (subsidiaries, i),
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7625 AREF (eol_type, i));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7626
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7627 ASET (spec, 2, subsidiaries);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7628 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7629
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7630 Fputhash (alias, spec, Vcoding_system_hash_table);
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
7631 Vcoding_system_alist = Fcons (Fcons (alias, Qnil), Vcoding_system_alist);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7632
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7633 return Qnil;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7634 }
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7635
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7636 DEFUN ("coding-system-base", Fcoding_system_base, Scoding_system_base,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7637 1, 1, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7638 doc: /* Return the base of CODING-SYSTEM.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7639 Any alias or subsidiary coding systems are not base coding system. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7640 (coding_system)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7641 Lisp_Object coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7642 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7643 Lisp_Object spec, attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7644
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7645 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7646 return (Qno_conversion);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7647 CHECK_CODING_SYSTEM_GET_SPEC (coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7648 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7649 return CODING_ATTR_BASE_NAME (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7650 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7651
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7652 DEFUN ("coding-system-plist", Fcoding_system_plist, Scoding_system_plist,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7653 1, 1, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7654 doc: "Return the property list of CODING-SYSTEM.")
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7655 (coding_system)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7656 Lisp_Object coding_system;
22226
557fac086b1b (ascii_skip_code): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22186
diff changeset
7657 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7658 Lisp_Object spec, attrs;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7659
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7660 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7661 coding_system = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7662 CHECK_CODING_SYSTEM_GET_SPEC (coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7663 attrs = AREF (spec, 0);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7664 return CODING_ATTR_PLIST (attrs);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7665 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7666
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7667
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7668 DEFUN ("coding-system-aliases", Fcoding_system_aliases, Scoding_system_aliases,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7669 1, 1, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7670 doc: /* Return the list of aliases of CODING-SYSTEM.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7671 A base coding system is what made by `define-coding-system'.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7672 Any alias nor subsidiary coding systems are not base coding system. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7673 (coding_system)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7674 Lisp_Object coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7675 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7676 Lisp_Object spec;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7677
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7678 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7679 coding_system = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7680 CHECK_CODING_SYSTEM_GET_SPEC (coding_system, spec);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7681 return AREF (spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7682 }
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7683
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7684 DEFUN ("coding-system-eol-type", Fcoding_system_eol_type,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7685 Scoding_system_eol_type, 1, 1, 0,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7686 doc: /* Return eol-type of CODING-SYSTEM.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7687 An eol-type is integer 0, 1, 2, or a vector of coding systems.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7688
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7689 Integer values 0, 1, and 2 indicate a format of end-of-line; LF, CRLF,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7690 and CR respectively.
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7691
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7692 A vector value indicates that a format of end-of-line should be
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7693 detected automatically. Nth element of the vector is the subsidiary
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7694 coding system whose eol-type is N. */)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7695 (coding_system)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7696 Lisp_Object coding_system;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7697 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7698 Lisp_Object spec, eol_type;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7699 int n;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7700
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7701 if (NILP (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7702 coding_system = Qno_conversion;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7703 if (! CODING_SYSTEM_P (coding_system))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7704 return Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7705 spec = CODING_SYSTEM_SPEC (coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7706 eol_type = AREF (spec, 2);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7707 if (VECTORP (eol_type))
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7708 return Fcopy_sequence (eol_type);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7709 n = EQ (eol_type, Qunix) ? 0 : EQ (eol_type, Qdos) ? 1 : 2;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7710 return make_number (n);
22226
557fac086b1b (ascii_skip_code): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22186
diff changeset
7711 }
557fac086b1b (ascii_skip_code): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22186
diff changeset
7712
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7713 #endif /* emacs */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7714
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7715
22874
b133f07a76db (Qvalid_codes): New variable.
Kenichi Handa <handa@m17n.org>
parents: 22812
diff changeset
7716 /*** 9. Post-amble ***/
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7717
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21505
diff changeset
7718 void
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7719 init_coding_once ()
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7720 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7721 int i;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7722
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7723 for (i = 0; i < coding_category_max; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7724 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7725 coding_categories[i].id = -1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7726 coding_priorities[i] = i;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7727 }
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7728
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7729 /* ISO2022 specific initialize routine. */
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7730 for (i = 0; i < 0x20; i++)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
7731 iso_code_class[i] = ISO_control_0;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7732 for (i = 0x21; i < 0x7F; i++)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7733 iso_code_class[i] = ISO_graphic_plane_0;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7734 for (i = 0x80; i < 0xA0; i++)
29005
b396df3a5181 (ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to
Kenichi Handa <handa@m17n.org>
parents: 28512
diff changeset
7735 iso_code_class[i] = ISO_control_1;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7736 for (i = 0xA1; i < 0xFF; i++)
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7737 iso_code_class[i] = ISO_graphic_plane_1;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7738 iso_code_class[0x20] = iso_code_class[0x7F] = ISO_0x20_or_0x7F;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7739 iso_code_class[0xA0] = iso_code_class[0xFF] = ISO_0xA0_or_0xFF;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7740 iso_code_class[ISO_CODE_CR] = ISO_carriage_return;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7741 iso_code_class[ISO_CODE_SO] = ISO_shift_out;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7742 iso_code_class[ISO_CODE_SI] = ISO_shift_in;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7743 iso_code_class[ISO_CODE_SS2_7] = ISO_single_shift_2_7;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7744 iso_code_class[ISO_CODE_ESC] = ISO_escape;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7745 iso_code_class[ISO_CODE_SS2] = ISO_single_shift_2;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7746 iso_code_class[ISO_CODE_SS3] = ISO_single_shift_3;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7747 iso_code_class[ISO_CODE_CSI] = ISO_control_sequence_introducer;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7748
26067
f54ca66e2571 (code_convert_string): Add record_unwind_protect to
Kenichi Handa <handa@m17n.org>
parents: 25860
diff changeset
7749 inhibit_pre_post_conversion = 0;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7750
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7751 for (i = 0; i < 256; i++)
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7752 {
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7753 emacs_mule_bytes[i] = 1;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7754 }
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7755 }
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7756
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7757 #ifdef emacs
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7758
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21505
diff changeset
7759 void
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7760 syms_of_coding ()
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7761 {
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7762 staticpro (&Vcoding_system_hash_table);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7763 Vcoding_system_hash_table = Fmakehash (Qeq);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7764
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7765 staticpro (&Vsjis_coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7766 Vsjis_coding_system = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7767
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7768 staticpro (&Vbig5_coding_system);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7769 Vbig5_coding_system = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7770
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7771 staticpro (&Vcode_conversion_work_buf_list);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7772 Vcode_conversion_work_buf_list = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7773
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7774 staticpro (&Vcode_conversion_reused_work_buf);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7775 Vcode_conversion_reused_work_buf = Qnil;
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7776
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7777 DEFSYM (Qcharset, "charset");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7778 DEFSYM (Qtarget_idx, "target-idx");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7779 DEFSYM (Qcoding_system_history, "coding-system-history");
19750
95e4e1cba6ac (Qcoding_system_history): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 19747
diff changeset
7780 Fset (Qcoding_system_history, Qnil);
95e4e1cba6ac (Qcoding_system_history): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 19747
diff changeset
7781
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7782 /* Target FILENAME is the first argument. */
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7783 Fput (Qinsert_file_contents, Qtarget_idx, make_number (0));
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7784 /* Target FILENAME is the third argument. */
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7785 Fput (Qwrite_region, Qtarget_idx, make_number (2));
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7786
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7787 DEFSYM (Qcall_process, "call-process");
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7788 /* Target PROGRAM is the first argument. */
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7789 Fput (Qcall_process, Qtarget_idx, make_number (0));
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7790
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7791 DEFSYM (Qcall_process_region, "call-process-region");
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7792 /* Target PROGRAM is the third argument. */
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7793 Fput (Qcall_process_region, Qtarget_idx, make_number (2));
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7794
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7795 DEFSYM (Qstart_process, "start-process");
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7796 /* Target PROGRAM is the third argument. */
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7797 Fput (Qstart_process, Qtarget_idx, make_number (2));
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7798
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7799 DEFSYM (Qopen_network_stream, "open-network-stream");
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7800 /* Target SERVICE is the fourth argument. */
17119
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7801 Fput (Qopen_network_stream, Qtarget_idx, make_number (3));
2cfb31c15ced (create_process, Fopen_network_stream): Typo in indexes
Kenichi Handa <handa@m17n.org>
parents: 17071
diff changeset
7802
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7803 DEFSYM (Qcoding_system, "coding-system");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7804 DEFSYM (Qcoding_aliases, "coding-aliases");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7805
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7806 DEFSYM (Qeol_type, "eol-type");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7807 DEFSYM (Qunix, "unix");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7808 DEFSYM (Qdos, "dos");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7809 DEFSYM (Qmac, "mac");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7810
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7811 DEFSYM (Qbuffer_file_coding_system, "buffer-file-coding-system");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7812 DEFSYM (Qpost_read_conversion, "post-read-conversion");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7813 DEFSYM (Qpre_write_conversion, "pre-write-conversion");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7814 DEFSYM (Qdefault_char, "default-char");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7815 DEFSYM (Qundecided, "undecided");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7816 DEFSYM (Qno_conversion, "no-conversion");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7817 DEFSYM (Qraw_text, "raw-text");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7818
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7819 DEFSYM (Qiso_2022, "iso-2022");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7820
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7821 DEFSYM (Qutf_8, "utf-8");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7822
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7823 DEFSYM (Qutf_16, "utf-16");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7824 DEFSYM (Qutf_16_be, "utf-16-be");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7825 DEFSYM (Qutf_16_be_nosig, "utf-16-be-nosig");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7826 DEFSYM (Qutf_16_le, "utf-16-l3");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7827 DEFSYM (Qutf_16_le_nosig, "utf-16-le-nosig");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7828 DEFSYM (Qsignature, "signature");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7829 DEFSYM (Qendian, "endian");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7830 DEFSYM (Qbig, "big");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7831 DEFSYM (Qlittle, "little");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7832
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7833 DEFSYM (Qshift_jis, "shift-jis");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7834 DEFSYM (Qbig5, "big5");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7835
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7836 DEFSYM (Qcoding_system_p, "coding-system-p");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7837
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7838 DEFSYM (Qcoding_system_error, "coding-system-error");
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7839 Fput (Qcoding_system_error, Qerror_conditions,
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7840 Fcons (Qcoding_system_error, Fcons (Qerror, Qnil)));
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7841 Fput (Qcoding_system_error, Qerror_message,
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7842 build_string ("Invalid coding system"));
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7843
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
7844 /* Intern this now in case it isn't already done.
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
7845 Setting this variable twice is harmless.
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
7846 But don't staticpro it here--that is done in alloc.c. */
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
7847 Qchar_table_extra_slots = intern ("char-table-extra-slots");
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7848
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7849 DEFSYM (Qtranslation_table, "translation-table");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7850 Fput (Qtranslation_table, Qchar_table_extra_slots, make_number (1));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7851 DEFSYM (Qtranslation_table_id, "translation-table-id");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7852 DEFSYM (Qtranslation_table_for_decode, "translation-table-for-decode");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7853 DEFSYM (Qtranslation_table_for_encode, "translation-table-for-encode");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7854
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7855 DEFSYM (Qchar_coding_system, "char-coding-system");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7856
41678
5aa97e545399 (syms_of_coding) <Qchar_coding_system>: Give it an
Dave Love <fx@gnu.org>
parents: 41624
diff changeset
7857 Fput (Qchar_coding_system, Qchar_table_extra_slots, make_number (2));
20150
402b6e5f4b58 (encode_designation_at_bol): Fix bug of finding graphic
Kenichi Handa <handa@m17n.org>
parents: 20105
diff changeset
7858
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7859 DEFSYM (Qvalid_codes, "valid-codes");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7860
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7861 DEFSYM (Qemacs_mule, "emacs-mule");
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7862
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7863 Vcoding_category_table
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7864 = Fmake_vector (make_number (coding_category_max), Qnil);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7865 staticpro (&Vcoding_category_table);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7866 /* Followings are target of code detection. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7867 ASET (Vcoding_category_table, coding_category_iso_7,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7868 intern ("coding-category-iso-7"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7869 ASET (Vcoding_category_table, coding_category_iso_7_tight,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7870 intern ("coding-category-iso-7-tight"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7871 ASET (Vcoding_category_table, coding_category_iso_8_1,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7872 intern ("coding-category-iso-8-1"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7873 ASET (Vcoding_category_table, coding_category_iso_8_2,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7874 intern ("coding-category-iso-8-2"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7875 ASET (Vcoding_category_table, coding_category_iso_7_else,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7876 intern ("coding-category-iso-7-else"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7877 ASET (Vcoding_category_table, coding_category_iso_8_else,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7878 intern ("coding-category-iso-8-else"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7879 ASET (Vcoding_category_table, coding_category_utf_8,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7880 intern ("coding-category-utf-8"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7881 ASET (Vcoding_category_table, coding_category_utf_16_be,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7882 intern ("coding-category-utf-16-be"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7883 ASET (Vcoding_category_table, coding_category_utf_16_le,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7884 intern ("coding-category-utf-16-le"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7885 ASET (Vcoding_category_table, coding_category_utf_16_be_nosig,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7886 intern ("coding-category-utf-16-be-nosig"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7887 ASET (Vcoding_category_table, coding_category_utf_16_le_nosig,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7888 intern ("coding-category-utf-16-le-nosig"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7889 ASET (Vcoding_category_table, coding_category_charset,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7890 intern ("coding-category-charset"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7891 ASET (Vcoding_category_table, coding_category_sjis,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7892 intern ("coding-category-sjis"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7893 ASET (Vcoding_category_table, coding_category_big5,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7894 intern ("coding-category-big5"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7895 ASET (Vcoding_category_table, coding_category_ccl,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7896 intern ("coding-category-ccl"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7897 ASET (Vcoding_category_table, coding_category_emacs_mule,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7898 intern ("coding-category-emacs-mule"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7899 /* Followings are NOT target of code detection. */
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7900 ASET (Vcoding_category_table, coding_category_raw_text,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7901 intern ("coding-category-raw-text"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7902 ASET (Vcoding_category_table, coding_category_undecided,
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7903 intern ("coding-category-undecided"));
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7904
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7905 defsubr (&Scoding_system_p);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7906 defsubr (&Sread_coding_system);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7907 defsubr (&Sread_non_nil_coding_system);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7908 defsubr (&Scheck_coding_system);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7909 defsubr (&Sdetect_coding_region);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7910 defsubr (&Sdetect_coding_string);
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
7911 defsubr (&Sfind_coding_systems_region_internal);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7912 defsubr (&Scheck_coding_systems_region);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7913 defsubr (&Sdecode_coding_region);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7914 defsubr (&Sencode_coding_region);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7915 defsubr (&Sdecode_coding_string);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7916 defsubr (&Sencode_coding_string);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7917 defsubr (&Sdecode_sjis_char);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7918 defsubr (&Sencode_sjis_char);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7919 defsubr (&Sdecode_big5_char);
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7920 defsubr (&Sencode_big5_char);
18002
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
7921 defsubr (&Sset_terminal_coding_system_internal);
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
7922 defsubr (&Sset_safe_terminal_coding_system_internal);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7923 defsubr (&Sterminal_coding_system);
18002
a14261786239 (encode_invocation_designation): Use macro
Kenichi Handa <handa@m17n.org>
parents: 17835
diff changeset
7924 defsubr (&Sset_keyboard_coding_system_internal);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7925 defsubr (&Skeyboard_coding_system);
18536
69c0e220b626 (Vstandard_character_unification_table_for_decode):
Kenichi Handa <handa@m17n.org>
parents: 18523
diff changeset
7926 defsubr (&Sfind_operation_coding_system);
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7927 defsubr (&Sset_coding_system_priority);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7928 defsubr (&Sdefine_coding_system_internal);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7929 defsubr (&Sdefine_coding_system_alias);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7930 defsubr (&Scoding_system_base);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7931 defsubr (&Scoding_system_plist);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7932 defsubr (&Scoding_system_aliases);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7933 defsubr (&Scoding_system_eol_type);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7934 defsubr (&Scoding_system_priority_list);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7935
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
7936 DEFVAR_LISP ("coding-system-list", &Vcoding_system_list,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7937 doc: /* List of coding systems.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7938
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7939 Do not alter the value of this variable manually. This variable should be
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7940 updated by the functions `define-coding-system' and
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7941 `define-coding-system-alias'. */);
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
7942 Vcoding_system_list = Qnil;
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
7943
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
7944 DEFVAR_LISP ("coding-system-alist", &Vcoding_system_alist,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7945 doc: /* Alist of coding system names.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7946 Each element is one element list of coding system name.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7947 This variable is given to `completing-read' as TABLE argument.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7948
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7949 Do not alter the value of this variable manually. This variable should be
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7950 updated by the functions `make-coding-system' and
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7951 `define-coding-system-alias'. */);
20105
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
7952 Vcoding_system_alist = Qnil;
c017642863c2 (Qcoding_system_spec): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 19824
diff changeset
7953
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7954 DEFVAR_LISP ("coding-category-list", &Vcoding_category_list,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7955 doc: /* List of coding-categories (symbols) ordered by priority.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7956
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7957 On detecting a coding system, Emacs tries code detection algorithms
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7958 associated with each coding-category one by one in this order. When
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7959 one algorithm agrees with a byte sequence of source text, the coding
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7960 system bound to the corresponding coding-category is selected. */);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7961 {
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7962 int i;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7963
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7964 Vcoding_category_list = Qnil;
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7965 for (i = coding_category_max - 1; i >= 0; i--)
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7966 Vcoding_category_list
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7967 = Fcons (XVECTOR (Vcoding_category_table)->contents[i],
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
7968 Vcoding_category_list);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7969 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7970
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7971 DEFVAR_LISP ("coding-system-for-read", &Vcoding_system_for_read,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7972 doc: /* Specify the coding system for read operations.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7973 It is useful to bind this variable with `let', but do not set it globally.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7974 If the value is a coding system, it is used for decoding on read operation.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7975 If not, an appropriate element is used from one of the coding system alists:
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7976 There are three such tables, `file-coding-system-alist',
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7977 `process-coding-system-alist', and `network-coding-system-alist'. */);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7978 Vcoding_system_for_read = Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7979
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7980 DEFVAR_LISP ("coding-system-for-write", &Vcoding_system_for_write,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7981 doc: /* Specify the coding system for write operations.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7982 Programs bind this variable with `let', but you should not set it globally.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7983 If the value is a coding system, it is used for encoding of output,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7984 when writing it to a file and when sending it to a file or subprocess.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7985
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7986 If this does not specify a coding system, an appropriate element
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7987 is used from one of the coding system alists:
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7988 There are three such tables, `file-coding-system-alist',
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7989 `process-coding-system-alist', and `network-coding-system-alist'.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7990 For output to files, if the above procedure does not specify a coding system,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
7991 the value of `buffer-file-coding-system' is used. */);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7992 Vcoding_system_for_write = Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7993
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7994 DEFVAR_LISP ("last-coding-system-used", &Vlast_coding_system_used,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7995 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
7996 Coding system used in the latest file or process I/O. */);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7997 Vlast_coding_system_used = Qnil;
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7998
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
7999 DEFVAR_BOOL ("inhibit-eol-conversion", &inhibit_eol_conversion,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8000 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8001 *Non-nil means always inhibit code conversion of end-of-line format.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8002 See info node `Coding Systems' and info node `Text and Binary' concerning
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8003 such conversion. */);
18650
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
8004 inhibit_eol_conversion = 0;
aa3f2820e2ac (Qemacs_mule, inhibit_eol_conversion): New variables.
Kenichi Handa <handa@m17n.org>
parents: 18613
diff changeset
8005
21574
30394e3ae7f8 (syms_of_coding): Declare and define inherit-process-coding-system.
Eli Zaretskii <eliz@gnu.org>
parents: 21520
diff changeset
8006 DEFVAR_BOOL ("inherit-process-coding-system", &inherit_process_coding_system,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8007 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8008 Non-nil means process buffer inherits coding system of process output.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8009 Bind it to t if the process output is to be treated as if it were a file
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8010 read from some filesystem. */);
21574
30394e3ae7f8 (syms_of_coding): Declare and define inherit-process-coding-system.
Eli Zaretskii <eliz@gnu.org>
parents: 21520
diff changeset
8011 inherit_process_coding_system = 0;
30394e3ae7f8 (syms_of_coding): Declare and define inherit-process-coding-system.
Eli Zaretskii <eliz@gnu.org>
parents: 21520
diff changeset
8012
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8013 DEFVAR_LISP ("file-coding-system-alist", &Vfile_coding_system_alist,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8014 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8015 Alist to decide a coding system to use for a file I/O operation.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8016 The format is ((PATTERN . VAL) ...),
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8017 where PATTERN is a regular expression matching a file name,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8018 VAL is a coding system, a cons of coding systems, or a function symbol.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8019 If VAL is a coding system, it is used for both decoding and encoding
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8020 the file contents.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8021 If VAL is a cons of coding systems, the car part is used for decoding,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8022 and the cdr part is used for encoding.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8023 If VAL is a function symbol, the function must return a coding system
41678
5aa97e545399 (syms_of_coding) <Qchar_coding_system>: Give it an
Dave Love <fx@gnu.org>
parents: 41624
diff changeset
8024 or a cons of coding systems which are used as above. The function gets
5aa97e545399 (syms_of_coding) <Qchar_coding_system>: Give it an
Dave Love <fx@gnu.org>
parents: 41624
diff changeset
8025 the arguments with which `find-operation-coding-systems' was called.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8026
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8027 See also the function `find-operation-coding-system'
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8028 and the variable `auto-coding-alist'. */);
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8029 Vfile_coding_system_alist = Qnil;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8030
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8031 DEFVAR_LISP ("process-coding-system-alist", &Vprocess_coding_system_alist,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8032 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8033 Alist to decide a coding system to use for a process I/O operation.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8034 The format is ((PATTERN . VAL) ...),
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8035 where PATTERN is a regular expression matching a program name,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8036 VAL is a coding system, a cons of coding systems, or a function symbol.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8037 If VAL is a coding system, it is used for both decoding what received
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8038 from the program and encoding what sent to the program.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8039 If VAL is a cons of coding systems, the car part is used for decoding,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8040 and the cdr part is used for encoding.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8041 If VAL is a function symbol, the function must return a coding system
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8042 or a cons of coding systems which are used as above.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8043
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8044 See also the function `find-operation-coding-system'. */);
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8045 Vprocess_coding_system_alist = Qnil;
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8046
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8047 DEFVAR_LISP ("network-coding-system-alist", &Vnetwork_coding_system_alist,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8048 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8049 Alist to decide a coding system to use for a network I/O operation.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8050 The format is ((PATTERN . VAL) ...),
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8051 where PATTERN is a regular expression matching a network service name
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8052 or is a port number to connect to,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8053 VAL is a coding system, a cons of coding systems, or a function symbol.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8054 If VAL is a coding system, it is used for both decoding what received
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8055 from the network stream and encoding what sent to the network stream.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8056 If VAL is a cons of coding systems, the car part is used for decoding,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8057 and the cdr part is used for encoding.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8058 If VAL is a function symbol, the function must return a coding system
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8059 or a cons of coding systems which are used as above.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8060
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8061 See also the function `find-operation-coding-system'. */);
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8062 Vnetwork_coding_system_alist = Qnil;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8063
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8064 DEFVAR_LISP ("locale-coding-system", &Vlocale_coding_system,
41026
6f20449b7e12 (syms_of_coding): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 41006
diff changeset
8065 doc: /* Coding system to use with system messages.
6f20449b7e12 (syms_of_coding): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 41006
diff changeset
8066 Also used for decoding keyboard input on X Window system. */);
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8067 Vlocale_coding_system = Qnil;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8068
29182
1d1c27067af4 (encode_eol): Add null statement after label.
Dave Love <fx@gnu.org>
parents: 29172
diff changeset
8069 /* The eol mnemonics are reset in startup.el system-dependently. */
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8070 DEFVAR_LISP ("eol-mnemonic-unix", &eol_mnemonic_unix,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8071 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8072 *String displayed in mode line for UNIX-like (LF) end-of-line format. */);
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8073 eol_mnemonic_unix = build_string (":");
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8074
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8075 DEFVAR_LISP ("eol-mnemonic-dos", &eol_mnemonic_dos,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8076 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8077 *String displayed in mode line for DOS-like (CRLF) end-of-line format. */);
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8078 eol_mnemonic_dos = build_string ("\\");
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8079
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8080 DEFVAR_LISP ("eol-mnemonic-mac", &eol_mnemonic_mac,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8081 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8082 *String displayed in mode line for MAC-like (CR) end-of-line format. */);
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8083 eol_mnemonic_mac = build_string ("/");
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8084
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8085 DEFVAR_LISP ("eol-mnemonic-undecided", &eol_mnemonic_undecided,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8086 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8087 *String displayed in mode line when end-of-line format is not yet determined. */);
24200
b9d9fccad516 (syms_of_coding): eol-mnemonic-* variables are now
Eli Zaretskii <eliz@gnu.org>
parents: 24178
diff changeset
8088 eol_mnemonic_undecided = build_string (":");
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8089
22119
592bb8b9bcfd Change terms unify/unification to
Kenichi Handa <handa@m17n.org>
parents: 22020
diff changeset
8090 DEFVAR_LISP ("enable-character-translation", &Venable_character_translation,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8091 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8092 *Non-nil enables character translation while encoding and decoding. */);
22119
592bb8b9bcfd Change terms unify/unification to
Kenichi Handa <handa@m17n.org>
parents: 22020
diff changeset
8093 Venable_character_translation = Qt;
592bb8b9bcfd Change terms unify/unification to
Kenichi Handa <handa@m17n.org>
parents: 22020
diff changeset
8094
22186
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
8095 DEFVAR_LISP ("standard-translation-table-for-decode",
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8096 &Vstandard_translation_table_for_decode,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8097 doc: /* Table for translating characters while decoding. */);
22186
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
8098 Vstandard_translation_table_for_decode = Qnil;
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
8099
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
8100 DEFVAR_LISP ("standard-translation-table-for-encode",
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8101 &Vstandard_translation_table_for_encode,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8102 doc: /* Table for translating characters while encoding. */);
22186
fc4aaf1b1772 Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents: 22166
diff changeset
8103 Vstandard_translation_table_for_encode = Qnil;
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8104
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8105 DEFVAR_LISP ("charset-revision-table", &Vcharset_revision_table,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8106 doc: /* Alist of charsets vs revision numbers.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8107 While encoding, if a charset (car part of an element) is found,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8108 designate it with the escape sequence identifying revision (cdr part
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8109 of the element). */);
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8110 Vcharset_revision_table = Qnil;
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8111
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8112 DEFVAR_LISP ("default-process-coding-system",
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8113 &Vdefault_process_coding_system,
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8114 doc: /* Cons of coding systems used for process I/O by default.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8115 The car part is used for decoding a process output,
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8116 the cdr part is used for encoding a text to be sent to a process. */);
18180
5f4c4da24e75 (Vcoding_system_alist): Deleted.
Kenichi Handa <handa@m17n.org>
parents: 18002
diff changeset
8117 Vdefault_process_coding_system = Qnil;
19280
e755044718ee (ENCODE_ISO_CHARACTER_DIMENSION1): Pay attention to
Kenichi Handa <handa@m17n.org>
parents: 19193
diff changeset
8118
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
8119 DEFVAR_LISP ("latin-extra-code-table", &Vlatin_extra_code_table,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8120 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8121 Table of extra Latin codes in the range 128..159 (inclusive).
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8122 This is a vector of length 256.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8123 If Nth element is non-nil, the existence of code N in a file
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8124 \(or output of subprocess) doesn't prevent it to be detected as
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8125 a coding system of ISO 2022 variant which has a flag
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8126 `accept-latin-extra-code' t (e.g. iso-latin-1) on reading a file
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8127 or reading output of a subprocess.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8128 Only 128th through 159th elements has a meaning. */);
19365
d9374f5ebd3a (CODING_FLAG_ISO_LATIN_EXTRA): New macro.
Kenichi Handa <handa@m17n.org>
parents: 19285
diff changeset
8129 Vlatin_extra_code_table = Fmake_vector (make_number (256), Qnil);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
8130
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
8131 DEFVAR_LISP ("select-safe-coding-system-function",
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
8132 &Vselect_safe_coding_system_function,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8133 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8134 Function to call to select safe coding system for encoding a text.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8135
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8136 If set, this function is called to force a user to select a proper
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8137 coding system which can encode the text in the case that a default
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8138 coding system used in each operation can't encode the text.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8139
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8140 The default value is `select-safe-coding-system' (which see). */);
20718
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
8141 Vselect_safe_coding_system_function = Qnil;
c600dea3b06b Vselect_safe_coding_system_function): New variable.
Kenichi Handa <handa@m17n.org>
parents: 20708
diff changeset
8142
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
8143 DEFVAR_LISP ("char-coding-system-table", &Vchar_coding_system_table,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8144 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8145 Char-table containing safe coding systems of each characters.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8146 Each element doesn't include such generic coding systems that can
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8147 encode any characters. They are in the first extra slot. */);
30487
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
8148 Vchar_coding_system_table = Fmake_char_table (Qchar_coding_system, Qnil);
6165da9c89c6 (Qsafe_charsets): This variable deleted.
Kenichi Handa <handa@m17n.org>
parents: 30384
diff changeset
8149
30292
14a9937df1f5 (syms_of_coding): Fix typo in spelling of variable
Gerd Moellmann <gerd@gnu.org>
parents: 30263
diff changeset
8150 DEFVAR_BOOL ("inhibit-iso-escape-detection",
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
8151 &inhibit_iso_escape_detection,
88365
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8152 doc: /*
d29ddd7d50f9 Completely re-written.
Kenichi Handa <handa@m17n.org>
parents: 43041
diff changeset
8153 If non-nil, Emacs ignores ISO2022's escape sequence on code detection.
40713
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8154
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8155 By default, on reading a file, Emacs tries to detect how the text is
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8156 encoded. This code detection is sensitive to escape sequences. If
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8157 the sequence is valid as ISO2022, the code is determined as one of
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8158 the ISO2022 encodings, and the file is decoded by the corresponding
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8159 coding system (e.g. `iso-2022-7bit').
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8160
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8161 However, there may be a case that you want to read escape sequences in
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8162 a file as is. In such a case, you can set this variable to non-nil.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8163 Then, as the code detection ignores any escape sequences, no file is
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8164 detected as encoded in some ISO2022 encoding. The result is that all
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8165 escape sequences become visible in a buffer.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8166
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8167 The default value is nil, and it is strongly recommended not to change
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8168 it. That is because many Emacs Lisp source files that contain
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8169 non-ASCII characters are encoded by the coding system `iso-2022-7bit'
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8170 in Emacs's distribution, and they won't be decoded correctly on
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8171 reading if you suppress escape sequence detection.
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8172
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8173 The other way to read escape sequences in a file without decoding is
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8174 to explicitly specify some coding system that doesn't use ISO2022's
42351475da08 Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
8175 escape sequence (e.g `latin-1') on reading by \\[universal-coding-system-argument]. */);
30204
35aec8514228 (inhibit_iso_escape_detection): New variable.
Kenichi Handa <handa@m17n.org>
parents: 29985
diff changeset
8176 inhibit_iso_escape_detection = 0;
88456
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8177
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8178 {
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8179 Lisp_Object args[coding_arg_max];
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8180 Lisp_Object plist[14];
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8181 int i;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8182
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8183 for (i = 0; i < coding_arg_max; i++)
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8184 args[i] = Qnil;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8185
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8186 plist[0] = intern (":name");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8187 plist[1] = args[coding_arg_name] = Qno_conversion;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8188 plist[2] = intern (":mnemonic");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8189 plist[3] = args[coding_arg_mnemonic] = make_number ('=');
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8190 plist[4] = intern (":coding-type");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8191 plist[5] = args[coding_arg_coding_type] = Qraw_text;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8192 plist[6] = intern (":ascii-compatible-p");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8193 plist[7] = args[coding_arg_ascii_compatible_p] = Qt;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8194 plist[8] = intern (":default-char");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8195 plist[9] = args[coding_arg_default_char] = make_number (0);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8196 plist[10] = intern (":docstring");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8197 plist[11] = build_string ("Do no conversion.\n\
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8198 \n\
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8199 When you visit a file with this coding, the file is read into a\n\
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8200 unibyte buffer as is, thus each byte of a file is treated as a\n\
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8201 character.");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8202 plist[12] = intern (":eol-type");
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8203 plist[13] = args[coding_arg_eol_type] = Qunix;
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8204 args[coding_arg_plist] = Flist (14, plist);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8205 Fdefine_coding_system_internal (coding_arg_max, args);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8206 }
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8207
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8208 setup_coding_system (Qno_conversion, &keyboard_coding);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8209 setup_coding_system (Qno_conversion, &terminal_coding);
a7b309f72920 (coding_alloc_by_making_gap): Check the case that the
Kenichi Handa <handa@m17n.org>
parents: 88443
diff changeset
8210 setup_coding_system (Qno_conversion, &safe_terminal_coding);
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8211 }
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8212
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8213 char *
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8214 emacs_strerror (error_number)
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8215 int error_number;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8216 {
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8217 char *str;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8218
26526
b7438760079b * callproc.c (strerror): Remove decl.
Paul Eggert <eggert@twinsun.com>
parents: 26240
diff changeset
8219 synchronize_system_messages_locale ();
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8220 str = strerror (error_number);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8221
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8222 if (! NILP (Vlocale_coding_system))
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8223 {
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8224 Lisp_Object dec = code_convert_string_norecord (build_string (str),
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8225 Vlocale_coding_system,
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8226 0);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8227 str = (char *) XSTRING (dec)->data;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8228 }
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8229
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8230 return str;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8231 }
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26067
diff changeset
8232
17052
d0d7b244b1d0 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8233 #endif /* emacs */