Mercurial > emacs
annotate src/ccl.c @ 26059:2a7f35e0072b
(Fminibuffer_complete_and_exit): Supply value for new
ESCAPE_FROM_EDGE parameter to Ffield_beginning.
(Fminibuffer_complete_word): Use
Ffield_beginning to find the prompt end.
(Fminibuffer_complete_and_exit): Test for an empty
input string by seeing where the field begins, instead of
looking at text-properties.
(read_minibuf): Don't save minibuffer prompt length on
minibuf_save_list.
Don't initialize minibuffer prompt length.
Wrap prompt text-properties around the entire prompt.
Add 'prompt text-property to prompt.
Get final value with Ffield_string instead of make_buffer_string.
(read_minibuf_unwind): Don't restore minibuffer prompt length from
minibuf_save_list.
(do_completion): Get minibuffer input with Ffield_string
instead of Fbuffer_string.
Erase minibuffer input with Ferase_field instead of erase_buffer.
(Fminibuffer_complete_and_exit): Likewise.
Test whether buffer is empty by looking for the 'prompt text
property at the end.
Set prompt length by looking for the end of the prompt text property,
and save prompt length for later use (since there is no longer a
buffer variable to get it from).
(Fminibuffer_prompt_width, Fminibuffer_prompt_end): Functions removed.
(syms_of_minibuf): Remove initializations of
Sminibuffer_prompt_width and Sminibuffer_prompt_end.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Sun, 17 Oct 1999 12:55:49 +0000 |
parents | 0a7261c1d487 |
children | b7aa6ac26872 |
rev | line source |
---|---|
17052 | 1 /* CCL (Code Conversion Language) interpreter. |
18341
33e78cc7f058
Change copyright notices.
Richard M. Stallman <rms@gnu.org>
parents:
17828
diff
changeset
|
2 Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN. |
33e78cc7f058
Change copyright notices.
Richard M. Stallman <rms@gnu.org>
parents:
17828
diff
changeset
|
3 Licensed to the Free Software Foundation. |
17052 | 4 |
17071 | 5 This file is part of GNU Emacs. |
6 | |
7 GNU Emacs is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
9 the Free Software Foundation; either version 2, or (at your option) | |
10 any later version. | |
17052 | 11 |
17071 | 12 GNU Emacs is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
17052 | 16 |
17071 | 17 You should have received a copy of the GNU General Public License |
18 along with GNU Emacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
17052 | 21 |
22 #include <stdio.h> | |
23 | |
24 #ifdef emacs | |
25 | |
26 #include <config.h> | |
21514 | 27 |
28 #ifdef STDC_HEADERS | |
29 #include <stdlib.h> | |
30 #endif | |
31 | |
17052 | 32 #include "lisp.h" |
33 #include "charset.h" | |
34 #include "ccl.h" | |
35 #include "coding.h" | |
36 | |
37 #else /* not emacs */ | |
38 | |
39 #include "mulelib.h" | |
40 | |
41 #endif /* not emacs */ | |
42 | |
22718 | 43 /* This contains all code conversion map available to CCL. */ |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
44 Lisp_Object Vcode_conversion_map_vector; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
45 |
17052 | 46 /* Alist of fontname patterns vs corresponding CCL program. */ |
47 Lisp_Object Vfont_ccl_encoder_alist; | |
48 | |
21551 | 49 /* This symbol is a property which assocates with ccl program vector. |
50 Ex: (get 'ccl-big5-encoder 'ccl-program) returns ccl program vector. */ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
51 Lisp_Object Qccl_program; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
52 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
53 /* These symbols are properties which associate with code conversion |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
54 map and their ID respectively. */ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
55 Lisp_Object Qcode_conversion_map; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
56 Lisp_Object Qcode_conversion_map_id; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
57 |
21551 | 58 /* Symbols of ccl program have this property, a value of the property |
59 is an index for Vccl_protram_table. */ | |
60 Lisp_Object Qccl_program_idx; | |
61 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
62 /* Table of registered CCL programs. Each element is a vector of |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
63 NAME, CCL_PROG, and RESOLVEDP where NAME (symbol) is the name of |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
64 the program, CCL_PROG (vector) is the compiled code of the program, |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
65 RESOLVEDP (t or nil) is the flag to tell if symbols in CCL_PROG is |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
66 already resolved to index numbers or not. */ |
17052 | 67 Lisp_Object Vccl_program_table; |
68 | |
69 /* CCL (Code Conversion Language) is a simple language which has | |
70 operations on one input buffer, one output buffer, and 7 registers. | |
71 The syntax of CCL is described in `ccl.el'. Emacs Lisp function | |
72 `ccl-compile' compiles a CCL program and produces a CCL code which | |
73 is a vector of integers. The structure of this vector is as | |
74 follows: The 1st element: buffer-magnification, a factor for the | |
75 size of output buffer compared with the size of input buffer. The | |
76 2nd element: address of CCL code to be executed when encountered | |
77 with end of input stream. The 3rd and the remaining elements: CCL | |
78 codes. */ | |
79 | |
80 /* Header of CCL compiled code */ | |
81 #define CCL_HEADER_BUF_MAG 0 | |
82 #define CCL_HEADER_EOF 1 | |
83 #define CCL_HEADER_MAIN 2 | |
84 | |
85 /* CCL code is a sequence of 28-bit non-negative integers (i.e. the | |
86 MSB is always 0), each contains CCL command and/or arguments in the | |
87 following format: | |
88 | |
89 |----------------- integer (28-bit) ------------------| | |
90 |------- 17-bit ------|- 3-bit --|- 3-bit --|- 5-bit -| | |
91 |--constant argument--|-register-|-register-|-command-| | |
92 ccccccccccccccccc RRR rrr XXXXX | |
93 or | |
94 |------- relative address -------|-register-|-command-| | |
95 cccccccccccccccccccc rrr XXXXX | |
96 or | |
97 |------------- constant or other args ----------------| | |
98 cccccccccccccccccccccccccccc | |
99 | |
100 where, `cc...c' is a non-negative integer indicating constant value | |
101 (the left most `c' is always 0) or an absolute jump address, `RRR' | |
102 and `rrr' are CCL register number, `XXXXX' is one of the following | |
103 CCL commands. */ | |
104 | |
105 /* CCL commands | |
106 | |
107 Each comment fields shows one or more lines for command syntax and | |
108 the following lines for semantics of the command. In semantics, IC | |
109 stands for Instruction Counter. */ | |
110 | |
111 #define CCL_SetRegister 0x00 /* Set register a register value: | |
112 1:00000000000000000RRRrrrXXXXX | |
113 ------------------------------ | |
114 reg[rrr] = reg[RRR]; | |
115 */ | |
116 | |
117 #define CCL_SetShortConst 0x01 /* Set register a short constant value: | |
118 1:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
119 ------------------------------ | |
120 reg[rrr] = CCCCCCCCCCCCCCCCCCC; | |
121 */ | |
122 | |
123 #define CCL_SetConst 0x02 /* Set register a constant value: | |
124 1:00000000000000000000rrrXXXXX | |
125 2:CONSTANT | |
126 ------------------------------ | |
127 reg[rrr] = CONSTANT; | |
128 IC++; | |
129 */ | |
130 | |
131 #define CCL_SetArray 0x03 /* Set register an element of array: | |
132 1:CCCCCCCCCCCCCCCCCRRRrrrXXXXX | |
133 2:ELEMENT[0] | |
134 3:ELEMENT[1] | |
135 ... | |
136 ------------------------------ | |
137 if (0 <= reg[RRR] < CC..C) | |
138 reg[rrr] = ELEMENT[reg[RRR]]; | |
139 IC += CC..C; | |
140 */ | |
141 | |
142 #define CCL_Jump 0x04 /* Jump: | |
143 1:A--D--D--R--E--S--S-000XXXXX | |
144 ------------------------------ | |
145 IC += ADDRESS; | |
146 */ | |
147 | |
148 /* Note: If CC..C is greater than 0, the second code is omitted. */ | |
149 | |
150 #define CCL_JumpCond 0x05 /* Jump conditional: | |
151 1:A--D--D--R--E--S--S-rrrXXXXX | |
152 ------------------------------ | |
153 if (!reg[rrr]) | |
154 IC += ADDRESS; | |
155 */ | |
156 | |
157 | |
158 #define CCL_WriteRegisterJump 0x06 /* Write register and jump: | |
159 1:A--D--D--R--E--S--S-rrrXXXXX | |
160 ------------------------------ | |
161 write (reg[rrr]); | |
162 IC += ADDRESS; | |
163 */ | |
164 | |
165 #define CCL_WriteRegisterReadJump 0x07 /* Write register, read, and jump: | |
166 1:A--D--D--R--E--S--S-rrrXXXXX | |
167 2:A--D--D--R--E--S--S-rrrYYYYY | |
168 ----------------------------- | |
169 write (reg[rrr]); | |
170 IC++; | |
171 read (reg[rrr]); | |
172 IC += ADDRESS; | |
173 */ | |
174 /* Note: If read is suspended, the resumed execution starts from the | |
175 second code (YYYYY == CCL_ReadJump). */ | |
176 | |
177 #define CCL_WriteConstJump 0x08 /* Write constant and jump: | |
178 1:A--D--D--R--E--S--S-000XXXXX | |
179 2:CONST | |
180 ------------------------------ | |
181 write (CONST); | |
182 IC += ADDRESS; | |
183 */ | |
184 | |
185 #define CCL_WriteConstReadJump 0x09 /* Write constant, read, and jump: | |
186 1:A--D--D--R--E--S--S-rrrXXXXX | |
187 2:CONST | |
188 3:A--D--D--R--E--S--S-rrrYYYYY | |
189 ----------------------------- | |
190 write (CONST); | |
191 IC += 2; | |
192 read (reg[rrr]); | |
193 IC += ADDRESS; | |
194 */ | |
195 /* Note: If read is suspended, the resumed execution starts from the | |
196 second code (YYYYY == CCL_ReadJump). */ | |
197 | |
198 #define CCL_WriteStringJump 0x0A /* Write string and jump: | |
199 1:A--D--D--R--E--S--S-000XXXXX | |
200 2:LENGTH | |
201 3:0000STRIN[0]STRIN[1]STRIN[2] | |
202 ... | |
203 ------------------------------ | |
204 write_string (STRING, LENGTH); | |
205 IC += ADDRESS; | |
206 */ | |
207 | |
208 #define CCL_WriteArrayReadJump 0x0B /* Write an array element, read, and jump: | |
209 1:A--D--D--R--E--S--S-rrrXXXXX | |
210 2:LENGTH | |
211 3:ELEMENET[0] | |
212 4:ELEMENET[1] | |
213 ... | |
214 N:A--D--D--R--E--S--S-rrrYYYYY | |
215 ------------------------------ | |
216 if (0 <= reg[rrr] < LENGTH) | |
217 write (ELEMENT[reg[rrr]]); | |
218 IC += LENGTH + 2; (... pointing at N+1) | |
219 read (reg[rrr]); | |
220 IC += ADDRESS; | |
221 */ | |
222 /* Note: If read is suspended, the resumed execution starts from the | |
17323
15fa68d983e7
(ccl_driver): Fix bug of the case CCL_WriteArrayReadJump.
Kenichi Handa <handa@m17n.org>
parents:
17122
diff
changeset
|
223 Nth code (YYYYY == CCL_ReadJump). */ |
17052 | 224 |
225 #define CCL_ReadJump 0x0C /* Read and jump: | |
226 1:A--D--D--R--E--S--S-rrrYYYYY | |
227 ----------------------------- | |
228 read (reg[rrr]); | |
229 IC += ADDRESS; | |
230 */ | |
231 | |
232 #define CCL_Branch 0x0D /* Jump by branch table: | |
233 1:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
234 2:A--D--D--R--E-S-S[0]000XXXXX | |
235 3:A--D--D--R--E-S-S[1]000XXXXX | |
236 ... | |
237 ------------------------------ | |
238 if (0 <= reg[rrr] < CC..C) | |
239 IC += ADDRESS[reg[rrr]]; | |
240 else | |
241 IC += ADDRESS[CC..C]; | |
242 */ | |
243 | |
244 #define CCL_ReadRegister 0x0E /* Read bytes into registers: | |
245 1:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
246 2:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
247 ... | |
248 ------------------------------ | |
249 while (CCC--) | |
250 read (reg[rrr]); | |
251 */ | |
252 | |
253 #define CCL_WriteExprConst 0x0F /* write result of expression: | |
254 1:00000OPERATION000RRR000XXXXX | |
255 2:CONSTANT | |
256 ------------------------------ | |
257 write (reg[RRR] OPERATION CONSTANT); | |
258 IC++; | |
259 */ | |
260 | |
261 /* Note: If the Nth read is suspended, the resumed execution starts | |
262 from the Nth code. */ | |
263 | |
264 #define CCL_ReadBranch 0x10 /* Read one byte into a register, | |
265 and jump by branch table: | |
266 1:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
267 2:A--D--D--R--E-S-S[0]000XXXXX | |
268 3:A--D--D--R--E-S-S[1]000XXXXX | |
269 ... | |
270 ------------------------------ | |
271 read (read[rrr]); | |
272 if (0 <= reg[rrr] < CC..C) | |
273 IC += ADDRESS[reg[rrr]]; | |
274 else | |
275 IC += ADDRESS[CC..C]; | |
276 */ | |
277 | |
278 #define CCL_WriteRegister 0x11 /* Write registers: | |
279 1:CCCCCCCCCCCCCCCCCCCrrrXXXXX | |
280 2:CCCCCCCCCCCCCCCCCCCrrrXXXXX | |
281 ... | |
282 ------------------------------ | |
283 while (CCC--) | |
284 write (reg[rrr]); | |
285 ... | |
286 */ | |
287 | |
288 /* Note: If the Nth write is suspended, the resumed execution | |
289 starts from the Nth code. */ | |
290 | |
291 #define CCL_WriteExprRegister 0x12 /* Write result of expression | |
292 1:00000OPERATIONRrrRRR000XXXXX | |
293 ------------------------------ | |
294 write (reg[RRR] OPERATION reg[Rrr]); | |
295 */ | |
296 | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
297 #define CCL_Call 0x13 /* Call the CCL program whose ID is |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
298 CC..C or cc..c. |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
299 1:CCCCCCCCCCCCCCCCCCCCFFFXXXXX |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
300 [2:00000000cccccccccccccccccccc] |
17052 | 301 ------------------------------ |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
302 if (FFF) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
303 call (cc..c) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
304 IC++; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
305 else |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
306 call (CC..C) |
17052 | 307 */ |
308 | |
309 #define CCL_WriteConstString 0x14 /* Write a constant or a string: | |
310 1:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
311 [2:0000STRIN[0]STRIN[1]STRIN[2]] | |
312 [...] | |
313 ----------------------------- | |
314 if (!rrr) | |
315 write (CC..C) | |
316 else | |
317 write_string (STRING, CC..C); | |
318 IC += (CC..C + 2) / 3; | |
319 */ | |
320 | |
321 #define CCL_WriteArray 0x15 /* Write an element of array: | |
322 1:CCCCCCCCCCCCCCCCCCCCrrrXXXXX | |
323 2:ELEMENT[0] | |
324 3:ELEMENT[1] | |
325 ... | |
326 ------------------------------ | |
327 if (0 <= reg[rrr] < CC..C) | |
328 write (ELEMENT[reg[rrr]]); | |
329 IC += CC..C; | |
330 */ | |
331 | |
332 #define CCL_End 0x16 /* Terminate: | |
333 1:00000000000000000000000XXXXX | |
334 ------------------------------ | |
335 terminate (); | |
336 */ | |
337 | |
338 /* The following two codes execute an assignment arithmetic/logical | |
339 operation. The form of the operation is like REG OP= OPERAND. */ | |
340 | |
341 #define CCL_ExprSelfConst 0x17 /* REG OP= constant: | |
342 1:00000OPERATION000000rrrXXXXX | |
343 2:CONSTANT | |
344 ------------------------------ | |
345 reg[rrr] OPERATION= CONSTANT; | |
346 */ | |
347 | |
348 #define CCL_ExprSelfReg 0x18 /* REG1 OP= REG2: | |
349 1:00000OPERATION000RRRrrrXXXXX | |
350 ------------------------------ | |
351 reg[rrr] OPERATION= reg[RRR]; | |
352 */ | |
353 | |
354 /* The following codes execute an arithmetic/logical operation. The | |
355 form of the operation is like REG_X = REG_Y OP OPERAND2. */ | |
356 | |
357 #define CCL_SetExprConst 0x19 /* REG_X = REG_Y OP constant: | |
358 1:00000OPERATION000RRRrrrXXXXX | |
359 2:CONSTANT | |
360 ------------------------------ | |
361 reg[rrr] = reg[RRR] OPERATION CONSTANT; | |
362 IC++; | |
363 */ | |
364 | |
365 #define CCL_SetExprReg 0x1A /* REG1 = REG2 OP REG3: | |
366 1:00000OPERATIONRrrRRRrrrXXXXX | |
367 ------------------------------ | |
368 reg[rrr] = reg[RRR] OPERATION reg[Rrr]; | |
369 */ | |
370 | |
371 #define CCL_JumpCondExprConst 0x1B /* Jump conditional according to | |
372 an operation on constant: | |
373 1:A--D--D--R--E--S--S-rrrXXXXX | |
374 2:OPERATION | |
375 3:CONSTANT | |
376 ----------------------------- | |
377 reg[7] = reg[rrr] OPERATION CONSTANT; | |
378 if (!(reg[7])) | |
379 IC += ADDRESS; | |
380 else | |
381 IC += 2 | |
382 */ | |
383 | |
384 #define CCL_JumpCondExprReg 0x1C /* Jump conditional according to | |
385 an operation on register: | |
386 1:A--D--D--R--E--S--S-rrrXXXXX | |
387 2:OPERATION | |
388 3:RRR | |
389 ----------------------------- | |
390 reg[7] = reg[rrr] OPERATION reg[RRR]; | |
391 if (!reg[7]) | |
392 IC += ADDRESS; | |
393 else | |
394 IC += 2; | |
395 */ | |
396 | |
397 #define CCL_ReadJumpCondExprConst 0x1D /* Read and jump conditional according | |
398 to an operation on constant: | |
399 1:A--D--D--R--E--S--S-rrrXXXXX | |
400 2:OPERATION | |
401 3:CONSTANT | |
402 ----------------------------- | |
403 read (reg[rrr]); | |
404 reg[7] = reg[rrr] OPERATION CONSTANT; | |
405 if (!reg[7]) | |
406 IC += ADDRESS; | |
407 else | |
408 IC += 2; | |
409 */ | |
410 | |
411 #define CCL_ReadJumpCondExprReg 0x1E /* Read and jump conditional according | |
412 to an operation on register: | |
413 1:A--D--D--R--E--S--S-rrrXXXXX | |
414 2:OPERATION | |
415 3:RRR | |
416 ----------------------------- | |
417 read (reg[rrr]); | |
418 reg[7] = reg[rrr] OPERATION reg[RRR]; | |
419 if (!reg[7]) | |
420 IC += ADDRESS; | |
421 else | |
422 IC += 2; | |
423 */ | |
424 | |
425 #define CCL_Extention 0x1F /* Extended CCL code | |
426 1:ExtendedCOMMNDRrrRRRrrrXXXXX | |
427 2:ARGUEMENT | |
428 3:... | |
429 ------------------------------ | |
430 extended_command (rrr,RRR,Rrr,ARGS) | |
431 */ | |
432 | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
433 /* |
21551 | 434 Here after, Extended CCL Instructions. |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
435 Bit length of extended command is 14. |
21551 | 436 Therefore, the instruction code range is 0..16384(0x3fff). |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
437 */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
438 |
21551 | 439 /* Read a multibyte characeter. |
440 A code point is stored into reg[rrr]. A charset ID is stored into | |
441 reg[RRR]. */ | |
442 | |
443 #define CCL_ReadMultibyteChar2 0x00 /* Read Multibyte Character | |
444 1:ExtendedCOMMNDRrrRRRrrrXXXXX */ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
445 |
21551 | 446 /* Write a multibyte character. |
447 Write a character whose code point is reg[rrr] and the charset ID | |
448 is reg[RRR]. */ | |
449 | |
450 #define CCL_WriteMultibyteChar2 0x01 /* Write Multibyte Character | |
451 1:ExtendedCOMMNDRrrRRRrrrXXXXX */ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
452 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
453 /* Translate a character whose code point is reg[rrr] and the charset |
22186
fc4aaf1b1772
Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents:
22122
diff
changeset
|
454 ID is reg[RRR] by a translation table whose ID is reg[Rrr]. |
21551 | 455 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
456 A translated character is set in reg[rrr] (code point) and reg[RRR] |
21551 | 457 (charset ID). */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
458 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
459 #define CCL_TranslateCharacter 0x02 /* Translate a multibyte character |
21551 | 460 1:ExtendedCOMMNDRrrRRRrrrXXXXX */ |
461 | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
462 /* Translate a character whose code point is reg[rrr] and the charset |
22186
fc4aaf1b1772
Change term "character translation table" to "translation table".
Kenichi Handa <handa@m17n.org>
parents:
22122
diff
changeset
|
463 ID is reg[RRR] by a translation table whose ID is ARGUMENT. |
21551 | 464 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
465 A translated character is set in reg[rrr] (code point) and reg[RRR] |
21551 | 466 (charset ID). */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
467 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
468 #define CCL_TranslateCharacterConstTbl 0x03 /* Translate a multibyte character |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
469 1:ExtendedCOMMNDRrrRRRrrrXXXXX |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
470 2:ARGUMENT(Translation Table ID) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
471 */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
472 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
473 /* Iterate looking up MAPs for reg[rrr] starting from the Nth (N = |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
474 reg[RRR]) MAP until some value is found. |
21551 | 475 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
476 Each MAP is a Lisp vector whose element is number, nil, t, or |
21551 | 477 lambda. |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
478 If the element is nil, ignore the map and proceed to the next map. |
21551 | 479 If the element is t or lambda, finish without changing reg[rrr]. |
480 If the element is a number, set reg[rrr] to the number and finish. | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
481 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
482 Detail of the map structure is descibed in the comment for |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
483 CCL_MapMultiple below. */ |
21551 | 484 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
485 #define CCL_IterateMultipleMap 0x10 /* Iterate multiple maps |
21551 | 486 1:ExtendedCOMMNDXXXRRRrrrXXXXX |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
487 2:NUMBER of MAPs |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
488 3:MAP-ID1 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
489 4:MAP-ID2 |
21551 | 490 ... |
491 */ | |
492 | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
493 /* Map the code in reg[rrr] by MAPs starting from the Nth (N = |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
494 reg[RRR]) map. |
21551 | 495 |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
496 MAPs are supplied in the succeeding CCL codes as follows: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
497 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
498 When CCL program gives this nested structure of map to this command: |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
499 ((MAP-ID11 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
500 MAP-ID12 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
501 (MAP-ID121 MAP-ID122 MAP-ID123) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
502 MAP-ID13) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
503 (MAP-ID21 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
504 (MAP-ID211 (MAP-ID2111) MAP-ID212) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
505 MAP-ID22)), |
21551 | 506 the compiled CCL codes has this sequence: |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
507 CCL_MapMultiple (CCL code of this command) |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
508 16 (total number of MAPs and SEPARATORs) |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
509 -7 (1st SEPARATOR) |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
510 MAP-ID11 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
511 MAP-ID12 |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
512 -3 (2nd SEPARATOR) |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
513 MAP-ID121 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
514 MAP-ID122 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
515 MAP-ID123 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
516 MAP-ID13 |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
517 -7 (3rd SEPARATOR) |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
518 MAP-ID21 |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
519 -4 (4th SEPARATOR) |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
520 MAP-ID211 |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
521 -1 (5th SEPARATOR) |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
522 MAP_ID2111 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
523 MAP-ID212 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
524 MAP-ID22 |
21551 | 525 |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
526 A value of each SEPARATOR follows this rule: |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
527 MAP-SET := SEPARATOR [(MAP-ID | MAP-SET)]+ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
528 SEPARATOR := -(number of MAP-IDs and SEPARATORs in the MAP-SET) |
21551 | 529 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
530 (*)....Nest level of MAP-SET must not be over than MAX_MAP_SET_LEVEL. |
21551 | 531 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
532 When some map fails to map (i.e. it doesn't have a value for |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
533 reg[rrr]), the mapping is treated as identity. |
21551 | 534 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
535 The mapping is iterated for all maps in each map set (set of maps |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
536 separated by SEPARATOR) except in the case that lambda is |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
537 encountered. More precisely, the mapping proceeds as below: |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
538 |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
539 At first, VAL0 is set to reg[rrr], and it is translated by the |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
540 first map to VAL1. Then, VAL1 is translated by the next map to |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
541 VAL2. This mapping is iterated until the last map is used. The |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
542 result of the mapping is the last value of VAL?. |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
543 |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
544 But, when VALm is mapped to VALn and VALn is not a number, the |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
545 mapping proceed as below: |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
546 |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
547 If VALn is nil, the lastest map is ignored and the mapping of VALm |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
548 proceed to the next map. |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
549 |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
550 In VALn is t, VALm is reverted to reg[rrr] and the mapping of VALm |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
551 proceed to the next map. |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
552 |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
553 If VALn is lambda, the whole mapping process terminates, and VALm |
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
554 is the result of this mapping. |
21551 | 555 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
556 Each map is a Lisp vector of the following format (a) or (b): |
21551 | 557 (a)......[STARTPOINT VAL1 VAL2 ...] |
558 (b)......[t VAL STARTPOINT ENDPOINT], | |
559 where | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
560 STARTPOINT is an offset to be used for indexing a map, |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
561 ENDPOINT is a maximum index number of a map, |
21551 | 562 VAL and VALn is a number, nil, t, or lambda. |
563 | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
564 Valid index range of a map of type (a) is: |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
565 STARTPOINT <= index < STARTPOINT + map_size - 1 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
566 Valid index range of a map of type (b) is: |
22525
3dade37fd85d
Comment for CCL_MapMultiple modified..
Kenichi Handa <handa@m17n.org>
parents:
22186
diff
changeset
|
567 STARTPOINT <= index < ENDPOINT */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
568 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
569 #define CCL_MapMultiple 0x11 /* Mapping by multiple code conversion maps |
21551 | 570 1:ExtendedCOMMNDXXXRRRrrrXXXXX |
571 2:N-2 | |
572 3:SEPARATOR_1 (< 0) | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
573 4:MAP-ID_1 |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
574 5:MAP-ID_2 |
21551 | 575 ... |
576 M:SEPARATOR_x (< 0) | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
577 M+1:MAP-ID_y |
21551 | 578 ... |
579 N:SEPARATOR_z (< 0) | |
580 */ | |
581 | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
582 #define MAX_MAP_SET_LEVEL 20 |
21551 | 583 |
584 typedef struct | |
585 { | |
586 int rest_length; | |
587 int orig_val; | |
588 } tr_stack; | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
589 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
590 static tr_stack mapping_stack[MAX_MAP_SET_LEVEL]; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
591 static tr_stack *mapping_stack_pointer; |
21551 | 592 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
593 #define PUSH_MAPPING_STACK(restlen, orig) \ |
21551 | 594 { \ |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
595 mapping_stack_pointer->rest_length = (restlen); \ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
596 mapping_stack_pointer->orig_val = (orig); \ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
597 mapping_stack_pointer++; \ |
21551 | 598 } |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
599 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
600 #define POP_MAPPING_STACK(restlen, orig) \ |
21551 | 601 { \ |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
602 mapping_stack_pointer--; \ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
603 (restlen) = mapping_stack_pointer->rest_length; \ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
604 (orig) = mapping_stack_pointer->orig_val; \ |
21551 | 605 } \ |
606 | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
607 #define CCL_MapSingle 0x12 /* Map by single code conversion map |
21551 | 608 1:ExtendedCOMMNDXXXRRRrrrXXXXX |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
609 2:MAP-ID |
21551 | 610 ------------------------------ |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
611 Map reg[rrr] by MAP-ID. |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
612 If some valid mapping is found, |
21551 | 613 set reg[rrr] to the result, |
614 else | |
615 set reg[RRR] to -1. | |
616 */ | |
17052 | 617 |
618 /* CCL arithmetic/logical operators. */ | |
619 #define CCL_PLUS 0x00 /* X = Y + Z */ | |
620 #define CCL_MINUS 0x01 /* X = Y - Z */ | |
621 #define CCL_MUL 0x02 /* X = Y * Z */ | |
622 #define CCL_DIV 0x03 /* X = Y / Z */ | |
623 #define CCL_MOD 0x04 /* X = Y % Z */ | |
624 #define CCL_AND 0x05 /* X = Y & Z */ | |
625 #define CCL_OR 0x06 /* X = Y | Z */ | |
626 #define CCL_XOR 0x07 /* X = Y ^ Z */ | |
627 #define CCL_LSH 0x08 /* X = Y << Z */ | |
628 #define CCL_RSH 0x09 /* X = Y >> Z */ | |
629 #define CCL_LSH8 0x0A /* X = (Y << 8) | Z */ | |
630 #define CCL_RSH8 0x0B /* X = Y >> 8, r[7] = Y & 0xFF */ | |
631 #define CCL_DIVMOD 0x0C /* X = Y / Z, r[7] = Y % Z */ | |
632 #define CCL_LS 0x10 /* X = (X < Y) */ | |
633 #define CCL_GT 0x11 /* X = (X > Y) */ | |
634 #define CCL_EQ 0x12 /* X = (X == Y) */ | |
635 #define CCL_LE 0x13 /* X = (X <= Y) */ | |
636 #define CCL_GE 0x14 /* X = (X >= Y) */ | |
637 #define CCL_NE 0x15 /* X = (X != Y) */ | |
638 | |
23428
49c7e979c16c
(CCL_DECODE_SJIS, CCL_ENCODE_SJIS): Swap the definitions.
Kenichi Handa <handa@m17n.org>
parents:
23303
diff
changeset
|
639 #define CCL_DECODE_SJIS 0x16 /* X = HIGHER_BYTE (DE-SJIS (Y, Z)) |
49c7e979c16c
(CCL_DECODE_SJIS, CCL_ENCODE_SJIS): Swap the definitions.
Kenichi Handa <handa@m17n.org>
parents:
23303
diff
changeset
|
640 r[7] = LOWER_BYTE (DE-SJIS (Y, Z)) */ |
49c7e979c16c
(CCL_DECODE_SJIS, CCL_ENCODE_SJIS): Swap the definitions.
Kenichi Handa <handa@m17n.org>
parents:
23303
diff
changeset
|
641 #define CCL_ENCODE_SJIS 0x17 /* X = HIGHER_BYTE (SJIS (Y, Z)) |
17052 | 642 r[7] = LOWER_BYTE (SJIS (Y, Z) */ |
643 | |
644 /* Terminate CCL program successfully. */ | |
645 #define CCL_SUCCESS \ | |
646 do { \ | |
647 ccl->status = CCL_STAT_SUCCESS; \ | |
648 goto ccl_finish; \ | |
649 } while (0) | |
650 | |
651 /* Suspend CCL program because of reading from empty input buffer or | |
652 writing to full output buffer. When this program is resumed, the | |
653 same I/O command is executed. */ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
654 #define CCL_SUSPEND(stat) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
655 do { \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
656 ic--; \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
657 ccl->status = stat; \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
658 goto ccl_finish; \ |
17052 | 659 } while (0) |
660 | |
661 /* Terminate CCL program because of invalid command. Should not occur | |
662 in the normal case. */ | |
663 #define CCL_INVALID_CMD \ | |
664 do { \ | |
665 ccl->status = CCL_STAT_INVALID_CMD; \ | |
666 goto ccl_error_handler; \ | |
667 } while (0) | |
668 | |
669 /* Encode one character CH to multibyte form and write to the current | |
17323
15fa68d983e7
(ccl_driver): Fix bug of the case CCL_WriteArrayReadJump.
Kenichi Handa <handa@m17n.org>
parents:
17122
diff
changeset
|
670 output buffer. If CH is less than 256, CH is written as is. */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
671 #define CCL_WRITE_CHAR(ch) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
672 do { \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
673 if (!dst) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
674 CCL_INVALID_CMD; \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
675 else \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
676 { \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
677 unsigned char work[4], *str; \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
678 int len = CHAR_STRING (ch, work, str); \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
679 if (dst + len <= (dst_bytes ? dst_end : src)) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
680 { \ |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
681 while (len--) *dst++ = *str++; \ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
682 } \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
683 else \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
684 CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST); \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
685 } \ |
17052 | 686 } while (0) |
687 | |
688 /* Write a string at ccl_prog[IC] of length LEN to the current output | |
689 buffer. */ | |
690 #define CCL_WRITE_STRING(len) \ | |
691 do { \ | |
692 if (!dst) \ | |
693 CCL_INVALID_CMD; \ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
694 else if (dst + len <= (dst_bytes ? dst_end : src)) \ |
17052 | 695 for (i = 0; i < len; i++) \ |
696 *dst++ = ((XFASTINT (ccl_prog[ic + (i / 3)])) \ | |
697 >> ((2 - (i % 3)) * 8)) & 0xFF; \ | |
698 else \ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
699 CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST); \ |
17052 | 700 } while (0) |
701 | |
702 /* Read one byte from the current input buffer into Rth register. */ | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
703 #define CCL_READ_CHAR(r) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
704 do { \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
705 if (!src) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
706 CCL_INVALID_CMD; \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
707 else if (src < src_end) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
708 r = *src++; \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
709 else if (ccl->last_block) \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
710 { \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
711 ic = ccl->eof_ic; \ |
23068
ae33b925b20f
If eof is encounterd while processing the
Kenichi Handa <handa@m17n.org>
parents:
22718
diff
changeset
|
712 goto ccl_repeat; \ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
713 } \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
714 else \ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
715 CCL_SUSPEND (CCL_STAT_SUSPEND_BY_SRC); \ |
17052 | 716 } while (0) |
717 | |
718 | |
719 /* Execute CCL code on SRC_BYTES length text at SOURCE. The resulting | |
720 text goes to a place pointed by DESTINATION, the length of which | |
721 should not exceed DST_BYTES. The bytes actually processed is | |
722 returned as *CONSUMED. The return value is the length of the | |
723 resulting text. As a side effect, the contents of CCL registers | |
724 are updated. If SOURCE or DESTINATION is NULL, only operations on | |
725 registers are permitted. */ | |
726 | |
727 #ifdef CCL_DEBUG | |
728 #define CCL_DEBUG_BACKTRACE_LEN 256 | |
729 int ccl_backtrace_table[CCL_BACKTRACE_TABLE]; | |
730 int ccl_backtrace_idx; | |
731 #endif | |
732 | |
733 struct ccl_prog_stack | |
734 { | |
17828
db443ea8cb36
(struct ccl_prog_stack): Declear the member ccl_prog as
Kenichi Handa <handa@m17n.org>
parents:
17728
diff
changeset
|
735 Lisp_Object *ccl_prog; /* Pointer to an array of CCL code. */ |
17052 | 736 int ic; /* Instruction Counter. */ |
737 }; | |
738 | |
24688
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
739 /* For the moment, we only support depth 256 of stack. */ |
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
740 static struct ccl_prog_stack ccl_prog_stack_struct[256]; |
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
741 |
21514 | 742 int |
17052 | 743 ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed) |
744 struct ccl_program *ccl; | |
745 unsigned char *source, *destination; | |
746 int src_bytes, dst_bytes; | |
747 int *consumed; | |
748 { | |
749 register int *reg = ccl->reg; | |
750 register int ic = ccl->ic; | |
751 register int code, field1, field2; | |
17370
6db43d8c9dfc
(ccl_driver): Fix Lisp_Object/integer confusion.
Karl Heuer <kwzh@gnu.org>
parents:
17323
diff
changeset
|
752 register Lisp_Object *ccl_prog = ccl->prog; |
17052 | 753 unsigned char *src = source, *src_end = src + src_bytes; |
754 unsigned char *dst = destination, *dst_end = dst + dst_bytes; | |
755 int jump_address; | |
756 int i, j, op; | |
24688
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
757 int stack_idx = ccl->stack_idx; |
23303
fb38954a02d3
(ccl_driver): Report correct CCL program counter on error.
Kenichi Handa <handa@m17n.org>
parents:
23280
diff
changeset
|
758 /* Instruction counter of the current CCL code. */ |
fb38954a02d3
(ccl_driver): Report correct CCL program counter on error.
Kenichi Handa <handa@m17n.org>
parents:
23280
diff
changeset
|
759 int this_ic; |
17052 | 760 |
761 if (ic >= ccl->eof_ic) | |
762 ic = CCL_HEADER_MAIN; | |
763 | |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
764 if (ccl->buf_magnification ==0) /* We can't produce any bytes. */ |
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
765 dst = NULL; |
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
766 |
17052 | 767 #ifdef CCL_DEBUG |
768 ccl_backtrace_idx = 0; | |
769 #endif | |
770 | |
771 for (;;) | |
772 { | |
23068
ae33b925b20f
If eof is encounterd while processing the
Kenichi Handa <handa@m17n.org>
parents:
22718
diff
changeset
|
773 ccl_repeat: |
17052 | 774 #ifdef CCL_DEBUG |
775 ccl_backtrace_table[ccl_backtrace_idx++] = ic; | |
776 if (ccl_backtrace_idx >= CCL_DEBUG_BACKTRACE_LEN) | |
777 ccl_backtrace_idx = 0; | |
778 ccl_backtrace_table[ccl_backtrace_idx] = 0; | |
779 #endif | |
780 | |
781 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) | |
782 { | |
783 /* We can't just signal Qquit, instead break the loop as if | |
784 the whole data is processed. Don't reset Vquit_flag, it | |
785 must be handled later at a safer place. */ | |
786 if (consumed) | |
787 src = source + src_bytes; | |
788 ccl->status = CCL_STAT_QUIT; | |
789 break; | |
790 } | |
791 | |
23303
fb38954a02d3
(ccl_driver): Report correct CCL program counter on error.
Kenichi Handa <handa@m17n.org>
parents:
23280
diff
changeset
|
792 this_ic = ic; |
17052 | 793 code = XINT (ccl_prog[ic]); ic++; |
794 field1 = code >> 8; | |
795 field2 = (code & 0xFF) >> 5; | |
796 | |
797 #define rrr field2 | |
798 #define RRR (field1 & 7) | |
799 #define Rrr ((field1 >> 3) & 7) | |
800 #define ADDR field1 | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
801 #define EXCMD (field1 >> 6) |
17052 | 802 |
803 switch (code & 0x1F) | |
804 { | |
805 case CCL_SetRegister: /* 00000000000000000RRRrrrXXXXX */ | |
806 reg[rrr] = reg[RRR]; | |
807 break; | |
808 | |
809 case CCL_SetShortConst: /* CCCCCCCCCCCCCCCCCCCCrrrXXXXX */ | |
810 reg[rrr] = field1; | |
811 break; | |
812 | |
813 case CCL_SetConst: /* 00000000000000000000rrrXXXXX */ | |
814 reg[rrr] = XINT (ccl_prog[ic]); | |
815 ic++; | |
816 break; | |
817 | |
818 case CCL_SetArray: /* CCCCCCCCCCCCCCCCCCCCRRRrrrXXXXX */ | |
819 i = reg[RRR]; | |
820 j = field1 >> 3; | |
821 if ((unsigned int) i < j) | |
822 reg[rrr] = XINT (ccl_prog[ic + i]); | |
823 ic += j; | |
824 break; | |
825 | |
826 case CCL_Jump: /* A--D--D--R--E--S--S-000XXXXX */ | |
827 ic += ADDR; | |
828 break; | |
829 | |
830 case CCL_JumpCond: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
831 if (!reg[rrr]) | |
832 ic += ADDR; | |
833 break; | |
834 | |
835 case CCL_WriteRegisterJump: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
836 i = reg[rrr]; | |
837 CCL_WRITE_CHAR (i); | |
838 ic += ADDR; | |
839 break; | |
840 | |
841 case CCL_WriteRegisterReadJump: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
842 i = reg[rrr]; | |
843 CCL_WRITE_CHAR (i); | |
844 ic++; | |
845 CCL_READ_CHAR (reg[rrr]); | |
846 ic += ADDR - 1; | |
847 break; | |
848 | |
849 case CCL_WriteConstJump: /* A--D--D--R--E--S--S-000XXXXX */ | |
850 i = XINT (ccl_prog[ic]); | |
851 CCL_WRITE_CHAR (i); | |
852 ic += ADDR; | |
853 break; | |
854 | |
855 case CCL_WriteConstReadJump: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
856 i = XINT (ccl_prog[ic]); | |
857 CCL_WRITE_CHAR (i); | |
858 ic++; | |
859 CCL_READ_CHAR (reg[rrr]); | |
860 ic += ADDR - 1; | |
861 break; | |
862 | |
863 case CCL_WriteStringJump: /* A--D--D--R--E--S--S-000XXXXX */ | |
864 j = XINT (ccl_prog[ic]); | |
865 ic++; | |
866 CCL_WRITE_STRING (j); | |
867 ic += ADDR - 1; | |
868 break; | |
869 | |
870 case CCL_WriteArrayReadJump: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
871 i = reg[rrr]; | |
18613
614b916ff5bf
Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents:
18341
diff
changeset
|
872 j = XINT (ccl_prog[ic]); |
17052 | 873 if ((unsigned int) i < j) |
874 { | |
17323
15fa68d983e7
(ccl_driver): Fix bug of the case CCL_WriteArrayReadJump.
Kenichi Handa <handa@m17n.org>
parents:
17122
diff
changeset
|
875 i = XINT (ccl_prog[ic + 1 + i]); |
17052 | 876 CCL_WRITE_CHAR (i); |
877 } | |
17323
15fa68d983e7
(ccl_driver): Fix bug of the case CCL_WriteArrayReadJump.
Kenichi Handa <handa@m17n.org>
parents:
17122
diff
changeset
|
878 ic += j + 2; |
17052 | 879 CCL_READ_CHAR (reg[rrr]); |
880 ic += ADDR - (j + 2); | |
881 break; | |
882 | |
883 case CCL_ReadJump: /* A--D--D--R--E--S--S-rrrYYYYY */ | |
884 CCL_READ_CHAR (reg[rrr]); | |
885 ic += ADDR; | |
886 break; | |
887 | |
888 case CCL_ReadBranch: /* CCCCCCCCCCCCCCCCCCCCrrrXXXXX */ | |
889 CCL_READ_CHAR (reg[rrr]); | |
890 /* fall through ... */ | |
891 case CCL_Branch: /* CCCCCCCCCCCCCCCCCCCCrrrXXXXX */ | |
892 if ((unsigned int) reg[rrr] < field1) | |
893 ic += XINT (ccl_prog[ic + reg[rrr]]); | |
894 else | |
895 ic += XINT (ccl_prog[ic + field1]); | |
896 break; | |
897 | |
898 case CCL_ReadRegister: /* CCCCCCCCCCCCCCCCCCCCrrXXXXX */ | |
899 while (1) | |
900 { | |
901 CCL_READ_CHAR (reg[rrr]); | |
902 if (!field1) break; | |
903 code = XINT (ccl_prog[ic]); ic++; | |
904 field1 = code >> 8; | |
905 field2 = (code & 0xFF) >> 5; | |
906 } | |
907 break; | |
908 | |
909 case CCL_WriteExprConst: /* 1:00000OPERATION000RRR000XXXXX */ | |
910 rrr = 7; | |
911 i = reg[RRR]; | |
912 j = XINT (ccl_prog[ic]); | |
913 op = field1 >> 6; | |
914 ic++; | |
915 goto ccl_set_expr; | |
916 | |
917 case CCL_WriteRegister: /* CCCCCCCCCCCCCCCCCCCrrrXXXXX */ | |
918 while (1) | |
919 { | |
920 i = reg[rrr]; | |
921 CCL_WRITE_CHAR (i); | |
922 if (!field1) break; | |
923 code = XINT (ccl_prog[ic]); ic++; | |
924 field1 = code >> 8; | |
925 field2 = (code & 0xFF) >> 5; | |
926 } | |
927 break; | |
928 | |
929 case CCL_WriteExprRegister: /* 1:00000OPERATIONRrrRRR000XXXXX */ | |
930 rrr = 7; | |
931 i = reg[RRR]; | |
932 j = reg[Rrr]; | |
933 op = field1 >> 6; | |
934 goto ccl_set_expr; | |
935 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
936 case CCL_Call: /* 1:CCCCCCCCCCCCCCCCCCCCFFFXXXXX */ |
17052 | 937 { |
938 Lisp_Object slot; | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
939 int prog_id; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
940 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
941 /* If FFF is nonzero, the CCL program ID is in the |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
942 following code. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
943 if (rrr) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
944 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
945 prog_id = XINT (ccl_prog[ic]); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
946 ic++; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
947 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
948 else |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
949 prog_id = field1; |
17052 | 950 |
951 if (stack_idx >= 256 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
952 || prog_id < 0 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
953 || prog_id >= XVECTOR (Vccl_program_table)->size |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
954 || (slot = XVECTOR (Vccl_program_table)->contents[prog_id], |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
955 !VECTORP (slot)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
956 || !VECTORP (XVECTOR (slot)->contents[1])) |
17052 | 957 { |
958 if (stack_idx > 0) | |
959 { | |
960 ccl_prog = ccl_prog_stack_struct[0].ccl_prog; | |
961 ic = ccl_prog_stack_struct[0].ic; | |
962 } | |
963 CCL_INVALID_CMD; | |
964 } | |
965 | |
966 ccl_prog_stack_struct[stack_idx].ccl_prog = ccl_prog; | |
967 ccl_prog_stack_struct[stack_idx].ic = ic; | |
968 stack_idx++; | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
969 ccl_prog = XVECTOR (XVECTOR (slot)->contents[1])->contents; |
17052 | 970 ic = CCL_HEADER_MAIN; |
971 } | |
972 break; | |
973 | |
974 case CCL_WriteConstString: /* CCCCCCCCCCCCCCCCCCCCrrrXXXXX */ | |
975 if (!rrr) | |
976 CCL_WRITE_CHAR (field1); | |
977 else | |
978 { | |
979 CCL_WRITE_STRING (field1); | |
980 ic += (field1 + 2) / 3; | |
981 } | |
982 break; | |
983 | |
984 case CCL_WriteArray: /* CCCCCCCCCCCCCCCCCCCCrrrXXXXX */ | |
985 i = reg[rrr]; | |
986 if ((unsigned int) i < field1) | |
987 { | |
988 j = XINT (ccl_prog[ic + i]); | |
989 CCL_WRITE_CHAR (j); | |
990 } | |
991 ic += field1; | |
992 break; | |
993 | |
994 case CCL_End: /* 0000000000000000000000XXXXX */ | |
995 if (stack_idx-- > 0) | |
996 { | |
997 ccl_prog = ccl_prog_stack_struct[stack_idx].ccl_prog; | |
998 ic = ccl_prog_stack_struct[stack_idx].ic; | |
999 break; | |
1000 } | |
23884
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1001 if (src) |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1002 src = src_end; |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1003 /* ccl->ic should points to this command code again to |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1004 suppress further processing. */ |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1005 ic--; |
17052 | 1006 CCL_SUCCESS; |
1007 | |
1008 case CCL_ExprSelfConst: /* 00000OPERATION000000rrrXXXXX */ | |
1009 i = XINT (ccl_prog[ic]); | |
1010 ic++; | |
1011 op = field1 >> 6; | |
1012 goto ccl_expr_self; | |
1013 | |
1014 case CCL_ExprSelfReg: /* 00000OPERATION000RRRrrrXXXXX */ | |
1015 i = reg[RRR]; | |
1016 op = field1 >> 6; | |
1017 | |
1018 ccl_expr_self: | |
1019 switch (op) | |
1020 { | |
1021 case CCL_PLUS: reg[rrr] += i; break; | |
1022 case CCL_MINUS: reg[rrr] -= i; break; | |
1023 case CCL_MUL: reg[rrr] *= i; break; | |
1024 case CCL_DIV: reg[rrr] /= i; break; | |
1025 case CCL_MOD: reg[rrr] %= i; break; | |
1026 case CCL_AND: reg[rrr] &= i; break; | |
1027 case CCL_OR: reg[rrr] |= i; break; | |
1028 case CCL_XOR: reg[rrr] ^= i; break; | |
1029 case CCL_LSH: reg[rrr] <<= i; break; | |
1030 case CCL_RSH: reg[rrr] >>= i; break; | |
1031 case CCL_LSH8: reg[rrr] <<= 8; reg[rrr] |= i; break; | |
1032 case CCL_RSH8: reg[7] = reg[rrr] & 0xFF; reg[rrr] >>= 8; break; | |
1033 case CCL_DIVMOD: reg[7] = reg[rrr] % i; reg[rrr] /= i; break; | |
1034 case CCL_LS: reg[rrr] = reg[rrr] < i; break; | |
1035 case CCL_GT: reg[rrr] = reg[rrr] > i; break; | |
1036 case CCL_EQ: reg[rrr] = reg[rrr] == i; break; | |
1037 case CCL_LE: reg[rrr] = reg[rrr] <= i; break; | |
1038 case CCL_GE: reg[rrr] = reg[rrr] >= i; break; | |
1039 case CCL_NE: reg[rrr] = reg[rrr] != i; break; | |
1040 default: CCL_INVALID_CMD; | |
1041 } | |
1042 break; | |
1043 | |
1044 case CCL_SetExprConst: /* 00000OPERATION000RRRrrrXXXXX */ | |
1045 i = reg[RRR]; | |
1046 j = XINT (ccl_prog[ic]); | |
1047 op = field1 >> 6; | |
1048 jump_address = ++ic; | |
1049 goto ccl_set_expr; | |
1050 | |
1051 case CCL_SetExprReg: /* 00000OPERATIONRrrRRRrrrXXXXX */ | |
1052 i = reg[RRR]; | |
1053 j = reg[Rrr]; | |
1054 op = field1 >> 6; | |
1055 jump_address = ic; | |
1056 goto ccl_set_expr; | |
1057 | |
1058 case CCL_ReadJumpCondExprConst: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
1059 CCL_READ_CHAR (reg[rrr]); | |
1060 case CCL_JumpCondExprConst: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
1061 i = reg[rrr]; | |
1062 op = XINT (ccl_prog[ic]); | |
1063 jump_address = ic++ + ADDR; | |
1064 j = XINT (ccl_prog[ic]); | |
1065 ic++; | |
1066 rrr = 7; | |
1067 goto ccl_set_expr; | |
1068 | |
1069 case CCL_ReadJumpCondExprReg: /* A--D--D--R--E--S--S-rrrXXXXX */ | |
1070 CCL_READ_CHAR (reg[rrr]); | |
1071 case CCL_JumpCondExprReg: | |
1072 i = reg[rrr]; | |
1073 op = XINT (ccl_prog[ic]); | |
1074 jump_address = ic++ + ADDR; | |
1075 j = reg[XINT (ccl_prog[ic])]; | |
1076 ic++; | |
1077 rrr = 7; | |
1078 | |
1079 ccl_set_expr: | |
1080 switch (op) | |
1081 { | |
1082 case CCL_PLUS: reg[rrr] = i + j; break; | |
1083 case CCL_MINUS: reg[rrr] = i - j; break; | |
1084 case CCL_MUL: reg[rrr] = i * j; break; | |
1085 case CCL_DIV: reg[rrr] = i / j; break; | |
1086 case CCL_MOD: reg[rrr] = i % j; break; | |
1087 case CCL_AND: reg[rrr] = i & j; break; | |
1088 case CCL_OR: reg[rrr] = i | j; break; | |
1089 case CCL_XOR: reg[rrr] = i ^ j;; break; | |
1090 case CCL_LSH: reg[rrr] = i << j; break; | |
1091 case CCL_RSH: reg[rrr] = i >> j; break; | |
1092 case CCL_LSH8: reg[rrr] = (i << 8) | j; break; | |
1093 case CCL_RSH8: reg[rrr] = i >> 8; reg[7] = i & 0xFF; break; | |
1094 case CCL_DIVMOD: reg[rrr] = i / j; reg[7] = i % j; break; | |
1095 case CCL_LS: reg[rrr] = i < j; break; | |
1096 case CCL_GT: reg[rrr] = i > j; break; | |
1097 case CCL_EQ: reg[rrr] = i == j; break; | |
1098 case CCL_LE: reg[rrr] = i <= j; break; | |
1099 case CCL_GE: reg[rrr] = i >= j; break; | |
1100 case CCL_NE: reg[rrr] = i != j; break; | |
23428
49c7e979c16c
(CCL_DECODE_SJIS, CCL_ENCODE_SJIS): Swap the definitions.
Kenichi Handa <handa@m17n.org>
parents:
23303
diff
changeset
|
1101 case CCL_DECODE_SJIS: DECODE_SJIS (i, j, reg[rrr], reg[7]); break; |
17052 | 1102 case CCL_ENCODE_SJIS: ENCODE_SJIS (i, j, reg[rrr], reg[7]); break; |
1103 default: CCL_INVALID_CMD; | |
1104 } | |
1105 code &= 0x1F; | |
1106 if (code == CCL_WriteExprConst || code == CCL_WriteExprRegister) | |
1107 { | |
1108 i = reg[rrr]; | |
1109 CCL_WRITE_CHAR (i); | |
1110 } | |
1111 else if (!reg[rrr]) | |
1112 ic = jump_address; | |
1113 break; | |
1114 | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1115 case CCL_Extention: |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1116 switch (EXCMD) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1117 { |
21551 | 1118 case CCL_ReadMultibyteChar2: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1119 if (!src) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1120 CCL_INVALID_CMD; |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1121 |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1122 do { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1123 if (src >= src_end) |
21551 | 1124 { |
1125 src++; | |
1126 goto ccl_read_multibyte_character_suspend; | |
1127 } | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1128 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1129 i = *src++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1130 if (i == LEADING_CODE_COMPOSITION) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1131 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1132 if (src >= src_end) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1133 goto ccl_read_multibyte_character_suspend; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1134 if (*src == 0xFF) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1135 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1136 ccl->private_state = COMPOSING_WITH_RULE_HEAD; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1137 src++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1138 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1139 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1140 ccl->private_state = COMPOSING_NO_RULE_HEAD; |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1141 |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1142 continue; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1143 } |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1144 if (ccl->private_state != COMPOSING_NO) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1145 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1146 /* composite character */ |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1147 if (i < 0xA0) |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1148 ccl->private_state = COMPOSING_NO; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1149 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1150 { |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1151 if (COMPOSING_WITH_RULE_RULE == ccl->private_state) |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1152 { |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1153 ccl->private_state = COMPOSING_WITH_RULE_HEAD; |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1154 continue; |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1155 } |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1156 else if (COMPOSING_WITH_RULE_HEAD == ccl->private_state) |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1157 ccl->private_state = COMPOSING_WITH_RULE_RULE; |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1158 |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1159 if (i == 0xA0) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1160 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1161 if (src >= src_end) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1162 goto ccl_read_multibyte_character_suspend; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1163 i = *src++ & 0x7F; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1164 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1165 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1166 i -= 0x20; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1167 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1168 } |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1169 |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1170 if (i < 0x80) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1171 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1172 /* ASCII */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1173 reg[rrr] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1174 reg[RRR] = CHARSET_ASCII; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1175 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1176 else if (i <= MAX_CHARSET_OFFICIAL_DIMENSION1) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1177 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1178 if (src >= src_end) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1179 goto ccl_read_multibyte_character_suspend; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1180 reg[RRR] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1181 reg[rrr] = (*src++ & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1182 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1183 else if (i <= MAX_CHARSET_OFFICIAL_DIMENSION2) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1184 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1185 if ((src + 1) >= src_end) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1186 goto ccl_read_multibyte_character_suspend; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1187 reg[RRR] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1188 i = (*src++ & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1189 reg[rrr] = ((i << 7) | (*src & 0x7F)); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1190 src++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1191 } |
21551 | 1192 else if ((i == LEADING_CODE_PRIVATE_11) |
1193 || (i == LEADING_CODE_PRIVATE_12)) | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1194 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1195 if ((src + 1) >= src_end) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1196 goto ccl_read_multibyte_character_suspend; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1197 reg[RRR] = *src++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1198 reg[rrr] = (*src++ & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1199 } |
21551 | 1200 else if ((i == LEADING_CODE_PRIVATE_21) |
1201 || (i == LEADING_CODE_PRIVATE_22)) | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1202 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1203 if ((src + 2) >= src_end) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1204 goto ccl_read_multibyte_character_suspend; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1205 reg[RRR] = *src++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1206 i = (*src++ & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1207 reg[rrr] = ((i << 7) | (*src & 0x7F)); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1208 src++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1209 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1210 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1211 { |
23884
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1212 /* INVALID CODE. Return a single byte character. */ |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1213 reg[RRR] = CHARSET_ASCII; |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1214 reg[rrr] = i; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1215 } |
24567
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1216 break; |
36e004c54eaf
(ccl_driver) <CCL_ReadMultibyteChar2>: Fix bug of handling
Kenichi Handa <handa@m17n.org>
parents:
23884
diff
changeset
|
1217 } while (1); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1218 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1219 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1220 ccl_read_multibyte_character_suspend: |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1221 src--; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1222 if (ccl->last_block) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1223 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1224 ic = ccl->eof_ic; |
23072 | 1225 goto ccl_repeat; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1226 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1227 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1228 CCL_SUSPEND (CCL_STAT_SUSPEND_BY_SRC); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1229 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1230 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1231 |
21551 | 1232 case CCL_WriteMultibyteChar2: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1233 i = reg[RRR]; /* charset */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1234 if (i == CHARSET_ASCII) |
24688
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
1235 i = reg[rrr] & 0xFF; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1236 else if (i == CHARSET_COMPOSITION) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1237 i = MAKE_COMPOSITE_CHAR (reg[rrr]); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1238 else if (CHARSET_DIMENSION (i) == 1) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1239 i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1240 else if (i < MIN_CHARSET_PRIVATE_DIMENSION2) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1241 i = ((i - 0x8F) << 14) | reg[rrr]; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1242 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1243 i = ((i - 0xE0) << 14) | reg[rrr]; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1244 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1245 CCL_WRITE_CHAR (i); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1246 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1247 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1248 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1249 case CCL_TranslateCharacter: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1250 i = reg[RRR]; /* charset */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1251 if (i == CHARSET_ASCII) |
23768
3d079e8b2edb
(ccl_driver) <CCL_TranslateCharacter>: Don't suppress MSB
Kenichi Handa <handa@m17n.org>
parents:
23428
diff
changeset
|
1252 i = reg[rrr]; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1253 else if (i == CHARSET_COMPOSITION) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1254 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1255 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1256 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1257 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1258 else if (CHARSET_DIMENSION (i) == 1) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1259 i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1260 else if (i < MIN_CHARSET_PRIVATE_DIMENSION2) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1261 i = ((i - 0x8F) << 14) | (reg[rrr] & 0x3FFF); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1262 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1263 i = ((i - 0xE0) << 14) | (reg[rrr] & 0x3FFF); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1264 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1265 op = translate_char (GET_TRANSLATION_TABLE (reg[Rrr]), |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1266 i, -1, 0, 0); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1267 SPLIT_CHAR (op, reg[RRR], i, j); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1268 if (j != -1) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1269 i = (i << 7) | j; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1270 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1271 reg[rrr] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1272 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1273 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1274 case CCL_TranslateCharacterConstTbl: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1275 op = XINT (ccl_prog[ic]); /* table */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1276 ic++; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1277 i = reg[RRR]; /* charset */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1278 if (i == CHARSET_ASCII) |
23768
3d079e8b2edb
(ccl_driver) <CCL_TranslateCharacter>: Don't suppress MSB
Kenichi Handa <handa@m17n.org>
parents:
23428
diff
changeset
|
1279 i = reg[rrr]; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1280 else if (i == CHARSET_COMPOSITION) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1281 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1282 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1283 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1284 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1285 else if (CHARSET_DIMENSION (i) == 1) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1286 i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1287 else if (i < MIN_CHARSET_PRIVATE_DIMENSION2) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1288 i = ((i - 0x8F) << 14) | (reg[rrr] & 0x3FFF); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1289 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1290 i = ((i - 0xE0) << 14) | (reg[rrr] & 0x3FFF); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1291 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1292 op = translate_char (GET_TRANSLATION_TABLE (op), i, -1, 0, 0); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1293 SPLIT_CHAR (op, reg[RRR], i, j); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1294 if (j != -1) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1295 i = (i << 7) | j; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1296 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1297 reg[rrr] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1298 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1299 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1300 case CCL_IterateMultipleMap: |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1301 { |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1302 Lisp_Object map, content, attrib, value; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1303 int point, size, fin_ic; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1304 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1305 j = XINT (ccl_prog[ic++]); /* number of maps. */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1306 fin_ic = ic + j; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1307 op = reg[rrr]; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1308 if ((j > reg[RRR]) && (j >= 0)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1309 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1310 ic += reg[RRR]; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1311 i = reg[RRR]; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1312 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1313 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1314 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1315 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1316 ic = fin_ic; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1317 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1318 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1319 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1320 for (;i < j;i++) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1321 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1322 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1323 size = XVECTOR (Vcode_conversion_map_vector)->size; |
21518
1b0d88d6fb42
(ccl_driver, syms_of_ccl): Fix mixing of Lisp_Object and
Andreas Schwab <schwab@suse.de>
parents:
21514
diff
changeset
|
1324 point = XINT (ccl_prog[ic++]); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1325 if (point >= size) continue; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1326 map = |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1327 XVECTOR (Vcode_conversion_map_vector)->contents[point]; |
21551 | 1328 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1329 /* Check map varidity. */ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1330 if (!CONSP (map)) continue; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1331 map = XCDR (map); |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1332 if (!VECTORP (map)) continue; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1333 size = XVECTOR (map)->size; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1334 if (size <= 1) continue; |
21551 | 1335 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1336 content = XVECTOR (map)->contents[0]; |
21551 | 1337 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1338 /* check map type, |
21551 | 1339 [STARTPOINT VAL1 VAL2 ...] or |
1340 [t ELELMENT STARTPOINT ENDPOINT] */ | |
1341 if (NUMBERP (content)) | |
1342 { | |
1343 point = XUINT (content); | |
1344 point = op - point + 1; | |
1345 if (!((point >= 1) && (point < size))) continue; | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1346 content = XVECTOR (map)->contents[point]; |
21551 | 1347 } |
1348 else if (EQ (content, Qt)) | |
1349 { | |
1350 if (size != 4) continue; | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1351 if ((op >= XUINT (XVECTOR (map)->contents[2])) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1352 && (op < XUINT (XVECTOR (map)->contents[3]))) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1353 content = XVECTOR (map)->contents[1]; |
21551 | 1354 else |
1355 continue; | |
1356 } | |
1357 else | |
1358 continue; | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1359 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1360 if (NILP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1361 continue; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1362 else if (NUMBERP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1363 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1364 reg[RRR] = i; |
21551 | 1365 reg[rrr] = XINT(content); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1366 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1367 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1368 else if (EQ (content, Qt) || EQ (content, Qlambda)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1369 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1370 reg[RRR] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1371 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1372 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1373 else if (CONSP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1374 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1375 attrib = XCAR (content); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1376 value = XCDR (content); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1377 if (!NUMBERP (attrib) || !NUMBERP (value)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1378 continue; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1379 reg[RRR] = i; |
21551 | 1380 reg[rrr] = XUINT (value); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1381 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1382 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1383 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1384 if (i == j) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1385 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1386 ic = fin_ic; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1387 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1388 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1389 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1390 case CCL_MapMultiple: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1391 { |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1392 Lisp_Object map, content, attrib, value; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1393 int point, size, map_vector_size; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1394 int map_set_rest_length, fin_ic; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1395 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1396 map_set_rest_length = |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1397 XINT (ccl_prog[ic++]); /* number of maps and separators. */ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1398 fin_ic = ic + map_set_rest_length; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1399 if ((map_set_rest_length > reg[RRR]) && (reg[RRR] >= 0)) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1400 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1401 ic += reg[RRR]; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1402 i = reg[RRR]; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1403 map_set_rest_length -= i; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1404 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1405 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1406 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1407 ic = fin_ic; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1408 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1409 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1410 } |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1411 mapping_stack_pointer = mapping_stack; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1412 op = reg[rrr]; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1413 PUSH_MAPPING_STACK (0, op); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1414 reg[RRR] = -1; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1415 map_vector_size = XVECTOR (Vcode_conversion_map_vector)->size; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1416 for (;map_set_rest_length > 0;i++, map_set_rest_length--) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1417 { |
21551 | 1418 point = XINT(ccl_prog[ic++]); |
1419 if (point < 0) | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1420 { |
21551 | 1421 point = -point; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1422 if (mapping_stack_pointer |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1423 >= &mapping_stack[MAX_MAP_SET_LEVEL]) |
21551 | 1424 { |
1425 CCL_INVALID_CMD; | |
1426 } | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1427 PUSH_MAPPING_STACK (map_set_rest_length - point, |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1428 reg[rrr]); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1429 map_set_rest_length = point + 1; |
21551 | 1430 reg[rrr] = op; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1431 continue; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1432 } |
21551 | 1433 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1434 if (point >= map_vector_size) continue; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1435 map = (XVECTOR (Vcode_conversion_map_vector) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1436 ->contents[point]); |
21551 | 1437 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1438 /* Check map varidity. */ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1439 if (!CONSP (map)) continue; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1440 map = XCDR (map); |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1441 if (!VECTORP (map)) continue; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1442 size = XVECTOR (map)->size; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1443 if (size <= 1) continue; |
21551 | 1444 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1445 content = XVECTOR (map)->contents[0]; |
21551 | 1446 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1447 /* check map type, |
21551 | 1448 [STARTPOINT VAL1 VAL2 ...] or |
1449 [t ELEMENT STARTPOINT ENDPOINT] */ | |
1450 if (NUMBERP (content)) | |
1451 { | |
1452 point = XUINT (content); | |
1453 point = op - point + 1; | |
1454 if (!((point >= 1) && (point < size))) continue; | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1455 content = XVECTOR (map)->contents[point]; |
21551 | 1456 } |
1457 else if (EQ (content, Qt)) | |
1458 { | |
1459 if (size != 4) continue; | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1460 if ((op >= XUINT (XVECTOR (map)->contents[2])) && |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1461 (op < XUINT (XVECTOR (map)->contents[3]))) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1462 content = XVECTOR (map)->contents[1]; |
21551 | 1463 else |
1464 continue; | |
1465 } | |
1466 else | |
1467 continue; | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1468 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1469 if (NILP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1470 continue; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1471 else if (NUMBERP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1472 { |
21551 | 1473 op = XINT (content); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1474 reg[RRR] = i; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1475 i += map_set_rest_length; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1476 POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1477 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1478 else if (CONSP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1479 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1480 attrib = XCAR (content); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1481 value = XCDR (content); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1482 if (!NUMBERP (attrib) || !NUMBERP (value)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1483 continue; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1484 reg[RRR] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1485 op = XUINT (value); |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1486 i += map_set_rest_length; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1487 POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1488 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1489 else if (EQ (content, Qt)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1490 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1491 reg[RRR] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1492 op = reg[rrr]; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1493 i += map_set_rest_length; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1494 POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1495 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1496 else if (EQ (content, Qlambda)) |
21551 | 1497 { |
1498 break; | |
1499 } | |
1500 else | |
1501 CCL_INVALID_CMD; | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1502 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1503 ic = fin_ic; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1504 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1505 reg[rrr] = op; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1506 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1507 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1508 case CCL_MapSingle: |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1509 { |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1510 Lisp_Object map, attrib, value, content; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1511 int size, point; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1512 j = XINT (ccl_prog[ic++]); /* map_id */ |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1513 op = reg[rrr]; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1514 if (j >= XVECTOR (Vcode_conversion_map_vector)->size) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1515 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1516 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1517 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1518 } |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1519 map = XVECTOR (Vcode_conversion_map_vector)->contents[j]; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1520 if (!CONSP (map)) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1521 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1522 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1523 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1524 } |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1525 map = XCDR (map); |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1526 if (!VECTORP (map)) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1527 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1528 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1529 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1530 } |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1531 size = XVECTOR (map)->size; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1532 point = XUINT (XVECTOR (map)->contents[0]); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1533 point = op - point + 1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1534 reg[RRR] = 0; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1535 if ((size <= 1) || |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1536 (!((point >= 1) && (point < size)))) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1537 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1538 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1539 { |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
1540 content = XVECTOR (map)->contents[point]; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1541 if (NILP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1542 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1543 else if (NUMBERP (content)) |
21551 | 1544 reg[rrr] = XINT (content); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1545 else if (EQ (content, Qt)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1546 reg[RRR] = i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1547 else if (CONSP (content)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1548 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1549 attrib = XCAR (content); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1550 value = XCDR (content); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1551 if (!NUMBERP (attrib) || !NUMBERP (value)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1552 continue; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1553 reg[rrr] = XUINT(value); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1554 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1555 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1556 else |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1557 reg[RRR] = -1; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1558 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1559 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1560 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1561 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1562 default: |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1563 CCL_INVALID_CMD; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1564 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1565 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1566 |
17052 | 1567 default: |
1568 CCL_INVALID_CMD; | |
1569 } | |
1570 } | |
1571 | |
1572 ccl_error_handler: | |
1573 if (destination) | |
1574 { | |
1575 /* We can insert an error message only if DESTINATION is | |
1576 specified and we still have a room to store the message | |
1577 there. */ | |
1578 char msg[256]; | |
1579 int msglen; | |
1580 | |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1581 if (!dst) |
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1582 dst = destination; |
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1583 |
17052 | 1584 switch (ccl->status) |
1585 { | |
1586 case CCL_STAT_INVALID_CMD: | |
1587 sprintf(msg, "\nCCL: Invalid command %x (ccl_code = %x) at %d.", | |
23303
fb38954a02d3
(ccl_driver): Report correct CCL program counter on error.
Kenichi Handa <handa@m17n.org>
parents:
23280
diff
changeset
|
1588 code & 0x1F, code, this_ic); |
17052 | 1589 #ifdef CCL_DEBUG |
1590 { | |
1591 int i = ccl_backtrace_idx - 1; | |
1592 int j; | |
1593 | |
1594 msglen = strlen (msg); | |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1595 if (dst + msglen <= (dst_bytes ? dst_end : src)) |
17052 | 1596 { |
1597 bcopy (msg, dst, msglen); | |
1598 dst += msglen; | |
1599 } | |
1600 | |
1601 for (j = 0; j < CCL_DEBUG_BACKTRACE_LEN; j++, i--) | |
1602 { | |
1603 if (i < 0) i = CCL_DEBUG_BACKTRACE_LEN - 1; | |
1604 if (ccl_backtrace_table[i] == 0) | |
1605 break; | |
1606 sprintf(msg, " %d", ccl_backtrace_table[i]); | |
1607 msglen = strlen (msg); | |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1608 if (dst + msglen > (dst_bytes ? dst_end : src)) |
17052 | 1609 break; |
1610 bcopy (msg, dst, msglen); | |
1611 dst += msglen; | |
1612 } | |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1613 goto ccl_finish; |
17052 | 1614 } |
17323
15fa68d983e7
(ccl_driver): Fix bug of the case CCL_WriteArrayReadJump.
Kenichi Handa <handa@m17n.org>
parents:
17122
diff
changeset
|
1615 #endif |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1616 break; |
17052 | 1617 |
1618 case CCL_STAT_QUIT: | |
1619 sprintf(msg, "\nCCL: Quited."); | |
1620 break; | |
1621 | |
1622 default: | |
1623 sprintf(msg, "\nCCL: Unknown error type (%d).", ccl->status); | |
1624 } | |
1625 | |
1626 msglen = strlen (msg); | |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1627 if (dst + msglen <= (dst_bytes ? dst_end : src)) |
17052 | 1628 { |
1629 bcopy (msg, dst, msglen); | |
1630 dst += msglen; | |
1631 } | |
1632 } | |
1633 | |
1634 ccl_finish: | |
1635 ccl->ic = ic; | |
24688
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
1636 ccl->stack_idx = stack_idx; |
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
1637 ccl->prog = ccl_prog; |
17052 | 1638 if (consumed) *consumed = src - source; |
23280
b4656367043f
(CCL_WRITE_CHAR): Don't use bcopy.
Kenichi Handa <handa@m17n.org>
parents:
23072
diff
changeset
|
1639 return (dst ? dst - destination : 0); |
17052 | 1640 } |
1641 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1642 /* Resolve symbols in the specified CCL code (Lisp vector). This |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1643 function converts symbols of code conversion maps and character |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1644 translation tables embeded in the CCL code into their ID numbers. |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1645 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1646 The return value is a vector (CCL itself or a new vector in which |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1647 all symbols are resolved), Qt if resolving of some symbol failed, |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1648 or nil if CCL contains invalid data. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1649 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1650 static Lisp_Object |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1651 resolve_symbol_ccl_program (ccl) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1652 Lisp_Object ccl; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1653 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1654 int i, veclen, unresolved = 0; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1655 Lisp_Object result, contents, val; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1656 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1657 result = ccl; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1658 veclen = XVECTOR (result)->size; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1659 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1660 for (i = 0; i < veclen; i++) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1661 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1662 contents = XVECTOR (result)->contents[i]; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1663 if (INTEGERP (contents)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1664 continue; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1665 else if (CONSP (contents) |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1666 && SYMBOLP (XCAR (contents)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1667 && SYMBOLP (XCDR (contents))) |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1668 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1669 /* This is the new style for embedding symbols. The form is |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1670 (SYMBOL . PROPERTY). (get SYMBOL PROPERTY) should give |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1671 an index number. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1672 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1673 if (EQ (result, ccl)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1674 result = Fcopy_sequence (ccl); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1675 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
1676 val = Fget (XCAR (contents), XCDR (contents)); |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1677 if (NATNUMP (val)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1678 XVECTOR (result)->contents[i] = val; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1679 else |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1680 unresolved = 1; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1681 continue; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1682 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1683 else if (SYMBOLP (contents)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1684 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1685 /* This is the old style for embedding symbols. This style |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1686 may lead to a bug if, for instance, a translation table |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1687 and a code conversion map have the same name. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1688 if (EQ (result, ccl)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1689 result = Fcopy_sequence (ccl); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1690 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1691 val = Fget (contents, Qtranslation_table_id); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1692 if (NATNUMP (val)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1693 XVECTOR (result)->contents[i] = val; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1694 else |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1695 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1696 val = Fget (contents, Qcode_conversion_map_id); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1697 if (NATNUMP (val)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1698 XVECTOR (result)->contents[i] = val; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1699 else |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1700 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1701 val = Fget (contents, Qccl_program_idx); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1702 if (NATNUMP (val)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1703 XVECTOR (result)->contents[i] = val; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1704 else |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1705 unresolved = 1; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1706 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1707 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1708 continue; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1709 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1710 return Qnil; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1711 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1712 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1713 return (unresolved ? Qt : result); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1714 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1715 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1716 /* Return the compiled code (vector) of CCL program CCL_PROG. |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1717 CCL_PROG is a name (symbol) of the program or already compiled |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1718 code. If necessary, resolve symbols in the compiled code to index |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1719 numbers. If we failed to get the compiled code or to resolve |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1720 symbols, return Qnil. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1721 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1722 static Lisp_Object |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1723 ccl_get_compiled_code (ccl_prog) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1724 Lisp_Object ccl_prog; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1725 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1726 Lisp_Object val, slot; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1727 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1728 if (VECTORP (ccl_prog)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1729 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1730 val = resolve_symbol_ccl_program (ccl_prog); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1731 return (VECTORP (val) ? val : Qnil); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1732 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1733 if (!SYMBOLP (ccl_prog)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1734 return Qnil; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1735 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1736 val = Fget (ccl_prog, Qccl_program_idx); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1737 if (! NATNUMP (val) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1738 || XINT (val) >= XVECTOR (Vccl_program_table)->size) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1739 return Qnil; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1740 slot = XVECTOR (Vccl_program_table)->contents[XINT (val)]; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1741 if (! VECTORP (slot) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1742 || XVECTOR (slot)->size != 3 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1743 || ! VECTORP (XVECTOR (slot)->contents[1])) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1744 return Qnil; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1745 if (NILP (XVECTOR (slot)->contents[2])) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1746 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1747 val = resolve_symbol_ccl_program (XVECTOR (slot)->contents[1]); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1748 if (! VECTORP (val)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1749 return Qnil; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1750 XVECTOR (slot)->contents[1] = val; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1751 XVECTOR (slot)->contents[2] = Qt; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1752 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1753 return XVECTOR (slot)->contents[1]; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1754 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1755 |
17052 | 1756 /* Setup fields of the structure pointed by CCL appropriately for the |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1757 execution of CCL program CCL_PROG. CCL_PROG is the name (symbol) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1758 of the CCL program or the already compiled code (vector). |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1759 Return 0 if we succeed this setup, else return -1. |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1760 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1761 If CCL_PROG is nil, we just reset the structure pointed by CCL. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1762 int |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1763 setup_ccl_program (ccl, ccl_prog) |
17052 | 1764 struct ccl_program *ccl; |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1765 Lisp_Object ccl_prog; |
17052 | 1766 { |
1767 int i; | |
1768 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1769 if (! NILP (ccl_prog)) |
23884
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1770 { |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1771 struct Lisp_Vector *vp; |
23884
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1772 |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1773 ccl_prog = ccl_get_compiled_code (ccl_prog); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1774 if (! VECTORP (ccl_prog)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1775 return -1; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1776 vp = XVECTOR (ccl_prog); |
23884
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1777 ccl->size = vp->size; |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1778 ccl->prog = vp->contents; |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1779 ccl->eof_ic = XINT (vp->contents[CCL_HEADER_EOF]); |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1780 ccl->buf_magnification = XINT (vp->contents[CCL_HEADER_BUF_MAG]); |
179bcb86f12f
(CCL_SUCCESS): Don't set ccl->ic.
Kenichi Handa <handa@m17n.org>
parents:
23768
diff
changeset
|
1781 } |
17052 | 1782 ccl->ic = CCL_HEADER_MAIN; |
1783 for (i = 0; i < 8; i++) | |
1784 ccl->reg[i] = 0; | |
1785 ccl->last_block = 0; | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1786 ccl->private_state = 0; |
17052 | 1787 ccl->status = 0; |
24688
7b170d2184a4
(ccl_prog_stack_struct): Declare it as static.
Kenichi Handa <handa@m17n.org>
parents:
24567
diff
changeset
|
1788 ccl->stack_idx = 0; |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1789 return 0; |
17052 | 1790 } |
1791 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1792 #ifdef emacs |
21551 | 1793 |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1794 DEFUN ("ccl-program-p", Fccl_program_p, Sccl_program_p, 1, 1, 0, |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1795 "Return t if OBJECT is a CCL program name or a compiled CCL program code.") |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1796 (object) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1797 Lisp_Object object; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1798 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1799 Lisp_Object val; |
21551 | 1800 |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1801 if (VECTORP (object)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1802 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1803 val = resolve_symbol_ccl_program (object); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1804 return (VECTORP (val) ? Qt : Qnil); |
21551 | 1805 } |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1806 if (!SYMBOLP (object)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1807 return Qnil; |
21551 | 1808 |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1809 val = Fget (object, Qccl_program_idx); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1810 return ((! NATNUMP (val) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1811 || XINT (val) >= XVECTOR (Vccl_program_table)->size) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1812 ? Qnil : Qt); |
21551 | 1813 } |
1814 | |
17052 | 1815 DEFUN ("ccl-execute", Fccl_execute, Sccl_execute, 2, 2, 0, |
1816 "Execute CCL-PROGRAM with registers initialized by REGISTERS.\n\ | |
21551 | 1817 \n\ |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1818 CCL-PROGRAM is a CCL program name (symbol)\n\ |
21551 | 1819 or a compiled code generated by `ccl-compile' (for backward compatibility,\n\ |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1820 in this case, the overhead of the execution is bigger than the former case).\n\ |
21551 | 1821 No I/O commands should appear in CCL-PROGRAM.\n\ |
1822 \n\ | |
17052 | 1823 REGISTERS is a vector of [R0 R1 ... R7] where RN is an initial value\n\ |
1824 of Nth register.\n\ | |
21551 | 1825 \n\ |
1826 As side effect, each element of REGISTERS holds the value of\n\ | |
17052 | 1827 corresponding register after the execution.") |
1828 (ccl_prog, reg) | |
1829 Lisp_Object ccl_prog, reg; | |
1830 { | |
1831 struct ccl_program ccl; | |
1832 int i; | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1833 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1834 if (setup_ccl_program (&ccl, ccl_prog) < 0) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1835 error ("Invalid CCL program"); |
17052 | 1836 |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1837 CHECK_VECTOR (reg, 1); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1838 if (XVECTOR (reg)->size != 8) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1839 error ("Length of vector REGISTERS is not 9"); |
21551 | 1840 |
17052 | 1841 for (i = 0; i < 8; i++) |
1842 ccl.reg[i] = (INTEGERP (XVECTOR (reg)->contents[i]) | |
1843 ? XINT (XVECTOR (reg)->contents[i]) | |
1844 : 0); | |
1845 | |
1846 ccl_driver (&ccl, (char *)0, (char *)0, 0, 0, (int *)0); | |
1847 QUIT; | |
1848 if (ccl.status != CCL_STAT_SUCCESS) | |
1849 error ("Error in CCL program at %dth code", ccl.ic); | |
1850 | |
1851 for (i = 0; i < 8; i++) | |
1852 XSETINT (XVECTOR (reg)->contents[i], ccl.reg[i]); | |
1853 return Qnil; | |
1854 } | |
1855 | |
1856 DEFUN ("ccl-execute-on-string", Fccl_execute_on_string, Sccl_execute_on_string, | |
20934
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1857 3, 5, 0, |
17052 | 1858 "Execute CCL-PROGRAM with initial STATUS on STRING.\n\ |
21551 | 1859 \n\ |
1860 CCL-PROGRAM is a symbol registered by register-ccl-program,\n\ | |
1861 or a compiled code generated by `ccl-compile' (for backward compatibility,\n\ | |
1862 in this case, the execution is slower).\n\ | |
1863 \n\ | |
17052 | 1864 Read buffer is set to STRING, and write buffer is allocated automatically.\n\ |
21551 | 1865 \n\ |
17052 | 1866 STATUS is a vector of [R0 R1 ... R7 IC], where\n\ |
1867 R0..R7 are initial values of corresponding registers,\n\ | |
1868 IC is the instruction counter specifying from where to start the program.\n\ | |
1869 If R0..R7 are nil, they are initialized to 0.\n\ | |
1870 If IC is nil, it is initialized to head of the CCL program.\n\ | |
20934
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1871 \n\ |
21551 | 1872 If optional 4th arg CONTINUE is non-nil, keep IC on read operation\n\ |
17728
25d58ba29c1b
(Fccl_execute_on_string): Add 4th optional arg
Kenichi Handa <handa@m17n.org>
parents:
17370
diff
changeset
|
1873 when read buffer is exausted, else, IC is always set to the end of\n\ |
21556
f239266d104c
(Fccl_execute_on_string): Put \n\ at eol of docstring.
Kenichi Handa <handa@m17n.org>
parents:
21551
diff
changeset
|
1874 CCL-PROGRAM on exit.\n\ |
20934
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1875 \n\ |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1876 It returns the contents of write buffer as a string,\n\ |
21551 | 1877 and as side effect, STATUS is updated.\n\ |
20934
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1878 If the optional 5th arg UNIBYTE-P is non-nil, the returned string\n\ |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1879 is a unibyte string. By default it is a multibyte string.") |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1880 (ccl_prog, status, str, contin, unibyte_p) |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1881 Lisp_Object ccl_prog, status, str, contin, unibyte_p; |
17052 | 1882 { |
1883 Lisp_Object val; | |
1884 struct ccl_program ccl; | |
1885 int i, produced; | |
1886 int outbufsize; | |
1887 char *outbuf; | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1888 struct gcpro gcpro1, gcpro2; |
17052 | 1889 |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1890 if (setup_ccl_program (&ccl, ccl_prog) < 0) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1891 error ("Invalid CCL program"); |
21551 | 1892 |
17052 | 1893 CHECK_VECTOR (status, 1); |
1894 if (XVECTOR (status)->size != 9) | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1895 error ("Length of vector STATUS is not 9"); |
17052 | 1896 CHECK_STRING (str, 2); |
1897 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1898 GCPRO2 (status, str); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1899 |
17052 | 1900 for (i = 0; i < 8; i++) |
1901 { | |
1902 if (NILP (XVECTOR (status)->contents[i])) | |
1903 XSETINT (XVECTOR (status)->contents[i], 0); | |
1904 if (INTEGERP (XVECTOR (status)->contents[i])) | |
1905 ccl.reg[i] = XINT (XVECTOR (status)->contents[i]); | |
1906 } | |
1907 if (INTEGERP (XVECTOR (status)->contents[i])) | |
1908 { | |
1909 i = XFASTINT (XVECTOR (status)->contents[8]); | |
1910 if (ccl.ic < i && i < ccl.size) | |
1911 ccl.ic = i; | |
1912 } | |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
20945
diff
changeset
|
1913 outbufsize = STRING_BYTES (XSTRING (str)) * ccl.buf_magnification + 256; |
17052 | 1914 outbuf = (char *) xmalloc (outbufsize); |
1915 if (!outbuf) | |
1916 error ("Not enough memory"); | |
17728
25d58ba29c1b
(Fccl_execute_on_string): Add 4th optional arg
Kenichi Handa <handa@m17n.org>
parents:
17370
diff
changeset
|
1917 ccl.last_block = NILP (contin); |
17052 | 1918 produced = ccl_driver (&ccl, XSTRING (str)->data, outbuf, |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
20945
diff
changeset
|
1919 STRING_BYTES (XSTRING (str)), outbufsize, (int *)0); |
17052 | 1920 for (i = 0; i < 8; i++) |
1921 XSET (XVECTOR (status)->contents[i], Lisp_Int, ccl.reg[i]); | |
1922 XSETINT (XVECTOR (status)->contents[8], ccl.ic); | |
1923 UNGCPRO; | |
1924 | |
20934
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1925 if (NILP (unibyte_p)) |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1926 val = make_string (outbuf, produced); |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1927 else |
eebcbb4b56bd
(Fccl_execute_on_string): Add new arg UNIBYTE-P.
Kenichi Handa <handa@m17n.org>
parents:
20722
diff
changeset
|
1928 val = make_unibyte_string (outbuf, produced); |
17052 | 1929 free (outbuf); |
1930 QUIT; | |
1931 if (ccl.status != CCL_STAT_SUCCESS | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1932 && ccl.status != CCL_STAT_SUSPEND_BY_SRC |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
1933 && ccl.status != CCL_STAT_SUSPEND_BY_DST) |
17052 | 1934 error ("Error in CCL program at %dth code", ccl.ic); |
1935 | |
1936 return val; | |
1937 } | |
1938 | |
1939 DEFUN ("register-ccl-program", Fregister_ccl_program, Sregister_ccl_program, | |
1940 2, 2, 0, | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1941 "Register CCL program CCL_PROG as NAME in `ccl-program-table'.\n\ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1942 CCL_PROG should be a compiled CCL program (vector), or nil.\n\ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1943 If it is nil, just reserve NAME as a CCL program name.\n\ |
17052 | 1944 Return index number of the registered CCL program.") |
1945 (name, ccl_prog) | |
1946 Lisp_Object name, ccl_prog; | |
1947 { | |
1948 int len = XVECTOR (Vccl_program_table)->size; | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1949 int idx; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1950 Lisp_Object resolved; |
17052 | 1951 |
1952 CHECK_SYMBOL (name, 0); | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1953 resolved = Qnil; |
17052 | 1954 if (!NILP (ccl_prog)) |
21551 | 1955 { |
1956 CHECK_VECTOR (ccl_prog, 1); | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1957 resolved = resolve_symbol_ccl_program (ccl_prog); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1958 if (! NILP (resolved)) |
17052 | 1959 { |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1960 ccl_prog = resolved; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1961 resolved = Qt; |
17052 | 1962 } |
1963 } | |
1964 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1965 for (idx = 0; idx < len; idx++) |
17052 | 1966 { |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1967 Lisp_Object slot; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1968 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1969 slot = XVECTOR (Vccl_program_table)->contents[idx]; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1970 if (!VECTORP (slot)) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1971 /* This is the first unsed slot. Register NAME here. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1972 break; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1973 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1974 if (EQ (name, XVECTOR (slot)->contents[0])) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1975 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1976 /* Update this slot. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1977 XVECTOR (slot)->contents[1] = ccl_prog; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1978 XVECTOR (slot)->contents[2] = resolved; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1979 return make_number (idx); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1980 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1981 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1982 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1983 if (idx == len) |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1984 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1985 /* Extend the table. */ |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1986 Lisp_Object new_table; |
17052 | 1987 int j; |
1988 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1989 new_table = Fmake_vector (make_number (len * 2), Qnil); |
17052 | 1990 for (j = 0; j < len; j++) |
1991 XVECTOR (new_table)->contents[j] | |
1992 = XVECTOR (Vccl_program_table)->contents[j]; | |
1993 Vccl_program_table = new_table; | |
1994 } | |
1995 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1996 { |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1997 Lisp_Object elt; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1998 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
1999 elt = Fmake_vector (make_number (3), Qnil); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2000 XVECTOR (elt)->contents[0] = name; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2001 XVECTOR (elt)->contents[1] = ccl_prog; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2002 XVECTOR (elt)->contents[2] = resolved; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2003 XVECTOR (Vccl_program_table)->contents[idx] = elt; |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2004 } |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2005 |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2006 Fput (name, Qccl_program_idx, make_number (idx)); |
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2007 return make_number (idx); |
17052 | 2008 } |
2009 | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2010 /* Register code conversion map. |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2011 A code conversion map consists of numbers, Qt, Qnil, and Qlambda. |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2012 The first element is start code point. |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2013 The rest elements are mapped numbers. |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2014 Symbol t means to map to an original number before mapping. |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2015 Symbol nil means that the corresponding element is empty. |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2016 Symbol lambda menas to terminate mapping here. |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2017 */ |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2018 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2019 DEFUN ("register-code-conversion-map", Fregister_code_conversion_map, |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2020 Sregister_code_conversion_map, |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2021 2, 2, 0, |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2022 "Register SYMBOL as code conversion map MAP.\n\ |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2023 Return index number of the registered map.") |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2024 (symbol, map) |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2025 Lisp_Object symbol, map; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2026 { |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2027 int len = XVECTOR (Vcode_conversion_map_vector)->size; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2028 int i; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2029 Lisp_Object index; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2030 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2031 CHECK_SYMBOL (symbol, 0); |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2032 CHECK_VECTOR (map, 1); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2033 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2034 for (i = 0; i < len; i++) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2035 { |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2036 Lisp_Object slot = XVECTOR (Vcode_conversion_map_vector)->contents[i]; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2037 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2038 if (!CONSP (slot)) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2039 break; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2040 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
2041 if (EQ (symbol, XCAR (slot))) |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2042 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2043 index = make_number (i); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25066
diff
changeset
|
2044 XCDR (slot) = map; |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2045 Fput (symbol, Qcode_conversion_map, map); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2046 Fput (symbol, Qcode_conversion_map_id, index); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2047 return index; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2048 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2049 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2050 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2051 if (i == len) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2052 { |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2053 Lisp_Object new_vector = Fmake_vector (make_number (len * 2), Qnil); |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2054 int j; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2055 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2056 for (j = 0; j < len; j++) |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2057 XVECTOR (new_vector)->contents[j] |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2058 = XVECTOR (Vcode_conversion_map_vector)->contents[j]; |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2059 Vcode_conversion_map_vector = new_vector; |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2060 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2061 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2062 index = make_number (i); |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2063 Fput (symbol, Qcode_conversion_map, map); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2064 Fput (symbol, Qcode_conversion_map_id, index); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2065 XVECTOR (Vcode_conversion_map_vector)->contents[i] = Fcons (symbol, map); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2066 return index; |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2067 } |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2068 |
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2069 |
21514 | 2070 void |
17052 | 2071 syms_of_ccl () |
2072 { | |
2073 staticpro (&Vccl_program_table); | |
18749
d961aeafceba
(Fregister_ccl_program): Convert Fmake_vector argument to Lisp_Integer.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
2074 Vccl_program_table = Fmake_vector (make_number (32), Qnil); |
17052 | 2075 |
21551 | 2076 Qccl_program = intern ("ccl-program"); |
2077 staticpro (&Qccl_program); | |
2078 | |
2079 Qccl_program_idx = intern ("ccl-program-idx"); | |
2080 staticpro (&Qccl_program_idx); | |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2081 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2082 Qcode_conversion_map = intern ("code-conversion-map"); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2083 staticpro (&Qcode_conversion_map); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2084 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2085 Qcode_conversion_map_id = intern ("code-conversion-map-id"); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2086 staticpro (&Qcode_conversion_map_id); |
21551 | 2087 |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2088 DEFVAR_LISP ("code-conversion-map-vector", &Vcode_conversion_map_vector, |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2089 "Vector of code conversion maps."); |
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2090 Vcode_conversion_map_vector = Fmake_vector (make_number (16), Qnil); |
20722
cce3ef478c64
(Vccl_translation_table_vector, Qccl_program,
Kenichi Handa <handa@m17n.org>
parents:
20613
diff
changeset
|
2091 |
17052 | 2092 DEFVAR_LISP ("font-ccl-encoder-alist", &Vfont_ccl_encoder_alist, |
2093 "Alist of fontname patterns vs corresponding CCL program.\n\ | |
2094 Each element looks like (REGEXP . CCL-CODE),\n\ | |
2095 where CCL-CODE is a compiled CCL program.\n\ | |
2096 When a font whose name matches REGEXP is used for displaying a character,\n\ | |
2097 CCL-CODE is executed to calculate the code point in the font\n\ | |
2098 from the charset number and position code(s) of the character which are set\n\ | |
2099 in CCL registers R0, R1, and R2 before the execution.\n\ | |
2100 The code point in the font is set in CCL registers R1 and R2\n\ | |
2101 when the execution terminated.\n\ | |
2102 If the font is single-byte font, the register R2 is not used."); | |
2103 Vfont_ccl_encoder_alist = Qnil; | |
2104 | |
25066
8b8e54912f5c
(ccl_driver) <CCL_Call>: Now CCL program ID to call may be
Kenichi Handa <handa@m17n.org>
parents:
24688
diff
changeset
|
2105 defsubr (&Sccl_program_p); |
17052 | 2106 defsubr (&Sccl_execute); |
2107 defsubr (&Sccl_execute_on_string); | |
2108 defsubr (&Sregister_ccl_program); | |
22122
dfae9bc3731d
Change term translation to code conversion, then change
Kenichi Handa <handa@m17n.org>
parents:
21665
diff
changeset
|
2109 defsubr (&Sregister_code_conversion_map); |
17052 | 2110 } |
2111 | |
2112 #endif /* emacs */ |