Mercurial > hg > xemacs-beta
comparison src/mule-canna.c @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | |
children | 54cc21c15cbb |
comparison
equal
deleted
inserted
replaced
69:804d1389bcd6 | 70:131b0175ea99 |
---|---|
1 /* CANNA interface | |
2 | |
3 Copyright (C) 1995 Free Software Foundation, Inc. | |
4 Copyright (C) 1995 Sun Microsystems, Inc. | |
5 | |
6 This file is part of XEmacs. | |
7 | |
8 XEmacs is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 2, or (at your option) any | |
11 later version. | |
12 | |
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with XEmacs; see the file COPYING. If not, write to | |
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
21 Boston, MA 02111-1307, USA. */ | |
22 | |
23 /* Synched up with: Mule 2.3. Not in FSF. */ | |
24 | |
25 /* #### The comments in this file are mostly in EUC-formatted Japanese. | |
26 It would be ***soooo*** much nicer if someone could translate | |
27 them ... */ | |
28 | |
29 /* | |
30 | |
31 Authors: Akira Kon (kon@d1.bs2.mt.nec.co.jp) | |
32 Ichiro Hirakura (hirakura@uxp.bs2.mt.nec.co.jp) | |
33 | |
34 Functions defined in this file are | |
35 | |
36 (canna-key-proc key) | |
37 key: single STRING | |
38 RETURNS: | |
39 Length of converted string if no error occurs. | |
40 Error string if error occurs. | |
41 DESCRIPTION: | |
42 Convert a key input to a set of strings. The | |
43 strings contain both well-formed string and a | |
44 intermediate result to show the translation | |
45 information to a user. converted strings are | |
46 stored in specific variables. | |
47 | |
48 (canna-initialize) | |
49 RETURNS: | |
50 List of the following things: | |
51 - list of keys to toggle Japanese-mode | |
52 - error message | |
53 - list of warning messages | |
54 DESCRIPTION: | |
55 Initialize ``canna'', which is a kana-to-kanji | |
56 converter for GNU Emacs. The first arg | |
57 specifies if inserting space character between | |
58 BUNSETSU when candidates are displayed. The | |
59 second arg specifies server. The third arg | |
60 specifies a file which will be used as a | |
61 customization description. If nil is | |
62 specified for each arg, the default value will | |
63 be used. | |
64 | |
65 (canna-finalize) | |
66 RETURNS: | |
67 list of warning messages | |
68 DESCRIPTION: | |
69 finalize ``canna'', which is a kana-to-kanji | |
70 converter for GNU Emacs. This cause to write | |
71 miscellaneous informations to kana-to-kanji | |
72 dictionary. | |
73 | |
74 (canna-touroku-string string) | |
75 string: | |
76 String to register to a dictionary. | |
77 RETURNS: | |
78 The same thing returns as canna-key-proc does. | |
79 DESCRIPTION: | |
80 Register Kanji words into kana-to-kanji | |
81 conversion dictionary. | |
82 | |
83 (canna-set-width width) | |
84 width: | |
85 Column width of the place where the candidates | |
86 of kana-to-kanji conversion will be shown. | |
87 RETURNS: | |
88 nil | |
89 DESCRIPTION: | |
90 Set status-line width information, which is | |
91 used to display kanji candidates. | |
92 | |
93 (canna-change-mode num) | |
94 num: | |
95 The mode number of Canna. | |
96 RETURNS: | |
97 The same thing returns as canna-key-proc does. | |
98 DESCRIPTION: | |
99 Change Japanese pre-edit mode. | |
100 | |
101 (canna-store-yomi yomi roma) | |
102 yomi: | |
103 ``Yomi'' to be stored. | |
104 roma: | |
105 ``Romaji'' which corresponds to the ``Yomi''. | |
106 RETURNS: | |
107 The same thing returns as canna-key-proc does. | |
108 DESCRIPTION: | |
109 Store yomi characters as a YOMI of | |
110 kana-to-kanji conversion. | |
111 | |
112 (canna-do-function num ch) | |
113 num: | |
114 A function number to be called. | |
115 ch: | |
116 A character will be specified in order to feed | |
117 the character to the function if the function | |
118 needs a input character. | |
119 RETURNS: | |
120 The same thing returns as canna-key-proc does. | |
121 DESCRIPTION: | |
122 Do specified function at current mode. | |
123 | |
124 (canna-parse string) | |
125 string: | |
126 To be parsed. | |
127 RETURNS: | |
128 List of warning messages. | |
129 DESCRIPTION: | |
130 Parse customize string. | |
131 | |
132 (canna-query-mode) | |
133 RETURNS: | |
134 A string which indicate the current mode. | |
135 DESCRIPTION: | |
136 Get current mode string. | |
137 | |
138 Functions below are used for KKCP compatible library. These | |
139 functions provides a base kana-to-kanji conversion system for EGG. | |
140 These functions may be used when users want to change the engine | |
141 from Wnn to Canna without changing user interface of Japanese input. | |
142 | |
143 (canna-henkan-begin) | |
144 (canna-henkan-next) | |
145 (canna-bunsetu-henkou) | |
146 (canna-henkan-kakutei) | |
147 (canna-henkan-end) | |
148 (canna-henkan-quit) | |
149 | |
150 */ | |
151 | |
152 #include <config.h> | |
153 #include "lisp.h" | |
154 | |
155 #include "buffer.h" | |
156 #include "mule-coding.h" | |
157 | |
158 #ifdef CANNA2 | |
159 #define IROHA_BC | |
160 #include "canna/jrkanji.h" | |
161 #include "canna/RK.h" | |
162 #else /* !CANNA2 */ | |
163 #include "iroha/jrkanji.h" | |
164 #include "iroha/RK.h" | |
165 #endif /* !CANNA2 */ | |
166 extern char *jrKanjiError; | |
167 | |
168 #define KEYTOSTRSIZE 2048 | |
169 static unsigned char buf[KEYTOSTRSIZE]; | |
170 static char **warning; | |
171 | |
172 static int Vcanna_empty_info, Vcanna_through_info; | |
173 static int Vcanna_underline; | |
174 static int Vcanna_inhibit_hankakukana; | |
175 | |
176 static Lisp_Object Vcanna_kakutei_string; | |
177 static Lisp_Object Vcanna_kakutei_yomi; | |
178 static Lisp_Object Vcanna_kakutei_romaji; | |
179 static Lisp_Object Vcanna_henkan_string; | |
180 static int Vcanna_henkan_length; | |
181 static int Vcanna_henkan_revPos; | |
182 static int Vcanna_henkan_revLen; | |
183 static Lisp_Object Vcanna_ichiran_string; | |
184 static int Vcanna_ichiran_length; | |
185 static int Vcanna_ichiran_revPos; | |
186 static int Vcanna_ichiran_revLen; | |
187 static Lisp_Object Vcanna_mode_string; | |
188 | |
189 static int IRCP_context; | |
190 | |
191 static Lisp_Object storeResults (unsigned char *, int, jrKanjiStatus *); | |
192 static Lisp_Object kanjiYomiList (int, int); | |
193 | |
194 #ifdef CANNA_MULE | |
195 static void m2c (unsigned char *, int, unsigned char *); | |
196 static Lisp_Object mule_make_string (unsigned char *, int); | |
197 static mule_strlen (unsigned char *, int); | |
198 static count_char (unsigned char *,int, int, int, int *, int *, int *); | |
199 #define make_string mule_make_string | |
200 #endif | |
201 | |
202 /* Lisp functions definition */ | |
203 | |
204 DEFUN ("canna-key-proc", Fcanna_key_proc, 1, 1, 0, /* | |
205 Translate a key input to a set of strings. The strings contain both | |
206 well-formed string and intermediate result to show the translation | |
207 information to a user. Converted strings are stored in specific | |
208 variables. | |
209 */ | |
210 (ch)) | |
211 { | |
212 jrKanjiStatus ks; | |
213 int len; | |
214 | |
215 CHECK_CHAR (ch); | |
216 len = jrKanjiString (0, XCHAR (ch), buf, KEYTOSTRSIZE, &ks); | |
217 return storeResults (buf, len, &ks); | |
218 } | |
219 | |
220 static Lisp_Object | |
221 storeResults (unsigned char *buf, int len, jrKanjiStatus *ks) | |
222 { | |
223 Lisp_Object val = Qnil; | |
224 | |
225 if (len < 0) | |
226 { /* Error detected */ | |
227 val = make_string ((unsigned char*) jrKanjiError, strlen (jrKanjiError)); | |
228 } | |
229 else | |
230 { | |
231 /* 確定した文字列 */ | |
232 Vcanna_kakutei_string = make_string (buf, len); | |
233 val = make_int (len); | |
234 /* 確定した文字列の読みの情報... */ | |
235 Vcanna_kakutei_yomi = Vcanna_kakutei_romaji = Qnil; | |
236 if (ks->info & KanjiYomiInfo) | |
237 { | |
238 unsigned char *p = buf + len + 1; | |
239 int yomilen = strlen (p); | |
240 | |
241 if (len + yomilen + 1 < KEYTOSTRSIZE) | |
242 { | |
243 int yomilen2; | |
244 | |
245 Vcanna_kakutei_yomi = make_string (p, yomilen); /* 読み */ | |
246 p += yomilen + 1; | |
247 yomilen2 = strlen (p); | |
248 if (len + yomilen + yomilen2 + 2 < KEYTOSTRSIZE) | |
249 { | |
250 Vcanna_kakutei_romaji = make_string (p, yomilen2); /* ローマ字 */ | |
251 } | |
252 } | |
253 } | |
254 | |
255 | |
256 /* 候補表示の文字列です。*/ | |
257 Vcanna_henkan_string = Qnil; | |
258 if (ks->length >= 0) | |
259 { | |
260 Vcanna_henkan_string = make_string (ks->echoStr, ks->length); | |
261 #ifndef CANNA_MULE | |
262 Vcanna_henkan_length = ks->length; | |
263 Vcanna_henkan_revPos = ks->revPos; | |
264 Vcanna_henkan_revLen = ks->revLen; | |
265 #else /* CANNA_MULE */ | |
266 if (Vcanna_underline) | |
267 { | |
268 Vcanna_henkan_length = mule_strlen (ks->echoStr,ks->length); | |
269 Vcanna_henkan_revPos = mule_strlen (ks->echoStr,ks->revPos); | |
270 Vcanna_henkan_revLen = mule_strlen (ks->echoStr+ks->revPos,ks->revLen); | |
271 } | |
272 else | |
273 { | |
274 count_char (ks->echoStr, ks->length, ks->revPos, ks->revLen, | |
275 &Vcanna_henkan_length, &Vcanna_henkan_revPos, | |
276 &Vcanna_henkan_revLen); | |
277 } | |
278 #endif /* CANNA_MULE */ | |
279 } | |
280 | |
281 /* 一覧の情報 */ | |
282 Vcanna_ichiran_string = Qnil; | |
283 if (ks->info & KanjiGLineInfo && ks->gline.length >= 0) | |
284 { | |
285 Vcanna_ichiran_string = make_string (ks->gline.line, ks->gline.length); | |
286 #ifndef CANNA_MULE | |
287 Vcanna_ichiran_length = ks->gline.length; | |
288 Vcanna_ichiran_revPos = ks->gline.revPos; | |
289 Vcanna_ichiran_revLen = ks->gline.revLen; | |
290 #else /* CANNA_MULE */ | |
291 count_char (ks->gline.line, ks->gline.length, | |
292 ks->gline.revPos, ks->gline.revLen, &Vcanna_ichiran_length, | |
293 &Vcanna_ichiran_revPos, &Vcanna_ichiran_revLen); | |
294 #endif /* CANNA_MULE */ | |
295 } | |
296 | |
297 /* モードの情報 */ | |
298 Vcanna_mode_string = Qnil; | |
299 if (ks->info & KanjiModeInfo) | |
300 { | |
301 Vcanna_mode_string = make_string (ks->mode, strlen (ks->mode)); | |
302 } | |
303 | |
304 /* その他の情報 */ | |
305 Vcanna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0; | |
306 Vcanna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0; | |
307 } | |
308 | |
309 return val; | |
310 } | |
311 | |
312 DEFUN ("canna-set-bunsetsu-kugiri", Fcanna_set_bunsetsu, 0, 1, 0, /* | |
313 This function sets the clause separator. | |
314 If non-nil value is specified, the white space separator will be used. | |
315 No separator will be used otherwise. | |
316 */ | |
317 (num)) | |
318 { | |
319 int kugiri; /* 文節区切りをするか? */ | |
320 | |
321 kugiri = NILP (num) ? 0 : 1; | |
322 | |
323 jrKanjiControl (0, KC_SETBUNSETSUKUGIRI, (char *) kugiri); | |
324 } | |
325 | |
326 DEFUN ("canna-initialize", Fcanna_initialize, 0, 3, 0, /* | |
327 Initialize ``canna'', which is a kana-to-kanji converter for GNU Emacs. | |
328 The first arg specifies if inserting space character between BUNSETSU when | |
329 candidates are displayed. | |
330 The second arg specifies server. | |
331 The third arg specifies a file which will be used as a customization | |
332 description. | |
333 If nil is specified for each arg, the default value will be used. | |
334 */ | |
335 (num, server, rcfile)) | |
336 { | |
337 Lisp_Object val; | |
338 int res; | |
339 unsigned char **p, **q; | |
340 | |
341 int kugiri; /* 文節区切りをするか? */ | |
342 | |
343 IRCP_context = -1; | |
344 | |
345 if (NILP (num)) | |
346 { | |
347 kugiri = 1; | |
348 } | |
349 else | |
350 { | |
351 CHECK_INT (num); | |
352 kugiri = XINT (num); | |
353 kugiri = (kugiri == 1) ? 1 : 0; | |
354 } | |
355 | |
356 if (NILP (server)) | |
357 { | |
358 jrKanjiControl (0, KC_SETSERVERNAME, (char *) 0); | |
359 } | |
360 else | |
361 { | |
362 char servername[256]; | |
363 | |
364 CHECK_STRING (server); | |
365 strncpy (servername, XSTRING (server)->_data, XSTRING (server)->_size); | |
366 servername[XSTRING (server)->_size] = '\0'; | |
367 jrKanjiControl (0, KC_SETSERVERNAME, servername); | |
368 } | |
369 | |
370 if (NILP (rcfile)) | |
371 { | |
372 jrKanjiControl (0, KC_SETINITFILENAME, (char *) 0); | |
373 } | |
374 else | |
375 { | |
376 char rcname[256]; | |
377 | |
378 CHECK_STRING (rcfile); | |
379 strncpy (rcname, XSTRING (rcfile)->_data, XSTRING (rcfile)->_size); | |
380 rcname[XSTRING (rcfile)->_size] = '\0'; | |
381 jrKanjiControl (0, KC_SETINITFILENAME, rcname); | |
382 } | |
383 | |
384 warning = (char **) 0; | |
385 #ifdef nec_ews_svr4 | |
386 stop_polling (); | |
387 #endif /* nec_ews_svr4 */ | |
388 res = jrKanjiControl (0, KC_INITIALIZE, (char *)&warning); | |
389 #ifdef nec_ews_svr4 | |
390 start_polling (); | |
391 #endif /* nec_ews_svr4 */ | |
392 val = Qnil; | |
393 if (warning) | |
394 { | |
395 for (p = q = (unsigned char **) warning ; *q ; q++) | |
396 ; | |
397 while (p < q) | |
398 { | |
399 q--; | |
400 val = Fcons (make_string (*q, strlen (*q)), val); | |
401 } | |
402 } | |
403 val = Fcons (val, Qnil); | |
404 | |
405 if (res == -1) | |
406 { | |
407 val = Fcons (make_string ((unsigned char*) jrKanjiError, | |
408 strlen (jrKanjiError)), val); | |
409 /* イニシャライズで失敗した場合。 */ | |
410 return Fcons (Qnil, val); | |
411 } | |
412 else | |
413 { | |
414 extern (*jrBeepFunc)(); | |
415 Lisp_Object Fding (), CANNA_mode_keys (); | |
416 | |
417 jrBeepFunc = Fding; | |
418 | |
419 #ifdef KC_SETAPPNAME | |
420 #ifndef CANNA_MULE | |
421 wcKanjiControl (0, KC_SETAPPNAME, "nemacs"); | |
422 #else /* CANNA_MULE */ | |
423 wcKanjiControl (0, KC_SETAPPNAME, "mule"); | |
424 #endif /* CANNA_MULE */ | |
425 #endif /* KC_SETAPPNAME */ | |
426 | |
427 jrKanjiControl (0, KC_SETBUNSETSUKUGIRI, (char *) kugiri); | |
428 jrKanjiControl (0, KC_SETWIDTH, (char *) 78); | |
429 #ifndef CANNA_MULE | |
430 jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1); | |
431 #else | |
432 /* mule だったら半角カタカナも使える */ | |
433 if (Vcanna_inhibit_hankakukana) | |
434 jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1); | |
435 #endif | |
436 jrKanjiControl (0, KC_YOMIINFO, (char *) 2); /* ※2: ローマ字まで返す */ | |
437 val = Fcons (Qnil, val); | |
438 return Fcons (CANNA_mode_keys (), val); | |
439 } | |
440 } | |
441 | |
442 DEFUN ("canna-finalize", Fcanna_finalize, 0, 0, 0, /* | |
443 finalize ``canna'', which is a kana-to-kanji converter for GNU Emacs. | |
444 This cause to write miscellaneous informations to kana-to-kanji dictionary. | |
445 */ | |
446 ()) | |
447 { | |
448 Lisp_Object val; | |
449 unsigned char **p; | |
450 | |
451 jrKanjiControl (0, KC_FINALIZE, (char *)&warning); | |
452 | |
453 val = Qnil; | |
454 if (warning) | |
455 { | |
456 for (p = (unsigned char**) warning ; *p ; p++) | |
457 { | |
458 val = Fcons (make_string (*p, strlen (*p)), val); | |
459 } | |
460 } | |
461 val = Fcons (val, Qnil); | |
462 IRCP_context = -1; | |
463 return val; | |
464 } | |
465 | |
466 DEFUN ("canna-touroku-string", Fcanna_touroku_string, 1, 1, 0, /* | |
467 Register Kanji words into kana-to-kanji conversion dictionary. | |
468 */ | |
469 (str)) | |
470 { | |
471 jrKanjiStatusWithValue ksv; | |
472 jrKanjiStatus ks; | |
473 int len; | |
474 Lisp_Object val; | |
475 #ifdef CANNA_MULE | |
476 unsigned char cbuf[4096]; | |
477 #endif | |
478 | |
479 CHECK_STRING (str); | |
480 ksv.buffer = (unsigned char *) buf; | |
481 ksv.bytes_buffer = KEYTOSTRSIZE; | |
482 #ifndef CANNA_MULE | |
483 ks.echoStr = XSTRING (str)->_data; | |
484 ks.length = XSTRING (str)->_size; | |
485 #else /* CANNA_MULE */ | |
486 m2c (XSTRING (str)->_data, XSTRING (str)->_size, cbuf); | |
487 ks.echoStr = cbuf; | |
488 ks.length = strlen (cbuf); | |
489 #endif /* CANNA_MULE */ | |
490 ksv.ks = &ks; | |
491 len = jrKanjiControl (0, KC_DEFINEKANJI, (char *)&ksv); | |
492 val = storeResults (buf, ksv.val, ksv.ks); | |
493 return val; | |
494 } | |
495 | |
496 DEFUN ("canna-set-width", Fcanna_set_width, 1, 1, 0, /* | |
497 Set status-line width information, which is used to display | |
498 kanji candidates. | |
499 */ | |
500 (num)) | |
501 { | |
502 CHECK_INT (num); | |
503 | |
504 jrKanjiControl (0, KC_SETWIDTH, (char *) XINT (num)); | |
505 return Qnil; | |
506 } | |
507 | |
508 DEFUN ("canna-change-mode", Fcanna_change_mode, 1, 1, 0, /* | |
509 Change Japanese pre-edit mode. | |
510 */ | |
511 (num)) | |
512 { | |
513 jrKanjiStatusWithValue ksv; | |
514 jrKanjiStatus ks; | |
515 Lisp_Object val; | |
516 | |
517 CHECK_INT (num); | |
518 | |
519 ksv.buffer = (unsigned char *) buf; | |
520 ksv.bytes_buffer = KEYTOSTRSIZE; | |
521 ksv.ks = &ks; | |
522 ksv.val = XINT (num); | |
523 jrKanjiControl (0, KC_CHANGEMODE, (char *)&ksv); | |
524 val = storeResults (buf, ksv.val, ksv.ks); | |
525 return val; | |
526 } | |
527 | |
528 Lisp_Object | |
529 CANNA_mode_keys (void) | |
530 { | |
531 #define CANNAWORKBUFSIZE 32 | |
532 char xxx[CANNAWORKBUFSIZE]; | |
533 Lisp_Object val; | |
534 int i, n; | |
535 | |
536 n = jrKanjiControl (0, KC_MODEKEYS, xxx); | |
537 val = Qnil; | |
538 for (i = n ; i > 0 ;) | |
539 { | |
540 --i; | |
541 /* !!#### something fucked here */ | |
542 val = Fcons (make_char ((int)(0xFF & (unsigned char) xxx[i])), val); | |
543 } | |
544 return val; | |
545 } | |
546 | |
547 DEFUN ("canna-store-yomi", Fcanna_store_yomi, 1, 2, 0, /* | |
548 Store yomi characters as a YOMI of kana-to-kanji conversion. | |
549 */ | |
550 (yomi, roma)) | |
551 { | |
552 jrKanjiStatusWithValue ksv; | |
553 jrKanjiStatus ks; | |
554 | |
555 CHECK_STRING (yomi); | |
556 #ifndef CANNA_MULE | |
557 strncpy (buf, XSTRING (yomi)->_data, XSTRING (yomi)->_size); | |
558 ks.length = XSTRING (yomi)->_size; | |
559 buf[ks.length] = '\0'; | |
560 #else /* CANNA_MULE */ | |
561 m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, buf); | |
562 ks.length = strlen (buf); | |
563 #endif /* CANNA_MULE */ | |
564 | |
565 if (NILP (roma)) | |
566 { | |
567 ks.mode = 0; | |
568 } | |
569 else | |
570 { | |
571 CHECK_STRING (roma); | |
572 | |
573 #ifndef CANNA_MULE | |
574 strncpy (buf + XSTRING (yomi)->_size + 1, XSTRING (roma)->_data, | |
575 XSTRING (roma)->_size); | |
576 buf[XSTRING (yomi)->_size + 1 + XSTRING (roma)->_size] = '\0'; | |
577 ks.mode = (unsigned char *)(buf + XSTRING (yomi)->_size + 1); | |
578 #else /* CANNA_MULE */ | |
579 ks.mode = (unsigned char *)(buf + ks.length + 1); | |
580 m2c (XSTRING (roma)->_data, XSTRING (roma)->_size, ks.mode); | |
581 #endif /* CANNA_MULE */ | |
582 } | |
583 | |
584 ks.echoStr = (unsigned char *) buf; | |
585 ksv.buffer = (unsigned char *) buf; /* 返値用 */ | |
586 ksv.bytes_buffer = KEYTOSTRSIZE; | |
587 ksv.ks = &ks; | |
588 | |
589 jrKanjiControl (0, KC_STOREYOMI, (char *)&ksv); | |
590 | |
591 return storeResults (buf, ksv.val, ksv.ks); | |
592 } | |
593 | |
594 DEFUN ("canna-do-function", Fcanna_do_function, 1, 2, 0, /* | |
595 Do specified function at current mode. | |
596 */ | |
597 (num, ch)) | |
598 { | |
599 jrKanjiStatusWithValue ksv; | |
600 jrKanjiStatus ks; | |
601 Lisp_Object val; | |
602 | |
603 CHECK_INT (num); | |
604 | |
605 if (NILP (ch)) | |
606 { | |
607 *buf = '@'; | |
608 } | |
609 else | |
610 { | |
611 CHECK_CHAR (ch); | |
612 *buf = XCHAR (ch); | |
613 } | |
614 | |
615 ksv.buffer = (unsigned char *) buf; | |
616 ksv.bytes_buffer = KEYTOSTRSIZE; | |
617 ksv.ks = &ks; | |
618 ksv.val = XINT (num); | |
619 jrKanjiControl (0, KC_DO, (char *) &ksv); | |
620 val = storeResults (buf, ksv.val, ksv.ks); | |
621 return val; | |
622 } | |
623 | |
624 DEFUN ("canna-parse", Fcanna_parse, 1, 1, 0, /* | |
625 Parse customize string. | |
626 */ | |
627 (str)) | |
628 { | |
629 jrKanjiStatusWithValue ksv; | |
630 jrKanjiStatus ks; | |
631 Lisp_Object val; | |
632 unsigned char **p; | |
633 int n; | |
634 | |
635 CHECK_STRING (str); | |
636 | |
637 #ifndef CANNA_MULE | |
638 strncpy (buf, XSTRING (str)->_data, XSTRING (str)->_size); | |
639 buf[XSTRING (str)->_size] = '\0'; | |
640 #else /* CANNA_MULE */ | |
641 m2c (XSTRING (str)->_data, XSTRING (str)->_size, buf); | |
642 #endif /* CANNA_MULE */ | |
643 p = (unsigned char**) buf; | |
644 n = jrKanjiControl (0, KC_PARSE, (char *) &p); | |
645 val = Qnil; | |
646 while (n > 0) | |
647 { | |
648 n--; | |
649 val = Fcons (make_string (p[n], strlen (p[n])), val); | |
650 } | |
651 return val; | |
652 } | |
653 | |
654 DEFUN ("canna-query-mode", Fcanna_query_mode, 0, 0, 0, /* | |
655 Get current mode string. | |
656 */ | |
657 ()) | |
658 { | |
659 unsigned char buf[256]; | |
660 | |
661 jrKanjiControl (0, KC_QUERYMODE, buf); | |
662 return make_string (buf, strlen (buf)); | |
663 } | |
664 | |
665 /* | |
666 * Functions following this line are for KKCP interface compatible | |
667 * library. These functions may be used by MILK system. | |
668 */ | |
669 | |
670 #define RKBUFSIZE 1024 | |
671 | |
672 static unsigned char yomibuf[RKBUFSIZE]; | |
673 static short kugiri[RKBUFSIZE / 2]; | |
674 | |
675 static int | |
676 confirmContext (void) | |
677 { | |
678 if (IRCP_context < 0) | |
679 { | |
680 int context; | |
681 | |
682 if ((context = jrKanjiControl (0, KC_GETCONTEXT, (char *) 0)) == -1) | |
683 { | |
684 return 0; | |
685 } | |
686 IRCP_context = context; | |
687 } | |
688 return 1; | |
689 } | |
690 | |
691 static int | |
692 byteLen (int bun, int len) | |
693 { | |
694 int i = 0, offset = 0, ch; | |
695 | |
696 if (0 <= bun && bun < RKBUFSIZE) | |
697 { | |
698 offset = kugiri[bun]; | |
699 } | |
700 | |
701 while (len-- > 0 && (ch = (int) yomibuf[offset + i])) | |
702 { | |
703 i++; | |
704 if (ch & 0x80) | |
705 { | |
706 i++; | |
707 } | |
708 } | |
709 return i; | |
710 } | |
711 | |
712 DEFUN ("canna-henkan-begin", Fcanna_henkan_begin, 1, 1, 0, /* | |
713 かな漢字変換した結果を返還する。文節切りがしてある。 | |
714 */ | |
715 (yomi)) | |
716 { | |
717 int nbun; | |
718 Lisp_Object res; | |
719 | |
720 CHECK_STRING (yomi); | |
721 if (confirmContext () == 0) | |
722 { | |
723 return Qnil; | |
724 } | |
725 #ifndef CANNA_MULE | |
726 strncpy (yomibuf, XSTRING (yomi)->_data, XSTRING (yomi)->_size); | |
727 yomibuf[XSTRING (yomi)->_size] = '\0'; | |
728 nbun = RkBgnBun (IRCP_context, XSTRING (yomi)->_data, XSTRING (yomi)->_size, | |
729 (RK_XFER << RK_XFERBITS) | RK_KFER); | |
730 #else /* CANNA_MULE */ | |
731 m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, yomibuf); | |
732 nbun = RkBgnBun (IRCP_context, (char *) yomibuf, strlen (yomibuf), | |
733 (RK_XFER << RK_XFERBITS) | RK_KFER); | |
734 #endif /* CANNA_MULE */ | |
735 | |
736 return kanjiYomiList (IRCP_context, nbun); | |
737 } | |
738 | |
739 static Lisp_Object | |
740 kanjiYomiList (int context, int nbun) | |
741 { | |
742 Lisp_Object val, res = Qnil; | |
743 unsigned char RkBuf[RKBUFSIZE]; | |
744 int len, i, total; | |
745 | |
746 for (i = nbun ; i > 0 ; ) | |
747 { | |
748 i--; | |
749 RkGoTo (context, i); | |
750 len = RkGetKanji (context, RkBuf, RKBUFSIZE); | |
751 val = make_string (RkBuf, len); | |
752 len = RkGetYomi (context, RkBuf, RKBUFSIZE); | |
753 res = Fcons (Fcons (val, make_string (RkBuf, len)), res); | |
754 if (i < RKBUFSIZE / 2) | |
755 { | |
756 kugiri[i] = len; | |
757 } | |
758 } | |
759 for (i = 0, total = 0 ; i < nbun ; i++) | |
760 { | |
761 int temp = kugiri[i]; | |
762 kugiri[i] = total; | |
763 total += temp; | |
764 } | |
765 return res; | |
766 } | |
767 | |
768 DEFUN ("canna-henkan-next", Fcanna_henkan_next, 1, 1, 0, /* | |
769 候補一覧を求める。 | |
770 */ | |
771 (bunsetsu)) | |
772 { | |
773 int i, nbun, slen, len; | |
774 unsigned char *p, RkBuf[RKBUFSIZE]; | |
775 Lisp_Object res = Qnil, endp; | |
776 | |
777 CHECK_INT (bunsetsu); | |
778 if (confirmContext () == 0) | |
779 { | |
780 return Qnil; | |
781 } | |
782 RkGoTo (IRCP_context, XINT (bunsetsu)); | |
783 len = RkGetKanjiList (IRCP_context, RkBuf, RKBUFSIZE); | |
784 p = RkBuf; | |
785 for (i = 0 ; i < len ; i++) | |
786 { | |
787 slen = strlen (p); | |
788 if (res == Qnil) | |
789 { | |
790 endp = res = Fcons (make_string (p, slen), Qnil); | |
791 } | |
792 else | |
793 { | |
794 endp = XCONS (endp)->cdr = Fcons (make_string (p, slen), Qnil); | |
795 } | |
796 p += slen + 1; | |
797 } | |
798 return res; | |
799 } | |
800 | |
801 DEFUN ("canna-bunsetu-henkou", Fcanna_bunsetu_henkou, 2, 2, 0, /* | |
802 文節の長さを指定する。 | |
803 */ | |
804 (bunsetsu, bunlen)) | |
805 { | |
806 int nbun, len; | |
807 | |
808 CHECK_INT (bunsetsu); | |
809 CHECK_INT (bunlen); | |
810 | |
811 nbun = XINT (bunsetsu); | |
812 if (confirmContext () == 0) | |
813 { | |
814 return Qnil; | |
815 } | |
816 RkGoTo (IRCP_context, nbun); | |
817 len = byteLen (nbun, XINT (bunlen)); | |
818 return kanjiYomiList (IRCP_context, RkResize (IRCP_context, len)); | |
819 } | |
820 | |
821 DEFUN ("canna-henkan-kakutei", Fcanna_henkan_kakutei, 2, 2, 0, /* | |
822 候補選択。 | |
823 */ | |
824 (bun, kouho)) | |
825 { | |
826 if (confirmContext () == 0) | |
827 { | |
828 return Qnil; | |
829 } | |
830 RkGoTo (IRCP_context, bun); | |
831 RkXfer (IRCP_context, kouho); | |
832 return Qt; | |
833 } | |
834 | |
835 DEFUN ("canna-henkan-end", Fcanna_henkan_end, 0, 0, 0, /* | |
836 変換終了。 | |
837 */ | |
838 ()) | |
839 { | |
840 if (confirmContext () == 0) | |
841 { | |
842 return Qnil; | |
843 } | |
844 RkEndBun (IRCP_context, 1); /* 学習はいつでも行って良いものなのか? */ | |
845 return Qt; | |
846 } | |
847 | |
848 DEFUN ("canna-henkan-quit", Fcanna_henkan_quit, 0, 0, 0, /* | |
849 変換終了。 | |
850 */ | |
851 ()) | |
852 { | |
853 if (confirmContext () == 0) | |
854 { | |
855 return Qnil; | |
856 } | |
857 RkEndBun (IRCP_context, 0); | |
858 return Qt; | |
859 } | |
860 | |
861 /* variables below this line is constants of Canna */ | |
862 | |
863 static int Vcanna_mode_AlphaMode = IROHA_MODE_AlphaMode; | |
864 static int Vcanna_mode_EmptyMode = IROHA_MODE_EmptyMode; | |
865 static int Vcanna_mode_KigoMode = IROHA_MODE_KigoMode; | |
866 static int Vcanna_mode_YomiMode = IROHA_MODE_YomiMode; | |
867 static int Vcanna_mode_JishuMode = IROHA_MODE_JishuMode; | |
868 static int Vcanna_mode_TankouhoMode = IROHA_MODE_TankouhoMode; | |
869 static int Vcanna_mode_IchiranMode = IROHA_MODE_IchiranMode; | |
870 static int Vcanna_mode_YesNoMode = IROHA_MODE_YesNoMode; | |
871 static int Vcanna_mode_OnOffMode = IROHA_MODE_OnOffMode; | |
872 #ifdef CANNA_MODE_AdjustBunsetsuMode | |
873 static int Vcanna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode; | |
874 #endif | |
875 #ifdef CANNA_MODE_ChikujiYomiMode | |
876 static int Vcanna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode; | |
877 static int Vcanna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode; | |
878 #endif | |
879 | |
880 static int Vcanna_mode_HenkanMode = IROHA_MODE_HenkanMode; | |
881 #ifdef CANNA_MODE_HenkanNyuryokuMode | |
882 static int Vcanna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode; | |
883 #endif | |
884 #ifdef CANNA_MODE_ZenHiraHenkanMode | |
885 static int Vcanna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode; | |
886 #ifdef CANNA_MODE_HanHiraHenkanMode | |
887 static int Vcanna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode; | |
888 #endif | |
889 static int Vcanna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode; | |
890 static int Vcanna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode; | |
891 static int Vcanna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode; | |
892 static int Vcanna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode; | |
893 #endif | |
894 static int Vcanna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode; | |
895 #ifdef CANNA_MODE_HanHiraKakuteiMode | |
896 static int Vcanna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode; | |
897 #endif | |
898 static int Vcanna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode; | |
899 static int Vcanna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode; | |
900 static int Vcanna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode; | |
901 static int Vcanna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode; | |
902 static int Vcanna_mode_HexMode = IROHA_MODE_HexMode; | |
903 static int Vcanna_mode_BushuMode = IROHA_MODE_BushuMode; | |
904 static int Vcanna_mode_ExtendMode = IROHA_MODE_ExtendMode; | |
905 static int Vcanna_mode_RussianMode = IROHA_MODE_RussianMode; | |
906 static int Vcanna_mode_GreekMode = IROHA_MODE_GreekMode; | |
907 static int Vcanna_mode_LineMode = IROHA_MODE_LineMode; | |
908 static int Vcanna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode; | |
909 static int Vcanna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode; | |
910 static int Vcanna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode; | |
911 static int Vcanna_mode_TourokuMode = IROHA_MODE_TourokuMode; | |
912 static int Vcanna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode; | |
913 static int Vcanna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode; | |
914 static int Vcanna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode; | |
915 static int Vcanna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode; | |
916 static int Vcanna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode; | |
917 static int Vcanna_mode_MountDicMode = IROHA_MODE_MountDicMode; | |
918 | |
919 static int Vcanna_fn_SelfInsert = IROHA_FN_SelfInsert; | |
920 static int Vcanna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert; | |
921 static int Vcanna_fn_QuotedInsert = IROHA_FN_QuotedInsert; | |
922 static int Vcanna_fn_JapaneseMode = IROHA_FN_JapaneseMode; | |
923 static int Vcanna_fn_AlphaMode = IROHA_FN_AlphaMode; | |
924 static int Vcanna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode; | |
925 static int Vcanna_fn_Forward = IROHA_FN_Forward; | |
926 static int Vcanna_fn_Backward = IROHA_FN_Backward; | |
927 static int Vcanna_fn_Next = IROHA_FN_Next; | |
928 static int Vcanna_fn_Prev = IROHA_FN_Prev; | |
929 static int Vcanna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine; | |
930 static int Vcanna_fn_EndOfLine = IROHA_FN_EndOfLine; | |
931 static int Vcanna_fn_DeleteNext = IROHA_FN_DeleteNext; | |
932 static int Vcanna_fn_DeletePrevious = IROHA_FN_DeletePrevious; | |
933 static int Vcanna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine; | |
934 static int Vcanna_fn_Henkan = IROHA_FN_Henkan; | |
935 static int Vcanna_fn_Kakutei = IROHA_FN_Kakutei; | |
936 static int Vcanna_fn_Extend = IROHA_FN_Extend; | |
937 static int Vcanna_fn_Shrink = IROHA_FN_Shrink; | |
938 #ifdef CANNA_FN_AdjustBunsetsu | |
939 static int Vcanna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu; | |
940 #endif | |
941 static int Vcanna_fn_Quit = IROHA_FN_Quit; | |
942 static int Vcanna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex; | |
943 static int Vcanna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu; | |
944 static int Vcanna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran; | |
945 static int Vcanna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan; | |
946 static int Vcanna_fn_Zenkaku = IROHA_FN_Zenkaku; | |
947 static int Vcanna_fn_Hankaku = IROHA_FN_Hankaku; | |
948 static int Vcanna_fn_ToUpper = IROHA_FN_ToUpper; | |
949 static int Vcanna_fn_Capitalize = IROHA_FN_Capitalize; | |
950 static int Vcanna_fn_ToLower = IROHA_FN_ToLower; | |
951 static int Vcanna_fn_Hiragana = IROHA_FN_Hiragana; | |
952 static int Vcanna_fn_Katakana = IROHA_FN_Katakana; | |
953 static int Vcanna_fn_Romaji = IROHA_FN_Romaji; | |
954 #ifdef CANNA_FN_BaseHiragana | |
955 static int Vcanna_fn_BaseHiragana = CANNA_FN_BaseHiragana; | |
956 static int Vcanna_fn_BaseKatakana = CANNA_FN_BaseKatakana; | |
957 static int Vcanna_fn_BaseEisu = CANNA_FN_BaseEisu; | |
958 static int Vcanna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku; | |
959 static int Vcanna_fn_BaseHankaku = CANNA_FN_BaseHankaku; | |
960 static int Vcanna_fn_BaseKana = CANNA_FN_BaseKana; | |
961 static int Vcanna_fn_BaseKakutei = CANNA_FN_BaseKakutei; | |
962 static int Vcanna_fn_BaseHenkan = CANNA_FN_BaseHenkan; | |
963 static int Vcanna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle; | |
964 static int Vcanna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle; | |
965 static int Vcanna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle; | |
966 static int Vcanna_fn_BaseKakuteiHenkanToggle = | |
967 CANNA_FN_BaseKakuteiHenkanToggle; | |
968 static int Vcanna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward; | |
969 static int Vcanna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward; | |
970 #endif | |
971 static int Vcanna_fn_ExtendMode = IROHA_FN_ExtendMode; | |
972 static int Vcanna_fn_Touroku = IROHA_FN_Touroku; | |
973 static int Vcanna_fn_HexMode = IROHA_FN_HexMode; | |
974 static int Vcanna_fn_BushuMode = IROHA_FN_BushuMode; | |
975 static int Vcanna_fn_KigouMode = IROHA_FN_KigouMode; | |
976 #ifdef CANNA_FN_Mark | |
977 static int Vcanna_fn_Mark = CANNA_FN_Mark; | |
978 #endif | |
979 #ifdef CANNA_FN_TemporalMode | |
980 static int Vcanna_fn_TemporalMode = CANNA_FN_TemporalMode; | |
981 #endif | |
982 | |
983 static int Vcanna_key_Nfer = IROHA_KEY_Nfer; | |
984 static int Vcanna_key_Xfer = IROHA_KEY_Xfer; | |
985 static int Vcanna_key_Up = IROHA_KEY_Up; | |
986 static int Vcanna_key_Left = IROHA_KEY_Left; | |
987 static int Vcanna_key_Right = IROHA_KEY_Right; | |
988 static int Vcanna_key_Down = IROHA_KEY_Down; | |
989 static int Vcanna_key_Insert = IROHA_KEY_Insert; | |
990 static int Vcanna_key_Rollup = IROHA_KEY_Rollup; | |
991 static int Vcanna_key_Rolldown = IROHA_KEY_Rolldown; | |
992 static int Vcanna_key_Home = IROHA_KEY_Home; | |
993 static int Vcanna_key_Help = IROHA_KEY_Help; | |
994 static int Vcanna_key_KP_Key = IROHA_KEY_KP_Key; | |
995 static int Vcanna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer; | |
996 static int Vcanna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer; | |
997 static int Vcanna_key_Shift_Up = IROHA_KEY_Shift_Up; | |
998 static int Vcanna_key_Shift_Left = IROHA_KEY_Shift_Left; | |
999 static int Vcanna_key_Shift_Right = IROHA_KEY_Shift_Right; | |
1000 static int Vcanna_key_Shift_Down = IROHA_KEY_Shift_Down; | |
1001 static int Vcanna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer; | |
1002 static int Vcanna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer; | |
1003 static int Vcanna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up; | |
1004 static int Vcanna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left; | |
1005 static int Vcanna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right; | |
1006 static int Vcanna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down; | |
1007 | |
1008 Lisp_Object VCANNA; /* by MORIOKA Tomohiko <morioka@jaist.ac.jp> | |
1009 1996/6/7 */ | |
1010 | |
1011 void | |
1012 syms_of_mule_canna (void) | |
1013 { | |
1014 DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */ | |
1015 VCANNA = Qt; /* hir@nec, 1992.5.21 */ | |
1016 | |
1017 DEFSUBR (Fcanna_key_proc); | |
1018 DEFSUBR (Fcanna_initialize); | |
1019 DEFSUBR (Fcanna_finalize); | |
1020 DEFSUBR (Fcanna_touroku_string); | |
1021 DEFSUBR (Fcanna_set_width); | |
1022 DEFSUBR (Fcanna_change_mode); | |
1023 DEFSUBR (Fcanna_store_yomi); | |
1024 DEFSUBR (Fcanna_do_function); | |
1025 DEFSUBR (Fcanna_parse); | |
1026 DEFSUBR (Fcanna_query_mode); | |
1027 DEFSUBR (Fcanna_set_bunsetsu); | |
1028 | |
1029 DEFSUBR (Fcanna_henkan_begin); | |
1030 DEFSUBR (Fcanna_henkan_next); | |
1031 DEFSUBR (Fcanna_bunsetu_henkou); | |
1032 DEFSUBR (Fcanna_henkan_kakutei); | |
1033 DEFSUBR (Fcanna_henkan_end); | |
1034 DEFSUBR (Fcanna_henkan_quit); | |
1035 } | |
1036 | |
1037 void | |
1038 vars_of_mule_canna (void) | |
1039 { | |
1040 DEFVAR_LISP ("canna-kakutei-string", &Vcanna_kakutei_string /* | |
1041 | |
1042 */ ); | |
1043 DEFVAR_LISP ("canna-kakutei-yomi", &Vcanna_kakutei_yomi /* | |
1044 | |
1045 */ ); | |
1046 DEFVAR_LISP ("canna-kakutei-romaji", &Vcanna_kakutei_romaji /* | |
1047 | |
1048 */ ); | |
1049 DEFVAR_LISP ("canna-henkan-string", &Vcanna_henkan_string /* | |
1050 | |
1051 */ ); | |
1052 DEFVAR_INT ("canna-henkan-length", &Vcanna_henkan_length /* | |
1053 | |
1054 */ ); | |
1055 DEFVAR_INT ("canna-henkan-revpos", &Vcanna_henkan_revPos /* | |
1056 | |
1057 */ ); | |
1058 DEFVAR_INT ("canna-henkan-revlen", &Vcanna_henkan_revLen /* | |
1059 | |
1060 */ ); | |
1061 DEFVAR_LISP ("canna-ichiran-string", &Vcanna_ichiran_string /* | |
1062 | |
1063 */ ); | |
1064 DEFVAR_INT ("canna-ichiran-length", &Vcanna_ichiran_length /* | |
1065 | |
1066 */ ); | |
1067 DEFVAR_INT ("canna-ichiran-revpos", &Vcanna_ichiran_revPos /* | |
1068 | |
1069 */ ); | |
1070 DEFVAR_INT ("canna-ichiran-revlen", &Vcanna_ichiran_revLen /* | |
1071 | |
1072 */ ); | |
1073 DEFVAR_LISP ("canna-mode-string", &Vcanna_mode_string /* | |
1074 | |
1075 */ ); | |
1076 | |
1077 DEFVAR_BOOL ("canna-empty-info", &Vcanna_empty_info /* | |
1078 For canna | |
1079 */ ); | |
1080 DEFVAR_BOOL ("canna-through-info", &Vcanna_through_info /* | |
1081 For canna | |
1082 */ ); | |
1083 DEFVAR_BOOL ("canna-underline", &Vcanna_underline /* | |
1084 For canna | |
1085 */ ); | |
1086 DEFVAR_BOOL ("canna-inhibit-hankakukana", &Vcanna_inhibit_hankakukana /* | |
1087 For canna | |
1088 */ ); | |
1089 | |
1090 DEFVAR_INT ("canna-mode-alpha-mode", &Vcanna_mode_AlphaMode /* | |
1091 | |
1092 */ ); | |
1093 DEFVAR_INT ("canna-mode-empty-mode", &Vcanna_mode_EmptyMode /* | |
1094 | |
1095 */ ); | |
1096 DEFVAR_INT ("canna-mode-kigo-mode", &Vcanna_mode_KigoMode /* | |
1097 | |
1098 */ ); | |
1099 DEFVAR_INT ("canna-mode-yomi-mode", &Vcanna_mode_YomiMode /* | |
1100 | |
1101 */ ); | |
1102 DEFVAR_INT ("canna-mode-jishu-mode", &Vcanna_mode_JishuMode /* | |
1103 | |
1104 */ ); | |
1105 DEFVAR_INT ("canna-mode-tankouho-mode", &Vcanna_mode_TankouhoMode /* | |
1106 | |
1107 */ ); | |
1108 DEFVAR_INT ("canna-mode-ichiran-mode", &Vcanna_mode_IchiranMode /* | |
1109 | |
1110 */ ); | |
1111 DEFVAR_INT ("canna-mode-yes-no-mode", &Vcanna_mode_YesNoMode /* | |
1112 | |
1113 */ ); | |
1114 DEFVAR_INT ("canna-mode-on-off-mode", &Vcanna_mode_OnOffMode /* | |
1115 | |
1116 */ ); | |
1117 #ifdef CANNA_MODE_AdjustBunsetsuMode | |
1118 DEFVAR_INT ("canna-mode-adjust-bunsetsu-mode", | |
1119 &Vcanna_mode_AdjustBunsetsuMode /* | |
1120 | |
1121 */ ); | |
1122 #endif | |
1123 #ifdef CANNA_MODE_ChikujiYomiMode | |
1124 DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &Vcanna_mode_ChikujiYomiMode /* | |
1125 | |
1126 */ ); | |
1127 DEFVAR_INT ("canna-mode-chikuji-bunsetsu-mode", | |
1128 &Vcanna_mode_ChikujiTanMode /* | |
1129 | |
1130 */ ); | |
1131 #endif | |
1132 | |
1133 DEFVAR_INT ("canna-mode-henkan-mode", &Vcanna_mode_HenkanMode /* | |
1134 | |
1135 */ ); | |
1136 #ifdef CANNA_MODE_HenkanNyuryokuMode | |
1137 DEFVAR_INT ("canna-mode-henkan-nyuuryoku-mode", | |
1138 &Vcanna_mode_HenkanNyuryokuMode /* | |
1139 | |
1140 */ ); | |
1141 #endif | |
1142 #ifdef CANNA_MODE_ZenHiraHenkanMode | |
1143 DEFVAR_INT ("canna-mode-zen-hira-henkan-mode", | |
1144 &Vcanna_mode_ZenHiraHenkanMode /* | |
1145 | |
1146 */ ); | |
1147 #ifdef CANNA_MODE_HanHiraHenkanMode | |
1148 DEFVAR_INT ("canna-mode-han-hira-henkan-mode", | |
1149 &Vcanna_mode_HanHiraHenkanMode /* | |
1150 | |
1151 */ ); | |
1152 #endif | |
1153 DEFVAR_INT ("canna-mode-zen-kata-henkan-mode", | |
1154 &Vcanna_mode_ZenKataHenkanMode /* | |
1155 | |
1156 */ ); | |
1157 DEFVAR_INT ("canna-mode-han-kata-henkan-mode", | |
1158 &Vcanna_mode_HanKataHenkanMode /* | |
1159 | |
1160 */ ); | |
1161 DEFVAR_INT ("canna-mode-zen-alpha-henkan-mode", | |
1162 &Vcanna_mode_ZenAlphaHenkanMode /* | |
1163 | |
1164 */ ); | |
1165 DEFVAR_INT ("canna-mode-han-alpha-henkan-mode", | |
1166 &Vcanna_mode_HanAlphaHenkanMode /* | |
1167 | |
1168 */ ); | |
1169 #endif | |
1170 DEFVAR_INT ("canna-mode-zen-hira-kakutei-mode", | |
1171 &Vcanna_mode_ZenHiraKakuteiMode /* | |
1172 | |
1173 */ ); | |
1174 #ifdef CANNA_MODE_HanHiraKakuteiMode | |
1175 DEFVAR_INT ("canna-mode-han-hira-kakutei-mode", | |
1176 &Vcanna_mode_HanHiraKakuteiMode /* | |
1177 | |
1178 */ ); | |
1179 #endif | |
1180 DEFVAR_INT ("canna-mode-zen-kata-kakutei-mode", | |
1181 &Vcanna_mode_ZenKataKakuteiMode /* | |
1182 | |
1183 */ ); | |
1184 DEFVAR_INT ("canna-mode-han-kata-kakutei-mode", | |
1185 &Vcanna_mode_HanKataKakuteiMode /* | |
1186 | |
1187 */ ); | |
1188 DEFVAR_INT ("canna-mode-zen-alpha-kakutei-mode", | |
1189 &Vcanna_mode_ZenAlphaKakuteiMode /* | |
1190 | |
1191 */ ); | |
1192 DEFVAR_INT ("canna-mode-han-alpha-kakutei-mode", | |
1193 &Vcanna_mode_HanAlphaKakuteiMode /* | |
1194 | |
1195 */ ); | |
1196 DEFVAR_INT ("canna-mode-hex-mode", &Vcanna_mode_HexMode /* | |
1197 | |
1198 */ ); | |
1199 DEFVAR_INT ("canna-mode-bushu-mode", &Vcanna_mode_BushuMode /* | |
1200 | |
1201 */ ); | |
1202 DEFVAR_INT ("canna-mode-extend-mode", &Vcanna_mode_ExtendMode /* | |
1203 | |
1204 */ ); | |
1205 DEFVAR_INT ("canna-mode-russian-mode", &Vcanna_mode_RussianMode /* | |
1206 | |
1207 */ ); | |
1208 DEFVAR_INT ("canna-mode-greek-mode", &Vcanna_mode_GreekMode /* | |
1209 | |
1210 */ ); | |
1211 DEFVAR_INT ("canna-mode-line-mode", &Vcanna_mode_LineMode /* | |
1212 | |
1213 */ ); | |
1214 DEFVAR_INT ("canna-mode-changing-server-mode", | |
1215 &Vcanna_mode_ChangingServerMode /* | |
1216 | |
1217 */ ); | |
1218 DEFVAR_INT ("canna-mode-henkan-method-mode", | |
1219 &Vcanna_mode_HenkanMethodMode /* | |
1220 | |
1221 */ ); | |
1222 DEFVAR_INT ("canna-mode-delete-dic-mode", &Vcanna_mode_DeleteDicMode /* | |
1223 | |
1224 */ ); | |
1225 DEFVAR_INT ("canna-mode-touroku-mode", &Vcanna_mode_TourokuMode /* | |
1226 | |
1227 */ ); | |
1228 DEFVAR_INT ("canna-mode-touroku-empty-mode", | |
1229 &Vcanna_mode_TourokuEmptyMode /* | |
1230 | |
1231 */ ); | |
1232 DEFVAR_INT ("canna-mode-touroku-hinshi-mode", | |
1233 &Vcanna_mode_TourokuHinshiMode /* | |
1234 | |
1235 */ ); | |
1236 DEFVAR_INT ("canna-mode-touroku-dic-mode", &Vcanna_mode_TourokuDicMode /* | |
1237 | |
1238 */ ); | |
1239 DEFVAR_INT ("canna-mode-quoted-insert-mode", | |
1240 &Vcanna_mode_QuotedInsertMode /* | |
1241 | |
1242 */ ); | |
1243 DEFVAR_INT ("canna-mode-bubun-muhenkan-mode", | |
1244 &Vcanna_mode_BubunMuhenkanMode /* | |
1245 | |
1246 */ ); | |
1247 DEFVAR_INT ("canna-mode-mount-dic-mode", &Vcanna_mode_MountDicMode /* | |
1248 | |
1249 */ ); | |
1250 | |
1251 DEFVAR_INT ("canna-func-self-insert", &Vcanna_fn_SelfInsert /* | |
1252 | |
1253 */ ); | |
1254 DEFVAR_INT ("canna-func-functional-insert", &Vcanna_fn_FunctionalInsert /* | |
1255 | |
1256 */ ); | |
1257 DEFVAR_INT ("canna-func-quoted-insert", &Vcanna_fn_QuotedInsert /* | |
1258 | |
1259 */ ); | |
1260 DEFVAR_INT ("canna-func-japanese-mode", &Vcanna_fn_JapaneseMode /* | |
1261 | |
1262 */ ); | |
1263 DEFVAR_INT ("canna-func-alpha-mode", &Vcanna_fn_AlphaMode /* | |
1264 | |
1265 */ ); | |
1266 DEFVAR_INT ("canna-func-henkan-nyuryoku-mode", | |
1267 &Vcanna_fn_HenkanNyuryokuMode /* | |
1268 | |
1269 */ ); | |
1270 DEFVAR_INT ("canna-func-forward", &Vcanna_fn_Forward /* | |
1271 | |
1272 */ ); | |
1273 DEFVAR_INT ("canna-func-backward", &Vcanna_fn_Backward /* | |
1274 | |
1275 */ ); | |
1276 DEFVAR_INT ("canna-func-next", &Vcanna_fn_Next /* | |
1277 | |
1278 */ ); | |
1279 DEFVAR_INT ("canna-func-previous", &Vcanna_fn_Prev /* | |
1280 | |
1281 */ ); | |
1282 DEFVAR_INT ("canna-func-beginning-of-line", &Vcanna_fn_BeginningOfLine /* | |
1283 | |
1284 */ ); | |
1285 DEFVAR_INT ("canna-func-end-of-line", &Vcanna_fn_EndOfLine /* | |
1286 | |
1287 */ ); | |
1288 DEFVAR_INT ("canna-func-delete-next", &Vcanna_fn_DeleteNext /* | |
1289 | |
1290 */ ); | |
1291 DEFVAR_INT ("canna-func-delete_previous", &Vcanna_fn_DeletePrevious /* | |
1292 | |
1293 */ ); | |
1294 DEFVAR_INT ("canna-func-kill-to-end-of-line", &Vcanna_fn_KillToEndOfLine /* | |
1295 | |
1296 */ ); | |
1297 DEFVAR_INT ("canna-func-henkan", &Vcanna_fn_Henkan /* | |
1298 | |
1299 */ ); | |
1300 DEFVAR_INT ("canna-func-kakutei", &Vcanna_fn_Kakutei /* | |
1301 | |
1302 */ ); | |
1303 DEFVAR_INT ("canna-func-extend", &Vcanna_fn_Extend /* | |
1304 | |
1305 */ ); | |
1306 DEFVAR_INT ("canna-func-shrink", &Vcanna_fn_Shrink /* | |
1307 | |
1308 */ ); | |
1309 #ifdef CANNA_FN_AdjustBunsetsu | |
1310 DEFVAR_INT ("canna-func-adjust-bunsetsu", &Vcanna_fn_AdjustBunsetsu /* | |
1311 | |
1312 */ ); | |
1313 #endif | |
1314 DEFVAR_INT ("canna-func-quit", &Vcanna_fn_Quit /* | |
1315 | |
1316 */ ); | |
1317 DEFVAR_INT ("canna-func-convert-as-hex", &Vcanna_fn_ConvertAsHex /* | |
1318 | |
1319 */ ); | |
1320 DEFVAR_INT ("canna-func-convert-as-bushu", &Vcanna_fn_ConvertAsBushu /* | |
1321 | |
1322 */ ); | |
1323 DEFVAR_INT ("canna-func-kouho-ichiran", &Vcanna_fn_KouhoIchiran /* | |
1324 | |
1325 */ ); | |
1326 DEFVAR_INT ("canna-func-bubun-muhenkan", &Vcanna_fn_BubunMuhenkan /* | |
1327 | |
1328 */ ); | |
1329 DEFVAR_INT ("canna-func-zenkaku", &Vcanna_fn_Zenkaku /* | |
1330 | |
1331 */ ); | |
1332 DEFVAR_INT ("canna-func-hankaku", &Vcanna_fn_Hankaku /* | |
1333 | |
1334 */ ); | |
1335 DEFVAR_INT ("canna-func-to-upper", &Vcanna_fn_ToUpper /* | |
1336 | |
1337 */ ); | |
1338 DEFVAR_INT ("canna-func-capitalize", &Vcanna_fn_Capitalize /* | |
1339 | |
1340 */ ); | |
1341 DEFVAR_INT ("canna-func-to-lower", &Vcanna_fn_ToLower /* | |
1342 | |
1343 */ ); | |
1344 DEFVAR_INT ("canna-func-hiragana", &Vcanna_fn_Hiragana /* | |
1345 | |
1346 */ ); | |
1347 DEFVAR_INT ("canna-func-katakana", &Vcanna_fn_Katakana /* | |
1348 | |
1349 */ ); | |
1350 DEFVAR_INT ("canna-func-romaji", &Vcanna_fn_Romaji /* | |
1351 | |
1352 */ ); | |
1353 #ifdef CANNA_FN_BaseHiragana | |
1354 DEFVAR_INT ("canna-func-base-hiragana", &Vcanna_fn_BaseHiragana /* | |
1355 | |
1356 */ ); | |
1357 DEFVAR_INT ("canna-func-base-katakana", &Vcanna_fn_BaseKatakana /* | |
1358 | |
1359 */ ); | |
1360 DEFVAR_INT ("canna-func-base-eisu", &Vcanna_fn_BaseEisu /* | |
1361 | |
1362 */ ); | |
1363 DEFVAR_INT ("canna-func-base-zenkaku", &Vcanna_fn_BaseZenkaku /* | |
1364 | |
1365 */ ); | |
1366 DEFVAR_INT ("canna-func-base-hankaku", &Vcanna_fn_BaseHankaku /* | |
1367 | |
1368 */ ); | |
1369 DEFVAR_INT ("canna-func-base-kana", &Vcanna_fn_BaseKana /* | |
1370 | |
1371 */ ); | |
1372 DEFVAR_INT ("canna-func-base-kakutei", &Vcanna_fn_BaseKakutei /* | |
1373 | |
1374 */ ); | |
1375 DEFVAR_INT ("canna-func-base-henkan", &Vcanna_fn_BaseHenkan /* | |
1376 | |
1377 */ ); | |
1378 DEFVAR_INT ("canna-func-base-hiragana-katakana-toggle", | |
1379 &Vcanna_fn_BaseHiraKataToggle /* | |
1380 | |
1381 */ ); | |
1382 DEFVAR_INT ("canna-func-base-zenkaku-hankaku-toggle", | |
1383 &Vcanna_fn_BaseZenHanToggle /* | |
1384 | |
1385 */ ); | |
1386 DEFVAR_INT ("canna-func-base-kana-eisu-toggle", | |
1387 &Vcanna_fn_BaseKanaEisuToggle /* | |
1388 | |
1389 */ ); | |
1390 DEFVAR_INT ("canna-func-base-kakutei-henkan-toggle", | |
1391 &Vcanna_fn_BaseKakuteiHenkanToggle /* | |
1392 | |
1393 */ ); | |
1394 DEFVAR_INT ("canna-func-base-rotate-forward", | |
1395 &Vcanna_fn_BaseRotateForward /* | |
1396 | |
1397 */ ); | |
1398 DEFVAR_INT ("canna-func-base-rotate-backward", | |
1399 &Vcanna_fn_BaseRotateBackward /* | |
1400 | |
1401 */ ); | |
1402 #endif | |
1403 DEFVAR_INT ("canna-func-extend-mode", &Vcanna_fn_ExtendMode /* | |
1404 | |
1405 */ ); | |
1406 DEFVAR_INT ("canna-func-touroku", &Vcanna_fn_Touroku /* | |
1407 | |
1408 */ ); | |
1409 DEFVAR_INT ("canna-func-hex-mode", &Vcanna_fn_HexMode /* | |
1410 | |
1411 */ ); | |
1412 DEFVAR_INT ("canna-func-bushu-mode", &Vcanna_fn_BushuMode /* | |
1413 | |
1414 */ ); | |
1415 DEFVAR_INT ("canna-func-kigo-mode", &Vcanna_fn_KigouMode /* | |
1416 | |
1417 */ ); | |
1418 #ifdef CANNA_FN_Mark | |
1419 DEFVAR_INT ("canna-func-mark", &Vcanna_fn_Mark /* | |
1420 | |
1421 */ ); | |
1422 #endif | |
1423 #ifdef CANNA_FN_TemporalMode | |
1424 DEFVAR_INT ("canna-func-temporal-mode", &Vcanna_fn_TemporalMode /* | |
1425 | |
1426 */ ); | |
1427 #endif | |
1428 | |
1429 DEFVAR_INT ("canna-key-nfer", &Vcanna_key_Nfer /* | |
1430 | |
1431 */ ); | |
1432 DEFVAR_INT ("canna-key-xfer", &Vcanna_key_Xfer /* | |
1433 | |
1434 */ ); | |
1435 DEFVAR_INT ("canna-key-up", &Vcanna_key_Up /* | |
1436 | |
1437 */ ); | |
1438 DEFVAR_INT ("canna-key-left", &Vcanna_key_Left /* | |
1439 | |
1440 */ ); | |
1441 DEFVAR_INT ("canna-key-right", &Vcanna_key_Right /* | |
1442 | |
1443 */ ); | |
1444 DEFVAR_INT ("canna-key-down", &Vcanna_key_Down /* | |
1445 | |
1446 */ ); | |
1447 DEFVAR_INT ("canna-key-insert", &Vcanna_key_Insert /* | |
1448 | |
1449 */ ); | |
1450 DEFVAR_INT ("canna-key-rollup", &Vcanna_key_Rollup /* | |
1451 | |
1452 */ ); | |
1453 DEFVAR_INT ("canna-key-rolldown", &Vcanna_key_Rolldown /* | |
1454 | |
1455 */ ); | |
1456 DEFVAR_INT ("canna-key-home", &Vcanna_key_Home /* | |
1457 | |
1458 */ ); | |
1459 DEFVAR_INT ("canna-key-help", &Vcanna_key_Help /* | |
1460 | |
1461 */ ); | |
1462 DEFVAR_INT ("canna-key-kp-key", &Vcanna_key_KP_Key /* | |
1463 | |
1464 */ ); | |
1465 DEFVAR_INT ("canna-key-shift-nfer", &Vcanna_key_Shift_Nfer /* | |
1466 | |
1467 */ ); | |
1468 DEFVAR_INT ("canna-key-shift-xfer", &Vcanna_key_Shift_Xfer /* | |
1469 | |
1470 */ ); | |
1471 DEFVAR_INT ("canna-key-shift-up", &Vcanna_key_Shift_Up /* | |
1472 | |
1473 */ ); | |
1474 DEFVAR_INT ("canna-key-shift-left", &Vcanna_key_Shift_Left /* | |
1475 | |
1476 */ ); | |
1477 DEFVAR_INT ("canna-key-shift-right", &Vcanna_key_Shift_Right /* | |
1478 | |
1479 */ ); | |
1480 DEFVAR_INT ("canna-key-shift-down", &Vcanna_key_Shift_Down /* | |
1481 | |
1482 */ ); | |
1483 DEFVAR_INT ("canna-key-control-nfer", &Vcanna_key_Cntrl_Nfer /* | |
1484 | |
1485 */ ); | |
1486 DEFVAR_INT ("canna-key-control-xfer", &Vcanna_key_Cntrl_Xfer /* | |
1487 | |
1488 */ ); | |
1489 DEFVAR_INT ("canna-key-control-up", &Vcanna_key_Cntrl_Up /* | |
1490 | |
1491 */ ); | |
1492 DEFVAR_INT ("canna-key-control-left", &Vcanna_key_Cntrl_Left /* | |
1493 | |
1494 */ ); | |
1495 DEFVAR_INT ("canna-key-control-right", &Vcanna_key_Cntrl_Right /* | |
1496 | |
1497 */ ); | |
1498 DEFVAR_INT ("canna-key-control-down", &Vcanna_key_Cntrl_Down /* | |
1499 | |
1500 */ ); | |
1501 } | |
1502 | |
1503 #ifdef CANNA_MULE | |
1504 /* To handle MULE internal code and EUC. | |
1505 I assume CANNA can handle only Japanese EUC. */ | |
1506 | |
1507 /* EUC multibyte string to MULE internal string */ | |
1508 | |
1509 static void | |
1510 c2mu (char *cp, int l, char *mp) | |
1511 { | |
1512 char ch, *ep = cp+l; | |
1513 | |
1514 while ((cp < ep) && (ch = *cp)) | |
1515 { | |
1516 if ((unsigned char) ch == ISO_CODE_SS2) | |
1517 { | |
1518 *mp++ = LEADING_BYTE_JAPANESE_JISX0201_KANA; | |
1519 cp++; | |
1520 } | |
1521 else if ((unsigned char) ch == ISO_CODE_SS3) | |
1522 { | |
1523 *mp++ = LEADING_BYTE_JAPANESE_JISX0212; | |
1524 cp++; | |
1525 *mp++ = *cp++; | |
1526 } | |
1527 else if (ch & 0x80) | |
1528 { | |
1529 *mp++ = LEADING_BYTE_JAPANESE_JISX0208; | |
1530 *mp++ = *cp++; | |
1531 } | |
1532 *mp++ = *cp++; | |
1533 } | |
1534 *mp = 0; | |
1535 } | |
1536 | |
1537 /* MULE internal string to EUC multibyte string */ | |
1538 | |
1539 static void | |
1540 m2c (unsigned char *mp, int l, unsigned char *cp) | |
1541 { | |
1542 unsigned char ch, *ep = mp + l;; | |
1543 | |
1544 while ((mp < ep) && (ch = *mp++)) | |
1545 { | |
1546 switch (ch) | |
1547 { | |
1548 case LEADING_BYTE_JAPANESE_JISX0201_KANA: | |
1549 *cp++ = ISO_CODE_SS2; | |
1550 *cp++ = *mp++; | |
1551 break; | |
1552 case LEADING_BYTE_JAPANESE_JISX0212: | |
1553 *cp++ = ISO_CODE_SS3; | |
1554 case LEADING_BYTE_JAPANESE_JISX0208: | |
1555 *cp++ = *mp++; | |
1556 *cp++ = *mp++; | |
1557 break; | |
1558 default: | |
1559 *cp++ = ch; | |
1560 break; | |
1561 } | |
1562 } | |
1563 *cp = 0; | |
1564 } | |
1565 | |
1566 #undef make_string | |
1567 | |
1568 /* make_string after converting EUC string to MULE internal string */ | |
1569 static Lisp_Object | |
1570 mule_make_string (unsigned char *p, int l) | |
1571 { | |
1572 unsigned char cbuf[4096]; | |
1573 | |
1574 c2mu (p,l,cbuf); | |
1575 return (make_string (cbuf,strlen (cbuf))); | |
1576 } | |
1577 | |
1578 /* return the MULE internal string length of EUC string */ | |
1579 static int | |
1580 mule_strlen (unsigned char *p, int l) | |
1581 { | |
1582 unsigned char ch, *cp = p; | |
1583 int len = 0; | |
1584 | |
1585 while ((cp < p + l) && (ch = *cp)) | |
1586 { | |
1587 if ((unsigned char) ch == ISO_CODE_SS2) | |
1588 { | |
1589 len += 2; | |
1590 cp += 2; | |
1591 } | |
1592 else if ((unsigned char) ch == ISO_CODE_SS3) | |
1593 { | |
1594 len += 3; | |
1595 cp += 3; | |
1596 } | |
1597 else if (ch & 0x80) | |
1598 { | |
1599 len += 3; | |
1600 cp += 2; | |
1601 } | |
1602 else | |
1603 { | |
1604 len++; | |
1605 cp++; | |
1606 } | |
1607 } | |
1608 return (len); | |
1609 } | |
1610 | |
1611 /* count number of characters */ | |
1612 static | |
1613 count_char (unsigned char *p, int len, int pos, int rev, int *clen, int *cpos, | |
1614 int *crev) | |
1615 { | |
1616 unsigned char *q = p; | |
1617 | |
1618 *clen = *cpos = *crev = 0; | |
1619 if (len == 0) return; | |
1620 while (q < p + pos) | |
1621 { | |
1622 (*clen)++; | |
1623 (*cpos)++; | |
1624 if (*q++ & 0x80) q++; | |
1625 } | |
1626 while (q < p + pos + rev) | |
1627 { | |
1628 (*clen)++; | |
1629 (*crev)++; | |
1630 if (*q++ & 0x80) q++; | |
1631 } | |
1632 while (q < p + len) | |
1633 { | |
1634 (*clen)++; | |
1635 if (*q++ & 0x80) q++; | |
1636 } | |
1637 } | |
1638 #endif /* CANNA_MULE */ |