1 |
/* Header for coding system handler. |
/* Header for coding system handler. |
2 |
Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN. |
Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN. |
3 |
Licensed to the Free Software Foundation. |
Licensed to the Free Software Foundation. |
4 |
|
Copyright (C) 2003 |
5 |
|
National Institute of Advanced Industrial Science and Technology (AIST) |
6 |
|
Registration Number H13PRO009 |
7 |
|
|
8 |
This file is part of GNU Emacs. |
This file is part of GNU Emacs. |
9 |
|
|
25 |
#ifndef EMACS_CODING_H |
#ifndef EMACS_CODING_H |
26 |
#define EMACS_CODING_H |
#define EMACS_CODING_H |
27 |
|
|
28 |
#include "ccl.h" |
/* Index to arguments of Fdefine_coding_system_internal. */ |
29 |
|
|
30 |
/*** EMACS' INTERNAL FORMAT (emacs-mule) section ***/ |
enum define_coding_system_arg_index |
|
|
|
|
/* All code (1-byte) of Emacs' internal format is classified into one |
|
|
of the followings. See also `charset.h'. */ |
|
|
enum emacs_code_class_type |
|
31 |
{ |
{ |
32 |
EMACS_control_code, /* Control codes in the range |
coding_arg_name, |
33 |
0x00..0x1F and 0x7F except for the |
coding_arg_mnemonic, |
34 |
following two codes. */ |
coding_arg_coding_type, |
35 |
EMACS_linefeed_code, /* 0x0A (linefeed) to denote |
coding_arg_charset_list, |
36 |
end-of-line. */ |
coding_arg_ascii_compatible_p, |
37 |
EMACS_carriage_return_code, /* 0x0D (carriage-return) to be used |
coding_arg_decode_translation_table, |
38 |
in selective display mode. */ |
coding_arg_encode_translation_table, |
39 |
EMACS_ascii_code, /* ASCII characters. */ |
coding_arg_post_read_conversion, |
40 |
EMACS_leading_code_2, /* Base leading code of official |
coding_arg_pre_write_conversion, |
41 |
TYPE9N character. */ |
coding_arg_default_char, |
42 |
EMACS_leading_code_3, /* Base leading code of private TYPE9N |
coding_arg_for_unibyte, |
43 |
or official TYPE9Nx9N character. */ |
coding_arg_plist, |
44 |
EMACS_leading_code_4, /* Base leading code of private |
coding_arg_eol_type, |
45 |
TYPE9Nx9N character. */ |
coding_arg_max |
|
EMACS_invalid_code /* Invalid code, i.e. a base leading |
|
|
code not yet assigned to any |
|
|
charset, or a code of the range |
|
|
0xA0..0xFF. */ |
|
46 |
}; |
}; |
47 |
|
|
48 |
extern enum emacs_code_class_type emacs_code_class[256]; |
enum define_coding_iso2022_arg_index |
|
|
|
|
/*** ISO2022 section ***/ |
|
|
|
|
|
/* Macros to define code of control characters for ISO2022's functions. */ |
|
|
/* code */ /* function */ |
|
|
#define ISO_CODE_LF 0x0A /* line-feed */ |
|
|
#define ISO_CODE_CR 0x0D /* carriage-return */ |
|
|
#define ISO_CODE_SO 0x0E /* shift-out */ |
|
|
#define ISO_CODE_SI 0x0F /* shift-in */ |
|
|
#define ISO_CODE_SS2_7 0x19 /* single-shift-2 for 7-bit code */ |
|
|
#define ISO_CODE_ESC 0x1B /* escape */ |
|
|
#define ISO_CODE_SS2 0x8E /* single-shift-2 */ |
|
|
#define ISO_CODE_SS3 0x8F /* single-shift-3 */ |
|
|
#define ISO_CODE_CSI 0x9B /* control-sequence-introduce */ |
|
|
|
|
|
/* All code (1-byte) of ISO2022 is classified into one of the |
|
|
followings. */ |
|
|
enum iso_code_class_type |
|
49 |
{ |
{ |
50 |
ISO_control_0, /* Control codes in the range |
coding_arg_iso2022_initial = coding_arg_max, |
51 |
0x00..0x1F and 0x7F, except for the |
coding_arg_iso2022_reg_usage, |
52 |
following 5 codes. */ |
coding_arg_iso2022_request, |
53 |
ISO_carriage_return, /* ISO_CODE_CR (0x0D) */ |
coding_arg_iso2022_flags, |
54 |
ISO_shift_out, /* ISO_CODE_SO (0x0E) */ |
coding_arg_iso2022_max |
|
ISO_shift_in, /* ISO_CODE_SI (0x0F) */ |
|
|
ISO_single_shift_2_7, /* ISO_CODE_SS2_7 (0x19) */ |
|
|
ISO_escape, /* ISO_CODE_SO (0x1B) */ |
|
|
ISO_control_1, /* Control codes in the range |
|
|
0x80..0x9F, except for the |
|
|
following 3 codes. */ |
|
|
ISO_single_shift_2, /* ISO_CODE_SS2 (0x8E) */ |
|
|
ISO_single_shift_3, /* ISO_CODE_SS3 (0x8F) */ |
|
|
ISO_control_sequence_introducer, /* ISO_CODE_CSI (0x9B) */ |
|
|
ISO_0x20_or_0x7F, /* Codes of the values 0x20 or 0x7F. */ |
|
|
ISO_graphic_plane_0, /* Graphic codes in the range 0x21..0x7E. */ |
|
|
ISO_0xA0_or_0xFF, /* Codes of the values 0xA0 or 0xFF. */ |
|
|
ISO_graphic_plane_1 /* Graphic codes in the range 0xA1..0xFE. */ |
|
55 |
}; |
}; |
56 |
|
|
57 |
/** The macros CODING_FLAG_ISO_XXX defines a flag bit of the `flags' |
enum define_coding_utf16_arg_index |
58 |
element in the structure `coding_system'. This information is used |
{ |
59 |
while encoding a text to ISO2022. **/ |
coding_arg_utf16_bom = coding_arg_max, |
60 |
|
coding_arg_utf16_endian, |
61 |
/* If set, produce short-form designation sequence (e.g. ESC $ A) |
coding_arg_utf16_max |
62 |
instead of long-form sequence (e.g. ESC $ ( A). */ |
}; |
|
#define CODING_FLAG_ISO_SHORT_FORM 0x0001 |
|
63 |
|
|
64 |
/* If set, reset graphic planes and registers at end-of-line to the |
enum define_coding_ccl_arg_index |
65 |
initial state. */ |
{ |
66 |
#define CODING_FLAG_ISO_RESET_AT_EOL 0x0002 |
coding_arg_ccl_decoder = coding_arg_max, |
67 |
|
coding_arg_ccl_encoder, |
68 |
|
coding_arg_ccl_valids, |
69 |
|
coding_arg_ccl_max |
70 |
|
}; |
71 |
|
|
72 |
/* If set, reset graphic planes and registers before any control |
extern Lisp_Object Vcoding_system_hash_table; |
|
characters to the initial state. */ |
|
|
#define CODING_FLAG_ISO_RESET_AT_CNTL 0x0004 |
|
73 |
|
|
74 |
/* If set, encode by 7-bit environment. */ |
/* Enumeration of coding system type. */ |
|
#define CODING_FLAG_ISO_SEVEN_BITS 0x0008 |
|
75 |
|
|
76 |
/* If set, use locking-shift function. */ |
enum coding_system_type |
77 |
#define CODING_FLAG_ISO_LOCKING_SHIFT 0x0010 |
{ |
78 |
|
coding_type_charset, |
79 |
|
coding_type_utf_8, |
80 |
|
coding_type_utf_16, |
81 |
|
coding_type_iso_2022, |
82 |
|
coding_type_emacs_mule, |
83 |
|
coding_type_sjis, |
84 |
|
coding_type_ccl, |
85 |
|
coding_type_raw_text, |
86 |
|
coding_type_undecided, |
87 |
|
coding_type_max |
88 |
|
}; |
89 |
|
|
|
/* If set, use single-shift function. Overwrite |
|
|
CODING_FLAG_ISO_LOCKING_SHIFT. */ |
|
|
#define CODING_FLAG_ISO_SINGLE_SHIFT 0x0020 |
|
90 |
|
|
91 |
/* If set, designate JISX0201-Roman instead of ASCII. */ |
/* Enumeration of end-of-line format type. */ |
|
#define CODING_FLAG_ISO_USE_ROMAN 0x0040 |
|
92 |
|
|
93 |
/* If set, designate JISX0208-1978 instead of JISX0208-1983. */ |
enum end_of_line_type |
94 |
#define CODING_FLAG_ISO_USE_OLDJIS 0x0080 |
{ |
95 |
|
eol_lf, /* Line-feed only, same as Emacs' internal |
96 |
|
format. */ |
97 |
|
eol_crlf, /* Sequence of carriage-return and |
98 |
|
line-feed. */ |
99 |
|
eol_cr, /* Carriage-return only. */ |
100 |
|
eol_any, /* Accept any of above. Produce line-feed |
101 |
|
only. */ |
102 |
|
eol_undecided, /* This value is used to denote that the |
103 |
|
eol-type is not yet undecided. */ |
104 |
|
eol_type_max |
105 |
|
}; |
106 |
|
|
107 |
/* If set, do not produce ISO6429's direction specifying sequence. */ |
/* Enumeration of index to an attribute vector of a coding system. */ |
|
#define CODING_FLAG_ISO_NO_DIRECTION 0x0100 |
|
108 |
|
|
109 |
/* If set, assume designation states are reset at beginning of line on |
enum coding_attr_index |
110 |
output. */ |
{ |
111 |
#define CODING_FLAG_ISO_INIT_AT_BOL 0x0200 |
coding_attr_base_name, |
112 |
|
coding_attr_docstring, |
113 |
|
coding_attr_mnemonic, |
114 |
|
coding_attr_type, |
115 |
|
coding_attr_charset_list, |
116 |
|
coding_attr_ascii_compat, |
117 |
|
coding_attr_decode_tbl, |
118 |
|
coding_attr_encode_tbl, |
119 |
|
coding_attr_post_read, |
120 |
|
coding_attr_pre_write, |
121 |
|
coding_attr_default_char, |
122 |
|
coding_attr_for_unibyte, |
123 |
|
coding_attr_plist, |
124 |
|
|
125 |
|
coding_attr_category, |
126 |
|
coding_attr_safe_charsets, |
127 |
|
|
128 |
|
/* The followings are extra attributes for each type. */ |
129 |
|
coding_attr_charset_valids, |
130 |
|
|
131 |
|
coding_attr_ccl_decoder, |
132 |
|
coding_attr_ccl_encoder, |
133 |
|
coding_attr_ccl_valids, |
134 |
|
|
135 |
|
coding_attr_iso_initial, |
136 |
|
coding_attr_iso_usage, |
137 |
|
coding_attr_iso_request, |
138 |
|
coding_attr_iso_flags, |
139 |
|
|
140 |
/* If set, designation sequence should be placed at beginning of line |
coding_attr_utf_16_bom, |
141 |
on output. */ |
coding_attr_utf_16_endian, |
|
#define CODING_FLAG_ISO_DESIGNATE_AT_BOL 0x0400 |
|
142 |
|
|
143 |
/* If set, do not encode unsafe characters on output. */ |
coding_attr_emacs_mule_full, |
|
#define CODING_FLAG_ISO_SAFE 0x0800 |
|
144 |
|
|
145 |
/* If set, extra latin codes (128..159) are accepted as a valid code |
coding_attr_last_index |
146 |
on input. */ |
}; |
|
#define CODING_FLAG_ISO_LATIN_EXTRA 0x1000 |
|
147 |
|
|
|
/* If set, use designation escape sequence. */ |
|
|
#define CODING_FLAG_ISO_DESIGNATION 0x10000 |
|
148 |
|
|
149 |
/* A character to be produced on output if encoding of the original |
#define CODING_ATTR_BASE_NAME(attrs) AREF (attrs, coding_attr_base_name) |
150 |
character is inhibitted by CODING_MODE_INHIBIT_UNENCODABLE_CHAR. |
#define CODING_ATTR_TYPE(attrs) AREF (attrs, coding_attr_type) |
151 |
It must be an ASCII character. */ |
#define CODING_ATTR_CHARSET_LIST(attrs) AREF (attrs, coding_attr_charset_list) |
152 |
#define CODING_REPLACEMENT_CHARACTER '?' |
#define CODING_ATTR_MNEMONIC(attrs) AREF (attrs, coding_attr_mnemonic) |
153 |
|
#define CODING_ATTR_DOCSTRING(attrs) AREF (attrs, coding_attr_docstring) |
154 |
|
#define CODING_ATTR_ASCII_COMPAT(attrs) AREF (attrs, coding_attr_ascii_compat) |
155 |
|
#define CODING_ATTR_DECODE_TBL(attrs) AREF (attrs, coding_attr_decode_tbl) |
156 |
|
#define CODING_ATTR_ENCODE_TBL(attrs) AREF (attrs, coding_attr_encode_tbl) |
157 |
|
#define CODING_ATTR_POST_READ(attrs) AREF (attrs, coding_attr_post_read) |
158 |
|
#define CODING_ATTR_PRE_WRITE(attrs) AREF (attrs, coding_attr_pre_write) |
159 |
|
#define CODING_ATTR_DEFAULT_CHAR(attrs) AREF (attrs, coding_attr_default_char) |
160 |
|
#define CODING_ATTR_FOR_UNIBYTE(attrs) AREF (attrs, coding_attr_for_unibyte) |
161 |
|
#define CODING_ATTR_FLUSHING(attrs) AREF (attrs, coding_attr_flushing) |
162 |
|
#define CODING_ATTR_PLIST(attrs) AREF (attrs, coding_attr_plist) |
163 |
|
#define CODING_ATTR_CATEGORY(attrs) AREF (attrs, coding_attr_category) |
164 |
|
#define CODING_ATTR_SAFE_CHARSETS(attrs)AREF (attrs, coding_attr_safe_charsets) |
165 |
|
|
166 |
|
|
167 |
|
#define CODING_ID_ATTRS(id) \ |
168 |
|
(AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 0)) |
169 |
|
|
170 |
|
#define CODING_ID_ALIASES(id) \ |
171 |
|
(AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 1)) |
172 |
|
|
173 |
|
#define CODING_ID_EOL_TYPE(id) \ |
174 |
|
(AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 2)) |
175 |
|
|
176 |
|
#define CODING_ID_NAME(id) \ |
177 |
|
(HASH_KEY (XHASH_TABLE (Vcoding_system_hash_table), id)) |
178 |
|
|
179 |
|
#define CODING_SYSTEM_SPEC(coding_system_symbol) \ |
180 |
|
(Fgethash (coding_system_symbol, Vcoding_system_hash_table, Qnil)) |
181 |
|
|
182 |
|
#define CODING_SYSTEM_ID(coding_system_symbol) \ |
183 |
|
hash_lookup (XHASH_TABLE (Vcoding_system_hash_table), \ |
184 |
|
coding_system_symbol, NULL) |
185 |
|
|
186 |
/* Structure of the field `spec.iso2022' in the structure `coding_system'. */ |
#define CODING_SYSTEM_P(coding_system_symbol) \ |
187 |
struct iso2022_spec |
(! NILP (CODING_SYSTEM_SPEC (coding_system_symbol))) |
|
{ |
|
|
/* The current graphic register invoked to each graphic plane. */ |
|
|
int current_invocation[2]; |
|
188 |
|
|
189 |
/* The current charset designated to each graphic register. */ |
#define CHECK_CODING_SYSTEM(x) \ |
190 |
int current_designation[4]; |
do { \ |
191 |
|
if (!CODING_SYSTEM_P (x)) \ |
192 |
|
wrong_type_argument (Qcoding_system_p, (x)); \ |
193 |
|
} while (0) |
194 |
|
|
|
/* A charset initially designated to each graphic register. */ |
|
|
int initial_designation[4]; |
|
195 |
|
|
196 |
/* If not -1, it is a graphic register specified in an invalid |
#define CHECK_CODING_SYSTEM_GET_SPEC(x, spec) \ |
197 |
designation sequence. */ |
do { \ |
198 |
int last_invalid_designation_register; |
spec = CODING_SYSTEM_SPEC (x); \ |
199 |
|
if (NILP (spec)) \ |
200 |
/* A graphic register to which each charset should be designated. */ |
x = wrong_type_argument (Qcoding_system_p, (x)); \ |
201 |
unsigned char requested_designation[MAX_CHARSET + 1]; |
} while (0) |
|
|
|
|
/* A revision number to be specified for each charset on encoding. |
|
|
The value 255 means no revision number for the corresponding |
|
|
charset. */ |
|
|
unsigned char charset_revision_number[MAX_CHARSET + 1]; |
|
202 |
|
|
|
/* Set to 1 temporarily only when graphic register 2 or 3 is invoked |
|
|
by single-shift while encoding. */ |
|
|
int single_shifting; |
|
203 |
|
|
204 |
/* Set to 1 temporarily only when processing at beginning of line. */ |
#define CHECK_CODING_SYSTEM_GET_ID(x, id) \ |
205 |
int bol; |
do \ |
206 |
}; |
{ \ |
207 |
|
id = CODING_SYSTEM_ID (x); \ |
208 |
|
if (id < 0) \ |
209 |
|
x = wrong_type_argument (Qcoding_system_p, (x)); \ |
210 |
|
} while (0) |
211 |
|
|
|
/* Macros to access each field in the structure `spec.iso2022'. */ |
|
|
#define CODING_SPEC_ISO_INVOCATION(coding, plane) \ |
|
|
(coding)->spec.iso2022.current_invocation[plane] |
|
|
#define CODING_SPEC_ISO_DESIGNATION(coding, reg) \ |
|
|
(coding)->spec.iso2022.current_designation[reg] |
|
|
#define CODING_SPEC_ISO_INITIAL_DESIGNATION(coding, reg) \ |
|
|
(coding)->spec.iso2022.initial_designation[reg] |
|
|
#define CODING_SPEC_ISO_REQUESTED_DESIGNATION(coding, charset) \ |
|
|
(coding)->spec.iso2022.requested_designation[charset] |
|
|
#define CODING_SPEC_ISO_REVISION_NUMBER(coding, charset) \ |
|
|
(coding)->spec.iso2022.charset_revision_number[charset] |
|
|
#define CODING_SPEC_ISO_SINGLE_SHIFTING(coding) \ |
|
|
(coding)->spec.iso2022.single_shifting |
|
|
#define CODING_SPEC_ISO_BOL(coding) \ |
|
|
(coding)->spec.iso2022.bol |
|
|
|
|
|
/* A value which may appear in |
|
|
coding->spec.iso2022.requested_designation indicating that the |
|
|
corresponding charset does not request any graphic register to be |
|
|
designated. */ |
|
|
#define CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION 4 |
|
|
|
|
|
/* Return a charset which is currently designated to the graphic plane |
|
|
PLANE in the coding-system CODING. */ |
|
|
#define CODING_SPEC_ISO_PLANE_CHARSET(coding, plane) \ |
|
|
((CODING_SPEC_ISO_INVOCATION (coding, plane) < 0) \ |
|
|
? -1 \ |
|
|
: CODING_SPEC_ISO_DESIGNATION (coding, \ |
|
|
CODING_SPEC_ISO_INVOCATION (coding, plane))) |
|
|
|
|
|
/*** BIG5 section ***/ |
|
|
|
|
|
/* Macros to denote each type of BIG5 coding system. */ |
|
|
#define CODING_FLAG_BIG5_HKU 0x00 /* BIG5-HKU is one of variants of |
|
|
BIG5 developed by Hong Kong |
|
|
University. */ |
|
|
#define CODING_FLAG_BIG5_ETEN 0x01 /* BIG5_ETen is one of variants |
|
|
of BIG5 developed by the |
|
|
company ETen in Taiwan. */ |
|
212 |
|
|
213 |
/*** GENERAL section ***/ |
/*** GENERAL section ***/ |
214 |
|
|
215 |
/* Types of coding system. */ |
/* Enumeration of result code of code conversion. */ |
216 |
enum coding_type |
enum coding_result_code |
217 |
{ |
{ |
218 |
coding_type_no_conversion, /* A coding system which requires no |
CODING_RESULT_SUCCESS, |
219 |
conversion for reading and writing |
CODING_RESULT_INSUFFICIENT_SRC, |
220 |
including end-of-line format. */ |
CODING_RESULT_INSUFFICIENT_DST, |
221 |
coding_type_emacs_mule, /* A coding system used in Emacs' |
CODING_RESULT_INCONSISTENT_EOL, |
222 |
buffer and string. Requires no |
CODING_RESULT_INSUFFICIENT_CMP, |
223 |
conversion for reading and writing |
CODING_RESULT_INTERRUPT, |
224 |
except for end-of-line format. */ |
CODING_RESULT_INSUFFICIENT_MEM |
|
coding_type_undecided, /* A coding system which requires |
|
|
automatic detection of a real |
|
|
coding system. */ |
|
|
coding_type_sjis, /* SJIS coding system for Japanese. */ |
|
|
coding_type_iso2022, /* Any coding system of ISO2022 |
|
|
variants. */ |
|
|
coding_type_big5, /* BIG5 coding system for Chinese. */ |
|
|
coding_type_ccl, /* The coding system of which decoder |
|
|
and encoder are written in CCL. */ |
|
|
coding_type_raw_text /* A coding system for a text |
|
|
containing random 8-bit code which |
|
|
does not require code conversion |
|
|
except for end-of-line format. */ |
|
225 |
}; |
}; |
226 |
|
|
|
/* Formats of end-of-line. */ |
|
|
#define CODING_EOL_LF 0 /* Line-feed only, same as Emacs' |
|
|
internal format. */ |
|
|
#define CODING_EOL_CRLF 1 /* Sequence of carriage-return and |
|
|
line-feed. */ |
|
|
#define CODING_EOL_CR 2 /* Carriage-return only. */ |
|
|
#define CODING_EOL_UNDECIDED 3 /* This value is used to denote the |
|
|
eol-type is not yet decided. */ |
|
|
#define CODING_EOL_INCONSISTENT 4 /* This value is used to denote the |
|
|
eol-type is not consistent |
|
|
through the file. */ |
|
|
|
|
|
/* 1 iff composing. */ |
|
|
#define COMPOSING_P(coding) ((int) coding->composing > (int) COMPOSITION_NO) |
|
|
|
|
|
#define COMPOSITION_DATA_SIZE 4080 |
|
|
#define COMPOSITION_DATA_MAX_BUNCH_LENGTH (4 + MAX_COMPOSITION_COMPONENTS*2) |
|
|
|
|
|
/* Data structure to hold information about compositions of text that |
|
|
is being decoded or encode. ISO 2022 base code conversion routines |
|
|
handle special ESC sequences for composition specification. But, |
|
|
they can't get/put such information directly from/to a buffer in |
|
|
the deepest place. So, they store or retrieve the information |
|
|
through this structure. |
|
|
|
|
|
The encoder stores the information in this structure when it meets |
|
|
ESC sequences for composition while encoding codes, then, after all |
|
|
text codes are encoded, puts `composition' properties on the text |
|
|
by referring to the structure. |
|
|
|
|
|
The decoder at first stores the information of a text to be |
|
|
decoded, then, while decoding codes, generates ESC sequences for |
|
|
composition at proper places by referring to the structure. */ |
|
|
|
|
|
struct composition_data |
|
|
{ |
|
|
/* The character position of the first character to be encoded or |
|
|
decoded. START and END (see below) are relative to this |
|
|
position. */ |
|
|
int char_offset; |
|
|
|
|
|
/* The composition data. These elements are repeated for each |
|
|
composition: |
|
|
LENGTH START END METHOD [ COMPONENT ... ] |
|
|
where, |
|
|
LENGTH is the number of elements for this composition. |
|
|
|
|
|
START and END are starting and ending character positions of |
|
|
the composition relative to `char_offset'. |
|
|
|
|
|
METHOD is one of `enum composing_status' specifying the way of |
|
|
composition. |
|
|
|
|
|
COMPONENT is a character or an encoded composition rule. */ |
|
|
int data[COMPOSITION_DATA_SIZE]; |
|
|
|
|
|
/* The number of elements in `data' currently used. */ |
|
|
int used; |
|
|
|
|
|
/* Pointers to the previous and next structures. When `data' is |
|
|
filled up, another structure is allocated and linked in `next'. |
|
|
The new structure has backward link to this structure in `prev'. |
|
|
The number of chained structures depends on how many compositions |
|
|
the text being encoded or decoded contains. */ |
|
|
struct composition_data *prev, *next; |
|
|
}; |
|
|
|
|
|
/* Macros used for the member `result' of the struct |
|
|
coding_system. */ |
|
|
#define CODING_FINISH_NORMAL 0 |
|
|
#define CODING_FINISH_INSUFFICIENT_SRC 1 |
|
|
#define CODING_FINISH_INSUFFICIENT_DST 2 |
|
|
#define CODING_FINISH_INCONSISTENT_EOL 3 |
|
|
#define CODING_FINISH_INSUFFICIENT_CMP 4 |
|
|
#define CODING_FINISH_INTERRUPT 5 |
|
227 |
|
|
228 |
/* Macros used for the member `mode' of the struct coding_system. */ |
/* Macros used for the member `mode' of the struct coding_system. */ |
229 |
|
|
232 |
#define CODING_MODE_INHIBIT_INCONSISTENT_EOL 0x01 |
#define CODING_MODE_INHIBIT_INCONSISTENT_EOL 0x01 |
233 |
|
|
234 |
/* If set, the decoding/encoding routines treat the current data as |
/* If set, the decoding/encoding routines treat the current data as |
235 |
the last block of the whole text to be converted, and do |
the last block of the whole text to be converted, and do the |
236 |
appropriate finishing job. */ |
appropriate finishing job. */ |
237 |
#define CODING_MODE_LAST_BLOCK 0x02 |
#define CODING_MODE_LAST_BLOCK 0x02 |
238 |
|
|
240 |
enables selective display. */ |
enables selective display. */ |
241 |
#define CODING_MODE_SELECTIVE_DISPLAY 0x04 |
#define CODING_MODE_SELECTIVE_DISPLAY 0x04 |
242 |
|
|
|
/* If set, replace unencodabae characters by `?' on encoding. */ |
|
|
#define CODING_MODE_INHIBIT_UNENCODABLE_CHAR 0x08 |
|
|
|
|
243 |
/* This flag is used by the decoding/encoding routines on the fly. If |
/* This flag is used by the decoding/encoding routines on the fly. If |
244 |
set, it means that right-to-left text is being processed. */ |
set, it means that right-to-left text is being processed. */ |
245 |
#define CODING_MODE_DIRECTION 0x10 |
#define CODING_MODE_DIRECTION 0x08 |
246 |
|
|
247 |
struct coding_system |
#define CODING_MODE_FIXED_DESTINATION 0x10 |
248 |
|
|
249 |
|
#define CODING_MODE_SAFE_ENCODING 0x20 |
250 |
|
|
251 |
|
/* Structure of the field `spec.iso_2022' in the structure |
252 |
|
`coding_system'. */ |
253 |
|
struct iso_2022_spec |
254 |
{ |
{ |
255 |
/* Type of the coding system. */ |
/* Bit-wise-or of CODING_ISO_FLAG_XXX. */ |
256 |
enum coding_type type; |
unsigned flags; |
257 |
|
|
258 |
|
/* The current graphic register invoked to each graphic plane. */ |
259 |
|
int current_invocation[2]; |
260 |
|
|
261 |
/* Type of end-of-line format (LF, CRLF, or CR) of the coding system. */ |
/* The current charset designated to each graphic register. The |
262 |
int eol_type; |
value -1 means that not charset is designated, -2 means that |
263 |
|
there was an invalid designation previously. */ |
264 |
|
int current_designation[4]; |
265 |
|
|
266 |
|
/* Set to 1 temporarily only when graphic register 2 or 3 is invoked |
267 |
|
by single-shift while encoding. */ |
268 |
|
int single_shifting; |
269 |
|
|
270 |
|
/* Set to 1 temporarily only when processing at beginning of line. */ |
271 |
|
int bol; |
272 |
|
}; |
273 |
|
|
274 |
|
struct ccl_spec; |
275 |
|
|
276 |
|
enum utf_16_bom_type |
277 |
|
{ |
278 |
|
utf_16_detect_bom, |
279 |
|
utf_16_without_bom, |
280 |
|
utf_16_with_bom |
281 |
|
}; |
282 |
|
|
283 |
|
enum utf_16_endian_type |
284 |
|
{ |
285 |
|
utf_16_big_endian, |
286 |
|
utf_16_little_endian |
287 |
|
}; |
288 |
|
|
289 |
|
struct utf_16_spec |
290 |
|
{ |
291 |
|
enum utf_16_bom_type bom; |
292 |
|
enum utf_16_endian_type endian; |
293 |
|
int surrogate; |
294 |
|
}; |
295 |
|
|
296 |
|
struct coding_detection_info |
297 |
|
{ |
298 |
|
/* Values of these members are bitwise-OR of CATEGORY_MASK_XXXs. */ |
299 |
|
/* Which categories are already checked. */ |
300 |
|
int checked; |
301 |
|
/* Which categories are strongly found. */ |
302 |
|
int found; |
303 |
|
/* Which categories are rejected. */ |
304 |
|
int rejected; |
305 |
|
}; |
306 |
|
|
307 |
|
|
308 |
|
struct coding_system |
309 |
|
{ |
310 |
|
/* ID number of the coding system. This is an index to |
311 |
|
Vcoding_system_hash_table. This value is set by |
312 |
|
setup_coding_system. At the early stage of building time, this |
313 |
|
value is -1 in the array coding_categories to indicate that no |
314 |
|
coding-system of that category is yet defined. */ |
315 |
|
int id; |
316 |
|
|
317 |
/* Flag bits of the coding system. The meaning of each bit is common |
/* Flag bits of the coding system. The meaning of each bit is common |
318 |
to all types of coding systems. */ |
to all types of coding systems. */ |
319 |
unsigned int common_flags; |
int common_flags; |
|
|
|
|
/* Flag bits of the coding system. The meaning of each bit depends |
|
|
on the type of the coding system. */ |
|
|
unsigned int flags; |
|
320 |
|
|
321 |
/* Mode bits of the coding system. See the comments of the macros |
/* Mode bits of the coding system. See the comments of the macros |
322 |
CODING_MODE_XXX. */ |
CODING_MODE_XXX. */ |
323 |
unsigned int mode; |
unsigned int mode; |
324 |
|
|
|
/* The current status of composition handling. */ |
|
|
int composing; |
|
|
|
|
|
/* 1 iff the next character is a composition rule. */ |
|
|
int composition_rule_follows; |
|
|
|
|
|
/* Information of compositions are stored here on decoding and set |
|
|
in advance on encoding. */ |
|
|
struct composition_data *cmp_data; |
|
|
|
|
|
/* Index to cmp_data->data for the first element for the current |
|
|
composition. */ |
|
|
int cmp_data_start; |
|
|
|
|
|
/* Index to cmp_data->data for the current element for the current |
|
|
composition. */ |
|
|
int cmp_data_index; |
|
|
|
|
325 |
/* Detailed information specific to each type of coding system. */ |
/* Detailed information specific to each type of coding system. */ |
326 |
union spec |
union |
327 |
{ |
{ |
328 |
struct iso2022_spec iso2022; |
struct iso_2022_spec iso_2022; |
329 |
struct ccl_spec ccl; /* Defined in ccl.h. */ |
struct ccl_spec *ccl; /* Defined in ccl.h. */ |
330 |
|
struct utf_16_spec utf_16; |
331 |
|
int emacs_mule_full_support; |
332 |
} spec; |
} spec; |
333 |
|
|
334 |
/* Index number of coding category of the coding system. */ |
int max_charset_id; |
335 |
int category_idx; |
char *safe_charsets; |
336 |
|
|
337 |
/* The following two members specify how characters 128..159 are |
/* The following two members specify how binary 8-bit code 128..255 |
338 |
represented in source and destination text respectively. 1 means |
are represented in source and destination text respectively. 1 |
339 |
they are represented by 2-byte sequence, 0 means they are |
means they are represented by 2-byte sequence, 0 means they are |
340 |
represented by 1-byte as is (see the comment in charset.h). */ |
represented by 1-byte as is (see the comment in character.h). */ |
341 |
unsigned src_multibyte : 1; |
unsigned src_multibyte : 1; |
342 |
unsigned dst_multibyte : 1; |
unsigned dst_multibyte : 1; |
343 |
|
|
345 |
-1 in setup_coding_system, and updated by detect_coding. So, |
-1 in setup_coding_system, and updated by detect_coding. So, |
346 |
when this is equal to the byte length of the text being |
when this is equal to the byte length of the text being |
347 |
converted, we can skip the actual conversion process. */ |
converted, we can skip the actual conversion process. */ |
348 |
int heading_ascii; |
int head_ascii; |
349 |
|
|
350 |
/* The following members are set by encoding/decoding routine. */ |
/* The following members are set by encoding/decoding routine. */ |
351 |
int produced, produced_char, consumed, consumed_char; |
EMACS_INT produced, produced_char, consumed, consumed_char; |
352 |
|
|
353 |
/* Number of error source data found in a decoding routine. */ |
/* Number of error source data found in a decoding routine. */ |
354 |
int errors; |
int errors; |
355 |
|
|
356 |
/* Finish status of code conversion. It should be one of macros |
/* Store the positions of error source data. */ |
357 |
CODING_FINISH_XXXX. */ |
EMACS_INT *error_positions; |
|
int result; |
|
358 |
|
|
359 |
/* If nonzero, suppress error notification. */ |
/* Finish status of code conversion. */ |
360 |
int suppress_error; |
enum coding_result_code result; |
361 |
|
|
362 |
/* The following members are all Lisp symbols. We don't have to |
/* The following members are all Lisp symbols. We don't have to |
363 |
protect them from GC because the current garbage collection |
protect them from GC because the current garbage collection |
364 |
doesn't relocate Lisp symbols. But, when it is changed, we must |
doesn't relocate Lisp symbols. But, when it is changed, we must |
365 |
find a way to protect them. */ |
find a way to protect them. */ |
366 |
|
|
367 |
/* Backward pointer to the Lisp symbol of the coding system. */ |
EMACS_INT src_pos, src_pos_byte, src_chars, src_bytes; |
368 |
Lisp_Object symbol; |
Lisp_Object src_object; |
369 |
|
const unsigned char *source; |
370 |
/* Lisp function (symbol) to be called after decoding to do |
|
371 |
additional conversion, or nil. */ |
EMACS_INT dst_pos, dst_pos_byte, dst_bytes; |
372 |
Lisp_Object post_read_conversion; |
Lisp_Object dst_object; |
373 |
|
unsigned char *destination; |
374 |
/* Lisp function (symbol) to be called before encoding to do |
|
375 |
additional conversion, or nil. */ |
int chars_at_source; |
376 |
Lisp_Object pre_write_conversion; |
|
377 |
|
/* If an element is non-negative, it is a character code. |
378 |
/* Character translation tables to look up, or nil. */ |
|
379 |
Lisp_Object translation_table_for_decode; |
If it is in the range -128..-1, it is a 8-bit character code |
380 |
Lisp_Object translation_table_for_encode; |
minus 256. |
381 |
|
|
382 |
|
If it is less than -128, it specifies the start of an annotation |
383 |
|
chunk. The length of the chunk is -128 minus the value of the |
384 |
|
element. The following elements are OFFSET, ANNOTATION-TYPE, and |
385 |
|
a sequence of actual data for the annotation. OFFSET is a |
386 |
|
character position offset from dst_pos or src_pos, |
387 |
|
ANNOTATION-TYPE specfies the meaning of the annotation and how to |
388 |
|
handle the following data.. */ |
389 |
|
int *charbuf; |
390 |
|
int charbuf_size, charbuf_used; |
391 |
|
|
392 |
|
/* Set to 1 if charbuf contains an annotation. */ |
393 |
|
int annotated; |
394 |
|
|
395 |
|
unsigned char carryover[64]; |
396 |
|
int carryover_bytes; |
397 |
|
|
398 |
|
int default_char; |
399 |
|
|
400 |
|
int (*detector) P_ ((struct coding_system *, |
401 |
|
struct coding_detection_info *)); |
402 |
|
void (*decoder) P_ ((struct coding_system *)); |
403 |
|
int (*encoder) P_ ((struct coding_system *)); |
404 |
}; |
}; |
405 |
|
|
406 |
#define CODING_REQUIRE_FLUSHING_MASK 1 |
/* Meanings of bits in the member `common_flags' of the structure |
407 |
#define CODING_REQUIRE_DECODING_MASK 2 |
coding_system. The lowest 8 bits are reserved for various kind of |
408 |
#define CODING_REQUIRE_ENCODING_MASK 4 |
annotations (currently two of them are used). */ |
409 |
#define CODING_REQUIRE_DETECTION_MASK 8 |
#define CODING_ANNOTATION_MASK 0x00FF |
410 |
|
#define CODING_ANNOTATE_COMPOSITION_MASK 0x0001 |
411 |
|
#define CODING_ANNOTATE_DIRECTION_MASK 0x0002 |
412 |
|
#define CODING_ANNOTATE_CHARSET_MASK 0x0003 |
413 |
|
#define CODING_FOR_UNIBYTE_MASK 0x0100 |
414 |
|
#define CODING_REQUIRE_FLUSHING_MASK 0x0200 |
415 |
|
#define CODING_REQUIRE_DECODING_MASK 0x0400 |
416 |
|
#define CODING_REQUIRE_ENCODING_MASK 0x0800 |
417 |
|
#define CODING_REQUIRE_DETECTION_MASK 0x1000 |
418 |
|
#define CODING_RESET_AT_BOL_MASK 0x2000 |
419 |
|
|
420 |
|
/* Return 1 if the coding context CODING requires annotaion |
421 |
|
handling. */ |
422 |
|
#define CODING_REQUIRE_ANNOTATION(coding) \ |
423 |
|
((coding)->common_flags & CODING_ANNOTATION_MASK) |
424 |
|
|
425 |
|
/* Return 1 if the coding context CODING prefers decoding into unibyte. */ |
426 |
|
#define CODING_FOR_UNIBYTE(coding) \ |
427 |
|
((coding)->common_flags & CODING_FOR_UNIBYTE_MASK) |
428 |
|
|
429 |
/* Return 1 if the coding system CODING requires specific code to be |
/* Return 1 if the coding context CODING requires specific code to be |
430 |
attached at the tail of converted text. */ |
attached at the tail of converted text. */ |
431 |
#define CODING_REQUIRE_FLUSHING(coding) \ |
#define CODING_REQUIRE_FLUSHING(coding) \ |
432 |
((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK) |
((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK) |
433 |
|
|
434 |
/* Return 1 if the coding system CODING requires code conversion on |
/* Return 1 if the coding context CODING requires code conversion on |
435 |
decoding. */ |
decoding. */ |
436 |
#define CODING_REQUIRE_DECODING(coding) \ |
#define CODING_REQUIRE_DECODING(coding) \ |
437 |
((coding)->dst_multibyte \ |
((coding)->dst_multibyte \ |
438 |
|| (coding)->common_flags & CODING_REQUIRE_DECODING_MASK) |
|| (coding)->common_flags & CODING_REQUIRE_DECODING_MASK) |
439 |
|
|
440 |
/* Return 1 if the coding system CODING requires code conversion on |
|
441 |
|
/* Return 1 if the coding context CODING requires code conversion on |
442 |
encoding. */ |
encoding. */ |
443 |
#define CODING_REQUIRE_ENCODING(coding) \ |
#define CODING_REQUIRE_ENCODING(coding) \ |
444 |
((coding)->src_multibyte \ |
((coding)->src_multibyte \ |
445 |
|| (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK) |
|| (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK \ |
446 |
|
|| (coding)->mode & CODING_MODE_SELECTIVE_DISPLAY) |
447 |
|
|
448 |
|
|
449 |
/* Return 1 if the coding system CODING requires some kind of code |
/* Return 1 if the coding context CODING requires some kind of code |
450 |
detection. */ |
detection. */ |
451 |
#define CODING_REQUIRE_DETECTION(coding) \ |
#define CODING_REQUIRE_DETECTION(coding) \ |
452 |
((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK) |
((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK) |
453 |
|
|
454 |
/* Return 1 if the coding system CODING requires code conversion on |
/* Return 1 if the coding context CODING requires code conversion on |
455 |
decoding or some kind of code detection. */ |
decoding or some kind of code detection. */ |
456 |
#define CODING_MAY_REQUIRE_DECODING(coding) \ |
#define CODING_MAY_REQUIRE_DECODING(coding) \ |
457 |
(CODING_REQUIRE_DECODING (coding) \ |
(CODING_REQUIRE_DECODING (coding) \ |
458 |
|| CODING_REQUIRE_DETECTION (coding)) |
|| CODING_REQUIRE_DETECTION (coding)) |
459 |
|
|
|
/* Index for each coding category in `coding_category_table' */ |
|
|
#define CODING_CATEGORY_IDX_EMACS_MULE 0 |
|
|
#define CODING_CATEGORY_IDX_SJIS 1 |
|
|
#define CODING_CATEGORY_IDX_ISO_7 2 |
|
|
#define CODING_CATEGORY_IDX_ISO_7_TIGHT 3 |
|
|
#define CODING_CATEGORY_IDX_ISO_8_1 4 |
|
|
#define CODING_CATEGORY_IDX_ISO_8_2 5 |
|
|
#define CODING_CATEGORY_IDX_ISO_7_ELSE 6 |
|
|
#define CODING_CATEGORY_IDX_ISO_8_ELSE 7 |
|
|
#define CODING_CATEGORY_IDX_CCL 8 |
|
|
#define CODING_CATEGORY_IDX_BIG5 9 |
|
|
#define CODING_CATEGORY_IDX_UTF_8 10 |
|
|
#define CODING_CATEGORY_IDX_UTF_16_BE 11 |
|
|
#define CODING_CATEGORY_IDX_UTF_16_LE 12 |
|
|
#define CODING_CATEGORY_IDX_RAW_TEXT 13 |
|
|
#define CODING_CATEGORY_IDX_BINARY 14 |
|
|
#define CODING_CATEGORY_IDX_MAX 15 |
|
|
|
|
|
/* Definitions of flag bits returned by the function |
|
|
detect_coding_mask (). */ |
|
|
#define CODING_CATEGORY_MASK_EMACS_MULE (1 << CODING_CATEGORY_IDX_EMACS_MULE) |
|
|
#define CODING_CATEGORY_MASK_SJIS (1 << CODING_CATEGORY_IDX_SJIS) |
|
|
#define CODING_CATEGORY_MASK_ISO_7 (1 << CODING_CATEGORY_IDX_ISO_7) |
|
|
#define CODING_CATEGORY_MASK_ISO_7_TIGHT (1 << CODING_CATEGORY_IDX_ISO_7_TIGHT) |
|
|
#define CODING_CATEGORY_MASK_ISO_8_1 (1 << CODING_CATEGORY_IDX_ISO_8_1) |
|
|
#define CODING_CATEGORY_MASK_ISO_8_2 (1 << CODING_CATEGORY_IDX_ISO_8_2) |
|
|
#define CODING_CATEGORY_MASK_ISO_7_ELSE (1 << CODING_CATEGORY_IDX_ISO_7_ELSE) |
|
|
#define CODING_CATEGORY_MASK_ISO_8_ELSE (1 << CODING_CATEGORY_IDX_ISO_8_ELSE) |
|
|
#define CODING_CATEGORY_MASK_CCL (1 << CODING_CATEGORY_IDX_CCL) |
|
|
#define CODING_CATEGORY_MASK_BIG5 (1 << CODING_CATEGORY_IDX_BIG5) |
|
|
#define CODING_CATEGORY_MASK_UTF_8 (1 << CODING_CATEGORY_IDX_UTF_8) |
|
|
#define CODING_CATEGORY_MASK_UTF_16_BE (1 << CODING_CATEGORY_IDX_UTF_16_BE) |
|
|
#define CODING_CATEGORY_MASK_UTF_16_LE (1 << CODING_CATEGORY_IDX_UTF_16_LE) |
|
|
#define CODING_CATEGORY_MASK_RAW_TEXT (1 << CODING_CATEGORY_IDX_RAW_TEXT) |
|
|
#define CODING_CATEGORY_MASK_BINARY (1 << CODING_CATEGORY_IDX_BINARY) |
|
|
|
|
|
/* This value is returned if detect_coding_mask () find nothing other |
|
|
than ASCII characters. */ |
|
|
#define CODING_CATEGORY_MASK_ANY \ |
|
|
( CODING_CATEGORY_MASK_EMACS_MULE \ |
|
|
| CODING_CATEGORY_MASK_SJIS \ |
|
|
| CODING_CATEGORY_MASK_ISO_7 \ |
|
|
| CODING_CATEGORY_MASK_ISO_7_TIGHT \ |
|
|
| CODING_CATEGORY_MASK_ISO_8_1 \ |
|
|
| CODING_CATEGORY_MASK_ISO_8_2 \ |
|
|
| CODING_CATEGORY_MASK_ISO_7_ELSE \ |
|
|
| CODING_CATEGORY_MASK_ISO_8_ELSE \ |
|
|
| CODING_CATEGORY_MASK_CCL \ |
|
|
| CODING_CATEGORY_MASK_BIG5 \ |
|
|
| CODING_CATEGORY_MASK_UTF_8 \ |
|
|
| CODING_CATEGORY_MASK_UTF_16_BE \ |
|
|
| CODING_CATEGORY_MASK_UTF_16_LE) |
|
|
|
|
|
#define CODING_CATEGORY_MASK_ISO_7BIT \ |
|
|
(CODING_CATEGORY_MASK_ISO_7 | CODING_CATEGORY_MASK_ISO_7_TIGHT) |
|
|
|
|
|
#define CODING_CATEGORY_MASK_ISO_8BIT \ |
|
|
(CODING_CATEGORY_MASK_ISO_8_1 | CODING_CATEGORY_MASK_ISO_8_2) |
|
|
|
|
|
#define CODING_CATEGORY_MASK_ISO_SHIFT \ |
|
|
(CODING_CATEGORY_MASK_ISO_7_ELSE | CODING_CATEGORY_MASK_ISO_8_ELSE) |
|
|
|
|
|
#define CODING_CATEGORY_MASK_ISO \ |
|
|
( CODING_CATEGORY_MASK_ISO_7BIT \ |
|
|
| CODING_CATEGORY_MASK_ISO_SHIFT \ |
|
|
| CODING_CATEGORY_MASK_ISO_8BIT) |
|
|
|
|
|
#define CODING_CATEGORY_MASK_UTF_16_BE_LE \ |
|
|
(CODING_CATEGORY_MASK_UTF_16_BE | CODING_CATEGORY_MASK_UTF_16_LE) |
|
|
|
|
460 |
/* Macros to decode or encode a character of JISX0208 in SJIS. S1 and |
/* Macros to decode or encode a character of JISX0208 in SJIS. S1 and |
461 |
S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding |
S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding |
462 |
system. C1 and C2 are the 1st and 2nd position codes of Emacs' |
system. C1 and C2 are the 1st and 2nd position codes of Emacs' |
463 |
internal format. */ |
internal format. */ |
464 |
|
|
465 |
#define DECODE_SJIS(s1, s2, c1, c2) \ |
#define SJIS_TO_JIS(code) \ |
466 |
do { \ |
do { \ |
467 |
if (s2 >= 0x9F) \ |
int s1, s2, j1, j2; \ |
468 |
c1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0), \ |
\ |
469 |
c2 = s2 - 0x7E; \ |
s1 = (code) >> 8, s2 = (code) & 0xFF; \ |
470 |
else \ |
\ |
471 |
c1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1), \ |
if (s2 >= 0x9F) \ |
472 |
c2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F); \ |
(j1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0), \ |
473 |
|
j2 = s2 - 0x7E); \ |
474 |
|
else \ |
475 |
|
(j1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1), \ |
476 |
|
j2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F)); \ |
477 |
|
(code) = (j1 << 8) | j2; \ |
478 |
} while (0) |
} while (0) |
479 |
|
|
480 |
#define ENCODE_SJIS(c1, c2, s1, s2) \ |
|
481 |
|
#define JIS_TO_SJIS(code) \ |
482 |
do { \ |
do { \ |
483 |
if (c1 & 1) \ |
int s1, s2, j1, j2; \ |
484 |
s1 = c1 / 2 + ((c1 < 0x5F) ? 0x71 : 0xB1), \ |
\ |
485 |
s2 = c2 + ((c2 >= 0x60) ? 0x20 : 0x1F); \ |
j1 = (code) >> 8, j2 = (code) & 0xFF; \ |
486 |
|
if (j1 & 1) \ |
487 |
|
(s1 = j1 / 2 + ((j1 < 0x5F) ? 0x71 : 0xB1), \ |
488 |
|
s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F)); \ |
489 |
else \ |
else \ |
490 |
s1 = c1 / 2 + ((c1 < 0x5F) ? 0x70 : 0xB0), \ |
(s1 = j1 / 2 + ((j1 < 0x5F) ? 0x70 : 0xB0), \ |
491 |
s2 = c2 + 0x7E; \ |
s2 = j2 + 0x7E); \ |
492 |
|
(code) = (s1 << 8) | s2; \ |
493 |
} while (0) |
} while (0) |
494 |
|
|
495 |
|
|
496 |
/* Encode the file name NAME using the specified coding system |
/* Encode the file name NAME using the specified coding system |
497 |
for file names, if any. */ |
for file names, if any. */ |
498 |
#define ENCODE_FILE(name) \ |
#define ENCODE_FILE(name) \ |
504 |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \ |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \ |
505 |
: name)) |
: name)) |
506 |
|
|
507 |
|
|
508 |
/* Decode the file name NAME using the specified coding system |
/* Decode the file name NAME using the specified coding system |
509 |
for file names, if any. */ |
for file names, if any. */ |
510 |
#define DECODE_FILE(name) \ |
#define DECODE_FILE(name) \ |
516 |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \ |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \ |
517 |
: name)) |
: name)) |
518 |
|
|
519 |
|
|
520 |
#ifdef WINDOWSNT |
#ifdef WINDOWSNT |
521 |
/* Encode the string STR using the specified coding system |
/* Encode the string STR using the specified coding system |
522 |
for w32 system functions, if any. */ |
for w32 system functions, if any. */ |
523 |
#define ENCODE_SYSTEM(str) \ |
#define ENCODE_SYSTEM(str) \ |
524 |
(! NILP (Vlocale_coding_system) \ |
(! NILP (Vlocale_coding_system) \ |
525 |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
526 |
? code_convert_string_norecord (str, Vlocale_coding_system, 1) \ |
? code_convert_string_norecord (str, Vlocale_coding_system, 1) \ |
527 |
: str) |
: str) |
528 |
|
|
529 |
/* Decode the string STR using the specified coding system |
/* Decode the string STR using the specified coding system |
530 |
for w32 system functions, if any. */ |
for w32 system functions, if any. */ |
531 |
#define DECODE_SYSTEM(name) \ |
#define DECODE_SYSTEM(name) \ |
532 |
(! NILP (Vlocale_coding_system) \ |
(! NILP (Vlocale_coding_system) \ |
533 |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
534 |
? code_convert_string_norecord (str, Vlocale_coding_system, 0) \ |
? code_convert_string_norecord (str, Vlocale_coding_system, 0) \ |
535 |
: str) |
: str) |
536 |
|
|
537 |
#else /* WINDOWSNT */ |
#else /* WINDOWSNT */ |
541 |
|
|
542 |
#endif /* !WINDOWSNT */ |
#endif /* !WINDOWSNT */ |
543 |
|
|
|
#define ENCODE_UTF_8(str) code_convert_string_norecord (str, Qutf_8, 1) |
|
|
|
|
544 |
/* Extern declarations. */ |
/* Extern declarations. */ |
545 |
extern int decode_coding P_ ((struct coding_system *, const unsigned char *, |
extern Lisp_Object make_conversion_work_buffer P_ ((int, int)); |
|
unsigned char *, int, int)); |
|
|
extern int encode_coding P_ ((struct coding_system *, const unsigned char *, |
|
|
unsigned char *, int, int)); |
|
|
extern void coding_save_composition P_ ((struct coding_system *, int, int, |
|
|
Lisp_Object)); |
|
|
extern void coding_free_composition_data P_ ((struct coding_system *)); |
|
|
extern void coding_adjust_composition_offset P_ ((struct coding_system *, |
|
|
int)); |
|
|
extern void coding_allocate_composition_data P_ ((struct coding_system *, |
|
|
int)); |
|
|
extern void coding_restore_composition P_ ((struct coding_system *, |
|
|
Lisp_Object)); |
|
|
extern int code_convert_region P_ ((int, int, int, int, struct coding_system *, |
|
|
int, int)); |
|
|
extern Lisp_Object run_pre_post_conversion_on_str P_ ((Lisp_Object, |
|
|
struct coding_system *, |
|
|
int)); |
|
546 |
extern int decoding_buffer_size P_ ((struct coding_system *, int)); |
extern int decoding_buffer_size P_ ((struct coding_system *, int)); |
547 |
extern int encoding_buffer_size P_ ((struct coding_system *, int)); |
extern int encoding_buffer_size P_ ((struct coding_system *, int)); |
548 |
extern void detect_coding P_ ((struct coding_system *, const unsigned char *, |
extern void setup_coding_system P_ ((Lisp_Object, struct coding_system *)); |
549 |
int)); |
extern void detect_coding P_ ((struct coding_system *)); |
550 |
extern void detect_eol P_ ((struct coding_system *, const unsigned char *, |
extern Lisp_Object code_convert_region P_ ((Lisp_Object, Lisp_Object, |
551 |
int)); |
Lisp_Object, Lisp_Object, |
552 |
extern int setup_coding_system P_ ((Lisp_Object, struct coding_system *)); |
int, int)); |
553 |
extern Lisp_Object code_convert_string P_ ((Lisp_Object, |
extern Lisp_Object code_convert_string P_ ((Lisp_Object, Lisp_Object, |
554 |
struct coding_system *, int, int)); |
Lisp_Object, int, int, int)); |
|
extern Lisp_Object code_convert_string1 P_ ((Lisp_Object, Lisp_Object, |
|
|
Lisp_Object, int)); |
|
555 |
extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, |
extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, |
556 |
int)); |
int)); |
557 |
extern void setup_raw_text_coding_system P_ ((struct coding_system *)); |
extern Lisp_Object raw_text_coding_system P_ ((Lisp_Object)); |
558 |
extern Lisp_Object encode_coding_string P_ ((Lisp_Object, |
extern Lisp_Object coding_inherit_eol_type P_ ((Lisp_Object, Lisp_Object)); |
559 |
struct coding_system *, int)); |
|
560 |
extern Lisp_Object decode_coding_string P_ ((Lisp_Object, |
extern int decode_coding_gap P_ ((struct coding_system *, |
561 |
struct coding_system *, int)); |
EMACS_INT, EMACS_INT)); |
562 |
|
extern int encode_coding_gap P_ ((struct coding_system *, |
563 |
|
EMACS_INT, EMACS_INT)); |
564 |
|
extern void decode_coding_object P_ ((struct coding_system *, |
565 |
|
Lisp_Object, EMACS_INT, EMACS_INT, |
566 |
|
EMACS_INT, EMACS_INT, Lisp_Object)); |
567 |
|
extern void encode_coding_object P_ ((struct coding_system *, |
568 |
|
Lisp_Object, EMACS_INT, EMACS_INT, |
569 |
|
EMACS_INT, EMACS_INT, Lisp_Object)); |
570 |
|
|
571 |
|
#define decode_coding_region(coding, from, to) \ |
572 |
|
decode_coding_object (coding, Fcurrent_buffer (), \ |
573 |
|
from, CHAR_TO_BYTE (from), \ |
574 |
|
to, CHAR_TO_BYTE (to), Fcurrent_buffer ()) |
575 |
|
|
576 |
|
|
577 |
|
#define encode_coding_region(coding, from, to) \ |
578 |
|
encode_coding_object (coding, Fcurrent_buffer (), \ |
579 |
|
from, CHAR_TO_BYTE (from), \ |
580 |
|
to, CHAR_TO_BYTE (to), Fcurrent_buffer ()) |
581 |
|
|
582 |
|
|
583 |
|
#define decode_coding_string(coding, string, nocopy) \ |
584 |
|
decode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \ |
585 |
|
STRING_BYTES (XSTRING (string)), Qt) |
586 |
|
|
587 |
|
#define encode_coding_string(coding, string, nocopy) \ |
588 |
|
(encode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \ |
589 |
|
STRING_BYTES (XSTRING (string)), Qt), \ |
590 |
|
(coding)->dst_object) |
591 |
|
|
592 |
|
|
593 |
|
#define decode_coding_c_string(coding, src, bytes, dst_object) \ |
594 |
|
do { \ |
595 |
|
(coding)->source = (src); \ |
596 |
|
(coding)->src_chars = (coding)->src_bytes = (bytes); \ |
597 |
|
decode_coding_object ((coding), Qnil, 0, 0, (bytes), (bytes), \ |
598 |
|
(dst_object)); \ |
599 |
|
} while (0) |
600 |
|
|
601 |
|
|
602 |
|
extern Lisp_Object preferred_coding_system P_ (()); |
603 |
|
|
604 |
|
|
605 |
|
extern Lisp_Object Qutf_8, Qutf_8_emacs; |
606 |
|
|
607 |
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index; |
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index; |
608 |
extern Lisp_Object Qraw_text, Qemacs_mule; |
extern Lisp_Object Qcoding_system_p; |
609 |
|
extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided; |
610 |
|
extern Lisp_Object Qiso_2022; |
611 |
extern Lisp_Object Qbuffer_file_coding_system; |
extern Lisp_Object Qbuffer_file_coding_system; |
612 |
extern Lisp_Object Vcoding_category_list; |
|
613 |
extern Lisp_Object Qutf_8; |
extern Lisp_Object Qunix, Qdos, Qmac; |
614 |
|
|
615 |
extern Lisp_Object Qtranslation_table; |
extern Lisp_Object Qtranslation_table; |
616 |
extern Lisp_Object Qtranslation_table_id; |
extern Lisp_Object Qtranslation_table_id; |
655 |
function `set-keyboard-coding-system'. */ |
function `set-keyboard-coding-system'. */ |
656 |
extern struct coding_system keyboard_coding; |
extern struct coding_system keyboard_coding; |
657 |
|
|
|
/* Default coding system to be used to write a file. */ |
|
|
extern struct coding_system default_buffer_file_coding; |
|
|
|
|
658 |
/* Default coding systems used for process I/O. */ |
/* Default coding systems used for process I/O. */ |
659 |
extern Lisp_Object Vdefault_process_coding_system; |
extern Lisp_Object Vdefault_process_coding_system; |
660 |
|
|
661 |
/* Function to call to force a user to force select a proper coding |
/* Function to call to force a user to force select a propert coding |
662 |
system. */ |
system. */ |
663 |
extern Lisp_Object Vselect_safe_coding_system_function; |
extern Lisp_Object Vselect_safe_coding_system_function; |
664 |
|
|
678 |
/* Error signaled when there's a problem with detecting coding system */ |
/* Error signaled when there's a problem with detecting coding system */ |
679 |
extern Lisp_Object Qcoding_system_error; |
extern Lisp_Object Qcoding_system_error; |
680 |
|
|
681 |
|
extern char emacs_mule_bytes[256]; |
682 |
|
extern int emacs_mule_string_char P_ ((unsigned char *)); |
683 |
|
|
684 |
#endif /* EMACS_CODING_H */ |
#endif /* EMACS_CODING_H */ |