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) 2001, 2002 |
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_plist, |
43 |
or official TYPE9Nx9N character. */ |
coding_arg_eol_type, |
44 |
EMACS_leading_code_4, /* Base leading code of private |
coding_arg_max |
|
TYPE9Nx9N character. */ |
|
|
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. */ |
|
45 |
}; |
}; |
46 |
|
|
47 |
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 |
|
48 |
{ |
{ |
49 |
ISO_control_0, /* Control codes in the range |
coding_arg_iso2022_initial = coding_arg_max, |
50 |
0x00..0x1F and 0x7F, except for the |
coding_arg_iso2022_reg_usage, |
51 |
following 5 codes. */ |
coding_arg_iso2022_request, |
52 |
ISO_carriage_return, /* ISO_CODE_CR (0x0D) */ |
coding_arg_iso2022_flags, |
53 |
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. */ |
|
54 |
}; |
}; |
55 |
|
|
56 |
/** The macros CODING_FLAG_ISO_XXX defines a flag bit of the `flags' |
enum define_coding_utf16_arg_index |
57 |
element in the structure `coding_system'. This information is used |
{ |
58 |
while encoding a text to ISO2022. **/ |
coding_arg_utf16_bom = coding_arg_max, |
59 |
|
coding_arg_utf16_endian, |
60 |
/* If set, produce short-form designation sequence (e.g. ESC $ A) |
coding_arg_utf16_max |
61 |
instead of long-form sequence (e.g. ESC $ ( A). */ |
}; |
|
#define CODING_FLAG_ISO_SHORT_FORM 0x0001 |
|
62 |
|
|
63 |
/* If set, reset graphic planes and registers at end-of-line to the |
enum define_coding_ccl_arg_index |
64 |
initial state. */ |
{ |
65 |
#define CODING_FLAG_ISO_RESET_AT_EOL 0x0002 |
coding_arg_ccl_decoder, |
66 |
|
coding_arg_ccl_encoder, |
67 |
|
coding_arg_ccl_valids, |
68 |
|
coding_arg_ccl_max |
69 |
|
}; |
70 |
|
|
71 |
/* 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 |
|
72 |
|
|
73 |
/* If set, encode by 7-bit environment. */ |
/* Enumeration of coding system type. */ |
|
#define CODING_FLAG_ISO_SEVEN_BITS 0x0008 |
|
74 |
|
|
75 |
/* If set, use locking-shift function. */ |
enum coding_system_type |
76 |
#define CODING_FLAG_ISO_LOCKING_SHIFT 0x0010 |
{ |
77 |
|
coding_type_charset, |
78 |
|
coding_type_utf_8, |
79 |
|
coding_type_utf_16, |
80 |
|
coding_type_iso_2022, |
81 |
|
coding_type_emacs_mule, |
82 |
|
coding_type_sjis, |
83 |
|
coding_type_ccl, |
84 |
|
coding_type_raw_text, |
85 |
|
coding_type_undecided, |
86 |
|
coding_type_max |
87 |
|
}; |
88 |
|
|
|
/* If set, use single-shift function. Overwrite |
|
|
CODING_FLAG_ISO_LOCKING_SHIFT. */ |
|
|
#define CODING_FLAG_ISO_SINGLE_SHIFT 0x0020 |
|
89 |
|
|
90 |
/* If set, designate JISX0201-Roman instead of ASCII. */ |
/* Enumeration of end-of-line format type. */ |
|
#define CODING_FLAG_ISO_USE_ROMAN 0x0040 |
|
91 |
|
|
92 |
/* If set, designate JISX0208-1978 instead of JISX0208-1983. */ |
enum end_of_line_type |
93 |
#define CODING_FLAG_ISO_USE_OLDJIS 0x0080 |
{ |
94 |
|
eol_lf, /* Line-feed only, same as Emacs' internal |
95 |
|
format. */ |
96 |
|
eol_crlf, /* Sequence of carriage-return and |
97 |
|
line-feed. */ |
98 |
|
eol_cr, /* Carriage-return only. */ |
99 |
|
eol_any, /* Accept any of above. Produce line-feed |
100 |
|
only. */ |
101 |
|
eol_undecided, /* This value is used to denote that the |
102 |
|
eol-type is not yet undecided. */ |
103 |
|
eol_type_max |
104 |
|
}; |
105 |
|
|
106 |
/* 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 |
|
107 |
|
|
108 |
/* If set, assume designation states are reset at beginning of line on |
enum coding_attr_index |
109 |
output. */ |
{ |
110 |
#define CODING_FLAG_ISO_INIT_AT_BOL 0x0200 |
coding_attr_base_name, |
111 |
|
coding_attr_docstring, |
112 |
|
coding_attr_mnemonic, |
113 |
|
coding_attr_type, |
114 |
|
coding_attr_charset_list, |
115 |
|
coding_attr_ascii_compat, |
116 |
|
coding_attr_decode_tbl, |
117 |
|
coding_attr_encode_tbl, |
118 |
|
coding_attr_post_read, |
119 |
|
coding_attr_pre_write, |
120 |
|
coding_attr_default_char, |
121 |
|
coding_attr_plist, |
122 |
|
|
123 |
|
coding_attr_category, |
124 |
|
coding_attr_safe_charsets, |
125 |
|
|
126 |
|
/* The followings are extra attributes for each type. */ |
127 |
|
coding_attr_charset_valids, |
128 |
|
|
129 |
|
coding_attr_ccl_decoder, |
130 |
|
coding_attr_ccl_encoder, |
131 |
|
coding_attr_ccl_valids, |
132 |
|
|
133 |
|
coding_attr_iso_initial, |
134 |
|
coding_attr_iso_usage, |
135 |
|
coding_attr_iso_request, |
136 |
|
coding_attr_iso_flags, |
137 |
|
|
138 |
/* If set, designation sequence should be placed at beginning of line |
coding_attr_utf_16_bom, |
139 |
on output. */ |
coding_attr_utf_16_endian, |
|
#define CODING_FLAG_ISO_DESIGNATE_AT_BOL 0x0400 |
|
140 |
|
|
141 |
/* If set, do not encode unsafe characters on output. */ |
coding_attr_emacs_mule_full, |
|
#define CODING_FLAG_ISO_SAFE 0x0800 |
|
142 |
|
|
143 |
/* If set, extra latin codes (128..159) are accepted as a valid code |
coding_attr_last_index |
144 |
on input. */ |
}; |
|
#define CODING_FLAG_ISO_LATIN_EXTRA 0x1000 |
|
145 |
|
|
|
/* If set, use designation escape sequence. */ |
|
|
#define CODING_FLAG_ISO_DESIGNATION 0x10000 |
|
146 |
|
|
147 |
/* A character to be produced on output if encoding of the original |
#define CODING_ATTR_BASE_NAME(attrs) AREF (attrs, coding_attr_base_name) |
148 |
character is prohibited by CODING_FLAG_ISO_SAFE. */ |
#define CODING_ATTR_TYPE(attrs) AREF (attrs, coding_attr_type) |
149 |
#define CODING_INHIBIT_CHARACTER_SUBSTITUTION 077 /* 077 == `?' */ |
#define CODING_ATTR_CHARSET_LIST(attrs) AREF (attrs, coding_attr_charset_list) |
150 |
|
#define CODING_ATTR_MNEMONIC(attrs) AREF (attrs, coding_attr_mnemonic) |
151 |
|
#define CODING_ATTR_DOCSTRING(attrs) AREF (attrs, coding_attr_docstring) |
152 |
|
#define CODING_ATTR_ASCII_COMPAT(attrs) AREF (attrs, coding_attr_ascii_compat) |
153 |
|
#define CODING_ATTR_DECODE_TBL(attrs) AREF (attrs, coding_attr_decode_tbl) |
154 |
|
#define CODING_ATTR_ENCODE_TBL(attrs) AREF (attrs, coding_attr_encode_tbl) |
155 |
|
#define CODING_ATTR_POST_READ(attrs) AREF (attrs, coding_attr_post_read) |
156 |
|
#define CODING_ATTR_PRE_WRITE(attrs) AREF (attrs, coding_attr_pre_write) |
157 |
|
#define CODING_ATTR_DEFAULT_CHAR(attrs) AREF (attrs, coding_attr_default_char) |
158 |
|
#define CODING_ATTR_DIRECTION(attrs) AREF (attrs, coding_attr_direction) |
159 |
|
#define CODING_ATTR_FLUSHING(attrs) AREF (attrs, coding_attr_flushing) |
160 |
|
#define CODING_ATTR_PLIST(attrs) AREF (attrs, coding_attr_plist) |
161 |
|
#define CODING_ATTR_CATEGORY(attrs) AREF (attrs, coding_attr_category) |
162 |
|
#define CODING_ATTR_SAFE_CHARSETS(attrs)AREF (attrs, coding_attr_safe_charsets) |
163 |
|
|
164 |
|
|
165 |
|
#define CODING_ID_ATTRS(id) \ |
166 |
|
(AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 0)) |
167 |
|
|
168 |
|
#define CODING_ID_ALIASES(id) \ |
169 |
|
(AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 1)) |
170 |
|
|
171 |
|
#define CODING_ID_EOL_TYPE(id) \ |
172 |
|
(AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 2)) |
173 |
|
|
174 |
|
#define CODING_ID_NAME(id) \ |
175 |
|
(HASH_KEY (XHASH_TABLE (Vcoding_system_hash_table), id)) |
176 |
|
|
177 |
|
#define CODING_SYSTEM_SPEC(coding_system_symbol) \ |
178 |
|
(Fgethash (coding_system_symbol, Vcoding_system_hash_table, Qnil)) |
179 |
|
|
180 |
|
#define CODING_SYSTEM_ID(coding_system_symbol) \ |
181 |
|
hash_lookup (XHASH_TABLE (Vcoding_system_hash_table), \ |
182 |
|
coding_system_symbol, NULL) |
183 |
|
|
184 |
/* Structure of the field `spec.iso2022' in the structure `coding_system'. */ |
#define CODING_SYSTEM_P(coding_system_symbol) \ |
185 |
struct iso2022_spec |
(! NILP (CODING_SYSTEM_SPEC (coding_system_symbol))) |
|
{ |
|
|
/* The current graphic register invoked to each graphic plane. */ |
|
|
int current_invocation[2]; |
|
186 |
|
|
187 |
/* The current charset designated to each graphic register. */ |
#define CHECK_CODING_SYSTEM(x) \ |
188 |
int current_designation[4]; |
do { \ |
189 |
|
if (!CODING_SYSTEM_P (x)) \ |
190 |
|
x = wrong_type_argument (Qcoding_system_p, (x)); \ |
191 |
|
} while (0) |
192 |
|
|
|
/* A charset initially designated to each graphic register. */ |
|
|
int initial_designation[4]; |
|
193 |
|
|
194 |
/* If not -1, it is a graphic register specified in an invalid |
#define CHECK_CODING_SYSTEM_GET_SPEC(x, spec) \ |
195 |
designation sequence. */ |
do { \ |
196 |
int last_invalid_designation_register; |
spec = CODING_SYSTEM_SPEC (x); \ |
197 |
|
if (NILP (spec)) \ |
198 |
/* A graphic register to which each charset should be designated. */ |
x = wrong_type_argument (Qcoding_system_p, (x)); \ |
199 |
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]; |
|
200 |
|
|
|
/* Set to 1 temporarily only when graphic register 2 or 3 is invoked |
|
|
by single-shift while encoding. */ |
|
|
int single_shifting; |
|
201 |
|
|
202 |
/* Set to 1 temporarily only when processing at beginning of line. */ |
#define CHECK_CODING_SYSTEM_GET_ID(x, id) \ |
203 |
int bol; |
do \ |
204 |
}; |
{ \ |
205 |
|
id = CODING_SYSTEM_ID (x); \ |
206 |
|
if (id < 0) \ |
207 |
|
x = wrong_type_argument (Qcoding_system_p, (x)); \ |
208 |
|
} while (0) |
209 |
|
|
|
/* 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. */ |
|
210 |
|
|
211 |
/*** GENERAL section ***/ |
/*** GENERAL section ***/ |
212 |
|
|
213 |
/* Types of coding system. */ |
/* Enumeration of result code of code conversion. */ |
214 |
enum coding_type |
enum coding_result_code |
215 |
{ |
{ |
216 |
coding_type_no_conversion, /* A coding system which requires no |
CODING_RESULT_SUCCESS, |
217 |
conversion for reading and writing |
CODING_RESULT_INSUFFICIENT_SRC, |
218 |
including end-of-line format. */ |
CODING_RESULT_INSUFFICIENT_DST, |
219 |
coding_type_emacs_mule, /* A coding system used in Emacs' |
CODING_RESULT_INCONSISTENT_EOL, |
220 |
buffer and string. Requires no |
CODING_RESULT_INSUFFICIENT_CMP, |
221 |
conversion for reading and writing |
CODING_RESULT_INTERRUPT, |
222 |
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. */ |
|
223 |
}; |
}; |
224 |
|
|
|
/* 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 |
|
225 |
|
|
226 |
/* Macros used for the member `mode' of the struct coding_system. */ |
/* Macros used for the member `mode' of the struct coding_system. */ |
227 |
|
|
231 |
|
|
232 |
/* If set, the decoding/encoding routines treat the current data as |
/* If set, the decoding/encoding routines treat the current data as |
233 |
the last block of the whole text to be converted, and do |
the last block of the whole text to be converted, and do |
234 |
appropriate finishing job. */ |
appropriate fisishing job. */ |
235 |
#define CODING_MODE_LAST_BLOCK 0x02 |
#define CODING_MODE_LAST_BLOCK 0x02 |
236 |
|
|
237 |
/* If set, it means that the current source text is in a buffer which |
/* If set, it means that the current source text is in a buffer which |
242 |
set, it means that right-to-left text is being processed. */ |
set, it means that right-to-left text is being processed. */ |
243 |
#define CODING_MODE_DIRECTION 0x08 |
#define CODING_MODE_DIRECTION 0x08 |
244 |
|
|
245 |
struct coding_system |
#define CODING_MODE_FIXED_DESTINATION 0x10 |
246 |
|
|
247 |
|
#define CODING_MODE_SAFE_ENCODING 0x20 |
248 |
|
|
249 |
|
/* Structure of the field `spec.iso_2022' in the structure |
250 |
|
`coding_system'. */ |
251 |
|
struct iso_2022_spec |
252 |
|
{ |
253 |
|
/* */ |
254 |
|
unsigned flags; |
255 |
|
|
256 |
|
/* The current graphic register invoked to each graphic plane. */ |
257 |
|
int current_invocation[2]; |
258 |
|
|
259 |
|
/* The current charset designated to each graphic register. The |
260 |
|
value -1 means that not charset is designated, -2 means that |
261 |
|
there was an invalid designation previously. */ |
262 |
|
int current_designation[4]; |
263 |
|
|
264 |
|
/* Set to 1 temporarily only when graphic register 2 or 3 is invoked |
265 |
|
by single-shift while encoding. */ |
266 |
|
int single_shifting; |
267 |
|
|
268 |
|
/* Set to 1 temporarily only when processing at beginning of line. */ |
269 |
|
int bol; |
270 |
|
}; |
271 |
|
|
272 |
|
struct ccl_spec; |
273 |
|
|
274 |
|
enum utf_16_bom_type |
275 |
|
{ |
276 |
|
utf_16_detect_bom, |
277 |
|
utf_16_without_bom, |
278 |
|
utf_16_with_bom |
279 |
|
}; |
280 |
|
|
281 |
|
enum utf_16_endian_type |
282 |
|
{ |
283 |
|
utf_16_big_endian, |
284 |
|
utf_16_little_endian |
285 |
|
}; |
286 |
|
|
287 |
|
struct utf_16_spec |
288 |
{ |
{ |
289 |
/* Type of the coding system. */ |
enum utf_16_bom_type bom; |
290 |
enum coding_type type; |
enum utf_16_endian_type endian; |
291 |
|
int surrogate; |
292 |
|
}; |
293 |
|
|
294 |
/* Type of end-of-line format (LF, CRLF, or CR) of the coding system. */ |
struct coding_system |
295 |
int eol_type; |
{ |
296 |
|
/* ID number of the coding system. This is an index to |
297 |
|
Vcoding_system_hash_table. This value is set by |
298 |
|
setup_coding_system. At the early stage of building time, this |
299 |
|
value is -1 in the array coding_categories to indicate that no |
300 |
|
coding-system of that category is yet defined. */ |
301 |
|
int id; |
302 |
|
|
303 |
/* 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 |
304 |
to all types of coding systems. */ |
to all types of coding systems. */ |
305 |
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; |
|
306 |
|
|
307 |
/* Mode bits of the coding system. See the comments of the macros |
/* Mode bits of the coding system. See the comments of the macros |
308 |
CODING_MODE_XXX. */ |
CODING_MODE_XXX. */ |
309 |
unsigned int mode; |
unsigned int mode; |
310 |
|
|
|
/* 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; |
|
|
|
|
311 |
/* Detailed information specific to each type of coding system. */ |
/* Detailed information specific to each type of coding system. */ |
312 |
union spec |
union |
313 |
{ |
{ |
314 |
struct iso2022_spec iso2022; |
struct iso_2022_spec iso_2022; |
315 |
struct ccl_spec ccl; /* Defined in ccl.h. */ |
struct ccl_spec *ccl; /* Defined in ccl.h. */ |
316 |
|
struct utf_16_spec utf_16; |
317 |
|
int emacs_mule_full_support; |
318 |
} spec; |
} spec; |
319 |
|
|
320 |
/* Index number of coding category of the coding system. */ |
int max_charset_id; |
321 |
int category_idx; |
char *safe_charsets; |
322 |
|
|
323 |
/* The following two members specify how characters 128..159 are |
/* The following two members specify how binary 8-bit code 128..255 |
324 |
represented in source and destination text respectively. 1 means |
are represented in source and destination text respectively. 1 |
325 |
they are represented by 2-byte sequence, 0 means they are |
means they are represented by 2-byte sequence, 0 means they are |
326 |
represented by 1-byte as is (see the comment in charset.h). */ |
represented by 1-byte as is (see the comment in character.h). */ |
327 |
unsigned src_multibyte : 1; |
unsigned src_multibyte : 1; |
328 |
unsigned dst_multibyte : 1; |
unsigned dst_multibyte : 1; |
329 |
|
|
331 |
-1 in setup_coding_system, and updated by detect_coding. So, |
-1 in setup_coding_system, and updated by detect_coding. So, |
332 |
when this is equal to the byte length of the text being |
when this is equal to the byte length of the text being |
333 |
converted, we can skip the actual conversion process. */ |
converted, we can skip the actual conversion process. */ |
334 |
int heading_ascii; |
int head_ascii; |
335 |
|
|
336 |
/* The following members are set by encoding/decoding routine. */ |
/* The following members are set by encoding/decoding routine. */ |
337 |
int produced, produced_char, consumed, consumed_char; |
EMACS_INT produced, produced_char, consumed, consumed_char; |
338 |
|
|
339 |
/* Number of error source data found in a decoding routine. */ |
/* Number of error source data found in a decoding routine. */ |
340 |
int errors; |
int errors; |
341 |
|
|
342 |
/* Finish status of code conversion. It should be one of macros |
/* Store the positions of error source data. */ |
343 |
CODING_FINISH_XXXX. */ |
EMACS_INT *error_positions; |
|
int result; |
|
344 |
|
|
345 |
/* If nonzero, suppress error notification. */ |
/* Finish status of code conversion. */ |
346 |
int suppress_error; |
enum coding_result_code result; |
347 |
|
|
348 |
/* The following members are all Lisp symbols. We don't have to |
/* The following members are all Lisp symbols. We don't have to |
349 |
protect them from GC because the current garbage collection |
protect them from GC because the current garbage collection |
350 |
doesn't relocate Lisp symbols. But, when it is changed, we must |
doesn't relocate Lisp symbols. But, when it is changed, we must |
351 |
find a way to protect them. */ |
find a way to protect them. */ |
352 |
|
|
353 |
/* Backward pointer to the Lisp symbol of the coding system. */ |
EMACS_INT src_pos, src_pos_byte, src_chars, src_bytes; |
354 |
Lisp_Object symbol; |
Lisp_Object src_object; |
355 |
|
unsigned char *source; |
356 |
/* Lisp function (symbol) to be called after decoding to do |
|
357 |
additional conversion, or nil. */ |
EMACS_INT dst_pos, dst_pos_byte, dst_bytes; |
358 |
Lisp_Object post_read_conversion; |
Lisp_Object dst_object; |
359 |
|
unsigned char *destination; |
360 |
/* Lisp function (symbol) to be called before encoding to do |
|
361 |
additional conversion, or nil. */ |
int chars_at_source; |
362 |
Lisp_Object pre_write_conversion; |
|
363 |
|
/* If an element is non-negative, it is a character code. |
364 |
/* Character translation tables to look up, or nil. */ |
|
365 |
Lisp_Object translation_table_for_decode; |
If it is in the range -128..-1, it is a 8-bit character code |
366 |
Lisp_Object translation_table_for_encode; |
minus 256. |
367 |
|
|
368 |
|
If it is less than -128, it specifies the start of an annotation |
369 |
|
chunk. The length of the chunk is -128 minus the value of the |
370 |
|
element. The following elements are OFFSET, ANNOTATION-TYPE, and |
371 |
|
a sequence of actual data for the annotation. OFFSET is a |
372 |
|
character position offset from dst_pos or src_pos, |
373 |
|
ANNOTATION-TYPE specfies the meaning of the annotation and how to |
374 |
|
handle the following data.. */ |
375 |
|
int *charbuf; |
376 |
|
int charbuf_size, charbuf_used; |
377 |
|
|
378 |
|
/* Set to 1 if charbuf contains an annotation. */ |
379 |
|
int annotated; |
380 |
|
|
381 |
|
unsigned char carryover[64]; |
382 |
|
int carryover_bytes; |
383 |
|
|
384 |
|
int default_char; |
385 |
|
|
386 |
|
int (*detector) P_ ((struct coding_system *, int *)); |
387 |
|
void (*decoder) P_ ((struct coding_system *)); |
388 |
|
int (*encoder) P_ ((struct coding_system *)); |
389 |
}; |
}; |
390 |
|
|
391 |
#define CODING_REQUIRE_FLUSHING_MASK 1 |
/* Meanings of bits in the member `common_flags' of the structure |
392 |
#define CODING_REQUIRE_DECODING_MASK 2 |
coding_system. The lowest 8 bits are reserved for various kind of |
393 |
#define CODING_REQUIRE_ENCODING_MASK 4 |
annotations (currently two of them are used). */ |
394 |
#define CODING_REQUIRE_DETECTION_MASK 8 |
#define CODING_ANNOTATION_MASK 0x00FF |
395 |
|
#define CODING_ANNOTATE_COMPOSITION_MASK 0x0001 |
396 |
|
#define CODING_ANNOTATE_DIRECTION_MASK 0x0002 |
397 |
|
#define CODING_FOR_UNIBYTE_MASK 0x0100 |
398 |
|
#define CODING_REQUIRE_FLUSHING_MASK 0x0200 |
399 |
|
#define CODING_REQUIRE_DECODING_MASK 0x0400 |
400 |
|
#define CODING_REQUIRE_ENCODING_MASK 0x0800 |
401 |
|
#define CODING_REQUIRE_DETECTION_MASK 0x1000 |
402 |
|
#define CODING_RESET_AT_BOL_MASK 0x2000 |
403 |
|
|
404 |
|
/* Return 1 if the coding context CODING requires annotaion |
405 |
|
handling. */ |
406 |
|
#define CODING_REQUIRE_ANNOTATION(coding) \ |
407 |
|
((coding)->common_flags & CODING_ANNOTATION_MASK) |
408 |
|
|
409 |
|
/* Return 1 if the coding context CODING prefers decoding into unibyte. */ |
410 |
|
#define CODING_FOR_UNIBYTE(coding) \ |
411 |
|
((coding)->common_flags & CODING_FOR_UNIBYTE_MASK) |
412 |
|
|
413 |
/* Return 1 if the coding system CODING requires specific code to be |
/* Return 1 if the coding context CODING requires specific code to be |
414 |
attached at the tail of converted text. */ |
attached at the tail of converted text. */ |
415 |
#define CODING_REQUIRE_FLUSHING(coding) \ |
#define CODING_REQUIRE_FLUSHING(coding) \ |
416 |
((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK) |
((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK) |
417 |
|
|
418 |
/* Return 1 if the coding system CODING requires code conversion on |
/* Return 1 if the coding context CODING requires code conversion on |
419 |
decoding. */ |
decoding. */ |
420 |
#define CODING_REQUIRE_DECODING(coding) \ |
#define CODING_REQUIRE_DECODING(coding) \ |
421 |
((coding)->dst_multibyte \ |
((coding)->dst_multibyte \ |
422 |
|| (coding)->common_flags & CODING_REQUIRE_DECODING_MASK) |
|| (coding)->common_flags & CODING_REQUIRE_DECODING_MASK) |
423 |
|
|
424 |
/* Return 1 if the coding system CODING requires code conversion on |
|
425 |
|
/* Return 1 if the coding context CODING requires code conversion on |
426 |
encoding. */ |
encoding. */ |
427 |
#define CODING_REQUIRE_ENCODING(coding) \ |
#define CODING_REQUIRE_ENCODING(coding) \ |
428 |
((coding)->src_multibyte \ |
((coding)->src_multibyte \ |
429 |
|| (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK) |
|| (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK \ |
430 |
|
|| (coding)->mode & CODING_MODE_SELECTIVE_DISPLAY) |
431 |
|
|
432 |
/* Return 1 if the coding system CODING requires some kind of code |
|
433 |
|
/* Return 1 if the coding context CODING requires some kind of code |
434 |
detection. */ |
detection. */ |
435 |
#define CODING_REQUIRE_DETECTION(coding) \ |
#define CODING_REQUIRE_DETECTION(coding) \ |
436 |
((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK) |
((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK) |
437 |
|
|
438 |
/* Return 1 if the coding system CODING requires code conversion on |
/* Return 1 if the coding context CODING requires code conversion on |
439 |
decoding or some kind of code detection. */ |
decoding or some kind of code detection. */ |
440 |
#define CODING_MAY_REQUIRE_DECODING(coding) \ |
#define CODING_MAY_REQUIRE_DECODING(coding) \ |
441 |
(CODING_REQUIRE_DECODING (coding) \ |
(CODING_REQUIRE_DECODING (coding) \ |
442 |
|| CODING_REQUIRE_DETECTION (coding)) |
|| CODING_REQUIRE_DETECTION (coding)) |
443 |
|
|
|
/* 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) |
|
|
|
|
444 |
/* 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 |
445 |
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 |
446 |
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' |
447 |
internal format. */ |
internal format. */ |
448 |
|
|
449 |
#define DECODE_SJIS(s1, s2, c1, c2) \ |
#define SJIS_TO_JIS(code) \ |
450 |
do { \ |
do { \ |
451 |
if (s2 >= 0x9F) \ |
int s1, s2, j1, j2; \ |
452 |
c1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0), \ |
\ |
453 |
c2 = s2 - 0x7E; \ |
s1 = (code) >> 8, s2 = (code) & 0xFF; \ |
454 |
else \ |
\ |
455 |
c1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1), \ |
if (s2 >= 0x9F) \ |
456 |
c2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F); \ |
(j1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0), \ |
457 |
|
j2 = s2 - 0x7E); \ |
458 |
|
else \ |
459 |
|
(j1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1), \ |
460 |
|
j2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F)); \ |
461 |
|
(code) = (j1 << 8) | j2; \ |
462 |
} while (0) |
} while (0) |
463 |
|
|
464 |
#define ENCODE_SJIS(c1, c2, s1, s2) \ |
|
465 |
|
#define JIS_TO_SJIS(code) \ |
466 |
do { \ |
do { \ |
467 |
if (c1 & 1) \ |
int s1, s2, j1, j2; \ |
468 |
s1 = c1 / 2 + ((c1 < 0x5F) ? 0x71 : 0xB1), \ |
\ |
469 |
s2 = c2 + ((c2 >= 0x60) ? 0x20 : 0x1F); \ |
j1 = (code) >> 8, j2 = (code) & 0xFF; \ |
470 |
|
if (j1 & 1) \ |
471 |
|
(s1 = j1 / 2 + ((j1 < 0x5F) ? 0x71 : 0xB1), \ |
472 |
|
s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F)); \ |
473 |
else \ |
else \ |
474 |
s1 = c1 / 2 + ((c1 < 0x5F) ? 0x70 : 0xB0), \ |
(s1 = j1 / 2 + ((j1 < 0x5F) ? 0x70 : 0xB0), \ |
475 |
s2 = c2 + 0x7E; \ |
s2 = j2 + 0x7E); \ |
476 |
|
(code) = (j1 << 8) | j2; \ |
477 |
} while (0) |
} while (0) |
478 |
|
|
479 |
|
|
480 |
/* Encode the file name NAME using the specified coding system |
/* Encode the file name NAME using the specified coding system |
481 |
for file names, if any. */ |
for file names, if any. */ |
482 |
#define ENCODE_FILE(name) \ |
#define ENCODE_FILE(name) \ |
488 |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \ |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \ |
489 |
: name)) |
: name)) |
490 |
|
|
491 |
|
|
492 |
/* Decode the file name NAME using the specified coding system |
/* Decode the file name NAME using the specified coding system |
493 |
for file names, if any. */ |
for file names, if any. */ |
494 |
#define DECODE_FILE(name) \ |
#define DECODE_FILE(name) \ |
500 |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \ |
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \ |
501 |
: name)) |
: name)) |
502 |
|
|
503 |
|
|
504 |
#ifdef WINDOWSNT |
#ifdef WINDOWSNT |
505 |
/* Encode the string STR using the specified coding system |
/* Encode the string STR using the specified coding system |
506 |
for w32 system functions, if any. */ |
for w32 system functions, if any. */ |
507 |
#define ENCODE_SYSTEM(str) \ |
#define ENCODE_SYSTEM(str) \ |
508 |
(! NILP (Vlocale_coding_system) \ |
(! NILP (Vlocale_coding_system) \ |
509 |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
510 |
? code_convert_string_norecord (str, Vlocale_coding_system, 1) \ |
? code_convert_string_norecord (str, Vlocale_coding_system, 1) \ |
511 |
: str) |
: str) |
512 |
|
|
513 |
/* Decode the string STR using the specified coding system |
/* Decode the string STR using the specified coding system |
514 |
for w32 system functions, if any. */ |
for w32 system functions, if any. */ |
515 |
#define DECODE_SYSTEM(name) \ |
#define DECODE_SYSTEM(name) \ |
516 |
(! NILP (Vlocale_coding_system) \ |
(! NILP (Vlocale_coding_system) \ |
517 |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
&& XFASTINT (Vlocale_coding_system) != 0 \ |
518 |
? code_convert_string_norecord (str, Vlocale_coding_system, 0) \ |
? code_convert_string_norecord (str, Vlocale_coding_system, 0) \ |
519 |
: str) |
: str) |
520 |
|
|
521 |
#else /* WINDOWSNT */ |
#else /* WINDOWSNT */ |
526 |
#endif /* !WINDOWSNT */ |
#endif /* !WINDOWSNT */ |
527 |
|
|
528 |
/* Extern declarations. */ |
/* Extern declarations. */ |
529 |
extern int decode_coding P_ ((struct coding_system *, unsigned char *, |
extern Lisp_Object make_conversion_work_buffer P_ ((int)); |
530 |
unsigned char *, int, int)); |
extern Lisp_Object code_conversion_restore P_ ((Lisp_Object)); |
|
extern int encode_coding P_ ((struct coding_system *, 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)); |
|
531 |
extern int decoding_buffer_size P_ ((struct coding_system *, int)); |
extern int decoding_buffer_size P_ ((struct coding_system *, int)); |
532 |
extern int encoding_buffer_size P_ ((struct coding_system *, int)); |
extern int encoding_buffer_size P_ ((struct coding_system *, int)); |
533 |
extern void detect_coding P_ ((struct coding_system *, unsigned char *, int)); |
extern void setup_coding_system P_ ((Lisp_Object, struct coding_system *)); |
534 |
extern void detect_eol P_ ((struct coding_system *, unsigned char *, int)); |
extern void detect_coding P_ ((struct coding_system *)); |
535 |
extern int setup_coding_system P_ ((Lisp_Object, struct coding_system *)); |
extern Lisp_Object code_convert_region P_ ((EMACS_INT, EMACS_INT, |
536 |
extern Lisp_Object code_convert_string P_ ((Lisp_Object, |
Lisp_Object, Lisp_Object, |
537 |
struct coding_system *, int, int)); |
int, int)); |
538 |
extern Lisp_Object code_convert_string1 P_ ((Lisp_Object, Lisp_Object, |
extern Lisp_Object code_convert_string P_ ((Lisp_Object, Lisp_Object, |
539 |
Lisp_Object, int)); |
Lisp_Object, int, int, int)); |
540 |
extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, |
extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, |
541 |
int)); |
int)); |
542 |
extern void setup_raw_text_coding_system P_ ((struct coding_system *)); |
extern Lisp_Object raw_text_coding_system P_ ((Lisp_Object)); |
543 |
extern Lisp_Object encode_coding_string P_ ((Lisp_Object, |
extern Lisp_Object coding_inherit_eol_type P_ ((Lisp_Object, Lisp_Object)); |
544 |
struct coding_system *, int)); |
|
545 |
extern Lisp_Object decode_coding_string P_ ((Lisp_Object, |
extern int decode_coding_gap P_ ((struct coding_system *, |
546 |
struct coding_system *, int)); |
EMACS_INT, EMACS_INT)); |
547 |
|
extern int encode_coding_gap P_ ((struct coding_system *, |
548 |
|
EMACS_INT, EMACS_INT)); |
549 |
|
extern void decode_coding_object P_ ((struct coding_system *, |
550 |
|
Lisp_Object, EMACS_INT, EMACS_INT, |
551 |
|
EMACS_INT, EMACS_INT, Lisp_Object)); |
552 |
|
extern void encode_coding_object P_ ((struct coding_system *, |
553 |
|
Lisp_Object, EMACS_INT, EMACS_INT, |
554 |
|
EMACS_INT, EMACS_INT, Lisp_Object)); |
555 |
|
|
556 |
|
#define decode_coding_region(coding, from, to) \ |
557 |
|
decode_coding_object (coding, Fcurrent_buffer (), \ |
558 |
|
from, CHAR_TO_BYTE (from), \ |
559 |
|
to, CHAR_TO_BYTE (to), Fcurrent_buffer ()) |
560 |
|
|
561 |
|
|
562 |
|
#define encode_coding_region(coding, from, to) \ |
563 |
|
encode_coding_object (coding, Fcurrent_buffer (), \ |
564 |
|
from, CHAR_TO_BYTE (from), \ |
565 |
|
to, CHAR_TO_BYTE (to), Fcurrent_buffer ()) |
566 |
|
|
567 |
|
|
568 |
|
#define decode_coding_string(coding, string, nocopy) \ |
569 |
|
decode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \ |
570 |
|
STRING_BYTES (XSTRING (string)), Qt) |
571 |
|
|
572 |
|
#define encode_coding_string(coding, string, nocopy) \ |
573 |
|
(encode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \ |
574 |
|
STRING_BYTES (XSTRING (string)), Qt), \ |
575 |
|
(coding)->dst_object) |
576 |
|
|
577 |
|
|
578 |
|
#define decode_coding_c_string(coding, src, bytes, dst_object) \ |
579 |
|
do { \ |
580 |
|
(coding)->source = (src); \ |
581 |
|
(coding)->src_chars = (coding)->src_bytes = (bytes); \ |
582 |
|
decode_coding_object ((coding), Qnil, 0, 0, (bytes), (bytes), \ |
583 |
|
(dst_object)); \ |
584 |
|
} while (0) |
585 |
|
|
586 |
|
|
587 |
|
extern Lisp_Object preferred_coding_system P_ (()); |
588 |
|
|
589 |
|
|
590 |
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index; |
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index; |
591 |
extern Lisp_Object Qraw_text, Qemacs_mule; |
extern Lisp_Object Qcoding_system_p; |
592 |
|
extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided; |
593 |
|
extern Lisp_Object Qiso_2022; |
594 |
extern Lisp_Object Qbuffer_file_coding_system; |
extern Lisp_Object Qbuffer_file_coding_system; |
595 |
extern Lisp_Object Vcoding_category_list; |
|
596 |
|
extern Lisp_Object Qunix, Qdos, Qmac; |
597 |
|
|
598 |
extern Lisp_Object Qtranslation_table; |
extern Lisp_Object Qtranslation_table; |
599 |
extern Lisp_Object Qtranslation_table_id; |
extern Lisp_Object Qtranslation_table_id; |
638 |
function `set-keyboard-coding-system'. */ |
function `set-keyboard-coding-system'. */ |
639 |
extern struct coding_system keyboard_coding; |
extern struct coding_system keyboard_coding; |
640 |
|
|
|
/* Default coding system to be used to write a file. */ |
|
|
extern struct coding_system default_buffer_file_coding; |
|
|
|
|
641 |
/* Default coding systems used for process I/O. */ |
/* Default coding systems used for process I/O. */ |
642 |
extern Lisp_Object Vdefault_process_coding_system; |
extern Lisp_Object Vdefault_process_coding_system; |
643 |
|
|
644 |
/* 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 |
645 |
system. */ |
system. */ |
646 |
extern Lisp_Object Vselect_safe_coding_system_function; |
extern Lisp_Object Vselect_safe_coding_system_function; |
647 |
|
|
657 |
/* Error signaled when there's a problem with detecting coding system */ |
/* Error signaled when there's a problem with detecting coding system */ |
658 |
extern Lisp_Object Qcoding_system_error; |
extern Lisp_Object Qcoding_system_error; |
659 |
|
|
660 |
|
extern char emacs_mule_bytes[256]; |
661 |
|
extern int emacs_mule_string_char P_ ((unsigned char *)); |
662 |
|
|
663 |
#endif /* EMACS_CODING_H */ |
#endif /* EMACS_CODING_H */ |